Skip to content

v0.8.0 — Triggers frontmatter, language-agnostic code-map, churn-stable doc-sync

Choose a tag to compare

@mvoutov mvoutov released this 11 May 23:47
· 11 commits to main since this release
0c24595

[0.8.0] - 2026-05-11

Added

  • triggers: YAML frontmatter for skills — skill activation rules (file globs, keywords, alwaysActivate) now live in frontmatter instead of a free-form ## Activation section. The activation hook reads frontmatter first; legacy ## Activation sections still parse for backwards compatibility. New skills generated by doc init / doc sync emit the frontmatter form.
  • Language-agnostic Domain clusters in .claude/code-map.md — clusters (cluster name + top files per cluster, sorted by fanIn then path) now render for any language, not just Next.js repos. Single-file clusters are dropped; merged clusters collapse duplicate labels emitted by the import graph's connected-component builder.
  • Next.js entry-point detectionsrc/lib/frameworks/nextjs.js recognizes App Router files (page, layout, route, loading, error, not-found, template, default, global-error), Pages Router files, and special top-level files (middleware, instrumentation) as implicit graph roots. Surfaced in code-map.md under Framework entry points.
  • Python and TypeScript import parsers — dedicated modules under src/lib/parsers/ for richer import extraction (re-exports, barrels, relative imports), plus src/lib/path-resolver.js for tsconfig.json / jsconfig.json paths: alias resolution (with extends chain support).
  • src/lib/diff-classifier.jsisNoOpDiff() classifier that lets doc sync skip the LLM call entirely on lockfile-only or non-code-bearing diffs.
  • sanitizePublishedContent() chokepoint sanitizer — every disk write goes through it; strips forbidden blocks (## Activation, ## Key Files, count-bearing data tables) from skill/instruction files while preserving them in code-map.md where they belong.
  • Skills section completeness contract — root instructions files (CLAUDE.md, AGENTS.md) now list every on-disk skill on every sync via the new collectSkillsForList() helper; pending changes overlay on-disk content so unchanged skills survive partial syncs.
  • Multi-target parity validatorassertTargetParity() checks that every configured target publishes the same set of logical files (root instructions + per-domain skills), with a carve-out for the Codex-only synthetic architecture skill.

Changed

  • code-map.md is now churn-stable — removed file counts, edge counts, hub-file rankings, hotspots, totals/date footer, and "+N more" suffixes. Only structural data (clusters + framework entries) survives.
  • ensureRootKeyFilesSection() reduced to a legacy stripper — it no longer inserts ## Key Files content; it only removes legacy blocks left in older docs. Hub rankings live in code-map.md / graph.json exclusively.
  • syncSkillsSection is now idempotent — fresh inserts place the Skills section before any existing ## heading instead of immediately after the H1, so prose between the title and the next section is no longer pushed "into" the Skills block and eaten on the next sync.
  • .cjs / .mjs extension parity — the import graph, source-extension set, and alias resolver now treat .cjs and .mjs as first-class so CommonJS-heavy and ESM-explicit repos get full graph coverage.

Fixed

  • AGENTS.md skill-list truncation on partial doc sync — when only one skill changed, the codex transform was rebuilding the AGENTS.md Skills section from the in-flight subset and silently dropping every unchanged skill. The transform now reads all on-disk skills and overlays pending changes for descriptions.
  • sanitizeCodexInstructions deleting CLAUDE.md-mentioning lines — the line-level filter dropped any line containing CLAUDE.md before the substitution pass could rewrite it. Removed the filter; substitution downstream handles CLAUDE.md → AGENTS.md correctly.
  • Path-traversal in resolveAliasImport() — a crafted tsconfig.json with paths: { "@/*": ["../../../outside/*"] } could produce graph nodes outside the repo (../etc/passwd). Added isInsideRepo() bound-check before recording any resolved path.
  • Next.js Pages Router walker recursing into hidden directories — the dot-file guard had an empty if block, so .next/, .vercel/, and .DS_Store were getting walked. Now correctly continues on dot entries while keeping _app / _document as valid entries.
  • scanRepo() called multiple times in the no-op sync path — hoisted into a single noOpScan variable so the filesystem scan runs once per sync invocation.
  • Unguarded statSync in customize.js — broken symlinks in .claude/agents/ or .claude/skills/ no longer abort the entire aspens customize agents command; the offending entry is skipped.
  • Stale skill descriptions for ensureRootKeyFilesSection.claude/skills/codex-support/skill.md, skill-generation/skill.md, and doc-sync/skill.md updated to reflect the function's current legacy-stripper role.

Internal

  • Test suite grew from ~360 to 439 tests covering: triggers frontmatter parsing, agent-skill refs, customize skills injection, diff classifier, graph Next.js roots, graph Python parsing, graph TS re-exports, impact hub coverage, no-guidelines refs, path-alias resolution, target parity, multi-target parity through the no-op repair flow, sanitizePublishedContent path-awareness, formatDomainClusters unit coverage, and repairDeterministicSections idempotence.
  • Deleted src/prompts/partials/guideline-format.md (concept retired). All {{guideline-format}} references removed from prompts and templates.