You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[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 detection — src/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.jsonpaths: alias resolution (with extends chain support).
src/lib/diff-classifier.js — isNoOpDiff() 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 validator — assertTargetParity() 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.