@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
@@ -27,7 +27,7 @@
27
27
  */
28
28
  import fs from "node:fs";
29
29
  import path from "node:path";
30
- import { pathToFileURL } from "node:url";
30
+ import { fileURLToPath, pathToFileURL } from "node:url";
31
31
 
32
32
  import {
33
33
  shlexSplit,
@@ -220,9 +220,28 @@ export function main(): number {
220
220
  return EXIT_WARN;
221
221
  }
222
222
 
223
- const _isCliEntry =
224
- process.argv[1] !== undefined &&
225
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
226
- if (_isCliEntry) {
223
+ function _isCliEntry(): boolean {
224
+ if (process.argv[1] === undefined) {
225
+ return false;
226
+ }
227
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
228
+ if (import.meta.url === argvUrl) {
229
+ return true;
230
+ }
231
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
232
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
233
+ // import.meta.url is the resolved real path while argv[1] keeps the
234
+ // symlink path. Compare realpaths so the entry guard still fires
235
+ // (without this the CLI silently no-ops when run through a symlink).
236
+ try {
237
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
238
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
239
+ return here === argv;
240
+ } catch {
241
+ return false;
242
+ }
243
+ }
244
+
245
+ if (_isCliEntry()) {
227
246
  process.exit(main());
228
247
  }
@@ -410,9 +410,30 @@ export function main(argv?: string[]): number {
410
410
  return _final_exit_code(payload, args.strict);
411
411
  }
412
412
 
413
+ function _isCliEntry(): boolean {
414
+ if (process.argv[1] === undefined) {
415
+ return false;
416
+ }
417
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
418
+ if (import.meta.url === argvUrl) {
419
+ return true;
420
+ }
421
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
422
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
423
+ // import.meta.url is the resolved real path while argv[1] keeps the
424
+ // symlink path. Compare realpaths so the entry guard still fires
425
+ // (without this the CLI silently no-ops when run through a symlink).
426
+ try {
427
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
428
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
429
+ return here === argv;
430
+ } catch {
431
+ return false;
432
+ }
433
+ }
434
+
413
435
  const isCliEntry =
414
- process.argv[1] !== undefined &&
415
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
436
+ _isCliEntry();
416
437
  if (isCliEntry) {
417
438
  process.exit(main(process.argv.slice(2)));
418
439
  }
@@ -284,9 +284,30 @@ export function main(argv?: string[]): number {
284
284
  return _final_exit_code(matrix, args.strict);
285
285
  }
286
286
 
287
+ function _isCliEntry(): boolean {
288
+ if (process.argv[1] === undefined) {
289
+ return false;
290
+ }
291
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
292
+ if (import.meta.url === argvUrl) {
293
+ return true;
294
+ }
295
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
296
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
297
+ // import.meta.url is the resolved real path while argv[1] keeps the
298
+ // symlink path. Compare realpaths so the entry guard still fires
299
+ // (without this the CLI silently no-ops when run through a symlink).
300
+ try {
301
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
302
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
303
+ return here === argv;
304
+ } catch {
305
+ return false;
306
+ }
307
+ }
308
+
287
309
  const isCliEntry =
288
- process.argv[1] !== undefined &&
289
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
310
+ _isCliEntry();
290
311
  if (isCliEntry) {
291
312
  process.exit(main(process.argv.slice(2)));
292
313
  }
@@ -28,7 +28,7 @@
28
28
  */
29
29
  import fs from "node:fs";
30
30
  import path from "node:path";
31
- import { pathToFileURL } from "node:url";
31
+ import { fileURLToPath, pathToFileURL } from "node:url";
32
32
 
33
33
  const SETTINGS_FILE = ".agent-settings.yml";
34
34
  const EXIT_ALLOW = 0;
@@ -277,9 +277,28 @@ function _readStdin(): string {
277
277
  return fs.readFileSync(0, "utf-8");
278
278
  }
279
279
 
280
- const _isCliEntry =
281
- process.argv[1] !== undefined &&
282
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
283
- if (_isCliEntry) {
280
+ function _isCliEntry(): boolean {
281
+ if (process.argv[1] === undefined) {
282
+ return false;
283
+ }
284
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
285
+ if (import.meta.url === argvUrl) {
286
+ return true;
287
+ }
288
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
289
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
290
+ // import.meta.url is the resolved real path while argv[1] keeps the
291
+ // symlink path. Compare realpaths so the entry guard still fires
292
+ // (without this the CLI silently no-ops when run through a symlink).
293
+ try {
294
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
295
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
296
+ return here === argv;
297
+ } catch {
298
+ return false;
299
+ }
300
+ }
301
+
302
+ if (_isCliEntry()) {
284
303
  process.exit(main());
285
304
  }
@@ -27,6 +27,9 @@
27
27
  # the comma-separated values are unioned.
28
28
  # --list-tools Print supported tool IDs with descriptions, then exit
29
29
  # --yes, -y Non-interactive mode: do not prompt (default for non-TTY)
30
+ # --no-ui Unattended install: never launch the browser setup
31
+ # wizard and skip the terminal tool picker (tools default
32
+ # to all). Used by `agent-config upgrade`.
30
33
  # --force Overwrite existing bridge files
31
34
  # --dry-run Show what payload sync would do (does not run bridges)
32
35
  # --verbose Detailed payload sync output
@@ -95,12 +98,13 @@ MINIMAL=false
95
98
  VALIDATE_ONLY=false
96
99
  FLEET_CONFIG=""
97
100
  USER_TYPE=""
101
+ NO_UI=false
98
102
 
99
103
  # Single source of truth for valid tool IDs (also referenced by install.sh / install.py).
100
104
  VALID_TOOLS="claude-code claude-desktop cursor windsurf cline gemini-cli copilot augment aider codex roocode continue kilocode zed jetbrains kiro all"
101
105
 
102
106
  show_help() {
103
- sed -n '3,58p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
107
+ sed -n '3,61p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
104
108
  }
105
109
 
106
110
  list_tools() {
@@ -167,6 +171,7 @@ while [[ $# -gt 0 ]]; do
167
171
  --ai=*) TOOLS="${TOOLS:+$TOOLS,}${1#*=}"; TOOLS_EXPLICIT=true; shift ;;
168
172
  --list-tools) LIST_TOOLS=true; shift ;;
169
173
  --yes|-y) YES=true; shift ;;
174
+ --no-ui) NO_UI=true; shift ;;
170
175
  --force) FORCE=true; shift ;;
171
176
  --dry-run) DRY_RUN=true; shift ;;
