@event4u/agent-config 8.1.0 → 8.3.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 (615) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/CHANGELOG.md +83 -292
  3. package/MIGRATION.md +18 -0
  4. package/README.md +86 -3
  5. package/dist/agent-src/commands/agents/init.md +3 -3
  6. package/dist/agent-src/commands/chat-history/import.md +5 -5
  7. package/dist/agent-src/commands/chat-history.md +1 -1
  8. package/dist/agent-src/commands/condense.md +1 -1
  9. package/dist/agent-src/commands/context/create.md +1 -1
  10. package/dist/agent-src/commands/council/analysis.md +2 -2
  11. package/dist/agent-src/commands/council/default.md +3 -3
  12. package/dist/agent-src/commands/council/design.md +2 -2
  13. package/dist/agent-src/commands/council/optimize.md +1 -1
  14. package/dist/agent-src/commands/council/pr.md +2 -2
  15. package/dist/agent-src/commands/council.md +1 -1
  16. package/dist/agent-src/commands/feature/plan.md +1 -1
  17. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  18. package/dist/agent-src/commands/ghostwriter/write.md +1 -1
  19. package/dist/agent-src/commands/ghostwriter.md +1 -1
  20. package/dist/agent-src/commands/implement-ticket.md +2 -2
  21. package/dist/agent-src/commands/judge/on-diff.md +1 -1
  22. package/dist/agent-src/commands/judge/steps.md +3 -1
  23. package/dist/agent-src/commands/memory/add.md +2 -2
  24. package/dist/agent-src/commands/memory/learn-low-impact.md +1 -1
  25. package/dist/agent-src/commands/memory/load.md +1 -1
  26. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  27. package/dist/agent-src/commands/memory/promote.md +1 -1
  28. package/dist/agent-src/commands/memory/propose.md +1 -1
  29. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  30. package/dist/agent-src/commands/module/explore.md +3 -3
  31. package/dist/agent-src/commands/optimize/agents-dir.md +1 -1
  32. package/dist/agent-src/commands/optimize/skills.md +1 -1
  33. package/dist/agent-src/commands/optimize-project.md +1 -1
  34. package/dist/agent-src/commands/orchestrate.md +2 -2
  35. package/dist/agent-src/commands/project-analyze.md +1 -1
  36. package/dist/agent-src/commands/project-health.md +1 -1
  37. package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
  38. package/dist/agent-src/commands/roadmap/create.md +2 -2
  39. package/dist/agent-src/commands/roadmap/process-full.md +3 -1
  40. package/dist/agent-src/commands/roadmap/process-phase.md +4 -2
  41. package/dist/agent-src/commands/roadmap/process-step.md +3 -1
  42. package/dist/agent-src/commands/security-audit-config.md +1 -1
  43. package/dist/agent-src/commands/sync-agent-settings.md +7 -7
  44. package/dist/agent-src/commands/sync-gitignore/fix.md +3 -3
  45. package/dist/agent-src/commands/sync-gitignore.md +4 -4
  46. package/dist/agent-src/commands/work.md +3 -3
  47. package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
  48. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +2 -2
  49. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +1 -1
  50. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -7
  51. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  52. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +9 -4
  53. package/dist/agent-src/contexts/execution/toolchain-resolver.md +10 -9
  54. package/dist/agent-src/contexts/execution/verification-mechanics.md +13 -1
  55. package/dist/agent-src/packs/README.md +1 -1
  56. package/dist/agent-src/presets/README.md +1 -1
  57. package/dist/agent-src/profiles/README.md +1 -1
  58. package/dist/agent-src/rules/architecture.md +2 -2
  59. package/dist/agent-src/rules/context-hygiene.md +2 -2
  60. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -1
  61. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  62. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +1 -1
  63. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -3
  64. package/dist/agent-src/rules/media-governance-routing.md +1 -1
  65. package/dist/agent-src/rules/no-roadmap-references.md +3 -3
  66. package/dist/agent-src/rules/preservation-guard.md +2 -2
  67. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +6 -5
  68. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -3
  69. package/dist/agent-src/rules/security-sensitive-stop.md +7 -9
  70. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  71. package/dist/agent-src/rules/telegraph-speak.md +1 -1
  72. package/dist/agent-src/rules/token-optimizer-maintenance.md +1 -1
  73. package/dist/agent-src/rules/ui-audit-gate.md +1 -1
  74. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +22 -4
  75. package/dist/agent-src/scripts/update_roadmap_progress.ts +29 -1
  76. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -2
  77. package/dist/agent-src/skills/adr-create/SKILL.md +8 -6
  78. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +1 -1
  79. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
  80. package/dist/agent-src/skills/ai-council/SKILL.md +15 -15
  81. package/dist/agent-src/skills/api-design/SKILL.md +1 -1
  82. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -1
  83. package/dist/agent-src/skills/authz-review/SKILL.md +1 -1
  84. package/dist/agent-src/skills/blade-ui/SKILL.md +11 -10
  85. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +9 -8
  86. package/dist/agent-src/skills/code-review/SKILL.md +3 -4
  87. package/dist/agent-src/skills/command-routing/SKILL.md +3 -3
  88. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  89. package/dist/agent-src/skills/condense-memory/SKILL.md +2 -2
  90. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  91. package/dist/agent-src/skills/context-document/SKILL.md +1 -1
  92. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +1 -1
  93. package/dist/agent-src/skills/corpus-grounding/SKILL.md +16 -11
  94. package/dist/agent-src/skills/corpus-grounding/scripts/ground.ts +24 -3
  95. package/dist/agent-src/skills/dashboard-design/SKILL.md +2 -1
  96. package/dist/agent-src/skills/database/SKILL.md +2 -1
  97. package/dist/agent-src/skills/description-assist/SKILL.md +6 -6
  98. package/dist/agent-src/skills/design-intelligence/SKILL.md +6 -5
  99. package/dist/agent-src/skills/design-tokens/SKILL.md +5 -5
  100. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +24 -3
  101. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +3 -3
  102. package/dist/agent-src/skills/fe-design/SKILL.md +7 -7
  103. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +11 -4
  104. package/dist/agent-src/skills/flux/SKILL.md +10 -9
  105. package/dist/agent-src/skills/git-workflow/SKILL.md +4 -5
  106. package/dist/agent-src/skills/guideline-writing/SKILL.md +2 -2
  107. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +2 -2
  108. package/dist/agent-src/skills/livewire/SKILL.md +10 -9
  109. package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
  110. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +5 -5
  111. package/dist/agent-src/skills/module-management/SKILL.md +2 -2
  112. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +11 -11
  113. package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +6 -6
  114. package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +1 -1
  115. package/dist/agent-src/skills/premortem/SKILL.md +1 -1
  116. package/dist/agent-src/skills/project-docs/SKILL.md +1 -1
  117. package/dist/agent-src/skills/quality-tools/SKILL.md +26 -2
  118. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +8 -7
  119. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +31 -10
  120. package/dist/agent-src/skills/refine-prompt/SKILL.md +14 -14
  121. package/dist/agent-src/skills/refine-ticket/SKILL.md +24 -25
  122. package/dist/agent-src/skills/refine-ticket/detection-map.yml +1 -1
  123. package/dist/agent-src/skills/review-routing/SKILL.md +6 -7
  124. package/dist/agent-src/skills/roadmap-management/SKILL.md +11 -6
  125. package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
  126. package/dist/agent-src/skills/rule-writing/SKILL.md +5 -5
  127. package/dist/agent-src/skills/script-writing/SKILL.md +28 -41
  128. package/dist/agent-src/skills/skill-writing/SKILL.md +3 -3
  129. package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
  130. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -1
  131. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  132. package/dist/agent-src/skills/systematic-debugging/SKILL.md +5 -7
  133. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -2
  134. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.ts +25 -4
  135. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  136. package/dist/agent-src/skills/typography-system/SKILL.md +1 -1
  137. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +5 -7
  138. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +13 -1
  139. package/dist/agent-src/templates/agent-settings.md +34 -25
  140. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  141. package/dist/agent-src/templates/agents/memory/incident-learnings.example.yml +1 -1
  142. package/dist/agent-src/templates/agents/proposal.example.md +4 -4
  143. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  144. package/dist/agent-src/templates/github-workflows/memory-hygiene.yml +10 -10
  145. package/dist/agent-src/templates/github-workflows/pr-risk-review.yml +19 -8
  146. package/dist/agent-src/templates/github-workflows/proposal-drift.yml +11 -8
  147. package/dist/agent-src/templates/github-workflows/roadmap-progress-check.yml +10 -12
  148. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +21 -11
  149. package/dist/agent-src/templates/hooks/pre-commit-roadmap-progress +43 -29
  150. package/dist/agent-src/templates/roadmaps.md +9 -4
  151. package/dist/agent-src/templates/rule.md +3 -3
  152. package/dist/agent-src/templates/scripts/README.md +6 -6
  153. package/dist/agent-src/templates/scripts/check_memory.ts +24 -2
  154. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +23 -4
  155. package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +1 -1
  156. package/dist/agent-src/templates/scripts/memory_hash.ts +24 -2
  157. package/dist/agent-src/templates/scripts/memory_lookup.ts +24 -2
  158. package/dist/agent-src/templates/scripts/memory_report.ts +24 -2
  159. package/dist/agent-src/templates/scripts/memory_signal.ts +24 -2
  160. package/dist/agent-src/templates/scripts/memory_status.ts +26 -2
  161. package/dist/agent-src/templates/scripts/ownership-map.example.yml +1 -1
  162. package/dist/agent-src/templates/scripts/pr-risk-config.example.yml +1 -1
  163. package/dist/agent-src/templates/scripts/pr_review_routing.ts +24 -3
  164. package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  165. package/dist/agent-src/templates/scripts/telemetry_record.ts +24 -3
  166. package/dist/agent-src/templates/scripts/telemetry_report.ts +25 -3
  167. package/dist/agent-src/templates/scripts/telemetry_status.ts +24 -3
  168. package/dist/agent-src/templates/scripts/tier_usage_report.ts +24 -2
  169. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +44 -10
  170. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.ts +26 -13
  171. package/dist/agent-src/templates/skill.md +2 -2
  172. package/dist/cli/python/knowledge_ingest.js +24 -3
  173. package/dist/cli/python/knowledge_ingest.js.map +1 -1
  174. package/dist/cli/python/workspace_analytics.js +23 -3
  175. package/dist/cli/python/workspace_analytics.js.map +1 -1
  176. package/dist/cli/python/workspace_crypto.js +23 -3
  177. package/dist/cli/python/workspace_crypto.js.map +1 -1
  178. package/dist/cli/python/workspace_documents.js +23 -3
  179. package/dist/cli/python/workspace_documents.js.map +1 -1
  180. package/dist/cli/python/workspace_drive.js +24 -3
  181. package/dist/cli/python/workspace_drive.js.map +1 -1
  182. package/dist/cli/python/workspace_drive_health.js +23 -3
  183. package/dist/cli/python/workspace_drive_health.js.map +1 -1
  184. package/dist/cli/python/workspace_explain.js +23 -3
  185. package/dist/cli/python/workspace_explain.js.map +1 -1
  186. package/dist/cli/python/workspace_hosts.js +23 -3
  187. package/dist/cli/python/workspace_hosts.js.map +1 -1
  188. package/dist/cli/python/workspace_inbox.js +23 -3
  189. package/dist/cli/python/workspace_inbox.js.map +1 -1
  190. package/dist/cli/python/workspace_render.js +23 -3
  191. package/dist/cli/python/workspace_render.js.map +1 -1
  192. package/dist/cli/python/workspace_roles.js +23 -3
  193. package/dist/cli/python/workspace_roles.js.map +1 -1
  194. package/dist/cli/python/workspace_sessions.js +23 -3
  195. package/dist/cli/python/workspace_sessions.js.map +1 -1
  196. package/dist/cli/python/workspace_skills.js +23 -3
  197. package/dist/cli/python/workspace_skills.js.map +1 -1
  198. package/dist/cli/registry.js +2 -0
  199. package/dist/cli/registry.js.map +1 -1
  200. package/dist/discovery/deprecation-report.md +1 -1
  201. package/dist/discovery/discovery-manifest.json +118 -118
  202. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  203. package/dist/discovery/discovery-manifest.summary.md +2 -2
  204. package/dist/discovery/orphan-report.md +1 -1
  205. package/dist/discovery/packs.json +3 -3
  206. package/dist/discovery/trust-report.md +1 -1
  207. package/dist/discovery/workspaces.json +3 -3
  208. package/dist/install/install.mjs +647 -408
  209. package/dist/mcp/registry-manifest.json +3 -3
  210. package/dist/server/routes/settings.js +4 -4
  211. package/dist/server/routes/settings.js.map +1 -1
  212. package/dist/server/schemas/settings.js +1 -1
  213. package/dist/server/schemas/settings.js.map +1 -1
  214. package/docs/CLAIMS.md +2 -2
  215. package/docs/archive/CHANGELOG-pre-8.1.0.md +316 -0
  216. package/docs/benchmark.md +40 -0
  217. package/docs/contracts/CHANGELOG-conventions.md +8 -5
  218. package/docs/contracts/branch-protection-policy.md +14 -5
  219. package/docs/contracts/mcp-phase-1-scope.md +75 -0
  220. package/docs/contracts/mcp-tool-inventory.md +22 -15
  221. package/docs/contracts/release-pr-gating.md +22 -11
  222. package/docs/contracts/skill-bundled-assets.md +2 -2
  223. package/docs/customization.md +1 -1
  224. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +9 -4
  225. package/docs/decisions/ADR-111-canonical-glama-listing.md +97 -0
  226. package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +92 -0
  227. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +201 -0
  228. package/docs/decisions/INDEX.md +3 -0
  229. package/docs/distribution/registry-submissions.md +1 -1
  230. package/docs/getting-started.md +8 -6
  231. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +2 -2
  232. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +4 -4
  233. package/docs/guidelines/agent-infra/installed-tools-manifest.md +3 -3
  234. package/docs/guidelines/agent-infra/language-and-tone-examples.md +2 -2
  235. package/docs/guidelines/agent-infra/layered-settings.md +4 -4
  236. package/docs/guidelines/agent-infra/memory-access.md +19 -18
  237. package/docs/guidelines/agent-infra/naming.md +1 -1
  238. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +5 -5
  239. package/docs/guidelines/agent-infra/role-contracts.md +1 -1
  240. package/docs/guidelines/agent-infra/security-lint-containment.md +2 -2
  241. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +1 -1
  242. package/docs/guidelines/agent-infra/size-and-scope.md +1 -1
  243. package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
  244. package/docs/guidelines/augment-portability-patterns.md +1 -1
  245. package/docs/installation.md +13 -14
  246. package/docs/mcp-server.md +32 -20
  247. package/docs/proof.md +1 -1
  248. package/docs/setup/mcp-cloud-endpoints.md +9 -2
  249. package/docs/setup/per-ide/claude-code.md +10 -4
  250. package/package.json +4 -3
  251. package/src/config/agent-settings.template.yml +31 -17
  252. package/src/config/host-capabilities.yml +25 -16
  253. package/src/config/profiles/balanced.ini +5 -3
  254. package/src/scripts/_cli/cmd_analyze_session.ts +23 -4
  255. package/src/scripts/_cli/cmd_conformance.ts +23 -4
  256. package/src/scripts/_cli/cmd_doctor.ts +196 -8
  257. package/src/scripts/_cli/cmd_explain.ts +23 -4
  258. package/src/scripts/_cli/cmd_export.ts +23 -4
  259. package/src/scripts/_cli/cmd_fleet.ts +23 -4
  260. package/src/scripts/_cli/cmd_migrate.ts +23 -4
  261. package/src/scripts/_cli/cmd_preflight.ts +24 -4
  262. package/src/scripts/_cli/cmd_prune.ts +23 -4
  263. package/src/scripts/_cli/cmd_refresh.ts +23 -4
  264. package/src/scripts/_cli/cmd_settings_check.ts +23 -4
  265. package/src/scripts/_cli/cmd_settings_migrate.ts +23 -4
  266. package/src/scripts/_cli/cmd_sync.ts +23 -4
  267. package/src/scripts/_cli/cmd_uninstall.ts +45 -4
  268. package/src/scripts/_cli/cmd_update.ts +23 -4
  269. package/src/scripts/_cli/cmd_upgrade.ts +307 -17
  270. package/src/scripts/_cli/cmd_validate.ts +23 -4
  271. package/src/scripts/_cli/cmd_versions.ts +23 -4
  272. package/src/scripts/_dispatch.bash +62 -19
  273. package/src/scripts/_lib/claude_plugin.ts +83 -0
  274. package/src/scripts/_lib/claude_settings_hooks.ts +251 -0
  275. package/src/scripts/_lib/knowledge_global.ts +24 -2
  276. package/src/scripts/_lib/knowledge_global_promote.ts +24 -2
  277. package/src/scripts/_lib/knowledge_global_redaction.ts +24 -2
  278. package/src/scripts/_lib/link_crypto.ts +24 -5
  279. package/src/scripts/_lib/pin_resolver.ts +24 -3
  280. package/src/scripts/adoption_report.ts +23 -4
  281. package/src/scripts/adoption_snapshot.ts +23 -1
  282. package/src/scripts/adoption_status.ts +23 -4
  283. package/src/scripts/adr/regenerate_index.ts +24 -3
  284. package/src/scripts/ai_council/airgap.ts +25 -2
  285. package/src/scripts/ai_council/compile_corpus.ts +24 -2
  286. package/src/scripts/ai_council/pricing.ts +11 -1
  287. package/src/scripts/analysis_freshness.ts +23 -4
  288. package/src/scripts/annotate_discovery.ts +23 -1
  289. package/src/scripts/apply_modules_config.ts +23 -4
  290. package/src/scripts/audit_adr_coverage.ts +23 -4
  291. package/src/scripts/audit_auto_rules.ts +23 -1
  292. package/src/scripts/audit_cloud_compatibility.ts +23 -4
  293. package/src/scripts/audit_command_surface.ts +23 -4
  294. package/src/scripts/audit_initial_context.ts +23 -3
  295. package/src/scripts/audit_likelihood.ts +23 -1
  296. package/src/scripts/audit_mcp_tools.ts +23 -3
  297. package/src/scripts/audit_overlap.ts +23 -1
  298. package/src/scripts/audit_skill_descriptions.ts +24 -2
  299. package/src/scripts/audit_skill_overlap.ts +23 -1
  300. package/src/scripts/audit_user_type_axis.ts +23 -4
  301. package/src/scripts/backfill_model_tier.ts +23 -4
  302. package/src/scripts/bench_ab_cache_dispatch.ts +23 -1
  303. package/src/scripts/bench_ab_clone.ts +23 -1
  304. package/src/scripts/bench_ab_diff.ts +23 -1
  305. package/src/scripts/bench_ab_integrity.ts +23 -1
  306. package/src/scripts/bench_ab_run.ts +23 -2
  307. package/src/scripts/bench_ab_task_runner.ts +23 -1
  308. package/src/scripts/bench_ab_tracka_run.ts +23 -2
  309. package/src/scripts/bench_ab_v2_run.ts +23 -1
  310. package/src/scripts/bench_ab_v2_stats.ts +23 -1
  311. package/src/scripts/bench_baseline_ready.ts +23 -1
  312. package/src/scripts/bench_condense_memory.ts +23 -1
  313. package/src/scripts/bench_drift_check.ts +23 -2
  314. package/src/scripts/bench_matrix.ts +23 -4
  315. package/src/scripts/bench_per_tool.ts +23 -1
  316. package/src/scripts/bench_quality_run.ts +23 -2
  317. package/src/scripts/bench_rtk_savings.ts +23 -1
  318. package/src/scripts/bench_rule_load_latency.ts +23 -2
  319. package/src/scripts/bench_run.ts +23 -2
  320. package/src/scripts/bench_runner.ts +23 -1
  321. package/src/scripts/build_cloud_bundle.ts +23 -3
  322. package/src/scripts/build_discovery_manifest.ts +23 -4
  323. package/src/scripts/build_linear_digest.ts +23 -3
  324. package/src/scripts/build_mcp_registry_manifest.ts +23 -4
  325. package/src/scripts/build_rule_trigger_matrix.ts +23 -4
  326. package/src/scripts/capture_showcase_session.ts +23 -1
  327. package/src/scripts/chat_history.ts +24 -3
  328. package/src/scripts/check_always_budget.ts +23 -2
  329. package/src/scripts/check_artefact_checksums.ts +23 -4
  330. package/src/scripts/check_augment_description_cap.ts +23 -4
  331. package/src/scripts/check_augmentignore.ts +23 -4
  332. package/src/scripts/check_beta_review_markers.ts +23 -4
  333. package/src/scripts/check_cluster_patterns.ts +23 -4
  334. package/src/scripts/check_command_count_messaging.ts +23 -4
  335. package/src/scripts/check_comparison.ts +23 -1
  336. package/src/scripts/check_condensation.ts +24 -3
  337. package/src/scripts/check_condensed_paths.ts +23 -2
  338. package/src/scripts/check_context_paths.ts +23 -4
  339. package/src/scripts/check_council_config_location.ts +23 -4
  340. package/src/scripts/check_council_layout.ts +23 -4
  341. package/src/scripts/check_council_references.ts +23 -4
  342. package/src/scripts/check_discovery_determinism.ts +24 -4
  343. package/src/scripts/check_gate_paths.ts +23 -4
  344. package/src/scripts/check_generated_artefact_headers.ts +23 -4
  345. package/src/scripts/check_generator_output_coverage.ts +23 -4
  346. package/src/scripts/check_gitignore_freshness.ts +23 -4
  347. package/src/scripts/check_iron_law_prominence.ts +23 -4
  348. package/src/scripts/check_kernel_prefix_stability.ts +0 -0
  349. package/src/scripts/check_kernel_rule_bundle.ts +23 -4
  350. package/src/scripts/check_knowledge_cards.ts +23 -1
  351. package/src/scripts/check_md_language.ts +23 -4
  352. package/src/scripts/check_media_deps.ts +24 -1
  353. package/src/scripts/check_memory.ts +24 -2
  354. package/src/scripts/check_memory_proposal.ts +23 -4
  355. package/src/scripts/check_module_management_neutral.ts +23 -4
  356. package/src/scripts/check_no_conflict_markers.ts +23 -4
  357. package/src/scripts/check_no_external_sources.ts +23 -4
  358. package/src/scripts/check_no_local_settings_committed.ts +24 -4
  359. package/src/scripts/check_no_new_legacy_path.ts +23 -4
  360. package/src/scripts/check_no_roadmap_refs.ts +23 -4
  361. package/src/scripts/check_one_off_location.ts +23 -4
  362. package/src/scripts/check_overlay_cascade_subdirs.ts +23 -4
  363. package/src/scripts/check_portability.ts +24 -3
  364. package/src/scripts/check_proposal.ts +0 -0
  365. package/src/scripts/check_public_catalog_links.ts +23 -4
  366. package/src/scripts/check_public_links.ts +23 -4
  367. package/src/scripts/check_quality_regression.ts +23 -2
  368. package/src/scripts/check_references.ts +23 -4
  369. package/src/scripts/check_release_includes_discovery.ts +23 -4
  370. package/src/scripts/check_release_pr_shape.ts +23 -4
  371. package/src/scripts/check_release_published.ts +23 -4
  372. package/src/scripts/check_release_trunk_sync.ts +23 -4
  373. package/src/scripts/check_reply_consistency.ts +23 -4
  374. package/src/scripts/check_roadmap_trackable.ts +23 -4
  375. package/src/scripts/check_role_doc_links.ts +23 -4
  376. package/src/scripts/check_safety_floor_untouched.ts +24 -4
  377. package/src/scripts/check_site_links.ts +23 -1
  378. package/src/scripts/check_skill_gaps.ts +23 -1
  379. package/src/scripts/check_skill_requires.ts +23 -4
  380. package/src/scripts/check_structural_breaking.ts +24 -4
  381. package/src/scripts/check_surface_tiers.ts +23 -4
  382. package/src/scripts/check_template_pin_drift.ts +23 -4
  383. package/src/scripts/check_test_coverage_diff.ts +23 -4
  384. package/src/scripts/check_token_optimizer_freshness.ts +23 -4
  385. package/src/scripts/check_token_quality_golden.ts +23 -2
  386. package/src/scripts/check_token_regression.ts +23 -2
  387. package/src/scripts/check_tracked_but_ignored.ts +24 -4
  388. package/src/scripts/check_trigger_evals.ts +23 -4
  389. package/src/scripts/check_trunk_drift.ts +24 -1
  390. package/src/scripts/check_update_banner.ts +23 -4
  391. package/src/scripts/ci_summary.ts +23 -4
  392. package/src/scripts/ci_time_ratio.ts +23 -4
  393. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  394. package/src/scripts/compile_router.ts +23 -4
  395. package/src/scripts/condense.ts +30 -31
  396. package/src/scripts/condense_memory.ts +24 -2
  397. package/src/scripts/config/packs.ts +24 -4
  398. package/src/scripts/config/session_profiles.ts +23 -4
  399. package/src/scripts/context_hygiene_hook.ts +24 -3
  400. package/src/scripts/cost_by_conversation.ts +23 -4
  401. package/src/scripts/cost_summary.ts +23 -4
  402. package/src/scripts/council_cli.ts +35 -7
  403. package/src/scripts/council_prune.ts +25 -2
  404. package/src/scripts/cross_repo_retrieve.ts +23 -4
  405. package/src/scripts/discovery_stats.ts +23 -4
  406. package/src/scripts/evidence_report.ts +23 -1
  407. package/src/scripts/export_replay_corpus.ts +23 -2
  408. package/src/scripts/extract_audit_patterns.ts +23 -1
  409. package/src/scripts/first_run_gate_hook.ts +24 -3
  410. package/src/scripts/gen_discovery_baseline.ts +23 -4
  411. package/src/scripts/generate_capabilities_index.ts +24 -5
  412. package/src/scripts/generate_capability_matrix.ts +23 -4
  413. package/src/scripts/generate_catalog.ts +23 -1
  414. package/src/scripts/generate_command_flows.ts +23 -4
  415. package/src/scripts/generate_cookbook.ts +23 -4
  416. package/src/scripts/generate_index.ts +23 -4
  417. package/src/scripts/generate_ownership_matrix.ts +23 -1
  418. package/src/scripts/generate_pack_manifests.ts +24 -5
  419. package/src/scripts/generate_role_experiences_catalog.ts +23 -4
  420. package/src/scripts/hooks/block_no_verify.ts +23 -4
  421. package/src/scripts/hooks/design_slop_hook.ts +24 -3
  422. package/src/scripts/hooks/dispatch_hook.ts +47 -14
  423. package/src/scripts/hooks/replay_hook.ts +23 -2
  424. package/src/scripts/hooks/rtk_wrap_hook.ts +24 -5
  425. package/src/scripts/hooks_doctor.ts +23 -2
  426. package/src/scripts/hooks_status.ts +23 -2
  427. package/src/scripts/injection_scan_hook.ts +24 -5
  428. package/src/scripts/install +23 -4
  429. package/src/scripts/install.ts +102 -44
  430. package/src/scripts/inventory_abstraction_budget.ts +23 -1
  431. package/src/scripts/inventory_frontmatter.ts +23 -1
  432. package/src/scripts/inventory_meta_layers.ts +23 -1
  433. package/src/scripts/iron_law_sha.ts +23 -4
  434. package/src/scripts/janitor.ts +23 -4
  435. package/src/scripts/knowledge_global_cli.ts +24 -2
  436. package/src/scripts/linked_projects_list.ts +23 -4
  437. package/src/scripts/lint_agent_security.ts +23 -4
  438. package/src/scripts/lint_agent_skill_names.ts +23 -4
  439. package/src/scripts/lint_agents_layout.ts +23 -4
  440. package/src/scripts/lint_agents_md.ts +23 -4
  441. package/src/scripts/lint_archived_skills.ts +23 -4
  442. package/src/scripts/lint_artefact_frontmatter.ts +23 -4
  443. package/src/scripts/lint_bench_ab.ts +23 -4
  444. package/src/scripts/lint_bench_corpus.ts +23 -2
  445. package/src/scripts/lint_command_flow_coverage.ts +23 -4
  446. package/src/scripts/lint_command_routing.ts +23 -4
  447. package/src/scripts/lint_command_tiers.ts +23 -2
  448. package/src/scripts/lint_command_verbs.ts +23 -4
  449. package/src/scripts/lint_commit_subjects.ts +24 -4
  450. package/src/scripts/lint_confusables.ts +25 -5
  451. package/src/scripts/lint_context_spine_usage.ts +23 -4
  452. package/src/scripts/lint_discovery_manifest.ts +23 -4
  453. package/src/scripts/lint_discovery_vocabulary.ts +23 -4
  454. package/src/scripts/lint_empty_roadmaps.ts +23 -4
  455. package/src/scripts/lint_eval_freshness.ts +23 -4
  456. package/src/scripts/lint_examples.ts +23 -4
  457. package/src/scripts/lint_explain_trace.ts +23 -4
  458. package/src/scripts/lint_featured_skills.ts +0 -0
  459. package/src/scripts/lint_flows.ts +23 -4
  460. package/src/scripts/lint_framework_leakage.ts +23 -4
  461. package/src/scripts/lint_frontmatter_boilerplate.ts +23 -4
  462. package/src/scripts/lint_ghostwriter_source.ts +23 -4
  463. package/src/scripts/lint_glama_drift.ts +75 -0
  464. package/src/scripts/lint_global_paths.ts +23 -2
  465. package/src/scripts/lint_handoffs.ts +23 -4
  466. package/src/scripts/lint_hidden_unicode.ts +24 -5
  467. package/src/scripts/lint_hook_concern_budget.ts +23 -4
  468. package/src/scripts/lint_hook_manifest.ts +23 -2
  469. package/src/scripts/lint_instruction_smuggling.ts +25 -5
  470. package/src/scripts/lint_legal_pack.ts +23 -1
  471. package/src/scripts/lint_load_context.ts +23 -4
  472. package/src/scripts/lint_marketplace.ts +24 -3
  473. package/src/scripts/lint_marketplace_install_completeness.ts +23 -4
  474. package/src/scripts/lint_mcp_config_security.ts +25 -5
  475. package/src/scripts/lint_mcp_registry_manifest.ts +23 -4
  476. package/src/scripts/lint_media_policy_linkage.ts +23 -4
  477. package/src/scripts/lint_missions.ts +23 -4
  478. package/src/scripts/lint_model_tier_coverage.ts +23 -4
  479. package/src/scripts/lint_namespace.ts +23 -4
  480. package/src/scripts/lint_namespace_collisions.ts +23 -4
  481. package/src/scripts/lint_new_skill_gate.ts +23 -4
  482. package/src/scripts/lint_no_new_atomic_commands.ts +23 -4
  483. package/src/scripts/lint_one_off_age.ts +23 -4
  484. package/src/scripts/lint_orchestration_dsl.ts +23 -4
  485. package/src/scripts/lint_orchestrator_auto_detect.ts +23 -4
  486. package/src/scripts/lint_pack_boundaries.ts +23 -4
  487. package/src/scripts/lint_pack_dependencies.ts +23 -2
  488. package/src/scripts/lint_pack_first_win.ts +23 -4
  489. package/src/scripts/lint_pack_risk_class.ts +23 -1
  490. package/src/scripts/lint_persona_governance.ts +23 -4
  491. package/src/scripts/lint_positioning.ts +23 -4
  492. package/src/scripts/lint_profile_overlay_set_only.ts +23 -4
  493. package/src/scripts/lint_readme_jargon.ts +23 -4
  494. package/src/scripts/lint_readme_size.ts +23 -4
  495. package/src/scripts/lint_regression.ts +23 -4
  496. package/src/scripts/lint_roadmap_blockers.ts +23 -4
  497. package/src/scripts/lint_roadmap_ci_steps.ts +23 -4
  498. package/src/scripts/lint_roadmap_complexity.ts +23 -4
  499. package/src/scripts/lint_roadmap_later_disposition.ts +23 -4
  500. package/src/scripts/lint_role_experiences.ts +23 -4
  501. package/src/scripts/lint_rule_interactions.ts +23 -4
  502. package/src/scripts/lint_rule_tiers.ts +24 -3
  503. package/src/scripts/lint_showcase_sessions.ts +23 -4
  504. package/src/scripts/lint_skill_frontmatter_safety.ts +25 -5
  505. package/src/scripts/lint_skill_originality.ts +23 -4
  506. package/src/scripts/lint_skill_tools.ts +23 -4
  507. package/src/scripts/lint_subagent_determinism.ts +23 -4
  508. package/src/scripts/lint_ticket_buildable.ts +23 -4
  509. package/src/scripts/lint_topics_yaml.ts +23 -4
  510. package/src/scripts/lint_trust_coherence.ts +23 -4
  511. package/src/scripts/lint_value_dashboard.ts +23 -4
  512. package/src/scripts/lint_workflow_security.ts +23 -4
  513. package/src/scripts/lint_workspace_boundary.ts +23 -4
  514. package/src/scripts/mcp_exec/safety_envelope.ts +105 -0
  515. package/src/scripts/mcp_parity_smoke.ts +23 -2
  516. package/src/scripts/mcp_registry_submit.sh +14 -3
  517. package/src/scripts/mcp_render.ts +23 -4
  518. package/src/scripts/mcp_server/__main__.ts +6 -8
  519. package/src/scripts/mcp_server/consumer_tool_catalog.json +78 -3
  520. package/src/scripts/mcp_server/tools.ts +731 -0
  521. package/src/scripts/mcp_telemetry_health.ts +23 -4
  522. package/src/scripts/mcp_telemetry_query.ts +23 -4
  523. package/src/scripts/mcp_telemetry_store.ts +23 -4
  524. package/src/scripts/measure_augment_budget.ts +23 -1
  525. package/src/scripts/measure_density.ts +23 -1
  526. package/src/scripts/measure_frugality_savings.ts +23 -1
  527. package/src/scripts/measure_markitdown_lift.ts +23 -1
  528. package/src/scripts/measure_patterns.ts +23 -1
  529. package/src/scripts/measure_projection_bytes.ts +23 -1
  530. package/src/scripts/measure_rule_budget.ts +23 -4
  531. package/src/scripts/measure_skill_reduction.ts +23 -1
  532. package/src/scripts/memory_hash.ts +24 -2
  533. package/src/scripts/memory_lookup.ts +24 -2
  534. package/src/scripts/memory_report.ts +24 -2
  535. package/src/scripts/memory_signal.ts +24 -2
  536. package/src/scripts/memory_status.ts +26 -2
  537. package/src/scripts/migrate_command_suggestions.ts +23 -4
  538. package/src/scripts/migrate_frontmatter_defaults.ts +23 -4
  539. package/src/scripts/migration_status.ts +25 -4
  540. package/src/scripts/mine_missing_guardrails.ts +23 -1
  541. package/src/scripts/mine_session.ts +23 -1
  542. package/src/scripts/minimal_safe_diff_hook.ts +24 -3
  543. package/src/scripts/new_skill.ts +23 -3
  544. package/src/scripts/onboarding_gate_hook.ts +24 -3
  545. package/src/scripts/parity/coverage_diff.ts +25 -3
  546. package/src/scripts/parity/phase_gate.ts +25 -4
  547. package/src/scripts/parity/replay.ts +25 -3
  548. package/src/scripts/pattern_share.ts +23 -4
  549. package/src/scripts/plan_physical_move.ts +23 -4
  550. package/src/scripts/prediction-pool/poisson_sim.ts +24 -3
  551. package/src/scripts/prediction-pool/pool_winsim.ts +24 -3
  552. package/src/scripts/prediction-pool/score_ev.ts +24 -3
  553. package/src/scripts/print_required_checks.ts +24 -4
  554. package/src/scripts/probe_host_compliance.ts +23 -2
  555. package/src/scripts/probe_projection_fidelity.ts +23 -1
  556. package/src/scripts/probe_skill_registration.ts +24 -2
  557. package/src/scripts/profile_staleness_hook.ts +24 -3
  558. package/src/scripts/profile_use.ts +23 -4
  559. package/src/scripts/project_thin_rules.ts +23 -3
  560. package/src/scripts/propose_modules_config.ts +23 -4
  561. package/src/scripts/prototype_lint_contradictions.ts +23 -1
  562. package/src/scripts/prove_pack_extractable.ts +23 -4
  563. package/src/scripts/readme_linter.ts +23 -3
  564. package/src/scripts/redact_hook_capture.ts +23 -4
  565. package/src/scripts/refine_ticket_detect.ts +23 -4
  566. package/src/scripts/release.ts +226 -43
  567. package/src/scripts/render_benchmark_composite.ts +23 -4
  568. package/src/scripts/render_benchmark_md.ts +23 -4
  569. package/src/scripts/roadmap_progress_hook.ts +46 -16
  570. package/src/scripts/run_skill_evals.ts +23 -4
  571. package/src/scripts/runtime_dispatcher.ts +23 -4
  572. package/src/scripts/runtime_registry.ts +23 -4
  573. package/src/scripts/score_skill_selection.ts +23 -1
  574. package/src/scripts/security_audit_config.ts +24 -5
  575. package/src/scripts/skill_collision_clusters.ts +23 -4
  576. package/src/scripts/skill_discovery.ts +23 -4
  577. package/src/scripts/skill_linter.ts +23 -2
  578. package/src/scripts/skill_preview.ts +23 -4
  579. package/src/scripts/skill_tools/audit_persona_coverage.ts +23 -1
  580. package/src/scripts/skill_tools/audit_user_type_coverage.ts +23 -1
  581. package/src/scripts/skill_tools/run_block_d_eval.ts +23 -1
  582. package/src/scripts/skill_tools/score_skill_relevance.ts +23 -1
  583. package/src/scripts/skill_tools/suggest_skill_for_task.ts +24 -1
  584. package/src/scripts/skill_usage_collect.ts +23 -4
  585. package/src/scripts/smoke_path_resolution.ts +23 -4
  586. package/src/scripts/smoke_quickstart.ts +23 -4
  587. package/src/scripts/snapshot_agent_outputs.ts +23 -4
  588. package/src/scripts/spotcheck_thin_root.ts +23 -4
  589. package/src/scripts/sync_agent_settings.ts +23 -4
  590. package/src/scripts/sync_github_metadata.ts +23 -4
  591. package/src/scripts/sync_gitignore.ts +23 -4
  592. package/src/scripts/telegraph_stats.ts +23 -4
  593. package/src/scripts/tool_registry.ts +24 -4
  594. package/src/scripts/trigger_coverage.ts +23 -4
  595. package/src/scripts/update_counts.ts +23 -4
  596. package/src/scripts/update_prices.ts +23 -1
  597. package/src/scripts/validate_agent_settings.ts +23 -4
  598. package/src/scripts/validate_decision_engine.ts +23 -4
  599. package/src/scripts/validate_discovery_manifest.ts +23 -4
  600. package/src/scripts/validate_frontmatter.ts +23 -2
  601. package/src/scripts/validate_pack_yaml.ts +0 -0
  602. package/src/scripts/validate_safe_paths.ts +24 -4
  603. package/src/scripts/validate_telegraph_carveouts.ts +23 -4
  604. package/src/scripts/verify_before_complete_hook.ts +24 -3
  605. package/src/scripts/verify_physical_move.ts +23 -4
  606. package/src/scripts/wrapper_freshness_hook.ts +107 -8
  607. package/tests/fixtures/hooks/README.md +92 -0
  608. package/tests/fixtures/hooks/agent_error.json +7 -0
  609. package/tests/fixtures/hooks/post_tool_use.json +13 -0
  610. package/tests/fixtures/hooks/pre_compact.json +7 -0
  611. package/tests/fixtures/hooks/pre_tool_use.json +9 -0
  612. package/tests/fixtures/hooks/session_end.json +6 -0
  613. package/tests/fixtures/hooks/session_start.json +6 -0
  614. package/tests/fixtures/hooks/stop.json +6 -0
  615. package/tests/fixtures/hooks/user_prompt_submit.json +7 -0
