@event4u/agent-config 8.4.0 → 8.5.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 (682) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +73 -0
  3. package/README.md +17 -5
  4. package/dist/agent-src/README.md +1 -1
  5. package/dist/agent-src/commands/{analyze-reference-repo.md → analyze/reference-repo.md} +3 -1
  6. package/dist/agent-src/commands/analyze.md +9 -6
  7. package/dist/agent-src/commands/{bug-fix.md → bug/fix.md} +3 -1
  8. package/dist/agent-src/commands/{bug-investigate.md → bug/investigate.md} +4 -2
  9. package/dist/agent-src/commands/bug.md +59 -0
  10. package/dist/agent-src/commands/{set-cost-profile.md → cost/profile.md} +9 -6
  11. package/dist/agent-src/commands/{cost-report.md → cost/report.md} +18 -17
  12. package/dist/agent-src/commands/cost.md +57 -0
  13. package/dist/agent-src/commands/evals/{review-changes.json → review.json} +12 -8
  14. package/dist/agent-src/commands/{quality-fix.md → fix/quality.md} +5 -2
  15. package/dist/agent-src/commands/fix.md +7 -4
  16. package/dist/agent-src/commands/optimize/project.md +250 -0
  17. package/dist/agent-src/commands/{optimize-prompt.md → optimize/prompt.md} +3 -2
  18. package/dist/agent-src/commands/optimize.md +17 -12
  19. package/dist/agent-src/commands/{package-reset.md → package/reset.md} +2 -0
  20. package/dist/agent-src/commands/{package-test.md → package/test.md} +3 -1
  21. package/dist/agent-src/commands/package.md +56 -0
  22. package/dist/agent-src/commands/{project-analyze.md → project/analyze.md} +10 -8
  23. package/dist/agent-src/commands/{project-health.md → project/health.md} +2 -0
  24. package/dist/agent-src/commands/project.md +60 -0
  25. package/dist/agent-src/commands/{review-changes.md → review/changes.md} +26 -24
  26. package/dist/agent-src/commands/{review-routing.md → review/routing.md} +21 -17
  27. package/dist/agent-src/commands/review.md +61 -0
  28. package/dist/agent-src/commands/security-audit-config.md +24 -23
  29. package/dist/agent-src/commands/{sync-agent-settings.md → sync/agent-settings.md} +11 -7
  30. package/dist/agent-src/commands/{sync-gitignore → sync/gitignore}/fix.md +36 -27
  31. package/dist/agent-src/commands/{sync-gitignore.md → sync/gitignore.md} +22 -21
  32. package/dist/agent-src/commands/sync.md +58 -0
  33. package/dist/agent-src/commands/{e2e-heal.md → tests/e2e-heal.md} +5 -2
  34. package/dist/agent-src/commands/{e2e-plan.md → tests/e2e-plan.md} +5 -2
  35. package/dist/agent-src/commands/tests.md +11 -5
  36. package/dist/agent-src/contexts/augment-infrastructure.md +3 -3
  37. package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
  38. package/dist/agent-src/contexts/skills-and-commands.md +2 -2
  39. package/dist/agent-src/rules/external-reference-deep-dive.md +1 -1
  40. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  41. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
  42. package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +1 -1
  43. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -1
  44. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +1 -1
  45. package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
  46. package/dist/agent-src/skills/judge-test-coverage/SKILL.md +1 -1
  47. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  48. package/dist/agent-src/skills/mobile-e2e-strategy/SKILL.md +5 -5
  49. package/dist/agent-src/skills/prompt-optimizer/SKILL.md +2 -2
  50. package/dist/agent-src/skills/quality-tools/SKILL.md +1 -1
  51. package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
  52. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  53. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
  54. package/dist/agent-src/templates/agent-settings.md +1 -1
  55. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  56. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
  57. package/dist/cli/commands/config.js +44 -0
  58. package/dist/cli/commands/config.js.map +1 -0
  59. package/dist/cli/commands/uiServe.js +1 -0
  60. package/dist/cli/commands/uiServe.js.map +1 -1
  61. package/dist/cli/help.js +38 -0
  62. package/dist/cli/help.js.map +1 -0
  63. package/dist/cli/initRouting.js +16 -1
  64. package/dist/cli/initRouting.js.map +1 -1
  65. package/dist/cli/main.js +43 -37
  66. package/dist/cli/main.js.map +1 -1
  67. package/dist/cli/registry.js +45 -44
  68. package/dist/cli/registry.js.map +1 -1
  69. package/dist/discovery/deprecation-report.md +1 -1
  70. package/dist/discovery/discovery-manifest.json +419 -210
  71. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  72. package/dist/discovery/discovery-manifest.summary.md +4 -4
  73. package/dist/discovery/orphan-report.md +1 -1
  74. package/dist/discovery/packs.json +31 -25
  75. package/dist/discovery/trust-report.md +2 -2
  76. package/dist/discovery/workspaces.json +30 -24
  77. package/dist/install/install.mjs +6064 -159
  78. package/dist/install/selectedTools.js +39 -10
  79. package/dist/install/selectedTools.js.map +1 -1
  80. package/dist/mcp/registry-manifest.json +3 -3
  81. package/dist/server/app.js +15 -3
  82. package/dist/server/app.js.map +1 -1
  83. package/dist/server/routes/ping.js +16 -0
  84. package/dist/server/routes/ping.js.map +1 -1
  85. package/dist/server/routes/settings.js +42 -6
  86. package/dist/server/routes/settings.js.map +1 -1
  87. package/dist/server/routes/settingsChanges.js +55 -0
  88. package/dist/server/routes/settingsChanges.js.map +1 -0
  89. package/dist/server/routes/userMd.js +7 -2
  90. package/dist/server/routes/userMd.js.map +1 -1
  91. package/dist/server/routes/wizard.js +76 -14
  92. package/dist/server/routes/wizard.js.map +1 -1
  93. package/dist/server/writeRoot.js +17 -0
  94. package/dist/server/writeRoot.js.map +1 -1
  95. package/dist/shared/settingsSurface.js +120 -0
  96. package/dist/shared/settingsSurface.js.map +1 -0
  97. package/dist/ui/assets/index-BPFMZWUs.css +1 -0
  98. package/dist/ui/assets/index-BiEZiZ31.js +40 -0
  99. package/dist/ui/assets/index-BiEZiZ31.js.map +1 -0
  100. package/dist/ui/index.html +15 -2
  101. package/docs/CLAIMS.md +20 -15
  102. package/docs/architecture.md +1 -1
  103. package/docs/catalog.md +37 -31
  104. package/docs/command-flows.md +22 -16
  105. package/docs/contracts/command-clusters.md +39 -9
  106. package/docs/contracts/file-ownership-matrix.json +21 -0
  107. package/docs/contracts/frontmatter-contract.md +1 -1
  108. package/docs/contracts/gui-wizard.md +16 -4
  109. package/docs/contracts/iron-law-overrides.txt +1 -0
  110. package/docs/contracts/rule-classification.md +2 -2
  111. package/docs/contracts/settings-api.md +58 -2
  112. package/docs/contracts/surface-matrix.md +5 -0
  113. package/docs/cookbook.md +7 -7
  114. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +74 -0
  115. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +91 -0
  116. package/docs/decisions/INDEX.md +2 -0
  117. package/docs/featured-commands.md +1 -1
  118. package/docs/featured-skills.md +4 -4
  119. package/docs/flows.md +2 -2
  120. package/docs/getting-started-by-role.md +1 -1
  121. package/docs/getting-started-laravel.md +1 -1
  122. package/docs/getting-started.md +6 -3
  123. package/docs/governance-advantage.md +1 -1
  124. package/docs/guidelines/agent-infra/5w2h-analysis.md +1 -1
  125. package/docs/guidelines/agent-infra/ios-simulator-guide.md +1 -1
  126. package/docs/proof.md +11 -2
  127. package/package.json +6 -1
  128. package/src/agent-src/README.md +64 -0
  129. package/src/agent-src/scripts/archive_completed_roadmaps.ts +497 -0
  130. package/src/agent-src/scripts/scan-seeder-violations.php +145 -0
  131. package/src/agent-src/scripts/update_roadmap_progress.ts +1087 -0
  132. package/src/agent-src/templates/AGENTS.md +34 -0
  133. package/src/agent-src/templates/scripts/README.md +195 -0
  134. package/src/agent-src/templates/scripts/check_memory.ts +662 -0
  135. package/src/agent-src/templates/scripts/check_memory_proposal.ts +370 -0
  136. package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
  137. package/src/agent-src/templates/scripts/implement_ticket/__main__.ts +27 -0
  138. package/src/agent-src/templates/scripts/memory_hash.ts +355 -0
  139. package/src/agent-src/templates/scripts/memory_lookup.ts +1089 -0
  140. package/src/agent-src/templates/scripts/memory_report.ts +868 -0
  141. package/src/agent-src/templates/scripts/memory_signal.ts +444 -0
  142. package/src/agent-src/templates/scripts/memory_status.ts +215 -0
  143. package/src/agent-src/templates/scripts/ownership-map.example.yml +87 -0
  144. package/src/agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
  145. package/src/agent-src/templates/scripts/pr_review_routing.ts +544 -0
  146. package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  147. package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
  148. package/src/agent-src/templates/scripts/telemetry/boundary.ts +164 -0
  149. package/src/agent-src/templates/scripts/telemetry/engagement.ts +479 -0
  150. package/src/agent-src/templates/scripts/telemetry/report_renderer.ts +394 -0
  151. package/src/agent-src/templates/scripts/telemetry/settings.ts +210 -0
  152. package/src/agent-src/templates/scripts/telemetry_record.ts +276 -0
  153. package/src/agent-src/templates/scripts/telemetry_report.ts +211 -0
  154. package/src/agent-src/templates/scripts/telemetry_status.ts +333 -0
  155. package/src/agent-src/templates/scripts/tier_usage_report.ts +619 -0
  156. package/src/agent-src/templates/scripts/work_engine/__main__.ts +14 -0
  157. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +1261 -0
  158. package/src/agent-src/templates/scripts/work_engine/_lib/user_global_paths.ts +329 -0
  159. package/src/agent-src/templates/scripts/work_engine/cli.ts +206 -0
  160. package/src/agent-src/templates/scripts/work_engine/cli_args.ts +249 -0
  161. package/src/agent-src/templates/scripts/work_engine/delivery_state.ts +225 -0
  162. package/src/agent-src/templates/scripts/work_engine/directives/backend/analyze.ts +125 -0
  163. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +189 -0
  164. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +94 -0
  165. package/src/agent-src/templates/scripts/work_engine/directives/backend/memory.ts +193 -0
  166. package/src/agent-src/templates/scripts/work_engine/directives/backend/plan.ts +267 -0
  167. package/src/agent-src/templates/scripts/work_engine/directives/backend/refine.ts +518 -0
  168. package/src/agent-src/templates/scripts/work_engine/directives/backend/report.ts +379 -0
  169. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +268 -0
  170. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +258 -0
  171. package/src/agent-src/templates/scripts/work_engine/directives/index.ts +32 -0
  172. package/src/agent-src/templates/scripts/work_engine/directives/mixed/contract.ts +243 -0
  173. package/src/agent-src/templates/scripts/work_engine/directives/mixed/index.ts +108 -0
  174. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +259 -0
  175. package/src/agent-src/templates/scripts/work_engine/directives/mixed/ui.ts +216 -0
  176. package/src/agent-src/templates/scripts/work_engine/directives/ui/_passthrough.ts +40 -0
  177. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +241 -0
  178. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +216 -0
  179. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +506 -0
  180. package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +325 -0
  181. package/src/agent-src/templates/scripts/work_engine/directives/ui/index.ts +102 -0
  182. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +462 -0
  183. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +474 -0
  184. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +352 -0
  185. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.ts +33 -0
  186. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.ts +213 -0
  187. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/index.ts +111 -0
  188. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.ts +126 -0
  189. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/report.ts +112 -0
  190. package/src/agent-src/templates/scripts/work_engine/directives/ui_trivial/test.ts +164 -0
  191. package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +515 -0
  192. package/src/agent-src/templates/scripts/work_engine/emitters.ts +119 -0
  193. package/src/agent-src/templates/scripts/work_engine/errors.ts +24 -0
  194. package/src/agent-src/templates/scripts/work_engine/hook_bootstrap.ts +104 -0
  195. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.ts +189 -0
  196. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.ts +41 -0
  197. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.ts +89 -0
  198. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.ts +193 -0
  199. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +304 -0
  200. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.ts +110 -0
  201. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.ts +118 -0
  202. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/index.ts +17 -0
  203. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +161 -0
  204. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.ts +45 -0
  205. package/src/agent-src/templates/scripts/work_engine/hooks/builtin/trace.ts +134 -0
  206. package/src/agent-src/templates/scripts/work_engine/hooks/context.ts +94 -0
  207. package/src/agent-src/templates/scripts/work_engine/hooks/events.ts +58 -0
  208. package/src/agent-src/templates/scripts/work_engine/hooks/exceptions.ts +85 -0
  209. package/src/agent-src/templates/scripts/work_engine/hooks/index.ts +27 -0
  210. package/src/agent-src/templates/scripts/work_engine/hooks/registry.ts +66 -0
  211. package/src/agent-src/templates/scripts/work_engine/hooks/runner.ts +90 -0
  212. package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +260 -0
  213. package/src/agent-src/templates/scripts/work_engine/input_builders.ts +260 -0
  214. package/src/agent-src/templates/scripts/work_engine/intent/classify.ts +466 -0
  215. package/src/agent-src/templates/scripts/work_engine/migration/v0_to_v1.ts +531 -0
  216. package/src/agent-src/templates/scripts/work_engine/orchestration.ts +366 -0
  217. package/src/agent-src/templates/scripts/work_engine/persona_policy.ts +97 -0
  218. package/src/agent-src/templates/scripts/work_engine/resolvers/diff.ts +135 -0
  219. package/src/agent-src/templates/scripts/work_engine/resolvers/file.ts +175 -0
  220. package/src/agent-src/templates/scripts/work_engine/resolvers/prompt.ts +115 -0
  221. package/src/agent-src/templates/scripts/work_engine/scoring/confidence.ts +415 -0
  222. package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +466 -0
  223. package/src/agent-src/templates/scripts/work_engine/scoring/decision_trace.ts +298 -0
  224. package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +444 -0
  225. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +252 -0
  226. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +745 -0
  227. package/src/agent-src/templates/scripts/work_engine/state.ts +1151 -0
  228. package/src/agent-src/templates/scripts/work_engine/state_io.ts +413 -0
  229. package/src/config/agent-settings.template.yml +1 -1
  230. package/src/install/atomic.ts +111 -0
  231. package/src/install/conflict.ts +226 -0
  232. package/src/install/detect.ts +280 -0
  233. package/src/install/paths.ts +90 -0
  234. package/src/install/plan.ts +205 -0
  235. package/src/install/preflight.ts +210 -0
  236. package/src/install/selectedTools.ts +80 -0
  237. package/src/install/toolDetection.ts +120 -0
  238. package/src/install/txlog.ts +161 -0
  239. package/src/install/types.ts +175 -0
  240. package/src/install/wizard-plan.ts +216 -0
  241. package/src/scripts/_cli/cmd_converge.ts +38 -0
  242. package/src/scripts/_cli/cmd_doctor.ts +113 -2
  243. package/src/scripts/_cli/cmd_explain.ts +2 -2
  244. package/src/scripts/_cli/cmd_export.ts +3 -3
  245. package/src/scripts/_cli/cmd_fleet.ts +13 -1
  246. package/src/scripts/_cli/cmd_migrate.ts +3 -3
  247. package/src/scripts/_cli/cmd_prune.ts +2 -2
  248. package/src/scripts/_cli/cmd_refresh.ts +4 -4
  249. package/src/scripts/_cli/cmd_settings_check.ts +2 -2
  250. package/src/scripts/_cli/cmd_settings_migrate.ts +2 -2
  251. package/src/scripts/_cli/cmd_sync.ts +2 -2
  252. package/src/scripts/_cli/cmd_uninstall.ts +2 -2
  253. package/src/scripts/_cli/cmd_update.ts +8 -8
  254. package/src/scripts/_cli/cmd_upgrade.ts +4 -3
  255. package/src/scripts/_cli/cmd_validate.ts +3 -3
  256. package/src/scripts/_cli/cmd_versions.ts +2 -2
  257. package/src/scripts/_cli/explain_last/assumptions.ts +2 -2
  258. package/src/scripts/_cli/explain_last/council.ts +2 -2
  259. package/src/scripts/_cli/explain_last/halt.ts +2 -2
  260. package/src/scripts/_cli/explain_last/index.ts +2 -2
  261. package/src/scripts/_cli/explain_last/inputs.ts +4 -4
  262. package/src/scripts/_cli/explain_last/memory.ts +2 -2
  263. package/src/scripts/_cli/explain_last/provider.ts +2 -2
  264. package/src/scripts/_cli/explain_last/render.ts +2 -2
  265. package/src/scripts/_cli/explain_last/route.ts +2 -2
  266. package/src/scripts/_cli/explain_last/scrubber.ts +2 -2
  267. package/src/scripts/_cli/explain_last/sections/assumptions.ts +2 -2
  268. package/src/scripts/_cli/explain_last/sections/council.ts +2 -2
  269. package/src/scripts/_cli/explain_last/sections/halt.ts +2 -2
  270. package/src/scripts/_cli/explain_last/sections/header.ts +2 -2
  271. package/src/scripts/_cli/explain_last/sections/index.ts +1 -1
  272. package/src/scripts/_cli/explain_last/sections/inputs.ts +2 -2
  273. package/src/scripts/_cli/explain_last/sections/memory.ts +2 -2
  274. package/src/scripts/_cli/explain_last/sections/pack.ts +2 -2
  275. package/src/scripts/_cli/explain_last/sections/provider.ts +2 -2
  276. package/src/scripts/_cli/explain_last/sections/route.ts +2 -2
  277. package/src/scripts/_cli/explain_last/state_loader.ts +2 -2
  278. package/src/scripts/_dispatch.bash +20 -1
  279. package/src/scripts/_lib/agent_settings.ts +1 -1
  280. package/src/scripts/_lib/agent_src.ts +7 -7
  281. package/src/scripts/_lib/agents_overlay.ts +1 -1
  282. package/src/scripts/_lib/bench_ab_cache.ts +1 -1
  283. package/src/scripts/_lib/bench_ab_scoring.ts +1 -1
  284. package/src/scripts/_lib/bench_ab_scoring_v2.ts +3 -3
  285. package/src/scripts/_lib/bench_cost.ts +1 -1
  286. package/src/scripts/_lib/bench_quality.ts +3 -3
  287. package/src/scripts/_lib/bench_report.ts +4 -4
  288. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  289. package/src/scripts/_lib/bench_telegraph_report.ts +4 -4
  290. package/src/scripts/_lib/changelog_eras.ts +1 -1
  291. package/src/scripts/_lib/claude_desktop_bundler.ts +1 -1
  292. package/src/scripts/_lib/cli_wrapper.ts +1 -1
  293. package/src/scripts/_lib/fs_atomic.ts +1 -1
  294. package/src/scripts/_lib/global_deploy_inventory.ts +1 -1
  295. package/src/scripts/_lib/install_layout.ts +1 -1
  296. package/src/scripts/_lib/install_regenerator.ts +1 -1
  297. package/src/scripts/_lib/installed_lock.ts +1 -1
  298. package/src/scripts/_lib/installed_tools.ts +1 -1
  299. package/src/scripts/_lib/json_pointers.ts +1 -1
  300. package/src/scripts/_lib/knowledge_global.ts +1 -1
  301. package/src/scripts/_lib/knowledge_global_promote.ts +2 -2
  302. package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
  303. package/src/scripts/_lib/link_crypto.ts +4 -4
  304. package/src/scripts/_lib/linked_projects.ts +4 -4
  305. package/src/scripts/_lib/model_tier.ts +1 -1
  306. package/src/scripts/_lib/module_detection.ts +2 -2
  307. package/src/scripts/_lib/pin_resolver.ts +1 -1
  308. package/src/scripts/_lib/script_output.ts +1 -1
  309. package/src/scripts/_lib/security_lint.ts +1 -1
  310. package/src/scripts/_lib/surface_tiers.ts +1 -1
  311. package/src/scripts/_lib/text_similarity.ts +1 -1
  312. package/src/scripts/_lib/update_check.ts +2 -2
  313. package/src/scripts/_lib/user_global_paths.ts +1 -1
  314. package/src/scripts/_lib/value_ladder.ts +1 -1
  315. package/src/scripts/_lib/value_report.ts +1 -1
  316. package/src/scripts/_lib/zip_min.ts +2 -2
  317. package/src/scripts/adoption_report.ts +3 -3
  318. package/src/scripts/adoption_snapshot.ts +3 -3
  319. package/src/scripts/adoption_status.ts +2 -2
  320. package/src/scripts/adr/regenerate_index.ts +3 -3
  321. package/src/scripts/ai_council/_default_prices.ts +2 -3
  322. package/src/scripts/ai_council/advisors.ts +1 -1
  323. package/src/scripts/ai_council/airgap.ts +1 -1
  324. package/src/scripts/ai_council/budget_guard.ts +1 -1
  325. package/src/scripts/ai_council/bundler.ts +1 -1
  326. package/src/scripts/ai_council/cli_hints.ts +1 -1
  327. package/src/scripts/ai_council/clients.ts +5 -5
  328. package/src/scripts/ai_council/compile_corpus.ts +1 -1
  329. package/src/scripts/ai_council/confidence_gate.ts +1 -1
  330. package/src/scripts/ai_council/config.ts +1 -1
  331. package/src/scripts/ai_council/consensus.ts +1 -1
  332. package/src/scripts/ai_council/events_log.ts +1 -1
  333. package/src/scripts/ai_council/learn_low_impact_preview.ts +1 -1
  334. package/src/scripts/ai_council/low_impact_corpus.ts +1 -1
  335. package/src/scripts/ai_council/low_impact_intake.ts +1 -1
  336. package/src/scripts/ai_council/modes.ts +1 -1
  337. package/src/scripts/ai_council/orchestrator.ts +3 -3
  338. package/src/scripts/ai_council/pricing.ts +2 -2
  339. package/src/scripts/ai_council/probation_gate.ts +2 -2
  340. package/src/scripts/ai_council/project_context.ts +1 -1
  341. package/src/scripts/ai_council/prompts.ts +1 -1
  342. package/src/scripts/ai_council/redact_low_impact_entry.ts +2 -2
  343. package/src/scripts/ai_council/session.ts +1 -1
  344. package/src/scripts/ai_council/shadow_dispatch.ts +1 -1
  345. package/src/scripts/ai_council/solo_dispatch.ts +1 -1
  346. package/src/scripts/analysis_freshness.ts +2 -2
  347. package/src/scripts/annotate_discovery.ts +2 -2
  348. package/src/scripts/apply_modules_config.ts +2 -2
  349. package/src/scripts/audit_adr_coverage.ts +3 -3
  350. package/src/scripts/audit_auto_rules.ts +2 -2
  351. package/src/scripts/audit_cloud_compatibility.ts +3 -3
  352. package/src/scripts/audit_command_surface.ts +2 -2
  353. package/src/scripts/audit_initial_context.ts +7 -6
  354. package/src/scripts/audit_likelihood.ts +5 -5
  355. package/src/scripts/audit_mcp_tools.ts +3 -3
  356. package/src/scripts/audit_overlap.ts +2 -2
  357. package/src/scripts/audit_skill_descriptions.ts +2 -2
  358. package/src/scripts/audit_skill_overlap.ts +5 -5
  359. package/src/scripts/audit_user_type_axis.ts +4 -4
  360. package/src/scripts/backfill_model_tier.ts +1 -1
  361. package/src/scripts/bench_ab_cache_dispatch.ts +2 -2
  362. package/src/scripts/bench_ab_clone.ts +2 -2
  363. package/src/scripts/bench_ab_diff.ts +3 -3
  364. package/src/scripts/bench_ab_integrity.ts +2 -2
  365. package/src/scripts/bench_ab_run.ts +4 -4
  366. package/src/scripts/bench_ab_task_runner.ts +1 -1
  367. package/src/scripts/bench_ab_tracka_run.ts +2 -2
  368. package/src/scripts/bench_ab_v2_run.ts +1 -1
  369. package/src/scripts/bench_ab_v2_stats.ts +2 -2
  370. package/src/scripts/bench_baseline_ready.ts +1 -1
  371. package/src/scripts/bench_condense_memory.ts +4 -4
  372. package/src/scripts/bench_drift_check.ts +3 -3
  373. package/src/scripts/bench_per_tool.ts +1 -1
  374. package/src/scripts/bench_rtk_savings.ts +4 -4
  375. package/src/scripts/bench_run.ts +4 -4
  376. package/src/scripts/bench_runner.ts +1 -1
  377. package/src/scripts/build_cloud_bundle.ts +3 -3
  378. package/src/scripts/build_discovery_manifest.ts +13 -15
  379. package/src/scripts/build_linear_digest.ts +2 -2
  380. package/src/scripts/build_mcp_registry_manifest.ts +3 -3
  381. package/src/scripts/build_proof.ts +6 -0
  382. package/src/scripts/build_rule_trigger_matrix.ts +2 -2
  383. package/src/scripts/capture_showcase_session.ts +3 -3
  384. package/src/scripts/chat_history.ts +1 -1
  385. package/src/scripts/check_always_budget.ts +1 -1
  386. package/src/scripts/check_artefact_checksums.ts +4 -4
  387. package/src/scripts/check_artefact_count_messaging.ts +197 -0
  388. package/src/scripts/check_augment_description_cap.ts +3 -3
  389. package/src/scripts/check_augmentignore.ts +1 -1
  390. package/src/scripts/check_beta_review_markers.ts +3 -3
  391. package/src/scripts/check_bite_sized_granularity.ts +1 -1
  392. package/src/scripts/check_cluster_patterns.ts +47 -3
  393. package/src/scripts/check_command_count_messaging.ts +2 -2
  394. package/src/scripts/check_condensation.ts +2 -2
  395. package/src/scripts/check_condensed_paths.ts +6 -6
  396. package/src/scripts/check_context_paths.ts +1 -1
  397. package/src/scripts/check_council_config_location.ts +3 -3
  398. package/src/scripts/check_council_layout.ts +2 -2
  399. package/src/scripts/check_council_references.ts +2 -2
  400. package/src/scripts/check_discovery_determinism.ts +3 -3
  401. package/src/scripts/check_gate_paths.ts +4 -4
  402. package/src/scripts/check_iron_law_prominence.ts +2 -2
  403. package/src/scripts/check_kernel_rule_bundle.ts +3 -3
  404. package/src/scripts/check_knowledge_cards.ts +4 -4
  405. package/src/scripts/check_knowledge_pages.ts +1 -1
  406. package/src/scripts/check_md_language.ts +3 -3
  407. package/src/scripts/check_memory.ts +3 -3
  408. package/src/scripts/check_memory_proposal.ts +2 -2
  409. package/src/scripts/check_module_management_neutral.ts +1 -1
  410. package/src/scripts/check_no_conflict_markers.ts +1 -1
  411. package/src/scripts/check_no_external_sources.ts +1 -1
  412. package/src/scripts/check_no_local_settings_committed.ts +2 -2
  413. package/src/scripts/check_no_new_legacy_path.ts +3 -3
  414. package/src/scripts/check_no_roadmap_refs.ts +3 -3
  415. package/src/scripts/check_one_off_location.ts +3 -3
  416. package/src/scripts/check_overlay_cascade_subdirs.ts +3 -3
  417. package/src/scripts/check_portability.ts +3 -3
  418. package/src/scripts/check_proposal.ts +0 -0
  419. package/src/scripts/check_public_catalog_links.ts +1 -1
  420. package/src/scripts/check_public_links.ts +2 -2
  421. package/src/scripts/check_references.ts +3 -3
  422. package/src/scripts/check_release_includes_discovery.ts +2 -2
  423. package/src/scripts/check_release_pr_shape.ts +2 -2
  424. package/src/scripts/check_release_published.ts +1 -1
  425. package/src/scripts/check_release_trunk_sync.ts +3 -3
  426. package/src/scripts/check_reply_consistency.ts +1 -1
  427. package/src/scripts/check_roadmap_trackable.ts +2 -2
  428. package/src/scripts/check_role_doc_links.ts +2 -2
  429. package/src/scripts/check_safety_floor_untouched.ts +3 -3
  430. package/src/scripts/check_skill_requires.ts +2 -2
  431. package/src/scripts/check_structural_breaking.ts +2 -2
  432. package/src/scripts/check_surface_tiers.ts +2 -2
  433. package/src/scripts/check_template_pin_drift.ts +1 -1
  434. package/src/scripts/check_test_coverage_diff.ts +2 -2
  435. package/src/scripts/check_token_optimizer_freshness.ts +3 -3
  436. package/src/scripts/check_trigger_evals.ts +2 -2
  437. package/src/scripts/check_update_banner.ts +1 -1
  438. package/src/scripts/ci_status.ts +0 -0
  439. package/src/scripts/ci_summary.ts +3 -3
  440. package/src/scripts/ci_time_ratio.ts +1 -1
  441. package/src/scripts/command_suggester/cooldown.ts +1 -1
  442. package/src/scripts/command_suggester/index.ts +1 -1
  443. package/src/scripts/command_suggester/loader.ts +1 -1
  444. package/src/scripts/command_suggester/match.ts +1 -1
  445. package/src/scripts/command_suggester/rank.ts +1 -1
  446. package/src/scripts/command_suggester/render.ts +1 -1
  447. package/src/scripts/command_suggester/sanitize.ts +1 -1
  448. package/src/scripts/command_suggester/settings.ts +1 -1
  449. package/src/scripts/command_suggester/types.ts +0 -0
  450. package/src/scripts/compile_router.ts +4 -4
  451. package/src/scripts/condense.ts +3 -3
  452. package/src/scripts/condense_memory.ts +1 -1
  453. package/src/scripts/config/index.ts +1 -1
  454. package/src/scripts/config/packs.ts +1 -1
  455. package/src/scripts/config/presets.ts +1 -1
  456. package/src/scripts/config/profile_explain.ts +1 -1
  457. package/src/scripts/config/profiles.ts +1 -1
  458. package/src/scripts/config/session_profiles.ts +1 -1
  459. package/src/scripts/context_hygiene_hook.ts +2 -2
  460. package/src/scripts/cost_by_conversation.ts +1 -1
  461. package/src/scripts/cost_summary.ts +2 -2
  462. package/src/scripts/council_cli.ts +1 -1
  463. package/src/scripts/council_prune.ts +1 -1
  464. package/src/scripts/cross_repo_retrieve.ts +2 -2
  465. package/src/scripts/discovery_stats.ts +3 -3
  466. package/src/scripts/evidence_report.ts +4 -4
  467. package/src/scripts/extract_audit_patterns.ts +2 -2
  468. package/src/scripts/first_run_gate_hook.ts +1 -1
  469. package/src/scripts/gen_discovery_baseline.ts +2 -2
  470. package/src/scripts/generate_capabilities_index.ts +2 -2
  471. package/src/scripts/generate_capability_matrix.ts +2 -2
  472. package/src/scripts/generate_catalog.ts +2 -2
  473. package/src/scripts/generate_command_flows.ts +2 -2
  474. package/src/scripts/generate_cookbook.ts +1 -1
  475. package/src/scripts/generate_index.ts +3 -3
  476. package/src/scripts/generate_ownership_matrix.ts +2 -2
  477. package/src/scripts/generate_pack_manifests.ts +2 -2
  478. package/src/scripts/generate_role_experiences_catalog.ts +3 -3
  479. package/src/scripts/hooks/block_no_verify.ts +2 -2
  480. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  481. package/src/scripts/hooks/dispatch_issues.ts +1 -1
  482. package/src/scripts/hooks/envelope.ts +1 -1
  483. package/src/scripts/hooks/replay_hook.ts +1 -1
  484. package/src/scripts/hooks/state_io.ts +1 -1
  485. package/src/scripts/hooks_doctor.ts +1 -1
  486. package/src/scripts/hooks_status.ts +1 -1
  487. package/src/scripts/injection_scan_hook.ts +1 -1
  488. package/src/scripts/install.ts +145 -3
  489. package/src/scripts/inventory_abstraction_budget.ts +5 -5
  490. package/src/scripts/inventory_frontmatter.ts +1 -1
  491. package/src/scripts/inventory_meta_layers.ts +1 -1
  492. package/src/scripts/iron_law_sha.ts +1 -1
  493. package/src/scripts/knowledge_global_cli.ts +3 -3
  494. package/src/scripts/linked_projects_list.ts +1 -1
  495. package/src/scripts/lint_agent_security.ts +4 -4
  496. package/src/scripts/lint_agent_skill_names.ts +1 -1
  497. package/src/scripts/lint_agents_layout.ts +2 -2
  498. package/src/scripts/lint_agents_md.ts +3 -3
  499. package/src/scripts/lint_archived_skills.ts +2 -2
  500. package/src/scripts/lint_artefact_frontmatter.ts +2 -2
  501. package/src/scripts/lint_bench_ab.ts +2 -2
  502. package/src/scripts/lint_bench_corpus.ts +1 -1
  503. package/src/scripts/lint_command_flow_coverage.ts +1 -1
  504. package/src/scripts/lint_command_routing.ts +2 -2
  505. package/src/scripts/lint_command_tiers.ts +1 -1
  506. package/src/scripts/lint_command_verbs.ts +4 -4
  507. package/src/scripts/lint_commit_subjects.ts +2 -2
  508. package/src/scripts/lint_context_spine_usage.ts +3 -3
  509. package/src/scripts/lint_discovery_manifest.ts +4 -4
  510. package/src/scripts/lint_discovery_vocabulary.ts +2 -2
  511. package/src/scripts/lint_empty_roadmaps.ts +3 -3
  512. package/src/scripts/lint_eval_freshness.ts +2 -2
  513. package/src/scripts/lint_examples.ts +2 -2
  514. package/src/scripts/lint_explain_trace.ts +2 -2
  515. package/src/scripts/lint_featured_skills.ts +0 -0
  516. package/src/scripts/lint_flows.ts +5 -5
  517. package/src/scripts/lint_framework_leakage.ts +1 -1
  518. package/src/scripts/lint_framework_leakage_allowlist.json +10 -2
  519. package/src/scripts/lint_frontmatter_boilerplate.ts +2 -2
  520. package/src/scripts/lint_ghostwriter_source.ts +3 -3
  521. package/src/scripts/lint_global_paths.ts +1 -1
  522. package/src/scripts/lint_handoffs.ts +1 -1
  523. package/src/scripts/lint_hidden_unicode.ts +1 -1
  524. package/src/scripts/lint_hook_concern_budget.ts +2 -2
  525. package/src/scripts/lint_hook_manifest.ts +2 -2
  526. package/src/scripts/lint_instruction_smuggling.ts +1 -1
  527. package/src/scripts/lint_load_context.ts +2 -2
  528. package/src/scripts/lint_marketplace.ts +1 -1
  529. package/src/scripts/lint_marketplace_install_completeness.ts +2 -2
  530. package/src/scripts/lint_mcp_config_security.ts +1 -1
  531. package/src/scripts/lint_mcp_registry_manifest.ts +1 -1
  532. package/src/scripts/lint_media_policy_linkage.ts +3 -3
  533. package/src/scripts/lint_missions.ts +3 -3
  534. package/src/scripts/lint_model_tier_coverage.ts +3 -3
  535. package/src/scripts/lint_namespace.ts +2 -2
  536. package/src/scripts/lint_namespace_collisions.ts +2 -2
  537. package/src/scripts/lint_new_skill_gate.ts +3 -3
  538. package/src/scripts/lint_no_new_atomic_commands.ts +9 -6
  539. package/src/scripts/lint_no_python_twin_rationale.ts +102 -0
  540. package/src/scripts/lint_one_off_age.ts +2 -2
  541. package/src/scripts/lint_orchestration_dsl.ts +3 -3
  542. package/src/scripts/lint_orchestrator_auto_detect.ts +1 -1
  543. package/src/scripts/lint_pack_boundaries.ts +2 -2
  544. package/src/scripts/lint_pack_dependencies.ts +2 -2
  545. package/src/scripts/lint_pack_first_win.ts +2 -2
  546. package/src/scripts/lint_persona_governance.ts +3 -3
  547. package/src/scripts/lint_positioning.ts +1 -1
  548. package/src/scripts/lint_profile_overlay_set_only.ts +2 -2
  549. package/src/scripts/lint_readme_jargon.ts +2 -2
  550. package/src/scripts/lint_readme_size.ts +2 -2
  551. package/src/scripts/lint_regression.ts +3 -3
  552. package/src/scripts/lint_roadmap_ci_steps.ts +3 -3
  553. package/src/scripts/lint_roadmap_complexity.ts +1 -1
  554. package/src/scripts/lint_roadmap_later_disposition.ts +2 -2
  555. package/src/scripts/lint_role_experiences.ts +2 -2
  556. package/src/scripts/lint_rule_interactions.ts +1 -1
  557. package/src/scripts/lint_rule_tiers.ts +1 -1
  558. package/src/scripts/lint_showcase_sessions.ts +2 -2
  559. package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
  560. package/src/scripts/lint_skill_originality.ts +1 -1
  561. package/src/scripts/lint_skill_tools.ts +3 -3
  562. package/src/scripts/lint_ticket_buildable.ts +2 -2
  563. package/src/scripts/lint_topics_yaml.ts +3 -3
  564. package/src/scripts/lint_trust_coherence.ts +3 -3
  565. package/src/scripts/lint_value_dashboard.ts +3 -3
  566. package/src/scripts/lint_workflow_security.ts +3 -3
  567. package/src/scripts/lint_workspace_boundary.ts +2 -2
  568. package/src/scripts/mcp_parity_smoke.ts +1 -1
  569. package/src/scripts/mcp_render.ts +1 -1
  570. package/src/scripts/mcp_server/catalog.ts +1 -1
  571. package/src/scripts/mcp_server/index.ts +1 -1
  572. package/src/scripts/mcp_server/metadata.ts +1 -1
  573. package/src/scripts/mcp_server/prompts.ts +1 -1
  574. package/src/scripts/mcp_server/resources.ts +1 -1
  575. package/src/scripts/mcp_server/server.ts +1 -1
  576. package/src/scripts/mcp_server/telemetry.ts +1 -1
  577. package/src/scripts/mcp_server/tools.ts +1 -1
  578. package/src/scripts/mcp_telemetry_health.ts +1 -1
  579. package/src/scripts/mcp_telemetry_query.ts +3 -3
  580. package/src/scripts/mcp_telemetry_store.ts +3 -3
  581. package/src/scripts/measure_augment_budget.ts +2 -2
  582. package/src/scripts/measure_density.ts +2 -2
  583. package/src/scripts/measure_frugality_savings.ts +3 -3
  584. package/src/scripts/measure_markitdown_lift.ts +1 -1
  585. package/src/scripts/measure_patterns.ts +1 -1
  586. package/src/scripts/measure_projection_bytes.ts +1 -1
  587. package/src/scripts/measure_rule_budget.ts +1 -1
  588. package/src/scripts/measure_skill_reduction.ts +1 -1
  589. package/src/scripts/memory_hash.ts +1 -1
  590. package/src/scripts/memory_lookup.ts +6 -6
  591. package/src/scripts/memory_report.ts +1 -1
  592. package/src/scripts/memory_signal.ts +1 -1
  593. package/src/scripts/memory_status.ts +2 -2
  594. package/src/scripts/migrate_command_suggestions.ts +1 -1
  595. package/src/scripts/migrate_frontmatter_defaults.ts +1 -1
  596. package/src/scripts/mine_session.ts +3 -3
  597. package/src/scripts/minimal_safe_diff_hook.ts +2 -2
  598. package/src/scripts/move_artefact.ts +3 -3
  599. package/src/scripts/new_skill.ts +3 -3
  600. package/src/scripts/onboarding_gate_hook.ts +2 -2
  601. package/src/scripts/pack_mcp_content.ts +1 -1
  602. package/src/scripts/parity/replay.ts +3 -2
  603. package/src/scripts/pattern_share.ts +2 -2
  604. package/src/scripts/plan_physical_move.ts +3 -3
  605. package/src/scripts/prediction-pool/poisson_sim.ts +2 -2
  606. package/src/scripts/prediction-pool/pool_winsim.ts +2 -2
  607. package/src/scripts/prediction-pool/score_ev.ts +2 -2
  608. package/src/scripts/prepack-check.mjs +108 -5
  609. package/src/scripts/print_required_checks.ts +2 -2
  610. package/src/scripts/probe_projection_fidelity.ts +2 -2
  611. package/src/scripts/probe_skill_registration.ts +2 -2
  612. package/src/scripts/profile_staleness_hook.ts +2 -2
  613. package/src/scripts/profile_use.ts +2 -2
  614. package/src/scripts/project_thin_rules.ts +3 -3
  615. package/src/scripts/propose_modules_config.ts +2 -2
  616. package/src/scripts/prototype_lint_contradictions.ts +2 -2
  617. package/src/scripts/prove_pack_extractable.ts +1 -1
  618. package/src/scripts/readme_linter.ts +4 -4
  619. package/src/scripts/redact_hook_capture.ts +2 -2
  620. package/src/scripts/refine_ticket_detect.ts +1 -1
  621. package/src/scripts/release.ts +30 -19
  622. package/src/scripts/render_benchmark_md.ts +2 -2
  623. package/src/scripts/render_value_md.ts +2 -2
  624. package/src/scripts/roadmap_progress_hook.ts +1 -1
  625. package/src/scripts/router_telemetry.ts +1 -1
  626. package/src/scripts/run_skill_evals.ts +2 -2
  627. package/src/scripts/runtime_dispatcher.ts +1 -1
  628. package/src/scripts/runtime_handler.ts +1 -1
  629. package/src/scripts/runtime_registry.ts +3 -3
  630. package/src/scripts/score_skill_selection.ts +1 -1
  631. package/src/scripts/security_audit_config.ts +2 -2
  632. package/src/scripts/skill_collision_clusters.ts +1 -1
  633. package/src/scripts/skill_discovery.ts +1 -1
  634. package/src/scripts/skill_linter.ts +8 -7
  635. package/src/scripts/skill_overlap.ts +2 -2
  636. package/src/scripts/skill_preview.ts +1 -1
  637. package/src/scripts/skill_tools/audit_persona_coverage.ts +3 -3
  638. package/src/scripts/skill_tools/audit_user_type_coverage.ts +3 -3
  639. package/src/scripts/skill_tools/index.ts +1 -1
  640. package/src/scripts/skill_tools/run_block_d_eval.ts +3 -3
  641. package/src/scripts/skill_tools/score_skill_relevance.ts +3 -3
  642. package/src/scripts/skill_tools/suggest_skill_for_task.ts +3 -3
  643. package/src/scripts/skill_trigger_eval.ts +2 -2
  644. package/src/scripts/skill_usage_collect.ts +2 -2
  645. package/src/scripts/skill_usage_report.ts +2 -2
  646. package/src/scripts/smoke_path_resolution.ts +2 -2
  647. package/src/scripts/smoke_quickstart.ts +4 -4
  648. package/src/scripts/snapshot_agent_outputs.ts +2 -2
  649. package/src/scripts/spotcheck_thin_root.ts +2 -2
  650. package/src/scripts/surface-tiers.yml +1 -0
  651. package/src/scripts/sync_agent_settings.ts +2 -2
  652. package/src/scripts/sync_github_metadata.ts +4 -4
  653. package/src/scripts/sync_gitignore.ts +3 -3
  654. package/src/scripts/sync_yaml_rt.ts +2 -2
  655. package/src/scripts/telegraph_stats.ts +1 -1
  656. package/src/scripts/tool_registry.ts +2 -2
  657. package/src/scripts/tools/adapter_errors.ts +1 -1
  658. package/src/scripts/tools/base_adapter.ts +1 -1
  659. package/src/scripts/tools/github_adapter.ts +1 -1
  660. package/src/scripts/tools/jira_adapter.ts +1 -1
  661. package/src/scripts/trigger_coverage.ts +2 -2
  662. package/src/scripts/update_counts.ts +68 -6
  663. package/src/scripts/update_prices.ts +3 -3
  664. package/src/scripts/validate_agent_settings.ts +3 -3
  665. package/src/scripts/validate_decision_engine.ts +2 -2
  666. package/src/scripts/validate_discovery_manifest.ts +3 -3
  667. package/src/scripts/validate_frontmatter.ts +5 -5
  668. package/src/scripts/validate_pack_yaml.ts +0 -0
  669. package/src/scripts/validate_safe_paths.ts +2 -2
  670. package/src/scripts/validate_telegraph_carveouts.ts +3 -3
  671. package/src/scripts/verify_before_complete_hook.ts +2 -2
  672. package/src/scripts/verify_physical_move.ts +2 -2
  673. package/src/scripts/wrapper_freshness_hook.ts +3 -3
  674. package/src/server/schemas/settings.ts +426 -0
  675. package/src/shared/settingsSurface.ts +184 -0
  676. package/src/shared/userMd/formAdapter.ts +86 -0
  677. package/src/shared/userMd/schema.ts +59 -0
  678. package/src/shared/userMd/utils.ts +91 -0
  679. package/dist/agent-src/commands/optimize-project.md +0 -243
  680. package/dist/ui/assets/index-BbWWuFrF.css +0 -1
  681. package/dist/ui/assets/index-UjcTG_9O.js +0 -40
  682. package/dist/ui/assets/index-UjcTG_9O.js.map +0 -1
