@event4u/agent-config 16.5.0 → 17.0.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 (1026) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +2 -2
  4. package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
  5. package/CHANGELOG.md +463 -498
  6. package/CONTRIBUTING.md +47 -0
  7. package/README.md +25 -25
  8. package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
  9. package/dist/agent-src/commands/agents/init.md +66 -3
  10. package/dist/agent-src/commands/agents/user/init.md +3 -0
  11. package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
  12. package/dist/agent-src/commands/analyze/inbox.md +168 -37
  13. package/dist/agent-src/commands/analyze/pr.md +144 -0
  14. package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
  15. package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
  16. package/dist/agent-src/commands/analyze.md +28 -12
  17. package/dist/agent-src/commands/audit.md +115 -0
  18. package/dist/agent-src/commands/brand/review.md +13 -2
  19. package/dist/agent-src/commands/brand/tokens.md +3 -3
  20. package/dist/agent-src/commands/brand/voice.md +8 -5
  21. package/dist/agent-src/commands/brand.md +2 -2
  22. package/dist/agent-src/commands/challenge-me/closure.md +25 -0
  23. package/dist/agent-src/commands/design-system/import.md +8 -3
  24. package/dist/agent-src/commands/design-system/sync.md +98 -0
  25. package/dist/agent-src/commands/design-system.md +6 -1
  26. package/dist/agent-src/commands/evals/analyze.json +44 -0
  27. package/dist/agent-src/commands/evals/audit.json +12 -0
  28. package/dist/agent-src/commands/evals/retro.json +12 -0
  29. package/dist/agent-src/commands/fix/ci.md +10 -8
  30. package/dist/agent-src/commands/ghostwriter/write.md +22 -0
  31. package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
  32. package/dist/agent-src/commands/memory/propose.md +12 -0
  33. package/dist/agent-src/commands/memory.md +1 -1
  34. package/dist/agent-src/commands/optimize.md +4 -3
  35. package/dist/agent-src/commands/post-as/me.md +18 -0
  36. package/dist/agent-src/commands/pr/create.md +17 -342
  37. package/dist/agent-src/commands/pr/merge.md +129 -368
  38. package/dist/agent-src/commands/retro.md +121 -0
  39. package/dist/agent-src/commands/review/routing.md +1 -1
  40. package/dist/agent-src/commands/roadmap/next.md +4 -1
  41. package/dist/agent-src/commands/roadmap/process-full.md +46 -333
  42. package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
  43. package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
  44. package/dist/agent-src/commands/team-knowledge.md +1 -1
  45. package/dist/agent-src/commands/threat-model.md +1 -1
  46. package/dist/agent-src/commands/upstream-contribute.md +91 -101
  47. package/dist/agent-src/commands/worktree/cleanup.md +18 -11
  48. package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
  49. package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
  50. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
  51. package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
  52. package/dist/agent-src/contexts/execution/host-capability-manifest.md +6 -0
  53. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
  54. package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
  55. package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
  56. package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
  57. package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
  58. package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
  59. package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
  60. package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
  61. package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
  62. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
  63. package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
  64. package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
  65. package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
  66. package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
  67. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
  68. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
  69. package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
  70. package/dist/agent-src/contexts/model-recommendations.md +5 -5
  71. package/dist/agent-src/contexts/subagent-configuration.md +1 -1
  72. package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
  73. package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
  74. package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
  75. package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
  76. package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
  77. package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
  78. package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
  79. package/dist/agent-src/guidelines/php/api-design.md +10 -1
  80. package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
  81. package/dist/agent-src/rules/code-provenance.md +1 -1
  82. package/dist/agent-src/rules/context-hygiene.md +0 -1
  83. package/dist/agent-src/rules/design-fidelity.md +12 -13
  84. package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
  85. package/dist/agent-src/rules/fix-what-you-see.md +1 -1
  86. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
  87. package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
  88. package/dist/agent-src/rules/neighbour-precedence.md +1 -1
  89. package/dist/agent-src/rules/recurring-criticism.md +1 -1
  90. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
  91. package/dist/agent-src/rules/self-repair-loop.md +2 -2
  92. package/dist/agent-src/rules/token-budget-discipline.md +1 -1
  93. package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
  94. package/dist/agent-src/scripts/roadmap_age.ts +175 -0
  95. package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
  96. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
  97. package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
  98. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
  99. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
  100. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
  101. package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
  102. package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
  103. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
  104. package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
  105. package/dist/agent-src/skills/api-design/SKILL.md +2 -2
  106. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
  107. package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
  108. package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
  109. package/dist/agent-src/skills/brand/SKILL.md +7 -3
  110. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
  111. package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
  112. package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
  113. package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
  114. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
  115. package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
  116. package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
  117. package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
  118. package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
  119. package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
  120. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  121. package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
  122. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  123. package/dist/agent-src/skills/context-document/SKILL.md +2 -2
  124. package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
  125. package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
  126. package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
  127. package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
  128. package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
  129. package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
  130. package/dist/agent-src/skills/database/SKILL.md +5 -4
  131. package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
  132. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
  133. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
  134. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  135. package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
  136. package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
  137. package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
  138. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  139. package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
  140. package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
  141. package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
  142. package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
  143. package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
  144. package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
  145. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
  146. package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
  147. package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
  148. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
  149. package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
  150. package/dist/agent-src/skills/docker/SKILL.md +1 -1
  151. package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
  152. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
  153. package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
  154. package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
  155. package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
  156. package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
  157. package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
  158. package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
  159. package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
  160. package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
  161. package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
  162. package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
  163. package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
  164. package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
  165. package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
  166. package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
  167. package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
  168. package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
  169. package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
  170. package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
  171. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
  172. package/dist/agent-src/skills/flux/SKILL.md +1 -1
  173. package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
  174. package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
  175. package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
  176. package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
  177. package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
  178. package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
  179. package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
  180. package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
  181. package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
  182. package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
  183. package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
  184. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
  185. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
  186. package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
  187. package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
  188. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
  189. package/dist/agent-src/skills/livewire/SKILL.md +1 -1
  190. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
  191. package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
  192. package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
  193. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  194. package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
  195. package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
  196. package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
  197. package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
  198. package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
  199. package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
  200. package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
  202. package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
  203. package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
  204. package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
  205. package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
  206. package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
  207. package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
  208. package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
  209. package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
  210. package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
  211. package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
  212. package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
  213. package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
  214. package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
  215. package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
  216. package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
  217. package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
  218. package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
  219. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
  220. package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
  221. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
  222. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
  223. package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
  224. package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
  225. package/dist/agent-src/skills/release-comms/SKILL.md +2 -1
  226. package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
  227. package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
  228. package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
  229. package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
  230. package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
  231. package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
  232. package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
  233. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
  234. package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
  235. package/dist/agent-src/skills/security/SKILL.md +41 -5
  236. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
  237. package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
  238. package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
  239. package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
  240. package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
  241. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
  242. package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
  243. package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
  244. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
  245. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
  246. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
  247. package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
  248. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  249. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
  250. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
  251. package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
  252. package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
  253. package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
  254. package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
  255. package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
  256. package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
  257. package/dist/agent-src/skills/type-design/SKILL.md +196 -0
  258. package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
  259. package/dist/agent-src/skills/type-design/references/gates.md +113 -0
  260. package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
  261. package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
  262. package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
  263. package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
  264. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  265. package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
  266. package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
  267. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
  268. package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
  269. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
  270. package/dist/agent-src/templates/AGENTS.md +1 -1
  271. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  272. package/dist/agent-src/templates/agents/proposal.example.md +1 -1
  273. package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
  274. package/dist/agent-src/templates/roadmaps.md +39 -1
  275. package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
  276. package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
  277. package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
  278. package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
  279. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
  280. package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
  281. package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
  282. package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
  283. package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
  284. package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
  285. package/dist/cli/commands/uiRender.js +72 -17
  286. package/dist/cli/commands/uiRenderAsset.js +10 -2
  287. package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
  288. package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
  289. package/dist/cli/initRouting.js +1 -1
  290. package/dist/cli/mcp/dispatch.js +31 -9
  291. package/dist/cli/python/knowledge_ingest.js +7 -39
  292. package/dist/cli/python/workspace_secrets.js +4 -177
  293. package/dist/cli/registry.js +4 -1
  294. package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
  295. package/dist/cli-delegate/check_update_banner.js +635 -266
  296. package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
  297. package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-2SFOOFJJ.js} +259 -159
  298. package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
  299. package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
  300. package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-4SHNERBL.js} +37 -16
  301. package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
  302. package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
  303. package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
  304. package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
  305. package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
  306. package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
  307. package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
  308. package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
  309. package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
  310. package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
  311. package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CAL76ADI.js} +4215 -682
  312. package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
  313. package/dist/cli-delegate/chunk-E6XNBVE4.js +581 -0
  314. package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-ESUNQ5XR.js} +46 -10
  315. package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
  316. package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
  317. package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
  318. package/dist/cli-delegate/chunk-GOMILC3O.js +918 -0
  319. package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
  320. package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
  321. package/dist/cli-delegate/chunk-IROAQ77A.js +137 -0
  322. package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
  323. package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-JHMMWNJ2.js} +54 -40
  324. package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
  325. package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
  326. package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
  327. package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
  328. package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
  329. package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-SIOMDAKL.js} +980 -784
  330. package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
  331. package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
  332. package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
  333. package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
  334. package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
  335. package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
  336. package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
  337. package/dist/cli-delegate/cmd_adr_effective.js +41 -2
  338. package/dist/cli-delegate/cmd_analyze_session.js +7 -7
  339. package/dist/cli-delegate/cmd_brand_status.js +1287 -10
  340. package/dist/cli-delegate/cmd_ci_settle.js +330 -0
  341. package/dist/cli-delegate/cmd_conformance.js +483 -817
  342. package/dist/cli-delegate/cmd_doctor.js +26 -16
  343. package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
  344. package/dist/cli-delegate/cmd_explain.js +9 -24
  345. package/dist/cli-delegate/cmd_export.js +14 -11
  346. package/dist/cli-delegate/cmd_fleet.js +5 -3
  347. package/dist/cli-delegate/cmd_git_convention.js +8 -4
  348. package/dist/cli-delegate/cmd_handoff.js +79 -242
  349. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  350. package/dist/cli-delegate/cmd_memory_get.js +4 -2
  351. package/dist/cli-delegate/cmd_migrate.js +2 -2
  352. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  353. package/dist/cli-delegate/cmd_preflight.js +7 -5
  354. package/dist/cli-delegate/cmd_prune.js +16 -13
  355. package/dist/cli-delegate/cmd_route_audit.js +11 -8
  356. package/dist/cli-delegate/cmd_route_explain.js +649 -16
  357. package/dist/cli-delegate/cmd_session_recycle.js +15 -6
  358. package/dist/cli-delegate/cmd_settings_check.js +2 -2
  359. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  360. package/dist/cli-delegate/cmd_settings_migrate.js +14 -11
  361. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  362. package/dist/cli-delegate/cmd_sync.js +16 -13
  363. package/dist/cli-delegate/cmd_uninstall.js +185 -31
  364. package/dist/cli-delegate/cmd_update.js +67 -3
  365. package/dist/cli-delegate/cmd_upgrade.js +38 -7
  366. package/dist/cli-delegate/cmd_validate.js +16 -13
  367. package/dist/cli-delegate/cmd_versions.js +1 -1
  368. package/dist/cli-delegate/dashboard_mode.js +1 -1
  369. package/dist/cli-delegate/gate_execute.js +4 -3
  370. package/dist/cli-delegate/roadmap_age.js +22 -0
  371. package/dist/cli-delegate/roadmap_gates.js +4 -3
  372. package/dist/cli-delegate/update_roadmap_progress.js +3 -2
  373. package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
  374. package/dist/discovery/deprecation-report.md +1 -1
  375. package/dist/discovery/discovery-manifest.json +373 -190
  376. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  377. package/dist/discovery/discovery-manifest.summary.md +5 -5
  378. package/dist/discovery/dormancy-report.md +1 -1
  379. package/dist/discovery/orphan-report.md +1 -1
  380. package/dist/discovery/packs.json +21 -16
  381. package/dist/discovery/trust-report.md +3 -3
  382. package/dist/discovery/workspaces.json +16 -11
  383. package/dist/hooks/chat_history.chunk.cjs +6852 -0
  384. package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
  385. package/dist/hooks/dispatch.js +17506 -18692
  386. package/dist/hooks/dispatch.sha256 +1 -1
  387. package/dist/hooks/egress_engine.chunk.cjs +915 -0
  388. package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
  389. package/dist/hooks/svg_rules.chunk.cjs +281 -49
  390. package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
  391. package/dist/install/conflict.js +36 -6
  392. package/dist/install/conflictTracker.js +81 -7
  393. package/dist/install/detect.js +3 -3
  394. package/dist/install/hostPermissionsAdapter.js +106 -0
  395. package/dist/install/install.mjs +3117 -1949
  396. package/dist/install/installThinLayer.js +1 -1
  397. package/dist/install/manifestFiles.js +21 -0
  398. package/dist/install/noGoDenyRows.js +300 -0
  399. package/dist/install/noGoRules.js +368 -0
  400. package/dist/install/ownershipLedger.js +133 -0
  401. package/dist/install/plan.js +1 -1
  402. package/dist/install/preflight.js +39 -8
  403. package/dist/install/preserve.js +74 -12
  404. package/dist/install/recordedOwnership.js +88 -5
  405. package/dist/install/rule_scope.js +20 -3
  406. package/dist/install/stagedRuntime.js +455 -0
  407. package/dist/install/toolsArg.js +19 -0
  408. package/dist/install/userPin.js +47 -0
  409. package/dist/install/wizard-plan.js +26 -4
  410. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  411. package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
  412. package/dist/mcp/registry-manifest.json +6 -5
  413. package/dist/mcp/server.json +3 -3
  414. package/dist/mcp/server.mjs +9831 -5546
  415. package/dist/router.json +1 -1
  416. package/dist/scripts/_lib/agent_settings.js +7 -12
  417. package/dist/scripts/_lib/asset_render_record.js +219 -0
  418. package/dist/scripts/_lib/claude_builtin_names.js +9 -4
  419. package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
  420. package/dist/scripts/_lib/egress_rules.js +766 -0
  421. package/dist/scripts/_lib/environment_detector.js +24 -33
  422. package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
  423. package/dist/scripts/_lib/guidelines_lane.js +10 -1
  424. package/dist/scripts/_lib/identifier_redaction.js +24 -0
  425. package/dist/scripts/_lib/installed_layer.js +17 -0
  426. package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
  427. package/dist/scripts/_lib/lean_projection_mode.js +34 -152
  428. package/dist/scripts/_lib/project_tree_form.js +118 -0
  429. package/dist/scripts/_lib/scoped_projection.js +133 -3
  430. package/dist/scripts/_lib/settings_removed_keys.js +29 -0
  431. package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
  432. package/dist/scripts/_lib/subagent_native_fields.js +35 -0
  433. package/dist/scripts/_lib/svg_filled_counter.js +285 -0
  434. package/dist/scripts/_lib/svg_rules.js +2 -0
  435. package/dist/scripts/_lib/ui_surface.js +19 -0
  436. package/dist/scripts/_lib/verification_command.js +364 -0
  437. package/dist/scripts/_lib/workspace_secrets.js +229 -0
  438. package/dist/scripts/ai_council/seat_policy.js +27 -0
  439. package/dist/scripts/ai_council/transport_resolver.js +9 -10
  440. package/dist/scripts/condense.js +25 -29
  441. package/dist/server/io/substituteTemplate.js +2 -2
  442. package/dist/server/io/yamlIO.js +2 -2
  443. package/dist/server/routes/install.js +5 -1
  444. package/dist/server/routes/settings.js +2 -2
  445. package/dist/server/routes/wizard.js +1 -1
  446. package/dist/server/schemas/settings.js +22 -16
  447. package/dist/server/serverInfo.js +1 -1
  448. package/dist/shared/brandTokenDocument.js +47 -0
  449. package/dist/shared/brandTokenPaths.js +43 -0
  450. package/dist/shared/settingsCarveOut.js +0 -7
  451. package/dist/shared/skillRanking.js +103 -5
  452. package/dist/shared/userMd/formAdapter.js +16 -0
  453. package/dist/shared/userMd/schema.js +17 -0
  454. package/dist/ui/assets/index-w70Ado09.js +23 -0
  455. package/dist/ui/index.html +1 -1
  456. package/docs/MIGRATION.md +89 -2
  457. package/docs/THIRD-PARTY-NOTICES.md +27 -0
  458. package/docs/contracts/settings-classes.md +27 -9
  459. package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
  460. package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
  461. package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
  462. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
  463. package/docs/guidelines/design-antipatterns.md +5 -0
  464. package/docs/guidelines/design-asset-discipline.md +17 -0
  465. package/docs/guidelines/design-fidelity-routing.md +1 -0
  466. package/docs/guidelines/php/api-design.md +10 -1
  467. package/llms.txt +12 -10
  468. package/package.json +13 -4
  469. package/src/agent-src/scripts/dashboard_mode.ts +4 -1
  470. package/src/agent-src/scripts/roadmap_age.ts +175 -0
  471. package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
  472. package/src/agent-src/templates/AGENTS.md +1 -1
  473. package/src/agent-src/templates/scripts/check_memory.ts +2 -2
  474. package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
  475. package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
  476. package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
  477. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
  478. package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
  479. package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
  480. package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
  481. package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
  482. package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
  483. package/src/config/agent-settings.template.yml +120 -57
  484. package/src/config/agents-paths.yml +13 -7
  485. package/src/config/ci-local-parity.yml +44 -0
  486. package/src/config/continuity-surface.json +51 -2
  487. package/src/config/depth-audit-samples.json +5 -0
  488. package/src/config/discovery/command-verbs.yml +1 -0
  489. package/src/config/dispatch-economy-metrics.json +1 -0
  490. package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
  491. package/src/config/egress-mutations/credential-token-restores.json +7 -0
  492. package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
  493. package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
  494. package/src/config/evaluator-budgets.json +4 -4
  495. package/src/config/gate-coverage.yml +149 -3
  496. package/src/config/gate-reachability-exemptions.json +3 -5
  497. package/src/config/gate-violation-baselines.json +26 -22
  498. package/src/config/gitignore-block.txt +6 -3
  499. package/src/config/hook-bundle-budget.json +34 -3
  500. package/src/config/hook-carrier-probes.json +30 -0
  501. package/src/config/hook-latency-budget.json +4 -2
  502. package/src/config/host-injection-effect.json +8 -1
  503. package/src/config/host-skill-frontmatter-keys.json +56 -0
  504. package/src/config/layer-form-brakes.json +4 -0
  505. package/src/config/layer-form-comparison-corpus.json +42 -0
  506. package/src/config/loop-surfaces.yaml +28 -47
  507. package/src/config/memory-twin-verdicts.yml +9 -1
  508. package/src/config/metric-registry.yml +40 -3
  509. package/src/config/pack-size-budget.json +15 -0
  510. package/src/config/procedure-core-budget.json +21 -0
  511. package/src/config/profiles/minimal.ini +1 -1
  512. package/src/config/project-tree-form.json +24 -0
  513. package/src/config/reach-channels.yml +3 -3
  514. package/src/config/reach-prescriptions-intake.yml +1 -1
  515. package/src/config/roadmap-step-size-baseline.json +118 -0
  516. package/src/config/routing-coverage-seed.json +93 -2
  517. package/src/config/skill-body-budget.json +686 -0
  518. package/src/config/skill-fork-pilot.json +17 -0
  519. package/src/config/skill-lifecycle-probes-codex.json +57 -0
  520. package/src/config/skill-lifecycle-probes.json +57 -0
  521. package/src/config/skill-output-shape.json +316 -0
  522. package/src/config/step-depth-table.json +58 -0
  523. package/src/config/turnaround-budget.json +90 -0
  524. package/src/install/conflict.ts +38 -6
  525. package/src/install/conflictTracker.ts +126 -8
  526. package/src/install/detect.ts +3 -3
  527. package/src/install/hostPermissionsAdapter.ts +136 -0
  528. package/src/install/installThinLayer.ts +6 -1
  529. package/src/install/manifestFiles.ts +24 -0
  530. package/src/install/noGoDenyRows.ts +368 -0
  531. package/src/install/noGoRules.ts +438 -0
  532. package/src/install/ownershipLedger.ts +180 -0
  533. package/src/install/plan.ts +1 -1
  534. package/src/install/preflight.ts +42 -10
  535. package/src/install/preserve.ts +94 -12
  536. package/src/install/recordedOwnership.ts +121 -3
  537. package/src/install/rule_scope.ts +20 -3
  538. package/src/install/stagedRuntime.ts +528 -0
  539. package/src/install/toolsArg.ts +16 -0
  540. package/src/install/types.ts +23 -2
  541. package/src/install/userPin.ts +54 -0
  542. package/src/install/wizard-plan.ts +25 -4
  543. package/src/scripts/_cli/_doctor_emit.ts +24 -0
  544. package/src/scripts/_cli/cmd_brand_status.ts +223 -12
  545. package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
  546. package/src/scripts/_cli/cmd_doctor.ts +23 -44
  547. package/src/scripts/_cli/cmd_route_explain.ts +176 -2
  548. package/src/scripts/_cli/cmd_uninstall.ts +270 -26
  549. package/src/scripts/_cli/cmd_update.ts +34 -1
  550. package/src/scripts/_cli/cmd_upgrade.ts +38 -2
  551. package/src/scripts/_cli/detection_report.ts +7 -0
  552. package/src/scripts/_cli/doctor_execution.ts +1 -2
  553. package/src/scripts/_cli/doctor_install_mode.ts +39 -0
  554. package/src/scripts/_cli/doctor_network_posture.ts +3 -3
  555. package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
  556. package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
  557. package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
  558. package/src/scripts/_cli/upgrade_unattended.ts +548 -0
  559. package/src/scripts/_dispatch.bash +42 -9
  560. package/src/scripts/_lib/activation_ladder.ts +1 -1
  561. package/src/scripts/_lib/advisory_inventory.ts +405 -0
  562. package/src/scripts/_lib/advisory_notice.ts +270 -0
  563. package/src/scripts/_lib/advisory_sources.ts +752 -0
  564. package/src/scripts/_lib/advisory_verdicts.ts +363 -0
  565. package/src/scripts/_lib/agent_artifact_location.ts +177 -0
  566. package/src/scripts/_lib/agent_settings.ts +7 -12
  567. package/src/scripts/_lib/arrival_record.ts +217 -0
  568. package/src/scripts/_lib/asset_render_record.ts +247 -0
  569. package/src/scripts/_lib/billing_grant.ts +4 -2
  570. package/src/scripts/_lib/brand_voice_slot.ts +258 -0
  571. package/src/scripts/_lib/canary_status.ts +24 -0
  572. package/src/scripts/_lib/cc_transcript.ts +276 -0
  573. package/src/scripts/_lib/changelog_eras.ts +83 -0
  574. package/src/scripts/_lib/claim_phrases.ts +71 -0
  575. package/src/scripts/_lib/classify_update.ts +171 -0
  576. package/src/scripts/_lib/claude_builtin_names.ts +9 -4
  577. package/src/scripts/_lib/claude_hook_scope.ts +195 -0
  578. package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
  579. package/src/scripts/_lib/codex_resident_set.ts +460 -0
  580. package/src/scripts/_lib/codex_skill_finder.ts +225 -0
  581. package/src/scripts/_lib/confusables.ts +19 -0
  582. package/src/scripts/_lib/consumer_impact.ts +199 -0
  583. package/src/scripts/_lib/content_class.ts +127 -0
  584. package/src/scripts/_lib/counted_probe.ts +68 -1
  585. package/src/scripts/_lib/credential_deny_rows.ts +151 -0
  586. package/src/scripts/_lib/credential_files.ts +367 -0
  587. package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
  588. package/src/scripts/_lib/depth_flip.ts +141 -0
  589. package/src/scripts/_lib/design_lock.ts +117 -0
  590. package/src/scripts/_lib/design_sync_ledger.ts +142 -0
  591. package/src/scripts/_lib/design_sync_plan.ts +177 -0
  592. package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
  593. package/src/scripts/_lib/design_sync_verify.ts +99 -0
  594. package/src/scripts/_lib/design_system_claude_design.ts +323 -0
  595. package/src/scripts/_lib/design_system_import.ts +84 -6
  596. package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
  597. package/src/scripts/_lib/egress_credential_env.ts +35 -0
  598. package/src/scripts/_lib/egress_engine.ts +22 -0
  599. package/src/scripts/_lib/egress_known_values.ts +223 -0
  600. package/src/scripts/_lib/egress_normalize.ts +67 -0
  601. package/src/scripts/_lib/egress_prefixes.ts +42 -0
  602. package/src/scripts/_lib/egress_rules.ts +896 -0
  603. package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
  604. package/src/scripts/_lib/egress_sender_scan.ts +290 -0
  605. package/src/scripts/_lib/egress_session_table.ts +510 -0
  606. package/src/scripts/_lib/egress_text.ts +63 -0
  607. package/src/scripts/_lib/egress_token.ts +252 -0
  608. package/src/scripts/_lib/empty_cycles.ts +1 -1
  609. package/src/scripts/_lib/environment_detector.ts +45 -30
  610. package/src/scripts/_lib/exemption_shape.ts +75 -1
  611. package/src/scripts/_lib/floor_posture.ts +185 -0
  612. package/src/scripts/_lib/forge_protection.ts +140 -2
  613. package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
  614. package/src/scripts/_lib/guidelines_lane.ts +12 -1
  615. package/src/scripts/_lib/hand_kinds.ts +65 -0
  616. package/src/scripts/_lib/headless_invocation.ts +3 -3
  617. package/src/scripts/_lib/host_capability.ts +34 -2
  618. package/src/scripts/_lib/host_env_write.ts +39 -18
  619. package/src/scripts/_lib/host_listing_model.ts +14 -7
  620. package/src/scripts/_lib/identifier_redaction.ts +26 -0
  621. package/src/scripts/_lib/impact_bump.ts +70 -0
  622. package/src/scripts/_lib/install_reach_checks.ts +53 -1
  623. package/src/scripts/_lib/installed_layer.ts +31 -0
  624. package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
  625. package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
  626. package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
  627. package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
  628. package/src/scripts/_lib/layer_form_corpus.ts +165 -0
  629. package/src/scripts/_lib/layer_form_decision.ts +248 -0
  630. package/src/scripts/_lib/layer_form_evidence.ts +112 -0
  631. package/src/scripts/_lib/lean_projection_mode.ts +32 -161
  632. package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
  633. package/src/scripts/_lib/loop_guards.ts +8 -120
  634. package/src/scripts/_lib/major_surface.ts +207 -0
  635. package/src/scripts/_lib/mcp_bridge.ts +30 -69
  636. package/src/scripts/_lib/merge_clearance_record.ts +384 -0
  637. package/src/scripts/_lib/neighbour_census.ts +18 -1
  638. package/src/scripts/_lib/orchestration_record.ts +61 -0
  639. package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
  640. package/src/scripts/_lib/pin_advice.ts +49 -0
  641. package/src/scripts/_lib/platform_anchor.ts +222 -0
  642. package/src/scripts/_lib/procedure_checks.ts +5 -0
  643. package/src/scripts/_lib/project_tree_form.ts +134 -0
  644. package/src/scripts/_lib/projection_key_migration.ts +122 -0
  645. package/src/scripts/_lib/prompt_shape.ts +13 -2
  646. package/src/scripts/_lib/provenance_verify.ts +272 -0
  647. package/src/scripts/_lib/quota_parked.ts +27 -1
  648. package/src/scripts/_lib/ratification_artifact.ts +64 -1
  649. package/src/scripts/_lib/ratification_subject.ts +508 -46
  650. package/src/scripts/_lib/release_findings_ingest.ts +52 -5
  651. package/src/scripts/_lib/release_highlights.ts +72 -2
  652. package/src/scripts/_lib/release_settings_surface.ts +392 -0
  653. package/src/scripts/_lib/review_round.ts +134 -0
  654. package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
  655. package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
  656. package/src/scripts/_lib/roadmap_step_size.ts +75 -0
  657. package/src/scripts/_lib/run_checkpoint.ts +60 -3
  658. package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
  659. package/src/scripts/_lib/scope_guard.sh +64 -5
  660. package/src/scripts/_lib/scoped_projection.ts +136 -3
  661. package/src/scripts/_lib/secret_detector.ts +24 -103
  662. package/src/scripts/_lib/security_fix.ts +429 -0
  663. package/src/scripts/_lib/security_fix_context.ts +133 -0
  664. package/src/scripts/_lib/self_repair.ts +69 -39
  665. package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
  666. package/src/scripts/_lib/self_repair_payload.ts +86 -0
  667. package/src/scripts/_lib/session_eol.ts +3 -0
  668. package/src/scripts/_lib/session_pr_watch.ts +207 -0
  669. package/src/scripts/_lib/session_register.ts +51 -1
  670. package/src/scripts/_lib/session_tag.ts +51 -0
  671. package/src/scripts/_lib/settings_removed_keys.ts +30 -0
  672. package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
  673. package/src/scripts/_lib/skill_catalogue.ts +66 -25
  674. package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
  675. package/src/scripts/_lib/skill_leases.ts +203 -0
  676. package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
  677. package/src/scripts/_lib/skill_materialisation.ts +388 -0
  678. package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
  679. package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
  680. package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
  681. package/src/scripts/_lib/skill_origin.ts +21 -1
  682. package/src/scripts/_lib/skill_reach.ts +342 -0
  683. package/src/scripts/_lib/source_shape.ts +7 -2
  684. package/src/scripts/_lib/sqlite_guard.ts +1 -1
  685. package/src/scripts/_lib/step_anatomy.ts +330 -0
  686. package/src/scripts/_lib/subagent_capsule.ts +8 -2
  687. package/src/scripts/_lib/subagent_native_fields.ts +30 -0
  688. package/src/scripts/_lib/subagent_spawn.ts +36 -0
  689. package/src/scripts/_lib/subagent_steering.ts +367 -0
  690. package/src/scripts/_lib/svg_filled_counter.ts +287 -0
  691. package/src/scripts/_lib/svg_rules.ts +2 -0
  692. package/src/scripts/_lib/test_delta.ts +89 -6
  693. package/src/scripts/_lib/tier_downshift_verdict.ts +222 -0
  694. package/src/scripts/_lib/tool_result_census.ts +62 -0
  695. package/src/scripts/_lib/trigger_routers.ts +1 -0
  696. package/src/scripts/_lib/turnaround_throughput.ts +378 -0
  697. package/src/scripts/_lib/ui_surface.ts +22 -0
  698. package/src/scripts/_lib/unattended_gates.ts +100 -0
  699. package/src/scripts/_lib/undeployed_fixes.ts +34 -0
  700. package/src/scripts/_lib/update_check.ts +143 -12
  701. package/src/scripts/_lib/update_invite.ts +116 -0
  702. package/src/scripts/_lib/update_notice.ts +259 -0
  703. package/src/scripts/_lib/verify_clause.ts +4 -2
  704. package/src/scripts/_lib/version_order.ts +146 -0
  705. package/src/scripts/_lib/worker_reuse.ts +191 -0
  706. package/src/scripts/_lib/workspace_secrets.ts +273 -0
  707. package/src/scripts/_lib/worktree_git.ts +67 -0
  708. package/src/scripts/_lib/worktree_ignored.ts +116 -0
  709. package/src/scripts/adoption_status.ts +330 -3
  710. package/src/scripts/adr_cite_check.ts +93 -0
  711. package/src/scripts/advisories.ts +803 -0
  712. package/src/scripts/ai-image/adapters/flux.sh +1 -0
  713. package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
  714. package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
  715. package/src/scripts/ai-image/adapters/recraft.sh +1 -0
  716. package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
  717. package/src/scripts/ai-video/adapters/fal.sh +1 -0
  718. package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
  719. package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
  720. package/src/scripts/ai-video/adapters/kling.sh +1 -0
  721. package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
  722. package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
  723. package/src/scripts/ai-video/adapters/replicate.sh +1 -0
  724. package/src/scripts/ai-video/adapters/sora.sh +1 -0
  725. package/src/scripts/ai-video/adapters/syncso.sh +1 -0
  726. package/src/scripts/ai-video/stitch.sh +115 -2
  727. package/src/scripts/ai_council/airgap.ts +1 -0
  728. package/src/scripts/ai_council/api_transport.ts +27 -4
  729. package/src/scripts/ai_council/budget_guard.ts +300 -11
  730. package/src/scripts/ai_council/bundler.ts +20 -29
  731. package/src/scripts/ai_council/chairman.ts +17 -2
  732. package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
  733. package/src/scripts/ai_council/cli_launch_env.ts +54 -0
  734. package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
  735. package/src/scripts/ai_council/clients.ts +55 -73
  736. package/src/scripts/ai_council/config.ts +16 -22
  737. package/src/scripts/ai_council/council_egress.ts +167 -0
  738. package/src/scripts/ai_council/exposure_ledger.ts +117 -0
  739. package/src/scripts/ai_council/free_hand_shadow.ts +276 -0
  740. package/src/scripts/ai_council/free_route.ts +216 -0
  741. package/src/scripts/ai_council/free_route_catalog.ts +173 -0
  742. package/src/scripts/ai_council/free_route_client.ts +95 -0
  743. package/src/scripts/ai_council/free_rung.ts +61 -0
  744. package/src/scripts/ai_council/hand_payload.ts +230 -0
  745. package/src/scripts/ai_council/hand_schemas.ts +123 -0
  746. package/src/scripts/ai_council/jury_aggregate.ts +155 -1
  747. package/src/scripts/ai_council/kind_flip.ts +221 -0
  748. package/src/scripts/ai_council/kind_flip_state.ts +19 -0
  749. package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
  750. package/src/scripts/ai_council/modification_review.ts +98 -5
  751. package/src/scripts/ai_council/necessity.ts +7 -0
  752. package/src/scripts/ai_council/orchestrator.ts +16 -16
  753. package/src/scripts/ai_council/pricing.ts +10 -0
  754. package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
  755. package/src/scripts/ai_council/response_render.ts +27 -4
  756. package/src/scripts/ai_council/round_reservations.ts +119 -0
  757. package/src/scripts/ai_council/route_chooser.ts +161 -0
  758. package/src/scripts/ai_council/route_liveness.ts +152 -0
  759. package/src/scripts/ai_council/route_member.ts +52 -0
  760. package/src/scripts/ai_council/seat_policy.ts +40 -0
  761. package/src/scripts/ai_council/seat_resume.ts +40 -0
  762. package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
  763. package/src/scripts/ai_council/spend_gate.ts +18 -2
  764. package/src/scripts/ai_council/status_surface.ts +37 -0
  765. package/src/scripts/ai_council/transport_resolver.ts +15 -18
  766. package/src/scripts/analysis_analysts.ts +226 -0
  767. package/src/scripts/analysis_anchors.ts +140 -0
  768. package/src/scripts/analysis_and_optimize.ts +44 -0
  769. package/src/scripts/analysis_emit.ts +150 -0
  770. package/src/scripts/analysis_exchange.ts +186 -0
  771. package/src/scripts/analysis_gate.ts +158 -0
  772. package/src/scripts/analysis_inbox_final.ts +173 -0
  773. package/src/scripts/analysis_ledger.ts +119 -0
  774. package/src/scripts/analysis_pr_optimize.ts +219 -0
  775. package/src/scripts/analysis_pr_review.ts +240 -0
  776. package/src/scripts/analysis_pr_target.ts +121 -0
  777. package/src/scripts/analysis_prompts.ts +130 -0
  778. package/src/scripts/analysis_publish.ts +358 -0
  779. package/src/scripts/analysis_questions.ts +78 -0
  780. package/src/scripts/analysis_run.ts +248 -0
  781. package/src/scripts/analysis_run_record.ts +210 -0
  782. package/src/scripts/analysis_target.ts +343 -0
  783. package/src/scripts/analysis_validate.ts +161 -0
  784. package/src/scripts/anchor_eval_falsify.ts +1 -1
  785. package/src/scripts/arrival_report.ts +115 -0
  786. package/src/scripts/ask_transport.ts +284 -35
  787. package/src/scripts/backfill_model_tier.ts +4 -5
  788. package/src/scripts/before_complete_hook.ts +48 -2
  789. package/src/scripts/bench_hook_latency.ts +3 -3
  790. package/src/scripts/bench_procedure_cursor.ts +440 -0
  791. package/src/scripts/bootstrap.sh +3 -3
  792. package/src/scripts/build_exit_code_register.ts +440 -0
  793. package/src/scripts/build_proof.ts +23 -1
  794. package/src/scripts/cache_realization_report.ts +155 -14
  795. package/src/scripts/canary_liveness.ts +117 -0
  796. package/src/scripts/chat_history.ts +12 -15
  797. package/src/scripts/check_account_surface.ts +318 -0
  798. package/src/scripts/check_agent_artifact_location.ts +17 -160
  799. package/src/scripts/check_bundle_path_leakage.ts +6 -0
  800. package/src/scripts/check_ci_local_parity.ts +21 -13
  801. package/src/scripts/check_claims.ts +77 -2
  802. package/src/scripts/check_completion_review.ts +34 -1
  803. package/src/scripts/check_concern_admissions.ts +41 -5
  804. package/src/scripts/check_consumer_scope_flip.ts +1 -1
  805. package/src/scripts/check_context_paths.ts +2 -0
  806. package/src/scripts/check_council_layout.ts +9 -0
  807. package/src/scripts/check_credential_spelling.ts +267 -0
  808. package/src/scripts/check_egress_mutations.ts +239 -0
  809. package/src/scripts/check_enforcement_coverage.ts +16 -3
  810. package/src/scripts/check_estate_count.ts +16 -1
  811. package/src/scripts/check_finding_dispositions.ts +147 -0
  812. package/src/scripts/check_gate_coverage.ts +123 -21
  813. package/src/scripts/check_gate_reachability.ts +16 -2
  814. package/src/scripts/check_generator_sync.ts +46 -0
  815. package/src/scripts/check_hook_bundle_composition.ts +139 -1
  816. package/src/scripts/check_host_docs_digest.ts +142 -5
  817. package/src/scripts/check_kernel_edit_ratified.ts +301 -76
  818. package/src/scripts/check_kernel_rule_bundle.ts +14 -10
  819. package/src/scripts/check_knowledge_cards.ts +83 -3
  820. package/src/scripts/check_memory.ts +13 -3
  821. package/src/scripts/check_pack_size.ts +1 -1
  822. package/src/scripts/check_permission_deny_syntax.ts +247 -0
  823. package/src/scripts/check_platform_anchor.ts +243 -0
  824. package/src/scripts/check_proposal.ts +183 -1
  825. package/src/scripts/check_reach_channels.ts +5 -3
  826. package/src/scripts/check_references.ts +5 -2
  827. package/src/scripts/check_release_manifest_content.ts +33 -0
  828. package/src/scripts/check_release_pr_shape.ts +5 -0
  829. package/src/scripts/check_rule_invariants.ts +9 -1
  830. package/src/scripts/check_skill_body_budget.ts +343 -0
  831. package/src/scripts/check_skill_requires.ts +137 -1
  832. package/src/scripts/check_step_receipts.ts +246 -0
  833. package/src/scripts/check_structural_breaking.ts +7 -1
  834. package/src/scripts/check_suppression_hygiene.ts +8 -0
  835. package/src/scripts/check_test_weakening.ts +14 -0
  836. package/src/scripts/check_token_quality_golden.ts +5 -1
  837. package/src/scripts/check_update_banner.ts +50 -3
  838. package/src/scripts/check_verify_expectation_delta.ts +2 -1
  839. package/src/scripts/check_voice_lexicon.ts +531 -0
  840. package/src/scripts/ci_os_attribution.ts +327 -0
  841. package/src/scripts/ci_platform_scope.ts +69 -0
  842. package/src/scripts/ci_settle.ts +4 -1
  843. package/src/scripts/ci_status.ts +0 -1
  844. package/src/scripts/ci_time_to_green.ts +748 -0
  845. package/src/scripts/classify_merge_risk.ts +407 -19
  846. package/src/scripts/code_graph/sqlite_store.ts +1 -1
  847. package/src/scripts/compile_trigger_evals.ts +353 -0
  848. package/src/scripts/condense.ts +25 -31
  849. package/src/scripts/consumer_matrix.ts +61 -3
  850. package/src/scripts/council_availability_hook.ts +12 -4
  851. package/src/scripts/council_cli.ts +48 -38
  852. package/src/scripts/cross_repo_retrieve.ts +9 -72
  853. package/src/scripts/design_lock.ts +106 -0
  854. package/src/scripts/design_slop_rules.ts +30 -0
  855. package/src/scripts/design_sync.ts +264 -0
  856. package/src/scripts/design_system_import.ts +30 -13
  857. package/src/scripts/dispatch_economy_report.ts +46 -1
  858. package/src/scripts/dispatch_r2_reviewer.ts +41 -5
  859. package/src/scripts/egress_canary.ts +166 -0
  860. package/src/scripts/egress_sender_census.ts +101 -0
  861. package/src/scripts/external_sources_denylist.json +94 -12
  862. package/src/scripts/generate_catalog.ts +6 -2
  863. package/src/scripts/generate_owned_digest.ts +163 -0
  864. package/src/scripts/generate_reference_toc.ts +143 -0
  865. package/src/scripts/generate_subagent_floor.ts +11 -1
  866. package/src/scripts/handoff_context_hook.ts +34 -0
  867. package/src/scripts/hook_carrier_census.ts +263 -0
  868. package/src/scripts/hook_chunks.d.mts +12 -0
  869. package/src/scripts/hook_chunks.mjs +114 -0
  870. package/src/scripts/hook_manifest.json +1 -1
  871. package/src/scripts/hook_manifest.yaml +65 -42
  872. package/src/scripts/hooks/block_config_weakening.ts +127 -3
  873. package/src/scripts/hooks/block_credential_reads.ts +165 -0
  874. package/src/scripts/hooks/block_no_verify.ts +47 -23
  875. package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
  876. package/src/scripts/hooks/category_a.ts +202 -25
  877. package/src/scripts/hooks/concern_failure_policy.ts +6 -6
  878. package/src/scripts/hooks/concern_registry.ts +31 -6
  879. package/src/scripts/hooks/concern_registry_types.ts +11 -0
  880. package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
  881. package/src/scripts/hooks/design_pass_hook.ts +42 -10
  882. package/src/scripts/hooks/dispatch_hook.ts +13 -12
  883. package/src/scripts/hooks/egress_engine_loader.ts +125 -0
  884. package/src/scripts/hooks/egress_stage.ts +440 -0
  885. package/src/scripts/hooks/hook_stdin.ts +29 -4
  886. package/src/scripts/hooks/host_docs_pages.ts +194 -0
  887. package/src/scripts/hooks/host_docs_pages.yaml +75 -0
  888. package/src/scripts/hooks/host_lowering.json +1 -1
  889. package/src/scripts/hooks/host_lowering.yaml +22 -21
  890. package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
  891. package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
  892. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
  893. package/src/scripts/hooks/lazy_concern.ts +148 -0
  894. package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
  895. package/src/scripts/hooks/payload_stub.ts +16 -6
  896. package/src/scripts/hooks/permission_gate.ts +7 -7
  897. package/src/scripts/hooks/push_settle_hook.ts +32 -3
  898. package/src/scripts/hooks/replay_hook.ts +43 -0
  899. package/src/scripts/hooks/reread_guard_hook.ts +87 -10
  900. package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
  901. package/src/scripts/hooks/rule_inject_hook.ts +8 -1
  902. package/src/scripts/hooks/session_eol_hook.ts +48 -1
  903. package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
  904. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +203 -10
  905. package/src/scripts/hooks/state_io.ts +2 -2
  906. package/src/scripts/hooks/svg_obligation.ts +75 -19
  907. package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
  908. package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
  909. package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
  910. package/src/scripts/hooks_doctor.ts +31 -0
  911. package/src/scripts/hooks_status.ts +58 -3
  912. package/src/scripts/inbox_source_census.ts +74 -13
  913. package/src/scripts/install +25 -3
  914. package/src/scripts/install.ts +60 -91
  915. package/src/scripts/interruption_report.ts +11 -1
  916. package/src/scripts/layer_baseline_report.ts +267 -0
  917. package/src/scripts/learning_sidecar.ts +1 -1
  918. package/src/scripts/lint_agents_layout.ts +3 -0
  919. package/src/scripts/lint_blocker_citations.ts +104 -0
  920. package/src/scripts/lint_breaking_changes_index.ts +40 -7
  921. package/src/scripts/lint_consolidation_lineage.ts +144 -16
  922. package/src/scripts/lint_consumer_internal_refs.ts +90 -42
  923. package/src/scripts/lint_context_spine_usage.ts +21 -0
  924. package/src/scripts/lint_design_antipattern_parity.ts +39 -7
  925. package/src/scripts/lint_evidence_artifacts.ts +31 -0
  926. package/src/scripts/lint_example_fences.ts +11 -2
  927. package/src/scripts/lint_ghostwriter_source.ts +42 -10
  928. package/src/scripts/lint_hook_manifest.ts +94 -0
  929. package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
  930. package/src/scripts/lint_mcp_config_security.ts +9 -11
  931. package/src/scripts/lint_plan_risk_register.ts +28 -1
  932. package/src/scripts/lint_positioning.ts +4 -4
  933. package/src/scripts/lint_provenance.ts +1 -0
  934. package/src/scripts/lint_roadmap_blockers.ts +65 -4
  935. package/src/scripts/lint_roadmap_complexity.ts +98 -0
  936. package/src/scripts/lint_skill_link_reach.ts +251 -9
  937. package/src/scripts/lint_skill_procedures.ts +252 -0
  938. package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
  939. package/src/scripts/lint_subagent_determinism.ts +14 -1
  940. package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
  941. package/src/scripts/mcp_registry_submit.sh +2 -2
  942. package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
  943. package/src/scripts/mcp_server/suggest_skill.ts +89 -4
  944. package/src/scripts/mcp_server/tools.ts +2 -33
  945. package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
  946. package/src/scripts/measure_turn_end_gate.ts +61 -1
  947. package/src/scripts/merge_clearance.ts +225 -0
  948. package/src/scripts/migrate_command_suggestions.ts +1 -1
  949. package/src/scripts/network_sources.ts +236 -0
  950. package/src/scripts/no_go_deny_rows.ts +225 -0
  951. package/src/scripts/orchestration_record.ts +15 -2
  952. package/src/scripts/plan_test_shards.ts +103 -0
  953. package/src/scripts/pr_url_reminder_hook.ts +10 -0
  954. package/src/scripts/print_required_checks.ts +5 -5
  955. package/src/scripts/probe_depth_shadow.ts +406 -0
  956. package/src/scripts/probe_turnaround.ts +342 -10
  957. package/src/scripts/ratification_subject.ts +176 -0
  958. package/src/scripts/rdp_gate_classify.ts +1 -0
  959. package/src/scripts/rdp_quality_eval.ts +1 -0
  960. package/src/scripts/release.ts +26 -55
  961. package/src/scripts/release_drill.ts +52 -23
  962. package/src/scripts/release_env.ts +37 -0
  963. package/src/scripts/release_publication.ts +11 -1
  964. package/src/scripts/report_consumer_gate_reach.ts +233 -0
  965. package/src/scripts/report_merge_gate_load.ts +295 -0
  966. package/src/scripts/report_project_contract.ts +123 -0
  967. package/src/scripts/report_reducible_classes.ts +342 -0
  968. package/src/scripts/report_required_checks_drift.ts +5 -3
  969. package/src/scripts/report_skill_host_census.ts +199 -0
  970. package/src/scripts/report_standing_payload_by_host.ts +7 -7
  971. package/src/scripts/retro.ts +758 -0
  972. package/src/scripts/retro_facts.ts +575 -0
  973. package/src/scripts/retro_queue.ts +739 -0
  974. package/src/scripts/retro_session_facts.ts +218 -0
  975. package/src/scripts/retro_sweep.ts +493 -0
  976. package/src/scripts/retro_triage.ts +126 -0
  977. package/src/scripts/roadmap_context.ts +2 -2
  978. package/src/scripts/roadmap_drain_queue.ts +601 -0
  979. package/src/scripts/run_supervise.ts +24 -2
  980. package/src/scripts/schemas/agent-settings.schema.json +0 -16
  981. package/src/scripts/schemas/command.schema.json +3 -3
  982. package/src/scripts/schemas/review-findings.schema.json +8 -0
  983. package/src/scripts/schemas/skill.schema.json +7 -6
  984. package/src/scripts/schemas/subagent.schema.json +33 -2
  985. package/src/scripts/score_skill_selection.ts +5 -2
  986. package/src/scripts/second_brain_retrieval.ts +1 -0
  987. package/src/scripts/second_brain_run.ts +1 -0
  988. package/src/scripts/self_repair_cli.ts +563 -87
  989. package/src/scripts/self_review_gate.ts +59 -4
  990. package/src/scripts/session_register_hook.ts +91 -4
  991. package/src/scripts/sessions_cli.ts +100 -5
  992. package/src/scripts/skill_collision_clusters.ts +1 -1
  993. package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
  994. package/src/scripts/skill_trigger_eval.ts +4 -2
  995. package/src/scripts/source_adapters.ts +183 -0
  996. package/src/scripts/step_receipt.ts +100 -0
  997. package/src/scripts/sync_pr_branch.ts +4 -0
  998. package/src/scripts/test_council_qualification.ts +1 -1
  999. package/src/scripts/trigger_eval_grandfather.json +3 -49
  1000. package/src/scripts/trigger_eval_rotation.ts +31 -3
  1001. package/src/scripts/ui_conformance_probe.ts +405 -1
  1002. package/src/scripts/update_counts.ts +230 -11
  1003. package/src/scripts/update_invite_hook.ts +245 -0
  1004. package/src/scripts/update_notice_hook.ts +298 -0
  1005. package/src/scripts/validate_frontmatter.ts +85 -0
  1006. package/src/scripts/worker_reuse_shadow_report.ts +121 -0
  1007. package/src/scripts/worktree_cleanup_check.ts +915 -121
  1008. package/src/server/io/yamlIO.ts +2 -2
  1009. package/src/server/schemas/settings.ts +37 -23
  1010. package/src/shared/brandTokenDocument.ts +46 -0
  1011. package/src/shared/brandTokenPaths.ts +43 -0
  1012. package/src/shared/settingsCarveOut.ts +0 -8
  1013. package/src/shared/skillRanking.ts +106 -5
  1014. package/src/shared/userMd/formAdapter.ts +15 -1
  1015. package/src/shared/userMd/schema.ts +22 -0
  1016. package/src/templates/agent-user.md +4 -0
  1017. package/src/templates/agent-user.yml +4 -0
  1018. package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
  1019. package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
  1020. package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
  1021. package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
  1022. package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
  1023. package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
  1024. package/dist/ui/assets/index-C3djEJah.js +0 -23
  1025. package/src/scripts/_lib/continuation_ladder.ts +0 -335
  1026. package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