172
177
  --verbose) VERBOSE=true; shift ;;
@@ -194,6 +199,15 @@ if $LIST_TOOLS; then
194
199
  exit 0
195
200
  fi
196
201
 
202
+ # --no-ui = unattended install (the `agent-config upgrade` path). Export the
203
+ # suppression env so every downstream stage (install.ts honors both the flag
204
+ # and AGENT_CONFIG_NO_UI) skips the browser setup wizard — the wizard is an
205
+ # onboarding surface whose foreground server used to block `upgrade` until
206
+ # Ctrl-C.
207
+ if $NO_UI; then
208
+ export AGENT_CONFIG_NO_UI=1
209
+ fi
210
+
197
211
  # road-to-global-only-install § Phase 3.3 — consumer-floor gate.
198
212
  #
199
213
  # Consumer installs are global-only (ADR-020). Explicit --scope=project
@@ -282,8 +296,8 @@ prompt_tools() {
282
296
  # When an interactive global install will hand off to the browser wizard,
283
297
  # the wizard is the single tool-selection surface — skip the terminal
284
298
  # picker so it does not pre-empt (and, via TOOLS_EXPLICIT, suppress) the
285
- # GUI. Mirrors install.py::_wizard_should_launch minus the --no-ui flag,
286
- # which the bash orchestrator never receives (it errors on unknown args).
299
+ # GUI. Mirrors install.py::_wizard_should_launch (the --no-ui flag is
300
+ # handled here too — it suppresses both the wizard and the picker).
287
301
  # Headless paths (no TTY / CI / AGENT_CONFIG_NO_UI) still get the picker.
288
302
  wizard_will_handle_tools=false
289
303
  if $GLOBAL && [[ -t 0 && -t 1 && -z "${CI:-}" ]] \
@@ -291,8 +305,12 @@ if $GLOBAL && [[ -t 0 && -t 1 && -z "${CI:-}" ]] \
291
305
  wizard_will_handle_tools=true
292
306
  fi
293
307
 
308
+ # --no-ui also skips the terminal picker: the flag means "fully unattended"
309
+ # (its only caller today is `agent-config upgrade`, where a mid-upgrade
310
+ # prompt reads as a hang). Tools fall through to the "all" default below —
311
+ # the same effective selection the wizard-handoff path used.
294
312
  if ! $MINIMAL && ! $TOOLS_EXPLICIT && ! $YES && ! $QUIET && ! $LIST_TOOLS \
295
- && [[ -t 0 && -t 1 ]] && ! $wizard_will_handle_tools; then
313
+ && [[ -t 0 && -t 1 ]] && ! $wizard_will_handle_tools && ! $NO_UI; then
296
314
  prompt_tools
297
315
  TOOLS_EXPLICIT=true
298
316
  fi
@@ -416,6 +434,7 @@ run_bridges() {
416
434
  [[ -n "$CUSTOM_PATH" ]] && args+=(--custom-path="$CUSTOM_PATH")
417
435
  $OFFLINE && args+=(--offline)
418
436
  $MINIMAL && args+=(--minimal)
437
+ $NO_UI && args+=(--no-ui)
419
438
  args+=(--tools="$TOOLS")
420
439
  "${runner[@]}" "${args[@]}"
421
440
  }
@@ -62,7 +62,7 @@
62
62
  * - `signal.SIGTERM`/`SIGKILL` + `os.kill(pid, 0)` liveness → `process.kill`.
63
63
  */
64
64
 
65
- import { spawnSync } from 'node:child_process';
65
+ import { spawn, spawnSync, type ChildProcess } from 'node:child_process';
66
66
  import * as crypto from 'node:crypto';
67
67
  import * as fs from 'node:fs';
68
68
  import * as os from 'node:os';
@@ -78,6 +78,7 @@ import * as global_deploy_inventory from './_lib/global_deploy_inventory.js';
78
78
  import * as installed_tools from './_lib/installed_tools.js';
79
79
  import * as user_global_paths from './_lib/user_global_paths.js';
80
80
  import * as claude_desktop_bundler from './_lib/claude_desktop_bundler.js';
81
+ import * as claude_settings_hooks from './_lib/claude_settings_hooks.js';
81
82
  import { find_project_root_with_anchor, load_agent_settings } from './_lib/agent_settings.js';
82
83
  import { detect_module_roots } from './_lib/module_detection.js';
83
84
  import {
@@ -2914,6 +2915,35 @@ function _deploy_global_content(
2914
2915
  }
2915
2916
  _emit_progress({ type: 'reaped', tool: tool_id, count: reaped.length });
2916
2917
  results[tool_id] = [written_total, skipped_total, 'deployed', written_paths];
2918
+
2919
+ // Single-surface model (road-to-claude-code-single-surface): the
2920
+ // deterministic hook matrix registers directly in the user-scope
2921
+ // settings file — the marketplace plugin is no longer required for
2922
+ // hooks. Failure here must not sink the content deploy (hooks can
2923
+ // be re-wired via `agent-config refresh --global` / doctor).
2924
+ if (tool_id === 'claude-code') {
2925
+ try {
2926
+ const manifest = path.join(package_root, 'src', 'scripts', 'hook_manifest.yaml');
2927
+ const matrix = claude_settings_hooks.build_claude_hook_matrix(manifest);
2928
+ const res = claude_settings_hooks.ensure_managed_hooks(
2929
+ path.join(anchor, 'settings.json'),
2930
+ matrix,
2931
+ );
2932
+ if (!state.QUIET) {
2933
+ if (res.changed) {
2934
+ success(
2935
+ `claude-code: managed hooks registered in ~/.claude/settings.json ` +
2936
+ `(${res.events.length} event(s))`,
2937
+ );
2938
+ } else {
2939
+ skip('claude-code: managed hooks already registered');
2940
+ }
2941
+ }
2942
+ } catch (e) {
2943
+ warn(`claude-code: managed-hook registration failed — ${String(e)}`);
2944
+ _emit_progress({ type: 'hooks_failed', tool: tool_id, error: String(e) });
2945
+ }
2946
+ }
2917
2947
  }
2918
2948
  return results;
2919
2949
  }