@@ -0,0 +1,515 @@
1
+ /**
2
+ * Linear step dispatcher for `/implement-ticket`.
3
+ *
4
+ * TypeScript twin of `work_engine/dispatcher.py` (ADR-200 py2ts Phase 1 —
5
+ * work_engine TOP/integration layer). Public API names stay snake_case to
6
+ * mirror the Python module 1:1 (per ADR-200 — Python style is part of the
7
+ * contract).
8
+ *
9
+ * The dispatcher holds no business logic. It walks the fixed eight-step order
10
+ * declared in `docs/contracts/implement-ticket-flow.md`, hands each step a live
11
+ * `DeliveryState`, and honours the three terminal outcomes:
12
+ *
13
+ * - `SUCCESS` — record and advance.
14
+ * - `BLOCKED` — record, copy questions onto the state, halt.
15
+ * - `PARTIAL` — record, copy questions onto the state, halt.
16
+ *
17
+ * Resumption semantics (Option A, flow contract §agent-directives): steps whose
18
+ * name is already marked `success` in `state.outcomes` are **skipped**. This
19
+ * lets a caller re-invoke the dispatcher after executing an agent-directive,
20
+ * update the relevant slice of `DeliveryState`, record `success` on the resumed
21
+ * step, and continue without replaying earlier work.
22
+ *
23
+ * Step handlers are injected by the caller rather than discovered at import
24
+ * time, so the dispatcher is trivially testable and never depends on handler
25
+ * import order.
26
+ */
27
+
28
+ import type {
29
+ DeliveryState,
30
+ StepResult} from './delivery_state.js';
31
+ import {
32
+ Outcome,
33
+ type Step
34
+ } from './delivery_state.js';
35
+ import type { HookHalt} from './hooks/index.js';
36
+ import { HookContext, HookEvent, HookRunner } from './hooks/index.js';
37
+ import { KNOWN_DIRECTIVE_SETS } from './state.js';
38
+
39
+ // Static directive-set registry. The Python source uses `import_module` to load
40
+ // `work_engine.directives.<pkg>` dynamically; a `.ts` twin may not import a
41
+ // `.py` and resolves statically instead (ADR-200). The map is keyed by the
42
+ // *wire* name (the `_PACKAGE_NAME_OVERRIDES` translation is folded into the
43
+ // keys here, e.g. `ui-trivial` → the `ui_trivial` module).
44
+ import * as _backend from './directives/backend/index.js';
45
+ import * as _mixed from './directives/mixed/index.js';
46
+ import * as _ui from './directives/ui/index.js';
47
+ import * as _ui_trivial from './directives/ui_trivial/index.js';
48
+
49
+ /** Shape every directive-set index module exposes. */
50
+ interface DirectiveSetModule {
51
+ get_steps?: () => Map<string, Step>;
52
+ SUPPORTED_KINDS?: ReadonlyArray<string>;
53
+ }
54
+
55
+ /**
56
+ * Shared empty-registry runner reused when `dispatch` is called without an
57
+ * explicit `hooks` argument. `HookRunner.emit` short-circuits when no callbacks
58
+ * are registered, so the hot path stays branch-light while the call sites stay
59
+ * uniform.
60
+ */
61
+ const _NOOP_RUNNER: HookRunner = new HookRunner();
62
+
63
+ /**
64
+ * Canonical execution order. Eight steps, fixed, no branching.
65
+ *
66
+ * Changing this order is a roadmap-level decision — not a PR rider — per the
67
+ * surface-growth guardrails in `agents/roadmaps/road-to-implement-ticket.md`.
68
+ */
69
+ export const STEP_ORDER: ReadonlyArray<string> = [
70
+ 'refine',
71
+ 'memory',
72
+ 'analyze',
73
+ 'plan',
74
+ 'implement',
75
+ 'test',
76
+ 'verify',
77
+ 'report',
78
+ ];
79
+
80
+ /**
81
+ * Directive set chosen when `state` does not carry one explicitly.
82
+ *
83
+ * Backwards compatibility for v0 `DeliveryState` callers: the legacy shape has
84
+ * no `directive_set` field, so `select_directive_set` falls back to `"backend"`
85
+ * and the engine behaves exactly as it did before R1 Phase 4.
86
+ */
87
+ export const DEFAULT_DIRECTIVE_SET = 'backend';
88
+
89
+ // Schema enum names use hyphens (`ui-trivial`) but Python packages cannot. The
90
+ // loader is the single place that bridges between the two forms; everywhere
91
+ // else uses the wire form. (Folded into `_DIRECTIVE_SET_MODULES` keys here.)
92
+ const _PACKAGE_NAME_OVERRIDES: Record<string, string> = { 'ui-trivial': 'ui_trivial' };
93
+
94
+ /** Wire-name → static directive-set module. */
95
+ const _DIRECTIVE_SET_MODULES: Record<string, DirectiveSetModule> = {
96
+ backend: _backend,
97
+ ui: _ui,
98
+ 'ui-trivial': _ui_trivial,
99
+ mixed: _mixed,
100
+ };
101
+
102
+ /**
103
+ * Run the eight steps linearly against `state`.
104
+ *
105
+ * Returns a `[final_outcome, halting_step]` tuple. `halting_step` is `null`
106
+ * when every step succeeded; otherwise it carries the name of the step whose
107
+ * result halted the flow.
108
+ *
109
+ * `state` is mutated in place: each step's outcome is recorded in
110
+ * `state.outcomes` under the step name, and any surfaced questions land on
111
+ * `state.questions`.
112
+ *
113
+ * `steps` maps step name to handler. Every entry in {@link STEP_ORDER} must be
114
+ * present; missing entries throw (mirroring Python `KeyError`) at dispatch time
115
+ * rather than silently skipping, so incomplete wiring surfaces as a hard
116
+ * failure.
117
+ *
118
+ * `hooks` is an optional {@link HookRunner}. `null` preserves every existing
119
+ * call site verbatim — internally `dispatch` falls back to a shared
120
+ * empty-registry runner so hook bookkeeping stays uniform without a per-emit
121
+ * `if hooks is null` branch.
122
+ *
123
+ * @throws KeyError-equivalent If `steps` does not cover every entry in
124
+ * {@link STEP_ORDER}.
125
+ */
126
+ export function dispatch(
127
+ state: DeliveryState,
128
+ steps: Map<string, Step>,
129
+ hooks: HookRunner | null = null,
130
+ ): [Outcome, string | null] {
131
+ _assert_all_steps_present(steps);
132
+
133
+ // Clear stale questions from a previous halt before we resume so the caller
134
+ // never mistakes old options for fresh ones.
135
+ state.questions = [];
136
+
137
+ const runner = hooks !== null ? hooks : _NOOP_RUNNER;
138
+
139
+ for (const name of STEP_ORDER) {
140
+ if (_get(state.outcomes, name) === Outcome.SUCCESS) {
141
+ // Already completed on an earlier invocation — skip per the resume
142
+ // contract. The caller is responsible for keeping `state.outcomes`
143
+ // and the matching slice in sync.
144
+ continue;
145
+ }
146
+
147
+ const before_halt = runner.emit(
148
+ HookEvent.BEFORE_STEP,
149
+ new HookContext({ step_name: name, delivery: state }),
150
+ );
151
+ if (before_halt !== null) {
152
+ return _hook_halt_blocked(state, runner, name, before_halt, null);
153
+ }
154
+
155
+ const handler = _stepLookup(steps, name);
156
+ let result: StepResult;
157
+ try {
158
+ result = handler(state);
159
+ } catch (exc) {
160
+ // Let dispatcher-layer observers see the failure before the
161
+ // exception unwinds the engine. `on_error` is observe-only; the
162
+ // original exception is always re-raised.
163
+ runner.emit(
164
+ HookEvent.ON_ERROR,
165
+ new HookContext({ step_name: name, delivery: state, exception: exc }),
166
+ );
167
+ throw exc;
168
+ }
169
+ _validate_step_result(name, result);
170
+
171
+ state.outcomes[name] = result.outcome;
172
+
173
+ const after_halt = runner.emit(
174
+ HookEvent.AFTER_STEP,
175
+ new HookContext({ step_name: name, delivery: state, result }),
176
+ );
177
+ if (after_halt !== null) {
178
+ return _hook_halt_blocked(state, runner, name, after_halt, result);
179
+ }
180
+
181
+ if (result.outcome === Outcome.BLOCKED) {
182
+ state.questions = [...result.questions];
183
+ _emit_on_halt(runner, name, state, result);
184
+ return [Outcome.BLOCKED, name];
185
+ }
186
+
187
+ if (result.outcome === Outcome.PARTIAL) {
188
+ state.questions = [...result.questions];
189
+ _emit_on_halt(runner, name, state, result);
190
+ return [Outcome.PARTIAL, name];
191
+ }
192
+ }
193
+
194
+ return [Outcome.SUCCESS, null];
195
+ }
196
+
197
+ /**
198
+ * Translate a hook-driven {@link HookHalt} into a clean engine halt.
199
+ *
200
+ * Hook-driven halts are treated as first-class engine halts per the P2
201
+ * contract: the dispatcher returns `[BLOCKED, step_name]` with `state.questions`
202
+ * rendered verbatim from the halt's `surface`. The step's outcome marker is set
203
+ * to `"blocked"` only when the halt fires before the handler ran (so resume
204
+ * re-enters the gate); when it fires after the handler, the marker the handler
205
+ * produced is preserved so resume reflects what actually happened.
206
+ */
207
+ function _hook_halt_blocked(
208
+ state: DeliveryState,
209
+ runner: HookRunner,
210
+ name: string,
211
+ halt: HookHalt,
212
+ result: StepResult | null,
213
+ ): [Outcome, string | null] {
214
+ if (result === null) {
215
+ state.outcomes[name] = Outcome.BLOCKED;
216
+ }
217
+ state.questions = [...halt.surface];
218
+ _emit_on_halt(runner, name, state, result);
219
+ return [Outcome.BLOCKED, name];
220
+ }
221
+
222
+ /**
223
+ * Fire `on_halt` as an observe-only event.
224
+ *
225
+ * A {@link HookHalt} raised from inside `on_halt` would create a halt-of-a-halt
226
+ * loop; the runner returns it but the dispatcher deliberately ignores it — the
227
+ * halt surface is already populated.
228
+ */
229
+ function _emit_on_halt(
230
+ runner: HookRunner,
231
+ name: string,
232
+ state: DeliveryState,
233
+ result: StepResult | null,
234
+ ): void {
235
+ runner.emit(
236
+ HookEvent.ON_HALT,
237
+ new HookContext({ step_name: name, delivery: state, result }),
238
+ );
239
+ }
240
+
241
+ /**
242
+ * Reject an incomplete step mapping up front.
243
+ *
244
+ * We deliberately fail loudly here: a missing step would otherwise raise deep
245
+ * inside the dispatch loop after partial state mutation, which makes debugging
246
+ * the wiring harder than it needs to be.
247
+ */
248
+ function _assert_all_steps_present(steps: Map<string, Step>): void {
249
+ const missing = STEP_ORDER.filter((name) => !steps.has(name));
250
+ if (missing.length > 0) {
251
+ throw new KeyError('Step mapping is missing handlers for: ' + missing.join(', '));
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Enforce the blocked/partial invariant: questions must be set.
257
+ *
258
+ * A step that blocks without surfacing a question is a bug — there is nothing
259
+ * for the user to answer. We throw `ValueError` instead of silently recording
260
+ * the outcome so the defect is visible at the earliest possible point.
261
+ */
262
+ function _validate_step_result(name: string, result: StepResult): void {
263
+ if (
264
+ (result.outcome === Outcome.BLOCKED || result.outcome === Outcome.PARTIAL) &&
265
+ result.questions.length === 0
266
+ ) {
267
+ throw new ValueError(
268
+ `Step ${_pyRepr(name)} returned ${result.outcome} with no questions; ` +
269
+ 'blocked and partial outcomes must surface at least one numbered option.',
270
+ );
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Return the directive set name to dispatch `state` against.
276
+ *
277
+ * Looks for `state.directive_set` (the v1 `work_engine.state.WorkState` field)
278
+ * and falls back to {@link DEFAULT_DIRECTIVE_SET} when the attribute is missing
279
+ * — the legacy v0 `DeliveryState` has no such field.
280
+ *
281
+ * The returned name is validated against {@link KNOWN_DIRECTIVE_SETS}; an
282
+ * unknown value throws `ValueError` rather than silently falling back, so a typo
283
+ * in a hand-written state file fails loudly.
284
+ */
285
+ export function select_directive_set(state: unknown): string {
286
+ const name = _getattr(state, 'directive_set', DEFAULT_DIRECTIVE_SET);
287
+ if (typeof name !== 'string' || name.length === 0) {
288
+ throw new ValueError(
289
+ `directive_set must be a non-empty string; got ${_pyRepr(name)}`,
290
+ );
291
+ }
292
+ if (!KNOWN_DIRECTIVE_SETS.has(name)) {
293
+ throw new ValueError(
294
+ `unknown directive_set ${_pyRepr(name)}; ` +
295
+ `known sets: ${_pyReprList(_sortedStr([...KNOWN_DIRECTIVE_SETS]))}`,
296
+ );
297
+ }
298
+ return name;
299
+ }
300
+
301
+ /**
302
+ * Resolve the `directives.<name>` package and return its step mapping.
303
+ *
304
+ * The selected set's index module exposes a `get_steps()` factory that returns
305
+ * the `{step_name: handler}` mapping the dispatcher walks. The schema enum
306
+ * carries hyphenated wire names (`ui-trivial`) but Python packages must use
307
+ * underscores; {@link _PACKAGE_NAME_OVERRIDES} is the single translation point
308
+ * (folded into the static module registry here).
309
+ */
310
+ export function load_directive_set(name: string): Map<string, Step> {
311
+ const moduleEntry = _import_directive_set(name);
312
+ const get_steps = moduleEntry.module.get_steps;
313
+ if (typeof get_steps !== 'function') {
314
+ throw new AttributeError(
315
+ `work_engine.directives.${moduleEntry.leaf} ` +
316
+ 'does not expose a callable get_steps()',
317
+ );
318
+ }
319
+ const steps = get_steps();
320
+ if (!(steps instanceof Map)) {
321
+ throw new TypeError_(
322
+ `work_engine.directives.${moduleEntry.leaf}` +
323
+ `.get_steps() must return a Mapping; ` +
324
+ `got ${_pyTypeName(steps)}`,
325
+ );
326
+ }
327
+ return steps;
328
+ }
329
+
330
+ /**
331
+ * Throw `NotImplementedError` if `set_name` cannot handle `kind`.
332
+ *
333
+ * Reads the per-set `SUPPORTED_KINDS` tuple and checks membership. Distinct from
334
+ * {@link select_directive_set}, which only validates the directive-set *name*:
335
+ * this gate validates the name/kind *pair*.
336
+ *
337
+ * Sets that have no `SUPPORTED_KINDS` attribute are treated as "supports
338
+ * nothing".
339
+ */
340
+ export function assert_kind_supported(kind: string, set_name: string): void {
341
+ const moduleEntry = _import_directive_set(set_name);
342
+ const supported = moduleEntry.module.SUPPORTED_KINDS ?? [];
343
+ if (!supported.includes(kind)) {
344
+ throw new NotImplementedError(
345
+ `directive_set ${_pyRepr(set_name)} does not handle ` +
346
+ `input.kind=${_pyRepr(kind)}; supported kinds: ` +
347
+ `${_pyReprList(_sortedStr(_dedup([...supported])))}`,
348
+ );
349
+ }
350
+ }
351
+
352
+ /** Validate `name` and resolve the matching static package module. */
353
+ function _import_directive_set(name: string): { module: DirectiveSetModule; leaf: string } {
354
+ if (!KNOWN_DIRECTIVE_SETS.has(name)) {
355
+ throw new ValueError(
356
+ `unknown directive_set ${_pyRepr(name)}; ` +
357
+ `known sets: ${_pyReprList(_sortedStr([...KNOWN_DIRECTIVE_SETS]))}`,
358
+ );
359
+ }
360
+ const leaf = _PACKAGE_NAME_OVERRIDES[name] ?? name;
361
+ const module = _DIRECTIVE_SET_MODULES[name];
362
+ if (module === undefined) {
363
+ // A name in KNOWN_DIRECTIVE_SETS with no registered module would mean
364
+ // the static registry drifted from the schema enum — surface it loudly,
365
+ // mirroring Python's ImportError from a missing package.
366
+ throw new ModuleNotFoundError(
367
+ `No module named 'work_engine.directives.${leaf}'`,
368
+ );
369
+ }
370
+ return { module, leaf };
371
+ }
372
+
373
+ // ── Python-parity helpers ────────────────────────────────────────────────
374
+
375
+ /** `Map.get` with a key-membership guard mirroring `dict.get`. */
376
+ function _get(obj: Record<string, string>, key: string): string | undefined {
377
+ return key in obj ? obj[key] : undefined;
378
+ }
379
+
380
+ /** Look up a step handler, throwing the KeyError shape on a miss. */
381
+ function _stepLookup(steps: Map<string, Step>, name: string): Step {
382
+ const handler = steps.get(name);
383
+ if (handler === undefined) {
384
+ throw new KeyError(_pyRepr(name));
385
+ }
386
+ return handler;
387
+ }
388
+
389
+ /** Python `getattr(obj, attr, default)` for plain object attribute access. */
390
+ function _getattr(obj: unknown, attr: string, dflt: unknown): unknown {
391
+ if (obj !== null && typeof obj === 'object' && attr in (obj as Record<string, unknown>)) {
392
+ const v = (obj as Record<string, unknown>)[attr];
393
+ return v === undefined ? dflt : v;
394
+ }
395
+ return dflt;
396
+ }
397
+
398
+ /** Python `repr(x)` for the scalar shapes interpolated via `{value!r}`. */
399
+ function _pyRepr(value: unknown): string {
400
+ if (value === null || value === undefined) {
401
+ return 'None';
402
+ }
403
+ if (value === true) {
404
+ return 'True';
405
+ }
406
+ if (value === false) {
407
+ return 'False';
408
+ }
409
+ if (typeof value === 'string') {
410
+ return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
411
+ }
412
+ return String(value);
413
+ }
414
+
415
+ /** Python `repr(list_of_str)` — `['a', 'b']`. */
416
+ function _pyReprList(values: string[]): string {
417
+ return '[' + values.map((v) => _pyRepr(v)).join(', ') + ']';
418
+ }
419
+
420
+ /** Python `sorted(list_of_str)` — code-point ascending. */
421
+ function _sortedStr(values: string[]): string[] {
422
+ return [...values].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
423
+ }
424
+
425
+ /** Python `set(...)` dedup (insertion order does not matter; sorted after). */
426
+ function _dedup(values: string[]): string[] {
427
+ return [...new Set(values)];
428
+ }
429
+
430
+ /** Python `type(x).__name__` for the shapes the error messages emit. */
431
+ function _pyTypeName(value: unknown): string {
432
+ if (value === null || value === undefined) {
433
+ return 'NoneType';
434
+ }
435
+ if (Array.isArray(value)) {
436
+ return 'list';
437
+ }
438
+ if (value instanceof Map) {
439
+ // A Map is the TS stand-in for the Python `dict` get_steps returns; the
440
+ // only non-Map path here is the guard, so report `dict`.
441
+ return 'dict';
442
+ }
443
+ switch (typeof value) {
444
+ case 'string':
445
+ return 'str';
446
+ case 'boolean':
447
+ return 'bool';
448
+ case 'number':
449
+ return Number.isInteger(value) ? 'int' : 'float';
450
+ case 'object':
451
+ return 'dict';
452
+ default:
453
+ return typeof value;
454
+ }
455
+ }
456
+
457
+ // ── Python-exception name parity ─────────────────────────────────────────
458
+ // The dispatcher raises KeyError / ValueError / TypeError / AttributeError /
459
+ // NotImplementedError / ImportError-family. JS only has a handful of builtins,
460
+ // so these named subclasses carry the Python exception *name* for callers that
461
+ // branch on it (cli.ts catches ValueError + NotImplementedError equivalents).
462
+
463
+ /** Python `KeyError`. */
464
+ export class KeyError extends Error {
465
+ constructor(message?: string) {
466
+ super(message);
467
+ Object.setPrototypeOf(this, KeyError.prototype);
468
+ this.name = 'KeyError';
469
+ }
470
+ }
471
+
472
+ /** Python `ValueError`. */
473
+ export class ValueError extends Error {
474
+ constructor(message?: string) {
475
+ super(message);
476
+ Object.setPrototypeOf(this, ValueError.prototype);
477
+ this.name = 'ValueError';
478
+ }
479
+ }
480
+
481
+ /** Python `TypeError` (named `TypeError_` to avoid the JS builtin clash). */
482
+ export class TypeError_ extends Error {
483
+ constructor(message?: string) {
484
+ super(message);
485
+ Object.setPrototypeOf(this, TypeError_.prototype);
486
+ this.name = 'TypeError';
487
+ }
488
+ }
489
+
490
+ /** Python `AttributeError`. */
491
+ export class AttributeError extends Error {
492
+ constructor(message?: string) {
493
+ super(message);
494
+ Object.setPrototypeOf(this, AttributeError.prototype);
495
+ this.name = 'AttributeError';
496
+ }
497
+ }
498
+
499
+ /** Python `NotImplementedError`. */
500
+ export class NotImplementedError extends Error {
501
+ constructor(message?: string) {
502
+ super(message);
503
+ Object.setPrototypeOf(this, NotImplementedError.prototype);
504
+ this.name = 'NotImplementedError';
505
+ }
506
+ }
507
+
508
+ /** Python `ModuleNotFoundError` (subclass of ImportError). */
509
+ export class ModuleNotFoundError extends Error {
510
+ constructor(message?: string) {
511
+ super(message);
512
+ Object.setPrototypeOf(this, ModuleNotFoundError.prototype);
513
+ this.name = 'ModuleNotFoundError';
514
+ }
515
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Stdout / stderr emitters for the CLI entry point.
3
+ *
4
+ * TypeScript twin of `work_engine/emitters.py` (ADR-200 py2ts Phase 1 —
5
+ * work_engine TOP/integration layer). Public API names stay snake_case to
6
+ * mirror the Python module 1:1 (per ADR-200 — Python style is part of the
7
+ * contract).
8
+ *
9
+ * Extracted from `cli.py` in P2.3 of `road-to-post-pr29-optimize.md`. Holds
10
+ * the two output helpers that shape the wire surface of `main()`: the
11
+ * SUCCESS/halt branch printed on stdout, and the lifecycle-hook halt surface
12
+ * printed on stderr.
13
+ */
14
+
15
+ import * as fs from 'node:fs';
16
+
17
+ import { Outcome } from './delivery_state.js';
18
+ import type { HookHalt } from './hooks/index.js';
19
+ import type { WorkState} from './state.js';
20
+ import { dump } from './state.js';
21
+
22
+ /**
23
+ * Print the terminal surface for `final` to stdout.
24
+ *
25
+ * On SUCCESS, the delivery report. Otherwise a `[halt]` status line plus the
26
+ * surfaced questions verbatim.
27
+ */
28
+ export function _emit(work: WorkState, final: Outcome, halting: string | null): void {
29
+ if (final === Outcome.SUCCESS) {
30
+ process.stdout.write(work.report + '\n');
31
+ return;
32
+ }
33
+ process.stdout.write(`[halt] outcome=${final} step=${halting || '(none)'}\n`);
34
+ for (const line of work.questions) {
35
+ process.stdout.write(line + '\n');
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Render a {@link HookHalt} surface to stderr and return exit 2.
41
+ *
42
+ * Per the P3 halt branch table, every CLI-layer halt yields exit code `2`
43
+ * regardless of which event fired it. State persistence is governed by *where*
44
+ * in `main` the halt is detected: the call site decides whether `_save`
45
+ * already ran.
46
+ *
47
+ * When `work` + `state_file` are provided AND the state file already exists on
48
+ * disk, the halt is appended to `work.halts[]` and the state is re-saved. This
49
+ * lets `agent-config explain last` surface the halt reason later. Fresh-run
50
+ * halts before the first `_save` (state file absent) still leave no state on
51
+ * disk — the pre-explain-v2 contract is preserved.
52
+ */
53
+ export function _emit_halt(
54
+ halt: HookHalt,
55
+ opts: {
56
+ work?: WorkState | null;
57
+ state_file?: string | null;
58
+ event?: string | null;
59
+ } = {},
60
+ ): number {
61
+ const work = opts.work ?? null;
62
+ const state_file = opts.state_file ?? null;
63
+ const event = opts.event ?? null;
64
+
65
+ if (halt.surface.length > 0) {
66
+ for (const line of halt.surface) {
67
+ process.stderr.write(line + '\n');
68
+ }
69
+ } else {
70
+ process.stderr.write(`halt: ${halt.reason}\n`);
71
+ }
72
+ if (work !== null && state_file !== null && _exists(state_file)) {
73
+ work.halts.push({
74
+ reason: halt.reason,
75
+ step: event || '',
76
+ surface: [...halt.surface],
77
+ timestamp: _utcNowIso(),
78
+ });
79
+ try {
80
+ dump(work, state_file);
81
+ } catch {
82
+ // never let halt persistence mask the halt
83
+ }
84
+ }
85
+ return 2;
86
+ }
87
+
88
+ /** Python `Path.exists()`. */
89
+ function _exists(p: string): boolean {
90
+ try {
91
+ fs.statSync(p);
92
+ return true;
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Mirror Python `datetime.now(tz=timezone.utc).isoformat()`.
100
+ *
101
+ * CPython renders an aware UTC datetime as `YYYY-MM-DDTHH:MM:SS.ffffff+00:00`
102
+ * (microsecond precision, explicit `+00:00` offset). `Date.toISOString()`
103
+ * yields `YYYY-MM-DDTHH:MM:SS.sssZ` (millisecond precision, `Z` suffix), so
104
+ * this rebuilds the CPython shape: pad milliseconds to microseconds and
105
+ * replace the `Z` with `+00:00`. This timestamp is wall-clock and therefore
106
+ * non-deterministic — tests normalise it.
107
+ */
108
+ function _utcNowIso(): string {
109
+ const iso = new Date().toISOString(); // e.g. 2026-06-15T03:11:58.123Z
110
+ // Strip the trailing 'Z', expand .sss → .ssssss (µs), append +00:00.
111
+ const body = iso.slice(0, -1); // drop 'Z'
112
+ const dot = body.lastIndexOf('.');
113
+ if (dot === -1) {
114
+ return body + '.000000+00:00';
115
+ }
116
+ const frac = body.slice(dot + 1); // milliseconds, 3 digits
117
+ const micros = (frac + '000000').slice(0, 6);
118
+ return body.slice(0, dot + 1) + micros + '+00:00';
119
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * CLI-layer error type used by the dispatcher entry point.
3
+ *
4
+ * TypeScript twin of `work_engine/errors.py` (ADR-200 py2ts Phase 1 —
5
+ * work_engine foundation). Lives in its own module so the helper modules
6
+ * (`state_io`, `input_builders`, etc.) can raise it without depending on
7
+ * `cli.ts`, which would create an import cycle.
8
+ *
9
+ * Behaviour is identical to the original `cli._CLIError` it replaced
10
+ * in P2.3 of `road-to-post-pr29-optimize.md` — same name (private,
11
+ * underscore-prefixed) and same role: convert to exit code `2` at the
12
+ * `main()` boundary.
13
+ */
14
+
15
+ /** Raised on configuration or I/O problems. Converted to exit code 2. */
16
+ export class _CLIError extends Error {
17
+ constructor(message?: string) {
18
+ super(message);
19
+ // Restore the prototype chain so `instanceof _CLIError` works under
20
+ // the ES2022 target (Error subclassing caveat).
21
+ Object.setPrototypeOf(this, _CLIError.prototype);
22
+ this.name = '_CLIError';
23
+ }
24
+ }