@@ -32,6 +32,7 @@
32
32
  // CATALOG_STUBS, STUB_NAMES, REGISTRY, ToolCache, boot_log_line.
33
33
  import * as fs from 'node:fs';
34
34
  import * as path from 'node:path';
35
+ import { fileURLToPath } from 'node:url';
35
36
 
36
37
  import {
37
38
  SCHEMA_VERSION as _CH_SCHEMA_VERSION,
@@ -451,6 +452,532 @@ async function _memoryStatusHandler(
451
452
  return result as unknown as Record<string, unknown>;
452
453
  }
453
454
 
455
+ // ---------------------------------------------------------------------
456
+ // Phase 4 handlers — council-approved write/exec cut (2026-07-07 verdict,
457
+ // `agents/decisions/mcp-write-exec-cut-2026-07-07.md`). Every handler
458
+ // lazy-imports its library implementation so the module-load import
459
+ // surface stays clean (no child_process / network client reaches this
460
+ // module's own imports; A0 `docs/contracts/mcp-phase-1-scope.md`).
461
+ // ---------------------------------------------------------------------
462
+
463
+ /** Package root — three levels above `src/scripts/mcp_server/`. */
464
+ const _PACKAGE_ROOT = path.resolve(
465
+ path.dirname(fileURLToPath(import.meta.url)),
466
+ '..',
467
+ '..',
468
+ '..',
469
+ );
470
+
471
+ /** Validate a required non-empty string argument. */
472
+ function _requireString(args: Record<string, unknown>, key: string): string {
473
+ const value = args[key];
474
+ if (typeof value !== 'string' || !_strip(value)) {
475
+ throw new Error(`'${key}' must be a non-empty string`);
476
+ }
477
+ return value;
478
+ }
479
+
480
+ /** Run `fn` with CWD switched to `consumerRoot`, always restoring. */
481
+ async function _withChdir<T>(consumerRoot: string, fn: () => T | Promise<T>): Promise<T> {
482
+ const prevCwd = process.cwd();
483
+ try {
484
+ process.chdir(consumerRoot);
485
+ return await fn();
486
+ } finally {
487
+ process.chdir(prevCwd);
488
+ }
489
+ }
490
+
491
+ /**
492
+ * Phase 4 — record one engineering-memory signal via
493
+ * `agent-src/templates/scripts/memory_signal.emit`.
494
+ *
495
+ * fs-write: appends to `agents/memory/intake/signals-YYYY-MM.jsonl`
496
+ * under the consumer root (the module resolves its intake dir relative
497
+ * to CWD — chdir-window scoped). Rate-limited per `(type, path)` inside
498
+ * `emit`; a rate-limited duplicate returns `recorded: false` instead of
499
+ * erroring, mirroring the CLI's silent-skip contract.
500
+ */
501
+ async function _memorySignalHandler(
502
+ args: Record<string, unknown>,
503
+ consumerRoot: string,
504
+ ): Promise<Record<string, unknown>> {
505
+ const entryType = _requireString(args, 'type');
506
+ const anchorPath = _requireString(args, 'path');
507
+ const body = _requireString(args, 'body');
508
+
509
+ const memorySignal = await import(
510
+ '../../agent-src/templates/scripts/memory_signal.js'
511
+ );
512
+ const record = await _withChdir(consumerRoot, () =>
513
+ memorySignal.emit(entryType, anchorPath, body),
514
+ );
515
+ if (record === null) {
516
+ return {
517
+ recorded: false,
518
+ skipped: true,
519
+ reason:
520
+ `already emitted within the ` +
521
+ `${memorySignal.RATE_LIMIT_WINDOW_DAYS}d rate-limit window`,
522
+ entry_type: entryType,
523
+ path: anchorPath,
524
+ };
525
+ }
526
+ return { recorded: true, signal: record };
527
+ }
528
+
529
+ /**
530
+ * Phase 4 — regenerate `agents/roadmaps-progress.md`.
531
+ *
532
+ * Calls `update_roadmap_progress`'s exported building blocks (`collect`,
533
+ * `render`, `collect_bundles`) directly instead of `main()` so nothing
534
+ * prints and no git fallback spawns. `dry_run: true` computes the counts
535
+ * without writing.
536
+ */
537
+ async function _roadmapProgressHandler(
538
+ args: Record<string, unknown>,
539
+ consumerRoot: string,
540
+ ): Promise<Record<string, unknown>> {
541
+ const dryRun = _pyTruthy(args.dry_run ?? false);
542
+ const root = _resolvePath(consumerRoot);
543
+ const roadmapRoot = path.join(root, 'agents', 'roadmaps');
544
+ const target = path.join(root, 'agents', 'roadmaps-progress.md');
545
+
546
+ const urp = await import('../../agent-src/scripts/update_roadmap_progress.js');
547
+ if (!fs.existsSync(roadmapRoot)) {
548
+ return {
549
+ written: false,
550
+ path: target,
551
+ roadmaps: 0,
552
+ steps_done: 0,
553
+ steps_total: 0,
554
+ note: `no roadmaps directory at ${roadmapRoot}`,
555
+ };
556
+ }
557
+ const roadmaps = urp.collect(roadmapRoot);
558
+ const content = urp.render(roadmaps, urp.collect_bundles(root));
559
+ const stepsDone = roadmaps.reduce((s, r) => s + r.done, 0);
560
+ const stepsTotal = roadmaps.reduce((s, r) => s + r.total_active, 0);
561
+ if (!dryRun) {
562
+ fs.writeFileSync(target, content, 'utf-8');
563
+ }
564
+ return {
565
+ written: !dryRun,
566
+ path: target,
567
+ roadmaps: roadmaps.length,
568
+ steps_done: stepsDone,
569
+ steps_total: stepsTotal,
570
+ };
571
+ }
572
+
573
+ /**
574
+ * Phase 4 — the PR-gate archival sweep (`archive_completed_roadmaps`).
575
+ *
576
+ * Mutates the git index (`git mv` + `git add` of migrated refs) but
577
+ * never commits or pushes. The library implementation shells out to git
578
+ * internally — an accepted transitive effect per the 2026-07-07 council
579
+ * verdict; this module itself imports no child_process (the A0 ban
580
+ * covers `scripts/mcp_server/*` module imports). The dashboard regen
581
+ * runs in-process afterwards (mirroring the CLI's `_regen_dashboard`
582
+ * without its tsx re-spawn); the regenerated dashboard is written but
583
+ * not staged.
584
+ */
585
+ async function _roadmapArchiveHandler(
586
+ _args: Record<string, unknown>,
587
+ consumerRoot: string,
588
+ ): Promise<Record<string, unknown>> {
589
+ const root = _resolvePath(consumerRoot);
590
+ const { archive_completed } = await import(
591
+ '../../agent-src/scripts/archive_completed_roadmaps.js'
592
+ );
593
+ const archived = archive_completed(root, {
594
+ changed_only: true,
595
+ base: 'origin/main',
596
+ dry_run: false,
597
+ });
598
+ let dashboardRegenerated = false;
599
+ if (archived.length > 0) {
600
+ const urp = await import(
601
+ '../../agent-src/scripts/update_roadmap_progress.js'
602
+ );
603
+ const roadmapRoot = path.join(root, 'agents', 'roadmaps');
604
+ if (fs.existsSync(roadmapRoot)) {
605
+ const roadmaps = urp.collect(roadmapRoot);
606
+ fs.writeFileSync(
607
+ path.join(root, 'agents', 'roadmaps-progress.md'),
608
+ urp.render(roadmaps, urp.collect_bundles(root)),
609
+ 'utf-8',
610
+ );
611
+ dashboardRegenerated = true;
612
+ }
613
+ }
614
+ return {
615
+ archived: archived as unknown as Record<string, unknown>[],
616
+ count: archived.length,
617
+ dashboard_regenerated: dashboardRegenerated,
618
+ };
619
+ }
620
+
621
+ /**
622
+ * Phase 4 — regenerate (or drift-check) `CAPABILITIES.yaml`.
623
+ *
624
+ * `generate_capabilities_index.build()` derives everything from the
625
+ * package tree (its module-anchored root); the canonical output path is
626
+ * `<package root>/CAPABILITIES.yaml` (mirroring the module's `main()`).
627
+ * `check: true` compares without writing. A write is refused when the
628
+ * canonical output path is not under the consumer root (A0 in-tree
629
+ * write scoping).
630
+ */
631
+ async function _capabilitiesIndexHandler(
632
+ args: Record<string, unknown>,
633
+ consumerRoot: string,
634
+ ): Promise<Record<string, unknown>> {
635
+ const check = _pyTruthy(args.check ?? false);
636
+ const cap = await import('../generate_capabilities_index.js');
637
+ const out = path.join(_PACKAGE_ROOT, 'CAPABILITIES.yaml');
638
+ const content = cap.build();
639
+ const onDisk = fs.existsSync(out) ? fs.readFileSync(out, 'utf-8') : '';
640
+ const drift = onDisk !== content;
641
+ if (check) {
642
+ return { check: true, written: false, drift, path: out };
643
+ }
644
+ const root = _resolvePath(consumerRoot);
645
+ if (_relativeUnder(_resolvePath(out), root) === null) {
646
+ throw new Error(
647
+ `CAPABILITIES.yaml path escapes consumer_root: ${out} not under ${root}`,
648
+ );
649
+ }
650
+ fs.writeFileSync(out, content, 'utf-8');
651
+ return { check: false, written: true, drift, path: out };
652
+ }
653
+
654
+ /**
655
+ * Shared doctor leg — resolve the project root, load the manifest, and
656
+ * compute the drift groups + health checks the way `cmd_doctor.main()`
657
+ * does on its default (non-CI) path, without emitting to stdout and
658
+ * without `process.exit`.
659
+ */
660
+ async function _runDoctorLeg(consumerRoot: string): Promise<{
661
+ project_root: string;
662
+ origin: string;
663
+ drift: Record<string, Record<string, unknown>[]>;
664
+ checks: Record<string, unknown>[];
665
+ }> {
666
+ const doctor = await import('../_cli/cmd_doctor.js');
667
+ const installedTools = await import('../_lib/installed_tools.js');
668
+ const root = _resolvePath(consumerRoot);
669
+ return _withChdir(root, () => {
670
+ const [projectRoot, origin] = doctor._resolve_project_root(root);
671
+ const manifest = installedTools.read_manifest(
672
+ installedTools.manifest_path(projectRoot),
673
+ );
674
+ let missing: Record<string, unknown>[] = [];
675
+ let modified: Record<string, unknown>[] = [];
676
+ let foreign: Record<string, unknown>[] = [];
677
+ let tagDrift: Record<string, unknown>[] = [];
678
+ let checks: Record<string, unknown>[];
679
+ if (manifest === null) {
680
+ const bridgePresent = fs.existsSync(
681
+ path.join(projectRoot, doctor.BRIDGE_MARKER_RELATIVE),
682
+ );
683
+ checks = doctor._run_checks_no_manifest(projectRoot, bridgePresent, null);
684
+ } else {
685
+ const [records, known] = doctor._collect_manifest_entries(projectRoot, manifest);
686
+ [missing, modified, tagDrift] = doctor._classify(records);
687
+ foreign = doctor._foreign_records(
688
+ projectRoot,
689
+ doctor._scan_foreign(projectRoot, manifest, known),
690
+ );
691
+ checks = doctor._run_checks(
692
+ projectRoot,
693
+ manifest,
694
+ { missing, modified, foreign, tag_drift: tagDrift },
695
+ null,
696
+ );
697
+ }
698
+ return {
699
+ project_root: projectRoot,
700
+ origin,
701
+ drift: { missing, modified, foreign, tag_drift: tagDrift },
702
+ checks,
703
+ };
704
+ });
705
+ }
706
+
707
+ /**
708
+ * Phase 4 — structured doctor report (read-only).
709
+ *
710
+ * Mirrors the `_emit_json` payload of `cmd_doctor` (drift groups +
711
+ * checks + project-root origin) assembled in-process — no stdout, no
712
+ * `process.exit`.
713
+ */
714
+ async function _doctorReportHandler(
715
+ _args: Record<string, unknown>,
716
+ consumerRoot: string,
717
+ ): Promise<Record<string, unknown>> {
718
+ const leg = await _runDoctorLeg(consumerRoot);
719
+ const failCheck = leg.checks.some((c) => c.status === 'fail');
720
+ const driftCount =
721
+ leg.drift.missing!.length +
722
+ leg.drift.modified!.length +
723
+ leg.drift.foreign!.length +
724
+ leg.drift.tag_drift!.length;
725
+ return {
726
+ project_root: leg.project_root,
727
+ project_root_origin: leg.origin,
728
+ missing: leg.drift.missing,
729
+ modified: leg.drift.modified,
730
+ foreign: leg.drift.foreign,
731
+ tag_drift: leg.drift.tag_drift,
732
+ checks: leg.checks,
733
+ status: failCheck || driftCount > 0 ? 'fail' : 'ok',
734
+ };
735
+ }
736
+
737
+ /**
738
+ * Phase 4 — consumer conformance contract (read-only).
739
+ *
740
+ * Two legs, mirroring `cmd_conformance.main()`: the doctor `--ci`
741
+ * contract in-process, plus the five conformance checks
742
+ * (`runConformanceChecks`). The CLI's JSONL report append to the
743
+ * user-global `~/.event4u/...` log is intentionally skipped — the A0
744
+ * contract scopes writes to the consumer root and this tool is
745
+ * catalogued read-only.
746
+ */
747
+ async function _conformanceCheckHandler(
748
+ _args: Record<string, unknown>,
749
+ consumerRoot: string,
750
+ ): Promise<Record<string, unknown>> {
751
+ const conformance = await import('../_cli/cmd_conformance.js');
752
+ const leg = await _runDoctorLeg(consumerRoot);
753
+ const conformanceChecks = await _withChdir(leg.project_root, () =>
754
+ conformance.runConformanceChecks({ projectRoot: leg.project_root }),
755
+ );
756
+ const checks = [...leg.checks, ...conformanceChecks];
757
+ const driftCount =
758
+ leg.drift.missing!.length +
759
+ leg.drift.modified!.length +
760
+ leg.drift.foreign!.length +
761
+ leg.drift.tag_drift!.length;
762
+ const failed = checks.some((c) => c.status === 'fail') || driftCount > 0;
763
+ return {
764
+ project_root: leg.project_root,
765
+ drift: leg.drift,
766
+ doctor_checks: leg.checks,
767
+ conformance_checks: conformanceChecks,
768
+ checks,
769
+ pass: !failed,
770
+ status: failed ? 'fail' : 'ok',
771
+ };
772
+ }
773
+
774
+ /**
775
+ * Phase 4 — artefact-engagement telemetry report (read-only).
776
+ *
777
+ * Calls the report-building functions (`read_settings` → `aggregate` →
778
+ * `render_json`) directly — the same pipeline `telemetry_report.main()`
779
+ * runs for `--format json` — and returns the parsed payload. A missing
780
+ * or disabled log yields the empty-but-valid report.
781
+ */
782
+ async function _telemetryReportHandler(
783
+ args: Record<string, unknown>,
784
+ consumerRoot: string,
785
+ ): Promise<Record<string, unknown>> {
786
+ const windowRaw = args.window_days ?? 30;
787
+ if (
788
+ typeof windowRaw !== 'number' ||
789
+ !Number.isInteger(windowRaw) ||
790
+ typeof windowRaw === 'boolean' ||
791
+ windowRaw < 1
792
+ ) {
793
+ throw new Error("'window_days' must be a positive integer");
794
+ }
795
+ const { read_settings } = await import(
796
+ '../../agent-src/templates/scripts/telemetry/settings.js'
797
+ );
798
+ const { aggregate } = await import(
799
+ '../../agent-src/templates/scripts/telemetry/aggregator.js'
800
+ );
801
+ const { render_json } = await import(
802
+ '../../agent-src/templates/scripts/telemetry/report_renderer.js'
803
+ );
804
+ const rendered = await _withChdir(consumerRoot, () => {
805
+ const settings = read_settings('.agent-settings.yml');
806
+ const cutoff = Date.now() - windowRaw * 86_400_000;
807
+ const result = aggregate(settings.log_path, { since: cutoff });
808
+ return render_json(result, { top: 20, since_label: `last ${windowRaw}d` });
809
+ });
810
+ return JSON.parse(rendered) as Record<string, unknown>;
811
+ }
812
+
813
+ /**
814
+ * Phase 4 — pre-spend council cost estimate (read-only, NO network).
815
+ *
816
+ * Mirrors the `council:estimate` CLI wiring: settings via
817
+ * `council_cli.load_settings` (user-global-first council config),
818
+ * members via `build_members`, local price table via
819
+ * `load_prices(prices_file_for(root))` (bootstraps the gitignored
820
+ * in-tree `agents/runtime/.agent-prices.md` cache when absent — same as
821
+ * the CLI), then `estimate_debate_cost` — pure pricing math, no HTTP.
822
+ */
823
+ async function _councilEstimateHandler(
824
+ args: Record<string, unknown>,
825
+ consumerRoot: string,
826
+ ): Promise<Record<string, unknown>> {
827
+ const inputRaw = _requireString(args, 'input_path');
828
+ const depth = args.depth ?? null;
829
+ if (depth !== null && depth !== 'shallow' && depth !== 'deep') {
830
+ throw new Error("'depth' must be 'shallow' or 'deep' when provided");
831
+ }
832
+ const root = _resolvePath(consumerRoot);
833
+ const target = path.isAbsolute(inputRaw)
834
+ ? _resolvePath(inputRaw)
835
+ : _resolvePath(path.join(root, inputRaw));
836
+ if (_relativeUnder(target, root) === null) {
837
+ throw new Error(`path escapes consumer_root: ${target}`);
838
+ }
839
+ if (!fs.existsSync(target)) {
840
+ throw new Error(`input_path not found: ${target}`);
841
+ }
842
+
843
+ const cli = await import('../council_cli.js');
844
+ const orchestrator = await import('../ai_council/orchestrator.js');
845
+ const pricing = await import('../ai_council/pricing.js');
846
+ const councilConfig = await import('../ai_council/config.js');
847
+ const clients = await import('../ai_council/clients.js');
848
+ const { project_settings_path } = await import('../_lib/agent_settings.js');
849
+ const { detect_project_context } = await import('../ai_council/project_context.js');
850
+
851
+ return _withChdir(root, () => {
852
+ const settings = cli.load_settings(project_settings_path(root), {
853
+ ai_council_path: String(councilConfig.resolve_config_path(root)),
854
+ });
855
+ const aiCfg =
856
+ settings.ai_council !== null &&
857
+ typeof settings.ai_council === 'object' &&
858
+ !Array.isArray(settings.ai_council)
859
+ ? (settings.ai_council as Record<string, unknown>)
860
+ : {};
861
+ const skipped: Record<string, unknown>[] = [];
862
+ const members = cli.build_members(settings, { skipped });
863
+ const table = pricing.load_prices(pricing.prices_file_for(root));
864
+
865
+ let maxTokens =
866
+ 'max_output_tokens' in aiCfg
867
+ ? _pyInt(aiCfg.max_output_tokens ?? 0)
868
+ : clients.DEFAULT_MAX_TOKENS;
869
+ if (maxTokens <= 0) {
870
+ maxTokens = clients.UNLIMITED_TOKENS_FALLBACK;
871
+ }
872
+ const [question] = cli.build_question({
873
+ input_path: target,
874
+ input_mode: 'prompt',
875
+ max_tokens: maxTokens,
876
+ });
877
+
878
+ const minRounds = Math.max(1, _pyInt(aiCfg.min_rounds ?? 2) || 2);
879
+ const rounds =
880
+ depth === 'deep'
881
+ ? Math.max(_pyInt(aiCfg.deep_min_rounds ?? minRounds) || minRounds, minRounds)
882
+ : minRounds;
883
+
884
+ const estimateResult = orchestrator.estimate_debate_cost(question, members, table, {
885
+ rounds,
886
+ project: detect_project_context(root),
887
+ original_ask: '',
888
+ });
889
+ return {
890
+ input_path: target,
891
+ mode: question.mode,
892
+ depth: depth ?? 'shallow',
893
+ rounds: estimateResult.rounds,
894
+ low_usd: estimateResult.low_usd,
895
+ expected_usd: estimateResult.expected_usd,
896
+ high_usd: estimateResult.high_usd,
897
+ per_member: estimateResult.per_member,
898
+ subscription_members: estimateResult.subscription_members,
899
+ skipped_members: skipped,
900
+ };
901
+ });
902
+ }
903
+
904
+ // Compiled envelope constants for the Phase 5 shell-exec pilot. Compiled
905
+ // policy, not configuration (council Decision 2, 2026-07-07 verdict) —
906
+ // changing them is a code-review event, never a settings edit.
907
+ const _RUN_TESTS_TIMEOUT_MS = 120_000;
908
+ const _RUN_TESTS_MAX_OUTPUT_BYTES = 64 * 1024;
909
+
910
+ /**
911
+ * Phase 5 — shell-exec pilot: run the consumer's vitest suite under the
912
+ * compiled safety envelope (`src/scripts/mcp_exec/safety_envelope.ts`).
913
+ *
914
+ * The ONE approved exec-tier tool from the 2026-07-07 council verdict
915
+ * (`agents/decisions/mcp-write-exec-cut-2026-07-07.md`). vitest-only by
916
+ * design: argv is a fixed array (node + the project's own vitest entry +
917
+ * literal flags) — caller strings become argv elements, never a shell
918
+ * string. The envelope module lives outside `mcp_server/`, so this module
919
+ * still imports no child_process (same accepted transitive pattern as
920
+ * `roadmap_archive`'s git effects).
921
+ */
922
+ async function _runTestsHandler(
923
+ args: Record<string, unknown>,
924
+ consumerRoot: string,
925
+ ): Promise<Record<string, unknown>> {
926
+ const root = _resolvePath(consumerRoot);
927
+
928
+ const filter = args.filter ?? null;
929
+ if (filter !== null && (typeof filter !== 'string' || !_strip(filter))) {
930
+ throw new Error("'filter' must be a non-empty string when provided");
931
+ }
932
+
933
+ const relPathRaw = args.path ?? null;
934
+ let relArg: string | null = null;
935
+ if (relPathRaw !== null) {
936
+ if (typeof relPathRaw !== 'string' || !_strip(relPathRaw)) {
937
+ throw new Error("'path' must be a non-empty string when provided");
938
+ }
939
+ const resolved = path.isAbsolute(relPathRaw)
940
+ ? _resolvePath(relPathRaw)
941
+ : _resolvePath(path.join(root, relPathRaw));
942
+ const rel = _relativeUnder(resolved, root);
943
+ if (rel === null) {
944
+ throw new Error(`path escapes consumer_root: ${resolved}`);
945
+ }
946
+ if (!fs.existsSync(resolved)) {
947
+ throw new Error(`path not found: ${resolved}`);
948
+ }
949
+ relArg = rel;
950
+ }
951
+
952
+ const vitestEntry = path.join(root, 'node_modules', 'vitest', 'vitest.mjs');
953
+ if (!fs.existsSync(vitestEntry)) {
954
+ throw new Error(
955
+ 'run_tests pilot supports vitest projects only — ' +
956
+ 'node_modules/vitest/vitest.mjs not found under consumer_root',
957
+ );
958
+ }
959
+
960
+ const { run_enveloped } = await import('../mcp_exec/safety_envelope.js');
961
+ const argv = [
962
+ process.execPath,
963
+ vitestEntry,
964
+ 'run',
965
+ ...(relArg !== null ? [relArg] : []),
966
+ ...(filter !== null ? ['--testNamePattern', filter as string] : []),
967
+ ];
968
+ const result = await run_enveloped({
969
+ argv,
970
+ cwd: root,
971
+ timeout_ms: _RUN_TESTS_TIMEOUT_MS,
972
+ max_output_bytes: _RUN_TESTS_MAX_OUTPUT_BYTES,
973
+ });
974
+ return {
975
+ runner: 'vitest',
976
+ passed: result.exit_code === 0 && !result.timed_out,
977
+ ...result,
978
+ } as Record<string, unknown>;
979
+ }
980
+
454
981
  // Module-level prompt / resource caches reused across handler calls so
455
982
  // repeated `list_*` / `read_resource_body` calls share mtime tracking.
456
983
  const _PROMPT_CACHES = new Map<string, unknown>();
@@ -830,6 +1357,210 @@ export const ALLOWLIST: Record<string, BuiltinTool> = {
830
1357
  },
831
1358
  handler: _readResourceBodyHandler,
832
1359
  },
