@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
@@ -67,11 +67,14 @@ export const DASHBOARD_PATH = "agents/roadmaps-progress.md";
67
67
  export const REGEN_NAME = "update_roadmap_progress.ts";
68
68
  // Distributed-content script subtrees that may ship the regenerator,
69
69
  // in priority order. Project-scoped installs land it under .augment/ or
70
- // dist/agent-src/; the package itself carries the same projection.
70
+ // dist/agent-src/; the package itself carries the same projection, and the
71
+ // source checkout carries it under src/agent-src/scripts (so a standalone,
72
+ // env-less invocation from the source tree still resolves it).
71
73
  export const DIST_SCRIPT_SUBDIRS = [
72
74
  path.join(".augment", "scripts"),
73
75
  path.join("dist/agent-src", "scripts"),
74
76
  path.join(".agent-src.uncondensed", "scripts"),
77
+ path.join("src/agent-src", "scripts"),
75
78
  ];
76
79
  // Set by the dispatcher (scripts/hooks/dispatch_hook) to its own resolved
77
80
  // package root, so a globally-installed binary (ADR-020 global-only) can
@@ -177,15 +180,54 @@ export function _is_roadmap_touch(p: string): boolean {
177
180
  return true;
178
181
  }
179
182
 
183
+ /**
184
+ * The repo root whose dashboard an edited roadmap path belongs to, or null
185
+ * when the path is not a roadmap touch.
186
+ *
187
+ * The dashboard the hook must regenerate is the one in the SAME repo as the
188
+ * edited roadmap — which is not necessarily `--project-dir`. An autonomous
189
+ * agent (or a monorepo dev) routinely edits `…/<worktree>/agents/roadmaps/x.md`
190
+ * while the session's project dir is a sibling checkout; keying off
191
+ * `--project-dir` alone silently skipped those edits and let the worktree's
192
+ * dashboard drift. So:
193
+ * - an ABSOLUTE path containing `/agents/roadmaps/` resolves to the prefix
194
+ * before that segment (the edited file's own repo root), wherever it is;
195
+ * - a RELATIVE roadmap path resolves to `consumer_root` (the Augment
196
+ * repo-relative case, where the file genuinely sits under `--project-dir`).
197
+ */
198
+ export function _target_root(p: string, consumer_root: string): string | null {
199
+ const norm = p.replace(/\\/g, "/");
200
+ if (path.isAbsolute(norm)) {
201
+ const marker = "/" + ROADMAP_PREFIX; // "/agents/roadmaps/"
202
+ const idx = norm.indexOf(marker);
203
+ if (idx < 0) {
204
+ return null;
205
+ }
206
+ const rel = norm.slice(idx + 1); // "agents/roadmaps/…"
207
+ if (!_is_roadmap_touch(rel)) {
208
+ return null;
209
+ }
210
+ return norm.slice(0, idx) || "/";
211
+ }
212
+ return _is_roadmap_touch(norm) ? consumer_root : null;
213
+ }
214
+
180
215
  /**
181
216
  * Package roots to search for the shipped regenerator, in priority order,
182
217
  * when the consumer carries no project-local copy.
183
218
  *
184
219
  * 1. ``AGENT_CONFIG_PACKAGE_ROOT`` — the dispatcher passes its own
185
220
  * resolved package root.
186
- * 2. This hook's own location (``<pkg>/src/scripts/roadmap_progress_hook.ts``
187
- * → ``<pkg>/src``) — last-resort fallback for standalone invocation.
188
- * Mirrors the Python `Path(__file__).resolve().parent.parent` walk.
221
+ * 2. This hook's own location — last-resort fallback for a standalone
222
+ * invocation the dispatcher never wrapped. The hook ships at
223
+ * ``<pkg>/src/scripts/roadmap_progress_hook.ts``, so BOTH ``<pkg>/src``
224
+ * (one dir up from ``scripts/``) AND ``<pkg>`` are searched: the shipped
225
+ * regenerator lives under ``<pkg>/dist/agent-src/scripts`` (built /
226
+ * installed) or ``<pkg>/src/agent-src/scripts`` (source), i.e. under
227
+ * ``<pkg>`` — NOT under ``<pkg>/src``. The previous single
228
+ * ``parent.parent`` walk stopped at ``<pkg>/src`` and therefore never
229
+ * found the regenerator when the env var was unset (silent no-op → the
230
+ * dashboard drifted with no signal).
189
231
  */
