@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,379 @@
1
+ /**
2
+ * `report` step — delivery report renderer.
3
+ *
4
+ * TypeScript twin of `work_engine/directives/backend/report.py` (ADR-200
5
+ * py2ts Phase 1 — work_engine directive sets). Public API names stay
6
+ * snake_case to mirror the Python module 1:1 (per ADR-200 — Python style is
7
+ * part of the contract).
8
+ *
9
+ * Produces the markdown block described in
10
+ * `docs/contracts/implement-ticket-flow.md#delivery-report-schema`.
11
+ * All nine headings are present on every run — the schema is stable
12
+ * for consumers — but section bodies are omitted when the matching
13
+ * slice of `DeliveryState` is empty. The single exception is the
14
+ * **Memory that mattered** section, which per contract is dropped
15
+ * entirely (heading included) when no hit carries a
16
+ * `changed_outcome` marker.
17
+ *
18
+ * The step is pure and deterministic: no I/O, no subprocess, no
19
+ * randomness. It reads `DeliveryState`, writes `state.report`,
20
+ * and always returns `SUCCESS`.
21
+ */
22
+
23
+ import type { DeliveryState} from '../../delivery_state.js';
24
+ import { type Any, Outcome, StepResult } from '../../delivery_state.js';
25
+ import { resolve_policy } from '../../persona_policy.js';
26
+
27
+ /** Report rendering is pure and always succeeds — no blocked paths. */
28
+ export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [];
29
+
30
+ /** Render the delivery report into `state.report` and return SUCCESS. */
31
+ export function run(state: DeliveryState): StepResult {
32
+ state.report = _render(state);
33
+ return new StepResult({ outcome: Outcome.SUCCESS });
34
+ }
35
+
36
+ function _render(state: DeliveryState): string {
37
+ const sections = [
38
+ _ticket_section(state),
39
+ _persona_section(state),
40
+ _plan_section(state),
41
+ _changes_section(state),
42
+ _tests_section(state),
43
+ _verify_section(state),
44
+ _visual_preview_section(state),
45
+ _memory_section(state),
46
+ _followups_section(state),
47
+ _next_commands_section(state),
48
+ ];
49
+ // Drop sections that opted out (memory-that-mattered and visual-preview
50
+ // return "" when their slice is absent — per the report schema drop-rule).
51
+ return sections.filter((section) => section).join('\n\n');
52
+ }
53
+
54
+ function _ticket_section(state: DeliveryState): string {
55
+ const ticket = state.ticket ?? {};
56
+ const ticketId = _pyTruthy(ticket.id) ? _pyStr(ticket.id) : '(no id)';
57
+ const title = _pyTruthy(ticket.title) ? _pyStr(ticket.title) : '(no title)';
58
+ return `## Ticket\n\n${ticketId} — ${title}`;
59
+ }
60
+
61
+ function _persona_section(state: DeliveryState): string {
62
+ return `## Persona\n\n${_pyTruthy(state.persona) ? _pyStr(state.persona) : '(unset)'}`;
63
+ }
64
+
65
+ function _plan_section(state: DeliveryState): string {
66
+ const body = _format_plan(state.plan);
67
+ return '## Plan\n\n' + (body || '_(no plan recorded)_');
68
+ }
69
+
70
+ /**
71
+ * Render whatever shape `state.plan` carries.
72
+ *
73
+ * Accepts a list of step strings, a list of `{title, detail}` dicts,
74
+ * or a single string — the contract doc intentionally leaves the
75
+ * plan shape loose until `feature-plan` wiring lands in a later
76
+ * phase.
77
+ */
78
+ function _format_plan(plan: Any): string {
79
+ if (!_pyTruthy(plan)) {
80
+ return '';
81
+ }
82
+ if (typeof plan === 'string') {
83
+ return _pyStrip(plan);
84
+ }
85
+ if (Array.isArray(plan)) {
86
+ const lines: string[] = [];
87
+ plan.forEach((item, i) => {
88
+ const idx = i + 1;
89
+ if (_isPlainObject(item)) {
90
+ const d = item as Record<string, unknown>;
91
+ const title = _pyTruthy(d.title) ? d.title : _pyTruthy(d.step) ? d.step : `Step ${idx}`;
92
+ const detail = _pyTruthy(d.detail) ? d.detail : _pyTruthy(d.note) ? d.note : '';
93
+ lines.push(`${idx}. **${_pyStr(title)}**` + (detail ? ` — ${_pyStr(detail)}` : ''));
94
+ } else {
95
+ lines.push(`${idx}. ${_pyStr(item)}`);
96
+ }
97
+ });
98
+ return lines.join('\n');
99
+ }
100
+ // Last resort: string-coerce an unknown shape so the renderer never
101
+ // crashes on experimental plan structures.
102
+ return _pyStr(plan);
103
+ }
104
+
105
+ function _changes_section(state: DeliveryState): string {
106
+ if (!_pyTruthy(state.changes)) {
107
+ return '## Changes\n\n_(no file changes recorded)_';
108
+ }
109
+ const lines = ['## Changes', ''];
110
+ for (const change of state.changes) {
111
+ const c = change as Record<string, unknown>;
112
+ const path = _pyTruthy(c.path) ? c.path : _pyTruthy(c.file) ? c.file : '(unknown file)';
113
+ const linesRange = _pyTruthy(c.lines) ? c.lines : _pyTruthy(c.range) ? c.range : '';
114
+ const purpose = _pyTruthy(c.purpose) ? c.purpose : _pyTruthy(c.why) ? c.why : '';
115
+ let prefix = `- \`${_pyStr(path)}\``;
116
+ if (linesRange) {
117
+ prefix += ` (${_pyStr(linesRange)})`;
118
+ }
119
+ if (purpose) {
120
+ prefix += ` — ${_pyStr(purpose)}`;
121
+ }
122
+ lines.push(prefix);
123
+ }
124
+ return lines.join('\n');
125
+ }
126
+
127
+ function _tests_section(state: DeliveryState): string {
128
+ return '## Tests\n\n' + _format_kv_block(state.tests, '_(no tests ran)_');
129
+ }
130
+
131
+ function _verify_section(state: DeliveryState): string {
132
+ return '## Verify\n\n' + _format_kv_block(state.verify, '_(no verify verdict)_');
133
+ }
134
+
135
+ /**
136
+ * R4 Phase 3: render captured preview artifacts when the skill rendered.
137
+ *
138
+ * Reads `state.ui_review.preview` (engine never renders — the
139
+ * stack-specific review skill writes the envelope). Emits a section
140
+ * only when `render_ok` is `True` AND at least one artifact path
141
+ * is present. Failed renders, skipped previews, and pre-R4 envelopes
142
+ * drop the whole section (heading included).
143
+ */
144
+ function _visual_preview_section(state: DeliveryState): string {
145
+ const ui_review = state.ui_review;
146
+ if (!_isPlainObject(ui_review)) {
147
+ return '';
148
+ }
149
+ const preview = (ui_review as Record<string, unknown>).preview;
150
+ if (!_isPlainObject(preview)) {
151
+ return '';
152
+ }
153
+ const p = preview as Record<string, unknown>;
154
+ if (p.render_ok !== true) {
155
+ return '';
156
+ }
157
+ if (_pyTruthy(p.skipped)) {
158
+ return '';
159
+ }
160
+ const screenshot = p.screenshot_path;
161
+ const domDump = p.dom_dump_path;
162
+ const lines: string[] = [];
163
+ if (typeof screenshot === 'string' && screenshot) {
164
+ lines.push(`- Screenshot: \`${screenshot}\``);
165
+ }
166
+ if (typeof domDump === 'string' && domDump) {
167
+ lines.push(`- DOM dump: \`${domDump}\``);
168
+ }
169
+ if (lines.length === 0) {
170
+ return '';
171
+ }
172
+ return ['## Visual preview', '', ...lines].join('\n');
173
+ }
174
+
175
+ /** Render **only** hits that changed an outcome (per report schema). */
176
+ function _memory_section(state: DeliveryState): string {
177
+ const influential = (state.memory || []).filter(
178
+ (hit) => _isPlainObject(hit) && _pyTruthy((hit as Record<string, unknown>).changed_outcome),
179
+ );
180
+ if (influential.length === 0) {
181
+ return ''; // drop the whole section — heading included
182
+ }
183
+ const lines = ['## Memory that mattered', ''];
184
+ for (const hit of influential) {
185
+ const h = hit as Record<string, unknown>;
186
+ const hitId = _pyTruthy(h.id) ? h.id : '(no id)';
187
+ const hitType = _pyTruthy(h.type) ? h.type : '(no type)';
188
+ const note = _pyTruthy(h.note) ? h.note : _pyTruthy(h.why) ? h.why : '';
189
+ const suffix = note ? ` — ${_pyStr(note)}` : '';
190
+ lines.push(`- \`${_pyStr(hitId)}\` (${_pyStr(hitType)})${suffix}`);
191
+ }
192
+ return lines.join('\n');
193
+ }
194
+
195
+ function _followups_section(state: DeliveryState): string {
196
+ const followups = _extract_followups(state);
197
+ if (followups.length === 0) {
198
+ return '## Follow-ups\n\n_(none)_';
199
+ }
200
+ const lines = ['## Follow-ups', ''];
201
+ for (const item of followups) {
202
+ const anchor = _pyTruthy(item.anchor) ? item.anchor : '';
203
+ const note = _pyTruthy(item.note) ? item.note : _pyTruthy(item.title) ? item.title : '(untitled)';
204
+ let prefix = `- ${_pyStr(note)}`;
205
+ if (anchor) {
206
+ prefix += ` — \`${_pyStr(anchor)}\``;
207
+ }
208
+ lines.push(prefix);
209
+ }
210
+ return lines.join('\n');
211
+ }
212
+
213
+ /** Follow-ups may live on any slice; aggregate them in reading order. */
214
+ function _extract_followups(state: DeliveryState): Array<Record<string, Any>> {
215
+ const collected: Array<Record<string, Any>> = [];
216
+ for (const source of [state.plan, state.verify, state.tests]) {
217
+ if (_isPlainObject(source)) {
218
+ const fups = (source as Record<string, unknown>).followups;
219
+ for (const item of Array.isArray(fups) ? fups : []) {
220
+ if (_isPlainObject(item)) {
221
+ collected.push(item as Record<string, Any>);
222
+ }
223
+ }
224
+ }
225
+ }
226
+ return collected;
227
+ }
228
+
229
+ function _next_commands_section(state: DeliveryState): string {
230
+ if (!resolve_policy(state.persona).suggests_next_commands) {
231
+ // Advisory personas produce a plan-only report; suggesting a
232
+ // commit or PR would mislead the reader — nothing was changed.
233
+ return '';
234
+ }
235
+ const commands = _suggest_commands(state);
236
+ const lines = ['## Suggested next commands', ''];
237
+ for (const cmd of commands) {
238
+ lines.push(`- \`${cmd}\``);
239
+ }
240
+ return lines.join('\n');
241
+ }
242
+
243
+ /** Always suggest `/commit` and `/create-pr` when verify was successful. */
244
+ function _suggest_commands(state: DeliveryState): string[] {
245
+ if (state.outcomes.verify === Outcome.SUCCESS) {
246
+ return ['/commit', '/create-pr'];
247
+ }
248
+ return ['/commit'];
249
+ }
250
+
251
+ /** Render a dict-ish slice as a bullet list; fall back to placeholder. */
252
+ function _format_kv_block(value: Any, empty_placeholder: string): string {
253
+ if (!_pyTruthy(value)) {
254
+ return empty_placeholder;
255
+ }
256
+ if (_isPlainObject(value)) {
257
+ return _render_kv_lines(Object.entries(value as Record<string, unknown>)).join('\n');
258
+ }
259
+ if (typeof value === 'string') {
260
+ return _pyStrip(value) || empty_placeholder;
261
+ }
262
+ return _pyStr(value);
263
+ }
264
+
265
+ /** Render `(key, value)` pairs as one Markdown bullet per pair. */
266
+ function _render_kv_lines(pairs: Array<[string, Any]>): string[] {
267
+ return pairs.map(([key, value]) => `- **${key}:** ${_pyStr(value)}`);
268
+ }
269
+
270
+ /** `(value or {})` style truthiness, Python semantics. */
271
+ function _pyTruthy(value: unknown): boolean {
272
+ if (value === null || value === undefined || value === false) {
273
+ return false;
274
+ }
275
+ if (value === true) {
276
+ return true;
277
+ }
278
+ if (typeof value === 'number') {
279
+ return value !== 0;
280
+ }
281
+ if (typeof value === 'string') {
282
+ return value.length !== 0;
283
+ }
284
+ if (Array.isArray(value)) {
285
+ return value.length !== 0;
286
+ }
287
+ if (value instanceof Set || value instanceof Map) {
288
+ return value.size !== 0;
289
+ }
290
+ if (typeof value === 'object') {
291
+ return Object.keys(value as Record<string, unknown>).length !== 0;
292
+ }
293
+ return true;
294
+ }
295
+
296
+ /** Python `str.strip()`. */
297
+ function _pyStrip(s: string): string {
298
+ return s.trim();
299
+ }
300
+
301
+ /** True for a dict-like value (mirrors Python `isinstance(x, dict)`). */
302
+ function _isPlainObject(value: unknown): value is Record<string, unknown> {
303
+ return (
304
+ typeof value === 'object' &&
305
+ value !== null &&
306
+ !Array.isArray(value) &&
307
+ !(value instanceof Set) &&
308
+ !(value instanceof Map)
309
+ );
310
+ }
311
+
312
+ /**
313
+ * Python `str(value)` for the scalar / container kinds the report renders.
314
+ *
315
+ * Strings render as-is; `None`/booleans use Python spelling; numbers as-is;
316
+ * dict / list use Python's `repr`-style bracketing so a `str(plan)` /
317
+ * `str(value)` fallback matches the Python output byte-for-byte.
318
+ */
319
+ function _pyStr(value: unknown): string {
320
+ if (value === null || value === undefined) {
321
+ return 'None';
322
+ }
323
+ if (value === true) {
324
+ return 'True';
325
+ }
326
+ if (value === false) {
327
+ return 'False';
328
+ }
329
+ if (typeof value === 'string') {
330
+ return value;
331
+ }
332
+ if (typeof value === 'number') {
333
+ return _pyNumber(value);
334
+ }
335
+ if (Array.isArray(value)) {
336
+ return '[' + value.map((v) => _pyReprInner(v)).join(', ') + ']';
337
+ }
338
+ if (_isPlainObject(value)) {
339
+ const parts = Object.entries(value as Record<string, unknown>).map(
340
+ ([k, v]) => `${_pyReprInner(k)}: ${_pyReprInner(v)}`,
341
+ );
342
+ return '{' + parts.join(', ') + '}';
343
+ }
344
+ return String(value);
345
+ }
346
+
347
+ /** Python `repr()` for values nested inside a `str(container)` render. */
348
+ function _pyReprInner(value: unknown): string {
349
+ if (value === null || value === undefined) {
350
+ return 'None';
351
+ }
352
+ if (value === true) {
353
+ return 'True';
354
+ }
355
+ if (value === false) {
356
+ return 'False';
357
+ }
358
+ if (typeof value === 'string') {
359
+ return `'${value}'`;
360
+ }
361
+ if (typeof value === 'number') {
362
+ return _pyNumber(value);
363
+ }
364
+ if (Array.isArray(value)) {
365
+ return '[' + value.map((v) => _pyReprInner(v)).join(', ') + ']';
366
+ }
367
+ if (_isPlainObject(value)) {
368
+ const parts = Object.entries(value as Record<string, unknown>).map(
369
+ ([k, v]) => `${_pyReprInner(k)}: ${_pyReprInner(v)}`,
370
+ );
371
+ return '{' + parts.join(', ') + '}';
372
+ }
373
+ return String(value);
374
+ }
375
+
376
+ /** Python number-to-str: integer-valued floats keep no decimal in `int` path. */
377
+ function _pyNumber(value: number): string {
378
+ return String(value);
379
+ }
@@ -0,0 +1,268 @@
1
+ /**
2
+ * `test` step — gate + Option-A delegation for running the test suite.
3
+ *
4
+ * TypeScript twin of `work_engine/directives/backend/test.py` (ADR-200
5
+ * py2ts Phase 1 — work_engine directive sets). Public API names stay
6
+ * snake_case to mirror the Python module 1:1 (per ADR-200 — Python style is
7
+ * part of the contract).
8
+ *
9
+ * The dispatcher never spawns subprocesses. Test execution is handed
10
+ * to the agent via `@agent-directive: run-tests scope=targeted`; the
11
+ * agent drives the project's test runner (pytest, Pest, phpunit, …),
12
+ * captures the verdict onto `state.tests`, marks
13
+ * `outcomes['test'] = 'success'`, and re-invokes the dispatcher.
14
+ *
15
+ * Contract for `state.tests` when populated:
16
+ *
17
+ * - Must be a dict.
18
+ * - Must carry a `verdict` key — one of `success`, `failed`,
19
+ * or `mixed` (targeted vs full-suite split). Anything else blocks.
20
+ * - `failed` or `mixed` verdicts halt with the verdict as part of
21
+ * the surfaced message so the user decides whether to continue or
22
+ * stop. This follows the `verify-before-complete` rule: a bad test
23
+ * outcome must never be silently skipped.
24
+ * - Optional keys (`targeted`, `full`, `duration_ms`,
25
+ * `followups`) feed the delivery report.
26
+ */
27
+
28
+ import type { DeliveryState} from '../../delivery_state.js';
29
+ import { type Any, Outcome, StepResult, agent_directive } from '../../delivery_state.js';
30
+ import { resolve_policy } from '../../persona_policy.js';
31
+
32
+ const _ALLOWED_VERDICTS = ['success', 'failed', 'mixed'] as const;
33
+
34
+ /** Declared ambiguity surfaces. Advisory personas skip this step entirely. */
35
+ export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
36
+ {
37
+ code: 'upstream_implement_failed',
38
+ trigger: '`implement` outcome is not `success`',
39
+ resolution: 're-run `/implement-ticket` from the start',
40
+ },
41
+ {
42
+ code: 'empty_tests_delegate',
43
+ trigger: '`state.tests` empty — test runner not invoked yet',
44
+ resolution:
45
+ 'agent directive `run-tests scope=targeted|full` → ' +
46
+ '`/tests-execute` (qa persona widens to full suite)',
47
+ },
48
+ {
49
+ code: 'malformed_tests',
50
+ trigger: '`state.tests` is not a dict or `verdict` is not one of ' + 'success / failed / mixed',
51
+ resolution: 're-run tests and record a clean verdict',
52
+ },
53
+ {
54
+ code: 'bad_test_verdict',
55
+ trigger: '`state.tests[\'verdict\']` is `failed` or `mixed`',
56
+ resolution: 'fix failures and re-run, or abort',
57
+ },
58
+ ];
59
+
60
+ /** Gate on `implement`, then either delegate or validate `state.tests`. */
61
+ export function run(state: DeliveryState): StepResult {
62
+ const policy = resolve_policy(state.persona);
63
+ if (!policy.allows_test) {
64
+ return new StepResult({
65
+ outcome: Outcome.SUCCESS,
66
+ message: `test skipped: persona \`${policy.name}\` is plan-only.`,
67
+ });
68
+ }
69
+
70
+ if (state.outcomes.implement !== Outcome.SUCCESS) {
71
+ return _blocked_on_precondition(state);
72
+ }
73
+
74
+ const tests = state.tests;
75
+ if (!_pyTruthy(tests)) {
76
+ return _delegate_to_run_tests(state, policy.widen_tests);
77
+ }
78
+
79
+ const shapeIssues = _diagnose_tests(tests);
80
+ if (shapeIssues.length > 0) {
81
+ return _blocked_on_shape(state, shapeIssues);
82
+ }
83
+
84
+ // At this point `tests` is a dict with a recognised verdict.
85
+ const verdict = (tests as Record<string, unknown>).verdict;
86
+ if (verdict !== 'success') {
87
+ return _blocked_on_bad_verdict(state, verdict);
88
+ }
89
+
90
+ return new StepResult({ outcome: Outcome.SUCCESS });
91
+ }
92
+
93
+ function _diagnose_tests(tests: Any): string[] {
94
+ if (!_isPlainObject(tests)) {
95
+ return [`state.tests must be a dict, got ${_pyTypeName(tests)}`];
96
+ }
97
+ const verdict = (tests as Record<string, unknown>).verdict;
98
+ if (!_inAllowedVerdicts(verdict)) {
99
+ return [
100
+ `state.tests['verdict'] must be one of ` +
101
+ `${_ALLOWED_VERDICTS.join(', ')}; got ${_pyRepr(verdict)}`,
102
+ ];
103
+ }
104
+ return [];
105
+ }
106
+
107
+ /**
108
+ * Emit the `run-tests` directive.
109
+ *
110
+ * `widen` comes from the persona policy (`qa` widens to the full
111
+ * suite). The directive scope becomes the first thing an orchestrator
112
+ * reads, so the widened case is visible without parsing the options.
113
+ */
114
+ function _delegate_to_run_tests(state: DeliveryState, widen: boolean): StepResult {
115
+ const ticketId = _ticketId(state);
116
+ const scope = widen ? 'full' : 'targeted';
117
+ const description = widen
118
+ ? 'full suite (qa persona widens to catch regressions outside ' + 'the changed paths)'
119
+ : 'targeted first (`--filter` on the changed paths), full ' + 'suite only if targeted passes';
120
+ return new StepResult({
121
+ outcome: Outcome.BLOCKED,
122
+ questions: [
123
+ agent_directive('run-tests', { ticket: ticketId, scope }),
124
+ `> Ticket ${ticketId} — running tests: ${description}.`,
125
+ `> 1. Continue — run ${scope} tests now`,
126
+ '> 2. Abort — skip testing (NOT recommended)',
127
+ ],
128
+ message: `Ticket ${ticketId} needs its tests run before verification.`,
129
+ });
130
+ }
131
+
132
+ function _blocked_on_precondition(state: DeliveryState): StepResult {
133
+ const ticketId = _ticketId(state);
134
+ return new StepResult({
135
+ outcome: Outcome.BLOCKED,
136
+ questions: [
137
+ `> Ticket ${ticketId} — test gate refused: ` +
138
+ '`implement` step did not complete successfully.',
139
+ '> 1. Re-run `/implement-ticket` from the start',
140
+ '> 2. Abort',
141
+ ],
142
+ message: `Ticket ${ticketId} cannot test: implement gate did not pass.`,
143
+ });
144
+ }
145
+
146
+ function _blocked_on_shape(state: DeliveryState, issues: string[]): StepResult {
147
+ const ticketId = _ticketId(state);
148
+ return new StepResult({
149
+ outcome: Outcome.BLOCKED,
150
+ questions: [
151
+ `> Ticket ${ticketId} — recorded test output is malformed: ` + issues.join('; ') + '.',
152
+ '> 1. Re-run tests and resume',
153
+ '> 2. Abort — test verdict cannot be trusted',
154
+ ],
155
+ message: `Ticket ${ticketId} tests shape invalid: ${issues.join('; ')}.`,
156
+ });
157
+ }
158
+
159
+ function _blocked_on_bad_verdict(state: DeliveryState, verdict: Any): StepResult {
160
+ const ticketId = _ticketId(state);
161
+ return new StepResult({
162
+ outcome: Outcome.BLOCKED,
163
+ questions: [
164
+ `> Ticket ${ticketId} — tests reported \`${String(verdict)}\`. ` +
165
+ 'Verification cannot proceed on a non-success verdict.',
166
+ '> 1. Fix the failing tests and re-run `run-tests`',
167
+ '> 2. Continue anyway — override (NOT recommended)',
168
+ '> 3. Abort',
169
+ ],
170
+ message: `Ticket ${ticketId} test verdict was \`${String(verdict)}\`, not success.`,
171
+ });
172
+ }
173
+
174
+ /** `(state.ticket or {}).get("id") or "(no id)"`. */
175
+ function _ticketId(state: DeliveryState): string {
176
+ const id = (state.ticket ?? {}).id;
177
+ return _pyTruthy(id) ? String(id) : '(no id)';
178
+ }
179
+
180
+ function _inAllowedVerdicts(value: unknown): boolean {
181
+ return (_ALLOWED_VERDICTS as ReadonlyArray<unknown>).includes(value);
182
+ }
183
+
184
+ /** Python truthiness for the scalar/container kinds these slices carry. */
185
+ function _pyTruthy(value: unknown): boolean {
186
+ if (value === null || value === undefined || value === false) {
187
+ return false;
188
+ }
189
+ if (value === true) {
190
+ return true;
191
+ }
192
+ if (typeof value === 'number') {
193
+ return value !== 0;
194
+ }
195
+ if (typeof value === 'string') {
196
+ return value.length !== 0;
197
+ }
198
+ if (Array.isArray(value)) {
199
+ return value.length !== 0;
200
+ }
201
+ if (value instanceof Set || value instanceof Map) {
202
+ return value.size !== 0;
203
+ }
204
+ if (typeof value === 'object') {
205
+ return Object.keys(value as Record<string, unknown>).length !== 0;
206
+ }
207
+ return true;
208
+ }
209
+
210
+ /** True for a dict-like value (mirrors Python `isinstance(x, dict)`). */
211
+ function _isPlainObject(value: unknown): value is Record<string, unknown> {
212
+ return (
213
+ typeof value === 'object' &&
214
+ value !== null &&
215
+ !Array.isArray(value) &&
216
+ !(value instanceof Set) &&
217
+ !(value instanceof Map)
218
+ );
219
+ }
220
+
221
+ /** Python `type(x).__name__` for the value kinds the diagnose paths see. */
222
+ function _pyTypeName(value: unknown): string {
223
+ if (value === null || value === undefined) {
224
+ return 'NoneType';
225
+ }
226
+ if (typeof value === 'boolean') {
227
+ return 'bool';
228
+ }
229
+ if (typeof value === 'number') {
230
+ return Number.isInteger(value) ? 'int' : 'float';
231
+ }
232
+ if (typeof value === 'string') {
233
+ return 'str';
234
+ }
235
+ if (Array.isArray(value)) {
236
+ return 'list';
237
+ }
238
+ if (value instanceof Set) {
239
+ return 'set';
240
+ }
241
+ if (value instanceof Map || _isPlainObject(value)) {
242
+ return 'dict';
243
+ }
244
+ return typeof value;
245
+ }
246
+
247
+ /**
248
+ * Python `repr()` for the verdict value kinds (`{verdict!r}`).
249
+ *
250
+ * Strings render single-quoted; `None` → `None`; booleans → `True` / `False`;
251
+ * numbers as-is. Only the kinds an invalid `verdict` slot can carry are
252
+ * covered.
253
+ */
254
+ function _pyRepr(value: unknown): string {
255
+ if (value === null || value === undefined) {
256
+ return 'None';
257
+ }
258
+ if (value === true) {
259
+ return 'True';
260
+ }
261
+ if (value === false) {
262
+ return 'False';
263
+ }
264
+ if (typeof value === 'string') {
265
+ return `'${value}'`;
266
+ }
267
+ return String(value);
268
+ }