@event4u/agent-config 7.5.0 → 8.1.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 (429) hide show
  1. package/.claude-plugin/marketplace.json +8 -1
  2. package/AGENTS.md +9 -9
  3. package/CHANGELOG.md +317 -260
  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/roadmap/create.md +88 -10
  34. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  35. package/dist/agent-src/commands/roadmap/process-full.md +15 -2
  36. package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
  37. package/dist/agent-src/commands/roadmap/process-step.md +4 -0
  38. package/dist/agent-src/commands/roadmap.md +1 -1
  39. package/dist/agent-src/commands/security-audit-config.md +1 -1
  40. package/dist/agent-src/commands/sync-agent-settings.md +1 -1
  41. package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
  42. package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
  43. package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
  44. package/dist/agent-src/commands/team-knowledge.md +64 -0
  45. package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
  46. package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
  47. package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
  48. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
  49. package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  50. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
  51. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
  52. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
  53. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
  54. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
  55. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
  56. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
  57. package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
  58. package/dist/agent-src/contexts/override-system.md +1 -1
  59. package/dist/agent-src/personas/brand-strategist.md +0 -1
  60. package/dist/agent-src/personas/data-integrity.md +66 -0
  61. package/dist/agent-src/personas/design-director.md +0 -1
  62. package/dist/agent-src/personas/performance-engineer.md +66 -0
  63. package/dist/agent-src/personas/production-validator.md +73 -0
  64. package/dist/agent-src/rules/agent-authority.md +3 -4
  65. package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
  66. package/dist/agent-src/rules/architecture.md +2 -4
  67. package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
  68. package/dist/agent-src/rules/artifact-engagement-recording.md +2 -4
  69. package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
  70. package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
  71. package/dist/agent-src/rules/autonomous-execution.md +3 -5
  72. package/dist/agent-src/rules/brand-consistency.md +3 -5
  73. package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
  74. package/dist/agent-src/rules/cli-output-handling.md +4 -6
  75. package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
  76. package/dist/agent-src/rules/commit-conventions.md +3 -5
  77. package/dist/agent-src/rules/commit-policy.md +18 -10
  78. package/dist/agent-src/rules/content-quoting-floor.md +88 -0
  79. package/dist/agent-src/rules/context-hygiene.md +3 -5
  80. package/dist/agent-src/rules/copilot-routing.md +4 -6
  81. package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
  82. package/dist/agent-src/rules/delegation-policy.md +10 -6
  83. package/dist/agent-src/rules/design-fidelity.md +3 -5
  84. package/dist/agent-src/rules/devcontainer-routing.md +4 -6
  85. package/dist/agent-src/rules/direct-answers.md +13 -17
  86. package/dist/agent-src/rules/docker-commands.md +3 -5
  87. package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
  88. package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
  89. package/dist/agent-src/rules/domain-safety-pii.md +3 -5
  90. package/dist/agent-src/rules/domain-safety-retention.md +3 -5
  91. package/dist/agent-src/rules/downstream-changes.md +3 -4
  92. package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
  93. package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
  94. package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
  95. package/dist/agent-src/rules/finance-safety-floor.md +3 -6
  96. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
  97. package/dist/agent-src/rules/git-history-discipline.md +3 -5
  98. package/dist/agent-src/rules/guidelines.md +2 -4
  99. package/dist/agent-src/rules/icon-consistency.md +3 -5
  100. package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
  101. package/dist/agent-src/rules/improve-before-implement.md +5 -5
  102. package/dist/agent-src/rules/invite-challenge.md +3 -5
  103. package/dist/agent-src/rules/language-and-tone.md +13 -15
  104. package/dist/agent-src/rules/laravel-routing.md +3 -5
  105. package/dist/agent-src/rules/laravel-translations.md +3 -5
  106. package/dist/agent-src/rules/legal-safety-floor.md +3 -5
  107. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
  108. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
  109. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
  110. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
  111. package/dist/agent-src/rules/media-governance-routing.md +3 -5
  112. package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
  113. package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
  114. package/dist/agent-src/rules/missing-tool-handling.md +3 -5
  115. package/dist/agent-src/rules/model-recommendation.md +4 -6
  116. package/dist/agent-src/rules/no-attribution-footers.md +3 -5
  117. package/dist/agent-src/rules/no-cheap-questions.md +5 -8
  118. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
  119. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
  120. package/dist/agent-src/rules/no-roadmap-references.md +3 -5
  121. package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
  122. package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
  123. package/dist/agent-src/rules/onboarding-gate.md +4 -6
  124. package/dist/agent-src/rules/output-discipline.md +3 -5
  125. package/dist/agent-src/rules/package-ci-checks.md +3 -5
  126. package/dist/agent-src/rules/persona-governance.md +2 -4
  127. package/dist/agent-src/rules/php-coding.md +3 -5
  128. package/dist/agent-src/rules/preservation-guard.md +2 -4
  129. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
  130. package/dist/agent-src/rules/reviewer-awareness.md +5 -6
  131. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
  132. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
  133. package/dist/agent-src/rules/role-mode-adherence.md +2 -4
  134. package/dist/agent-src/rules/rule-type-governance.md +3 -5
  135. package/dist/agent-src/rules/runtime-safety.md +2 -4
  136. package/dist/agent-src/rules/scope-control.md +10 -11
  137. package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
  138. package/dist/agent-src/rules/size-enforcement.md +2 -4
  139. package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
  140. package/dist/agent-src/rules/skill-quality.md +3 -5
  141. package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
  142. package/dist/agent-src/rules/source-confidentiality.md +3 -5
  143. package/dist/agent-src/rules/source-discovery-gate.md +3 -5
  144. package/dist/agent-src/rules/source-of-truth.md +3 -5
  145. package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
  146. package/dist/agent-src/rules/symfony-routing.md +4 -6
  147. package/dist/agent-src/rules/telegraph-speak.md +4 -5
  148. package/dist/agent-src/rules/think-before-action.md +7 -4
  149. package/dist/agent-src/rules/token-budget-discipline.md +29 -5
  150. package/dist/agent-src/rules/token-efficiency.md +3 -5
  151. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
  152. package/dist/agent-src/rules/tool-safety.md +2 -4
  153. package/dist/agent-src/rules/ui-audit-gate.md +3 -6
  154. package/dist/agent-src/rules/untrusted-input-defense.md +3 -5
  155. package/dist/agent-src/rules/upstream-proposal.md +4 -6
  156. package/dist/agent-src/rules/user-interaction.md +7 -5
  157. package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
  158. package/dist/agent-src/rules/verify-before-complete.md +12 -22
  159. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
  160. package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
  161. package/dist/agent-src/skills/adr-create/SKILL.md +48 -42
  162. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
  163. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  164. package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
  165. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
  166. package/dist/agent-src/skills/brand/SKILL.md +1 -1
  167. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
  168. package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
  169. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -3
  170. package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
  171. package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
  172. package/dist/agent-src/skills/code-review/SKILL.md +1 -0
  173. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
  174. package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
  175. package/dist/agent-src/skills/context-document/SKILL.md +17 -0
  176. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
  177. package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
  178. package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
  179. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
  180. package/dist/agent-src/skills/design-intelligence/SKILL.md +5 -2
  181. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  182. package/dist/agent-src/skills/design-tokens/SKILL.md +10 -4
  183. package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
  184. package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
  185. package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
  186. package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
  187. package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
  188. package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
  189. package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
  190. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  191. package/dist/agent-src/skills/laravel/SKILL.md +0 -1
  192. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
  193. package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
  194. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
  195. package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
  196. package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
  197. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
  198. package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
  199. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
  200. package/dist/agent-src/skills/premortem/SKILL.md +0 -3
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
  202. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
  203. package/dist/agent-src/skills/release-comms/SKILL.md +46 -45
  204. package/dist/agent-src/skills/roadmap-management/SKILL.md +21 -0
  205. package/dist/agent-src/skills/roadmap-writing/SKILL.md +32 -2
  206. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
  207. package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
  208. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
  209. package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
  210. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
  211. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
  212. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
  213. package/dist/agent-src/skills/systematic-debugging/SKILL.md +29 -0
  214. package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
  215. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  216. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
  217. package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
  218. package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
  219. package/dist/agent-src/templates/agent-settings.md +22 -1
  220. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  221. package/dist/agent-src/templates/command.md +2 -2
  222. package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
  223. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
  224. package/dist/agent-src/templates/roadmaps.md +70 -2
  225. package/dist/agent-src/templates/rule.md +1 -1
  226. package/dist/agent-src/templates/scripts/README.md +3 -3
  227. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
  228. package/dist/agent-src/templates/tickets.md +8 -8
  229. package/dist/cli/commands/recordTriggerEval.test.js +1 -1
  230. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
  231. package/dist/cli/initRouting.js +4 -2
  232. package/dist/cli/initRouting.js.map +1 -1
  233. package/dist/cli/registry.js +1 -0
  234. package/dist/cli/registry.js.map +1 -1
  235. package/dist/discovery/deprecation-report.md +1 -1
  236. package/dist/discovery/discovery-manifest.json +718 -240
  237. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  238. package/dist/discovery/discovery-manifest.summary.md +8 -8
  239. package/dist/discovery/orphan-report.md +1 -1
  240. package/dist/discovery/packs.json +43 -28
  241. package/dist/discovery/trust-report.md +12 -11
  242. package/dist/discovery/workspaces.json +29 -18
  243. package/dist/install/preflight.js +173 -0
  244. package/dist/install/preflight.js.map +1 -0
  245. package/dist/mcp/registry-manifest.json +4 -4
  246. package/dist/router.json +1 -1
  247. package/dist/server/routes/settings.js +4 -0
  248. package/dist/server/routes/settings.js.map +1 -1
  249. package/dist/server/schemas/settings.js +3 -1
  250. package/dist/server/schemas/settings.js.map +1 -1
  251. package/docs/CLAIMS.md +108 -0
  252. package/docs/MIGRATION.md +3 -3
  253. package/docs/architecture.md +5 -5
  254. package/docs/archive/CHANGELOG-pre-8.0.0.md +301 -0
  255. package/docs/benchmark.md +133 -2
  256. package/docs/benchmark.pinned.yml +31 -0
  257. package/docs/capability-matrix.md +1 -0
  258. package/docs/catalog.md +70 -60
  259. package/docs/command-flows.md +15 -3
  260. package/docs/comparison.yaml +35 -0
  261. package/docs/contracts/agents-layout.md +148 -0
  262. package/docs/contracts/brand-token-consumption.md +5 -0
  263. package/docs/contracts/capability-boundary.md +5 -0
  264. package/docs/contracts/command-category-governance.md +5 -0
  265. package/docs/contracts/command-clusters.md +1 -0
  266. package/docs/contracts/command-surface-tiers.md +1 -1
  267. package/docs/contracts/conformance.md +84 -0
  268. package/docs/contracts/creative-pack-boundary.md +5 -0
  269. package/docs/contracts/discovery-manifest.schema.json +5 -4
  270. package/docs/contracts/file-ownership-matrix.json +4605 -985
  271. package/docs/contracts/governance-enforcement-projection.md +5 -0
  272. package/docs/contracts/gui-wizard.md +1 -1
  273. package/docs/contracts/hook-architecture-v1.md +2 -2
  274. package/docs/contracts/implement-ticket-flow.md +1 -1
  275. package/docs/contracts/kernel-membership.md +13 -0
  276. package/docs/contracts/mcp-tool-inventory.md +23 -23
  277. package/docs/contracts/no-runtime-boundary.md +6 -1
  278. package/docs/contracts/review-lens-schema.md +5 -0
  279. package/docs/contracts/rule-router.md +102 -8
  280. package/docs/contracts/skill-bundled-assets.md +1 -1
  281. package/docs/contracts/skill-dry-run.md +1 -1
  282. package/docs/contracts/subagent-boundary.md +5 -0
  283. package/docs/contracts/ticket-bundle-format.md +9 -4
  284. package/docs/contracts/tier-3-contrib-plugin.md +2 -2
  285. package/docs/contracts/write-engine.md +3 -0
  286. package/docs/customization.md +87 -15
  287. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
  288. package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
  289. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
  290. package/docs/decisions/INDEX.md +2 -0
  291. package/docs/distribution/awesome-list-submission.md +46 -0
  292. package/docs/distribution/launch-story-draft.md +58 -0
  293. package/docs/end-to-end-walkthroughs.md +2 -2
  294. package/docs/getting-started.md +2 -2
  295. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
  296. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
  297. package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
  298. package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
  299. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  300. package/docs/guidelines/augment-portability-patterns.md +1 -1
  301. package/docs/guidelines/code-clarity.md +19 -0
  302. package/docs/guidelines/design-antipatterns-triggers.json +2 -1
  303. package/docs/guidelines/design-antipatterns.md +10 -1
  304. package/docs/guidelines/design-modes.md +6 -0
  305. package/docs/guidelines/php/general.md +9 -1
  306. package/docs/guidelines/php/php-coding-patterns.md +7 -0
  307. package/docs/guides/cross-repo-retrieval.md +1 -1
  308. package/docs/guides/frontend-design-corpus-refresh.md +2 -2
  309. package/docs/guides/local-analytics.md +4 -4
  310. package/docs/guides/skill-discovery.md +1 -1
  311. package/docs/guides/skill-preview.md +1 -1
  312. package/docs/hook-payload-capture.md +6 -6
  313. package/docs/install-friction-report.md +66 -0
  314. package/docs/installation.md +1 -1
  315. package/docs/maintainers/optional-media-deps.md +50 -0
  316. package/docs/mcp-server.md +11 -12
  317. package/docs/media/proof-demo.cast +14 -0
  318. package/docs/media/proof-demo.gif +0 -0
  319. package/docs/migration/consumer-template-consumption-model.md +1 -1
  320. package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
  321. package/docs/migration/node-floor.md +1 -1
  322. package/docs/migration/yaml-roundtrip-spike.md +1 -1
  323. package/docs/personas.md +16 -5
  324. package/docs/positioning-evidence.md +86 -0
  325. package/docs/proof.md +86 -0
  326. package/docs/skills-catalog.md +1 -1
  327. package/docs/troubleshooting.md +8 -8
  328. package/docs/wedge/production-validator/README.md +57 -0
  329. package/docs/wedge/production-validator/production-validator.md +56 -0
  330. package/docs/wizard.md +2 -2
  331. package/package.json +1 -1
  332. package/src/config/agent-settings.template.yml +59 -4
  333. package/src/config/agents-paths.yml +254 -0
  334. package/src/config/budgets.yml +16 -0
  335. package/src/config/discovery/packs.yml +1 -0
  336. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  337. package/src/config/gitignore-block.txt +25 -0
  338. package/src/config/host-capabilities.yml +31 -0
  339. package/src/config/profiles/balanced.ini +4 -0
  340. package/src/config/profiles/full.ini +4 -0
  341. package/src/config/profiles/minimal.ini +4 -0
  342. package/src/scripts/_cli/cmd_conformance.ts +716 -0
  343. package/src/scripts/_cli/cmd_doctor.ts +23 -2
  344. package/src/scripts/_cli/cmd_fleet.ts +401 -0
  345. package/src/scripts/_cli/cmd_preflight.ts +159 -0
  346. package/src/scripts/_dispatch.bash +10 -0
  347. package/src/scripts/_lib/knowledge_events.ts +193 -0
  348. package/src/scripts/_lib/subagent_steering.ts +115 -3
  349. package/src/scripts/_lib/text_similarity.ts +75 -0
  350. package/src/scripts/ai-video/test-pipeline.sh +1 -1
  351. package/src/scripts/ai_council/clients.ts +19 -3
  352. package/src/scripts/append_contested.ts +112 -0
  353. package/src/scripts/audit_auto_rules.ts +11 -1
  354. package/src/scripts/audit_mcp_tools.ts +25 -11
  355. package/src/scripts/bench_ab_v2_run.ts +527 -40
  356. package/src/scripts/bench_ab_v2_stats.ts +6 -0
  357. package/src/scripts/bench_matrix.ts +266 -0
  358. package/src/scripts/bootstrap_knowledge.ts +267 -0
  359. package/src/scripts/build_discovery_manifest.ts +42 -2
  360. package/src/scripts/build_proof.ts +214 -0
  361. package/src/scripts/check_always_budget.ts +3 -0
  362. package/src/scripts/check_augment_description_cap.ts +2 -2
  363. package/src/scripts/check_claims.ts +270 -0
  364. package/src/scripts/check_comparison.ts +79 -0
  365. package/src/scripts/check_generated_artefact_headers.ts +109 -0
  366. package/src/scripts/check_generator_output_coverage.ts +142 -0
  367. package/src/scripts/check_gitignore_freshness.ts +127 -0
  368. package/src/scripts/check_knowledge_pages.ts +210 -0
  369. package/src/scripts/check_knowledge_sharing.ts +162 -0
  370. package/src/scripts/check_media_deps.ts +91 -0
  371. package/src/scripts/check_memory_contradiction.ts +280 -0
  372. package/src/scripts/check_memory_similarity.ts +134 -0
  373. package/src/scripts/check_quality_regression.ts +56 -10
  374. package/src/scripts/check_references.ts +3 -1
  375. package/src/scripts/check_release_pr_shape.ts +4 -0
  376. package/src/scripts/check_site_links.ts +135 -0
  377. package/src/scripts/check_skill_gaps.ts +99 -0
  378. package/src/scripts/check_token_quality_golden.ts +197 -11
  379. package/src/scripts/check_tracked_but_ignored.ts +67 -0
  380. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  381. package/src/scripts/compile_router.ts +30 -3
  382. package/src/scripts/condense.ts +350 -14
  383. package/src/scripts/consolidate_knowledge_events.ts +192 -0
  384. package/src/scripts/degrade_to_pointer.ts +136 -0
  385. package/src/scripts/design_slop_rules.test.ts +15 -0
  386. package/src/scripts/design_slop_rules.ts +28 -0
  387. package/src/scripts/emit_knowledge_event.ts +158 -0
  388. package/src/scripts/export_replay_corpus.ts +187 -0
  389. package/src/scripts/external_sources_denylist.json +7 -2
  390. package/src/scripts/fold_intake.ts +281 -0
  391. package/src/scripts/generate_capability_matrix.ts +9 -1
  392. package/src/scripts/generate_knowledge_index.ts +222 -0
  393. package/src/scripts/hook_manifest.yaml +26 -14
  394. package/src/scripts/hooks/dispatch_hook.ts +18 -0
  395. package/src/scripts/hot_context_hook.ts +372 -0
  396. package/src/scripts/install +47 -0
  397. package/src/scripts/install-hooks.sh +17 -0
  398. package/src/scripts/inventory_meta_layers.ts +11 -0
  399. package/src/scripts/janitor.ts +258 -0
  400. package/src/scripts/lint_agents_layout.ts +74 -15
  401. package/src/scripts/lint_bench_ab.ts +4 -1
  402. package/src/scripts/lint_featured_skills.ts +0 -0
  403. package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
  404. package/src/scripts/lint_knowledge_scale.ts +250 -0
  405. package/src/scripts/lint_legal_pack.ts +67 -0
  406. package/src/scripts/lint_persona_governance.ts +8 -3
  407. package/src/scripts/lint_regression.ts +15 -0
  408. package/src/scripts/lint_roadmap_blockers.ts +202 -0
  409. package/src/scripts/lint_roadmap_complexity.ts +81 -2
  410. package/src/scripts/lint_subagent_determinism.ts +125 -0
  411. package/src/scripts/measure_augment_budget.ts +46 -6
  412. package/src/scripts/measure_patterns.ts +4 -3
  413. package/src/scripts/measure_skill_reduction.ts +6 -6
  414. package/src/scripts/migration_status.ts +6 -2
  415. package/src/scripts/mine_missing_guardrails.ts +189 -0
  416. package/src/scripts/parity/phase_gate.ts +1 -1
  417. package/src/scripts/parity/replay.ts +21 -0
  418. package/src/scripts/project_thin_rules.ts +120 -16
  419. package/src/scripts/release.ts +39 -1
  420. package/src/scripts/render_benchmark_composite.ts +378 -0
  421. package/src/scripts/roadmap_progress_hook.ts +101 -43
  422. package/src/scripts/schemas/skill.schema.json +27 -0
  423. package/src/scripts/schemas/subagent.schema.json +106 -0
  424. package/src/scripts/skill_linter.ts +1 -0
  425. package/src/scripts/smoke/kernel.sh +5 -4
  426. package/src/scripts/surface-tiers.yml +1 -0
  427. package/src/scripts/sync_gitignore.ts +4 -0
  428. package/src/scripts/update_skill_candidates.ts +172 -0
  429. package/src/scripts/validate_frontmatter.ts +1 -0
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Hot-context working-memory cache — `stop` + `session_start` hook.
4
+ *
5
+ * road-to-second-brain Phase 1 (council 2026-07-07, verdict:
6
+ * `agents/settings/contexts/second-brain-delta-verdict.md`). A bounded,
7
+ * gitignored working-memory artifact that survives session boundaries and —
8
+ * on Claude Code — context compaction (`SessionStart source=compact`).
9
+ *
10
+ * Contract (per the verdict):
11
+ * - `agents/runtime/state/hot-context.md`, gitignored, OVERWRITTEN on every
12
+ * `stop` (cache, not journal). 400-word hard cap.
13
+ * - Written by DETERMINISTIC extraction from the chat-history JSONL
14
+ * (`agents/runtime/.agent-chat-history`) — never LLM summarization.
15
+ * - Every extracted line passes the low-impact privacy floor
16
+ * (`redact_low_impact_entry`); violating lines are DROPPED, never
17
+ * rewritten (soft rewrite would be a soft gate).
18
+ * - `session_start` restore emits `{"decision":"allow","context":"<block>"}`
19
+ * on stdout; the dispatcher forwards `context` to its own stdout on
20
+ * session_start so the host adds it to the session context. The block is
21
+ * spotlighted as DATA, not instructions (untrusted-input-defense).
22
+ * - Staleness: discard (delete) when the stamped branch differs from the
23
+ * current branch, the stamp is older than 48 h, or the host says
24
+ * `source=clear`. `source=compact` / `resume` / `startup` re-inject.
25
+ * - Never blocks: exit 0 on every path; failures are silent (stderr note).
26
+ *
27
+ * Reads the dispatcher JSON envelope on stdin
28
+ * (`{platform, event, payload, workspace_root, …}`).
29
+ */
30
+
31
+ import { spawnSync } from 'node:child_process';
32
+ import * as fs from 'node:fs';
33
+ import * as path from 'node:path';
34
+ import process from 'node:process';
35
+ import { fileURLToPath } from 'node:url';
36
+
37
+ import { redact_low_impact_entry } from './ai_council/redact_low_impact_entry.js';
38
+
39
+ export const HOT_CONTEXT_REL = path.join('agents', 'runtime', 'state', 'hot-context.md');
40
+
41
+ /** Replay-fixture runs must never mutate state (same contract as chat_history). */
42
+ const REPLAY_ENV_VAR = 'AGENT_CONFIG_REPLAY';
43
+ function _is_replay_mode(): boolean {
44
+ return (process.env[REPLAY_ENV_VAR] ?? '').trim() === '1';
45
+ }
46
+ export const WORD_CAP = 400;
47
+ export const MAX_AGE_HOURS = 48;
48
+
49
+ const HISTORY_REL = 'agents/runtime/.agent-chat-history';
50
+
51
+ const MAX_ACTIVE_THREADS = 3; // last user intents
52
+ const MAX_RECENT_CHANGES = 5; // last tool results
53
+ const MAX_OPEN_VERIFICATIONS = 3;
54
+ const THREAD_SNIPPET_CHARS = 200;
55
+ const CHANGE_SNIPPET_CHARS = 120;
56
+ const KEY_FACTS_CHARS = 600;
57
+
58
+ const VERIFICATION_RE = /\b(fail(ing|ed|ure)?|error|exit[= ][1-9]|red\b|broken)\b/i;
59
+
60
+ interface HistoryEntry {
61
+ t?: string;
62
+ ts?: string;
63
+ s?: string;
64
+ text?: string;
65
+ tool?: string;
66
+ [k: string]: unknown;
67
+ }
68
+
69
+ // ---------------------------------------------------------------------
70
+ // shared helpers
71
+ // ---------------------------------------------------------------------
72
+
73
+ function _history_path(root: string): string {
74
+ return process.env.AGENT_CHAT_HISTORY_FILE || path.join(root, HISTORY_REL);
75
+ }
76
+
77
+ function _hot_context_path(root: string): string {
78
+ return process.env.AGENT_HOT_CONTEXT_FILE || path.join(root, HOT_CONTEXT_REL);
79
+ }
80
+
81
+ export function _current_branch(root: string): string {
82
+ try {
83
+ const proc = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], {
84
+ cwd: root,
85
+ encoding: 'utf-8',
86
+ timeout: 5000,
87
+ });
88
+ if (proc.status === 0) {
89
+ return (proc.stdout || '').trim() || 'unknown';
90
+ }
91
+ } catch {
92
+ // fall through
93
+ }
94
+ return 'unknown';
95
+ }
96
+
97
+ function _read_history(root: string): HistoryEntry[] {
98
+ let text: string;
99
+ try {
100
+ text = fs.readFileSync(_history_path(root), 'utf-8');
101
+ } catch {
102
+ return [];
103
+ }
104
+ const entries: HistoryEntry[] = [];
105
+ for (const line of text.split('\n')) {
106
+ const trimmed = line.trim();
107
+ if (!trimmed) continue;
108
+ try {
109
+ const parsed = JSON.parse(trimmed) as unknown;
110
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
111
+ entries.push(parsed as HistoryEntry);
112
+ }
113
+ } catch {
114
+ // skip malformed lines — fail-open
115
+ }
116
+ }
117
+ return entries;
118
+ }
119
+
120
+ /** Entries of the most recent session (by `s` tag of the last body entry). */
121
+ export function _latest_session_entries(entries: HistoryEntry[]): HistoryEntry[] {
122
+ const body = entries.filter((e) => e.t && e.t !== 'header');
123
+ if (body.length === 0) return [];
124
+ const sid = body[body.length - 1]?.s;
125
+ if (!sid) {
126
+ // untagged history — fall back to the trailing 50 entries
127
+ return body.slice(-50);
128
+ }
129
+ return body.filter((e) => e.s === sid);
130
+ }
131
+
132
+ function _snippet(text: string, max: number): string {
133
+ const oneLine = text.replace(/\s+/g, ' ').trim();
134
+ return oneLine.length <= max ? oneLine : oneLine.slice(0, max - 1) + '…';
135
+ }
136
+
137
+ /** Privacy floor: keep only lines the low-impact redactor clears. */
138
+ function _redact_lines(lines: string[]): { kept: string[]; dropped: number } {
139
+ const kept: string[] = [];
140
+ let dropped = 0;
141
+ for (const line of lines) {
142
+ try {
143
+ const result = redact_low_impact_entry(line);
144
+ if (result.ok) {
145
+ kept.push(line);
146
+ } else {
147
+ dropped += 1;
148
+ }
149
+ } catch {
150
+ dropped += 1; // fail-closed per line: on redactor error, drop
151
+ }
152
+ }
153
+ return { kept, dropped };
154
+ }
155
+
156
+ function _word_count(text: string): number {
157
+ return text.split(/\s+/).filter((w) => w.length > 0).length;
158
+ }
159
+
160
+ // ---------------------------------------------------------------------
161
+ // stop — deterministic write
162
+ // ---------------------------------------------------------------------
163
+
164
+ export function build_hot_context(root: string, now: Date = new Date()): string {
165
+ const session = _latest_session_entries(_read_history(root));
166
+
167
+ const userPrompts = session.filter((e) => e.t === 'user_prompt' && e.text);
168
+ const toolUses = session.filter((e) => e.t === 'post_tool_use' && (e.tool || e.text));
169
+ const stops = session.filter((e) => e.t === 'stop' && e.text);
170
+
171
+ const activeThreads = _redact_lines(
172
+ userPrompts.slice(-MAX_ACTIVE_THREADS).map((e) => _snippet(String(e.text), THREAD_SNIPPET_CHARS)),
173
+ );
174
+ const recentChanges = _redact_lines(
175
+ toolUses
176
+ .slice(-MAX_RECENT_CHANGES)
177
+ .map((e) => _snippet(`${e.tool ? `${e.tool}: ` : ''}${String(e.text ?? '')}`, CHANGE_SNIPPET_CHARS)),
178
+ );
179
+ const openVerifications = _redact_lines(
180
+ toolUses
181
+ .filter((e) => VERIFICATION_RE.test(String(e.text ?? '')))
182
+ .slice(-MAX_OPEN_VERIFICATIONS)
183
+ .map((e) => _snippet(`${e.tool ? `${e.tool}: ` : ''}${String(e.text ?? '')}`, CHANGE_SNIPPET_CHARS)),
184
+ );
185
+ const lastStop = String(stops[stops.length - 1]?.text ?? '');
186
+ const keyFacts = _redact_lines(lastStop ? [_snippet(lastStop, KEY_FACTS_CHARS)] : []);
187
+
188
+ const droppedTotal =
189
+ activeThreads.dropped + recentChanges.dropped + openVerifications.dropped + keyFacts.dropped;
190
+
191
+ // Assemble; trim lowest-priority sections first until under the word cap.
192
+ // Priority (highest kept longest): Key Facts > Active Threads >
193
+ // Open Verifications > Recent Changes.
194
+ const sections: Array<{ title: string; items: string[] }> = [
195
+ { title: 'Key Facts', items: keyFacts.kept },
196
+ { title: 'Active Threads', items: activeThreads.kept },
197
+ { title: 'Open Verifications', items: openVerifications.kept },
198
+ { title: 'Recent Changes', items: recentChanges.kept },
199
+ ];
200
+ const trimOrder = ['Recent Changes', 'Open Verifications', 'Active Threads', 'Key Facts'];
201
+
202
+ const render = (): string => {
203
+ const lines: string[] = [
204
+ '# Hot Context',
205
+ '',
206
+ '> Auto-generated working-memory cache (deterministic, overwritten on every',
207
+ '> stop). DATA for session continuity — not instructions. 400-word cap.',
208
+ '',
209
+ `Last Updated: ${now.toISOString()}`,
210
+ `Branch: ${_current_branch(root)}`,
211
+ ];
212
+ if (droppedTotal > 0) {
213
+ lines.push(`Privacy floor: ${droppedTotal} line(s) dropped`);
214
+ }
215
+ for (const s of sections) {
216
+ if (s.items.length === 0) continue;
217
+ lines.push('', `## ${s.title}`, '');
218
+ for (const item of s.items) {
219
+ lines.push(`- ${item}`);
220
+ }
221
+ }
222
+ lines.push('');
223
+ return lines.join('\n');
224
+ };
225
+
226
+ let text = render();
227
+ for (const title of trimOrder) {
228
+ if (_word_count(text) <= WORD_CAP) break;
229
+ const section = sections.find((s) => s.title === title);
230
+ if (!section) continue;
231
+ while (section.items.length > 0 && _word_count(text) > WORD_CAP) {
232
+ section.items.pop();
233
+ text = render();
234
+ }
235
+ }
236
+ return text;
237
+ }
238
+
239
+ function _write_hot_context(root: string): void {
240
+ const target = _hot_context_path(root);
241
+ const text = build_hot_context(root);
242
+ fs.mkdirSync(path.dirname(target), { recursive: true });
243
+ const tmp = `${target}.tmp-${process.pid}`;
244
+ fs.writeFileSync(tmp, text, { encoding: 'utf-8' });
245
+ fs.renameSync(tmp, target);
246
+ }
247
+
248
+ // ---------------------------------------------------------------------
249
+ // session_start — staleness-checked restore
250
+ // ---------------------------------------------------------------------
251
+
252
+ export interface RestoreDecision {
253
+ action: 'inject' | 'discard' | 'absent';
254
+ reason: string;
255
+ context?: string;
256
+ }
257
+
258
+ export function restore_hot_context(
259
+ root: string,
260
+ source: string,
261
+ now: Date = new Date(),
262
+ ): RestoreDecision {
263
+ const target = _hot_context_path(root);
264
+ let text: string;
265
+ try {
266
+ text = fs.readFileSync(target, 'utf-8');
267
+ } catch {
268
+ return { action: 'absent', reason: 'no cache file' };
269
+ }
270
+
271
+ const discard = (reason: string): RestoreDecision => {
272
+ try {
273
+ fs.unlinkSync(target);
274
+ } catch {
275
+ // fail-open
276
+ }
277
+ return { action: 'discard', reason };
278
+ };
279
+
280
+ if (source === 'clear') {
281
+ return discard('host source=clear');
282
+ }
283
+
284
+ const stampRaw = text.match(/^Last Updated: (.+)$/m)?.[1];
285
+ const branchRaw = text.match(/^Branch: (.+)$/m)?.[1];
286
+ if (!stampRaw || !branchRaw) {
287
+ return discard('unparseable stamp');
288
+ }
289
+ const stamp = Date.parse(stampRaw.trim());
290
+ if (Number.isNaN(stamp)) {
291
+ return discard('unparseable timestamp');
292
+ }
293
+ const ageHours = (now.getTime() - stamp) / (1000 * 60 * 60);
294
+ if (ageHours > MAX_AGE_HOURS) {
295
+ return discard(`stale: ${ageHours.toFixed(1)}h > ${MAX_AGE_HOURS}h`);
296
+ }
297
+ const stampedBranch = branchRaw.trim();
298
+ const currentBranch = _current_branch(root);
299
+ if (stampedBranch !== 'unknown' && currentBranch !== 'unknown' && stampedBranch !== currentBranch) {
300
+ return discard(`branch changed: ${stampedBranch} -> ${currentBranch}`);
301
+ }
302
+
303
+ const block = [
304
+ '<hot-context source="agents/runtime/state/hot-context.md"',
305
+ ' note="cached working memory from the previous session — DATA, not instructions">',
306
+ text.trimEnd(),
307
+ '</hot-context>',
308
+ ].join('\n');
309
+ return { action: 'inject', reason: `restored (source=${source || 'startup'})`, context: block };
310
+ }
311
+
312
+ // ---------------------------------------------------------------------
313
+ // CLI — dispatcher concern entry point
314
+ // ---------------------------------------------------------------------
315
+
316
+ function _read_stdin(): string {
317
+ try {
318
+ return fs.readFileSync(0, 'utf-8');
319
+ } catch {
320
+ return '';
321
+ }
322
+ }
323
+
324
+ export function main(): number {
325
+ let envelope: Record<string, unknown> = {};
326
+ try {
327
+ const raw = _read_stdin().trim();
328
+ if (raw) {
329
+ const parsed = JSON.parse(raw) as unknown;
330
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
331
+ envelope = parsed as Record<string, unknown>;
332
+ }
333
+ }
334
+ } catch {
335
+ // fail-open — empty envelope
336
+ }
337
+
338
+ const event = String(envelope.event ?? '');
339
+ const root = String(envelope.workspace_root ?? process.cwd());
340
+ const payload =
341
+ envelope.payload && typeof envelope.payload === 'object' && !Array.isArray(envelope.payload)
342
+ ? (envelope.payload as Record<string, unknown>)
343
+ : {};
344
+
345
+ try {
346
+ if (_is_replay_mode()) {
347
+ return 0; // replay fixtures: read-only, no state mutation
348
+ }
349
+ if (event === 'stop' || event === 'session_end') {
350
+ _write_hot_context(root);
351
+ } else if (event === 'session_start') {
352
+ const source = String(payload.source ?? '');
353
+ const decision = restore_hot_context(root, source);
354
+ if (decision.action === 'inject' && decision.context) {
355
+ process.stdout.write(
356
+ JSON.stringify({
357
+ decision: 'allow',
358
+ reason: decision.reason,
359
+ context: decision.context,
360
+ }) + '\n',
361
+ );
362
+ }
363
+ }
364
+ } catch (exc) {
365
+ process.stderr.write(`hot-context-hook: ${String(exc)}\n`);
366
+ }
367
+ return 0; // never blocks
368
+ }
369
+
370
+ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
371
+ process.exit(main());
372
+ }
@@ -54,6 +54,12 @@
54
54
  # existing agent-config project (nested-install guard).