190
232
  export function _package_roots(): string[] {
191
233
  const roots: string[] = [];
@@ -193,7 +235,9 @@ export function _package_roots(): string[] {
193
235
  if (env_root) {
194
236
  roots.push(_expanduser(env_root));
195
237
  }
196
- roots.push(path.dirname(path.dirname(path.resolve(__filename))));
238
+ const scriptsDir = path.dirname(path.resolve(__filename)); // <pkg>/src/scripts
239
+ roots.push(path.dirname(scriptsDir)); // <pkg>/src
240
+ roots.push(path.dirname(path.dirname(scriptsDir))); // <pkg>
197
241
  return roots;
198
242
  }
199
243
 
@@ -300,33 +344,17 @@ export function run(
300
344
  return 0;
301
345
  }
302
346
 
303
- const paths = _candidate_paths(payload).map((p) => _relativize(p, consumer_root));
304
- if (!paths.some((p) => _is_roadmap_touch(p))) {
305
- return 0;
306
- }
307
-
308
- const script = _resolve_regenerator(consumer_root);
309
- if (script === null) {
310
- // Phase 1 of road-to-hooks-actually-fire-in-consumers: log dispatch
311
- // issue directly (this hook runs as a subprocess from the universal
312
- // dispatcher; routing through the dispatcher would add latency for
313
- // no benefit).
314
- try {
315
- log_dispatch_issue(
316
- consumer_root,
317
- "roadmap-progress",
318
- "prerequisite_missing",
319
- "update_roadmap_progress.ts not found at any of: " +
320
- ".augment/scripts/, dist/agent-src/scripts/, " +
321
- "src/agent-src/scripts/",
322
- "./agent-config hooks:install --regen " + "(or ./agent-config init)",
323
- );
324
- } catch {
325
- // observability never breaks the hook
326
- }
327
- if (verbose) {
328
- process.stderr.write("roadmap-progress-hook: regenerator not found, skipping\n");
347
+ // Each touched roadmap regenerates the dashboard of ITS OWN repo (which may
348
+ // be a worktree/sibling of `consumer_root`, not consumer_root itself). Dedupe
349
+ // so N edits in one repo regenerate once.
350
+ const targetRoots = new Set<string>();
351
+ for (const p of _candidate_paths(payload)) {
352
+ const root = _target_root(p, consumer_root);
353
+ if (root !== null) {
354
+ targetRoots.add(root);
329
355
  }
356
+ }
357
+ if (targetRoots.size === 0) {
330
358
  return 0;
331
359
  }
332
360
 
@@ -339,18 +367,48 @@ export function run(
339
367
  return 0;
340
368
  }
341
369
 
342
- try {
343
- // The regenerator is a `.ts` script; run it through tsx (resolved from
344
- // a node_modules/.bin found by walking up from the regenerator's dir,
345
- // falling back to `npx tsx`), mirroring the dispatcher's `.ts` concerns.
346
- const inv = _resolve_tsx_invocation(script);
347
- spawnSync(inv.command, inv.args, {
348
- cwd: consumer_root,
349
- stdio: ["ignore", "ignore", "ignore"],
350
- timeout: 30000,
351
- });
352
- } catch {
353
- // never propagate regenerator failures into the agent loop
370
+ for (const root of targetRoots) {
371
+ const script = _resolve_regenerator(root);
372
+ if (script === null) {
373
+ // Phase 1 of road-to-hooks-actually-fire-in-consumers: log dispatch
374
+ // issue directly (this hook runs as a subprocess from the universal
375
+ // dispatcher; routing through the dispatcher would add latency for
376
+ // no benefit).
377
+ try {
378
+ log_dispatch_issue(
379
+ root,
380
+ "roadmap-progress",
381
+ "prerequisite_missing",
382
+ "update_roadmap_progress.ts not found at any of: " +
383
+ ".augment/scripts/, dist/agent-src/scripts/, " +
384
+ "src/agent-src/scripts/",
385
+ "./agent-config hooks:install --regen " + "(or ./agent-config init)",
386
+ );
387
+ } catch {
388
+ // observability never breaks the hook
389
+ }
390
+ if (verbose) {
391
+ process.stderr.write(
392
+ `roadmap-progress-hook: regenerator not found for ${root}, skipping\n`,
393
+ );
394
+ }
395
+ continue;
396
+ }
397
+
398
+ try {
399
+ // The regenerator is a `.ts` script; run it through tsx (resolved from
400
+ // a node_modules/.bin found by walking up from the regenerator's dir,
401
+ // falling back to `npx tsx`), mirroring the dispatcher's `.ts` concerns.
402
+ // `--repo-root` + cwd pin the regeneration to the edited file's own repo.
403
+ const inv = _resolve_tsx_invocation(script);
404
+ spawnSync(inv.command, [...inv.args, "--repo-root", root], {
405
+ cwd: root,
406
+ stdio: ["ignore", "ignore", "ignore"],
407
+ timeout: 30000,
408
+ });
409
+ } catch {
410
+ // never propagate regenerator failures into the agent loop
411
+ }
354
412
  }
355
413
 
356
414
  if (verbose) {
@@ -187,6 +187,33 @@
187
187
  "type": "string",
188
188
  "enum": ["lean", "standard", "rich"],
189
189
  "description": "Token-cost class for this skill. `lean` (default): subject to telegraph-speak condensation and thin-projector trimming; optimize for <500 tokens. `standard`: balanced guidance, normal condensation. `rich`: exempt from telegraph-speak and thin-projector trimming; detailed examples preserved; eager-load eligible; ≤15% of skills in a suite may be `rich` (CI-enforced). A `rich` skill MUST carry a '## Why this skill is rich' section explaining the irreducible complexity that makes condensation harmful. Governed by `token-budget-discipline` rule + `tokens.rich_skills` consumer setting. See docs/guidelines/token-budget-governance.md."
190
+ },
191
+ "parallelizable": {
192
+ "type": "string",
193
+ "enum": ["steps", "files", "independent"],
194
+ "description": "Classifier signal for auto-dispatch. 'steps' = ordered multi-step plan → do-in-steps. 'files' = N independent files of the same shape → do-in-parallel. 'independent' = N independent same-shape targets (not files) → do-in-parallel. Omit for skills that are always single-pass. Read by auto-dispatch-classification.md classifier signal 1."
195
+ },
196
+ "gaps": {
197
+ "type": "array",
198
+ "description": "B6 — honest-null known limitations. Human-curated (NOT auto-discovered), not all skills. Each entry documents a real limitation and cites a witness test that reproduces it. Rendered on the proof page's 'Known Limits'; check_skill_gaps enforces every witness path exists. The offensive-transparency surface a headline-benchmark cannot ship.",
199
+ "items": {
200
+ "type": "object",
201
+ "additionalProperties": false,
202
+ "required": ["description", "witness"],
203
+ "properties": {
204
+ "description": {
205
+ "type": "string",
206
+ "minLength": 1,
207
+ "maxLength": 280,
208
+ "description": "The limitation, stated honestly (what the skill does NOT do / where it fails)."
209
+ },
210
+ "witness": {
211
+ "type": "string",
212
+ "minLength": 1,
213
+ "description": "Repo-relative path to a test that reproduces/demonstrates this limitation (passes while the gap is real; a failing witness = stale gap to remove)."
214
+ }
215
+ }
216
+ }
190
217
  }
191
218
  }
192
219
  }
@@ -0,0 +1,106 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/event4u-app/agent-config/scripts/schemas/subagent.schema.json",
4
+ "title": "Subagent frontmatter (subagent-v1)",
5
+ "$comment": "Source: ADR-109. A subagent is an addressable, tool-scoped execution context projected to a host's native subagent format (Claude Code `.claude/agents/`) or, on non-subagent hosts, to a loadable context file. Static projection only — dispatch stays with the host/user, never runtime-enforced. Governance fields (trust, lifecycle, discovery.visible) are REQUIRED, mirroring the skill trust block so subagents share one governance model. model_tier reuses model_tier.ts (ADR-034/035).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "name",
11
+ "description",
12
+ "model_tier",
13
+ "tools",
14
+ "trust",
15
+ "lifecycle",
16
+ "discovery",
17
+ "source"
18
+ ],
19
+ "properties": {
20
+ "schema_version": {
21
+ "type": "string",
22
+ "const": "subagent-v1"
23
+ },
24
+ "name": {
25
+ "type": "string",
26
+ "pattern": "^[a-z][a-z0-9-]*$",
27
+ "description": "Addressable handle. Must match the subagent filename stem and be globally unique within the subagent category (projection-path collision guard)."
28
+ },
29
+ "description": {
30
+ "type": "string",
31
+ "minLength": 1,
32
+ "maxLength": 240,
33
+ "description": "User-facing summary. On Claude Code this drives `@`-menu discoverability; keep it action-oriented."
34
+ },
35
+ "model_tier": {
36
+ "type": "string",
37
+ "enum": ["lite", "medium", "high", "inherit"],
38
+ "description": "Vendor-neutral capability band (ADR-034/035). high/medium/lite project to a native Claude `model:` (high→opus, medium→sonnet, lite→haiku) via model_tier.ts; `inherit` is a documented passthrough sentinel (→ CC `model: inherit`), not a new mapping."
39
+ },
40
+ "tools": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "uniqueItems": true,
44
+ "items": {
45
+ "type": "string",
46
+ "enum": ["Read", "Write", "Edit", "Grep", "Glob", "Bash", "WebFetch", "WebSearch", "NotebookEdit"]
47
+ },
48
+ "description": "Enum-validated at build time against the Claude Code tool set, so a bad value fails CI rather than producing broken `.claude/agents/` YAML in the user's IDE."
49
+ },
50
+ "trust": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["level", "confidence", "human_review_required"],
54
+ "properties": {
55
+ "level": {
56
+ "type": "string",
57
+ "enum": ["core", "professional", "experimental", "advisory", "restricted"],
58
+ "default": "core"
59
+ },
60
+ "confidence": {
61
+ "type": "string",
62
+ "enum": ["high", "medium", "low"],
63
+ "default": "high"
64
+ },
65
+ "human_review_required": {
66
+ "type": "boolean",
67
+ "default": false
68
+ }
69
+ },
70
+ "description": "ADR-013 trust block, mirrored from the skill schema so subagents share one governance model."
71
+ },
72
+ "lifecycle": {
73
+ "type": "string",
74
+ "enum": ["active", "deprecated", "experimental", "archived"],
75
+ "default": "active",
76
+ "description": "ADR-013 lifecycle state."
77
+ },
78
+ "discovery": {
79
+ "type": "object",
80
+ "additionalProperties": false,
81
+ "required": ["visible", "requires_capability"],
82
+ "properties": {
83
+ "visible": {
84
+ "const": false,
85
+ "description": "Subagents are default-off. The value MUST be false; a pack/profile opts in explicitly via include: [\"subagent:<name>\"]."
86
+ },
87
+ "requires_capability": {
88
+ "type": "string",
89
+ "minLength": 1,
90
+ "description": "Host-capability gate (e.g. claude_subagents). Hosts without the capability receive the loadable-context-file degradation, not native dispatch."
91
+ },
92
+ "categories": {
93
+ "type": "array",
94
+ "items": { "type": "string" },
95
+ "uniqueItems": true,
96
+ "description": "Optional pack-include tags (include: [\"subagent:category:<tag>\"])."
97
+ }
98
+ }
99
+ },
100
+ "source": {
101
+ "type": "string",
102
+ "enum": ["package", "project"],
103
+ "default": "package"
104
+ }
105
+ }
106
+ }
@@ -1428,6 +1428,7 @@ export function lint_skill(p: string, text: string): LintResult {
1428
1428
  'terragrunt',
1429
1429
  'traefik',
1430
1430
  'websocket',
1431
+ 'wireframe',
1431
1432
  ]);