@@ -3247,7 +3277,7 @@ function install_global(
3247
3277
 
3248
3278
  if (!state.QUIET) {
3249
3279
  process.stdout.write('\n');
3250
- success('Global install completed.');
3280
+ success(`Global install completed (v${installed_version}).`);
3251
3281
  process.stdout.write('\n');
3252
3282
  }
3253
3283
  return 0;
@@ -3843,76 +3873,104 @@ function _wizard_spawn(project_root: string, pass_project_root: boolean = true):
3843
3873
  }
3844
3874
  const env = { ...process.env };
3845
3875
 
3846
- // The Python uses subprocess.Popen + a stderr-draining thread + a
3847
- // readline loop with progressive timeouts, then child.wait(). Node has no
3848
- // synchronous equivalent that also streams; we run the whole wizard
3849
- // handoff via a synchronous helper that mirrors the observable behaviour
3850
- // (URL banner, stderr tail, browser open, blocking wait). Implemented with
3851
- // spawnSync for the simple boot+wait, and a bounded readiness poll.
3876
+ // The wizard child is a long-running local server — it must NOT keep the
3877
+ // installer process in the foreground (a blocking wait here forced users
3878
+ // to Ctrl-C out of `agent-config global` / `upgrade`, which then reported
3879
+ // the step as failed). Spawn it detached, poll for the WIZARD_READY line,
3880
+ // print the banner + open the browser, and return while the server keeps
3881
+ // running in the background.
3852
3882
  return _wizard_run_sync(cmd, env, cli);