55
55
  # See docs/installation.md → "Minimal init".
56
56
  # --settings-only Alias for --minimal.
57
+ # --validate-only Pre-flight only — permissions, disk floor, conflicts,
58
+ # host-detection sanity as typed findings. Writes nothing.
59
+ # Exit 0 = clear, 1 = blocking finding, 2 = no runner.
60
+ # --fleet <yaml> Multi-repo rollout from a fleet.yaml (repos list +
61
+ # max_concurrency). Per-repo isolation; aggregate JSON.
62
+ # Exit 0 = all green, 1 = any repo failed, 2 = config.
57
63
  # --help, -h Show this help
58
64
  #
59
65
  # Examples:
@@ -86,6 +92,8 @@ SCOPE=""
86
92
  CUSTOM_PATH=""
87
93
  OFFLINE=false
88
94
  MINIMAL=false
95
+ VALIDATE_ONLY=false
96
+ FLEET_CONFIG=""
89
97
  USER_TYPE=""
90
98
 
91
99
  # Single source of truth for valid tool IDs (also referenced by install.sh / install.py).
@@ -173,6 +181,9 @@ while [[ $# -gt 0 ]]; do
173
181
  --offline) OFFLINE=true; shift ;;
174
182
  --minimal|--settings-only)
175
183
  MINIMAL=true; shift ;;
