@event4u/agent-config 8.1.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (615) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/CHANGELOG.md +83 -292
  3. package/MIGRATION.md +18 -0
  4. package/README.md +86 -3
  5. package/dist/agent-src/commands/agents/init.md +3 -3
  6. package/dist/agent-src/commands/chat-history/import.md +5 -5
  7. package/dist/agent-src/commands/chat-history.md +1 -1
  8. package/dist/agent-src/commands/condense.md +1 -1
  9. package/dist/agent-src/commands/context/create.md +1 -1
  10. package/dist/agent-src/commands/council/analysis.md +2 -2
  11. package/dist/agent-src/commands/council/default.md +3 -3
  12. package/dist/agent-src/commands/council/design.md +2 -2
  13. package/dist/agent-src/commands/council/optimize.md +1 -1
  14. package/dist/agent-src/commands/council/pr.md +2 -2
  15. package/dist/agent-src/commands/council.md +1 -1
  16. package/dist/agent-src/commands/feature/plan.md +1 -1
  17. package/dist/agent-src/commands/ghostwriter/list.md +1 -1
  18. package/dist/agent-src/commands/ghostwriter/write.md +1 -1
  19. package/dist/agent-src/commands/ghostwriter.md +1 -1
  20. package/dist/agent-src/commands/implement-ticket.md +2 -2
  21. package/dist/agent-src/commands/judge/on-diff.md +1 -1
  22. package/dist/agent-src/commands/judge/steps.md +3 -1
  23. package/dist/agent-src/commands/memory/add.md +2 -2
  24. package/dist/agent-src/commands/memory/learn-low-impact.md +1 -1
  25. package/dist/agent-src/commands/memory/load.md +1 -1
  26. package/dist/agent-src/commands/memory/mine-session.md +1 -1
  27. package/dist/agent-src/commands/memory/promote.md +1 -1
  28. package/dist/agent-src/commands/memory/propose.md +1 -1
  29. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  30. package/dist/agent-src/commands/module/explore.md +3 -3
  31. package/dist/agent-src/commands/optimize/agents-dir.md +1 -1
  32. package/dist/agent-src/commands/optimize/skills.md +1 -1
  33. package/dist/agent-src/commands/optimize-project.md +1 -1
  34. package/dist/agent-src/commands/orchestrate.md +2 -2
  35. package/dist/agent-src/commands/project-analyze.md +1 -1
  36. package/dist/agent-src/commands/project-health.md +1 -1
  37. package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
  38. package/dist/agent-src/commands/roadmap/create.md +2 -2
  39. package/dist/agent-src/commands/roadmap/process-full.md +3 -1
  40. package/dist/agent-src/commands/roadmap/process-phase.md +4 -2
  41. package/dist/agent-src/commands/roadmap/process-step.md +3 -1
  42. package/dist/agent-src/commands/security-audit-config.md +1 -1
  43. package/dist/agent-src/commands/sync-agent-settings.md +7 -7
  44. package/dist/agent-src/commands/sync-gitignore/fix.md +3 -3
  45. package/dist/agent-src/commands/sync-gitignore.md +4 -4
  46. package/dist/agent-src/commands/work.md +3 -3
  47. package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
  48. package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +2 -2
  49. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +1 -1
  50. package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -7
  51. package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
  52. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +9 -4
  53. package/dist/agent-src/contexts/execution/toolchain-resolver.md +10 -9
  54. package/dist/agent-src/contexts/execution/verification-mechanics.md +13 -1
  55. package/dist/agent-src/packs/README.md +1 -1
  56. package/dist/agent-src/presets/README.md +1 -1
  57. package/dist/agent-src/profiles/README.md +1 -1
  58. package/dist/agent-src/rules/architecture.md +2 -2
  59. package/dist/agent-src/rules/context-hygiene.md +2 -2
  60. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -1
  61. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  62. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +1 -1
  63. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -3
  64. package/dist/agent-src/rules/media-governance-routing.md +1 -1
  65. package/dist/agent-src/rules/no-roadmap-references.md +3 -3
  66. package/dist/agent-src/rules/preservation-guard.md +2 -2
  67. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +6 -5
  68. package/dist/agent-src/rules/roadmap-progress-sync.md +3 -3
  69. package/dist/agent-src/rules/security-sensitive-stop.md +7 -9
  70. package/dist/agent-src/rules/source-confidentiality.md +1 -1
  71. package/dist/agent-src/rules/telegraph-speak.md +1 -1
  72. package/dist/agent-src/rules/token-optimizer-maintenance.md +1 -1
  73. package/dist/agent-src/rules/ui-audit-gate.md +1 -1
  74. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +22 -4
  75. package/dist/agent-src/scripts/update_roadmap_progress.ts +29 -1
  76. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -2
  77. package/dist/agent-src/skills/adr-create/SKILL.md +8 -6
  78. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +1 -1
  79. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
  80. package/dist/agent-src/skills/ai-council/SKILL.md +15 -15
  81. package/dist/agent-src/skills/api-design/SKILL.md +1 -1
  82. package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -1
  83. package/dist/agent-src/skills/authz-review/SKILL.md +1 -1
  84. package/dist/agent-src/skills/blade-ui/SKILL.md +11 -10
  85. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +9 -8
  86. package/dist/agent-src/skills/code-review/SKILL.md +3 -4
  87. package/dist/agent-src/skills/command-routing/SKILL.md +3 -3
  88. package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
  89. package/dist/agent-src/skills/condense-memory/SKILL.md +2 -2
  90. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  91. package/dist/agent-src/skills/context-document/SKILL.md +1 -1
  92. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +1 -1
  93. package/dist/agent-src/skills/corpus-grounding/SKILL.md +16 -11
  94. package/dist/agent-src/skills/corpus-grounding/scripts/ground.ts +24 -3
  95. package/dist/agent-src/skills/dashboard-design/SKILL.md +2 -1
  96. package/dist/agent-src/skills/database/SKILL.md +2 -1
  97. package/dist/agent-src/skills/description-assist/SKILL.md +6 -6
  98. package/dist/agent-src/skills/design-intelligence/SKILL.md +6 -5
  99. package/dist/agent-src/skills/design-tokens/SKILL.md +5 -5
  100. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +24 -3
  101. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +3 -3
  102. package/dist/agent-src/skills/fe-design/SKILL.md +7 -7
  103. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +11 -4
  104. package/dist/agent-src/skills/flux/SKILL.md +10 -9
  105. package/dist/agent-src/skills/git-workflow/SKILL.md +4 -5
  106. package/dist/agent-src/skills/guideline-writing/SKILL.md +2 -2
  107. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +2 -2
  108. package/dist/agent-src/skills/livewire/SKILL.md +10 -9
  109. package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
  110. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +5 -5
  111. package/dist/agent-src/skills/module-management/SKILL.md +2 -2
  112. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +11 -11
  113. package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +6 -6
  114. package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +1 -1
  115. package/dist/agent-src/skills/premortem/SKILL.md +1 -1
  116. package/dist/agent-src/skills/project-docs/SKILL.md +1 -1
  117. package/dist/agent-src/skills/quality-tools/SKILL.md +26 -2
  118. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +8 -7
  119. package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +31 -10
  120. package/dist/agent-src/skills/refine-prompt/SKILL.md +14 -14
  121. package/dist/agent-src/skills/refine-ticket/SKILL.md +24 -25
  122. package/dist/agent-src/skills/refine-ticket/detection-map.yml +1 -1
  123. package/dist/agent-src/skills/review-routing/SKILL.md +6 -7
  124. package/dist/agent-src/skills/roadmap-management/SKILL.md +11 -6
  125. package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
  126. package/dist/agent-src/skills/rule-writing/SKILL.md +5 -5
  127. package/dist/agent-src/skills/script-writing/SKILL.md +28 -41
  128. package/dist/agent-src/skills/skill-writing/SKILL.md +3 -3
  129. package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
  130. package/dist/agent-src/skills/sql-writing/SKILL.md +2 -1
  131. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  132. package/dist/agent-src/skills/systematic-debugging/SKILL.md +5 -7
  133. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -2
  134. package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.ts +25 -4
  135. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  136. package/dist/agent-src/skills/typography-system/SKILL.md +1 -1
  137. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +5 -7
  138. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +13 -1
  139. package/dist/agent-src/templates/agent-settings.md +34 -25
  140. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
  141. package/dist/agent-src/templates/agents/memory/incident-learnings.example.yml +1 -1
  142. package/dist/agent-src/templates/agents/proposal.example.md +4 -4
  143. package/dist/agent-src/templates/copilot-instructions.md +1 -1
  144. package/dist/agent-src/templates/github-workflows/memory-hygiene.yml +10 -10
  145. package/dist/agent-src/templates/github-workflows/pr-risk-review.yml +19 -8
  146. package/dist/agent-src/templates/github-workflows/proposal-drift.yml +11 -8
  147. package/dist/agent-src/templates/github-workflows/roadmap-progress-check.yml +10 -12
  148. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +21 -11
  149. package/dist/agent-src/templates/hooks/pre-commit-roadmap-progress +43 -29
  150. package/dist/agent-src/templates/roadmaps.md +9 -4
  151. package/dist/agent-src/templates/rule.md +3 -3
  152. package/dist/agent-src/templates/scripts/README.md +6 -6
  153. package/dist/agent-src/templates/scripts/check_memory.ts +24 -2
  154. package/dist/agent-src/templates/scripts/check_memory_proposal.ts +23 -4
  155. package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +1 -1
  156. package/dist/agent-src/templates/scripts/memory_hash.ts +24 -2
  157. package/dist/agent-src/templates/scripts/memory_lookup.ts +24 -2
  158. package/dist/agent-src/templates/scripts/memory_report.ts +24 -2
  159. package/dist/agent-src/templates/scripts/memory_signal.ts +24 -2
  160. package/dist/agent-src/templates/scripts/memory_status.ts +26 -2
  161. package/dist/agent-src/templates/scripts/ownership-map.example.yml +1 -1
  162. package/dist/agent-src/templates/scripts/pr-risk-config.example.yml +1 -1
  163. package/dist/agent-src/templates/scripts/pr_review_routing.ts +24 -3
  164. package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
  165. package/dist/agent-src/templates/scripts/telemetry_record.ts +24 -3
  166. package/dist/agent-src/templates/scripts/telemetry_report.ts +25 -3
  167. package/dist/agent-src/templates/scripts/telemetry_status.ts +24 -3
  168. package/dist/agent-src/templates/scripts/tier_usage_report.ts +24 -2
  169. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +44 -10
  170. package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.ts +26 -13
  171. package/dist/agent-src/templates/skill.md +2 -2
  172. package/dist/cli/python/knowledge_ingest.js +24 -3
  173. package/dist/cli/python/knowledge_ingest.js.map +1 -1
  174. package/dist/cli/python/workspace_analytics.js +23 -3
  175. package/dist/cli/python/workspace_analytics.js.map +1 -1
  176. package/dist/cli/python/workspace_crypto.js +23 -3
  177. package/dist/cli/python/workspace_crypto.js.map +1 -1
  178. package/dist/cli/python/workspace_documents.js +23 -3
  179. package/dist/cli/python/workspace_documents.js.map +1 -1
  180. package/dist/cli/python/workspace_drive.js +24 -3
  181. package/dist/cli/python/workspace_drive.js.map +1 -1
  182. package/dist/cli/python/workspace_drive_health.js +23 -3
  183. package/dist/cli/python/workspace_drive_health.js.map +1 -1
  184. package/dist/cli/python/workspace_explain.js +23 -3
  185. package/dist/cli/python/workspace_explain.js.map +1 -1
  186. package/dist/cli/python/workspace_hosts.js +23 -3
  187. package/dist/cli/python/workspace_hosts.js.map +1 -1
  188. package/dist/cli/python/workspace_inbox.js +23 -3
  189. package/dist/cli/python/workspace_inbox.js.map +1 -1
  190. package/dist/cli/python/workspace_render.js +23 -3
  191. package/dist/cli/python/workspace_render.js.map +1 -1
  192. package/dist/cli/python/workspace_roles.js +23 -3
  193. package/dist/cli/python/workspace_roles.js.map +1 -1
  194. package/dist/cli/python/workspace_sessions.js +23 -3
  195. package/dist/cli/python/workspace_sessions.js.map +1 -1
  196. package/dist/cli/python/workspace_skills.js +23 -3
  197. package/dist/cli/python/workspace_skills.js.map +1 -1
  198. package/dist/cli/registry.js +2 -0
  199. package/dist/cli/registry.js.map +1 -1
  200. package/dist/discovery/deprecation-report.md +1 -1
  201. package/dist/discovery/discovery-manifest.json +118 -118
  202. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  203. package/dist/discovery/discovery-manifest.summary.md +2 -2
  204. package/dist/discovery/orphan-report.md +1 -1
  205. package/dist/discovery/packs.json +3 -3
  206. package/dist/discovery/trust-report.md +1 -1
  207. package/dist/discovery/workspaces.json +3 -3
  208. package/dist/install/install.mjs +647 -408
  209. package/dist/mcp/registry-manifest.json +3 -3
  210. package/dist/server/routes/settings.js +4 -4
  211. package/dist/server/routes/settings.js.map +1 -1
  212. package/dist/server/schemas/settings.js +1 -1
  213. package/dist/server/schemas/settings.js.map +1 -1
  214. package/docs/CLAIMS.md +2 -2
  215. package/docs/archive/CHANGELOG-pre-8.1.0.md +316 -0
  216. package/docs/benchmark.md +40 -0
  217. package/docs/contracts/CHANGELOG-conventions.md +8 -5
  218. package/docs/contracts/branch-protection-policy.md +14 -5
  219. package/docs/contracts/mcp-phase-1-scope.md +75 -0
  220. package/docs/contracts/mcp-tool-inventory.md +22 -15
  221. package/docs/contracts/release-pr-gating.md +22 -11
  222. package/docs/contracts/skill-bundled-assets.md +2 -2
  223. package/docs/customization.md +1 -1
  224. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +9 -4
  225. package/docs/decisions/ADR-111-canonical-glama-listing.md +97 -0
  226. package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +92 -0
  227. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +201 -0
  228. package/docs/decisions/INDEX.md +3 -0
  229. package/docs/distribution/registry-submissions.md +1 -1
  230. package/docs/getting-started.md +8 -6
  231. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +2 -2
  232. package/docs/guidelines/agent-infra/engineering-memory-data-format.md +4 -4
  233. package/docs/guidelines/agent-infra/installed-tools-manifest.md +3 -3
  234. package/docs/guidelines/agent-infra/language-and-tone-examples.md +2 -2
  235. package/docs/guidelines/agent-infra/layered-settings.md +4 -4
  236. package/docs/guidelines/agent-infra/memory-access.md +19 -18
  237. package/docs/guidelines/agent-infra/naming.md +1 -1
  238. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +5 -5
  239. package/docs/guidelines/agent-infra/role-contracts.md +1 -1
  240. package/docs/guidelines/agent-infra/security-lint-containment.md +2 -2
  241. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +1 -1
  242. package/docs/guidelines/agent-infra/size-and-scope.md +1 -1
  243. package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
  244. package/docs/guidelines/augment-portability-patterns.md +1 -1
  245. package/docs/installation.md +13 -14
  246. package/docs/mcp-server.md +32 -20
  247. package/docs/proof.md +1 -1
  248. package/docs/setup/mcp-cloud-endpoints.md +9 -2
  249. package/docs/setup/per-ide/claude-code.md +10 -4
  250. package/package.json +4 -3
  251. package/src/config/agent-settings.template.yml +31 -17
  252. package/src/config/host-capabilities.yml +25 -16
  253. package/src/config/profiles/balanced.ini +5 -3
  254. package/src/scripts/_cli/cmd_analyze_session.ts +23 -4
  255. package/src/scripts/_cli/cmd_conformance.ts +23 -4
  256. package/src/scripts/_cli/cmd_doctor.ts +196 -8
  257. package/src/scripts/_cli/cmd_explain.ts +23 -4
  258. package/src/scripts/_cli/cmd_export.ts +23 -4
  259. package/src/scripts/_cli/cmd_fleet.ts +23 -4
  260. package/src/scripts/_cli/cmd_migrate.ts +23 -4
  261. package/src/scripts/_cli/cmd_preflight.ts +24 -4
  262. package/src/scripts/_cli/cmd_prune.ts +23 -4
  263. package/src/scripts/_cli/cmd_refresh.ts +23 -4
  264. package/src/scripts/_cli/cmd_settings_check.ts +23 -4
  265. package/src/scripts/_cli/cmd_settings_migrate.ts +23 -4
  266. package/src/scripts/_cli/cmd_sync.ts +23 -4
  267. package/src/scripts/_cli/cmd_uninstall.ts +45 -4
  268. package/src/scripts/_cli/cmd_update.ts +23 -4
  269. package/src/scripts/_cli/cmd_upgrade.ts +307 -17
  270. package/src/scripts/_cli/cmd_validate.ts +23 -4
  271. package/src/scripts/_cli/cmd_versions.ts +23 -4
  272. package/src/scripts/_dispatch.bash +62 -19
  273. package/src/scripts/_lib/claude_plugin.ts +83 -0
  274. package/src/scripts/_lib/claude_settings_hooks.ts +251 -0
  275. package/src/scripts/_lib/knowledge_global.ts +24 -2
  276. package/src/scripts/_lib/knowledge_global_promote.ts +24 -2
  277. package/src/scripts/_lib/knowledge_global_redaction.ts +24 -2
  278. package/src/scripts/_lib/link_crypto.ts +24 -5
  279. package/src/scripts/_lib/pin_resolver.ts +24 -3
  280. package/src/scripts/adoption_report.ts +23 -4
  281. package/src/scripts/adoption_snapshot.ts +23 -1
  282. package/src/scripts/adoption_status.ts +23 -4
  283. package/src/scripts/adr/regenerate_index.ts +24 -3
  284. package/src/scripts/ai_council/airgap.ts +25 -2
  285. package/src/scripts/ai_council/compile_corpus.ts +24 -2
  286. package/src/scripts/ai_council/pricing.ts +11 -1
  287. package/src/scripts/analysis_freshness.ts +23 -4
  288. package/src/scripts/annotate_discovery.ts +23 -1
  289. package/src/scripts/apply_modules_config.ts +23 -4
  290. package/src/scripts/audit_adr_coverage.ts +23 -4
  291. package/src/scripts/audit_auto_rules.ts +23 -1
  292. package/src/scripts/audit_cloud_compatibility.ts +23 -4
  293. package/src/scripts/audit_command_surface.ts +23 -4
  294. package/src/scripts/audit_initial_context.ts +23 -3
  295. package/src/scripts/audit_likelihood.ts +23 -1
  296. package/src/scripts/audit_mcp_tools.ts +23 -3
  297. package/src/scripts/audit_overlap.ts +23 -1
  298. package/src/scripts/audit_skill_descriptions.ts +24 -2
  299. package/src/scripts/audit_skill_overlap.ts +23 -1
  300. package/src/scripts/audit_user_type_axis.ts +23 -4
  301. package/src/scripts/backfill_model_tier.ts +23 -4
  302. package/src/scripts/bench_ab_cache_dispatch.ts +23 -1
  303. package/src/scripts/bench_ab_clone.ts +23 -1
  304. package/src/scripts/bench_ab_diff.ts +23 -1
  305. package/src/scripts/bench_ab_integrity.ts +23 -1
  306. package/src/scripts/bench_ab_run.ts +23 -2
  307. package/src/scripts/bench_ab_task_runner.ts +23 -1
  308. package/src/scripts/bench_ab_tracka_run.ts +23 -2
  309. package/src/scripts/bench_ab_v2_run.ts +23 -1
  310. package/src/scripts/bench_ab_v2_stats.ts +23 -1
  311. package/src/scripts/bench_baseline_ready.ts +23 -1
  312. package/src/scripts/bench_condense_memory.ts +23 -1
  313. package/src/scripts/bench_drift_check.ts +23 -2
  314. package/src/scripts/bench_matrix.ts +23 -4
  315. package/src/scripts/bench_per_tool.ts +23 -1
  316. package/src/scripts/bench_quality_run.ts +23 -2
  317. package/src/scripts/bench_rtk_savings.ts +23 -1
  318. package/src/scripts/bench_rule_load_latency.ts +23 -2
  319. package/src/scripts/bench_run.ts +23 -2
  320. package/src/scripts/bench_runner.ts +23 -1
  321. package/src/scripts/build_cloud_bundle.ts +23 -3
  322. package/src/scripts/build_discovery_manifest.ts +23 -4
  323. package/src/scripts/build_linear_digest.ts +23 -3
  324. package/src/scripts/build_mcp_registry_manifest.ts +23 -4
  325. package/src/scripts/build_rule_trigger_matrix.ts +23 -4
  326. package/src/scripts/capture_showcase_session.ts +23 -1
  327. package/src/scripts/chat_history.ts +24 -3
  328. package/src/scripts/check_always_budget.ts +23 -2
  329. package/src/scripts/check_artefact_checksums.ts +23 -4
  330. package/src/scripts/check_augment_description_cap.ts +23 -4
  331. package/src/scripts/check_augmentignore.ts +23 -4
  332. package/src/scripts/check_beta_review_markers.ts +23 -4
  333. package/src/scripts/check_cluster_patterns.ts +23 -4
  334. package/src/scripts/check_command_count_messaging.ts +23 -4
  335. package/src/scripts/check_comparison.ts +23 -1
  336. package/src/scripts/check_condensation.ts +24 -3
  337. package/src/scripts/check_condensed_paths.ts +23 -2
  338. package/src/scripts/check_context_paths.ts +23 -4
  339. package/src/scripts/check_council_config_location.ts +23 -4
  340. package/src/scripts/check_council_layout.ts +23 -4
  341. package/src/scripts/check_council_references.ts +23 -4
  342. package/src/scripts/check_discovery_determinism.ts +24 -4
  343. package/src/scripts/check_gate_paths.ts +23 -4
  344. package/src/scripts/check_generated_artefact_headers.ts +23 -4
  345. package/src/scripts/check_generator_output_coverage.ts +23 -4
  346. package/src/scripts/check_gitignore_freshness.ts +23 -4
  347. package/src/scripts/check_iron_law_prominence.ts +23 -4
  348. package/src/scripts/check_kernel_prefix_stability.ts +0 -0
  349. package/src/scripts/check_kernel_rule_bundle.ts +23 -4
  350. package/src/scripts/check_knowledge_cards.ts +23 -1
  351. package/src/scripts/check_md_language.ts +23 -4
  352. package/src/scripts/check_media_deps.ts +24 -1
  353. package/src/scripts/check_memory.ts +24 -2
  354. package/src/scripts/check_memory_proposal.ts +23 -4
  355. package/src/scripts/check_module_management_neutral.ts +23 -4
  356. package/src/scripts/check_no_conflict_markers.ts +23 -4
  357. package/src/scripts/check_no_external_sources.ts +23 -4
  358. package/src/scripts/check_no_local_settings_committed.ts +24 -4
  359. package/src/scripts/check_no_new_legacy_path.ts +23 -4
  360. package/src/scripts/check_no_roadmap_refs.ts +23 -4
  361. package/src/scripts/check_one_off_location.ts +23 -4
  362. package/src/scripts/check_overlay_cascade_subdirs.ts +23 -4
  363. package/src/scripts/check_portability.ts +24 -3
  364. package/src/scripts/check_proposal.ts +0 -0
  365. package/src/scripts/check_public_catalog_links.ts +23 -4
  366. package/src/scripts/check_public_links.ts +23 -4
  367. package/src/scripts/check_quality_regression.ts +23 -2
  368. package/src/scripts/check_references.ts +23 -4
  369. package/src/scripts/check_release_includes_discovery.ts +23 -4
  370. package/src/scripts/check_release_pr_shape.ts +23 -4
  371. package/src/scripts/check_release_published.ts +23 -4
  372. package/src/scripts/check_release_trunk_sync.ts +23 -4
  373. package/src/scripts/check_reply_consistency.ts +23 -4
  374. package/src/scripts/check_roadmap_trackable.ts +23 -4
  375. package/src/scripts/check_role_doc_links.ts +23 -4
  376. package/src/scripts/check_safety_floor_untouched.ts +24 -4
  377. package/src/scripts/check_site_links.ts +23 -1
  378. package/src/scripts/check_skill_gaps.ts +23 -1
  379. package/src/scripts/check_skill_requires.ts +23 -4
  380. package/src/scripts/check_structural_breaking.ts +24 -4
  381. package/src/scripts/check_surface_tiers.ts +23 -4
  382. package/src/scripts/check_template_pin_drift.ts +23 -4
  383. package/src/scripts/check_test_coverage_diff.ts +23 -4
  384. package/src/scripts/check_token_optimizer_freshness.ts +23 -4
  385. package/src/scripts/check_token_quality_golden.ts +23 -2
  386. package/src/scripts/check_token_regression.ts +23 -2
  387. package/src/scripts/check_tracked_but_ignored.ts +24 -4
  388. package/src/scripts/check_trigger_evals.ts +23 -4
  389. package/src/scripts/check_trunk_drift.ts +24 -1
  390. package/src/scripts/check_update_banner.ts +23 -4
  391. package/src/scripts/ci_summary.ts +23 -4
  392. package/src/scripts/ci_time_ratio.ts +23 -4
  393. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  394. package/src/scripts/compile_router.ts +23 -4
  395. package/src/scripts/condense.ts +30 -31
  396. package/src/scripts/condense_memory.ts +24 -2
  397. package/src/scripts/config/packs.ts +24 -4
  398. package/src/scripts/config/session_profiles.ts +23 -4
  399. package/src/scripts/context_hygiene_hook.ts +24 -3
  400. package/src/scripts/cost_by_conversation.ts +23 -4
  401. package/src/scripts/cost_summary.ts +23 -4
  402. package/src/scripts/council_cli.ts +35 -7
  403. package/src/scripts/council_prune.ts +25 -2
  404. package/src/scripts/cross_repo_retrieve.ts +23 -4
  405. package/src/scripts/discovery_stats.ts +23 -4
  406. package/src/scripts/evidence_report.ts +23 -1
  407. package/src/scripts/export_replay_corpus.ts +23 -2
  408. package/src/scripts/extract_audit_patterns.ts +23 -1
  409. package/src/scripts/first_run_gate_hook.ts +24 -3
  410. package/src/scripts/gen_discovery_baseline.ts +23 -4
  411. package/src/scripts/generate_capabilities_index.ts +24 -5
  412. package/src/scripts/generate_capability_matrix.ts +23 -4
  413. package/src/scripts/generate_catalog.ts +23 -1
  414. package/src/scripts/generate_command_flows.ts +23 -4
  415. package/src/scripts/generate_cookbook.ts +23 -4
  416. package/src/scripts/generate_index.ts +23 -4
  417. package/src/scripts/generate_ownership_matrix.ts +23 -1
  418. package/src/scripts/generate_pack_manifests.ts +24 -5
  419. package/src/scripts/generate_role_experiences_catalog.ts +23 -4
  420. package/src/scripts/hooks/block_no_verify.ts +23 -4
  421. package/src/scripts/hooks/design_slop_hook.ts +24 -3
  422. package/src/scripts/hooks/dispatch_hook.ts +47 -14
  423. package/src/scripts/hooks/replay_hook.ts +23 -2
  424. package/src/scripts/hooks/rtk_wrap_hook.ts +24 -5
  425. package/src/scripts/hooks_doctor.ts +23 -2
  426. package/src/scripts/hooks_status.ts +23 -2
  427. package/src/scripts/injection_scan_hook.ts +24 -5
  428. package/src/scripts/install +23 -4
  429. package/src/scripts/install.ts +102 -44
  430. package/src/scripts/inventory_abstraction_budget.ts +23 -1
  431. package/src/scripts/inventory_frontmatter.ts +23 -1
  432. package/src/scripts/inventory_meta_layers.ts +23 -1
  433. package/src/scripts/iron_law_sha.ts +23 -4
  434. package/src/scripts/janitor.ts +23 -4
  435. package/src/scripts/knowledge_global_cli.ts +24 -2
  436. package/src/scripts/linked_projects_list.ts +23 -4
  437. package/src/scripts/lint_agent_security.ts +23 -4
  438. package/src/scripts/lint_agent_skill_names.ts +23 -4
  439. package/src/scripts/lint_agents_layout.ts +23 -4
  440. package/src/scripts/lint_agents_md.ts +23 -4
  441. package/src/scripts/lint_archived_skills.ts +23 -4
  442. package/src/scripts/lint_artefact_frontmatter.ts +23 -4
  443. package/src/scripts/lint_bench_ab.ts +23 -4
  444. package/src/scripts/lint_bench_corpus.ts +23 -2
  445. package/src/scripts/lint_command_flow_coverage.ts +23 -4
  446. package/src/scripts/lint_command_routing.ts +23 -4
  447. package/src/scripts/lint_command_tiers.ts +23 -2
  448. package/src/scripts/lint_command_verbs.ts +23 -4
  449. package/src/scripts/lint_commit_subjects.ts +24 -4
  450. package/src/scripts/lint_confusables.ts +25 -5
  451. package/src/scripts/lint_context_spine_usage.ts +23 -4
  452. package/src/scripts/lint_discovery_manifest.ts +23 -4
  453. package/src/scripts/lint_discovery_vocabulary.ts +23 -4
  454. package/src/scripts/lint_empty_roadmaps.ts +23 -4
  455. package/src/scripts/lint_eval_freshness.ts +23 -4
  456. package/src/scripts/lint_examples.ts +23 -4
  457. package/src/scripts/lint_explain_trace.ts +23 -4
  458. package/src/scripts/lint_featured_skills.ts +0 -0
  459. package/src/scripts/lint_flows.ts +23 -4
  460. package/src/scripts/lint_framework_leakage.ts +23 -4
  461. package/src/scripts/lint_frontmatter_boilerplate.ts +23 -4
  462. package/src/scripts/lint_ghostwriter_source.ts +23 -4
  463. package/src/scripts/lint_glama_drift.ts +75 -0
  464. package/src/scripts/lint_global_paths.ts +23 -2
  465. package/src/scripts/lint_handoffs.ts +23 -4
  466. package/src/scripts/lint_hidden_unicode.ts +24 -5
  467. package/src/scripts/lint_hook_concern_budget.ts +23 -4
  468. package/src/scripts/lint_hook_manifest.ts +23 -2
  469. package/src/scripts/lint_instruction_smuggling.ts +25 -5
  470. package/src/scripts/lint_legal_pack.ts +23 -1
  471. package/src/scripts/lint_load_context.ts +23 -4
  472. package/src/scripts/lint_marketplace.ts +24 -3
  473. package/src/scripts/lint_marketplace_install_completeness.ts +23 -4
  474. package/src/scripts/lint_mcp_config_security.ts +25 -5
  475. package/src/scripts/lint_mcp_registry_manifest.ts +23 -4
  476. package/src/scripts/lint_media_policy_linkage.ts +23 -4
  477. package/src/scripts/lint_missions.ts +23 -4
  478. package/src/scripts/lint_model_tier_coverage.ts +23 -4
  479. package/src/scripts/lint_namespace.ts +23 -4
  480. package/src/scripts/lint_namespace_collisions.ts +23 -4
  481. package/src/scripts/lint_new_skill_gate.ts +23 -4
  482. package/src/scripts/lint_no_new_atomic_commands.ts +23 -4
  483. package/src/scripts/lint_one_off_age.ts +23 -4
  484. package/src/scripts/lint_orchestration_dsl.ts +23 -4
  485. package/src/scripts/lint_orchestrator_auto_detect.ts +23 -4
  486. package/src/scripts/lint_pack_boundaries.ts +23 -4
  487. package/src/scripts/lint_pack_dependencies.ts +23 -2
  488. package/src/scripts/lint_pack_first_win.ts +23 -4
  489. package/src/scripts/lint_pack_risk_class.ts +23 -1
  490. package/src/scripts/lint_persona_governance.ts +23 -4
  491. package/src/scripts/lint_positioning.ts +23 -4
  492. package/src/scripts/lint_profile_overlay_set_only.ts +23 -4
  493. package/src/scripts/lint_readme_jargon.ts +23 -4
  494. package/src/scripts/lint_readme_size.ts +23 -4
  495. package/src/scripts/lint_regression.ts +23 -4
  496. package/src/scripts/lint_roadmap_blockers.ts +23 -4
  497. package/src/scripts/lint_roadmap_ci_steps.ts +23 -4
  498. package/src/scripts/lint_roadmap_complexity.ts +23 -4
  499. package/src/scripts/lint_roadmap_later_disposition.ts +23 -4
  500. package/src/scripts/lint_role_experiences.ts +23 -4
  501. package/src/scripts/lint_rule_interactions.ts +23 -4
  502. package/src/scripts/lint_rule_tiers.ts +24 -3
  503. package/src/scripts/lint_showcase_sessions.ts +23 -4
  504. package/src/scripts/lint_skill_frontmatter_safety.ts +25 -5
  505. package/src/scripts/lint_skill_originality.ts +23 -4
  506. package/src/scripts/lint_skill_tools.ts +23 -4
  507. package/src/scripts/lint_subagent_determinism.ts +23 -4
  508. package/src/scripts/lint_ticket_buildable.ts +23 -4
  509. package/src/scripts/lint_topics_yaml.ts +23 -4
  510. package/src/scripts/lint_trust_coherence.ts +23 -4
  511. package/src/scripts/lint_value_dashboard.ts +23 -4
  512. package/src/scripts/lint_workflow_security.ts +23 -4
  513. package/src/scripts/lint_workspace_boundary.ts +23 -4
  514. package/src/scripts/mcp_exec/safety_envelope.ts +105 -0
  515. package/src/scripts/mcp_parity_smoke.ts +23 -2
  516. package/src/scripts/mcp_registry_submit.sh +14 -3
  517. package/src/scripts/mcp_render.ts +23 -4
  518. package/src/scripts/mcp_server/__main__.ts +6 -8
  519. package/src/scripts/mcp_server/consumer_tool_catalog.json +78 -3
  520. package/src/scripts/mcp_server/tools.ts +731 -0
  521. package/src/scripts/mcp_telemetry_health.ts +23 -4
  522. package/src/scripts/mcp_telemetry_query.ts +23 -4
  523. package/src/scripts/mcp_telemetry_store.ts +23 -4
  524. package/src/scripts/measure_augment_budget.ts +23 -1
  525. package/src/scripts/measure_density.ts +23 -1
  526. package/src/scripts/measure_frugality_savings.ts +23 -1
  527. package/src/scripts/measure_markitdown_lift.ts +23 -1
  528. package/src/scripts/measure_patterns.ts +23 -1
  529. package/src/scripts/measure_projection_bytes.ts +23 -1
  530. package/src/scripts/measure_rule_budget.ts +23 -4
  531. package/src/scripts/measure_skill_reduction.ts +23 -1
  532. package/src/scripts/memory_hash.ts +24 -2
  533. package/src/scripts/memory_lookup.ts +24 -2
  534. package/src/scripts/memory_report.ts +24 -2
  535. package/src/scripts/memory_signal.ts +24 -2
  536. package/src/scripts/memory_status.ts +26 -2
  537. package/src/scripts/migrate_command_suggestions.ts +23 -4
  538. package/src/scripts/migrate_frontmatter_defaults.ts +23 -4
  539. package/src/scripts/migration_status.ts +25 -4
  540. package/src/scripts/mine_missing_guardrails.ts +23 -1
  541. package/src/scripts/mine_session.ts +23 -1
  542. package/src/scripts/minimal_safe_diff_hook.ts +24 -3
  543. package/src/scripts/new_skill.ts +23 -3
  544. package/src/scripts/onboarding_gate_hook.ts +24 -3
  545. package/src/scripts/parity/coverage_diff.ts +25 -3
  546. package/src/scripts/parity/phase_gate.ts +25 -4
  547. package/src/scripts/parity/replay.ts +25 -3
  548. package/src/scripts/pattern_share.ts +23 -4
  549. package/src/scripts/plan_physical_move.ts +23 -4
  550. package/src/scripts/prediction-pool/poisson_sim.ts +24 -3
  551. package/src/scripts/prediction-pool/pool_winsim.ts +24 -3
  552. package/src/scripts/prediction-pool/score_ev.ts +24 -3
  553. package/src/scripts/print_required_checks.ts +24 -4
  554. package/src/scripts/probe_host_compliance.ts +23 -2
  555. package/src/scripts/probe_projection_fidelity.ts +23 -1
  556. package/src/scripts/probe_skill_registration.ts +24 -2
  557. package/src/scripts/profile_staleness_hook.ts +24 -3
  558. package/src/scripts/profile_use.ts +23 -4
  559. package/src/scripts/project_thin_rules.ts +23 -3
  560. package/src/scripts/propose_modules_config.ts +23 -4
  561. package/src/scripts/prototype_lint_contradictions.ts +23 -1
  562. package/src/scripts/prove_pack_extractable.ts +23 -4
  563. package/src/scripts/readme_linter.ts +23 -3
  564. package/src/scripts/redact_hook_capture.ts +23 -4
  565. package/src/scripts/refine_ticket_detect.ts +23 -4
  566. package/src/scripts/release.ts +226 -43
  567. package/src/scripts/render_benchmark_composite.ts +23 -4
  568. package/src/scripts/render_benchmark_md.ts +23 -4
  569. package/src/scripts/roadmap_progress_hook.ts +46 -16
  570. package/src/scripts/run_skill_evals.ts +23 -4
  571. package/src/scripts/runtime_dispatcher.ts +23 -4
  572. package/src/scripts/runtime_registry.ts +23 -4
  573. package/src/scripts/score_skill_selection.ts +23 -1
  574. package/src/scripts/security_audit_config.ts +24 -5
  575. package/src/scripts/skill_collision_clusters.ts +23 -4
  576. package/src/scripts/skill_discovery.ts +23 -4
  577. package/src/scripts/skill_linter.ts +23 -2
  578. package/src/scripts/skill_preview.ts +23 -4
  579. package/src/scripts/skill_tools/audit_persona_coverage.ts +23 -1
  580. package/src/scripts/skill_tools/audit_user_type_coverage.ts +23 -1
  581. package/src/scripts/skill_tools/run_block_d_eval.ts +23 -1
  582. package/src/scripts/skill_tools/score_skill_relevance.ts +23 -1
  583. package/src/scripts/skill_tools/suggest_skill_for_task.ts +24 -1
  584. package/src/scripts/skill_usage_collect.ts +23 -4
  585. package/src/scripts/smoke_path_resolution.ts +23 -4
  586. package/src/scripts/smoke_quickstart.ts +23 -4
  587. package/src/scripts/snapshot_agent_outputs.ts +23 -4
  588. package/src/scripts/spotcheck_thin_root.ts +23 -4
  589. package/src/scripts/sync_agent_settings.ts +23 -4
  590. package/src/scripts/sync_github_metadata.ts +23 -4
  591. package/src/scripts/sync_gitignore.ts +23 -4
  592. package/src/scripts/telegraph_stats.ts +23 -4
  593. package/src/scripts/tool_registry.ts +24 -4
  594. package/src/scripts/trigger_coverage.ts +23 -4
  595. package/src/scripts/update_counts.ts +23 -4
  596. package/src/scripts/update_prices.ts +23 -1
  597. package/src/scripts/validate_agent_settings.ts +23 -4
  598. package/src/scripts/validate_decision_engine.ts +23 -4
  599. package/src/scripts/validate_discovery_manifest.ts +23 -4
  600. package/src/scripts/validate_frontmatter.ts +23 -2
  601. package/src/scripts/validate_pack_yaml.ts +0 -0
  602. package/src/scripts/validate_safe_paths.ts +24 -4
  603. package/src/scripts/validate_telegraph_carveouts.ts +23 -4
  604. package/src/scripts/verify_before_complete_hook.ts +24 -3
  605. package/src/scripts/verify_physical_move.ts +23 -4
  606. package/src/scripts/wrapper_freshness_hook.ts +107 -8
  607. package/tests/fixtures/hooks/README.md +92 -0
  608. package/tests/fixtures/hooks/agent_error.json +7 -0
  609. package/tests/fixtures/hooks/post_tool_use.json +13 -0
  610. package/tests/fixtures/hooks/pre_compact.json +7 -0
  611. package/tests/fixtures/hooks/pre_tool_use.json +9 -0
  612. package/tests/fixtures/hooks/session_end.json +6 -0
  613. package/tests/fixtures/hooks/session_start.json +6 -0
  614. package/tests/fixtures/hooks/stop.json +6 -0
  615. package/tests/fixtures/hooks/user_prompt_submit.json +7 -0