@@ -0,0 +1,1706 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/skills/corpus-grounding/scripts/ground.ts
4
+ import * as fs4 from "node:fs";
5
+ import * as path3 from "node:path";
6
+ import { fileURLToPath, pathToFileURL as pathToFileURL2 } from "node:url";
7
+
8
+ // src/skills/corpus-grounding/scripts/decision_engine.ts
9
+ import * as fs3 from "node:fs";
10
+ import * as path2 from "node:path";
11
+ import { pathToFileURL } from "node:url";
12
+
13
+ // src/skills/corpus-grounding/scripts/bm25_search.ts
14
+ import * as fs from "node:fs";
15
+ var DEFAULT_MAX_RESULTS = 3;
16
+ var PyFloat = class {
17
+ constructor(value) {
18
+ this.value = value;
19
+ }
20
+ value;
21
+ };
22
+ function floatVal(v) {
23
+ return v instanceof PyFloat ? v.value : v;
24
+ }
25
+ function pyLen(s) {
26
+ let n = 0;
27
+ for (const _ of s) {
28
+ n += 1;
29
+ }
30
+ return n;
31
+ }
32
+ var BM25 = class _BM25 {
33
+ k1;
34
+ b;
35
+ corpus;
36
+ doc_lengths;
37
+ avgdl;
38
+ idf;
39
+ doc_freqs;
40
+ N;
41
+ constructor(k1 = 1.5, b = 0.75) {
42
+ this.k1 = k1;
43
+ this.b = b;
44
+ this.corpus = [];
45
+ this.doc_lengths = [];
46
+ this.avgdl = 0;
47
+ this.idf = {};
48
+ this.doc_freqs = {};
49
+ this.N = 0;
50
+ }
51
+ /** Lowercase, strip punctuation, drop tokens shorter than 3 chars. */
52
+ static tokenize(text) {
53
+ const cleaned = pyStr(text).toLowerCase().replace(/[^\p{L}\p{N}_\s]/gu, " ");
54
+ return cleaned.split(/\s+/).filter((w) => w.length > 0 && pyLen(w) > 2);
55
+ }
56
+ fit(documents) {
57
+ this.corpus = documents.map((doc) => _BM25.tokenize(doc));
58
+ this.N = this.corpus.length;
59
+ if (this.N === 0) {
60
+ return;
61
+ }
62
+ this.doc_lengths = this.corpus.map((doc) => doc.length);
63
+ let total = 0;
64
+ for (const dl of this.doc_lengths) {
65
+ total += dl;
66
+ }
67
+ this.avgdl = total / this.N;
68
+ for (const doc of this.corpus) {
69
+ for (const word of new Set(doc)) {
70
+ this.doc_freqs[word] = (this.doc_freqs[word] ?? 0) + 1;
71
+ }
72
+ }
73
+ for (const word of Object.keys(this.doc_freqs)) {
74
+ const freq = this.doc_freqs[word];
75
+ this.idf[word] = Math.log((this.N - freq + 0.5) / (freq + 0.5) + 1);
76
+ }
77
+ }
78
+ /** Score every document; returns [index, score] sorted descending. */
79
+ score(query) {
80
+ const query_tokens = _BM25.tokenize(query);
81
+ const scores = [];
82
+ for (let idx = 0; idx < this.corpus.length; idx += 1) {
83
+ const doc = this.corpus[idx];
84
+ let score = 0;
85
+ const doc_len = this.doc_lengths[idx];
86
+ const term_freqs = {};
87
+ for (const word of doc) {
88
+ term_freqs[word] = (term_freqs[word] ?? 0) + 1;
89
+ }
90
+ for (const token of query_tokens) {
91
+ if (token in this.idf) {
92
+ const tf = term_freqs[token] ?? 0;
93
+ const numerator = tf * (this.k1 + 1);
94
+ const denominator = tf + this.k1 * (1 - this.b + this.b * doc_len / this.avgdl);
95
+ score += this.idf[token] * (numerator / denominator);
96
+ }
97
+ }
98
+ scores.push([idx, score]);
99
+ }
100
+ const indexed = scores.map((pair, i) => ({ pair, i }));
101
+ indexed.sort((a, b) => {
102
+ const d = b.pair[1] - a.pair[1];
103
+ if (d !== 0) {
104
+ return d;
105
+ }
106
+ return a.i - b.i;
107
+ });
108
+ return indexed.map((x) => x.pair);
109
+ }
110
+ };
111
+ function load_csv(filepath) {
112
+ const text = fs_readText(filepath);
113
+ const records = _parseCsv(text);
114
+ if (records.length === 0) {
115
+ return [];
116
+ }
117
+ const header = records[0];
118
+ const out = [];
119
+ for (let r = 1; r < records.length; r += 1) {
120
+ const fields = records[r];
121
+ const row = {};
122
+ for (let c = 0; c < header.length; c += 1) {
123
+ const key = header[c];
124
+ row[key] = c < fields.length ? fields[c] : "";
125
+ }
126
+ out.push(row);
127
+ }
128
+ return out;
129
+ }
130
+ function _parseCsv(text) {
131
+ const records = [];
132
+ let field = "";
133
+ let record = [];
134
+ let inQuotes = false;
135
+ let sawAny = false;
136
+ let i = 0;
137
+ const n = text.length;
138
+ const pushField = () => {
139
+ record.push(field);
140
+ field = "";
141
+ };
142
+ const pushRecord = () => {
143
+ records.push(record);
144
+ record = [];
145
+ };
146
+ while (i < n) {
147
+ const ch = text[i];
148
+ if (inQuotes) {
149
+ if (ch === '"') {
150
+ if (i + 1 < n && text[i + 1] === '"') {
151
+ field += '"';
152
+ i += 2;
153
+ } else {
154
+ inQuotes = false;
155
+ i += 1;
156
+ }
157
+ } else {
158
+ field += ch;
159
+ i += 1;
160
+ }
161
+ continue;
162
+ }
163
+ if (ch === '"') {
164
+ inQuotes = true;
165
+ sawAny = true;
166
+ i += 1;
167
+ } else if (ch === ",") {
168
+ pushField();
169
+ sawAny = true;
170
+ i += 1;
171
+ } else if (ch === "\r" || ch === "\n") {
172
+ pushField();
173
+ pushRecord();
174
+ sawAny = false;
175
+ if (ch === "\r" && i + 1 < n && text[i + 1] === "\n") {
176
+ i += 2;
177
+ } else {
178
+ i += 1;
179
+ }
180
+ } else {
181
+ field += ch;
182
+ sawAny = true;
183
+ i += 1;
184
+ }
185
+ }
186
+ if (sawAny || field.length > 0 || record.length > 0) {
187
+ pushField();
188
+ pushRecord();
189
+ }
190
+ return records;
191
+ }
192
+ function apply_filters(rows, filters) {
193
+ if (!filters || Object.keys(filters).length === 0) {
194
+ return rows;
195
+ }
196
+ const rowOk = (row) => {
197
+ for (const col of Object.keys(filters)) {
198
+ const want = filters[col];
199
+ const have = pyStr(row[col] ?? "").toLowerCase();
200
+ if (Array.isArray(want)) {
201
+ if (!want.some((w) => have.includes(pyStr(w).toLowerCase()))) {
202
+ return false;
203
+ }
204
+ } else if (!have.includes(pyStr(want).toLowerCase())) {
205
+ return false;
206
+ }
207
+ }
208
+ return true;
209
+ };
210
+ return rows.filter((r) => rowOk(r));
211
+ }
212
+ function _retrieve_bm25(rows, search_cols, query, max_results) {
213
+ const documents = rows.map((row) => search_cols.map((col) => pyStr(row[col] ?? "")).join(" "));
214
+ const bm25 = new BM25();
215
+ bm25.fit(documents);
216
+ const ranked = bm25.score(query);
217
+ const out = [];
218
+ for (const [idx, score] of ranked.slice(0, max_results)) {
219
+ if (score > 0) {
220
+ out.push([rows[idx], score]);
221
+ }
222
+ }
223
+ return out;
224
+ }
225
+ function _retrieve_structured(rows, _search_cols, _query, max_results) {
226
+ return rows.slice(0, max_results).map((row) => [row, 1]);
227
+ }
228
+ function _retrieve_hybrid(rows, search_cols, query, max_results) {
229
+ if (query.trim() === "") {
230
+ return _retrieve_structured(rows, search_cols, query, max_results);
231
+ }
232
+ return _retrieve_bm25(rows, search_cols, query, max_results);
233
+ }
234
+ var RETRIEVERS = {
235
+ bm25: _retrieve_bm25,
236
+ structured: _retrieve_structured,
237
+ hybrid: _retrieve_hybrid
238
+ };
239
+ function search_rows(filepath, search_cols, output_cols, query, max_results = DEFAULT_MAX_RESULTS, filters = null, retriever = "bm25") {
240
+ if (!(retriever in RETRIEVERS)) {
241
+ const available = Object.keys(RETRIEVERS).sort();
242
+ throw new ValueError(
243
+ `Unknown retriever: ${pyRepr(retriever)}. Available: ${pyReprList(available)}`
244
+ );
245
+ }
246
+ if (!fs_exists(filepath)) {
247
+ return { error: `File not found: ${filepath}`, count: 0, results: [] };
248
+ }
249
+ let rows = load_csv(filepath);
250
+ const total = rows.length;
251
+ rows = apply_filters(rows, filters);
252
+ const hits = RETRIEVERS[retriever](rows, search_cols, query, max_results);
253
+ const results = hits.map(([row]) => {
254
+ const projection = {};
255
+ for (const col of output_cols) {
256
+ if (col in row) {
257
+ projection[col] = row[col] ?? "";
258
+ }
259
+ }
260
+ return projection;
261
+ });
262
+ return {
263
+ count: results.length,
264
+ results,
265
+ // Python scores are floats (BM25 math + the structured 1.0). Wrap so
266
+ // an integral score (e.g. 1.0) serialises with its `.0`.
267
+ scores: hits.map(([, score]) => new PyFloat(score)),
268
+ filtered_from: total
269
+ };
270
+ }
271
+ var ValueError = class extends Error {
272
+ constructor(message) {
273
+ super(message);
274
+ this.name = "ValueError";
275
+ }
276
+ };
277
+ function pyStr(value) {
278
+ if (value === null || value === void 0) {
279
+ return value === null ? "None" : "undefined";
280
+ }
281
+ if (typeof value === "string") {
282
+ return value;
283
+ }
284
+ if (typeof value === "boolean") {
285
+ return value ? "True" : "False";
286
+ }
287
+ return String(value);
288
+ }
289
+ function pyRepr(s) {
290
+ const hasSingle = s.includes("'");
291
+ const hasDouble = s.includes('"');
292
+ if (hasSingle && !hasDouble) {
293
+ return `"${s.replace(/\\/g, "\\\\")}"`;
294
+ }
295
+ return `'${s.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
296
+ }
297
+ function pyReprList(items) {
298
+ return `[${items.map((i) => pyRepr(i)).join(", ")}]`;
299
+ }
300
+ function fs_readText(p) {
301
+ return fs.readFileSync(p, "utf-8");
302
+ }
303
+ function fs_exists(p) {
304
+ return fs.existsSync(p);
305
+ }
306
+
307
+ // src/skills/corpus-grounding/scripts/schema_validator.ts
308
+ import * as fs2 from "node:fs";
309
+ import * as path from "node:path";
310
+ var MANIFEST_VERSION = 1;
311
+ var TIERS = ["lookup-only", "conditional-grounding", "constraint-emission"];
312
+ var _REQUIRED_TOP = ["manifest_version", "domain", "tier", "domains"];
313
+ var _REQUIRED_PROVENANCE = ["owner", "refresh_cadence", "upstream"];
314
+ var _REQUIRED_DOMAIN_KEYS = ["file", "search_cols", "output_cols"];
315
+ var _REQUIRED_REASONING_KEYS = ["file", "match_column", "plan"];
316
+ var ManifestError = class extends Error {
317
+ constructor(message) {
318
+ super(message);
319
+ this.name = "ManifestError";
320
+ }
321
+ };
322
+ function _pyTruthy(value) {
323
+ if (value === null || value === void 0 || value === false) {
324
+ return false;
325
+ }
326
+ if (value === true) {
327
+ return true;
328
+ }
329
+ if (typeof value === "number") {
330
+ return value !== 0;
331
+ }
332
+ if (typeof value === "string") {
333
+ return value.length > 0;
334
+ }
335
+ if (Array.isArray(value)) {
336
+ return value.length > 0;
337
+ }
338
+ if (typeof value === "object") {
339
+ return Object.keys(value).length > 0;
340
+ }
341
+ return true;
342
+ }
343
+ function _isDict(value) {
344
+ return typeof value === "object" && value !== null && !Array.isArray(value);
345
+ }
346
+ function _repr(value) {
347
+ if (typeof value === "string") {
348
+ return pyRepr(value);
349
+ }
350
+ if (value === null || value === void 0) {
351
+ return "None";
352
+ }
353
+ if (value === true) {
354
+ return "True";
355
+ }
356
+ if (value === false) {
357
+ return "False";
358
+ }
359
+ if (typeof value === "number") {
360
+ return String(value);
361
+ }
362
+ return String(value);
363
+ }
364
+ function _tiersRepr() {
365
+ return `(${TIERS.map((t) => pyRepr(t)).join(", ")})`;
366
+ }
367
+ function load_manifest(p) {
368
+ if (!fs2.existsSync(p)) {
369
+ throw new ManifestError(`Manifest not found: ${p}`);
370
+ }
371
+ let data;
372
+ try {
373
+ data = JSON.parse(fs2.readFileSync(p, "utf-8"));
374
+ } catch (exc) {
375
+ throw new ManifestError(`Manifest is not valid JSON: ${p}: ${_jsonErr(exc)}`);
376
+ }
377
+ const errors = validate_manifest(data);
378
+ if (errors.length > 0) {
379
+ throw new ManifestError(
380
+ `Manifest contract violations in ${p}:
381
+ - ${errors.join("\n - ")}`
382
+ );
383
+ }
384
+ const manifest = data;
385
+ manifest._manifest_dir = path.dirname(pyResolve(p));
386
+ return manifest;
387
+ }
388
+ function validate_manifest(data) {
389
+ const errors = [];
390
+ if (!_isDict(data)) {
391
+ return ["manifest must be a JSON object"];
392
+ }
393
+ for (const key of _REQUIRED_TOP) {
394
+ if (!(key in data)) {
395
+ errors.push(`missing required key: ${pyRepr(key)}`);
396
+ }
397
+ }
398
+ if (errors.length > 0) {
399
+ return errors;
400
+ }
401
+ if (data.manifest_version !== MANIFEST_VERSION) {
402
+ errors.push(`manifest_version ${_repr(data.manifest_version)} unsupported (engine speaks v${MANIFEST_VERSION})`);
403
+ }
404
+ if (!TIERS.includes(data.tier)) {
405
+ errors.push(`tier ${_repr(data.tier)} not in ${_tiersRepr()}`);
406
+ }
407
+ const domains = data.domains;
408
+ if (!_isDict(domains) || Object.keys(domains).length === 0) {
409
+ errors.push("domains must be a non-empty object");
410
+ } else {
411
+ for (const name of Object.keys(domains)) {
412
+ const cfg = domains[name];
413
+ if (!_isDict(cfg)) {
414
+ errors.push(`domains.${name} must be an object`);
415
+ continue;
416
+ }
417
+ for (const key of _REQUIRED_DOMAIN_KEYS) {
418
+ if (!(key in cfg)) {
419
+ errors.push(`domains.${name} missing ${pyRepr(key)}`);
420
+ }
421
+ }
422
+ for (const key of ["search_cols", "output_cols"]) {
423
+ if (key in cfg && (!Array.isArray(cfg[key]) || cfg[key].length === 0)) {
424
+ errors.push(`domains.${name}.${key} must be a non-empty list`);
425
+ }
426
+ }
427
+ }
428
+ }
429
+ const default_domain = data.default_domain;
430
+ if (_pyTruthy(default_domain) && _isDict(domains) && !(String(default_domain) in domains)) {
431
+ errors.push(`default_domain ${_repr(default_domain)} not in domains`);
432
+ }
433
+ const detect = data.detect;
434
+ if (detect !== void 0 && detect !== null) {
435
+ if (!_isDict(detect)) {
436
+ errors.push("detect must be an object of domain \u2192 keyword list");
437
+ } else if (_isDict(domains)) {
438
+ for (const name of Object.keys(detect)) {
439
+ const kws = detect[name];
440
+ if (!(name in domains) && name !== "_stack") {
441
+ errors.push(`detect.${name} references unknown domain`);
442
+ }
443
+ if (!Array.isArray(kws)) {
444
+ errors.push(`detect.${name} must be a list of keywords`);
445
+ }
446
+ }
447
+ }
448
+ }
449
+ const reasoning = data.reasoning;
450
+ if (reasoning !== void 0 && reasoning !== null) {
451
+ if (data.tier === "lookup-only") {
452
+ errors.push("reasoning block present but tier is lookup-only");
453
+ }
454
+ if (!_isDict(reasoning)) {
455
+ errors.push("reasoning must be an object");
456
+ } else {
457
+ for (const key of _REQUIRED_REASONING_KEYS) {
458
+ if (!(key in reasoning)) {
459
+ errors.push(`reasoning missing ${pyRepr(key)}`);
460
+ }
461
+ }
462
+ const plan = reasoning.plan;
463
+ if (plan !== void 0 && plan !== null) {
464
+ if (!_isDict(plan)) {
465
+ errors.push("reasoning.plan must be an object of domain \u2192 max_results");
466
+ } else if (_isDict(domains)) {
467
+ for (const name of Object.keys(plan)) {
468
+ if (!(name in domains)) {
469
+ errors.push(`reasoning.plan.${name} references unknown domain`);
470
+ }
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
476
+ const stacks = data.stacks;
477
+ if (stacks !== void 0 && stacks !== null) {
478
+ if (!_isDict(stacks)) {
479
+ errors.push("stacks must be an object of stack-id \u2192 csv path");
480
+ } else if (!("stack_cols" in data)) {
481
+ errors.push("stacks present but stack_cols missing");
482
+ }
483
+ }
484
+ for (const key of _REQUIRED_PROVENANCE) {
485
+ if (!(key in data)) {
486
+ errors.push(`missing provenance key: ${pyRepr(key)} (ADR-061 \xA76)`);
487
+ }
488
+ }
489
+ const upstream = data.upstream;
490
+ if (_isDict(upstream)) {
491
+ for (const key of ["repo", "sha", "last_checked"]) {
492
+ if (!(key in upstream)) {
493
+ errors.push(`upstream missing ${pyRepr(key)}`);
494
+ }
495
+ }
496
+ } else if (upstream !== void 0 && upstream !== null) {
497
+ errors.push("upstream must be an object {repo, sha, last_checked}");
498
+ }
499
+ const retriever = data.retriever;
500
+ if (retriever !== void 0 && retriever !== null && !["bm25", "structured", "hybrid"].includes(retriever)) {
501
+ errors.push(`retriever ${_repr(retriever)} unknown`);
502
+ }
503
+ return errors;
504
+ }
505
+ function resolve_data_path(manifest, relative) {
506
+ if (path.isAbsolute(relative) || _pathParts(relative).includes("..")) {
507
+ throw new ManifestError(`corpus path must be manifest-relative: ${pyRepr(relative)}`);
508
+ }
509
+ const base = manifest._manifest_dir ?? ".";
510
+ const data_dir = manifest.data_dir ?? ".";
511
+ if (path.isAbsolute(data_dir) || _pathParts(data_dir).includes("..")) {
512
+ throw new ManifestError(`data_dir must be manifest-relative: ${pyRepr(data_dir)}`);
513
+ }
514
+ const resolved = pyResolve(path.join(base, data_dir, relative));
515
+ const root = pyResolve(base);
516
+ if (resolved !== root && !resolved.startsWith(root + path.sep)) {
517
+ throw new ManifestError(`corpus path resolves outside the manifest directory: ${pyRepr(relative)}`);
518
+ }
519
+ return resolved;
520
+ }
521
+ function _pathParts(p) {
522
+ return p.split(/[\\/]/u).filter((seg) => seg !== "" && seg !== ".");
523
+ }
524
+ function pyResolve(p) {
525
+ const abs = path.resolve(p);
526
+ let cur = abs;
527
+ const suffix = [];
528
+ for (; ; ) {
529
+ try {
530
+ const real = fs2.realpathSync.native(cur);
531
+ return suffix.length > 0 ? path.join(real, ...suffix) : real;
532
+ } catch {
533
+ const parent = path.dirname(cur);
534
+ if (parent === cur) {
535
+ return abs;
536
+ }
537
+ suffix.unshift(path.basename(cur));
538
+ cur = parent;
539
+ }
540
+ }
541
+ }
542
+ function _jsonErr(exc) {
543
+ if (exc instanceof Error) {
544
+ return exc.message;
545
+ }
546
+ return String(exc);
547
+ }
548
+
549
+ // src/skills/corpus-grounding/scripts/decision_engine.ts
550
+ function pyRound(value, ndigits = 0) {
551
+ if (!Number.isFinite(value) || value === 0) {
552
+ return value;
553
+ }
554
+ const sign = value < 0 ? -1 : 1;
555
+ const abs = Math.abs(value);
556
+ const str = abs.toPrecision(17);
557
+ if (str.includes("e") || str.includes("E")) {
558
+ const factor2 = 10 ** ndigits;
559
+ return value > 0 ? Math.round(abs * factor2) / factor2 * sign : -Math.round(abs * factor2) / factor2;
560
+ }
561
+ const dot = str.indexOf(".");
562
+ const intPart = dot === -1 ? str : str.slice(0, dot);
563
+ let fracPart = dot === -1 ? "" : str.slice(dot + 1);
564
+ while (fracPart.length <= ndigits) {
565
+ fracPart += "0";
566
+ }
567
+ const keepFrac = fracPart.slice(0, ndigits);
568
+ const deciderStr = fracPart.slice(ndigits);
569
+ const scaledIntStr = intPart + keepFrac;
570
+ let scaledInt = BigInt(scaledIntStr === "" ? "0" : scaledIntStr);
571
+ const firstDecider = deciderStr.charAt(0);
572
+ const restNonZero = /[1-9]/u.test(deciderStr.slice(1));
573
+ let roundUp = false;
574
+ if (firstDecider > "5" || firstDecider === "5" && restNonZero) {
575
+ roundUp = true;
576
+ } else if (firstDecider === "5" && !restNonZero) {
577
+ roundUp = scaledInt % 2n === 1n;
578
+ }
579
+ if (roundUp) {
580
+ scaledInt += 1n;
581
+ }
582
+ const factor = 10 ** ndigits;
583
+ return Number(scaledInt) / factor * sign;
584
+ }
585
+ function pyStr2(value) {
586
+ if (value === null || value === void 0) {
587
+ return "None";
588
+ }
589
+ if (typeof value === "string") {
590
+ return value;
591
+ }
592
+ if (typeof value === "boolean") {
593
+ return value ? "True" : "False";
594
+ }
595
+ if (value instanceof PyFloat) {
596
+ return _floatStr(value.value);
597
+ }
598
+ return String(value);
599
+ }
600
+ function _strRepr(s) {
601
+ const hasSingle = s.includes("'");
602
+ const hasDouble = s.includes('"');
603
+ let quote = "'";
604
+ if (hasSingle && !hasDouble) {
605
+ quote = '"';
606
+ }
607
+ let body = s.replace(/\\/g, "\\\\");
608
+ if (quote === "'") {
609
+ body = body.replace(/'/g, "\\'");
610
+ }
611
+ return `${quote}${body}${quote}`;
612
+ }
613
+ function _valueRepr(value) {
614
+ if (typeof value === "string") {
615
+ return _strRepr(value);
616
+ }
617
+ if (value === null || value === void 0) {
618
+ return "None";
619
+ }
620
+ if (value === true) {
621
+ return "True";
622
+ }
623
+ if (value === false) {
624
+ return "False";
625
+ }
626
+ return String(value);
627
+ }
628
+ function pyDictRepr(obj) {
629
+ const parts = Object.keys(obj).map((k) => `${_strRepr(k)}: ${_valueRepr(obj[k])}`);
630
+ return `{${parts.join(", ")}}`;
631
+ }
632
+ function _floatStr(n) {
633
+ if (Number.isInteger(n)) {
634
+ return `${n}.0`;
635
+ }
636
+ return String(n);
637
+ }
638
+ function _reEscape(s) {
639
+ return s.replace(/[\\^$.*+?()[\]{}|/]/gu, "\\$&");
640
+ }
641
+ function detect_domain(manifest, query) {
642
+ const detect = manifest.detect || {};
643
+ const query_lower = query.toLowerCase();
644
+ const scores = {};
645
+ for (const name of Object.keys(detect)) {
646
+ if (name === "_stack") {
647
+ continue;
648
+ }
649
+ const keywords = detect[name];
650
+ let count = 0;
651
+ if (Array.isArray(keywords)) {
652
+ for (const kw of keywords) {
653
+ const re = new RegExp(`\\b${_reEscape(pyStr2(kw).toLowerCase())}\\b`, "u");
654
+ if (re.test(query_lower)) {
655
+ count += 1;
656
+ }
657
+ }
658
+ }
659
+ scores[name] = count;
660
+ }
661
+ const names = Object.keys(scores);
662
+ if (names.length > 0) {
663
+ let best = names[0];
664
+ for (const name of names) {
665
+ if (scores[name] > scores[best]) {
666
+ best = name;
667
+ }
668
+ }
669
+ if (scores[best] > 0) {
670
+ return best;
671
+ }
672
+ }
673
+ const dd = manifest.default_domain;
674
+ if (dd !== void 0 && dd !== null && dd !== "" && dd !== false) {
675
+ return String(dd);
676
+ }
677
+ const domains = manifest.domains;
678
+ return Object.keys(domains)[0];
679
+ }
680
+ function search_domain(manifest, query, domain = null, max_results = null, filters = null) {
681
+ let dom = domain;
682
+ if (dom === null) {
683
+ dom = detect_domain(manifest, query);
684
+ }
685
+ const domains = manifest.domains;
686
+ if (!(dom in domains)) {
687
+ return {
688
+ error: `Unknown domain: ${_strRepr(dom)}. Available: ${_sortedListRepr(Object.keys(domains))}`,
689
+ count: 0,
690
+ results: []
691
+ };
692
+ }
693
+ const cfg = domains[dom];
694
+ const merged_filters = { ...cfg.filters || {} };
695
+ if (filters) {
696
+ for (const k of Object.keys(filters)) {
697
+ merged_filters[k] = filters[k];
698
+ }
699
+ }
700
+ const result = search_rows(
701
+ resolve_data_path(manifest, cfg.file),
702
+ cfg.search_cols,
703
+ cfg.output_cols,
704
+ query,
705
+ max_results ?? cfg.max_results ?? DEFAULT_MAX_RESULTS,
706
+ Object.keys(merged_filters).length > 0 ? merged_filters : null,
707
+ manifest.retriever ?? "bm25"
708
+ );
709
+ result.domain = dom;
710
+ result.query = query;
711
+ result.file = cfg.file;
712
+ _attach_confidence(result);
713
+ return result;
714
+ }
715
+ function search_stack(manifest, query, stack, max_results = DEFAULT_MAX_RESULTS, filters = null) {
716
+ const stacks = manifest.stacks || {};
717
+ if (!(stack in stacks)) {
718
+ return {
719
+ error: `Unknown stack: ${_strRepr(stack)}. Available: ${_sortedListRepr(Object.keys(stacks))}`,
720
+ count: 0,
721
+ results: []
722
+ };
723
+ }
724
+ const cols = manifest.stack_cols;
725
+ const result = search_rows(
726
+ resolve_data_path(manifest, stacks[stack]),
727
+ cols.search_cols,
728
+ cols.output_cols,
729
+ query,
730
+ max_results,
731
+ filters,
732
+ manifest.retriever ?? "bm25"
733
+ );
734
+ result.domain = "stack";
735
+ result.stack = stack;
736
+ result.query = query;
737
+ result.file = stacks[stack];
738
+ _attach_confidence(result);
739
+ return result;
740
+ }
741
+ function _attach_confidence(result) {
742
+ const scores = result.scores || [];
743
+ const gaps = [];
744
+ let label;
745
+ let numeric;
746
+ if (scores.length === 0) {
747
+ label = "low";
748
+ numeric = 0;
749
+ const dom = result.domain;
750
+ gaps.push(
751
+ `no corpus rows matched the query in domain '${dom === void 0 || dom === null ? "?" : String(dom)}' \u2014 answer falls back to agent priors`
752
+ );
753
+ } else {
754
+ const top = floatVal(scores[0]);
755
+ numeric = pyRound(Math.min(1, top / 10), 3);
756
+ if (top >= 4) {
757
+ label = "high";
758
+ } else if (top >= 1.5) {
759
+ label = "medium";
760
+ } else {
761
+ label = "low";
762
+ gaps.push("top BM25 score is weak \u2014 treat the match as a hint, not a verdict");
763
+ }
764
+ }
765
+ result.confidence = { label, score: new PyFloat(numeric) };
766
+ result.evidence_gap = gaps;
767
+ }
768
+ function evaluate_rules(rules, query, context = null) {
769
+ const ctx = context || {};
770
+ const query_lower = query.toLowerCase();
771
+ const matched = {};
772
+ const unmatched = {};
773
+ for (const key of Object.keys(rules || {})) {
774
+ const directive = rules[key];
775
+ const cond = key.startsWith("if_") ? key.slice(3) : key;
776
+ const tokens = cond.split("_").filter((t) => t.length > 0);
777
+ const ctxHit = _bool(ctx[cond]);
778
+ const tokenHit = tokens.length > 0 && tokens.every((t) => query_lower.includes(t));
779
+ const hit = ctxHit || tokenHit;
780
+ (hit ? matched : unmatched)[key] = directive;
781
+ }
782
+ return { matched, unmatched };
783
+ }
784
+ function _bool(value) {
785
+ if (value === null || value === void 0 || value === false) {
786
+ return false;
787
+ }
788
+ if (value === true) {
789
+ return true;
790
+ }
791
+ if (typeof value === "number") {
792
+ return value !== 0;
793
+ }
794
+ if (typeof value === "string") {
795
+ return value.length > 0;
796
+ }
797
+ if (Array.isArray(value)) {
798
+ return value.length > 0;
799
+ }
800
+ if (typeof value === "object") {
801
+ return Object.keys(value).length > 0;
802
+ }
803
+ return true;
804
+ }
805
+ async function _load_rules_callable(manifest) {
806
+ const reasoning = manifest.reasoning || {};
807
+ const rel = reasoning.rules_module;
808
+ if (!rel) {
809
+ return null;
810
+ }
811
+ const resolved = resolve_data_path(manifest, rel);
812
+ const candidate = _resolveTwinPath(resolved);
813
+ if (!fs3.existsSync(candidate)) {
814
+ throw new ManifestError(`reasoning.rules_module not found: ${resolved}`);
815
+ }
816
+ const mod = await import(pathToFileURL(candidate).href);
817
+ const fn = mod.evaluate;
818
+ if (typeof fn !== "function") {
819
+ throw new ManifestError(`${resolved} must expose evaluate(rules, query, context)`);
820
+ }
821
+ return fn;
822
+ }
823
+ function _resolveTwinPath(resolved) {
824
+ const ext = path2.extname(resolved);
825
+ if (ext === ".py") {
826
+ const stem = resolved.slice(0, resolved.length - ext.length);
827
+ if (fs3.existsSync(`${stem}.ts`)) {
828
+ return `${stem}.ts`;
829
+ }
830
+ return `${stem}.js`;
831
+ }
832
+ if (ext === "") {
833
+ if (fs3.existsSync(`${resolved}.ts`)) {
834
+ return `${resolved}.ts`;
835
+ }
836
+ return `${resolved}.js`;
837
+ }
838
+ return resolved;
839
+ }
840
+ function _find_reasoning_rule(rows, match_column, category) {
841
+ const category_lower = category.toLowerCase();
842
+ for (const rule of rows) {
843
+ if (pyStr2(rule[match_column] ?? "").toLowerCase() === category_lower) {
844
+ return rule;
845
+ }
846
+ }
847
+ for (const rule of rows) {
848
+ const cat = pyStr2(rule[match_column] ?? "").toLowerCase();
849
+ if (cat && (category_lower.includes(cat) || cat.includes(category_lower))) {
850
+ return rule;
851
+ }
852
+ }
853
+ for (const rule of rows) {
854
+ const cat = pyStr2(rule[match_column] ?? "").toLowerCase();
855
+ const keywords = cat.replace(/\//g, " ").replace(/-/g, " ").split(/\s+/u).filter((w) => w.length > 0);
856
+ if (keywords.some((kw) => category_lower.includes(kw))) {
857
+ return rule;
858
+ }
859
+ }
860
+ return {};
861
+ }
862
+ function _select_best_match(results, priority_keywords, name_col) {
863
+ if (results.length === 0) {
864
+ return {};
865
+ }
866
+ if (priority_keywords.length === 0) {
867
+ return results[0];
868
+ }
869
+ if (name_col) {
870
+ for (const priority of priority_keywords) {
871
+ const p = priority.toLowerCase().trim();
872
+ for (const result of results) {
873
+ const name = pyStr2(result[name_col] ?? "").toLowerCase();
874
+ if (p && (name.includes(p) || p.includes(name))) {
875
+ return result;
876
+ }
877
+ }
878
+ }
879
+ }
880
+ const scored = [];
881
+ for (const result of results) {
882
+ const blob = pyDictRepr(result).toLowerCase();
883
+ let score = 0;
884
+ for (const kw of priority_keywords) {
885
+ const k = kw.toLowerCase().trim();
886
+ if (!k) {
887
+ continue;
888
+ }
889
+ if (name_col && pyStr2(result[name_col] ?? "").toLowerCase().includes(k)) {
890
+ score += 10;
891
+ } else if (pyStr2(result.Keywords ?? "").toLowerCase().includes(k)) {
892
+ score += 3;
893
+ } else if (blob.includes(k)) {
894
+ score += 1;
895
+ }
896
+ }
897
+ scored.push([score, result]);
898
+ }
899
+ const indexed = scored.map((pair, i) => ({ pair, i }));
900
+ indexed.sort((a, b) => {
901
+ const d = b.pair[0] - a.pair[0];
902
+ if (d !== 0) {
903
+ return d;
904
+ }
905
+ return a.i - b.i;
906
+ });
907
+ const sorted = indexed.map((x) => x.pair);
908
+ if (sorted.length > 0 && sorted[0][0] > 0) {
909
+ return sorted[0][1];
910
+ }
911
+ return results[0];
912
+ }
913
+ var DIAL_TIERS = {
914
+ variance: [
915
+ [1, 3, { label: "Centered / Minimal", style_keywords: ["Minimalism", "Exaggerated Minimalism", "centered", "symmetric", "grid-based"] }],
916
+ [4, 7, { label: "Balanced / Modern", style_keywords: ["modern", "structured", "balanced"] }],
917
+ [8, 10, { label: "Bold / Asymmetric", style_keywords: ["Brutalism", "Bento Grids", "asymmetric", "experimental"] }]
918
+ ],
919
+ motion: [
920
+ [1, 3, { label: "Subtle", tier: "Subtle" }],
921
+ [4, 7, { label: "Standard", tier: "Standard" }],
922
+ [8, 10, { label: "Complex", tier: "Complex" }]
923
+ ],
924
+ density: [
925
+ [1, 3, { label: "Spacious", spacing: { xs: "4px", sm: "8px", md: "24px", lg: "32px", xl: "48px", "2xl": "64px", "3xl": "96px" } }],
926
+ [4, 7, { label: "Standard", spacing: { xs: "4px", sm: "8px", md: "16px", lg: "24px", xl: "32px", "2xl": "48px", "3xl": "64px" } }],
927
+ [8, 10, { label: "Dense / Dashboard", spacing: { xs: "2px", sm: "4px", md: "8px", lg: "12px", xl: "16px", "2xl": "24px", "3xl": "32px" } }]
928
+ ]
929
+ };
930
+ function resolve_dial(dial_name, value) {
931
+ if (value === null || value === void 0 || Number.isNaN(value)) return null;
932
+ const tiers = DIAL_TIERS[dial_name];
933
+ if (tiers === void 0) return null;
934
+ const v = Math.max(1, Math.min(10, Math.trunc(value)));
935
+ for (const [lo, hi, info] of tiers) {
936
+ if (v >= lo && v <= hi) return { ...info, value: v };
937
+ }
938
+ return null;
939
+ }
940
+ async function ground(manifest, query, context = null, dials = null) {
941
+ const reasoning = manifest.reasoning;
942
+ if (!reasoning) {
943
+ throw new ManifestError(
944
+ `manifest domain ${_valueRepr(manifest.domain)} has no reasoning block (tier is lookup-only \u2014 use search instead of ground)`
945
+ );
946
+ }
947
+ const gaps = [];
948
+ let category = manifest.default_category ?? "General";
949
+ const cat_domain = reasoning.category_domain;
950
+ const cat_column = reasoning.category_column;
951
+ if (cat_domain && cat_column) {
952
+ const cat_result = search_domain(manifest, query, cat_domain, 1);
953
+ const rows = cat_result.results || [];
954
+ if (rows.length > 0) {
955
+ const v = rows[0][cat_column];
956
+ category = v !== void 0 && v !== null && v !== "" ? pyStr2(v) : category;
957
+ } else {
958
+ gaps.push(
959
+ `category lookup in '${cat_domain}' found nothing \u2014 grounding against default category '${category}'`
960
+ );
961
+ }
962
+ }
963
+ const rules_path = resolve_data_path(manifest, reasoning.file);
964
+ const rule_rows = fs3.existsSync(rules_path) ? load_csv(rules_path) : [];
965
+ const rule = _find_reasoning_rule(rule_rows, reasoning.match_column, category);
966
+ if (Object.keys(rule).length === 0) {
967
+ gaps.push(
968
+ `no reasoning rule matched category '${category}' \u2014 selections below are unweighted corpus hits`
969
+ );
970
+ }
971
+ let raw_rules = {};
972
+ const rules_column = reasoning.rules_column;
973
+ if (rules_column && _bool(rule[rules_column])) {
974
+ try {
975
+ raw_rules = JSON.parse(rule[rules_column]);
976
+ } catch {
977
+ gaps.push(`decision rules in column '${rules_column}' are not valid JSON`);
978
+ }
979
+ }
980
+ const custom = await _load_rules_callable(manifest);
981
+ const rules_evaluation = custom ? custom(raw_rules, query, context || {}) : evaluate_rules(raw_rules, query, context);
982
+ let priority = [];
983
+ const priority_column = reasoning.priority_column;
984
+ if (priority_column && _bool(rule[priority_column])) {
985
+ priority = pyStr2(rule[priority_column]).split("+").map((s) => s.trim()).filter((s) => s.length > 0);
986
+ }
987
+ const variance_info = resolve_dial("variance", dials?.variance);
988
+ const motion_info = resolve_dial("motion", dials?.motion);
989
+ const density_info = resolve_dial("density", dials?.density);
990
+ const selection_priority = variance_info ? [...variance_info.style_keywords, ...priority] : priority;
991
+ const selections = {};
992
+ const domain_confidences = [];
993
+ const plan = reasoning.plan || {};
994
+ const priority_domain = reasoning.priority_domain;
995
+ const name_cols = reasoning.name_columns || {};
996
+ for (const domain_name of Object.keys(plan)) {
997
+ const max_results = plan[domain_name];
998
+ let q = query;
999
+ if (domain_name === priority_domain && priority.length > 0) {
1000
+ q = `${query} ${priority.slice(0, 2).join(" ")}`;
1001
+ }
1002
+ const result = search_domain(manifest, q, domain_name, _int(max_results));
1003
+ const results = result.results || [];
1004
+ let best;
1005
+ if (domain_name === priority_domain) {
1006
+ best = _select_best_match(results, selection_priority, name_cols[domain_name]);
1007
+ if (variance_info) {
1008
+ const ungated = _select_best_match(results, priority, name_cols[domain_name]);
1009
+ if (ungated !== best) {
1010
+ const col = name_cols[domain_name];
1011
+ const nameOf = (r) => col && r[col] !== void 0 ? pyStr2(r[col]) : "(unnamed)";
1012
+ gaps.push(
1013
+ `--variance ${String(variance_info.value)} changed the ${domain_name} pick to '${nameOf(best)}'; the rule's own keywords would have selected '${nameOf(ungated)}' \u2014 the dial biased the choice, it did not come from the corpus`
1014
+ );
1015
+ }
1016
+ }
1017
+ } else {
1018
+ best = results.length > 0 ? results[0] : {};
1019
+ }
1020
+ selections[domain_name] = {
1021
+ best,
1022
+ // Python: [r for r in results if r is not best] — identity compare.
1023
+ alternatives: results.filter((r) => r !== best),
1024
+ confidence: result.confidence
1025
+ };
1026
+ for (const g of result.evidence_gap || []) {
1027
+ gaps.push(g);
1028
+ }
1029
+ const conf = result.confidence || {};
1030
+ const score = conf.score;
1031
+ domain_confidences.push(score instanceof PyFloat ? score.value : score ?? 0);
1032
+ }
1033
+ let motion_selection = null;
1034
+ if (motion_info) {
1035
+ const tier = motion_info.tier;
1036
+ const motion_domain = manifest.domains["gsap"];
1037
+ if (motion_domain === void 0) {
1038
+ gaps.push(
1039
+ "the --motion dial needs a 'gsap' search domain (motion.csv); this manifest has none, so the dial had no effect"
1040
+ );
1041
+ } else {
1042
+ const motion_max = motion_domain["max_results"];
1043
+ const motion_result = search_domain(
1044
+ manifest,
1045
+ query,
1046
+ "gsap",
1047
+ typeof motion_max === "number" ? motion_max : null,
1048
+ { "Intensity Tier": tier }
1049
+ );
1050
+ const rows = motion_result.results || [];
1051
+ if (rows.length === 0) {
1052
+ gaps.push(`no motion row at tier '${tier}' matched the query \u2014 the dial narrowed to nothing`);
1053
+ } else {
1054
+ motion_selection = {
1055
+ tier,
1056
+ best: rows[0],
1057
+ alternatives: rows.slice(1),
1058
+ confidence: motion_result.confidence
1059
+ };
1060
+ }
1061
+ }
1062
+ }
1063
+ const numeric = domain_confidences.length > 0 ? pyRound(Math.min(...domain_confidences), 3) : 0;
1064
+ const label = numeric >= 0.4 ? "high" : numeric >= 0.15 ? "medium" : "low";
1065
+ const ruleOut = {};
1066
+ for (const k of Object.keys(rule)) {
1067
+ if (k !== rules_column) {
1068
+ ruleOut[k] = rule[k];
1069
+ }
1070
+ }
1071
+ const out = {
1072
+ domain: manifest.domain,
1073
+ query,
1074
+ category,
1075
+ rule: ruleOut,
1076
+ rules_evaluation,
1077
+ selections,
1078
+ confidence: { label, score: new PyFloat(numeric) },
1079
+ evidence_gap: gaps.length > 0 ? gaps : ["none \u2014 every planned domain returned a scored match"]
1080
+ };
1081
+ if (variance_info || motion_info || density_info) {
1082
+ out.dials = {
1083
+ variance: variance_info ? variance_info.value : null,
1084
+ variance_label: variance_info ? variance_info.label : null,
1085
+ motion: motion_info ? motion_info.value : null,
1086
+ motion_label: motion_info ? motion_info.label : null,
1087
+ density: density_info ? density_info.value : null,
1088
+ density_label: density_info ? density_info.label : null
1089
+ };
1090
+ if (motion_selection) out.motion = motion_selection;
1091
+ if (density_info) out.spacing_scale = density_info.spacing;
1092
+ }
1093
+ return out;
1094
+ }
1095
+ function _int(value) {
1096
+ if (typeof value === "number") {
1097
+ return Math.trunc(value);
1098
+ }
1099
+ if (typeof value === "boolean") {
1100
+ return value ? 1 : 0;
1101
+ }
1102
+ return Math.trunc(Number(value));
1103
+ }
1104
+ function persist_grounding(grounded, output_dir, project = null, page = null) {
1105
+ const project_slug = (project ?? pyStr2(grounded.query ?? "default")).toLowerCase().replace(/ /g, "-");
1106
+ const base = path2.join(output_dir, "design-system", project_slug);
1107
+ fs3.mkdirSync(base, { recursive: true });
1108
+ const created = [];
1109
+ const master = path2.join(base, "MASTER.md");
1110
+ fs3.writeFileSync(master, _render_markdown(grounded, true), "utf-8");
1111
+ created.push(master);
1112
+ if (page) {
1113
+ const pages = path2.join(base, "pages");
1114
+ fs3.mkdirSync(pages, { recursive: true });
1115
+ const page_file = path2.join(pages, `${page.toLowerCase().replace(/ /g, "-")}.md`);
1116
+ fs3.writeFileSync(
1117
+ page_file,
1118
+ `# ${_title(page)} \u2014 page overrides
1119
+
1120
+ > Rules here OVERRIDE the project MASTER.md for this page only.
1121
+ > Start empty; add only deviations.
1122
+ `,
1123
+ "utf-8"
1124
+ );
1125
+ created.push(page_file);
1126
+ }
1127
+ return { status: "success", created_files: created };
1128
+ }
1129
+ function _title(s) {
1130
+ return s.replace(/[A-Za-z]+/gu, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());
1131
+ }
1132
+ function _render_markdown(grounded, master = false) {
1133
+ const lines = [];
1134
+ if (master) {
1135
+ lines.push(
1136
+ "# Design System Master File",
1137
+ "",
1138
+ "> **LOGIC:** When building a specific page, first check `pages/<page>.md`. If it exists, its rules **override** this master file. Otherwise follow the rules below.",
1139
+ ""
1140
+ );
1141
+ }
1142
+ const conf = grounded.confidence || {};
1143
+ lines.push(
1144
+ `## Grounded recommendation: ${pyStr2(grounded.query ?? "")}`,
1145
+ "",
1146
+ `- **Domain:** ${pyStr2(grounded.domain ?? "")}`,
1147
+ `- **Category:** ${pyStr2(grounded.category ?? "")}`,
1148
+ `- **Confidence:** ${pyStr2(conf.label ?? "?")} (${_confScore(conf.score)})`,
1149
+ ""
1150
+ );
1151
+ const dials = grounded.dials || null;
1152
+ if (dials) {
1153
+ const dialLines = [];
1154
+ for (const name of ["variance", "motion", "density"]) {
1155
+ const value = dials[name];
1156
+ if (value === null || value === void 0) {
1157
+ continue;
1158
+ }
1159
+ const label = dials[`${name}_label`];
1160
+ dialLines.push(
1161
+ `- **${name[0]?.toUpperCase()}${name.slice(1)}:** ${pyStr2(value)}/10` + (label ? ` \u2014 ${pyStr2(label)}` : "")
1162
+ );
1163
+ }
1164
+ if (dialLines.length > 0) {
1165
+ lines.push("### Dials", "", ...dialLines, "");
1166
+ }
1167
+ }
1168
+ const spacing = grounded.spacing_scale || null;
1169
+ if (spacing && Object.keys(spacing).length > 0) {
1170
+ lines.push("### Spacing scale (density override)", "");
1171
+ for (const step of Object.keys(spacing)) {
1172
+ lines.push(`- **${step}:** ${pyStr2(spacing[step])}`);
1173
+ }
1174
+ lines.push("");
1175
+ }
1176
+ const motion = grounded.motion || null;
1177
+ const motionBest = motion ? motion.best || {} : {};
1178
+ if (motion && Object.keys(motionBest).length > 0) {
1179
+ lines.push(`### Motion (tier: ${pyStr2(motion.tier ?? "")})`, "");
1180
+ for (const key of Object.keys(motionBest)) {
1181
+ lines.push(`- **${key}:** ${pyStr2(motionBest[key])}`);
1182
+ }
1183
+ lines.push("");
1184
+ }
1185
+ const selections = grounded.selections || {};
1186
+ for (const domain of Object.keys(selections)) {
1187
+ const sel = selections[domain] || {};
1188
+ const best = sel.best || {};
1189
+ if (Object.keys(best).length === 0) {
1190
+ continue;
1191
+ }
1192
+ lines.push(`### ${domain}`);
1193
+ for (const key of Object.keys(best)) {
1194
+ let value_str = pyStr2(best[key]);
1195
+ if (value_str.length > 300) {
1196
+ value_str = `${value_str.slice(0, 300)}\u2026`;
1197
+ }
1198
+ if (value_str) {
1199
+ lines.push(`- **${key}:** ${value_str}`);
1200
+ }
1201
+ }
1202
+ lines.push("");
1203
+ }
1204
+ const matched = (grounded.rules_evaluation || {}).matched;
1205
+ const matchedObj = matched || {};
1206
+ if (Object.keys(matchedObj).length > 0) {
1207
+ lines.push("### Matched decision rules");
1208
+ for (const key of Object.keys(matchedObj)) {
1209
+ lines.push(`- \`${key}\` \u2192 ${pyStr2(matchedObj[key])}`);
1210
+ }
1211
+ lines.push("");
1212
+ }
1213
+ lines.push("### Evidence gap");
1214
+ for (const gap of grounded.evidence_gap || []) {
1215
+ lines.push(`- ${gap}`);
1216
+ }
1217
+ lines.push("");
1218
+ return lines.join("\n");
1219
+ }
1220
+ function _confScore(score) {
1221
+ if (score instanceof PyFloat) {
1222
+ return _floatStr(score.value);
1223
+ }
1224
+ if (score === void 0 || score === null) {
1225
+ return "0";
1226
+ }
1227
+ return String(score);
1228
+ }
1229
+ function _sortedListRepr(items) {
1230
+ const sorted = [...items].sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
1231
+ return `[${sorted.map((i) => _strRepr(i)).join(", ")}]`;
1232
+ }
1233
+
1234
+ // src/skills/corpus-grounding/scripts/ground.ts
1235
+ function _parse_filters(pairs) {
1236
+ const collected = {};
1237
+ for (const pair of pairs || []) {
1238
+ if (!pair.includes("=")) {
1239
+ process.stderr.write(`--filter expects COLUMN=VALUE, got: ${_repr2(pair)}
1240
+ `);
1241
+ process.exit(1);
1242
+ }
1243
+ const idx = pair.indexOf("=");
1244
+ const col = pair.slice(0, idx);
1245
+ const value = pair.slice(idx + 1);
1246
+ if (!(col in collected)) {
1247
+ collected[col] = [];
1248
+ }
1249
+ collected[col].push(value);
1250
+ }
1251
+ const out = {};
1252
+ for (const k of Object.keys(collected)) {
1253
+ const v = collected[k];
1254
+ out[k] = v.length > 1 ? v : v[0];
1255
+ }
1256
+ return out;
1257
+ }
1258
+ function _format_search(result) {
1259
+ if (_truthy(result.error)) {
1260
+ return `Error: ${result.error}`;
1261
+ }
1262
+ const out = ["## Corpus search results"];
1263
+ const head = `**Domain:** ${_orStr(result.stack, result.domain)} | **Query:** ${_str(result.query)}`;
1264
+ out.push(head);
1265
+ const conf = result.confidence || {};
1266
+ out.push(
1267
+ `**Source:** ${_str(result.file)} | **Found:** ${_str(result.count)} | **Confidence:** ${_str(conf.label)} (${_confScore2(conf.score)})`
1268
+ );
1269
+ out.push("");
1270
+ const results = result.results || [];
1271
+ let i = 1;
1272
+ for (const row of results) {
1273
+ out.push(`### Result ${i}`);
1274
+ for (const key of Object.keys(row)) {
1275
+ let value_str = _str(row[key]);
1276
+ if (value_str.length > 300) {
1277
+ value_str = `${value_str.slice(0, 300)}\u2026`;
1278
+ }
1279
+ if (value_str) {
1280
+ out.push(`- **${key}:** ${value_str}`);
1281
+ }
1282
+ }
1283
+ out.push("");
1284
+ i += 1;
1285
+ }
1286
+ const gaps = result.evidence_gap || [];
1287
+ if (gaps.length > 0) {
1288
+ out.push("### Evidence gap");
1289
+ for (const g of gaps) {
1290
+ out.push(`- ${g}`);
1291
+ }
1292
+ }
1293
+ return out.join("\n");
1294
+ }
1295
+ function _dial(flag, raw) {
1296
+ const n = Number(raw);
1297
+ if (!Number.isFinite(n)) {
1298
+ process.stderr.write(`argument ${flag}: expected an integer 1-10, got '${raw}'
1299
+ `);
1300
+ process.exit(2);
1301
+ }
1302
+ return Math.trunc(n);
1303
+ }
1304
+ function _parseArgs(argv) {
1305
+ const op = argv[0];
1306
+ if (op !== "search" && op !== "ground" && op !== "validate") {
1307
+ process.stderr.write(`ground: invalid operation: ${op ?? "(none)"}
1308
+ `);
1309
+ process.exit(2);
1310
+ }
1311
+ const rest = argv.slice(1);
1312
+ const args = {
1313
+ op,
1314
+ manifest: "",
1315
+ json: false,
1316
+ filter: [],
1317
+ domain: null,
1318
+ stack: null,
1319
+ max_results: null,
1320
+ retriever: null,
1321
+ hasRetriever: op === "search",
1322
+ context: null,
1323
+ persist: null,
1324
+ project_name: null,
1325
+ page: null
1326
+ };
1327
+ const positionals = [];
1328
+ let manifestSet = false;
1329
+ for (let i = 0; i < rest.length; i += 1) {
1330
+ const a = rest[i];
1331
+ const eat = () => {
1332
+ const v = rest[i + 1];
1333
+ if (v === void 0) {
1334
+ process.stderr.write(`argument ${a}: expected one argument
1335
+ `);
1336
+ process.exit(2);
1337
+ }
1338
+ i += 1;
1339
+ return v;
1340
+ };
1341
+ if (a === "--manifest") {
1342
+ args.manifest = eat();
1343
+ manifestSet = true;
1344
+ } else if (a.startsWith("--manifest=")) {
1345
+ args.manifest = a.slice("--manifest=".length);
1346
+ manifestSet = true;
1347
+ } else if (a === "--json") {
1348
+ args.json = true;
1349
+ } else if (a === "--domain" || a === "-d") {
1350
+ args.domain = eat();
1351
+ } else if (a.startsWith("--domain=")) {
1352
+ args.domain = a.slice("--domain=".length);
1353
+ } else if (a === "--stack" || a === "-s") {
1354
+ args.stack = eat();
1355
+ } else if (a.startsWith("--stack=")) {
1356
+ args.stack = a.slice("--stack=".length);
1357
+ } else if (a === "--max-results" || a === "-n") {
1358
+ args.max_results = parseInt(eat(), 10);
1359
+ } else if (a.startsWith("--max-results=")) {
1360
+ args.max_results = parseInt(a.slice("--max-results=".length), 10);
1361
+ } else if (a === "--filter") {
1362
+ args.filter.push(eat());
1363
+ } else if (a.startsWith("--filter=")) {
1364
+ args.filter.push(a.slice("--filter=".length));
1365
+ } else if (a === "--retriever") {
1366
+ args.retriever = eat();
1367
+ } else if (a.startsWith("--retriever=")) {
1368
+ args.retriever = a.slice("--retriever=".length);
1369
+ } else if (a === "--context") {
1370
+ args.context = eat();
1371
+ } else if (a.startsWith("--context=")) {
1372
+ args.context = a.slice("--context=".length);
1373
+ } else if (a === "--persist") {
1374
+ args.persist = eat();
1375
+ } else if (a.startsWith("--persist=")) {
1376
+ args.persist = a.slice("--persist=".length);
1377
+ } else if (a === "--project-name" || a === "-p") {
1378
+ args.project_name = eat();
1379
+ } else if (a.startsWith("--project-name=")) {
1380
+ args.project_name = a.slice("--project-name=".length);
1381
+ } else if (a === "--page") {
1382
+ args.page = eat();
1383
+ } else if (a.startsWith("--page=")) {
1384
+ args.page = a.slice("--page=".length);
1385
+ } else if (a === "--variance") {
1386
+ args.variance = _dial("--variance", eat());
1387
+ } else if (a.startsWith("--variance=")) {
1388
+ args.variance = _dial("--variance", a.slice("--variance=".length));
1389
+ } else if (a === "--motion") {
1390
+ args.motion = _dial("--motion", eat());
1391
+ } else if (a.startsWith("--motion=")) {
1392
+ args.motion = _dial("--motion", a.slice("--motion=".length));
1393
+ } else if (a === "--density") {
1394
+ args.density = _dial("--density", eat());
1395
+ } else if (a.startsWith("--density=")) {
1396
+ args.density = _dial("--density", a.slice("--density=".length));
1397
+ } else {
1398
+ positionals.push(a);
1399
+ }
1400
+ }
1401
+ if (!manifestSet) {
1402
+ process.stderr.write("the following arguments are required: --manifest\n");
1403
+ process.exit(2);
1404
+ }
1405
+ if (op === "search" || op === "ground") {
1406
+ if (positionals.length === 0) {
1407
+ process.stderr.write("the following arguments are required: query\n");
1408
+ process.exit(2);
1409
+ }
1410
+ args.query = positionals[0];
1411
+ }
1412
+ if ((op === "search" || op === "ground") && args.retriever !== null && args.retriever !== void 0) {
1413
+ const r = args.retriever;
1414
+ if (!["bm25", "structured", "hybrid"].includes(r)) {
1415
+ process.stderr.write(
1416
+ `argument --retriever: invalid choice: '${r}' (choose from 'bm25', 'structured', 'hybrid')
1417
+ `
1418
+ );
1419
+ process.exit(2);
1420
+ }
1421
+ }
1422
+ return args;
1423
+ }
1424
+ async function main(argv = null) {
1425
+ const args = _parseArgs(argv ?? process.argv.slice(2));
1426
+ try {
1427
+ if (args.op === "validate") {
1428
+ const raw = JSON.parse(fs4.readFileSync(args.manifest, "utf-8"));
1429
+ const errors = validate_manifest(raw);
1430
+ if (errors.length > 0) {
1431
+ process.stdout.write("INVALID manifest:\n");
1432
+ for (const err of errors) {
1433
+ process.stdout.write(` - ${err}
1434
+ `);
1435
+ }
1436
+ return 1;
1437
+ }
1438
+ process.stdout.write("OK \u2014 manifest satisfies contract v1\n");
1439
+ return 0;
1440
+ }
1441
+ const manifest = load_manifest(args.manifest);
1442
+ if (args.hasRetriever && args.retriever) {
1443
+ manifest.retriever = args.retriever;
1444
+ }
1445
+ if (args.op === "search") {
1446
+ let result;
1447
+ if (args.stack) {
1448
+ result = search_stack(
1449
+ manifest,
1450
+ args.query,
1451
+ args.stack,
1452
+ args.max_results ?? 3,
1453
+ _filtersOrNull(_parse_filters(args.filter))
1454
+ );
1455
+ } else {
1456
+ result = search_domain(
1457
+ manifest,
1458
+ args.query,
1459
+ args.domain ?? null,
1460
+ args.max_results,
1461
+ _filtersOrNull(_parse_filters(args.filter))
1462
+ );
1463
+ }
1464
+ process.stdout.write(
1465
+ (args.json ? _jsonDumps(result, 2) : _format_search(result)) + "\n"
1466
+ );
1467
+ return _truthy(result.error) ? 1 : 0;
1468
+ }
1469
+ const context = args.context ? JSON.parse(args.context) : {};
1470
+ const grounded = await ground(manifest, args.query, context, {
1471
+ variance: args.variance ?? null,
1472
+ motion: args.motion ?? null,
1473
+ density: args.density ?? null
1474
+ });
1475
+ if (args.persist) {
1476
+ const info = persist_grounding(
1477
+ grounded,
1478
+ args.persist,
1479
+ args.project_name ?? null,
1480
+ args.page ?? null
1481
+ );
1482
+ grounded.persisted = info;
1483
+ }
1484
+ if (args.json) {
1485
+ process.stdout.write(_jsonDumps(grounded, 2) + "\n");
1486
+ } else {
1487
+ process.stdout.write(_render_markdown(grounded) + "\n");
1488
+ }
1489
+ return 0;
1490
+ } catch (exc) {
1491
+ if (_isExpected(exc)) {
1492
+ process.stderr.write(`Error: ${_errText(exc)}
1493
+ `);
1494
+ return 1;
1495
+ }
1496
+ throw exc;
1497
+ }
1498
+ }
1499
+ function _isExpected(exc) {
1500
+ if (exc instanceof ManifestError) {
1501
+ return true;
1502
+ }
1503
+ if (exc instanceof SyntaxError) {
1504
+ return true;
1505
+ }
1506
+ if (exc instanceof Error) {
1507
+ const code = exc.code;
1508
+ if (code && /^E[A-Z]+$/u.test(code)) {
1509
+ return true;
1510
+ }
1511
+ }
1512
+ return false;
1513
+ }
1514
+ function _errText(exc) {
1515
+ if (exc instanceof Error) {
1516
+ return exc.message;
1517
+ }
1518
+ return String(exc);
1519
+ }
1520
+ function _truthy(value) {
1521
+ if (value === null || value === void 0 || value === false) {
1522
+ return false;
1523
+ }
1524
+ if (typeof value === "string") {
1525
+ return value.length > 0;
1526
+ }
1527
+ if (typeof value === "number") {
1528
+ return value !== 0;
1529
+ }
1530
+ if (Array.isArray(value)) {
1531
+ return value.length > 0;
1532
+ }
1533
+ if (typeof value === "object") {
1534
+ return Object.keys(value).length > 0;
1535
+ }
1536
+ return true;
1537
+ }
1538
+ function _str(value) {
1539
+ if (value === null || value === void 0) {
1540
+ return "None";
1541
+ }
1542
+ if (typeof value === "string") {
1543
+ return value;
1544
+ }
1545
+ if (typeof value === "boolean") {
1546
+ return value ? "True" : "False";
1547
+ }
1548
+ if (value instanceof PyFloat) {
1549
+ return Number.isInteger(value.value) ? `${value.value}.0` : String(value.value);
1550
+ }
1551
+ return String(value);
1552
+ }
1553
+ function _orStr(a, b) {
1554
+ return _truthy(a) ? _str(a) : _str(b);
1555
+ }
1556
+ function _confScore2(score) {
1557
+ if (score instanceof PyFloat) {
1558
+ return Number.isInteger(score.value) ? `${score.value}.0` : String(score.value);
1559
+ }
1560
+ if (score === void 0 || score === null) {
1561
+ return "None";
1562
+ }
1563
+ return String(score);
1564
+ }
1565
+ function _filtersOrNull(filters) {
1566
+ return Object.keys(filters).length > 0 ? filters : null;
1567
+ }
1568
+ function _repr2(s) {
1569
+ const hasSingle = s.includes("'");
1570
+ const hasDouble = s.includes('"');
1571
+ if (hasSingle && !hasDouble) {
1572
+ return `"${s.replace(/\\/g, "\\\\")}"`;
1573
+ }
1574
+ return `'${s.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
1575
+ }
1576
+ function _jsonDumps(value, indent) {
1577
+ return _dumps(value, indent, 0);
1578
+ }
1579
+ function _dumps(value, indent, depth) {
1580
+ const pad = " ".repeat(indent * (depth + 1));
1581
+ const closePad = " ".repeat(indent * depth);
1582
+ if (value === null || value === void 0) {
1583
+ return "null";
1584
+ }
1585
+ if (value instanceof PyFloat) {
1586
+ return _jsonFloat(value.value);
1587
+ }
1588
+ if (typeof value === "boolean") {
1589
+ return value ? "true" : "false";
1590
+ }
1591
+ if (typeof value === "number") {
1592
+ return _jsonNum(value);
1593
+ }
1594
+ if (typeof value === "string") {
1595
+ return _jsonStr(value);
1596
+ }
1597
+ if (Array.isArray(value)) {
1598
+ if (value.length === 0) {
1599
+ return "[]";
1600
+ }
1601
+ const items = value.map((v) => pad + _dumps(v, indent, depth + 1));
1602
+ return `[
1603
+ ${items.join(",\n")}
1604
+ ${closePad}]`;
1605
+ }
1606
+ if (typeof value === "object") {
1607
+ const obj = value;
1608
+ const keys = Object.keys(obj);
1609
+ if (keys.length === 0) {
1610
+ return "{}";
1611
+ }
1612
+ const items = keys.map(
1613
+ (k) => `${pad}${_jsonStr(k)}: ${_dumps(obj[k], indent, depth + 1)}`
1614
+ );
1615
+ return `{
1616
+ ${items.join(",\n")}
1617
+ ${closePad}}`;
1618
+ }
1619
+ return _jsonStr(String(value));
1620
+ }
1621
+ function _jsonNum(n) {
1622
+ if (!Number.isFinite(n)) {
1623
+ if (Number.isNaN(n)) {
1624
+ return "NaN";
1625
+ }
1626
+ return n > 0 ? "Infinity" : "-Infinity";
1627
+ }
1628
+ return String(n);
1629
+ }
1630
+ function _jsonFloat(n) {
1631
+ if (!Number.isFinite(n)) {
1632
+ if (Number.isNaN(n)) {
1633
+ return "NaN";
1634
+ }
1635
+ return n > 0 ? "Infinity" : "-Infinity";
1636
+ }
1637
+ if (Number.isInteger(n)) {
1638
+ return `${n}.0`;
1639
+ }
1640
+ return String(n);
1641
+ }
1642
+ function _jsonStr(s) {
1643
+ let out = '"';
1644
+ for (const ch of s) {
1645
+ const code = ch.codePointAt(0) ?? 0;
1646
+ switch (ch) {
1647
+ case '"':
1648
+ out += '\\"';
1649
+ break;
1650
+ case "\\":
1651
+ out += "\\\\";
1652
+ break;
1653
+ case "\n":
1654
+ out += "\\n";
1655
+ break;
1656
+ case "\r":
1657
+ out += "\\r";
1658
+ break;
1659
+ case " ":
1660
+ out += "\\t";
1661
+ break;
1662
+ case "\b":
1663
+ out += "\\b";
1664
+ break;
1665
+ case "\f":
1666
+ out += "\\f";
1667
+ break;
1668
+ default:
1669
+ if (code < 32) {
1670
+ out += `\\u${code.toString(16).padStart(4, "0")}`;
1671
+ } else {
1672
+ out += ch;
1673
+ }
1674
+ }
1675
+ }
1676
+ return `${out}"`;
1677
+ }
1678
+ function _isCliEntry() {
1679
+ if (process.argv[1] === void 0) {
1680
+ return false;
1681
+ }
1682
+ const argvUrl = pathToFileURL2(path3.resolve(process.argv[1])).href;
1683
+ if (import.meta.url === argvUrl) {
1684
+ return true;
1685
+ }
1686
+ try {
1687
+ const here = fs4.realpathSync(fileURLToPath(import.meta.url));
1688
+ const argv = fs4.realpathSync(path3.resolve(process.argv[1]));
1689
+ return here === argv;
1690
+ } catch {
1691
+ return false;
1692
+ }
1693
+ }
1694
+ var _isMain = _isCliEntry();
1695
+ if (_isMain) {
1696
+ main().then((code) => {
1697
+ process.exitCode = code;
1698
+ }).catch((err) => {
1699
+ process.stderr.write(`${err instanceof Error ? err.stack ?? err.message : String(err)}
1700
+ `);
1701
+ process.exitCode = 1;
1702
+ });
1703
+ }
1704
+ export {
1705
+ main
1706
+ };