3853
3883
  }
3854
3884
 
3855
3885
  /**
3856
- * Synchronous wizard run mirroring `_wizard_spawn` + `_wizard_await_ready`.
3857
- * spawnSync blocks until the child exits and captures stdout/stderr; we then
3858
- * scan the captured stdout for the WIZARD_READY line, print the banner / open
3859
- * the browser, and return the child's exit code. A child that never prints
3860
- * WIZARD_READY before exiting falls through to the timeout fallback message.
3861
- *
3862
- * Divergence note: the Python streams stdout line-by-line with a 150s
3863
- * progressive-timeout budget and hands the terminal to a still-running child
3864
- * (Ctrl-C forwarding). spawnSync cannot hand off an interactive child, so this
3865
- * twin runs the child to completion under the same total budget and surfaces
3866
- * the same banner/fallback text. This path is network/subprocess-bound and is
3867
- * NOT exercised by the deterministic golden tests (guarded behind the TTY +
3868
- * dist-present gates).
3886
+ * Detached wizard launch mirroring `_wizard_spawn` + `_wizard_await_ready`.
3887
+ * The child (a local server that keeps running until the wizard finishes) is
3888
+ * spawned detached with its output redirected to a temp log; a bounded poll
3889
+ * scans the log for the WIZARD_READY line, then prints the banner and opens
3890
+ * the browser. The installer returns immediately after — it never blocks on
3891
+ * the server's lifetime. A child that exits or stays silent past the budget
3892
+ * falls through to the fallback message. This path is network/subprocess-
3893
+ * bound and is NOT exercised by the deterministic golden tests (guarded
3894
+ * behind the TTY + dist-present gates).
3869
3895
  */
