@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
@@ -8,16 +8,27 @@
8
8
  * subprocess argv/cwd/env. No behaviour changes — latent quirks are
9
9
  * replicated and flagged inline, not fixed.
10
10
  *
11
- * Invoked via `task release`. The bump level (major/minor/patch) is
12
- * auto-detected from Conventional Commits since the last tag; pass
13
- * `--as {major,minor,patch}` to force, or `--version X.Y.Z` to pin.
11
+ * Invoked via `task release` (interactive, local) OR
12
+ * `.github/workflows/release.yml` (unattended, triggered by merging a PR
13
+ * labeled `release` / `release:major` / `release:minor` / `release:patch`
14
+ * — pass `--ci`). Both entry points share this one pipeline; `--ci` only
15
+ * changes the gh-auth probe (GITHUB_TOKEN, not a user token), adds a
16
+ * nothing-to-release short-circuit (see `nothing_to_release_ci`) so firing
17
+ * the label path twice is a clean no-op, and dispatch-chains
18
+ * release-guard.yml + publish-npm.yml + cloud-release.yml after the
19
+ * release (a bot-pushed tag does not trigger them — GitHub's GITHUB_TOKEN
20
+ * recursion guard). The bump
21
+ * level (major/minor/patch) is auto-detected from Conventional Commits
22
+ * since the last tag; pass `--as {major,minor,patch}` to force, or
23
+ * `--version X.Y.Z` to pin.
14
24
  *
15
25
  * Pipeline:
16
26
  * 1. Preflight — on main, clean tree, origin in sync, gh available,
17
27
  * target tag doesn't exist yet.
18
28
  * 2. Plan — compute new version, parse Conventional Commits
19
29
  * since the last tag, render CHANGELOG section.
20
- * 3. Confirm — show preview, ask once (skippable with --yes).
30
+ * 3. Confirm — show preview, ask once (skippable with --yes;
31
+ * `--ci` always needs --yes — CI has no terminal).
21
32
  * 4. Branch + bump — create `release/X.Y.Z`, update package.json,
22
33
  * .claude-plugin/marketplace.json, CHANGELOG.md,
23
34
  * then run `task release-prepare` so pack
@@ -27,15 +38,22 @@
27
38
  * 5. Commit + push — `release: X.Y.Z`, push branch, open PR.
28
39
  * 6. Wait for CI — `gh pr checks --watch` (skippable with --no-wait).
29
40
  * 7. Merge — `gh pr merge --merge --delete-branch`.
30
- * 8. Tag main — fast-forward main, tag the merge commit,
31
- * push the tag (this triggers publish-npm.yml).
32
- * 9. GitHub Release — `gh release create X.Y.Z --notes <changelog>`.
41
+ * 8. Tag main — fast-forward main, tag the merge commit, push
42
+ * the tag (triggers publish-npm.yml — except
43
+ * under `--ci`, see step 9).
44
+ * 9. GitHub Release — `gh release create X.Y.Z --notes <changelog>`;
45
+ * under `--ci`, also dispatches
46
+ * release-guard.yml + publish-npm.yml +
47
+ * cloud-release.yml explicitly.
33
48
  *
34
49
  * Idempotency: pass `--resume` to recover from a partial failure. Each
35
50
  * step then probes existing state (branch, commit, PR, tag, GitHub
36
51
  * Release) and skips work that is already done, instead of erroring out.
37
52
  * Without `--resume` the pipeline still mutates git/network state, so
38
- * re-running on a dirty tree needs `--resume` (or a manual cleanup).
53
+ * re-running on a dirty tree needs `--resume` (or a manual cleanup). The
54
+ * two entry points guard against colliding with each other via these same
55
+ * probes plus the CI workflow's concurrency group — whichever starts
56
+ * second sees the other's in-progress state and skips or refuses cleanly.
39
57
  * Each step prints what it's about to do before doing it, so a crash
40
58
  * leaves a recoverable trail.
41
59
  *
