@event4u/agent-config 7.4.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. package/.claude-plugin/marketplace.json +11 -1
  2. package/AGENTS.md +9 -9
  3. package/CHANGELOG.md +373 -0
  4. package/README.md +35 -5
  5. package/dist/agent-src/commands/analytics/prune.md +1 -1
  6. package/dist/agent-src/commands/analytics/show.md +1 -1
  7. package/dist/agent-src/commands/analyze/decision.md +2 -2
  8. package/dist/agent-src/commands/analyze/incident.md +2 -2
  9. package/dist/agent-src/commands/analyze/near-miss.md +2 -2
  10. package/dist/agent-src/commands/analyze/postmortem.md +2 -2
  11. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  12. package/dist/agent-src/commands/cost-report.md +25 -0
  13. package/dist/agent-src/commands/evals/analyze.json +30 -0
  14. package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
  15. package/dist/agent-src/commands/implement-ticket.md +1 -1
  16. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  17. package/dist/agent-src/commands/knowledge/ingest.md +1 -1
  18. package/dist/agent-src/commands/knowledge/list.md +1 -1
  19. package/dist/agent-src/commands/memory/load.md +12 -11
  20. package/dist/agent-src/commands/memory/promote.md +30 -0
  21. package/dist/agent-src/commands/memory/propose.md +16 -2
  22. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  23. package/dist/agent-src/commands/module/explore.md +11 -7
  24. package/dist/agent-src/commands/optimize-project.md +243 -0
  25. package/dist/agent-src/commands/optimize.md +5 -0
  26. package/dist/agent-src/commands/pr/create.md +37 -8
  27. package/dist/agent-src/commands/prediction-pool.md +2 -2
  28. package/dist/agent-src/commands/profile/activate.md +3 -3
  29. package/dist/agent-src/commands/profile/deactivate.md +2 -2
  30. package/dist/agent-src/commands/profile/show.md +3 -3
  31. package/dist/agent-src/commands/research/deep.md +5 -0
  32. package/dist/agent-src/commands/research/report.md +2 -1
  33. package/dist/agent-src/commands/review-changes.md +14 -7
  34. package/dist/agent-src/commands/roadmap/create.md +88 -10
  35. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  36. package/dist/agent-src/commands/roadmap/process-full.md +15 -2
  37. package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
  38. package/dist/agent-src/commands/roadmap/process-step.md +4 -0
  39. package/dist/agent-src/commands/roadmap.md +1 -1
  40. package/dist/agent-src/commands/security-audit-config.md +1 -1
  41. package/dist/agent-src/commands/sync-agent-settings.md +1 -1
  42. package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
  43. package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
  44. package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
  45. package/dist/agent-src/commands/team-knowledge.md +64 -0
  46. package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
  47. package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
  48. package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
  49. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
  50. package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  51. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
  52. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
  53. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
  54. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
  55. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
  56. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
  57. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
  58. package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
  59. package/dist/agent-src/contexts/override-system.md +1 -1
  60. package/dist/agent-src/personas/brand-strategist.md +0 -1
  61. package/dist/agent-src/personas/data-integrity.md +66 -0
  62. package/dist/agent-src/personas/design-director.md +0 -1
  63. package/dist/agent-src/personas/performance-engineer.md +66 -0
  64. package/dist/agent-src/personas/production-validator.md +73 -0
  65. package/dist/agent-src/rules/agent-authority.md +3 -4
  66. package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
  67. package/dist/agent-src/rules/architecture.md +2 -4
  68. package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
  69. package/dist/agent-src/rules/artifact-engagement-recording.md +11 -4
  70. package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
  71. package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
  72. package/dist/agent-src/rules/autonomous-execution.md +3 -5
  73. package/dist/agent-src/rules/brand-consistency.md +3 -5
  74. package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
  75. package/dist/agent-src/rules/cli-output-handling.md +4 -6
  76. package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
  77. package/dist/agent-src/rules/commit-conventions.md +3 -5
  78. package/dist/agent-src/rules/commit-policy.md +8 -10
  79. package/dist/agent-src/rules/content-quoting-floor.md +88 -0
  80. package/dist/agent-src/rules/context-hygiene.md +3 -5
  81. package/dist/agent-src/rules/copilot-routing.md +4 -6
  82. package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
  83. package/dist/agent-src/rules/delegation-policy.md +10 -6
  84. package/dist/agent-src/rules/design-fidelity.md +3 -5
  85. package/dist/agent-src/rules/devcontainer-routing.md +4 -6
  86. package/dist/agent-src/rules/direct-answers.md +13 -17
  87. package/dist/agent-src/rules/docker-commands.md +3 -5
  88. package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
  89. package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
  90. package/dist/agent-src/rules/domain-safety-pii.md +7 -8
  91. package/dist/agent-src/rules/domain-safety-retention.md +3 -5
  92. package/dist/agent-src/rules/downstream-changes.md +3 -4
  93. package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
  94. package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
  95. package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
  96. package/dist/agent-src/rules/finance-safety-floor.md +3 -6
  97. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
  98. package/dist/agent-src/rules/git-history-discipline.md +3 -5
  99. package/dist/agent-src/rules/guidelines.md +2 -4
  100. package/dist/agent-src/rules/icon-consistency.md +4 -5
  101. package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
  102. package/dist/agent-src/rules/improve-before-implement.md +5 -5
  103. package/dist/agent-src/rules/invite-challenge.md +3 -5
  104. package/dist/agent-src/rules/language-and-tone.md +13 -15
  105. package/dist/agent-src/rules/laravel-routing.md +3 -5
  106. package/dist/agent-src/rules/laravel-translations.md +3 -5
  107. package/dist/agent-src/rules/legal-safety-floor.md +5 -7
  108. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
  109. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
  110. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
  111. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
  112. package/dist/agent-src/rules/media-governance-routing.md +3 -5
  113. package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
  114. package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
  115. package/dist/agent-src/rules/missing-tool-handling.md +3 -5
  116. package/dist/agent-src/rules/model-recommendation.md +4 -6
  117. package/dist/agent-src/rules/no-attribution-footers.md +3 -5
  118. package/dist/agent-src/rules/no-cheap-questions.md +5 -8
  119. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
  120. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
  121. package/dist/agent-src/rules/no-roadmap-references.md +3 -5
  122. package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
  123. package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
  124. package/dist/agent-src/rules/onboarding-gate.md +4 -6
  125. package/dist/agent-src/rules/output-discipline.md +3 -5
  126. package/dist/agent-src/rules/package-ci-checks.md +3 -5
  127. package/dist/agent-src/rules/persona-governance.md +2 -4
  128. package/dist/agent-src/rules/php-coding.md +3 -5
  129. package/dist/agent-src/rules/preservation-guard.md +2 -4
  130. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
  131. package/dist/agent-src/rules/reviewer-awareness.md +5 -6
  132. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
  133. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
  134. package/dist/agent-src/rules/role-mode-adherence.md +2 -4
  135. package/dist/agent-src/rules/rule-type-governance.md +3 -5
  136. package/dist/agent-src/rules/runtime-safety.md +2 -4
  137. package/dist/agent-src/rules/scope-control.md +10 -11
  138. package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
  139. package/dist/agent-src/rules/size-enforcement.md +2 -4
  140. package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
  141. package/dist/agent-src/rules/skill-quality.md +3 -5
  142. package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
  143. package/dist/agent-src/rules/source-confidentiality.md +3 -5
  144. package/dist/agent-src/rules/source-discovery-gate.md +3 -5
  145. package/dist/agent-src/rules/source-of-truth.md +3 -5
  146. package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
  147. package/dist/agent-src/rules/symfony-routing.md +4 -6
  148. package/dist/agent-src/rules/telegraph-speak.md +4 -5
  149. package/dist/agent-src/rules/think-before-action.md +7 -4
  150. package/dist/agent-src/rules/token-budget-discipline.md +29 -5
  151. package/dist/agent-src/rules/token-efficiency.md +3 -5
  152. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
  153. package/dist/agent-src/rules/tool-safety.md +2 -4
  154. package/dist/agent-src/rules/ui-audit-gate.md +3 -6
  155. package/dist/agent-src/rules/untrusted-input-defense.md +11 -10
  156. package/dist/agent-src/rules/upstream-proposal.md +4 -6
  157. package/dist/agent-src/rules/user-interaction.md +7 -5
  158. package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
  159. package/dist/agent-src/rules/verify-before-complete.md +12 -22
  160. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
  161. package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
  162. package/dist/agent-src/skills/adr-create/SKILL.md +52 -42
  163. package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
  164. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
  165. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  166. package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
  167. package/dist/agent-src/skills/blade-ui/SKILL.md +4 -0
  168. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
  169. package/dist/agent-src/skills/brand/SKILL.md +1 -1
  170. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
  171. package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
  172. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +5 -4
  173. package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
  174. package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
  175. package/dist/agent-src/skills/code-review/SKILL.md +5 -0
  176. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
  177. package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
  178. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  179. package/dist/agent-src/skills/context-document/SKILL.md +17 -0
  180. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
  181. package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
  182. package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
  183. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
  184. package/dist/agent-src/skills/design-intelligence/SKILL.md +45 -2
  185. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  186. package/dist/agent-src/skills/design-review/SKILL.md +23 -11
  187. package/dist/agent-src/skills/design-system-capture/SKILL.md +41 -0
  188. package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +62 -0
  189. package/dist/agent-src/skills/design-tokens/SKILL.md +11 -4
  190. package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
  191. package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
  192. package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
  193. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +6 -0
  194. package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
  195. package/dist/agent-src/skills/flux/SKILL.md +4 -0
  196. package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
  197. package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
  198. package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
  199. package/dist/agent-src/skills/iconography/SKILL.md +1 -0
  200. package/dist/agent-src/skills/image-editing/evals/triggers.json +13 -13
  201. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +136 -0
  202. package/dist/agent-src/skills/judge-artifact-completeness/calibration/fixtures.json +149 -0
  203. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +17 -0
  204. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/architecture-score.json +73 -0
  205. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/pr-review-score.json +65 -0
  206. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/roadmap-score.json +73 -0
  207. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +73 -0
  208. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  209. package/dist/agent-src/skills/judge-injection-defense/SKILL.md +99 -0
  210. package/dist/agent-src/skills/judge-injection-defense/calibration/fixtures.json +24 -0
  211. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +17 -0
  212. package/dist/agent-src/skills/judge-injection-defense/fixtures/behavioral-fixtures.json +63 -0
  213. package/dist/agent-src/skills/judge-injection-defense/fixtures/coverage-report.md +53 -0
  214. package/dist/agent-src/skills/judge-injection-defense/fixtures/perturbation-taxonomy.json +110 -0
  215. package/dist/agent-src/skills/judge-synthesis/SKILL.md +134 -0
  216. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +17 -0
  217. package/dist/agent-src/skills/laravel/SKILL.md +0 -1
  218. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
  219. package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
  220. package/dist/agent-src/skills/logo-generation/SKILL.md +1 -1
  221. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  222. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
  223. package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
  224. package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
  225. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
  226. package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
  227. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
  228. package/dist/agent-src/skills/premortem/SKILL.md +0 -3
  229. package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
  230. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +18 -0
  231. package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +59 -0
  232. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
  233. package/dist/agent-src/skills/refine-ticket/SKILL.md +5 -1
  234. package/dist/agent-src/skills/release-comms/SKILL.md +47 -46
  235. package/dist/agent-src/skills/roadmap-management/SKILL.md +25 -0
  236. package/dist/agent-src/skills/roadmap-writing/SKILL.md +33 -3
  237. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
  238. package/dist/agent-src/skills/script-writing/SKILL.md +1 -1
  239. package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
  240. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
  241. package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
  242. package/dist/agent-src/skills/sql-writing/SKILL.md +1 -1
  243. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
  244. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
  245. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
  246. package/dist/agent-src/skills/systematic-debugging/SKILL.md +30 -1
  247. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -0
  248. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  249. package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
  250. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  251. package/dist/agent-src/skills/typography-system/SKILL.md +4 -3
  252. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
  253. package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
  254. package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
  255. package/dist/agent-src/templates/agent-settings.md +22 -1
  256. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  257. package/dist/agent-src/templates/command.md +2 -2
  258. package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
  259. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
  260. package/dist/agent-src/templates/roadmaps.md +70 -2
  261. package/dist/agent-src/templates/rule.md +1 -1
  262. package/dist/agent-src/templates/scripts/README.md +3 -3
  263. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
  264. package/dist/agent-src/templates/tickets.md +8 -8
  265. package/dist/cli/commands/recordTriggerEval.test.js +1 -1
  266. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
  267. package/dist/cli/initRouting.js +4 -2
  268. package/dist/cli/initRouting.js.map +1 -1
  269. package/dist/cli/registry.js +1 -0
  270. package/dist/cli/registry.js.map +1 -1
  271. package/dist/discovery/deprecation-report.md +1 -1
  272. package/dist/discovery/discovery-manifest.json +802 -258
  273. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  274. package/dist/discovery/discovery-manifest.summary.md +8 -8
  275. package/dist/discovery/orphan-report.md +1 -1
  276. package/dist/discovery/packs.json +46 -28
  277. package/dist/discovery/trust-report.md +12 -11
  278. package/dist/discovery/workspaces.json +32 -18
  279. package/dist/install/preflight.js +173 -0
  280. package/dist/install/preflight.js.map +1 -0
  281. package/dist/mcp/registry-manifest.json +4 -4
  282. package/dist/router.json +1 -1
  283. package/dist/server/routes/settings.js +4 -0
  284. package/dist/server/routes/settings.js.map +1 -1
  285. package/dist/server/schemas/settings.js +6 -1
  286. package/dist/server/schemas/settings.js.map +1 -1
  287. package/docs/CLAIMS.md +108 -0
  288. package/docs/MIGRATION.md +3 -3
  289. package/docs/architecture.md +6 -6
  290. package/docs/benchmark.md +133 -2
  291. package/docs/benchmark.pinned.yml +31 -0
  292. package/docs/capability-matrix.md +1 -0
  293. package/docs/catalog.md +92 -74
  294. package/docs/command-flows.md +16 -4
  295. package/docs/comparison.yaml +35 -0
  296. package/docs/contracts/agents-layout.md +148 -0
  297. package/docs/contracts/brand-token-consumption.md +5 -0
  298. package/docs/contracts/capability-boundary.md +5 -0
  299. package/docs/contracts/command-category-governance.md +5 -0
  300. package/docs/contracts/command-clusters.md +1 -0
  301. package/docs/contracts/command-surface-tiers.md +1 -1
  302. package/docs/contracts/conformance.md +84 -0
  303. package/docs/contracts/creative-pack-boundary.md +5 -0
  304. package/docs/contracts/discovery-manifest.schema.json +5 -4
  305. package/docs/contracts/file-ownership-matrix.json +4605 -985
  306. package/docs/contracts/governance-enforcement-projection.md +5 -0
  307. package/docs/contracts/gui-wizard.md +1 -1
  308. package/docs/contracts/hook-architecture-v1.md +2 -2
  309. package/docs/contracts/implement-ticket-flow.md +1 -1
  310. package/docs/contracts/kernel-membership.md +13 -0
  311. package/docs/contracts/mcp-tool-inventory.md +23 -23
  312. package/docs/contracts/no-runtime-boundary.md +6 -1
  313. package/docs/contracts/review-lens-schema.md +5 -0
  314. package/docs/contracts/rule-router.md +102 -8
  315. package/docs/contracts/skill-bundled-assets.md +1 -1
  316. package/docs/contracts/skill-dry-run.md +1 -1
  317. package/docs/contracts/subagent-boundary.md +5 -0
  318. package/docs/contracts/ticket-bundle-format.md +9 -4
  319. package/docs/contracts/tier-3-contrib-plugin.md +2 -2
  320. package/docs/contracts/write-engine.md +3 -0
  321. package/docs/customization.md +87 -15
  322. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
  323. package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
  324. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
  325. package/docs/decisions/INDEX.md +2 -0
  326. package/docs/distribution/awesome-list-submission.md +46 -0
  327. package/docs/distribution/launch-story-draft.md +58 -0
  328. package/docs/end-to-end-walkthroughs.md +2 -2
  329. package/docs/getting-started.md +2 -2
  330. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
  331. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
  332. package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
  333. package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
  334. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  335. package/docs/guidelines/augment-portability-patterns.md +1 -1
  336. package/docs/guidelines/code-clarity.md +19 -0
  337. package/docs/guidelines/design-antipatterns-triggers.json +2 -1
  338. package/docs/guidelines/design-antipatterns.md +35 -0
  339. package/docs/guidelines/design-canon.md +62 -0
  340. package/docs/guidelines/design-modes.md +6 -0
  341. package/docs/guidelines/php/general.md +9 -1
  342. package/docs/guidelines/php/php-coding-patterns.md +7 -0
  343. package/docs/guides/cross-repo-retrieval.md +1 -1
  344. package/docs/guides/frontend-design-corpus-refresh.md +2 -2
  345. package/docs/guides/local-analytics.md +4 -4
  346. package/docs/guides/skill-discovery.md +1 -1
  347. package/docs/guides/skill-preview.md +1 -1
  348. package/docs/hook-payload-capture.md +6 -6
  349. package/docs/install-friction-report.md +66 -0
  350. package/docs/installation.md +1 -1
  351. package/docs/maintainers/optional-media-deps.md +50 -0
  352. package/docs/mcp-server.md +11 -12
  353. package/docs/media/proof-demo.cast +14 -0
  354. package/docs/media/proof-demo.gif +0 -0
  355. package/docs/migration/consumer-template-consumption-model.md +1 -1
  356. package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
  357. package/docs/migration/node-floor.md +1 -1
  358. package/docs/migration/yaml-roundtrip-spike.md +1 -1
  359. package/docs/personas.md +16 -5
  360. package/docs/positioning-evidence.md +86 -0
  361. package/docs/proof.md +86 -0
  362. package/docs/skills-catalog.md +1 -1
  363. package/docs/troubleshooting.md +8 -8
  364. package/docs/wedge/production-validator/README.md +57 -0
  365. package/docs/wedge/production-validator/production-validator.md +56 -0
  366. package/docs/wizard.md +2 -2
  367. package/package.json +1 -1
  368. package/src/config/agent-settings.template.yml +71 -4
  369. package/src/config/agents-paths.yml +254 -0
  370. package/src/config/budgets.yml +16 -0
  371. package/src/config/discovery/packs.yml +1 -0
  372. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  373. package/src/config/gitignore-block.txt +25 -0
  374. package/src/config/host-capabilities.yml +31 -0
  375. package/src/config/profiles/balanced.ini +4 -0
  376. package/src/config/profiles/full.ini +4 -0
  377. package/src/config/profiles/minimal.ini +4 -0
  378. package/src/scripts/_cli/cmd_conformance.ts +716 -0
  379. package/src/scripts/_cli/cmd_doctor.ts +23 -2
  380. package/src/scripts/_cli/cmd_fleet.ts +401 -0
  381. package/src/scripts/_cli/cmd_preflight.ts +159 -0
  382. package/src/scripts/_dispatch.bash +10 -0
  383. package/src/scripts/_lib/knowledge_events.ts +193 -0
  384. package/src/scripts/_lib/subagent_steering.ts +115 -3
  385. package/src/scripts/_lib/text_similarity.ts +75 -0
  386. package/src/scripts/ai-video/test-pipeline.sh +1 -1
  387. package/src/scripts/ai_council/clients.ts +19 -3
  388. package/src/scripts/append_contested.ts +112 -0
  389. package/src/scripts/audit_auto_rules.ts +11 -1
  390. package/src/scripts/audit_mcp_tools.ts +25 -11
  391. package/src/scripts/bench_ab_v2_run.ts +527 -40
  392. package/src/scripts/bench_ab_v2_stats.ts +6 -0
  393. package/src/scripts/bench_matrix.ts +266 -0
  394. package/src/scripts/bootstrap_knowledge.ts +267 -0
  395. package/src/scripts/build_discovery_manifest.ts +42 -2
  396. package/src/scripts/build_proof.ts +214 -0
  397. package/src/scripts/check_always_budget.ts +3 -0
  398. package/src/scripts/check_augment_description_cap.ts +2 -2
  399. package/src/scripts/check_claims.ts +270 -0
  400. package/src/scripts/check_comparison.ts +79 -0
  401. package/src/scripts/check_generated_artefact_headers.ts +109 -0
  402. package/src/scripts/check_generator_output_coverage.ts +142 -0
  403. package/src/scripts/check_gitignore_freshness.ts +127 -0
  404. package/src/scripts/check_knowledge_pages.ts +210 -0
  405. package/src/scripts/check_knowledge_sharing.ts +162 -0
  406. package/src/scripts/check_media_deps.ts +91 -0
  407. package/src/scripts/check_memory_contradiction.ts +280 -0
  408. package/src/scripts/check_memory_similarity.ts +134 -0
  409. package/src/scripts/check_quality_regression.ts +56 -10
  410. package/src/scripts/check_references.ts +3 -1
  411. package/src/scripts/check_release_pr_shape.ts +4 -0
  412. package/src/scripts/check_site_links.ts +135 -0
  413. package/src/scripts/check_skill_gaps.ts +99 -0
  414. package/src/scripts/check_token_quality_golden.ts +197 -11
  415. package/src/scripts/check_tracked_but_ignored.ts +67 -0
  416. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  417. package/src/scripts/compile_router.ts +30 -3
  418. package/src/scripts/condense.ts +350 -14
  419. package/src/scripts/consolidate_knowledge_events.ts +192 -0
  420. package/src/scripts/degrade_to_pointer.ts +136 -0
  421. package/src/scripts/design_slop_rules.test.ts +208 -0
  422. package/src/scripts/design_slop_rules.ts +530 -0
  423. package/src/scripts/emit_knowledge_event.ts +158 -0
  424. package/src/scripts/export_replay_corpus.ts +187 -0
  425. package/src/scripts/external_sources_denylist.json +14 -3
  426. package/src/scripts/fold_intake.ts +281 -0
  427. package/src/scripts/generate_capability_matrix.ts +9 -1
  428. package/src/scripts/generate_knowledge_index.ts +222 -0
  429. package/src/scripts/hook_manifest.yaml +40 -17
  430. package/src/scripts/hooks/design_slop_hook.ts +181 -0
  431. package/src/scripts/hooks/dispatch_hook.ts +18 -0
  432. package/src/scripts/hot_context_hook.ts +372 -0
  433. package/src/scripts/install +47 -0
  434. package/src/scripts/install-hooks.sh +17 -0
  435. package/src/scripts/inventory_meta_layers.ts +11 -0
  436. package/src/scripts/janitor.ts +258 -0
  437. package/src/scripts/lint_agent_security.ts +1 -0
  438. package/src/scripts/lint_agents_layout.ts +74 -15
  439. package/src/scripts/lint_bench_ab.ts +4 -1
  440. package/src/scripts/lint_confusables.ts +197 -0
  441. package/src/scripts/lint_design_slop.ts +245 -0
  442. package/src/scripts/lint_featured_skills.ts +0 -0
  443. package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
  444. package/src/scripts/lint_knowledge_scale.ts +250 -0
  445. package/src/scripts/lint_legal_pack.ts +67 -0
  446. package/src/scripts/lint_persona_governance.ts +8 -3
  447. package/src/scripts/lint_regression.ts +15 -0
  448. package/src/scripts/lint_roadmap_blockers.ts +202 -0
  449. package/src/scripts/lint_roadmap_complexity.ts +81 -2
  450. package/src/scripts/lint_subagent_determinism.ts +125 -0
  451. package/src/scripts/measure_augment_budget.ts +46 -6
  452. package/src/scripts/measure_patterns.ts +4 -3
  453. package/src/scripts/measure_skill_reduction.ts +6 -6
  454. package/src/scripts/migration_status.ts +6 -2
  455. package/src/scripts/mine_missing_guardrails.ts +189 -0
  456. package/src/scripts/parity/phase_gate.ts +1 -1
  457. package/src/scripts/parity/replay.ts +21 -0
  458. package/src/scripts/project_thin_rules.ts +120 -16
  459. package/src/scripts/release.ts +39 -1
  460. package/src/scripts/render_benchmark_composite.ts +378 -0
  461. package/src/scripts/roadmap_progress_hook.ts +101 -43
  462. package/src/scripts/schemas/skill.schema.json +27 -0
  463. package/src/scripts/schemas/subagent.schema.json +106 -0
  464. package/src/scripts/skill_linter.ts +1 -0
  465. package/src/scripts/smoke/kernel.sh +5 -4
  466. package/src/scripts/surface-tiers.yml +1 -0
  467. package/src/scripts/sync_gitignore.ts +4 -0
  468. package/src/scripts/update_skill_candidates.ts +172 -0
  469. package/src/scripts/validate_frontmatter.ts +1 -0
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * CI gate: every regenerable tracked analysis artefact must carry the
4
+ * freshness marker `<!-- analyzed: date | commit: sha | files: N -->` in
5
+ * its first 5 lines.
6
+ *
7
+ * Missing marker = warning (the file may not have been regenerated recently).
8
+ * Missing marker on a file whose generator is known to write it = error.
9
+ *
10
+ * Exit codes:
11
+ * 0 — all artefacts carry the marker
12
+ * 1 — one or more artefacts are missing the marker
13
+ */
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import { fileURLToPath, pathToFileURL } from 'node:url';
17
+
18
+ const _HERE = fileURLToPath(import.meta.url);
19
+ const REPO_ROOT = path.join(path.dirname(_HERE), '..', '..');
20
+
21
+ // Artefacts that must carry the <!-- analyzed: … --> freshness marker.
22
+ // Source: scripts that write these files (inventory_meta_layers.ts, audit_auto_rules.ts).
23
+ // Add new entries here when a new generator is wired in.
24
+ const GENERATED_ARTEFACTS: ReadonlyArray<{ path: string; writer: string; severity: 'error' | 'warning' }> = [
25
+ {
26
+ path: 'agents/evidence/analysis/meta-layer-inventory.md',
27
+ writer: 'inventory_meta_layers.ts',
28
+ severity: 'error',
29
+ },
30
+ {
31
+ path: 'agents/reports/auto-rules-audit.md',
32
+ writer: 'audit_auto_rules.ts',
33
+ severity: 'warning', // on-demand regen only; marker present after first re-run
34
+ },
35
+ {
36
+ path: 'agents/evidence/metrics/skill-usage-report.md',
37
+ writer: 'skill_overlap.ts / audit_skill_overlap.ts',
38
+ severity: 'warning',
39
+ },
40
+ ];
41
+
42
+ const MARKER_PATTERN = /<!--\s*analyzed:\s*\d{4}-\d{2}-\d{2}/;
43
+
44
+ function checkFile(p: string): boolean {
45
+ try {
46
+ const text = fs.readFileSync(p, 'utf-8');
47
+ const first5 = text.split('\n').slice(0, 5).join('\n');
48
+ return MARKER_PATTERN.test(first5);
49
+ } catch {
50
+ return true; // file doesn't exist locally (gitignored context) — skip
51
+ }
52
+ }
53
+
54
+ function main(argv?: readonly string[]): number {
55
+ const args = argv ?? process.argv.slice(2);
56
+ const quiet = args.includes('--quiet');
57
+
58
+ const errors: string[] = [];
59
+ const warnings: string[] = [];
60
+
61
+ for (const entry of GENERATED_ARTEFACTS) {
62
+ const absPath = path.join(REPO_ROOT, entry.path);
63
+ if (!fs.existsSync(absPath)) continue; // not present locally — skip
64
+
65
+ if (!checkFile(absPath)) {
66
+ const msg = `${entry.path}: missing freshness marker (<!-- analyzed: date | commit: sha | files: N -->). Writer: ${entry.writer}`;
67
+ if (entry.severity === 'error') {
68
+ errors.push(msg);
69
+ } else {
70
+ warnings.push(msg);
71
+ }
72
+ }
73
+ }
74
+
75
+ if (errors.length > 0) {
76
+ process.stdout.write(`❌ Generated artefact freshness errors:\n\n`);
77
+ for (const e of errors) {
78
+ process.stdout.write(` - ${e}\n`);
79
+ }
80
+ process.stdout.write(
81
+ `\nThe generator script must write <!-- analyzed: … --> as the first line.\n` +
82
+ `See docs/contracts/agents-layout.md § Session-leftover discipline.\n`,
83
+ );
84
+ }
85
+
86
+ if (warnings.length > 0 && !quiet) {
87
+ process.stdout.write(`⚠️ Generated artefact freshness warnings:\n\n`);
88
+ for (const w of warnings) {
89
+ process.stdout.write(` - ${w}\n`);
90
+ }
91
+ }
92
+
93
+ if (errors.length === 0 && warnings.length === 0 && !quiet) {
94
+ process.stdout.write(
95
+ `✅ All ${GENERATED_ARTEFACTS.length} generated artefacts carry the freshness marker.\n`,
96
+ );
97
+ }
98
+
99
+ return errors.length > 0 ? 1 : 0;
100
+ }
101
+
102
+ const _isCliEntry =
103
+ process.argv[1] !== undefined &&
104
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
105
+ if (_isCliEntry || process.argv[1] === _HERE) {
106
+ process.exit(main());
107
+ }
108
+
109
+ export { main, GENERATED_ARTEFACTS };
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * CI gate: every generator output root declared in this registry must be
4
+ * classified in `src/config/agents-paths.yml` (policy = ignored or carve-out)
5
+ * OR explicitly marked as tracked-generated with a committed carve-out in
6
+ * the package .gitignore (e.g. `!/dist/agent-src/`).
7
+ *
8
+ * This is the guard that would have caught `.claude/agents/` being unclassified:
9
+ * generate_claude_subagents() writes .claude/agents/, but neither the manifest
10
+ * nor the package .gitignore had an entry for it.
11
+ *
12
+ * Exit codes:
13
+ * 0 — all generator output roots are classified
14
+ * 1 — one or more roots are unclassified
15
+ * 2 — missing file
16
+ */
17
+ import * as fs from 'node:fs';
18
+ import * as path from 'node:path';
19
+ import { fileURLToPath, pathToFileURL } from 'node:url';
20
+
21
+ const _HERE = fileURLToPath(import.meta.url);
22
+ const REPO_ROOT = path.join(path.dirname(_HERE), '..', '..');
23
+
24
+ const MANIFEST = path.join(REPO_ROOT, 'src', 'config', 'agents-paths.yml');
25
+ const PACKAGE_GITIGNORE = path.join(REPO_ROOT, '.gitignore');
26
+
27
+ // Generator output root registry.
28
+ // Maintained here (alongside condense.ts generator list).
29
+ // Each entry: { root, generator, tool? } where root is the directory
30
+ // the generator writes into (relative to repo root).
31
+ //
32
+ // When you add a new generate_* function in condense.ts that writes to a
33
+ // new directory, add an entry here in the same commit.
34
+ const GENERATOR_OUTPUT_ROOTS = [
35
+ { root: '.claude/rules', generator: 'generate_rule_symlinks', tool: 'claude-code' },
36
+ { root: '.claude/personas', generator: 'generate_persona_symlinks', tool: 'claude-code' },
37
+ { root: '.claude/user-types', generator: 'generate_user_type_symlinks', tool: 'claude-code' },
38
+ { root: '.claude/skills', generator: 'generate_claude_skills + generate_plugin_command_skills', tool: 'claude-code' },
39
+ { root: '.claude/agents', generator: 'generate_claude_subagents', tool: 'claude-code' },
40
+ { root: '.augment', generator: 'sync_augment (condense main)', tool: 'augment' },
41
+ { root: '.cursor/rules', generator: 'generate_cursor_mdc_rules', tool: 'cursor' },
42
+ { root: '.windsurfrules', generator: 'generate_windsurfrules', tool: 'windsurf' },
43
+ { root: '.windsurf/rules', generator: 'generate_windsurf_modern_rules', tool: 'windsurf' },
44
+ { root: 'dist/agent-src', generator: 'condense (main output)', tool: null },
45
+ { root: 'GEMINI.md', generator: 'generate_gemini_md', tool: 'gemini' },
46
+ ] as const;
47
+
48
+ function _isFile(p: string): boolean {
49
+ try {
50
+ return fs.statSync(p).isFile();
51
+ } catch {
52
+ return false;
53
+ }
54
+ }
55
+
56
+ /** Check if a root is classified in agents-paths.yml OR in .gitignore */
57
+ function isClassified(root: string, manifestPaths: Set<string>, gitignoreLines: Set<string>): boolean {
58
+ // Build all candidates for this root: the root itself plus all ancestor dirs.
59
+ // gitignore patterns like /.cursor/ cover .cursor/rules because the parent is ignored.
60
+ const parts = root.split('/');
61
+ const candidates: string[] = [];
62
+ for (let i = parts.length; i >= 1; i--) {
63
+ const sub = parts.slice(0, i).join('/');
64
+ candidates.push(sub, `/${sub}`, `/${sub}/`, sub + '/');
65
+ }
66
+ // Also check negation carve-outs (e.g. !/dist/agent-src/)
67
+ candidates.push(`!/${root}/`, `!${root}`, `!/${root}`);
68
+
69
+ for (const c of candidates) {
70
+ if (manifestPaths.has(c) || gitignoreLines.has(c)) return true;
71
+ }
72
+ return false;
73
+ }
74
+
75
+ function parseManifestPaths(text: string): Set<string> {
76
+ const paths = new Set<string>();
77
+ for (const line of text.split('\n')) {
78
+ const m = line.match(/^- path:\s*(.+)/);
79
+ if (m?.[1] !== undefined) paths.add(m[1].trim().replace(/^"|"$/g, ''));
80
+ }
81
+ return paths;
82
+ }
83
+
84
+ function main(argv?: readonly string[]): number {
85
+ const args = argv ?? process.argv.slice(2);
86
+ const quiet = args.includes('--quiet');
87
+
88
+ if (!_isFile(MANIFEST)) {
89
+ process.stdout.write(`❌ Manifest not found: ${MANIFEST}\n`);
90
+ return 2;
91
+ }
92
+ if (!_isFile(PACKAGE_GITIGNORE)) {
93
+ process.stdout.write(`❌ .gitignore not found: ${PACKAGE_GITIGNORE}\n`);
94
+ return 2;
95
+ }
96
+
97
+ const manifestPaths = parseManifestPaths(fs.readFileSync(MANIFEST, 'utf-8'));
98
+ const gitignoreLines = new Set(
99
+ fs.readFileSync(PACKAGE_GITIGNORE, 'utf-8')
100
+ .split('\n')
101
+ .map((l) => l.trim())
102
+ .filter((l) => Boolean(l) && !l.startsWith('#')),
103
+ );
104
+
105
+ const unclassified: typeof GENERATOR_OUTPUT_ROOTS[number][] = [];
106
+ for (const entry of GENERATOR_OUTPUT_ROOTS) {
107
+ if (!isClassified(entry.root, manifestPaths, gitignoreLines)) {
108
+ unclassified.push(entry);
109
+ }
110
+ }
111
+
112
+ if (unclassified.length > 0) {
113
+ process.stdout.write(
114
+ `❌ Generator output roots not classified in agents-paths.yml or .gitignore:\n\n`,
115
+ );
116
+ for (const e of unclassified) {
117
+ process.stdout.write(` - ${e.root} (written by ${e.generator})\n`);
118
+ }
119
+ process.stdout.write(
120
+ `\nAdd an entry to src/config/agents-paths.yml (policy: ignored or carve-out)\n` +
121
+ `or ensure a negation carve-out exists in the package .gitignore.\n` +
122
+ `Also add the path to the GENERATOR_OUTPUT_ROOTS registry in this script.\n`,
123
+ );
124
+ return 1;
125
+ }
126
+
127
+ if (!quiet) {
128
+ process.stdout.write(
129
+ `✅ All ${GENERATOR_OUTPUT_ROOTS.length} generator output roots are classified.\n`,
130
+ );
131
+ }
132
+ return 0;
133
+ }
134
+
135
+ const _isCliEntry =
136
+ process.argv[1] !== undefined &&
137
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
138
+ if (_isCliEntry || process.argv[1] === _HERE) {
139
+ process.exit(main());
140
+ }
141
+
142
+ export { main, GENERATOR_OUTPUT_ROOTS };
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * CI gate: every `policy: ignored` entry in `src/config/agents-paths.yml`
4
+ * that applies to consumer or both scopes must be present in
5
+ * `src/config/gitignore-block.txt`.
6
+ *
7
+ * This is a read-only freshness check — it does NOT generate either file.
8
+ * Full generation (Phase 3.2/3.3 of road-to-agents-dir-and-gitignore-hygiene)
9
+ * is a future enhancement; this check prevents silent drift in the meantime.
10
+ *
11
+ * Exit codes:
12
+ * 0 — all consumer-scoped ignored paths are covered in the block
13
+ * 1 — one or more paths are missing from the block
14
+ * 2 — invalid args or missing file
15
+ */
16
+ import * as fs from 'node:fs';
17
+ import * as path from 'node:path';
18
+ import { fileURLToPath, pathToFileURL } from 'node:url';
19
+
20
+ const _HERE = fileURLToPath(import.meta.url);
21
+ const REPO_ROOT = path.join(path.dirname(_HERE), '..', '..');
22
+
23
+ const MANIFEST = path.join(REPO_ROOT, 'src', 'config', 'agents-paths.yml');
24
+ const BLOCK = path.join(REPO_ROOT, 'src', 'config', 'gitignore-block.txt');
25
+
26
+ function _isFile(p: string): boolean {
27
+ try {
28
+ return fs.statSync(p).isFile();
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Minimal YAML parser for the agents-paths.yml structure:
36
+ * list of objects with `path`, `scope`, `policy` keys.
37
+ * Handles the literal string list entries (- key: value form).
38
+ */
39
+ function parseManifest(text: string): Array<{ path: string; scope: string; policy: string }> {
40
+ const entries: Array<{ path: string; scope: string; policy: string }> = [];
41
+ const lines = text.split('\n');
42
+ let cur: Record<string, string> | null = null;
43
+
44
+ for (const raw of lines) {
45
+ const line = raw.trimEnd();
46
+ // New list item starts with "- path:"
47
+ if (/^- path:/.test(line)) {
48
+ if (cur && cur['path'] && cur['scope'] && cur['policy']) {
49
+ entries.push({ path: cur['path'], scope: cur['scope'], policy: cur['policy'] });
50
+ }
51
+ cur = {};
52
+ const m = line.match(/^- path:\s*(.+)/);
53
+ if (m?.[1] !== undefined) cur['path'] = m[1].trim().replace(/^"|"$/g, '');
54
+ } else if (cur && /^\s+scope:/.test(line)) {
55
+ const m = line.match(/scope:\s*(.+)/);
56
+ if (m?.[1] !== undefined) cur['scope'] = m[1].trim();
57
+ } else if (cur && /^\s+policy:/.test(line)) {
58
+ const m = line.match(/policy:\s*(.+)/);
59
+ if (m?.[1] !== undefined) cur['policy'] = m[1].trim();
60
+ }
61
+ }
62
+ if (cur && cur['path'] && cur['scope'] && cur['policy']) {
63
+ entries.push({ path: cur['path'], scope: cur['scope'], policy: cur['policy'] });
64
+ }
65
+ return entries;
66
+ }
67
+
68
+ function main(argv?: readonly string[]): number {
69
+ const args = argv ?? process.argv.slice(2);
70
+ const quiet = args.includes('--quiet');
71
+
72
+ if (!_isFile(MANIFEST)) {
73
+ process.stdout.write(`❌ Manifest not found: ${MANIFEST}\n`);
74
+ return 2;
75
+ }
76
+ if (!_isFile(BLOCK)) {
77
+ process.stdout.write(`❌ Consumer block not found: ${BLOCK}\n`);
78
+ return 2;
79
+ }
80
+
81
+ const manifestText = fs.readFileSync(MANIFEST, 'utf-8');
82
+ const blockText = fs.readFileSync(BLOCK, 'utf-8');
83
+ const blockLines = new Set(blockText.split('\n').map((l) => l.trim()).filter(Boolean));
84
+
85
+ const entries = parseManifest(manifestText);
86
+ const missing: string[] = [];
87
+
88
+ for (const e of entries) {
89
+ if (e.policy !== 'ignored') continue;
90
+ if (e.scope !== 'consumer' && e.scope !== 'both') continue;
91
+ // Carve-out negations (path starts with !) are separately tracked
92
+ if (e.path.startsWith('!')) continue;
93
+ if (!blockLines.has(e.path)) {
94
+ missing.push(e.path);
95
+ }
96
+ }
97
+
98
+ if (missing.length > 0) {
99
+ process.stdout.write(
100
+ `❌ gitignore-block.txt is missing consumer-scoped ignored paths from agents-paths.yml:\n\n`,
101
+ );
102
+ for (const m of missing) {
103
+ process.stdout.write(` - ${m}\n`);
104
+ }
105
+ process.stdout.write(
106
+ `\nAdd these patterns to src/config/gitignore-block.txt ` +
107
+ `(or update agents-paths.yml if the scope/policy is wrong).\n`,
108
+ );
109
+ return 1;
110
+ }
111
+
112
+ if (!quiet) {
113
+ process.stdout.write(
114
+ `✅ gitignore-block.txt covers all ${entries.filter((e) => e.policy === 'ignored' && (e.scope === 'consumer' || e.scope === 'both')).length} consumer-scoped ignored paths.\n`,
115
+ );
116
+ }
117
+ return 0;
118
+ }
119
+
120
+ const _isCliEntry =
121
+ process.argv[1] !== undefined &&
122
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
123
+ if (_isCliEntry || process.argv[1] === _HERE) {
124
+ process.exit(main());
125
+ }
126
+
127
+ export { main };
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Warn-only lint for the lifecycle-typed knowledge pages —
4
+ * road-to-knowledge-system Phase 2. Scans
5
+ * `agents/knowledge/{sessions,concepts,procedures,decisions}/*.md`.
6
+ *
7
+ * Deliberately SEPARATE from `check_knowledge_cards.ts` (a byte-faithful
8
+ * parity twin of its retired Python original — never touched here) and
9
+ * deliberately warn-only: schema-as-contract for these pages is explicitly
10
+ * deferred (2026-07-05 council verdict) until real team usage data exists.
11
+ * This script never fails the build; it surfaces drift for a human to act
12
+ * on during consolidation.
13
+ *
14
+ * Checks:
15
+ * - `type` (if present) is one of concept|procedure|session|decision
16
+ * - `scope` (if present) is one of user|project|global
17
+ * - `visibility` (if present) is one of private|project|team
18
+ * - `review_after` (if present): valid YYYY-MM-DD; flagged if in the past
19
+ * - `contested` (if present): flagged when it carries >= 2 entries
20
+ * - page body (excluding frontmatter) is <= 200 lines
21
+ *
22
+ * Usage: check_knowledge_pages.ts [--dir <repo-root>] [--format text|json] [--quiet]
23
+ * Exit codes: 0 = ran cleanly (warnings do not fail the build), 1 = usage
24
+ * error, 3 = internal error.
25
+ */
26
+ import * as fs from 'node:fs';
27
+ import * as path from 'node:path';
28
+ import process from 'node:process';
29
+ import { fileURLToPath } from 'node:url';
30
+ import YAML from 'yaml';
31
+
32
+ const PROG = 'check_knowledge_pages.ts';
33
+ const PAGE_LINE_BUDGET = 200;
34
+ const CONTESTED_WARN_COUNT = 2;
35
+
36
+ const TYPED_DIRS = ['sessions', 'concepts', 'procedures', 'decisions'] as const;
37
+ const VALID_TYPE = new Set(['concept', 'procedure', 'session', 'decision']);
38
+ const VALID_SCOPE = new Set(['user', 'project', 'global']);
39
+ const VALID_VISIBILITY = new Set(['private', 'project', 'team']);
40
+
41
+ const FRONTMATTER_RE = /^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*\r?\n/;
42
+ const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
43
+
44
+ export interface Warning {
45
+ file: string; // path relative to --dir
46
+ rule: string;
47
+ message: string;
48
+ }
49
+
50
+ function isPlainObject(v: unknown): v is Record<string, unknown> {
51
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
52
+ }
53
+
54
+ function readFrontmatter(body: string): Record<string, unknown> {
55
+ const m = FRONTMATTER_RE.exec(body);
56
+ if (m?.[1] === undefined) return {};
57
+ try {
58
+ const parsed = YAML.parse(m[1]);
59
+ return isPlainObject(parsed) ? parsed : {};
60
+ } catch {
61
+ return {};
62
+ }
63
+ }
64
+
65
+ function bodyLineCount(body: string): number {
66
+ const withoutFrontmatter = body.replace(FRONTMATTER_RE, '');
67
+ // Trailing newline shouldn't count as an extra "line".
68
+ const trimmed = withoutFrontmatter.replace(/\n$/, '');
69
+ return trimmed.length === 0 ? 0 : trimmed.split('\n').length;
70
+ }
71
+
72
+ /** Lint a single page's already-read content. Pure — no filesystem access — for direct unit testing. */
73
+ export function lintPage(relPath: string, content: string, today: Date = new Date()): Warning[] {
74
+ const warnings: Warning[] = [];
75
+ const fm = readFrontmatter(content);
76
+
77
+ const type = fm.type;
78
+ if (typeof type === 'string' && !VALID_TYPE.has(type)) {
79
+ warnings.push({ file: relPath, rule: 'type', message: `unknown type "${type}" (expected one of concept|procedure|session|decision)` });
80
+ }
81
+
82
+ const scope = fm.scope;
83
+ if (typeof scope === 'string' && !VALID_SCOPE.has(scope)) {
84
+ warnings.push({ file: relPath, rule: 'scope', message: `unknown scope "${scope}" (expected one of user|project|global)` });
85
+ }
86
+
87
+ const visibility = fm.visibility;
88
+ if (typeof visibility === 'string' && !VALID_VISIBILITY.has(visibility)) {
89
+ warnings.push({
90
+ file: relPath,
91
+ rule: 'visibility',
92
+ message: `unknown visibility "${visibility}" (expected one of private|project|team)`,
93
+ });
94
+ }
95
+
96
+ const reviewAfter = fm.review_after;
97
+ if (typeof reviewAfter === 'string') {
98
+ if (!DATE_RE.test(reviewAfter)) {
99
+ warnings.push({ file: relPath, rule: 'review_after', message: `review_after "${reviewAfter}" is not YYYY-MM-DD` });
100
+ } else {
101
+ const due = new Date(`${reviewAfter}T00:00:00Z`);
102
+ if (!Number.isNaN(due.getTime()) && due.getTime() < today.getTime()) {
103
+ warnings.push({ file: relPath, rule: 'review_after', message: `review_after ${reviewAfter} is in the past — due for review` });
104
+ }
105
+ }
106
+ }
107
+
108
+ const contested = fm.contested;
109
+ if (Array.isArray(contested) && contested.length >= CONTESTED_WARN_COUNT) {
110
+ warnings.push({
111
+ file: relPath,
112
+ rule: 'contested',
113
+ message: `${contested.length} unresolved contested entries — needs consolidation attention`,
114
+ });
115
+ }
116
+
117
+ const lineCount = bodyLineCount(content);
118
+ if (lineCount > PAGE_LINE_BUDGET) {
119
+ warnings.push({ file: relPath, rule: 'size', message: `${lineCount} lines exceeds the ${PAGE_LINE_BUDGET}-line page budget` });
120
+ }
121
+
122
+ return warnings;
123
+ }
124
+
125
+ function listMarkdownFiles(dirPath: string): string[] {
126
+ let entries: fs.Dirent[];
127
+ try {
128
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
129
+ } catch {
130
+ return [];
131
+ }
132
+ return entries
133
+ .filter((e) => e.isFile() && e.name.toLowerCase().endsWith('.md'))
134
+ .map((e) => e.name)
135
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
136
+ }
137
+
138
+ export function lintAll(knowledgeRoot: string, today: Date = new Date()): Warning[] {
139
+ const warnings: Warning[] = [];
140
+ for (const dir of TYPED_DIRS) {
141
+ const scanDir = path.join(knowledgeRoot, dir);
142
+ for (const file of listMarkdownFiles(scanDir)) {
143
+ const relPath = `${dir}/${file}`;
144
+ let content: string;
145
+ try {
146
+ content = fs.readFileSync(path.join(scanDir, file), 'utf8');
147
+ } catch {
148
+ continue;
149
+ }
150
+ warnings.push(...lintPage(relPath, content, today));
151
+ }
152
+ }
153
+ return warnings;
154
+ }
155
+
156
+ function printUsage(): void {
157
+ process.stdout.write(`usage: ${PROG} [--dir DIR] [--format text|json] [--quiet]\n`);
158
+ }
159
+
160
+ export function main(argv: string[]): number {
161
+ let dir = process.cwd();
162
+ let format: 'text' | 'json' = 'text';
163
+ let quiet = false;
164
+
165
+ for (let i = 0; i < argv.length; i++) {
166
+ const arg = argv[i];
167
+ if (arg === '-h' || arg === '--help') {
168
+ printUsage();
169
+ return 0;
170
+ } else if (arg === '--dir') {
171
+ dir = argv[++i] ?? dir;
172
+ } else if (arg === '--format') {
173
+ const value = argv[++i];
174
+ if (value !== 'text' && value !== 'json') {
175
+ process.stderr.write(`${PROG}: error: --format must be text or json\n`);
176
+ return 1;
177
+ }
178
+ format = value;
179
+ } else if (arg === '--quiet') {
180
+ quiet = true;
181
+ } else {
182
+ process.stderr.write(`${PROG}: error: unrecognized argument: ${arg}\n`);
183
+ printUsage();
184
+ return 1;
185
+ }
186
+ }
187
+
188
+ const knowledgeRoot = path.join(dir, 'agents', 'knowledge');
189
+ const warnings = lintAll(knowledgeRoot);
190
+
191
+ if (format === 'json') {
192
+ process.stdout.write(JSON.stringify(warnings, null, 2) + '\n');
193
+ return 0;
194
+ }
195
+
196
+ if (warnings.length === 0) {
197
+ if (!quiet) process.stdout.write(`${PROG}: no warnings.\n`);
198
+ return 0;
199
+ }
200
+
201
+ for (const w of warnings) {
202
+ process.stdout.write(`🟡 ${w.file}: [${w.rule}] ${w.message}\n`);
203
+ }
204
+ if (!quiet) process.stdout.write(`${PROG}: ${warnings.length} warning(s) — non-blocking.\n`);
205
+ return 0;
206
+ }
207
+
208
+ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
209
+ process.exit(main(process.argv.slice(2)));
210
+ }