1432
1433
  if (!ALLOWED_BARE_NOUNS.has(skillName.toLowerCase())) {
1433
1434
  issues.push(
@@ -2,9 +2,10 @@
2
2
  # scripts/smoke/kernel.sh — kernel-tier smoke (step-11 Phase 3 Step 2).
3
3
  #
4
4
  # Asserts:
5
- # 1. router.json lists exactly 10 kernel rules.
5
+ # 1. router.json lists exactly 9 kernel rules.
6
6
  # 2. Every kernel rule file exists at dist/agent-src/rules/<id>.md.
7
- # 3. 9 of 10 carry at least one Iron-Law fenced block.
7
+ # 3. 8 of 9 carry at least one Iron-Law fenced block (agent-authority
8
+ # is the fence-less priority index).
8
9
  # agent-authority is the dispatch index, exempt from the fence
9
10
  # requirement (docs/contracts/smoke-contracts.md § 3.1).
10
11
  # 4. Kernel-bucket char budget breaches ≤ EXPECTED_BREACHES.
@@ -16,8 +17,8 @@
16
17
 
17
18
  set -euo pipefail
18
19
 
19
- EXPECTED_KERNEL_COUNT=10
20
- EXPECTED_FENCE_CARRIERS=9
20
+ EXPECTED_KERNEL_COUNT=9
21
+ EXPECTED_FENCE_CARRIERS=8
21
22
  # Bumped 2 → 3 in v4.0.0: the `fix(authority): block execution offers
22
23
  # after roadmap/vision artifact save` commit (d30d441e) pushed
23
24
  # scope-control and commit-policy past their per-rule caps; kernel-bucket
@@ -37,6 +37,7 @@ clusters:
37
37
  cost: lab # cost tracking / budget gate (observability, Node .mjs)
38
38
  mcp_server: lab # MCP stdio server, separate runtime, pilot distribution
39
39
  media: lab # shared adapter substrate for ai-video / ai-image
40
+ parity: lab # py2ts parity rigs (compare / coverage-diff), migration tooling
40
41
  prediction-pool: lab # prediction-pool optimizer (fun pack, experimental)
41
42
 
42
43
  # Top-level src/scripts/*.py modules that belong to lab (module stem, no .py).
@@ -55,6 +55,10 @@ export const DEFAULT_TEMPLATE = path.join(
55
55
  // managed block or outside (older installers / hand-edits). Current canonical
56
56
  // equivalents (e.g. /agents/runtime/.agent-prices.md) come from the template
57
57
  // and are NOT affected. Leading-slash variants are matched defensively.
58
+ //
59
+ // Authoritative source: src/config/agents-paths.yml entries with `legacy: true`.
60
+ // Manual sync until the generation step from the manifest is implemented
61
+ // (road-to-agents-dir-and-gitignore-hygiene Phase 3.2 follow-on).
58
62
  export const LEGACY_PATTERNS: readonly string[] = [
59
63
  '.agent-chat-history',
60
64
  '.agent-chat-history.bak',
@@ -0,0 +1,172 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Cross-cycle recurrence tracker for `agents/knowledge/procedures/skill-candidates.md`
4
+ * — road-to-knowledge-system Phase 2 (capture hygiene).
5
+ *
6
+ * Each `/memory:mine-session` / `memory-consolidation` cycle that finds an
7
+ * unpromoted, recurring topic calls this to increment a durable per-topic
8
+ * counter. At >= 3 mentions the topic is a live skill/procedure candidate —
9
+ * `learning-to-rule-or-skill` picks it up from here for human-gated
10
+ * promotion. This script only maintains the counter file; it never proposes
11
+ * or writes a skill/rule itself.
12
+ *
13
+ * Usage:
14
+ * update_skill_candidates.ts --topic <slug> --session <id> --date <YYYY-MM-DD> [--file <path>]
15
+ *
16
+ * Exit codes: 0 = updated (prints whether the candidate threshold (3) was
17
+ * crossed BY this call), 1 = usage error.
18
+ */
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import process from 'node:process';
22
+ import { fileURLToPath } from 'node:url';
23
+
24
+ const PROG = 'update_skill_candidates.ts';
25
+ export const CANDIDATE_THRESHOLD = 3;
26
+ const DEFAULT_FILE = path.join('agents', 'knowledge', 'procedures', 'skill-candidates.md');
27
+
28
+ export interface CandidateRecord {
29
+ topic: string;
30
+ mentions: number;
31
+ first: string; // YYYY-MM-DD
32
+ lastSeen: string; // YYYY-MM-DD
33
+ sessions: string[]; // unique, insertion order
34
+ }
35
+
36
+ const HEADING_RE = /^## (.+)$/;
37
+ const FIELD_RE = /^- (\w[\w ]*): (.*)$/;
38
+
39
+ /** Parse the skill-candidates.md body into topic → record. Tolerant of a missing/empty file. */
40
+ export function parseCandidates(body: string): Map<string, CandidateRecord> {
41
+ const out = new Map<string, CandidateRecord>();
42
+ let current: CandidateRecord | null = null;
43
+
44
+ for (const rawLine of body.split(/\r?\n/)) {
45
+ const headingMatch = HEADING_RE.exec(rawLine);
46
+ if (headingMatch?.[1] !== undefined) {
47
+ current = { topic: headingMatch[1].trim(), mentions: 0, first: '', lastSeen: '', sessions: [] };
48
+ out.set(current.topic, current);
49
+ continue;
50
+ }
51
+ if (!current) continue;
52
+ const fieldMatch = FIELD_RE.exec(rawLine);
53
+ if (!fieldMatch) continue;
54
+ const [, key, value] = fieldMatch;
55
+ if (key === undefined || value === undefined) continue;
56
+ if (key === 'Mentions') current.mentions = Number.parseInt(value, 10) || 0;
57
+ else if (key === 'First seen') current.first = value.trim();
58
+ else if (key === 'Last seen') current.lastSeen = value.trim();
59
+ else if (key === 'Sessions') {
60
+ current.sessions = value
61
+ .split(',')
62
+ .map((s) => s.trim())
63
+ .filter(Boolean);
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+
69
+ export function renderCandidates(records: Map<string, CandidateRecord>): string {
70
+ const lines: string[] = [];
71
+ lines.push('# Skill Candidates');
72
+ lines.push('');
73
+ lines.push(
74
+ `_Auto-maintained by \`src/scripts/update_skill_candidates.ts\`. A topic reaches candidate status at ${CANDIDATE_THRESHOLD}+ mentions across distinct sessions — see \`learning-to-rule-or-skill\` for the human-gated promotion path._`,
75
+ );
76
+
77
+ const topics = [...records.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
78
+ for (const topic of topics) {
79
+ const r = records.get(topic)!;
80
+ lines.push('');
81
+ lines.push(`## ${r.topic}`);
82
+ lines.push('');
83
+ lines.push(`- Mentions: ${r.mentions}`);
84
+ lines.push(`- First seen: ${r.first}`);
85
+ lines.push(`- Last seen: ${r.lastSeen}`);
86
+ lines.push(`- Sessions: ${r.sessions.join(', ')}`);
87
+ }
88
+ lines.push('');
89
+ return lines.join('\n');
90
+ }
91
+
92
+ /** Increment (or create) a topic's recurrence record. Mutates and returns the map; returns whether this call crossed the candidate threshold. */
93
+ export function upsertCandidate(
94
+ records: Map<string, CandidateRecord>,
95
+ topic: string,
96
+ sessionId: string,
97
+ date: string,
98
+ ): { crossedThreshold: boolean; record: CandidateRecord } {
99
+ let record = records.get(topic);
100
+ const wasBelowThreshold = !record || record.mentions < CANDIDATE_THRESHOLD;
101
+
102
+ if (!record) {
103
+ record = { topic, mentions: 0, first: date, lastSeen: date, sessions: [] };
104
+ records.set(topic, record);
105
+ }
106
+
107
+ if (!record.sessions.includes(sessionId)) {
108
+ record.sessions.push(sessionId);
109
+ record.mentions += 1;
110
+ }
111
+ record.lastSeen = date;
112
+
113
+ const crossedThreshold = wasBelowThreshold && record.mentions >= CANDIDATE_THRESHOLD;
114
+ return { crossedThreshold, record };
115
+ }
116
+
117
+ function printUsage(): void {
118
+ process.stderr.write(`usage: ${PROG} --topic TOPIC --session ID --date YYYY-MM-DD [--file PATH]\n`);
119
+ }
120
+
121
+ export function main(argv: string[]): number {
122
+ let topic: string | null = null;
123
+ let session: string | null = null;
124
+ let date: string | null = null;
125
+ let file = DEFAULT_FILE;
126
+
127
+ for (let i = 0; i < argv.length; i++) {
128
+ const arg = argv[i];
129
+ if (arg === '-h' || arg === '--help') {
130
+ printUsage();
131
+ return 0;
132
+ } else if (arg === '--topic') {
133
+ topic = argv[++i] ?? null;
134
+ } else if (arg === '--session') {
135
+ session = argv[++i] ?? null;
136
+ } else if (arg === '--date') {
137
+ date = argv[++i] ?? null;
138
+ } else if (arg === '--file') {
139
+ file = argv[++i] ?? file;
140
+ } else {
141
+ process.stderr.write(`${PROG}: error: unrecognized argument: ${arg}\n`);
142
+ printUsage();
143
+ return 1;
144
+ }
145
+ }
146
+
147
+ if (!topic || !session || !date) {
148
+ process.stderr.write(`${PROG}: error: --topic, --session, and --date are required\n`);
149
+ printUsage();
150
+ return 1;
151
+ }
152
+
153
+ const existingBody = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
154
+ const records = parseCandidates(existingBody);
155
+ const { crossedThreshold, record } = upsertCandidate(records, topic, session, date);
156
+
157
+ fs.mkdirSync(path.dirname(file), { recursive: true });
158
+ fs.writeFileSync(file, renderCandidates(records), 'utf8');
159
+
160
+ if (crossedThreshold) {
161
+ process.stdout.write(
162
+ `${PROG}: "${topic}" reached candidate status (${record.mentions} mentions) — surface for learning-to-rule-or-skill.\n`,
163
+ );
164
+ } else {
165
+ process.stdout.write(`${PROG}: "${topic}" now at ${record.mentions} mention(s).\n`);
166
+ }
167
+ return 0;
168
+ }
169
+
170
+ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
171
+ process.exit(main(process.argv.slice(2)));
172
+ }
@@ -816,6 +816,7 @@ export function _iter_artefacts(root: string): Array<[string, string]> {
816
816
  ['skill', _rglobSorted(path.join(root, 'skills'), 'SKILL.md')],
817
817
  ['rule', _rglobSorted(path.join(root, 'rules'), '*.md')],
818
818
  ['command', _rglobSorted(path.join(root, 'commands'), '*.md')],
819
+ ['subagent', _rglobSorted(path.join(root, 'subagents'), '*.md')],
819
820
  [
820
821
  'persona',
821
822
  _globSorted(path.join(root, 'personas'), '*.md').filter(