@@ -626,9 +626,28 @@ export function main(argv: readonly string[]): number {
626
626
  return 0;
627
627
  }
628
628
 
629
- const _isCliEntry =
630
- process.argv[1] !== undefined &&
631
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
632
- if (_isCliEntry || process.argv[1] === _HERE) {
629
+ function _isCliEntry(): boolean {
630
+ if (process.argv[1] === undefined) {
631
+ return false;
632
+ }
633
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
634
+ if (import.meta.url === argvUrl) {
635
+ return true;
636
+ }
637
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
638
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
639
+ // import.meta.url is the resolved real path while argv[1] keeps the
640
+ // symlink path. Compare realpaths so the entry guard still fires
641
+ // (without this the CLI silently no-ops when run through a symlink).
642
+ try {
643
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
644
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
645
+ return here === argv;
646
+ } catch {
647
+ return false;
648
+ }
649
+ }
650
+
651
+ if (_isCliEntry() || process.argv[1] === _HERE) {
633
652
  process.exit(main(process.argv.slice(2)));
634
653
  }
@@ -439,9 +439,28 @@ export function main(argv: string[] | null = null): number {
439
439
  return 0;
440
440
  }
441
441
 
442
- const _isCliEntry =
443
- process.argv[1] !== undefined &&
444
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
445
- if (_isCliEntry) {
442
+ function _isCliEntry(): boolean {
443
+ if (process.argv[1] === undefined) {
444
+ return false;
445
+ }
446
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
447
+ if (import.meta.url === argvUrl) {
448
+ return true;
449
+ }
450
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
451
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
452
+ // import.meta.url is the resolved real path while argv[1] keeps the
453
+ // symlink path. Compare realpaths so the entry guard still fires
454
+ // (without this the CLI silently no-ops when run through a symlink).
455
+ try {
456
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
457
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
458
+ return here === argv;
459
+ } catch {
460
+ return false;
461
+ }
462
+ }
463
+
464
+ if (_isCliEntry()) {
446
465
  process.exit(main());
447
466
  }
@@ -20,6 +20,7 @@
20
20
  * ./scripts-run src/scripts/tool_registry --validate-skill SKILL_TOOLS
21
21
  */
22
22
  import * as path from 'node:path';
23
+ import * as fs from 'node:fs';
23
24
  import { fileURLToPath, pathToFileURL } from 'node:url';
24
25
 
25
26
  /** Definition of an available tool (mirrors the `ToolDefinition` dataclass). */
@@ -322,9 +323,28 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
322
323
  }
323
324
 
324
325
  const _HERE = fileURLToPath(import.meta.url);
325
- const _isCliEntry =
326
- process.argv[1] !== undefined &&
327
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
328
- if (_isCliEntry || process.argv[1] === _HERE) {
326
+ function _isCliEntry(): boolean {
327
+ if (process.argv[1] === undefined) {
328
+ return false;
329
+ }
330
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
331
+ if (import.meta.url === argvUrl) {
332
+ return true;
333
+ }
334
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
335
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
336
+ // import.meta.url is the resolved real path while argv[1] keeps the
337
+ // symlink path. Compare realpaths so the entry guard still fires
338
+ // (without this the CLI silently no-ops when run through a symlink).
339
+ try {
340
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
341
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
342
+ return here === argv;
343
+ } catch {
344
+ return false;
345
+ }
346
+ }
347
+
348
+ if (_isCliEntry() || process.argv[1] === _HERE) {
329
349
  process.exit(main());
330
350
  }
@@ -243,9 +243,28 @@ export function main(argv: string[] | null = null): number {
243
243
  return misses ? 1 : 0;
244
244
  }
245
245
 
246
- const _isCliEntry =
247
- process.argv[1] !== undefined &&
248
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
249
- if (_isCliEntry || process.argv[1] === _HERE) {
246
+ function _isCliEntry(): boolean {
247
+ if (process.argv[1] === undefined) {
248
+ return false;
249
+ }
250
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
251
+ if (import.meta.url === argvUrl) {
252
+ return true;
253
+ }
254
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
255
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
256
+ // import.meta.url is the resolved real path while argv[1] keeps the
257
+ // symlink path. Compare realpaths so the entry guard still fires
258
+ // (without this the CLI silently no-ops when run through a symlink).
259
+ try {
260
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
261
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
262
+ return here === argv;
263
+ } catch {
264
+ return false;
265
+ }
266
+ }
267
+
268
+ if (_isCliEntry() || process.argv[1] === _HERE) {
250
269
  process.exit(main());
251
270
  }
@@ -276,9 +276,28 @@ export function main(argv: readonly string[] = process.argv.slice(2)): number {
276
276
  return 0;
277
277
  }
278
278
 
279
- const _isCliEntry =
280
- process.argv[1] !== undefined &&
281
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
282
- if (_isCliEntry || process.argv[1] === _HERE) {
279
+ function _isCliEntry(): boolean {
280
+ if (process.argv[1] === undefined) {
281
+ return false;
282
+ }
283
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
284
+ if (import.meta.url === argvUrl) {
285
+ return true;
286
+ }
287
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
288
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
289
+ // import.meta.url is the resolved real path while argv[1] keeps the
290
+ // symlink path. Compare realpaths so the entry guard still fires
291
+ // (without this the CLI silently no-ops when run through a symlink).
292
+ try {
293
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
294
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
295
+ return here === argv;
296
+ } catch {
297
+ return false;
298
+ }
299
+ }
300
+
301
+ if (_isCliEntry() || process.argv[1] === _HERE) {
283
302
  process.exit(main(process.argv.slice(2)));
284
303
  }
@@ -211,7 +211,29 @@ export async function main(argv: string[] | null = null): Promise<number> {
211
211
  return 0;
212
212
  }
213
213
 
214
- const _isMain = import.meta.url === pathToFileURL(path.resolve(process.argv[1] ?? '')).href;
214
+ function _isCliEntry(): boolean {
215
+ if (process.argv[1] === undefined) {
216
+ return false;
217
+ }
218
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
219
+ if (import.meta.url === argvUrl) {
220
+ return true;
221
+ }
222
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
223
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
224
+ // import.meta.url is the resolved real path while argv[1] keeps the
225
+ // symlink path. Compare realpaths so the entry guard still fires
226
+ // (without this the CLI silently no-ops when run through a symlink).
227
+ try {
228
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
229
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
230
+ return here === argv;
231
+ } catch {
232
+ return false;
233
+ }
234
+ }
235
+
236
+ const _isMain = _isCliEntry();
215
237
  if (_isMain) {
216
238
  void main().then((rc) => {
217
239
  process.exitCode = rc;
@@ -255,10 +255,29 @@ export function main(): number {
255
255
  return 0;
256
256
  }
257
257
 
258
- const _isCliEntry =
259
- process.argv[1] !== undefined &&
260
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
261
- if (_isCliEntry || process.argv[1] === _HERE) {
258
+ function _isCliEntry(): boolean {
259
+ if (process.argv[1] === undefined) {
260
+ return false;
261
+ }
262
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
263
+ if (import.meta.url === argvUrl) {
264
+ return true;
265
+ }
266
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
267
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
268
+ // import.meta.url is the resolved real path while argv[1] keeps the
269
+ // symlink path. Compare realpaths so the entry guard still fires
270
+ // (without this the CLI silently no-ops when run through a symlink).
271
+ try {
272
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
273
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
274
+ return here === argv;
275
+ } catch {
276
+ return false;
277
+ }
278
+ }
279
+
280
+ if (_isCliEntry() || process.argv[1] === _HERE) {
262
281
  process.exit(main());
263
282
  }
264
283
 
@@ -343,10 +343,29 @@ function main(): number {
343
343
  return 0;
344
344
  }
345
345
 
346
- const _isCliEntry =
347
- process.argv[1] !== undefined &&
348
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
349
- if (_isCliEntry || process.argv[1] === _HERE) {
346
+ function _isCliEntry(): boolean {
347
+ if (process.argv[1] === undefined) {
348
+ return false;
349
+ }
350
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
351
+ if (import.meta.url === argvUrl) {
352
+ return true;
353
+ }
354
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
355
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
356
+ // import.meta.url is the resolved real path while argv[1] keeps the
357
+ // symlink path. Compare realpaths so the entry guard still fires
358
+ // (without this the CLI silently no-ops when run through a symlink).
359
+ try {
360
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
361
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
362
+ return here === argv;
363
+ } catch {
364
+ return false;
365
+ }
366
+ }
367
+
368
+ if (_isCliEntry() || process.argv[1] === _HERE) {
350
369
  try {
351
370
  process.exit(main());
352
371
  } catch (exc) {
@@ -142,10 +142,29 @@ function main(argv: readonly string[]): number {
142
142
  return 0;
143
143
  }
144
144
 
145
- const _isCliEntry =
146
- process.argv[1] !== undefined &&
147
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
148
- if (_isCliEntry || process.argv[1] === _HERE) {
145
+ function _isCliEntry(): boolean {
146
+ if (process.argv[1] === undefined) {
147
+ return false;
148
+ }
149
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
150
+ if (import.meta.url === argvUrl) {
151
+ return true;
152
+ }
153
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
154
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
155
+ // import.meta.url is the resolved real path while argv[1] keeps the
156
+ // symlink path. Compare realpaths so the entry guard still fires
157
+ // (without this the CLI silently no-ops when run through a symlink).
158
+ try {
159
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
160
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
161
+ return here === argv;
162
+ } catch {
163
+ return false;
164
+ }
165
+ }
166
+
167
+ if (_isCliEntry() || process.argv[1] === _HERE) {
149
168
  try {
150
169
  process.exit(main(process.argv.slice(2)));
151
170
  } catch (exc) {
@@ -1023,9 +1023,30 @@ function _globSorted(dir: string, pattern: string): string[] {
1023
1023
 
1024
1024
  // Run the CLI only when executed directly (via tsx / the dispatcher), not
1025
1025
  // when imported by a test.
1026
+ function _isCliEntry(): boolean {
1027
+ if (process.argv[1] === undefined) {
1028
+ return false;
1029
+ }
1030
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
1031
+ if (import.meta.url === argvUrl) {
1032
+ return true;
1033
+ }
1034
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
1035
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
1036
+ // import.meta.url is the resolved real path while argv[1] keeps the
1037
+ // symlink path. Compare realpaths so the entry guard still fires
1038
+ // (without this the CLI silently no-ops when run through a symlink).
1039
+ try {
1040
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
1041
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
1042
+ return here === argv;
1043
+ } catch {
1044
+ return false;
1045
+ }
1046
+ }
1047
+
1026
1048
  const isCliEntry =
1027
- process.argv[1] !== undefined &&
1028
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
1049
+ _isCliEntry();
1029
1050
  if (isCliEntry) {
1030
1051
  process.exit(_main(process.argv.slice(2)));
1031
1052
  }
Binary file
@@ -22,6 +22,7 @@
22
22
  */
23
23
 
24
24
  import * as path from 'node:path';
25
+ import * as fs from 'node:fs';
25
26
  import { fileURLToPath, pathToFileURL } from 'node:url';
26
27
 
27
28
  /** Raised when a path matches the sensitive-file denylist. Subclass of TS Error;
@@ -154,10 +155,29 @@ export function _main(argv: readonly string[]): number {
154
155
  }
155
156
 
156
157
  const _HERE = fileURLToPath(import.meta.url);
157
- const _isCliEntry =
158
- process.argv[1] !== undefined &&
159
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
160
- if (_isCliEntry || process.argv[1] === _HERE) {
158
+ function _isCliEntry(): boolean {
159
+ if (process.argv[1] === undefined) {
160
+ return false;
161
+ }
162
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
163
+ if (import.meta.url === argvUrl) {
164
+ return true;
165
+ }
166
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
167
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
168
+ // import.meta.url is the resolved real path while argv[1] keeps the
169
+ // symlink path. Compare realpaths so the entry guard still fires
170
+ // (without this the CLI silently no-ops when run through a symlink).
171
+ try {
172
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
173
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
174
+ return here === argv;
175
+ } catch {
176
+ return false;
177
+ }
178
+ }
179
+
180
+ if (_isCliEntry() || process.argv[1] === _HERE) {
161
181
  // Python passes the full sys.argv (program name + args); replicate by
162
182
  // prepending a placeholder program name to the user args.
163
183
  process.exit(_main(['validate_safe_paths.ts', ...process.argv.slice(2)]));
@@ -477,9 +477,28 @@ class SequenceMatcher {
477
477
  }
478
478
 
479
479
  const _HERE = fileURLToPath(import.meta.url);
480
- const _isCliEntry =
481
- process.argv[1] !== undefined &&
482
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
483
- if (_isCliEntry || process.argv[1] === _HERE) {
480
+ function _isCliEntry(): boolean {
481
+ if (process.argv[1] === undefined) {
482
+ return false;
483
+ }
484
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
485
+ if (import.meta.url === argvUrl) {
486
+ return true;
487
+ }
488
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
489
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
490
+ // import.meta.url is the resolved real path while argv[1] keeps the
491
+ // symlink path. Compare realpaths so the entry guard still fires
492
+ // (without this the CLI silently no-ops when run through a symlink).
493
+ try {
494
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
495
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
496
+ return here === argv;
497
+ } catch {
498
+ return false;
499
+ }
500
+ }
501
+
502
+ if (_isCliEntry() || process.argv[1] === _HERE) {
484
503
  process.exit(main());
485
504
  }
@@ -34,7 +34,7 @@
34
34
 
35
35
  import fs from "node:fs";
36
36
  import path from "node:path";
37
- import { pathToFileURL } from "node:url";
37
+ import { fileURLToPath, pathToFileURL } from "node:url";
38
38
 
39
39
  import { atomic_write_json } from "./hooks/state_io.js";
40
40
 
@@ -298,9 +298,30 @@ export function main(argv?: string[]): number {
298
298
  return run(_readStdin(), { consumer_root: process.cwd(), verbose: args.verbose });
299
299
  }
300
300
 
301
+ function _isCliEntry(): boolean {
302
+ if (process.argv[1] === undefined) {
303
+ return false;
304
+ }
305
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
306
+ if (import.meta.url === argvUrl) {
307
+ return true;
308
+ }
309
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
310
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
311
+ // import.meta.url is the resolved real path while argv[1] keeps the
312
+ // symlink path. Compare realpaths so the entry guard still fires
313
+ // (without this the CLI silently no-ops when run through a symlink).
314
+ try {
315
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
316
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
317
+ return here === argv;
318
+ } catch {
319
+ return false;
320
+ }
321
+ }
322
+
301
323
  const isCliEntry =
302
- process.argv[1] !== undefined &&
303
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
324
+ _isCliEntry();
304
325
  if (isCliEntry) {
305
326
  process.exit(main(process.argv.slice(2)));
306
327
  }
@@ -403,9 +403,28 @@ export function main(argv: string[] | null = null): number {
403
403
  return ok ? 0 : 1;
404
404
  }
405
405
 
406
- const _isCliEntry =
407
- process.argv[1] !== undefined &&
408
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
409
- if (_isCliEntry || process.argv[1] === _HERE) {
406
+ function _isCliEntry(): boolean {
407
+ if (process.argv[1] === undefined) {
408
+ return false;
409
+ }
410
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
411
+ if (import.meta.url === argvUrl) {
412
+ return true;
413
+ }
414
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
415
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
416
+ // import.meta.url is the resolved real path while argv[1] keeps the
417
+ // symlink path. Compare realpaths so the entry guard still fires
418
+ // (without this the CLI silently no-ops when run through a symlink).
419
+ try {
420
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
421
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
422
+ return here === argv;
423
+ } catch {
424
+ return false;
425
+ }
426
+ }
427
+
428
+ if (_isCliEntry() || process.argv[1] === _HERE) {
410
429
  process.exit(main());
411
430
  }
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * session_start concern — keep the project-local `./agent-config` fresh.
3
+ * session_start concern — keep the project-local `./agent-config` wrapper
4
+ * AND the installed `.git/hooks/pre-commit` gate fresh.
4
5
  *
5
6
  * TypeScript twin of `src/scripts/wrapper_freshness_hook.py` (ADR-200 —
6
7
  * Python→TS migration, Phase 6 / hooks). Public API mirrors the Python
@@ -10,7 +11,12 @@
10
11
  * `refresh --project`). On every session_start the dispatcher runs this in
11
12
  * the consumer workspace; if a `./agent-config` wrapper exists there and
12
13
  * differs from the canonical template, it is re-stamped so an outdated,
13
- * fallback-less copy cannot keep breaking the hooks.
14
+ * fallback-less copy cannot keep breaking the hooks. The same self-heal
15
+ * covers `.git/hooks/pre-commit` when it is OURS (identified by the
16
+ * `pre-commit-roadmap-progress` marker) and differs from the shipped
17
+ * template — a hook installed under an older release otherwise keeps its
18
+ * stale body forever (the py2ts-era hooks silently no-op'd exactly this
19
+ * way; `agent-config upgrade` only reaches projects it is run from).
14
20
  *
15
21
  * Bootstrapping note: this can only heal a wrapper functional enough to
16
22
  * invoke the dispatcher in the first place (the current template's global +
@@ -18,14 +24,15 @@
18
24
  * this concern — that recovery path is `agent-config upgrade` /
19
25
  * `refresh --project`.
20
26
  *
21
- * Contract: never creates a wrapper where none exists (that is an install
22
- * action); never touches the agent-config source repo; always fail-open
23
- * (exit 0) — hook self-heal must not block a session.
27
+ * Contract: never creates a wrapper or hook where none exists (that is an
28
+ * install action); never overwrites a foreign pre-commit hook; never touches
29
+ * the agent-config source repo; always fail-open (exit 0) — hook self-heal
30
+ * must not block a session.
24
31
  */
25
32
 
26
33
  import fs from "node:fs";
27
34
  import path from "node:path";
28
- import { pathToFileURL } from "node:url";
35
+ import { fileURLToPath, pathToFileURL } from "node:url";
29
36
 
30
37
  import {
31
38
  install_cli_wrapper,
@@ -127,6 +134,71 @@ function _parseRoot(argv: string[]): string | null {
127
134
  return null;
128
135
  }
129
136
 
137
+ /** Marker that identifies OUR installed pre-commit hook (never foreign ones). */
138
+ const _PRECOMMIT_MARKER = "pre-commit-roadmap-progress";
139
+
140
+ /** Resolve `<root>/.git/hooks` — plain dir or worktree/submodule gitdir file. */
141
+ function _git_hooks_dir(root: string): string | null {
142
+ const dotGit = path.join(root, ".git");
143
+ if (_isDir(dotGit)) {
144
+ return path.join(dotGit, "hooks");
145
+ }
146
+ if (_isFile(dotGit)) {
147
+ try {
148
+ const m = /^gitdir:\s*(.+)\s*$/m.exec(fs.readFileSync(dotGit, "utf-8"));
149
+ if (m && m[1] !== undefined) {
150
+ const gitDir = path.isAbsolute(m[1]) ? m[1] : path.join(root, m[1]);
151
+ return path.join(gitDir, "hooks");
152
+ }
153
+ } catch {
154
+ /* fail-open */
155
+ }
156
+ }
157
+ return null;
158
+ }
159
+
160
+ /**
161
+ * Re-stamp a marker-identified, stale `.git/hooks/pre-commit` from the
162
+ * shipped template. Returns the hook path when re-stamped, else null.
163
+ * Never creates a hook, never touches foreign hooks, never throws.
164
+ */
165
+ export function refresh_precommit_hook(root: string): string | null {
166
+ try {
167
+ const template = path.join(
168
+ path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".."),
169
+ "dist",
170
+ "agent-src",
171
+ "templates",
172
+ "hooks",
173
+ "pre-commit-roadmap-progress",
174
+ );
175
+ if (!_isFile(template)) {
176
+ return null;
177
+ }
178
+ const hooksDir = _git_hooks_dir(root);
179
+ if (hooksDir === null) {
180
+ return null;
181
+ }
182
+ const target = path.join(hooksDir, "pre-commit");
183
+ if (!_isFile(target)) {
184
+ return null; // no hook installed — never create one
185
+ }
186
+ const current = fs.readFileSync(target, "utf-8");
187
+ if (!current.includes(_PRECOMMIT_MARKER)) {
188
+ return null; // foreign hook — never overwrite
189
+ }
190
+ const canonical = fs.readFileSync(template, "utf-8");
191
+ if (current === canonical) {
192
+ return null; // already fresh
193
+ }
194
+ fs.writeFileSync(target, canonical);
195
+ fs.chmodSync(target, 0o755);
196
+ return target;
197
+ } catch {
198
+ return null; // fail-open — never block the session
199
+ }
200
+ }
201
+
130
202
  export function main(argv?: string[]): number {
131
203
  const args = argv ?? process.argv.slice(2);
132
204
  const rootArg = _parseRoot(args);
@@ -140,6 +212,12 @@ export function main(argv?: string[]): number {
140
212
  if (_is_source_repo(root)) {
141
213
  return EXIT_ALLOW;
142
214
  }
215
+ const hook = refresh_precommit_hook(root);
216
+ if (hook !== null) {
217
+ process.stderr.write(
218
+ `[wrapper] re-stamped stale .git/hooks/pre-commit at ${hook}\n`,
219
+ );
220
+ }
143
221
  if (!_isFile(path.join(root, "agent-config"))) {
144
222
  return EXIT_ALLOW; // no wrapper here — never create one
145
223
  }
@@ -171,9 +249,30 @@ export function main(argv?: string[]): number {
171
249
  return EXIT_ALLOW;
172
250
  }
173
251
 
252
+ function _isCliEntry(): boolean {
253
+ if (process.argv[1] === undefined) {
254
+ return false;
255
+ }
256
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
257
+ if (import.meta.url === argvUrl) {
258
+ return true;
259
+ }
260
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
261
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
262
+ // import.meta.url is the resolved real path while argv[1] keeps the
263
+ // symlink path. Compare realpaths so the entry guard still fires
264
+ // (without this the CLI silently no-ops when run through a symlink).
265
+ try {
266
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
267
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
268
+ return here === argv;
269
+ } catch {
270
+ return false;
271
+ }
272
+ }
273
+
174
274
  const isCliEntry =
175
- process.argv[1] !== undefined &&
176
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
275
+ _isCliEntry();
177
276
  if (isCliEntry) {
178
277
  process.exit(main(process.argv.slice(2)));
179
278
  }