3870
3896
  function _wizard_run_sync(cmd: string[], env: NodeJS.ProcessEnv, cli: string): number {
3871
3897
  const total = _WIZARD_TIMEOUTS.reduce((a, b) => a + b, 0);
3872
- let res;
3898
+ const log_path = path.join(
3899
+ os.tmpdir(),
3900
+ `agent-config-wizard-${process.pid}-${Date.now()}.log`,
3901
+ );
3902
+ let child: ChildProcess;
3903
+ let log_fd: number | null = null;
3873
3904
  try {
3874
- res = spawnSync(cmd[0] as string, cmd.slice(1), {
3905
+ log_fd = fs.openSync(log_path, 'w');
3906
+ child = spawn(cmd[0] as string, cmd.slice(1), {
3875
3907
  env,
3876
- encoding: 'utf-8',
3877
- timeout: total * 1000,
3878
- maxBuffer: 64 * 1024 * 1024,
3908
+ detached: true,
3909
+ stdio: ['ignore', log_fd, log_fd],
3879
3910
  });
3911
+ // ENOENT & friends surface as an async 'error' event on a detached
3912
+ // spawn — swallow it here; the readiness poll below reports the
3913
+ // failure via the fallback message instead of crashing the installer.
3914
+ child.on('error', () => {});
3915
+ child.unref();
3880
3916
  } catch (exc) {
3881
3917
  process.stdout.write(
3882
3918
  `(Wizard failed to start: ${String(exc)}; run 'node ${cli} install --no-open' manually.)\n`,
3883
3919
  );
3884
3920
  return 0;
3921
+ } finally {
3922
+ if (log_fd !== null) {
3923
+ try {
3924
+ fs.closeSync(log_fd);
3925
+ } catch {
3926
+ /* already closed */
3927
+ }
3928
+ }
3885
3929
  }
3886
- if (res.error && (res.error as NodeJS.ErrnoException).code === 'ENOENT') {
3887
- process.stdout.write(
3888
- `(Wizard failed to start: ${String(res.error)}; run 'node ${cli} install --no-open' manually.)\n`,
3889
- );
3890
- return 0;
3891
- }
3892
- const stdout = res.stdout || '';
3930
+
3931
+ const read_log = (): string => {
3932
+ try {
3933
+ return readText(log_path);
3934
+ } catch {
3935
+ return '';
3936
+ }
3937
+ };
3938
+ const deadline = Date.now() + total * 1000;
3893
3939
  let matched_url: string | null = null;
3894
- for (const line of stdout.split('\n')) {
3895
- const m = _WIZARD_READY_RE.exec(line + '\n');
3896
- if (m) {
3897
- matched_url = m[1] as string;
3898
- break;
3940
+ for (;;) {
3941
+ for (const line of read_log().split('\n')) {
3942
+ const m = _WIZARD_READY_RE.exec(line + '\n');
3943
+ if (m) {
3944
+ matched_url = m[1] as string;
3945
+ break;
3946
+ }
3899
3947
  }
3948
+ if (matched_url !== null) break;
3949
+ const pid = child.pid;
3950
+ if (pid === undefined || !pidAlive(pid)) break; // child died before ready
3951
+ if (Date.now() >= deadline) break;
3952
+ sleepMs(200);
3900
3953
  }
3901
3954
  if (matched_url === null) {
3902
- const stderrLines = (res.stderr || '').split('\n').filter((l) => l !== '');
3903
- const tail = stderrLines.length ? stderrLines.slice(-20).join('\n ') : '(no stderr captured)';
3955
+ const logLines = read_log()
3956
+ .split('\n')
3957
+ .filter((l) => l !== '');
3958
+ const tail = logLines.length ? logLines.slice(-20).join('\n ') : '(no output captured)';
3904
3959
  process.stdout.write(
3905
- `(Wizard server boot timed out after ${Math.trunc(total)}s; ` +
3960
+ `(Wizard server did not report ready within ${Math.trunc(total)}s; ` +
3906
3961
  `run 'node ${cli} install --no-open' manually.)\n` +
3907
- ` Last stderr:\n ${tail}\n`,
3962
+ ` Last output:\n ${tail}\n`,
3908
3963
  );
3909
3964
  return 0;
3910
3965
  }
3911
3966
  process.stdout.write('\n');
3912
3967
  process.stdout.write(`Setup wizard ready: ${matched_url}\n`);
3913
3968
  _openBrowser(matched_url);
3914
- process.stdout.write('(Wizard runs in the background; close the tab or press Ctrl-C to stop.)\n');
3915
- return res.status ?? 0;
3969
+ process.stdout.write(
3970
+ '(Wizard server keeps running in the background — finish the wizard in the ' +
3971
+ 'browser tab; the next install run stops any stale server.)\n',
3972
+ );
3973
+ return 0;
3916
3974
  }
3917
3975
 
3918
3976
  /** `webbrowser.open` — best-effort platform open; never fatal. */
@@ -1098,7 +1098,29 @@ export function main(argv: string[] | null = null): number {
1098
1098
  return 0;
1099
1099
  }
1100
1100
 
1101
- const _isMain = import.meta.url === pathToFileURL(path.resolve(process.argv[1] ?? '')).href;
1101
+ function _isCliEntry(): boolean {
1102
+ if (process.argv[1] === undefined) {
1103
+ return false;
1104
+ }
1105
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
1106
+ if (import.meta.url === argvUrl) {
1107
+ return true;
1108
+ }
1109
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
1110
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
1111
+ // import.meta.url is the resolved real path while argv[1] keeps the
1112
+ // symlink path. Compare realpaths so the entry guard still fires
1113
+ // (without this the CLI silently no-ops when run through a symlink).
1114
+ try {
1115
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
1116
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
1117
+ return here === argv;
1118
+ } catch {
1119
+ return false;
1120
+ }
1121
+ }
1122
+
1123
+ const _isMain = _isCliEntry();
1102
1124
  if (_isMain) {
1103
1125
  process.exitCode = main();
1104
1126
  }
@@ -315,6 +315,28 @@ function _isPySpace(ch: string): boolean {
315
315
  return /\s/u.test(ch);
316
316
  }
317
317
 
318
- if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
318
+ function _isCliEntry(): boolean {
319
+ if (process.argv[1] === undefined) {
320
+ return false;
321
+ }
322
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
323
+ if (import.meta.url === argvUrl) {
324
+ return true;
325
+ }
326
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
327
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
328
+ // import.meta.url is the resolved real path while argv[1] keeps the
329
+ // symlink path. Compare realpaths so the entry guard still fires
330
+ // (without this the CLI silently no-ops when run through a symlink).
331
+ try {
332
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
333
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
334
+ return here === argv;
335
+ } catch {
336
+ return false;
337
+ }
338
+ }
339
+
340
+ if (_isCliEntry()) {
319
341
  process.exitCode = main();
320
342
  }
@@ -514,7 +514,29 @@ function _stableSort<T>(items: T[], cmp: (a: T, b: T) => number): T[] {
514
514
  return indexed.map((e) => e.item);
515
515
  }
516
516
 
517
- if (import.meta.url === pathToFileURL(process.argv[1] ?? '').href) {
517
+ function _isCliEntry(): boolean {
518
+ if (process.argv[1] === undefined) {
519
+ return false;
520
+ }
521
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
522
+ if (import.meta.url === argvUrl) {
523
+ return true;
524
+ }
525
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
526
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
527
+ // import.meta.url is the resolved real path while argv[1] keeps the
528
+ // symlink path. Compare realpaths so the entry guard still fires
529
+ // (without this the CLI silently no-ops when run through a symlink).
530
+ try {
531
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
532
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
533
+ return here === argv;
534
+ } catch {
535
+ return false;
536
+ }
537
+ }
538
+
539
+ if (_isCliEntry()) {
518
540
  try {
519
541
  process.exitCode = main();
520
542
  } catch (e) {
@@ -214,10 +214,29 @@ function _ljust(s: string, width: number): string {
214
214
  return pad > 0 ? s + ' '.repeat(pad) : s;
215
215
  }
216
216
 
217
- const _isCliEntry =
218
- process.argv[1] !== undefined &&
219
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
220
- if (_isCliEntry || process.argv[1] === _HERE) {
217
+ function _isCliEntry(): boolean {
218
+ if (process.argv[1] === undefined) {
219
+ return false;
220
+ }
221
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
222
+ if (import.meta.url === argvUrl) {
223
+ return true;
224
+ }
225
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
226
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
227
+ // import.meta.url is the resolved real path while argv[1] keeps the
228
+ // symlink path. Compare realpaths so the entry guard still fires
229
+ // (without this the CLI silently no-ops when run through a symlink).
230
+ try {
231
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
232
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
233
+ return here === argv;
234
+ } catch {
235
+ return false;
236
+ }
237
+ }
238
+
239
+ if (_isCliEntry() || process.argv[1] === _HERE) {
221
240
  try {
222
241
  process.exitCode = main();
223
242
  } catch (err) {
@@ -248,10 +248,29 @@ function main(argv?: readonly string[]): number {
248
248
  return 0;
249
249
  }
250
250
 
251
- const _isCliEntry =
252
- process.argv[1] !== undefined &&
253
- import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
254
- if (_isCliEntry || process.argv[1] === _HERE) {
251
+ function _isCliEntry(): boolean {
252
+ if (process.argv[1] === undefined) {
253
+ return false;
254
+ }
255
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
256
+ if (import.meta.url === argvUrl) {
257
+ return true;
258
+ }
259
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
260
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
261
+ // import.meta.url is the resolved real path while argv[1] keeps the
262
+ // symlink path. Compare realpaths so the entry guard still fires
263
+ // (without this the CLI silently no-ops when run through a symlink).
264
+ try {
265
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
266
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
267
+ return here === argv;
268
+ } catch {
269
+ return false;
270
+ }
271
+ }
272
+
273
+ if (_isCliEntry() || process.argv[1] === _HERE) {
255
274
  process.exit(main());
256
275
  }
257
276
 
@@ -36,7 +36,7 @@ import { spawnSync } from 'node:child_process';
36
36
  import * as fs from 'node:fs';
37
37
  import * as path from 'node:path';
38
38
  import process from 'node:process';
39
- import { pathToFileURL } from 'node:url';
39
+ import { fileURLToPath, pathToFileURL } from 'node:url';
40
40
 
41
41
  import type { SettingsDict, SettingsValue } from './_lib/agent_settings.js';
42
42
  import { write_atomic } from './_lib/fs_atomic.js';
@@ -1097,8 +1097,30 @@ function _repoRoot(): string {
1097
1097
  return path.resolve(path.dirname(_thisFile()), '..', '..');
1098
1098
  }
1099
1099
 
1100
+ function _isCliEntry(): boolean {
1101
+ if (process.argv[1] === undefined) {
1102
+ return false;
1103
+ }
1104
+ const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
1105
+ if (import.meta.url === argvUrl) {
1106
+ return true;
1107
+ }
1108
+ // A symlinked invocation (e.g. via an installed `.augment/` projection,
1109
+ // or macOS /var → /private/var temp dirs) makes the raw URLs differ:
1110
+ // import.meta.url is the resolved real path while argv[1] keeps the
1111
+ // symlink path. Compare realpaths so the entry guard still fires
1112
+ // (without this the CLI silently no-ops when run through a symlink).
1113
+ try {
1114
+ const here = fs.realpathSync(fileURLToPath(import.meta.url));
1115
+ const argv = fs.realpathSync(path.resolve(process.argv[1]));
1116
+ return here === argv;
1117
+ } catch {
1118
+ return false;
1119
+ }
1120
+ }
1121
+
1100
1122
  const _isMain =
1101
- process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
1123
+ _isCliEntry();
1102
1124
  if (_isMain) {
1103
1125
  // Mirror `raise SystemExit(main())`.
1104
1126
  process.exit(main());