@@ -95,6 +113,7 @@ import type {
95
113
  import {
96
114
  CURRENT_ERA_BODY_CAP,
97
115
  current_era_accumulated_body_size,
116
+ current_era_body_size,
98
117
  current_era_insertion_point,
99
118
  perform_split,
100
119
  plan_split,
@@ -930,9 +949,13 @@ function set_template_pin(p: string, version: string): void {
930
949
  * Tree cleanliness, gh auth, and `main` in-sync with origin are still
931
950
  * enforced, so resuming has the same starting posture as a fresh run; only
932
951
  * step-level outcomes differ.
952
+ *
953
+ * `opts.ci` swaps the gh-auth probe (see below) for the CI-mode variant —
954
+ * everything else is identical between the two entry points.
933
955
  */
934
- function preflight(target: string, opts: { resume?: boolean } = {}): void {
956
+ function preflight(target: string, opts: { resume?: boolean; ci?: boolean } = {}): void {
935
957
  const resume = opts.resume ?? false;
958
+ const ci = opts.ci ?? false;
936
959
  for (const b of ['git', 'gh']) {
937
960
  if (!have(b)) {
938
961
  die(`'${b}' not found on PATH`);
@@ -943,9 +966,22 @@ function preflight(target: string, opts: { resume?: boolean } = {}): void {
943
966
  // status` returns non-zero if *any* account in the keyring is broken, even
944
967
  // when the active one is fine — so we'd rather ask "does the token the
945
968
  // release will actually use work?" than parse multi-account status output.
946
- const r = run(['gh', 'api', 'user', '--jq', '.login'], { check: false, capture: true });
969
+ //
970
+ // `--ci` runs under the GitHub Actions default GITHUB_TOKEN, which is an
971
+ // installation token, not a user token — `gh api user` returns 403
972
+ // ("Resource not accessible by integration") for it even when the token
973
+ // is perfectly valid for everything the release actually needs (repo
974
+ // read/write). Probe repo access instead, which the token always has.
975
+ const authCmd = ci
976
+ ? ['gh', 'api', `repos/${REPO_SLUG}`, '--jq', '.id']
977
+ : ['gh', 'api', 'user', '--jq', '.login'];
978
+ const r = run(authCmd, { check: false, capture: true });
947
979
  if (r.returncode !== 0) {
948
- die('gh is not authenticated; run `gh auth login` first');
980
+ die(
981
+ ci
982
+ ? 'gh is not authenticated for this repo (GITHUB_TOKEN missing or invalid)'
983
+ : 'gh is not authenticated; run `gh auth login` first',
984
+ );
949
985
  }
950
986
 
951
987
  const branch = git(['rev-parse', '--abbrev-ref', 'HEAD'], { capture: true });
@@ -1159,11 +1195,12 @@ function _step(n: number, total: number, msg: string): void {
1159
1195
 
1160
1196
  function execute(
1161
1197
  plan: Plan,
1162
- opts: { wait_for_checks: boolean; dry_run: boolean; resume?: boolean },
1198
+ opts: { wait_for_checks: boolean; dry_run: boolean; resume?: boolean; ci?: boolean },
1163
1199
  ): void {
1164
1200
  const wait_for_checks = opts.wait_for_checks;
1165
1201
  const dry_run = opts.dry_run;
1166
1202
  const resume = opts.resume ?? false;
1203
+ const ci = opts.ci ?? false;
1167
1204
 
1168
1205
  const branch = `release/${plan.target}`;
1169
1206
  const total = 10;
@@ -1371,7 +1408,13 @@ function execute(
1371
1408
  if (_release_exists(plan.target)) {
1372
1409
  _step(9, total, `GitHub Release ${plan.target} already exists — skip`);
1373
1410
  } else {
1374
- _step(9, total, 'Create GitHub Release (triggers publish-npm on the tag)');
1411
+ _step(
1412
+ 9,
1413
+ total,
1414
+ ci
1415
+ ? 'Create GitHub Release (tag push under GITHUB_TOKEN triggers nothing — dispatching next)'
1416
+ : 'Create GitHub Release (triggers publish-npm on the tag)',
1417
+ );
1375
1418
  const notes = _cap_body(
1376
1419
  plan.changelog_body || `Release ${plan.target}`,
1377
1420
  GH_RELEASE_NOTES_LIMIT,
@@ -1387,6 +1430,23 @@ function execute(
1387
1430
  '--notes',
1388
1431
  notes,
1389
1432
  ]);
1433
+
1434
+ // ─── 9b. dispatch-chain the tag-triggered workflows (--ci only) ──────
1435
+ // release-guard.yml, publish-npm.yml, and cloud-release.yml all
1436
+ // trigger on `push: tags: [0-9]+.[0-9]+.[0-9]+`, but a tag pushed
1437
+ // with the default GITHUB_TOKEN does NOT fire other workflows
1438
+ // (GitHub's recursion guard). All three already accept a `tag`
1439
+ // input for exactly this recovery case, so dispatch them
1440
+ // explicitly instead of relying on an event that will never
1441
+ // arrive. Only reached here (not in the `_release_exists` skip
1442
+ // branch above), so a --resume re-run never re-dispatches a
1443
+ // publish that already happened.
1444
+ if (ci) {
1445
+ _step(9, total, 'Dispatch release-guard.yml + publish-npm.yml + cloud-release.yml for the tag');
1446
+ run(['gh', 'workflow', 'run', 'release-guard.yml', '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`]);
1447
+ run(['gh', 'workflow', 'run', 'publish-npm.yml', '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`]);
1448
+ run(['gh', 'workflow', 'run', 'cloud-release.yml', '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`]);
1449
+ }
1390
1450
  }
1391
1451
 
1392
1452
  // ─── 10. delete the merged release branch (local + remote) ───────────────
@@ -1430,6 +1490,7 @@ interface Args {
1430
1490
  no_wait: boolean;
1431
1491
  resume: boolean;
1432
1492
  check_confirm: boolean;
1493
+ ci: boolean;
1433
1494
  }
1434
1495
 
1435
1496
  const PROG = 'release.py';
@@ -1437,9 +1498,15 @@ const PROG = 'release.py';
1437
1498
  // (per-flag descriptions) is a documented divergence — argparse re-wraps it to
1438
1499
  // the live terminal width; the tests assert the `usage:` token + exit code,
1439
1500
  // not the body prose.
1501
+ //
1502
+ // `--ci` (added for the label-triggered GitHub Actions release path, see
1503
+ // `.github/workflows/release.yml`) is NOT part of the original argparse
1504
+ // contract this file mirrors byte-for-byte — it postdates the py2ts
1505
+ // migration (ADR-200) and has no Python counterpart. It is additive only:
1506
+ // every existing flag/behaviour is unchanged when `--ci` is absent.
1440
1507
  const USAGE =
1441
1508
  `usage: ${PROG} [-h] [--as {major,minor,patch}] [--version EXPLICIT] [--yes]\n` +
1442
- ' [--dry-run] [--no-wait] [--resume] [--check-confirm]\n';
1509
+ ' [--dry-run] [--no-wait] [--resume] [--check-confirm] [--ci]\n';
1443
1510
 
1444
1511
  function _argError(msg: string): never {
1445
1512
  process.stderr.write(USAGE);
@@ -1456,6 +1523,7 @@ function _parse_args(argv: readonly string[]): Args {
1456
1523
  no_wait: false,
1457
1524
  resume: false,
1458
1525
  check_confirm: false,
1526
+ ci: false,
1459
1527
  };
1460
1528
 
1461
1529
  const positionals: string[] = [];
@@ -1537,6 +1605,12 @@ function _parse_args(argv: readonly string[]): Args {
1537
1605
  i += 1;
1538
1606
  continue;
1539
1607
  }
1608
+ if (flag === '--ci') {
1609
+ if (inlineVal !== null) _argError(`argument --ci: ignored explicit argument '${inlineVal}'`);
1610
+ args.ci = true;
1611
+ i += 1;
1612
+ continue;
1613
+ }
1540
1614
  if (a.startsWith('-') && a !== '-') {
1541
1615
  _argError(`unrecognized arguments: ${a}`);
1542
1616
  }
@@ -1557,6 +1631,26 @@ function resolve_bump(override: string | null, commits: readonly Commit[]): stri
1557
1631
  return infer_bump(commits);
1558
1632
  }
1559
1633
 
1634
+ /**
1635
+ * Should a `--ci` run stop early with no release? Empty commits + no
1636
+ * explicit override + no bump override means `infer_bump` would fall back
1637
+ * to a hollow 'patch' bump — fine for a deliberate interactive `task
1638
+ * release`, but the label-triggered CI path (`.github/workflows/release.yml`)
1639
+ * can fire on a merged `release`-labeled PR whose commits were already
1640
+ * shipped by an earlier run in the same batch (the double-fire case). This
1641
+ * is the guard that makes firing the CI path twice a clean no-op instead of
1642
+ * a spurious empty release. The interactive path is unaffected — this only
1643
+ * ever returns true when `ci` is true.
1644
+ */
1645
+ export function nothing_to_release_ci(
1646
+ ci: boolean,
1647
+ explicit: string | null,
1648
+ bump_override: string | null,
1649
+ commits: readonly Commit[],
1650
+ ): boolean {
1651
+ return ci && explicit === null && bump_override === null && commits.length === 0;
1652
+ }
1653
+
1560
1654
  const _RELEASE_BRANCH_RE = /^release\/(\d+\.\d+\.\d+)$/;
1561
1655
 
1562
1656
  /**
@@ -1613,6 +1707,64 @@ function _detect_in_flight_target(): string | null {
1613
1707
  return version;
1614
1708
  }
1615
1709
 
1710
+ /** Outcome of the release-time era-split gate (pure, unit-testable). */
1711
+ export interface SplitDecision {
1712
+ split: SplitPlan | null;
1713
+ die_message: string | null;
1714
+ warning: string | null;
1715
+ }
1716
+
1717
+ /**
1718
+ * Decide whether releasing `target` must split the current era — measured
1719
+ * against the POST-release state the drift test will see (the era's raw
1720
+ * total today, because today's exempt newest section stops being exempt the
1721
+ * moment the new release section is prepended).
1722
+ *
1723
+ * - post-release body over the cap + minor/major target → split.
1724
+ * - post-release body over the cap + patch target:
1725
+ * - accumulated (prior releases beyond the newest) ALSO over the cap →
1726
+ * die — waiting cannot fix it; a minor release or manual split must
1727
+ * come first (pre-fix behaviour, unchanged).
1728
+ * - only the newest section busts the cap → proceed with a warning; a
1729
+ * patch cannot cross an era boundary, and blocking it was the failure
1730
+ * the newest-release exemption was introduced for. The drift gate will
1731
+ * be red until the next minor/major performs the split.
1732
+ *
1733
+ * Reads the CHANGELOG via the changelog_eras lib — tests point it at a
1734
+ * fixture with `_set_changelog_path` (plan_split reads the same file).
1735
+ */
1736
+ export function resolve_split_decision(target: string): SplitDecision {
1737
+ const post_release_body = current_era_body_size();
1738
+ if (post_release_body <= CURRENT_ERA_BODY_CAP) {
1739
+ return { split: null, die_message: null, warning: null };
1740
+ }
1741
+ const candidate = plan_split(target);
1742
+ if (candidate !== null) {
1743
+ return { split: candidate, die_message: null, warning: null };
1744
+ }
1745
+ const accumulated = current_era_accumulated_body_size();
1746
+ if (accumulated > CURRENT_ERA_BODY_CAP) {
1747
+ return {
1748
+ split: null,
1749
+ die_message:
1750
+ `current era body is ${accumulated} lines (cap ` +
1751
+ `${CURRENT_ERA_BODY_CAP}) but release ${target} is a patch ` +
1752
+ `within the same era — split needs a minor/major bump. ` +
1753
+ 'Cut a minor release or split CHANGELOG.md manually first.',
1754
+ warning: null,
1755
+ };
1756
+ }
1757
+ return {
1758
+ split: null,
1759
+ die_message: null,
1760
+ warning:
1761
+ `after this release the current era's accumulated body will be ` +
1762
+ `${post_release_body} lines (cap ${CURRENT_ERA_BODY_CAP}); a patch ` +
1763
+ `cannot split the era, so the changelog drift gate will be RED ` +
1764
+ `until the next minor/major release performs the split.`,
1765
+ };
1766
+ }
1767
+
1616
1768
  function main(argv: readonly string[] | null = null): number {
1617
1769
  const args = _parse_args(argv === null ? process.argv.slice(2) : argv);
1618
1770
 
@@ -1649,6 +1801,14 @@ function main(argv: readonly string[] | null = null): number {
1649
1801
 
1650
1802
  const prev = latest_tag();
1651
1803
  const commits = commits_since(prev);
1804
+
1805
+ if (nothing_to_release_ci(args.ci, args.explicit, args.bump_override, commits)) {
1806
+ process.stdout.write(
1807
+ `nothing to release — no commits since ${prev ?? 'the start of history'}; exiting cleanly.\n`,
1808
+ );
1809
+ return 0;
1810
+ }
1811
+
1652
1812
  const bump = resolve_bump(args.bump_override, commits);
1653
1813
 
1654
1814
  // Resume mode: prefer an existing `release/X.Y.Z` over computed bump,
@@ -1669,7 +1829,7 @@ function main(argv: readonly string[] | null = null): number {
1669
1829
  parse_version(target);
1670
1830
 
1671
1831
  if (!args.dry_run) {
1672
- preflight(target, { resume: args.resume });
1832
+ preflight(target, { resume: args.resume, ci: args.ci });
1673
1833
  }
1674
1834
 
1675
1835
  const today = todayIso();
@@ -1678,30 +1838,33 @@ function main(argv: readonly string[] | null = null): number {
1678
1838
  test_trend_line,
1679
1839
  });
1680
1840
 
1681
- // Era-split planning: only crosses the gate when the current era's
1682
- // *accumulated* body (prior releases, excluding the newest section) has
1683
- // grown past the drift cap AND the release crosses a minor/major boundary.
1684
- // The newest release is exempt — a single large catch-up release forces
1685
- // the split on the *next* minor/major once it has become a prior entry,
1686
- // not on the patch that immediately follows it. This is the same quantity
1687
- // the drift test enforces (current_era_accumulated_body_size); measuring
1688
- // the raw total here would re-fire the gate the exemption exists to clear.
1689
- // Patch overflow that genuinely accumulates is caught by the drift test
1690
- // (red CI), not by an auto-split into a nonsensical "pre-X.Y.Z" archive.
1691
- let split: SplitPlan | null = null;
1692
- const body_size = current_era_accumulated_body_size();
1693
- if (body_size > CURRENT_ERA_BODY_CAP) {
1694
- const candidate = plan_split(target);
1695
- if (candidate === null) {
1696
- die(
1697
- `current era body is ${body_size} lines (cap ` +
1698
- `${CURRENT_ERA_BODY_CAP}) but release ${target} is a patch ` +
1699
- `within the same era — split needs a minor/major bump. ` +
1700
- 'Cut a minor release or split CHANGELOG.md manually first.',
1701
- );
1702
- }
1703
- split = candidate;
1704
- }
1841
+ // Era-split planning — gate on the POST-release view (2026-07-07 fix).
1842
+ // The drift test measures the era AFTER this release's section is
1843
+ // prepended: the new section becomes the exempt "newest", so everything
1844
+ // currently in the era — INCLUDING today's still-exempt newest section —
1845
+ // counts as accumulated the moment this release lands. That future
1846
+ // quantity equals today's raw era total (current_era_body_size). The old
1847
+ // gate measured current_era_accumulated_body_size (pre-release snapshot),
1848
+ // which is ~0 right after a big catch-up release — so the 8.0.0 and 8.1.0
1849
+ // releases each skipped the split and left main red on the drift gate
1850
+ // until a manual chore split. Same function as the drift test, wrong
1851
+ // moment in time.
1852
+ //
1853
+ // The newest-release exemption is still honoured where it matters: a
1854
+ // PATCH release cannot cross an era boundary, so when only the newest
1855
+ // section busts the cap (accumulated still under it) the patch proceeds
1856
+ // with a loud warning instead of dying — the split then fires on the
1857
+ // next minor/major. A patch on top of a genuinely over-cap accumulated
1858
+ // body still dies (unchanged), because that state is unfixable by
1859
+ // waiting and needs a minor release or a manual split.
1860
+ const decision = resolve_split_decision(target);
1861
+ if (decision.die_message !== null) {
1862
+ die(decision.die_message);
1863
+ }
1864
+ if (decision.warning !== null) {
1865
+ process.stderr.write(`warning: ${decision.warning}\n`);
1866
+ }
1867
+ const split: SplitPlan | null = decision.split;
1705
1868
 
1706
1869
  const plan = new Plan(current, target, bump, commits, prev, body, full, split);
1707
1870
  print_preview(plan);
@@ -1726,16 +1889,36 @@ function main(argv: readonly string[] | null = null): number {
1726
1889
  wait_for_checks: !args.no_wait,
1727
1890
  dry_run: false,
1728
1891
  resume: args.resume,
1892
+ ci: args.ci,
1729
1893
  });
1730
1894
  return 0;
1731
1895
  }
1732
1896
 
1733
1897
  // ─── CLI entry (release.py:1090-1091 `raise SystemExit(main())`) ──────────────
1734
1898
 
1735
- const _isCliEntry =
1736
- process.argv[1] !== undefined &&
1737
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
1738
- if (_isCliEntry || process.argv[1] === _HERE) {
1899
+ function _isCliEntry(): boolean {
1900
+ if (process.argv[1] === undefined) {
1901
+ return false;
1902
+ }
1903
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
1904
+ if (import.meta.url === argvUrl) {
1905
+ return true;
1906
+ }
1907
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
1908
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
1909
+ // import.meta.url is the resolved real path while argv[1] keeps the
1910
+ // symlink path. Compare realpaths so the entry guard still fires
1911
+ // (without this the CLI silently no-ops when run through a symlink).
1912
+ try {
1913
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
1914
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
1915
+ return here === argv;
1916
+ } catch {
1917
+ return false;
1918
+ }
1919
+ }
1920
+
1921
+ if (_isCliEntry() || process.argv[1] === _HERE) {
1739
1922
  try {
1740
1923
  // main() can return an int directly OR throw SystemExitError via die();
1741
1924
  // both flow into process.exitCode. CalledProcessError is intentionally
@@ -370,9 +370,28 @@ export function main(argv: string[] | null = null): number {
370
370
 
371
371
  // --- CLI entry ---
372
372
 
373
- const _isCliEntry =
374
- process.argv[1] !== undefined &&
375
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
376
- if (_isCliEntry || process.argv[1] === _HERE) {
373
+ function _isCliEntry(): boolean {
374
+ if (process.argv[1] === undefined) {
375
+ return false;
376
+ }
377
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
378
+ if (import.meta.url === argvUrl) {
379
+ return true;
380
+ }
381
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
382
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
383
+ // import.meta.url is the resolved real path while argv[1] keeps the
384
+ // symlink path. Compare realpaths so the entry guard still fires
385
+ // (without this the CLI silently no-ops when run through a symlink).
386
+ try {
387
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
388
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
389
+ return here === argv;
390
+ } catch {
391
+ return false;
392
+ }
393
+ }
394
+
395
+ if (_isCliEntry() || process.argv[1] === _HERE) {
377
396
  process.exitCode = main(process.argv.slice(2));
378
397
  }
@@ -656,9 +656,28 @@ export function main(argv: string[] | null = null): number {
656
656
  return render(args.quiet);
657
657
  }
658
658
 
659
- const _isCliEntry =
660
- process.argv[1] !== undefined &&
661
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
662
- if (_isCliEntry || process.argv[1] === _HERE) {
659
+ function _isCliEntry(): boolean {
660
+ if (process.argv[1] === undefined) {
661
+ return false;
662
+ }
663
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
664
+ if (import.meta.url === argvUrl) {
665
+ return true;
666
+ }
667
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
668
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
669
+ // import.meta.url is the resolved real path while argv[1] keeps the
670
+ // symlink path. Compare realpaths so the entry guard still fires
671
+ // (without this the CLI silently no-ops when run through a symlink).
672
+ try {
673
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
674
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
675
+ return here === argv;
676
+ } catch {
677
+ return false;
678
+ }
679
+ }
680
+
681
+ if (_isCliEntry() || process.argv[1] === _HERE) {
663
682
  process.exit(main());
664
683
  }
@@ -289,24 +289,33 @@ function _isFile(p: string): boolean {
289
289
  /**
290
290
  * Resolve how to run the `.ts` regenerator: prefer the `tsx` binary from a
291
291
  * `node_modules/.bin` directory found by walking up from the regenerator's
292
- * directory; fall back to `npx tsx`. Mirrors
293
- * `dispatch_hook.ts::_resolve_tsx_invocation` so the regenerator runs as
294
- * TypeScript with no python3 dependency (the regenerator may live in a
295
- * consumer `.augment/scripts/` with the package's node_modules up the tree).
292
+ * directory, then from THIS module's own package tree; only then fall back
293
+ * to `npx tsx`. Mirrors `dispatch_hook.ts::_resolve_tsx_invocation` so the
294
+ * regenerator runs as TypeScript with no python3 dependency. The package-
295
+ * tree branch matters when the regenerator lives in a consumer
296
+ * `.augment/scripts/` whose tree carries no tsx — `npx tsx` there runs
297
+ * against the consumer's npm config and fails hard on e.g. devEngines pins
298
+ * (the 8.1.0 EBADDEVENGINES regression).
296
299
  */
297
300
  function _resolve_tsx_invocation(scriptPath: string): { command: string; args: string[] } {
298
301
  const binName = process.platform === "win32" ? "tsx.cmd" : "tsx";
299
- let dir = path.dirname(scriptPath);
300
- for (;;) {
301
- const candidate = path.join(dir, "node_modules", ".bin", binName);
302
- if (_isFile(candidate)) {
303
- return { command: candidate, args: [scriptPath] };
304
- }
305
- const parent = path.dirname(dir);
306
- if (parent === dir) {
307
- break;
302
+ const walkUp = (start: string): string | null => {
303
+ let dir = start;
304
+ for (;;) {
305
+ const candidate = path.join(dir, "node_modules", ".bin", binName);
306
+ if (_isFile(candidate)) {
307
+ return candidate;
308
+ }
309
+ const parent = path.dirname(dir);
310
+ if (parent === dir) {
311
+ return null;
312
+ }
313
+ dir = parent;
308
314
  }
309
- dir = parent;
315
+ };
316
+ const tsx = walkUp(path.dirname(scriptPath)) ?? walkUp(path.dirname(fileURLToPath(import.meta.url)));
317
+ if (tsx !== null) {
318
+ return { command: tsx, args: [scriptPath] };
310
319
  }
311
320
  return { command: "npx", args: ["tsx", scriptPath] };
312
321
  }
@@ -460,9 +469,30 @@ export function main(argv?: string[]): number {
460
469
  return run(_readStdin(), { consumer_root: root, verbose: args.verbose });
461
470
  }
462
471
 
472
+ function _isCliEntry(): boolean {
473
+ if (process.argv[1] === undefined) {
474
+ return false;
475
+ }
476
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
477
+ if (import.meta.url === argvUrl) {
478
+ return true;
479
+ }
480
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
481
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
482
+ // import.meta.url is the resolved real path while argv[1] keeps the
483
+ // symlink path. Compare realpaths so the entry guard still fires
484
+ // (without this the CLI silently no-ops when run through a symlink).
485
+ try {
486
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
487
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
488
+ return here === argv;
489
+ } catch {
490
+ return false;
491
+ }
492
+ }
493
+
463
494
  const isCliEntry =
464
- process.argv[1] !== undefined &&
465
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
495
+ _isCliEntry();
466
496
  if (isCliEntry) {
467
497
  process.exit(main(process.argv.slice(2)));
468
498
  }
@@ -507,9 +507,28 @@ function _runCli(): number {
507
507
  }
508
508
  }
509
509
 
510
- const _isCliEntry =
511
- process.argv[1] !== undefined &&
512
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
513
- if (_isCliEntry || process.argv[1] === _HERE) {
510
+ function _isCliEntry(): boolean {
511
+ if (process.argv[1] === undefined) {
512
+ return false;
513
+ }
514
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
515
+ if (import.meta.url === argvUrl) {
516
+ return true;
517
+ }
518
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
519
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
520
+ // import.meta.url is the resolved real path while argv[1] keeps the
521
+ // symlink path. Compare realpaths so the entry guard still fires
522
+ // (without this the CLI silently no-ops when run through a symlink).
523
+ try {
524
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
525
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
526
+ return here === argv;
527
+ } catch {
528
+ return false;
529
+ }
530
+ }
531
+
532
+ if (_isCliEntry() || process.argv[1] === _HERE) {
514
533
  process.exit(_runCli());
515
534
  }
@@ -571,10 +571,29 @@ export function main(argv: string[]): number {
571
571
  return result.request.is_ready || result.request.status === 'blocked' ? 0 : 1;
572
572
  }
573
573
 
574
- const _isCliEntry =
575
- process.argv[1] !== undefined &&
576
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
577
- if (_isCliEntry || process.argv[1] === _HERE) {
574
+ function _isCliEntry(): boolean {
575
+ if (process.argv[1] === undefined) {
576
+ return false;
577
+ }
578
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
579
+ if (import.meta.url === argvUrl) {
580
+ return true;
581
+ }
582
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
583
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
584
+ // import.meta.url is the resolved real path while argv[1] keeps the
585
+ // symlink path. Compare realpaths so the entry guard still fires
586
+ // (without this the CLI silently no-ops when run through a symlink).
587
+ try {
588
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
589
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
590
+ return here === argv;
591
+ } catch {
592
+ return false;
593
+ }
594
+ }
595
+
596
+ if (_isCliEntry() || process.argv[1] === _HERE) {
578
597
  try {
579
598
  process.exitCode = main(process.argv.slice(2));
580
599
  } catch (err) {