1360
+ memory_signal: {
1361
+ name: 'memory_signal',
1362
+ description:
1363
+ 'Record an engineering-memory signal — a short, anchored ' +
1364
+ 'observation such as a recurring bug pattern or an ownership ' +
1365
+ 'note — to the monthly intake log ' +
1366
+ '`agents/memory/intake/signals-YYYY-MM.jsonl`. Use to capture ' +
1367
+ 'a learning tied to a specific file so future `memory_lookup` ' +
1368
+ 'calls surface it. Appends to the filesystem and is ' +
1369
+ 'rate-limited per `(type, path)` within a rolling window. ' +
1370
+ 'Returns the recorded signal.',
1371
+ input_schema: {
1372
+ type: 'object',
1373
+ properties: {
1374
+ type: {
1375
+ type: 'string',
1376
+ description:
1377
+ 'Memory type the signal belongs to (e.g. ' +
1378
+ 'historical-patterns, incident-learnings, ownership).',
1379
+ },
1380
+ path: {
1381
+ type: 'string',
1382
+ description: 'Repo-relative anchor path the signal is about.',
1383
+ },
1384
+ body: {
1385
+ type: 'string',
1386
+ description: 'Free-form signal body — the observation to record.',
1387
+ },
1388
+ },
1389
+ required: ['type', 'path', 'body'],
1390
+ additionalProperties: false,
1391
+ },
1392
+ handler: _memorySignalHandler,
1393
+ },
1394
+ roadmap_progress: {
1395
+ name: 'roadmap_progress',
1396
+ description:
1397
+ 'Regenerate `agents/roadmaps-progress.md` from the current ' +
1398
+ 'checkbox state of every active roadmap. Use after landing ' +
1399
+ 'roadmap work to keep the dashboard in sync without a shell ' +
1400
+ 'round-trip. Writes the dashboard file inside the project ' +
1401
+ 'tree. Set `dry_run: true` to compute counts without writing.',
1402
+ input_schema: {
1403
+ type: 'object',
1404
+ properties: {
1405
+ dry_run: {
1406
+ type: 'boolean',
1407
+ default: false,
1408
+ description:
1409
+ 'When true, return the computed dashboard without ' +
1410
+ 'writing the file.',
1411
+ },
1412
+ },
1413
+ additionalProperties: false,
1414
+ },
1415
+ handler: _roadmapProgressHandler,
1416
+ },
1417
+ roadmap_archive: {
1418
+ name: 'roadmap_archive',
1419
+ description:
1420
+ 'Archive every roadmap that has reached `count_open == 0` and ' +
1421
+ 'was touched on the current branch — `git mv` to ' +
1422
+ '`agents/roadmaps/archive/`, migrate inbound references, and ' +
1423
+ 'regenerate the dashboard. Use as the PR-gate sweep before ' +
1424
+ 'opening a pull request. Mutates the git index (moves tracked ' +
1425
+ 'files) but never commits or pushes.',
1426
+ input_schema: {
1427
+ type: 'object',
1428
+ properties: {},
1429
+ additionalProperties: false,
1430
+ },
1431
+ handler: _roadmapArchiveHandler,
1432
+ },
1433
+ capabilities_index: {
1434
+ name: 'capabilities_index',
1435
+ description:
1436
+ "Regenerate `CAPABILITIES.yaml`, the package's coverage index " +
1437
+ 'of skills, rules, commands, and guidelines. Use after adding ' +
1438
+ 'or removing an artifact to keep the index current. Pass ' +
1439
+ '`check: true` to run in read-only CI mode (fails instead of ' +
1440
+ 'writing on drift).',
1441
+ input_schema: {
1442
+ type: 'object',
1443
+ properties: {
1444
+ check: {
1445
+ type: 'boolean',
1446
+ default: false,
1447
+ description:
1448
+ 'When true, run in read-only drift-check mode ' +
1449
+ 'instead of writing the index.',
1450
+ },
1451
+ },
1452
+ additionalProperties: false,
1453
+ },
1454
+ handler: _capabilitiesIndexHandler,
1455
+ },
1456
+ doctor_report: {
1457
+ name: 'doctor_report',
1458
+ description:
1459
+ 'Run the consumer-project doctor diagnostic and return a ' +
1460
+ 'structured health report (install drift, hook wiring, ' +
1461
+ 'settings schema, discovery manifest freshness). Use to triage ' +
1462
+ 'a misbehaving install. Read-only.',
1463
+ input_schema: {
1464
+ type: 'object',
1465
+ properties: {},
1466
+ additionalProperties: false,
1467
+ },
1468
+ handler: _doctorReportHandler,
1469
+ },
1470
+ conformance_check: {
1471
+ name: 'conformance_check',
1472
+ description:
1473
+ 'Run the consumer conformance contract (`doctor --ci` plus ' +
1474
+ 'installed-and-firing checks) and return pass/fail per check. ' +
1475
+ "Use to verify a consumer project's install is fully wired " +
1476
+ 'before relying on it. Read-only.',
1477
+ input_schema: {
1478
+ type: 'object',
1479
+ properties: {},
1480
+ additionalProperties: false,
1481
+ },
1482
+ handler: _conformanceCheckHandler,
1483
+ },
1484
+ telemetry_report: {
1485
+ name: 'telemetry_report',
1486
+ description:
1487
+ 'Return the artefact-engagement telemetry report — essential ' +
1488
+ '/ useful / retirement-candidate skills and rules ranked by ' +
1489
+ 'recorded consult+apply signals over a rolling window. Use to ' +
1490
+ 'see which artifacts are actually load-bearing. Read-only. ' +
1491
+ 'No-op (empty report) when telemetry recording is disabled.',
1492
+ input_schema: {
1493
+ type: 'object',
1494
+ properties: {
1495
+ window_days: {
1496
+ type: 'integer',
1497
+ minimum: 1,
1498
+ default: 30,
1499
+ description: 'Reporting window in days. Defaults to 30.',
1500
+ },
1501
+ },
1502
+ additionalProperties: false,
1503
+ },
1504
+ handler: _telemetryReportHandler,
1505
+ },
1506
+ council_estimate: {
1507
+ name: 'council_estimate',
1508
+ description:
1509
+ 'Estimate the token cost of an AI-council debate over a given ' +
1510
+ 'input (roadmap, diff, prompt, or file set) without spending ' +
1511
+ '— no network call, no billing. Use before deciding whether ' +
1512
+ 'to authorize a real council run. Read-only.',
1513
+ input_schema: {
1514
+ type: 'object',
1515
+ properties: {
1516
+ input_path: {
1517
+ type: 'string',
1518
+ description:
1519
+ 'Path to the roadmap, diff, or file to estimate ' +
1520
+ 'council cost for.',
1521
+ },
1522
+ depth: {
1523
+ type: 'string',
1524
+ enum: ['shallow', 'deep'],
1525
+ description:
1526
+ 'Council depth tier to estimate for. Defaults to ' +
1527
+ 'the configured default depth.',
1528
+ },
1529
+ },
1530
+ required: ['input_path'],
1531
+ additionalProperties: false,
1532
+ },
1533
+ handler: _councilEstimateHandler,
1534
+ },
1535
+ run_tests: {
1536
+ name: 'run_tests',
1537
+ description:
1538
+ "Run the consumer project's vitest test suite under a " +
1539
+ 'compiled safety envelope: fixed argv (no shell ' +
1540
+ 'interpolation), 120s timeout, 64KB output cap per stream. ' +
1541
+ 'Shell-exec pilot per the 2026-07-07 council cut — vitest ' +
1542
+ 'projects only; other runners (Pest / PHPUnit, pytest, Jest) ' +
1543
+ 'return an error until a future council round approves them. ' +
1544
+ 'Pass `filter` (vitest --testNamePattern) or `path` (in-tree ' +
1545
+ 'file or directory) to narrow the run. Returns runner, ' +
1546
+ 'passed, exit_code, timed_out, truncated stdout/stderr, and ' +
1547
+ 'duration_ms.',
1548
+ input_schema: {
1549
+ type: 'object',
1550
+ properties: {
1551
+ filter: {
1552
+ type: 'string',
1553
+ description: 'Restrict to tests matching this name pattern.',
1554
+ },
1555
+ path: {
1556
+ type: 'string',
1557
+ description: 'Restrict to tests under this directory.',
1558
+ },
1559
+ },
1560
+ additionalProperties: false,
1561
+ },
1562
+ handler: _runTestsHandler,
1563
+ },
833
1564
  };
834
1565
 
835
1566
  /** Render a `BuiltinTool` as kwargs for `mcp.types.Tool`. */