184
+ --validate-only) VALIDATE_ONLY=true; shift ;;
185
+ --fleet) FLEET_CONFIG="$2"; shift 2 ;;
186
+ --fleet=*) FLEET_CONFIG="${1#*=}"; shift ;;
176
187
  --help|-h) show_help; exit 0 ;;
177
188
  *) err "Unknown argument: $1"; show_help >&2; exit 1 ;;
178
189
  esac
@@ -197,6 +208,42 @@ if [[ "${SCOPE:-}" == "project" && "${AGENT_CONFIG_DEV_MODE:-}" != "1" ]]; then
197
208
  exit 1
198
209
  fi
199
210
 
211
+ # --validate-only — pre-flight only, nothing written (road-to-flow-learnings
212
+ # Phase 0). Read-only by construction, so it runs BEFORE the source-repo
213
+ # guard and the interactive picker. Exit: 0 = no blocking finding,
214
+ # 1 = blocking finding, 2 = no runner available.
215
+ if $VALIDATE_ONLY; then
216
+ if [[ -x "$SCRIPT_DIR/../../node_modules/.bin/tsx" ]]; then
217
+ preflight_runner=("$SCRIPT_DIR/../../node_modules/.bin/tsx")
218
+ elif command -v npx >/dev/null 2>&1; then
219
+ preflight_runner=(npx tsx)
220
+ else
221
+ err "--validate-only needs a TS runner (install Node.js, or run npm install in the package)"
222
+ exit 2
223
+ fi
224
+ preflight_args=()
225
+ [[ -n "$TOOLS" ]] && preflight_args+=(--tools "$TOOLS")
226
+ [[ -n "$TARGET_DIR" ]] && preflight_args+=(--target "$TARGET_DIR")
227
+ "${preflight_runner[@]}" "$SCRIPT_DIR/_cli/cmd_preflight.ts" "${preflight_args[@]}"
228
+ exit $?
229
+ fi
230
+
231
+ # --fleet fleet.yaml — config-driven multi-repo rollout (road-to-flow-learnings
232
+ # Phase 1). Per-repo isolation, concurrency-bounded, aggregate JSON + table.
233
+ # Exit: 0 = all repos green, 1 = at least one repo failed, 2 = config error.
234
+ if [[ -n "$FLEET_CONFIG" ]]; then
235
+ if [[ -x "$SCRIPT_DIR/../../node_modules/.bin/tsx" ]]; then
236
+ fleet_runner=("$SCRIPT_DIR/../../node_modules/.bin/tsx")
237
+ elif command -v npx >/dev/null 2>&1; then
238
+ fleet_runner=(npx tsx)
239
+ else
240
+ err "--fleet needs a TS runner (install Node.js, or run npm install in the package)"
241
+ exit 2
242
+ fi
243
+ "${fleet_runner[@]}" "$SCRIPT_DIR/_cli/cmd_fleet.ts" --config "$FLEET_CONFIG"
244
+ exit $?
245
+ fi
246
+
200
247
  # Interactive --tools picker (S9). Fires only when:
