@event4u/agent-config 14.12.0 → 14.13.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 (466) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +234 -0
  5. package/CONTRIBUTING.md +38 -0
  6. package/CREDITS.md +135 -0
  7. package/NOTICE +13 -0
  8. package/README.md +8 -6
  9. package/dist/agent-src/commands/analyze/inbox.md +109 -2
  10. package/dist/agent-src/commands/feature/dev.md +7 -2
  11. package/dist/agent-src/commands/ghostwriter/write.md +5 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  14. package/dist/agent-src/commands/orchestrate.md +2 -2
  15. package/dist/agent-src/commands/post-as/me.md +5 -1
  16. package/dist/agent-src/commands/pr/merge.md +19 -6
  17. package/dist/agent-src/commands/roadmap/process-full.md +19 -5
  18. package/dist/agent-src/commands/tdd/red.md +12 -2
  19. package/dist/agent-src/commands/work.md +1 -1
  20. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
  21. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
  22. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
  23. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
  24. package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
  25. package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
  26. package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
  27. package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
  28. package/dist/agent-src/rules/broken-access-control.md +4 -0
  29. package/dist/agent-src/rules/code-provenance.md +4 -0
  30. package/dist/agent-src/rules/design-fidelity.md +1 -1
  31. package/dist/agent-src/rules/domain-safety-pii.md +4 -0
  32. package/dist/agent-src/rules/domain-safety-retention.md +4 -0
  33. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  34. package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
  35. package/dist/agent-src/rules/improve-before-implement.md +6 -8
  36. package/dist/agent-src/rules/laravel-routing.md +1 -1
  37. package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
  38. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  39. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  40. package/dist/agent-src/rules/source-confidentiality.md +12 -34
  41. package/dist/agent-src/rules/symfony-routing.md +1 -1
  42. package/dist/agent-src/rules/token-efficiency.md +14 -0
  43. package/dist/agent-src/rules/tool-safety.md +4 -0
  44. package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
  45. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  46. package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
  47. package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
  48. package/dist/agent-src/scripts/stub_queue.ts +82 -0
  49. package/dist/agent-src/scripts/stubs_due.ts +400 -0
  50. package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
  51. package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
  52. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
  53. package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
  54. package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
  55. package/dist/agent-src/skills/database/SKILL.md +8 -0
  56. package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
  57. package/dist/agent-src/skills/design-review/SKILL.md +1 -1
  58. package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
  60. package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
  61. package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
  62. package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
  63. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
  64. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
  65. package/dist/agent-src/skills/laravel/SKILL.md +35 -0
  66. package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
  67. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
  68. package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
  69. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
  70. package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
  71. package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
  72. package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
  73. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
  74. package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
  75. package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
  76. package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
  77. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  78. package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
  79. package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
  80. package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
  81. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
  82. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  83. package/dist/agent-src/templates/roadmaps.md +97 -3
  84. package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
  85. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  86. package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
  87. package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
  88. package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  89. package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  90. package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  91. package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  92. package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  93. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  94. package/dist/cli/commands/uiAudit.js +124 -5
  95. package/dist/cli/registry.js +2 -0
  96. package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
  97. package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
  98. package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
  99. package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
  100. package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
  101. package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
  102. package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
  103. package/dist/cli-delegate/cmd_adr_effective.js +102 -0
  104. package/dist/cli-delegate/cmd_conformance.js +42 -10
  105. package/dist/cli-delegate/cmd_doctor.js +3 -3
  106. package/dist/cli-delegate/cmd_export.js +3 -2
  107. package/dist/cli-delegate/cmd_fleet.js +2 -2
  108. package/dist/cli-delegate/cmd_handoff.js +1 -1
  109. package/dist/cli-delegate/cmd_preflight.js +2 -2
  110. package/dist/cli-delegate/cmd_prune.js +3 -2
  111. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  112. package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
  113. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  114. package/dist/cli-delegate/cmd_sync.js +3 -2
  115. package/dist/cli-delegate/cmd_uninstall.js +3 -2
  116. package/dist/cli-delegate/cmd_validate.js +3 -2
  117. package/dist/discovery/deprecation-report.md +1 -1
  118. package/dist/discovery/discovery-manifest.json +57 -57
  119. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  120. package/dist/discovery/discovery-manifest.summary.md +1 -1
  121. package/dist/discovery/dormancy-report.md +1 -1
  122. package/dist/discovery/orphan-report.md +1 -1
  123. package/dist/discovery/packs.json +2 -2
  124. package/dist/discovery/trust-report.md +1 -1
  125. package/dist/discovery/workspaces.json +2 -2
  126. package/dist/hooks/dispatch.js +1836 -712
  127. package/dist/install/claudeRuleRewrite.js +254 -0
  128. package/dist/install/detect.js +29 -16
  129. package/dist/install/detect_php_shape.js +159 -0
  130. package/dist/install/install.mjs +634 -428
  131. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  132. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  133. package/dist/mcp/registry-manifest.json +3 -3
  134. package/dist/mcp/server.json +3 -3
  135. package/dist/mcp/server.mjs +4818 -2645
  136. package/dist/server/schemas/settings.js +3 -0
  137. package/dist/ui/assets/index-D0jaCRPM.js +29 -0
  138. package/dist/ui/index.html +1 -1
  139. package/docs/MIGRATION.md +1 -1
  140. package/docs/THIRD-PARTY-NOTICES.md +25 -0
  141. package/docs/contracts/provider-lifecycle.md +1 -1
  142. package/docs/contracts/settings-classes.md +10 -4
  143. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  144. package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
  145. package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
  146. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
  147. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  148. package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
  149. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  150. package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
  151. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  152. package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
  153. package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
  154. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
  155. package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
  156. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  157. package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
  158. package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
  159. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  160. package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
  161. package/docs/guidelines/agent-infra/layered-settings.md +10 -10
  162. package/docs/guidelines/agent-infra/memory-access.md +1 -1
  163. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  164. package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
  165. package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
  166. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
  167. package/docs/guidelines/agent-infra/role-contracts.md +2 -2
  168. package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
  169. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  170. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  171. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
  172. package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
  173. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  174. package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
  175. package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
  176. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  177. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  178. package/docs/guidelines/augment-portability-patterns.md +6 -4
  179. package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
  180. package/docs/guidelines/cross-role-handoff.md +2 -2
  181. package/docs/guidelines/design-fidelity-mechanics.md +1 -1
  182. package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
  183. package/docs/guidelines/php/database.md +90 -7
  184. package/docs/guidelines/prompt-templates.md +7 -7
  185. package/llms.txt +2 -2
  186. package/package.json +5 -2
  187. package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
  188. package/src/agent-src/scripts/guarded_baseline.ts +328 -0
  189. package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
  190. package/src/agent-src/scripts/stub_queue.ts +82 -0
  191. package/src/agent-src/scripts/stubs_due.ts +400 -0
  192. package/src/agent-src/scripts/ticket_bundles.ts +84 -0
  193. package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
  194. package/src/agent-src/templates/scripts/check_memory.ts +258 -17
  195. package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
  196. package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
  197. package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
  198. package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
  199. package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
  200. package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
  201. package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
  202. package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
  203. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
  204. package/src/config/agent-settings.template.yml +32 -3
  205. package/src/config/assurance-capability-registry.json +21 -9
  206. package/src/config/canonical-terms.yml +119 -0
  207. package/src/config/capability-native-outcome-bars.json +81 -0
  208. package/src/config/ci-local-parity.yml +80 -0
  209. package/src/config/drafting-channels.yml +43 -0
  210. package/src/config/estate-count-budget.json +38 -36
  211. package/src/config/evaluator-budgets.json +14 -14
  212. package/src/config/gate-coverage.yml +579 -63
  213. package/src/config/gate-reachability-exemptions.json +21 -0
  214. package/src/config/gate-violation-baselines.json +37 -19
  215. package/src/config/harness-evolution-budget.json +25 -0
  216. package/src/config/lapsed-beta-baseline.json +96 -0
  217. package/src/config/memory-twin-verdicts.yml +129 -0
  218. package/src/config/metric-registry.yml +124 -0
  219. package/src/config/pack-size-budget.json +16 -15
  220. package/src/config/preamble-payload-budget.json +8 -8
  221. package/src/config/profiles/balanced.ini +27 -0
  222. package/src/config/profiles/full.ini +27 -0
  223. package/src/config/profiles/minimal.ini +27 -0
  224. package/src/config/publish-surface.json +9 -2
  225. package/src/config/routing-coverage-seed.json +16 -2
  226. package/src/config/rule-stub-ceilings.json +126 -112
  227. package/src/config/turnaround-budget.json +66 -0
  228. package/src/install/claudeRuleRewrite.ts +288 -0
  229. package/src/install/detect.ts +60 -17
  230. package/src/install/detect_php_shape.ts +191 -0
  231. package/src/scripts/_cli/cmd_doctor.ts +27 -112
  232. package/src/scripts/_dispatch.bash +27 -0
  233. package/src/scripts/_lib/activation_ladder.ts +211 -0
  234. package/src/scripts/_lib/activation_states.ts +88 -0
  235. package/src/scripts/_lib/adherence_detectors.ts +143 -0
  236. package/src/scripts/_lib/arith_claims.ts +181 -0
  237. package/src/scripts/_lib/arm_ranking.ts +62 -0
  238. package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
  239. package/src/scripts/_lib/audit_field_provenance.ts +54 -0
  240. package/src/scripts/_lib/auto_dispatch.ts +32 -3
  241. package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
  242. package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
  243. package/src/scripts/_lib/candidate_proposer.ts +402 -0
  244. package/src/scripts/_lib/candidate_record.ts +601 -0
  245. package/src/scripts/_lib/capture_rate.ts +319 -0
  246. package/src/scripts/_lib/collector_denominator.ts +771 -0
  247. package/src/scripts/_lib/collector_record.ts +340 -0
  248. package/src/scripts/_lib/collector_store.ts +664 -0
  249. package/src/scripts/_lib/collector_supervision.ts +827 -0
  250. package/src/scripts/_lib/concern_estate.ts +77 -0
  251. package/src/scripts/_lib/config_chain.ts +477 -0
  252. package/src/scripts/_lib/config_cost.ts +209 -0
  253. package/src/scripts/_lib/council_settings_block.ts +6 -0
  254. package/src/scripts/_lib/curator_ops.ts +172 -0
  255. package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
  256. package/src/scripts/_lib/delivery_criticality.ts +126 -0
  257. package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
  258. package/src/scripts/_lib/empty_cycles.ts +88 -0
  259. package/src/scripts/_lib/eval_publication.ts +354 -0
  260. package/src/scripts/_lib/evaluation_vector.ts +283 -0
  261. package/src/scripts/_lib/evaluator_promotion.ts +225 -0
  262. package/src/scripts/_lib/evidence_basis.ts +118 -0
  263. package/src/scripts/_lib/exec_evidence.ts +8 -0
  264. package/src/scripts/_lib/experience_card.ts +272 -0
  265. package/src/scripts/_lib/experience_report.ts +151 -0
  266. package/src/scripts/_lib/experiment_freeze.ts +112 -0
  267. package/src/scripts/_lib/generated_by.ts +66 -0
  268. package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
  269. package/src/scripts/_lib/hook_effect_probe.ts +141 -0
  270. package/src/scripts/_lib/host_denominator.ts +687 -0
  271. package/src/scripts/_lib/host_projection_reach.ts +157 -0
  272. package/src/scripts/_lib/ignored_blocker.ts +148 -0
  273. package/src/scripts/_lib/install_reach_checks.ts +495 -0
  274. package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
  275. package/src/scripts/_lib/judge_hygiene.ts +228 -0
  276. package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
  277. package/src/scripts/_lib/loop_guards.ts +299 -0
  278. package/src/scripts/_lib/loss_class.ts +129 -0
  279. package/src/scripts/_lib/machine_wake.ts +51 -0
  280. package/src/scripts/_lib/md_prose_lines.ts +177 -0
  281. package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
  282. package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
  283. package/src/scripts/_lib/orchestration_record.ts +253 -5
  284. package/src/scripts/_lib/outcome_envelope.ts +227 -0
  285. package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
  286. package/src/scripts/_lib/paired_stats.ts +245 -0
  287. package/src/scripts/_lib/paired_verdict.ts +226 -0
  288. package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
  289. package/src/scripts/_lib/privacy_class.ts +47 -0
  290. package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
  291. package/src/scripts/_lib/repeated_failure.ts +105 -0
  292. package/src/scripts/_lib/repo_root.ts +111 -0
  293. package/src/scripts/_lib/review_skipped_record.ts +37 -0
  294. package/src/scripts/_lib/role_split.ts +338 -0
  295. package/src/scripts/_lib/runtime_journal.ts +1499 -0
  296. package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
  297. package/src/scripts/_lib/skill_catalogue.ts +11 -1
  298. package/src/scripts/_lib/source_digest.ts +200 -0
  299. package/src/scripts/_lib/source_redact.ts +260 -0
  300. package/src/scripts/_lib/source_shape.ts +502 -0
  301. package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
  302. package/src/scripts/_lib/strip_comments.d.mts +8 -0
  303. package/src/scripts/_lib/strip_comments.mjs +65 -0
  304. package/src/scripts/_lib/test_red_state.ts +154 -0
  305. package/src/scripts/_lib/trigger_shift.ts +144 -0
  306. package/src/scripts/_lib/untrusted_content.ts +82 -7
  307. package/src/scripts/adoption_report.ts +1 -1
  308. package/src/scripts/adr/evidence_census.ts +1 -1
  309. package/src/scripts/adr/regenerate_index.ts +26 -2
  310. package/src/scripts/adr_cite_check.ts +164 -1
  311. package/src/scripts/ai_council/blind_review.ts +11 -1
  312. package/src/scripts/ai_council/clients.ts +4 -0
  313. package/src/scripts/ai_council/config.ts +3 -0
  314. package/src/scripts/ai_council/consensus.ts +28 -8
  315. package/src/scripts/ai_council/consensus_round.ts +226 -0
  316. package/src/scripts/ai_council/disagreement_signal.ts +338 -0
  317. package/src/scripts/ai_council/inline_findings.ts +340 -0
  318. package/src/scripts/ai_council/judge_position_bias.ts +197 -0
  319. package/src/scripts/ai_council/orchestrator.ts +16 -203
  320. package/src/scripts/ai_council/orchestrator_results.ts +23 -3
  321. package/src/scripts/ai_council/pricing.ts +106 -0
  322. package/src/scripts/ai_council/prompts.ts +74 -7
  323. package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
  324. package/src/scripts/ai_council/py_format.ts +14 -3
  325. package/src/scripts/ai_council/recouncil_guard.ts +293 -0
  326. package/src/scripts/ai_council/response_record.ts +50 -0
  327. package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
  328. package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
  329. package/src/scripts/asset_delivery_ledger.ts +157 -0
  330. package/src/scripts/attest_artifact.ts +193 -0
  331. package/src/scripts/audit_auto_rules.ts +2 -1
  332. package/src/scripts/audit_command_surface.ts +1 -1
  333. package/src/scripts/audit_mcp_tools.ts +2 -2
  334. package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
  335. package/src/scripts/audit_user_type_axis.ts +2 -1
  336. package/src/scripts/bench_ab_clone.ts +215 -10
  337. package/src/scripts/bench_ab_integrity.ts +119 -5
  338. package/src/scripts/bench_ab_v2_stats.ts +40 -213
  339. package/src/scripts/build_archive_index.ts +1 -1
  340. package/src/scripts/build_linear_digest.ts +1 -1
  341. package/src/scripts/build_proof.ts +11 -4
  342. package/src/scripts/build_rule_trigger_matrix.ts +1 -1
  343. package/src/scripts/build_source_digests.ts +157 -0
  344. package/src/scripts/cache_realization_report.ts +103 -0
  345. package/src/scripts/check_adr_frontmatter.ts +126 -0
  346. package/src/scripts/check_benchmark_report_fields.ts +207 -0
  347. package/src/scripts/check_beta_review_markers.ts +235 -6
  348. package/src/scripts/check_bundle_path_leakage.ts +34 -1
  349. package/src/scripts/check_claims.ts +576 -6
  350. package/src/scripts/check_composite_arming.ts +35 -0
  351. package/src/scripts/check_concern_admissions.ts +365 -0
  352. package/src/scripts/check_enforcement_coverage.ts +28 -0
  353. package/src/scripts/check_estate_count.ts +142 -1
  354. package/src/scripts/check_gate_reachability.ts +383 -0
  355. package/src/scripts/check_host_loadability.ts +104 -0
  356. package/src/scripts/check_loss_class_declared.ts +308 -0
  357. package/src/scripts/check_md_language.ts +15 -98
  358. package/src/scripts/check_memory_proposal.ts +18 -11
  359. package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
  360. package/src/scripts/check_no_external_sources.ts +281 -6
  361. package/src/scripts/check_pack_conformance_fixture.ts +11 -1
  362. package/src/scripts/check_pack_size.ts +59 -2
  363. package/src/scripts/check_preamble_payload_budget.ts +114 -3
  364. package/src/scripts/check_prefix_stable_mutation.ts +372 -0
  365. package/src/scripts/check_publish_surface.ts +10 -1
  366. package/src/scripts/check_references.ts +24 -1
  367. package/src/scripts/check_rule_evidence_declaration.ts +316 -0
  368. package/src/scripts/check_rule_projection_integrity.ts +14 -4
  369. package/src/scripts/check_score_contract.ts +26 -3
  370. package/src/scripts/check_static_parity.ts +285 -0
  371. package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
  372. package/src/scripts/check_suppression_hygiene.ts +15 -0
  373. package/src/scripts/ci_settle.ts +39 -2
  374. package/src/scripts/code_graph/build.ts +60 -3
  375. package/src/scripts/code_graph/extract.ts +44 -0
  376. package/src/scripts/code_graph/types.ts +24 -0
  377. package/src/scripts/collector_daemon.ts +714 -0
  378. package/src/scripts/config_cost_report.ts +302 -0
  379. package/src/scripts/consumer_matrix.ts +74 -1
  380. package/src/scripts/cost/budget.mjs +10 -3
  381. package/src/scripts/cost/track.mjs +10 -3
  382. package/src/scripts/council_cli.ts +37 -54
  383. package/src/scripts/dispatch_r2_reviewer.ts +46 -5
  384. package/src/scripts/evolution_lab.ts +980 -0
  385. package/src/scripts/external_sources_denylist.json +5 -18
  386. package/src/scripts/extract_audit_patterns.ts +21 -0
  387. package/src/scripts/fold_intake.ts +12 -1
  388. package/src/scripts/gen_discovery_baseline.ts +1 -1
  389. package/src/scripts/generate_capabilities_index.ts +12 -5
  390. package/src/scripts/generate_capability_matrix.ts +3 -3
  391. package/src/scripts/generate_command_flows.ts +2 -2
  392. package/src/scripts/generate_cookbook.ts +2 -2
  393. package/src/scripts/generate_index.ts +8 -1
  394. package/src/scripts/generate_knowledge_index.ts +2 -1
  395. package/src/scripts/generate_ownership_matrix.ts +2 -1
  396. package/src/scripts/generate_pack_manifests.ts +10 -2
  397. package/src/scripts/generate_role_experiences_catalog.ts +2 -2
  398. package/src/scripts/generate_settings_reference.ts +1 -1
  399. package/src/scripts/git_authorization_hook.ts +22 -1
  400. package/src/scripts/grade_target_readiness.ts +48 -5
  401. package/src/scripts/hook_effect_doctor.ts +261 -0
  402. package/src/scripts/hook_manifest.json +1 -1
  403. package/src/scripts/hook_manifest.yaml +98 -11
  404. package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
  405. package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
  406. package/src/scripts/hooks/concern_registry.ts +4 -0
  407. package/src/scripts/hooks/dispatch_hook.ts +32 -0
  408. package/src/scripts/hooks/journal_record_hook.ts +345 -0
  409. package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
  410. package/src/scripts/hooks/run_continuation_hook.ts +44 -9
  411. package/src/scripts/hooks/shims/install.sh +61 -0
  412. package/src/scripts/hooks/shims/php +101 -0
  413. package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
  414. package/src/scripts/hot_context_hook.ts +16 -0
  415. package/src/scripts/install-hooks.sh +20 -5
  416. package/src/scripts/install.ts +17 -35
  417. package/src/scripts/inventory_frontmatter.ts +2 -1
  418. package/src/scripts/lint_adr_sweep_routing.ts +12 -0
  419. package/src/scripts/lint_canonical_terms.ts +604 -0
  420. package/src/scripts/lint_composition_review.ts +619 -0
  421. package/src/scripts/lint_consolidation_lineage.ts +666 -0
  422. package/src/scripts/lint_eval_specs.ts +593 -0
  423. package/src/scripts/lint_hook_manifest.ts +19 -0
  424. package/src/scripts/lint_host_portability.ts +373 -0
  425. package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
  426. package/src/scripts/lint_memory_twin_parity.ts +335 -0
  427. package/src/scripts/lint_metric_consumers.ts +355 -0
  428. package/src/scripts/lint_skill_descriptions.ts +18 -1
  429. package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
  430. package/src/scripts/lint_skill_link_reach.ts +252 -0
  431. package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
  432. package/src/scripts/lint_ticket_buildable.ts +17 -1
  433. package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
  434. package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
  435. package/src/scripts/measure_docs_dead_links.ts +348 -0
  436. package/src/scripts/measure_host_capture.ts +461 -0
  437. package/src/scripts/migration_status.ts +3 -3
  438. package/src/scripts/model_rule_injection.ts +60 -0
  439. package/src/scripts/orchestration_record.ts +14 -0
  440. package/src/scripts/preamble_byte_census.ts +139 -10
  441. package/src/scripts/prepack-check.mjs +4 -1
  442. package/src/scripts/probe_turnaround.ts +384 -0
  443. package/src/scripts/probe_unblocked_ask.ts +279 -0
  444. package/src/scripts/render_benchmark_md.ts +1 -1
  445. package/src/scripts/rule_activation_census.ts +70 -9
  446. package/src/scripts/rule_backlinks.ts +1 -1
  447. package/src/scripts/run_lifecycle_suite.ts +208 -0
  448. package/src/scripts/run_skill_evals.ts +40 -0
  449. package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
  450. package/src/scripts/schemas/drafting-channels.schema.json +43 -0
  451. package/src/scripts/schemas/evals.schema.json +24 -1
  452. package/src/scripts/schemas/rule.schema.json +52 -1
  453. package/src/scripts/schemas/skill.schema.json +17 -2
  454. package/src/scripts/skill_overlap.ts +7 -1
  455. package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
  456. package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
  457. package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
  458. package/src/scripts/skill_usage_report.ts +2 -1
  459. package/src/scripts/stubs_due.ts +211 -0
  460. package/src/scripts/sweep_source_surfaces.ts +678 -0
  461. package/src/scripts/sync_pr_branch.ts +3 -3
  462. package/src/scripts/trigger_eval_grandfather.json +202 -222
  463. package/src/scripts/utilization_report.ts +22 -2
  464. package/src/server/schemas/settings.ts +5 -0
  465. package/src/templates/marketing-copy.yml +1 -1
  466. package/dist/ui/assets/index-Cxgy63kz.js +0 -26
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Rewrite installed Claude Code rule files into host form, in place.
3
+ *
4
+ * ## The gap this closes
5
+ *
6
+ * `condense.ts::_emit_claude_rule` shapes a rule for Claude Code — it emits
7
+ * `paths:` and nothing else, because `paths:` is the one activation key the
8
+ * probed contract records this host as reading. It runs on the MAINTAINER
9
+ * projection path only. The installer's deploy loop copies
10
+ * `dist/agent-src/rules/` verbatim into the host anchor
11
+ * (`_copy_dir_dereferencing_symlinks`, `install.ts`), so an installed
12
+ * `~/.claude/rules/` receives the SOURCE form: agent-config's own frontmatter
13
+ * vocabulary (`type`, `tier`, `triggers`, …), none of which this host reads.
14
+ *
15
+ * Measured on a real install, 2026-08-30, before this module existed:
16
+ *
17
+ * ```
18
+ * files 104 · declaring paths: 0
19
+ * ⚠️ diverges from the source verdict (4 scoped)
20
+ * ```
21
+ *
22
+ * The consequence is not cosmetic. On Claude Code `paths:` is EXCLUSIVE — with
23
+ * it a rule loads on a path match, without it the rule loads unconditionally —
24
+ * so three rules the emitter classifies path-only arrived in every session
25
+ * instead of on file contact.
26
+ *
27
+ * ## Why it lives here and not in `condense.ts`
28
+ *
29
+ * Same reasoning `claudePathsPlan.ts` beside it records: this is
30
+ * host-activation-key logic on the INSTALL side, and `condense.ts` is a
31
+ * multi-thousand-line orchestrator already past the source-size ceiling. Both
32
+ * of this module's inputs are already installer-side — `_claude_paths_plan`
33
+ * from `claudePathsPlan.ts` and `parseFrontmatter` from `ruleInScope.ts` — so
34
+ * nothing here reaches back into the projection graph, and the installer bundle
35
+ * gains no dependency on it.
36
+ *
37
+ * The two emitters are held together by a test rather than by a shared call:
38
+ * `tests/install/claude_rule_rewrite.test.ts` asserts, over every rule in
39
+ * `src/rules/`, that this module's plan is byte-identical to the one
40
+ * `condense.ts` emits. A divergence fails there rather than silently shipping
41
+ * two different activation surfaces to the same host.
42
+ *
43
+ * Side-effect-free apart from the writes it is asked to make. No CLI entry, no
44
+ * `process.exit`.
45
+ */
46
+ import * as fs from 'node:fs';
47
+ import * as path from 'node:path';
48
+ import { _claude_paths_plan } from './claudePathsPlan.js';
49
+ import { parseFrontmatter } from './ruleInScope.js';
50
+ /**
51
+ * Frontmatter keys the rewrite must carry across, and why each one.
52
+ *
53
+ * `_inject_package_tag` (install.ts) writes these during the copy that runs
54
+ * immediately BEFORE this rewrite. `reap_tagged_orphans` then matches on the
55
+ * literal `package:` line — its own docblock calls itself "the only path with
56
+ * ownership proof independent of inventory history" — and doctor's stale-orphan
57
+ * check reads the same tag.
58
+ *
59
+ * A rewrite that rebuilt each file from the activation plan alone therefore
60
+ * DELETED the reaper's only evidence: zero files under the host anchor would
61
+ * carry the tag, the marker-based reaper would be dead for that subtree, and
62
+ * doctor would report `ok` there permanently. Found by the completion review of
63
+ * 2026-08-30, with a fixture: a tagged orphan was reaped before the rewrite and
64
+ * invisible after it.
65
+ *
66
+ * So the host form is activation keys PLUS these, and the two concerns are kept
67
+ * apart on purpose — {@link renderClaudeRule} stays activation-only so it can go
68
+ * on being compared byte-for-byte against the projection emitter, which never
69
+ * sees an install-time tag.
70
+ */
71
+ export const PRESERVED_KEYS = ['package', 'source_path'];
72
+ /**
73
+ * Splice the ownership keys of `original` into the activation-only `rendered`.
74
+ *
75
+ * Raw lines are carried across verbatim rather than re-serialised, so a quoted
76
+ * or unusually-spaced value cannot drift on the way through — the reaper matches
77
+ * a literal.
78
+ */
79
+ export function _withPreservedKeys(rendered, original) {
80
+ const keep = [];
81
+ if (original.startsWith('---')) {
82
+ const end = original.indexOf('\n---', 3);
83
+ if (end !== -1) {
84
+ for (const line of original.slice(3, end).split('\n')) {
85
+ if (PRESERVED_KEYS.some((k) => line.startsWith(`${k}:`)))
86
+ keep.push(line);
87
+ }
88
+ }
89
+ }
90
+ if (keep.length === 0)
91
+ return rendered;
92
+ if (rendered.startsWith('---\n')) {
93
+ const end = rendered.indexOf('\n---', 3);
94
+ if (end !== -1) {
95
+ return rendered.slice(0, end) + '\n' + keep.join('\n') + rendered.slice(end);
96
+ }
97
+ }
98
+ // No activation block: the rule loads unconditionally and still needs its
99
+ // tag, so it gets a frontmatter block holding ONLY the ownership keys.
100
+ return ['---', ...keep, '---', '', rendered].join('\n');
101
+ }
102
+ /**
103
+ * Rewrite, then render the two operator-facing lines the installer prints.
104
+ *
105
+ * The reporting lives here rather than at the call site for the reason
106
+ * `claudePathsPlan.ts` records for itself: `install.ts` is thousands of lines
107
+ * past `check_source_size_budget`'s ceiling, where every added line counts as a
108
+ * violation, and that gate's convention is that the total moves down through
109
+ * extraction and never up through a baseline raise. So the caller gets one call
110
+ * and a list of strings.
111
+ */
112
+ export function rewriteAndReport(rulesDir, quiet, info, warn, wrappers) {
113
+ const result = rewriteClaudeRules(rulesDir);
114
+ // The flat-command wrapper report rides along rather than sitting at the
115
+ // call site: `install.ts` is thousands of lines past
116
+ // `check_source_size_budget`'s ceiling, and this module is the one place
117
+ // that already owns claude-code post-copy reporting. Moving it here is the
118
+ // reduction that pays for this feature's own lines — that gate's stated
119
+ // convention is that the total falls through extraction and never rises
120
+ // through a baseline edit. Messages are byte-identical to the originals.
121
+ if (wrappers && !quiet) {
122
+ if (wrappers.wrapped.length > 0) {
123
+ info(` claude-code: ${wrappers.wrapped.length} visible flat command(s) projected as ` +
124
+ 'skill wrappers (Claude Code flat-command discovery workaround)');
125
+ }
126
+ if (wrappers.reserved.length > 0) {
127
+ info(` claude-code: ${wrappers.reserved.length} flat command(s) withheld — name is a ` +
128
+ `Claude Code built-in (${wrappers.reserved.join(', ')}); nested /cluster:sub ` +
129
+ 'commands remain available');
130
+ }
131
+ }
132
+ if (result.rewritten > 0 && !quiet) {
133
+ info(` claude-code: ${result.rewritten} rule(s) rewritten to host form; ` +
134
+ `${result.scoped.length} path-scoped (${result.scoped.join(', ') || 'none'})`);
135
+ }
136
+ // NOT one line per dropped pattern. Every mixed-trigger rule drops every
137
+ // pattern it has, by design and permanently, so the per-pattern loop emitted
138
+ // 19 stderr lines on every single install — unactionable by any consumer,
139
+ // surviving --quiet because `warn` writes unconditionally. This repository
140
+ // has already recorded its verdict on exactly that pattern elsewhere in the
141
+ // emitter. One counted line under --quiet's own guard; the detail stays in
142
+ // the returned struct for a caller that wants it.
143
+ if (result.dropped.length > 0 && !quiet) {
144
+ const rules = [...new Set(result.dropped.map((d) => d.rule))];
145
+ info(` claude-code: ${rules.length} rule(s) keep unconditional activation ` +
146
+ '(mixed path + keyword triggers; `paths:` is exclusive on this host)');
147
+ }
148
+ for (const f of result.failed) {
149
+ warn(` claude-code: ${f.rule}: could not write host form — ${f.reason}`);
150
+ }
151
+ return result;
152
+ }
153
+ /** Python `str.rstrip()` with no args — mirrors `condense.ts::_pyRstrip`. */
154
+ function pyRstrip(s) {
155
+ return s.replace(/\s+$/u, '');
156
+ }
157
+ /** Mirrors `condense.ts::_yaml_scalar`. */
158
+ function yamlScalar(value) {
159
+ return JSON.stringify(value);
160
+ }
161
+ /**
162
+ * Render one rule's host form from its source text.
163
+ *
164
+ * Exported for the equivalence test. A rule with no path-shaped trigger gets
165
+ * NO frontmatter at all rather than an empty block the host would ignore —
166
+ * keys that do nothing are bytes in every session's standing context.
167
+ */
168
+ export function renderClaudeRule(sourceText) {
169
+ const [meta, body] = parseFrontmatter(sourceText);
170
+ const plan = _claude_paths_plan(meta);
171
+ const lines = [];
172
+ if (plan.globs.length > 0) {
173
+ lines.push('---', 'paths:');
174
+ for (const g of plan.globs) {
175
+ lines.push(` - ${yamlScalar(g)}`);
176
+ }
177
+ lines.push('---', '');
178
+ }
179
+ lines.push(pyRstrip(body) + '\n');
180
+ return { text: lines.join('\n'), globs: plan.globs, dropped: plan.dropped };
181
+ }
182
+ /**
183
+ * Rewrite every `*.md` directly under `rulesDir` into Claude host form.
184
+ *
185
+ * Idempotent: a file already in host form parses to `{paths: [...]}`, which
186
+ * carries no `triggers:` key, so `_claude_paths_plan` returns no globs and the
187
+ * rewrite would DROP the block. That is why the already-rewritten case is
188
+ * detected and skipped rather than re-run — re-running is the silent-widening
189
+ * failure this module exists to fix, applied to its own output.
190
+ *
191
+ * Returns counts rather than printing. The caller owns the reporting surface.
192
+ */
193
+ export function rewriteClaudeRules(rulesDir) {
194
+ const result = { rewritten: 0, scoped: [], dropped: [], failed: [] };
195
+ let entries;
196
+ try {
197
+ entries = fs.readdirSync(rulesDir);
198
+ }
199
+ catch {
200
+ return result;
201
+ }
202
+ for (const name of entries.filter((n) => n.endsWith('.md')).sort()) {
203
+ const full = path.join(rulesDir, name);
204
+ let stat;
205
+ try {
206
+ stat = fs.lstatSync(full);
207
+ }
208
+ catch {
209
+ continue;
210
+ }
211
+ // A symlink here is the legacy raw-md farm, not an installed copy.
212
+ // Rewriting through it would write into the projection source.
213
+ if (!stat.isFile() || stat.isSymbolicLink())
214
+ continue;
215
+ let text;
216
+ try {
217
+ text = fs.readFileSync(full, 'utf-8');
218
+ }
219
+ catch {
220
+ continue;
221
+ }
222
+ const [meta] = parseFrontmatter(text);
223
+ // Already host form: `paths:` present and no source vocabulary left.
224
+ if (meta['paths'] !== undefined && meta['triggers'] === undefined)
225
+ continue;
226
+ const rendered = renderClaudeRule(text);
227
+ const withOwnership = _withPreservedKeys(rendered.text, text);
228
+ if (withOwnership !== text) {
229
+ try {
230
+ fs.writeFileSync(full, withOwnership, 'utf-8');
231
+ }
232
+ catch (e) {
233
+ // A single unwritable rule — a root-owned file left by an
234
+ // earlier `sudo` install — must not abort the whole install and
235
+ // skip every remaining tool, the inventory record, the lockfile
236
+ // correction and the fingerprint stamp. Report and continue.
237
+ result.failed.push({
238
+ rule: name.slice(0, -3),
239
+ reason: e instanceof Error ? e.message : String(e),
240
+ });
241
+ continue;
242
+ }
243
+ result.rewritten += 1;
244
+ }
245
+ const stem = name.slice(0, -3);
246
+ if (rendered.globs.length > 0)
247
+ result.scoped.push(stem);
248
+ for (const d of rendered.dropped) {
249
+ result.dropped.push({ rule: stem, pattern: d.pattern, reason: d.reason });
250
+ }
251
+ }
252
+ return result;
253
+ }
254
+ //# sourceMappingURL=claudeRuleRewrite.js.map
@@ -30,10 +30,16 @@ export const SETTINGS_FILE = '.agent-settings.yml';
30
30
  /**
31
31
  * Manifest files that, when present, count as a project-shape signal.
32
32
  *
33
- * Listed in the order they are most commonly canonical; detection
34
- * short-circuits on the first hit. `.git/` is intentionally absent —
35
- * monorepos, dotfile-git repos, and non-Git workspaces all break it
36
- * (ADR-007 D2).
33
+ * `.git/` is intentionally absent — monorepos, dotfile-git repos, and non-Git
34
+ * workspaces all break it (ADR-007 D2). **That clause is about the `.git/`
35
+ * signal and nothing else.** It used to be cited here for a second property as
36
+ * well — that detection "short-circuits on the first hit" — which ADR-007 D2
37
+ * does not state. The citation was corrected on 2026-08-26
38
+ * (road-to-internal-estate-fit 2.2), and the behaviour it described was
39
+ * corrected with it: `detectProjectShape` now returns EVERY detected manifest
40
+ * (2.1), so the order below is a reporting order rather than a tie-break, and
41
+ * a polyglot repository is described as what it is instead of as its first
42
+ * alphabetically-privileged half.
37
43
  */