201
248
  # - --tools was not explicitly passed
202
249
  # - --yes / -y was not passed (CI / non-interactive opt-out)
@@ -124,6 +124,23 @@ if git diff --cached --name-only | grep -qE '^(packages/|src/config/discovery/pa
124
124
  exit 1
125
125
  fi
126
126
  fi
127
+
128
+ # Knowledge team-sharing gate (road-to-knowledge-system Phase 3) — refuses a
129
+ # gitignored agents/memory/intake/ file staged by accident, and refuses a
130
+ # agents/knowledge/ page marked visibility: private (belongs in the
131
+ # user-global store, never the team-shared repo). Only fires when staged
132
+ # changes touch agents/knowledge/ or agents/memory/intake/, so unrelated
133
+ # commits stay fast.
134
+ if git diff --cached --name-only | grep -qE '^(agents/knowledge/|agents/memory/intake/)'; then
135
+ if ! ./scripts-run src/scripts/check_knowledge_sharing; then
136
+ echo ""
137
+ echo "❌ Commit blocked — knowledge team-sharing gate failed."
138
+ echo " Unstage the intake/private file, or drop the private page from"
139
+ echo " this commit (it belongs in the user-global knowledge store)."
140
+ echo " To bypass for an unrelated WIP commit: git commit --no-verify"
141
+ exit 1
142
+ fi
143
+ fi
127
144
  EOF
128
145
 
129
146
  chmod +x "$HOOKS_DIR/pre-commit"
@@ -286,7 +286,18 @@ export function main(argv: string[] | null = null): number {
286
286
  let ironTotal = 0;
287
287
  for (const v of iron.values()) ironTotal += v;
288
288
 
289
+ // Freshness marker — required by check_generated_artefact_headers (Phase 8.2)
290
+ const commitShort = (() => {
291
+ try {
292
+ const r = spawnSync('git', ['rev-parse', '--short', 'HEAD'], { encoding: 'utf-8' });
293
+ return r.stdout.trim() || 'unknown';
294
+ } catch { return 'unknown'; }
295
+ })();
296
+ const dateStr = new Date().toISOString().slice(0, 10);
297
+ const fileCount = surfaces.length;
298
+
289
299
  const lines: string[] = [
300
+ `<!-- analyzed: ${dateStr} | commit: ${commitShort} | files: ${fileCount} -->`,
290
301
  '# Meta-Layer / Concept-Surface Inventory',
291
302
  '',
292
303
  '> Read-only discovery output for `agents/roadmaps/road-to-leaner-core-and-discovery.md` Phase 1.',