38
44
  export const SCOPE_DETECT_MANIFESTS = [
39
45
  'package.json',
@@ -106,20 +112,27 @@ export function scopeToTarget(scope) {
106
112
  * Manifest-to-kind mapping mirrors {@link SCOPE_DETECT_MANIFESTS}:
107
113
  * `package.json` → npm, `composer.json` → composer, etc.
108
114
  */
115
+ const MANIFEST_KIND = {
116
+ 'package.json': 'npm',
117
+ 'composer.json': 'composer',
118
+ 'pyproject.toml': 'pyproject',
119
+ 'Cargo.toml': 'cargo',
120
+ 'go.mod': 'go',
121
+ Gemfile: 'ruby',
122
+ };
109
123
  export function detectProjectShape(root) {
110
- const manifest = SCOPE_DETECT_MANIFESTS.find((m) => existsSync(join(root, m)));
111
- if (manifest === undefined) {
112
- return { kind: 'unknown', root, manifest: null };
124
+ const manifests = SCOPE_DETECT_MANIFESTS.filter((m) => existsSync(join(root, m)));
125
+ if (manifests.length === 0) {
126
+ return { kind: 'unknown', root, manifest: null, kinds: [], manifests: [] };
113
127
  }
114
- const kind = {
115
- 'package.json': 'npm',
116
- 'composer.json': 'composer',
117
- 'pyproject.toml': 'pyproject',
118
- 'Cargo.toml': 'cargo',
119
- 'go.mod': 'go',
120
- Gemfile: 'ruby',
121
- }[manifest] ?? 'unknown';
122
- return { kind, root, manifest };
128
+ const kinds = manifests.map((m) => MANIFEST_KIND[m] ?? 'unknown');
129
+ return {
130
+ kind: kinds[0],
131
+ root,
132
+ manifest: manifests[0],
133
+ kinds,
134
+ manifests,
135
+ };
123
136
  }
124
137
  /** Read AI-tool presence flags from `root`. Pure — no writes. */
125
138
  export function detectToolPresence(root) {
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Which PHP application shape is in play — decided from the entry point and the
3
+ * router, never from the dependency list.
4
+ *
5
+ * `road-to-consumer-repo-reality` Phase 3. A dependency proves a library is
6
+ * AVAILABLE. Only the entry point and the routing mechanism prove which
7
+ * application shape is actually running.
8
+ *
9
+ * THE THIRD STATE IS THE POINT. Component-based distribution is a published
10
+ * model: a framework family ships its ORM, container, collections and HTTP
11
+ * layer as independently installable packages, usable with no framework
12
+ * present. PHP has at least two families distributed exactly this way, so the
13
+ * shape is a property of the DISTRIBUTION MODEL and not of any one consumer.
14
+ *
15
+ * Dependency-presence routing sends such an application to the framework's
16
+ * skill, which then offers a CLI that does not exist, a request-validation
17
+ * primitive that is not wired, and a routes file that was never there. Every
18
+ * suggestion is confidently wrong, and the reason is visible only from the
19
+ * entry point.
20
+ *
21
+ * COST IS THE OTHER HALF OF THE DESIGN. Risk-register rank 7: "the third
22
+ * framework state is added but never fires, because the discriminator is
23
+ * expensive to evaluate". So the discriminator is a FIXED SET of at most
24
+ * `PROBE_COUNT` filesystem existence checks plus one manifest read — no
25
+ * directory walk, no content scan, no per-session re-derivation. The probe set
26
+ * is exported so a caller can state the cost rather than estimate it.
27
+ */
28
+ import * as fs from 'node:fs';
29
+ import * as path from 'node:path';
30
+ /**
31
+ * Skeleton markers — the files a framework's own installer writes and a
32
+ * component consumer never has. Presence of ANY marker for a family is what
33
+ * makes the framework real rather than merely available.
34
+ *
35
+ * These are the framework's console entry point and its bootstrap config, both
36
+ * generated by the official skeleton and both absent when a developer wires the
37
+ * components by hand.
38
+ */
39
+ export const SKELETON_MARKERS = {
40
+ laravel: ['artisan', path.join('config', 'app.php'), path.join('bootstrap', 'app.php')],
41
+ symfony: [path.join('bin', 'console'), path.join('config', 'bundles.php'), path.join('config', 'services.yaml')],
42
+ };
43
+ /**
44
+ * Composer package prefixes that prove a family's COMPONENTS are available.
45
+ * Availability only — this is deliberately never sufficient for a verdict.
46
+ */
47
+ export const COMPONENT_PREFIXES = {
48
+ laravel: ['illuminate/'],
49
+ symfony: ['symfony/'],
50
+ };
51
+ /** The whole framework, as opposed to its parts. */
52
+ const FRAMEWORK_PACKAGES = {
53
+ laravel: ['laravel/framework'],
54
+ symfony: ['symfony/framework-bundle'],
55
+ };
56
+ /** Every path this module may stat. The cost, stated rather than estimated. */
57
+ export const PROBE_PATHS = [
58
+ 'composer.json',
59
+ ...SKELETON_MARKERS.laravel,
60
+ ...SKELETON_MARKERS.symfony,
61
+ ];
62
+ /** Upper bound on filesystem probes for one verdict. */
63
+ export const PROBE_COUNT = PROBE_PATHS.length;
64
+ function _requireKeys(root) {
65
+ try {
66
+ const raw = JSON.parse(fs.readFileSync(path.join(root, 'composer.json'), 'utf8'));
67
+ return [...Object.keys(raw.require ?? {}), ...Object.keys(raw['require-dev'] ?? {})];
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ }
73
+ function _markers(root, family) {
74
+ return SKELETON_MARKERS[family].filter((rel) => fs.existsSync(path.join(root, rel)));
75
+ }
76
+ /**
77
+ * The verdict, in one pass.
78
+ *
79
+ * Order matters and is the whole discriminator: a family is only `laravel` or
80
+ * `symfony` when a **skeleton marker exists**. Components present with no
81
+ * marker is the third state, and it is checked before falling through to
82
+ * `plain-php` so a component consumer is never described as a project with no
83
+ * framework libraries at all.
84
+ */
85
+ export function detectPhpShape(root) {
86
+ let probes = 1;
87
+ const requires = _requireKeys(root);
88
+ if (requires.length === 0 && !fs.existsSync(path.join(root, 'composer.json'))) {
89
+ return {
90
+ shape: 'unknown',
91
+ componentsOf: null,
92
+ markersFound: [],
93
+ reason: 'no composer.json — no PHP application shape to decide',
94
+ probes: probes + 1,
95
+ };
96
+ }
97
+ // TWO PASSES, and the order between them is the fix for a real defect.
98
+ //
99
+ // A single pass that returned on the first family with ANY component present
100
+ // reported a genuine Symfony application as components-without-framework the
101
+ // moment its composer.json also required `illuminate/collections` — because
102
+ // `laravel` is examined first, has a component, has no Laravel skeleton, and
103
+ // returned before Symfony's three markers were ever looked at. Both
104
+ // `illuminate/collections` and `illuminate/support` are widely used
105
+ // standalone, so a mixed manifest is ordinary rather than exotic.
106
+ //
107
+ // PASS 1 — a real skeleton anywhere wins. A framework whose own installer
108
+ // wrote its console entry point and bootstrap config is running, whatever
109
+ // else the manifest happens to carry.
110
+ const present = [];
111
+ for (const family of ['laravel', 'symfony']) {
112
+ const hasFramework = FRAMEWORK_PACKAGES[family].some((p) => requires.includes(p));
113
+ const hasComponents = requires.some((r) => COMPONENT_PREFIXES[family].some((p) => r.startsWith(p)));
114
+ if (!hasFramework && !hasComponents)
115
+ continue;
116
+ present.push(family);
117
+ const markersFound = _markers(root, family);
118
+ probes += SKELETON_MARKERS[family].length;
119
+ if (markersFound.length > 0) {
120
+ return {
121
+ shape: family,
122
+ componentsOf: family,
123
+ markersFound,
124
+ reason: `${family} skeleton present (${markersFound.join(', ')}) — the framework is real, not merely available`,
125
+ probes,
126
+ };
127
+ }
128
+ }
129
+ // PASS 2 — components present, no skeleton for ANY of them. Only now is the
130
+ // third state the right answer, and it names every family whose components
131
+ // are available rather than only the first one examined.
132
+ const first = present[0];
133
+ if (first !== undefined) {
134
+ const missing = present.flatMap((f) => SKELETON_MARKERS[f]);
135
+ const families = present.join(' and ');
136
+ return {
137
+ shape: 'components-without-framework',
138
+ componentsOf: first,
139
+ markersFound: [],
140
+ reason: `${families} component(s) are required in composer.json but NO skeleton marker exists ` +
141
+ `(none of ${missing.join(', ')}). The entry point and router are the ` +
142
+ `application's own, so the framework CLI, its request-validation primitive and its routes ` +
143
+ 'file are not there. Routing to a framework skill would offer all three.',
144
+ probes,
145
+ };
146
+ }
147
+ return {
148
+ shape: 'plain-php',
149
+ componentsOf: null,
150
+ markersFound: [],
151
+ reason: 'composer.json requires no component of either framework family',
152
+ probes,
153
+ };
154
+ }
155
+ /** True when a framework-routing rule must NOT claim this tree. */
156
+ export function frameworkRoutingIsWrong(v) {
157
+ return v.shape === 'components-without-framework';
158
+ }
159
+ //# sourceMappingURL=detect_php_shape.js.map