@event4u/agent-config 2.26.0 → 3.1.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 (870) hide show
  1. package/.agent-src/commands/agent-handoff.md +15 -3
  2. package/.agent-src/commands/agent-status.md +12 -0
  3. package/.agent-src/commands/agents/audit.md +12 -0
  4. package/.agent-src/commands/agents/init.md +12 -0
  5. package/.agent-src/commands/agents/optimize.md +12 -0
  6. package/.agent-src/commands/agents/user/accept.md +12 -0
  7. package/.agent-src/commands/agents/user/init.md +12 -0
  8. package/.agent-src/commands/agents/user/review.md +12 -0
  9. package/.agent-src/commands/agents/user/show.md +12 -0
  10. package/.agent-src/commands/agents/user/update.md +12 -0
  11. package/.agent-src/commands/agents/user.md +12 -0
  12. package/.agent-src/commands/agents.md +12 -0
  13. package/.agent-src/commands/analyze-reference-repo.md +15 -3
  14. package/.agent-src/commands/bug-fix.md +12 -0
  15. package/.agent-src/commands/bug-investigate.md +13 -1
  16. package/.agent-src/commands/challenge-me/vision.md +12 -0
  17. package/.agent-src/commands/challenge-me/with-docs.md +12 -0
  18. package/.agent-src/commands/challenge-me.md +12 -0
  19. package/.agent-src/commands/chat-history/import.md +16 -4
  20. package/.agent-src/commands/chat-history/learn.md +15 -3
  21. package/.agent-src/commands/chat-history/show.md +17 -5
  22. package/.agent-src/commands/chat-history.md +14 -2
  23. package/.agent-src/commands/check-current-md.md +12 -0
  24. package/.agent-src/commands/commit/in-chunks.md +12 -0
  25. package/.agent-src/commands/commit.md +12 -0
  26. package/.agent-src/commands/compress.md +12 -0
  27. package/.agent-src/commands/context/create.md +17 -5
  28. package/.agent-src/commands/context/refactor.md +15 -3
  29. package/.agent-src/commands/context.md +12 -0
  30. package/.agent-src/commands/cost-report.md +12 -0
  31. package/.agent-src/commands/council/analysis.md +15 -3
  32. package/.agent-src/commands/council/debate.md +17 -5
  33. package/.agent-src/commands/council/default.md +17 -5
  34. package/.agent-src/commands/council/design.md +12 -0
  35. package/.agent-src/commands/council/optimize.md +12 -0
  36. package/.agent-src/commands/council/pr.md +12 -0
  37. package/.agent-src/commands/council.md +13 -1
  38. package/.agent-src/commands/create-pr/description-only.md +12 -0
  39. package/.agent-src/commands/create-pr.md +39 -0
  40. package/.agent-src/commands/e2e-heal.md +12 -0
  41. package/.agent-src/commands/e2e-plan.md +12 -0
  42. package/.agent-src/commands/estimate-ticket.md +12 -0
  43. package/.agent-src/commands/feature/dev.md +13 -1
  44. package/.agent-src/commands/feature/explore.md +12 -0
  45. package/.agent-src/commands/feature/plan.md +14 -2
  46. package/.agent-src/commands/feature/refactor.md +12 -0
  47. package/.agent-src/commands/feature/roadmap.md +12 -0
  48. package/.agent-src/commands/feature.md +12 -0
  49. package/.agent-src/commands/fix/ci.md +12 -0
  50. package/.agent-src/commands/fix/portability.md +12 -0
  51. package/.agent-src/commands/fix/pr-bot-comments.md +12 -0
  52. package/.agent-src/commands/fix/pr-comments.md +12 -0
  53. package/.agent-src/commands/fix/pr-developer-comments.md +12 -0
  54. package/.agent-src/commands/fix/refs.md +12 -0
  55. package/.agent-src/commands/fix/seeder.md +12 -0
  56. package/.agent-src/commands/fix.md +12 -0
  57. package/.agent-src/commands/ghostwriter/delete.md +20 -8
  58. package/.agent-src/commands/ghostwriter/fetch.md +19 -7
  59. package/.agent-src/commands/ghostwriter/list.md +19 -7
  60. package/.agent-src/commands/ghostwriter/show.md +14 -2
  61. package/.agent-src/commands/ghostwriter/write.md +15 -3
  62. package/.agent-src/commands/ghostwriter.md +14 -2
  63. package/.agent-src/commands/grill-me.md +12 -0
  64. package/.agent-src/commands/implement-ticket.md +12 -0
  65. package/.agent-src/commands/install-via-agent.md +129 -0
  66. package/.agent-src/commands/jira-ticket.md +12 -0
  67. package/.agent-src/commands/judge/on-diff.md +12 -0
  68. package/.agent-src/commands/judge/solo.md +12 -0
  69. package/.agent-src/commands/judge/steps.md +12 -0
  70. package/.agent-src/commands/judge.md +12 -0
  71. package/.agent-src/commands/memory/add.md +12 -0
  72. package/.agent-src/commands/memory/learn-low-impact.md +18 -6
  73. package/.agent-src/commands/memory/load.md +12 -0
  74. package/.agent-src/commands/memory/mine-session.md +12 -0
  75. package/.agent-src/commands/memory/promote.md +12 -0
  76. package/.agent-src/commands/memory/propose.md +12 -0
  77. package/.agent-src/commands/memory.md +12 -0
  78. package/.agent-src/commands/mode.md +12 -0
  79. package/.agent-src/commands/module/create.md +12 -0
  80. package/.agent-src/commands/module/explore.md +13 -1
  81. package/.agent-src/commands/module.md +12 -0
  82. package/.agent-src/commands/optimize/agents-dir.md +14 -2
  83. package/.agent-src/commands/optimize/augmentignore.md +12 -0
  84. package/.agent-src/commands/optimize/rtk.md +12 -0
  85. package/.agent-src/commands/optimize/skills.md +12 -0
  86. package/.agent-src/commands/optimize-prompt.md +12 -0
  87. package/.agent-src/commands/optimize.md +12 -0
  88. package/.agent-src/commands/orchestrate.md +13 -1
  89. package/.agent-src/commands/override/create.md +12 -0
  90. package/.agent-src/commands/override/manage.md +12 -0
  91. package/.agent-src/commands/override.md +12 -0
  92. package/.agent-src/commands/package-reset.md +12 -0
  93. package/.agent-src/commands/package-test.md +12 -0
  94. package/.agent-src/commands/post-as/ghostwriter.md +12 -0
  95. package/.agent-src/commands/post-as/me.md +13 -1
  96. package/.agent-src/commands/post-as.md +12 -0
  97. package/.agent-src/commands/prepare-for-review.md +12 -0
  98. package/.agent-src/commands/project-analyze.md +27 -15
  99. package/.agent-src/commands/project-health.md +13 -1
  100. package/.agent-src/commands/quality-fix.md +12 -0
  101. package/.agent-src/commands/refine-ticket.md +12 -0
  102. package/.agent-src/commands/research/deep.md +12 -0
  103. package/.agent-src/commands/research/report.md +12 -0
  104. package/.agent-src/commands/research.md +12 -0
  105. package/.agent-src/commands/review-changes.md +12 -0
  106. package/.agent-src/commands/review-routing.md +12 -0
  107. package/.agent-src/commands/roadmap/ai-council.md +15 -3
  108. package/.agent-src/commands/roadmap/create.md +13 -1
  109. package/.agent-src/commands/roadmap/process-full.md +12 -0
  110. package/.agent-src/commands/roadmap/process-phase.md +12 -0
  111. package/.agent-src/commands/roadmap/process-step.md +12 -0
  112. package/.agent-src/commands/roadmap.md +12 -0
  113. package/.agent-src/commands/rule-compliance-audit.md +12 -0
  114. package/.agent-src/commands/set-cost-profile.md +12 -0
  115. package/.agent-src/commands/sync-agent-settings.md +12 -0
  116. package/.agent-src/commands/sync-gitignore/fix.md +32 -13
  117. package/.agent-src/commands/sync-gitignore.md +13 -1
  118. package/.agent-src/commands/tests/create.md +12 -0
  119. package/.agent-src/commands/tests/execute.md +12 -0
  120. package/.agent-src/commands/tests.md +12 -0
  121. package/.agent-src/commands/threat-model.md +12 -0
  122. package/.agent-src/commands/update-form-request-messages.md +12 -0
  123. package/.agent-src/commands/upstream-contribute.md +12 -0
  124. package/.agent-src/commands/video/from-script.md +13 -1
  125. package/.agent-src/commands/video/scene.md +12 -0
  126. package/.agent-src/commands/video/stitch.md +13 -1
  127. package/.agent-src/commands/video/storyboard.md +12 -0
  128. package/.agent-src/commands/video.md +13 -1
  129. package/.agent-src/commands/work.md +12 -0
  130. package/.agent-src/contexts/augment-infrastructure.md +2 -2
  131. package/.agent-src/contexts/authority/scope-mechanics.md +11 -0
  132. package/.agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  133. package/.agent-src/contexts/documentation-hierarchy.md +2 -2
  134. package/.agent-src/contexts/execution/cheap-question-mechanics.md +81 -0
  135. package/.agent-src/contexts/execution/roadmap-process-loop.md +19 -0
  136. package/.agent-src/ghostwriter/README.md +2 -2
  137. package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
  138. package/.agent-src/personas/README.md +1 -1
  139. package/.agent-src/personas/advisors/contrarian.md +1 -1
  140. package/.agent-src/personas/advisors/executor.md +1 -1
  141. package/.agent-src/personas/advisors/expansionist.md +1 -1
  142. package/.agent-src/personas/advisors/first-principles.md +1 -1
  143. package/.agent-src/personas/advisors/outsider.md +1 -1
  144. package/.agent-src/rules/agent-authority.md +12 -0
  145. package/.agent-src/rules/analysis-skill-routing.md +12 -0
  146. package/.agent-src/rules/architecture.md +13 -1
  147. package/.agent-src/rules/artifact-drafting-protocol.md +13 -1
  148. package/.agent-src/rules/artifact-engagement-recording.md +13 -1
  149. package/.agent-src/rules/ask-when-uncertain.md +12 -0
  150. package/.agent-src/rules/augment-edit-discipline.md +13 -1
  151. package/.agent-src/rules/augment-source-of-truth.md +13 -1
  152. package/.agent-src/rules/autonomous-execution.md +13 -1
  153. package/.agent-src/rules/caveman-speak.md +15 -3
  154. package/.agent-src/rules/cli-output-handling.md +13 -1
  155. package/.agent-src/rules/command-suggestion-policy.md +13 -1
  156. package/.agent-src/rules/commit-conventions.md +13 -1
  157. package/.agent-src/rules/commit-policy.md +12 -0
  158. package/.agent-src/rules/context-hygiene.md +51 -3
  159. package/.agent-src/rules/copilot-routing.md +13 -1
  160. package/.agent-src/rules/devcontainer-routing.md +13 -1
  161. package/.agent-src/rules/direct-answers.md +12 -0
  162. package/.agent-src/rules/docker-commands.md +13 -1
  163. package/.agent-src/rules/domain-adoption-policy.md +17 -5
  164. package/.agent-src/rules/domain-safety-disclaimer.md +13 -1
  165. package/.agent-src/rules/domain-safety-pii.md +13 -1
  166. package/.agent-src/rules/domain-safety-retention.md +13 -1
  167. package/.agent-src/rules/downstream-changes.md +13 -1
  168. package/.agent-src/rules/engineering-safety-floor.md +102 -0
  169. package/.agent-src/rules/external-reference-deep-dive.md +13 -1
  170. package/.agent-src/rules/fast-path-marker-visibility.md +21 -1
  171. package/.agent-src/rules/finance-safety-floor.md +114 -0
  172. package/.agent-src/rules/framework-neutrality-in-generic-skills.md +13 -1
  173. package/.agent-src/rules/git-history-discipline.md +14 -2
  174. package/.agent-src/rules/guidelines.md +12 -0
  175. package/.agent-src/rules/improve-before-implement.md +13 -1
  176. package/.agent-src/rules/invite-challenge.md +13 -1
  177. package/.agent-src/rules/language-and-tone.md +12 -0
  178. package/.agent-src/rules/laravel-routing.md +13 -1
  179. package/.agent-src/rules/laravel-translations.md +13 -1
  180. package/.agent-src/rules/low-impact-corpus-privacy-floor.md +17 -5
  181. package/.agent-src/rules/markdown-safe-codeblocks.md +13 -1
  182. package/.agent-src/rules/media-governance-routing.md +27 -15
  183. package/.agent-src/rules/minimal-safe-diff.md +13 -1
  184. package/.agent-src/rules/missing-tool-handling.md +13 -1
  185. package/.agent-src/rules/model-recommendation.md +13 -1
  186. package/.agent-src/rules/no-attribution-footers.md +13 -1
  187. package/.agent-src/rules/no-cheap-questions.md +46 -32
  188. package/.agent-src/rules/no-roadmap-references.md +28 -16
  189. package/.agent-src/rules/non-destructive-by-default.md +12 -0
  190. package/.agent-src/rules/onboarding-gate.md +19 -6
  191. package/.agent-src/rules/package-ci-checks.md +12 -0
  192. package/.agent-src/rules/persona-governance.md +13 -1
  193. package/.agent-src/rules/php-coding.md +13 -1
  194. package/.agent-src/rules/preservation-guard.md +13 -1
  195. package/.agent-src/rules/provider-lifecycle-discipline.md +18 -6
  196. package/.agent-src/rules/reviewer-awareness.md +13 -1
  197. package/.agent-src/rules/roadmap-ci-steps-policy.md +13 -1
  198. package/.agent-src/rules/roadmap-progress-sync.md +18 -1
  199. package/.agent-src/rules/role-mode-adherence.md +13 -1
  200. package/.agent-src/rules/rule-type-governance.md +13 -1
  201. package/.agent-src/rules/runtime-safety.md +13 -1
  202. package/.agent-src/rules/scope-control.md +12 -0
  203. package/.agent-src/rules/security-sensitive-stop.md +13 -1
  204. package/.agent-src/rules/size-enforcement.md +12 -0
  205. package/.agent-src/rules/skill-improvement-trigger.md +13 -1
  206. package/.agent-src/rules/skill-quality.md +13 -1
  207. package/.agent-src/rules/slash-command-routing-policy.md +13 -1
  208. package/.agent-src/rules/strategy-safety-floor.md +114 -0
  209. package/.agent-src/rules/symfony-routing.md +13 -1
  210. package/.agent-src/rules/think-before-action.md +13 -1
  211. package/.agent-src/rules/token-efficiency.md +13 -1
  212. package/.agent-src/rules/token-optimizer-maintenance.md +12 -0
  213. package/.agent-src/rules/tool-safety.md +13 -1
  214. package/.agent-src/rules/ui-audit-gate.md +13 -1
  215. package/.agent-src/rules/upstream-proposal.md +13 -1
  216. package/.agent-src/rules/user-interaction.md +13 -1
  217. package/.agent-src/rules/user-interrupt-priority.md +12 -0
  218. package/.agent-src/rules/verify-before-complete.md +12 -0
  219. package/.agent-src/skills/accessibility-auditor/SKILL.md +12 -0
  220. package/.agent-src/skills/activation-design/SKILL.md +12 -0
  221. package/.agent-src/skills/adr-create/SKILL.md +12 -0
  222. package/.agent-src/skills/adversarial-review/SKILL.md +12 -0
  223. package/.agent-src/skills/agent-docs-writing/SKILL.md +16 -4
  224. package/.agent-src/skills/agents-md-thin-root/SKILL.md +28 -10
  225. package/.agent-src/skills/ai-council/SKILL.md +28 -15
  226. package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +12 -0
  227. package/.agent-src/skills/analysis-skill-router/SKILL.md +12 -0
  228. package/.agent-src/skills/api-design/SKILL.md +13 -3
  229. package/.agent-src/skills/api-endpoint/SKILL.md +12 -0
  230. package/.agent-src/skills/api-testing/SKILL.md +12 -0
  231. package/.agent-src/skills/architecture-review-lens/SKILL.md +12 -0
  232. package/.agent-src/skills/artisan-commands/SKILL.md +12 -0
  233. package/.agent-src/skills/async-python-patterns/SKILL.md +13 -1
  234. package/.agent-src/skills/authz-review/SKILL.md +12 -2
  235. package/.agent-src/skills/aws-infrastructure/SKILL.md +12 -0
  236. package/.agent-src/skills/blade-ui/SKILL.md +12 -0
  237. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +12 -0
  238. package/.agent-src/skills/bug-analyzer/SKILL.md +14 -2
  239. package/.agent-src/skills/build-buy-partner/SKILL.md +12 -0
  240. package/.agent-src/skills/canvas-design/SKILL.md +12 -0
  241. package/.agent-src/skills/character-consistency/SKILL.md +23 -11
  242. package/.agent-src/skills/check-refs/SKILL.md +12 -0
  243. package/.agent-src/skills/churn-prevention/SKILL.md +12 -0
  244. package/.agent-src/skills/code-refactoring/SKILL.md +16 -4
  245. package/.agent-src/skills/code-review/SKILL.md +12 -0
  246. package/.agent-src/skills/command-routing/SKILL.md +12 -0
  247. package/.agent-src/skills/command-writing/SKILL.md +14 -2
  248. package/.agent-src/skills/comp-banding/SKILL.md +12 -0
  249. package/.agent-src/skills/competitive-moat-analysis/SKILL.md +12 -2
  250. package/.agent-src/skills/competitive-positioning/SKILL.md +12 -2
  251. package/.agent-src/skills/composer-packages/SKILL.md +12 -0
  252. package/.agent-src/skills/compress-memory/SKILL.md +12 -0
  253. package/.agent-src/skills/content-funnel-design/SKILL.md +12 -2
  254. package/.agent-src/skills/context-authoring/SKILL.md +18 -6
  255. package/.agent-src/skills/context-document/SKILL.md +17 -5
  256. package/.agent-src/skills/contracts-cognition/SKILL.md +12 -2
  257. package/.agent-src/skills/conventional-commits-writing/SKILL.md +12 -0
  258. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +13 -1
  259. package/.agent-src/skills/copilot-config/SKILL.md +12 -0
  260. package/.agent-src/skills/customer-research/SKILL.md +12 -0
  261. package/.agent-src/skills/dashboard-design/SKILL.md +12 -0
  262. package/.agent-src/skills/data-flow-mapper/SKILL.md +12 -0
  263. package/.agent-src/skills/data-handling-judgment/SKILL.md +12 -2
  264. package/.agent-src/skills/database/SKILL.md +14 -2
  265. package/.agent-src/skills/dcf-modeling/SKILL.md +12 -2
  266. package/.agent-src/skills/deal-qualification-meddic/SKILL.md +12 -2
  267. package/.agent-src/skills/decision-record/SKILL.md +12 -0
  268. package/.agent-src/skills/deep-reading-analyst/SKILL.md +12 -0
  269. package/.agent-src/skills/defense-in-depth/SKILL.md +13 -1
  270. package/.agent-src/skills/dependency-upgrade/SKILL.md +12 -0
  271. package/.agent-src/skills/description-assist/SKILL.md +12 -0
  272. package/.agent-src/skills/design-review/SKILL.md +12 -0
  273. package/.agent-src/skills/devcontainer/SKILL.md +12 -0
  274. package/.agent-src/skills/developer-like-execution/SKILL.md +12 -0
  275. package/.agent-src/skills/discovery-interview/SKILL.md +12 -2
  276. package/.agent-src/skills/doc-coauthoring/SKILL.md +12 -0
  277. package/.agent-src/skills/docker/SKILL.md +12 -0
  278. package/.agent-src/skills/editorial-calendar/SKILL.md +12 -2
  279. package/.agent-src/skills/eloquent/SKILL.md +12 -0
  280. package/.agent-src/skills/eloquent/evals/triggers.json +1 -1
  281. package/.agent-src/skills/error-handling-patterns/SKILL.md +13 -1
  282. package/.agent-src/skills/estimate-ticket/SKILL.md +12 -0
  283. package/.agent-src/skills/existing-ui-audit/SKILL.md +12 -0
  284. package/.agent-src/skills/expansion-playbook/SKILL.md +12 -0
  285. package/.agent-src/skills/fe-design/SKILL.md +12 -0
  286. package/.agent-src/skills/feature-planning/SKILL.md +12 -0
  287. package/.agent-src/skills/file-editor/SKILL.md +12 -0
  288. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +12 -0
  289. package/.agent-src/skills/flux/SKILL.md +12 -0
  290. package/.agent-src/skills/forecast-accuracy/SKILL.md +12 -2
  291. package/.agent-src/skills/forecasting/SKILL.md +12 -2
  292. package/.agent-src/skills/form-handler/SKILL.md +12 -0
  293. package/.agent-src/skills/fundraising-narrative/SKILL.md +12 -2
  294. package/.agent-src/skills/funnel-analysis/SKILL.md +12 -0
  295. package/.agent-src/skills/git-workflow/SKILL.md +12 -0
  296. package/.agent-src/skills/github-ci/SKILL.md +12 -0
  297. package/.agent-src/skills/grafana/SKILL.md +12 -0
  298. package/.agent-src/skills/gtm-launch/SKILL.md +12 -2
  299. package/.agent-src/skills/guideline-writing/SKILL.md +12 -0
  300. package/.agent-src/skills/hiring-loop-design/SKILL.md +12 -0
  301. package/.agent-src/skills/incident-commander/SKILL.md +12 -2
  302. package/.agent-src/skills/jira-integration/SKILL.md +12 -0
  303. package/.agent-src/skills/jobs-events/SKILL.md +12 -0
  304. package/.agent-src/skills/judge-bug-hunter/SKILL.md +12 -0
  305. package/.agent-src/skills/judge-code-quality/SKILL.md +12 -0
  306. package/.agent-src/skills/judge-security-auditor/SKILL.md +12 -0
  307. package/.agent-src/skills/judge-test-coverage/SKILL.md +12 -0
  308. package/.agent-src/skills/laravel/SKILL.md +12 -0
  309. package/.agent-src/skills/laravel-api-endpoint/SKILL.md +15 -3
  310. package/.agent-src/skills/laravel-dto/SKILL.md +14 -2
  311. package/.agent-src/skills/laravel-horizon/SKILL.md +12 -0
  312. package/.agent-src/skills/laravel-mail/SKILL.md +12 -0
  313. package/.agent-src/skills/laravel-middleware/SKILL.md +12 -0
  314. package/.agent-src/skills/laravel-migration/SKILL.md +12 -0
  315. package/.agent-src/skills/laravel-notifications/SKILL.md +12 -0
  316. package/.agent-src/skills/laravel-pennant/SKILL.md +12 -0
  317. package/.agent-src/skills/laravel-pulse/SKILL.md +12 -0
  318. package/.agent-src/skills/laravel-reverb/SKILL.md +12 -0
  319. package/.agent-src/skills/laravel-scheduling/SKILL.md +12 -0
  320. package/.agent-src/skills/laravel-validation/SKILL.md +12 -0
  321. package/.agent-src/skills/laravel-websocket/SKILL.md +12 -0
  322. package/.agent-src/skills/launch-readiness/SKILL.md +12 -2
  323. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +15 -3
  324. package/.agent-src/skills/lint-skills/SKILL.md +12 -0
  325. package/.agent-src/skills/livewire/SKILL.md +12 -0
  326. package/.agent-src/skills/livewire-architect/SKILL.md +12 -0
  327. package/.agent-src/skills/logging-monitoring/SKILL.md +12 -0
  328. package/.agent-src/skills/market-entry-analysis/SKILL.md +12 -0
  329. package/.agent-src/skills/markitdown/SKILL.md +14 -2
  330. package/.agent-src/skills/mcp/SKILL.md +12 -0
  331. package/.agent-src/skills/mcp-builder/SKILL.md +14 -2
  332. package/.agent-src/skills/md-language-check/SKILL.md +13 -1
  333. package/.agent-src/skills/memory-consolidation/SKILL.md +12 -0
  334. package/.agent-src/skills/merge-conflicts/SKILL.md +12 -0
  335. package/.agent-src/skills/messaging-architecture/SKILL.md +12 -2
  336. package/.agent-src/skills/migration-architect/SKILL.md +12 -0
  337. package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +12 -0
  338. package/.agent-src/skills/module-management/SKILL.md +12 -0
  339. package/.agent-src/skills/motion-choreographer/SKILL.md +16 -4
  340. package/.agent-src/skills/multi-tenancy/SKILL.md +14 -2
  341. package/.agent-src/skills/nextjs-patterns/SKILL.md +12 -0
  342. package/.agent-src/skills/okr-tree-modeling/SKILL.md +12 -2
  343. package/.agent-src/skills/onboarding-design/SKILL.md +12 -0
  344. package/.agent-src/skills/onboarding-program/SKILL.md +12 -0
  345. package/.agent-src/skills/one-on-one-cadence/SKILL.md +12 -0
  346. package/.agent-src/skills/openapi/SKILL.md +13 -1
  347. package/.agent-src/skills/org-design/SKILL.md +12 -0
  348. package/.agent-src/skills/override-management/SKILL.md +12 -0
  349. package/.agent-src/skills/perf-feedback-craft/SKILL.md +12 -0
  350. package/.agent-src/skills/performance/SKILL.md +12 -0
  351. package/.agent-src/skills/performance-analysis/SKILL.md +12 -0
  352. package/.agent-src/skills/persona-writing/SKILL.md +12 -0
  353. package/.agent-src/skills/pest-testing/SKILL.md +12 -0
  354. package/.agent-src/skills/php-coder/SKILL.md +12 -0
  355. package/.agent-src/skills/php-debugging/SKILL.md +12 -0
  356. package/.agent-src/skills/php-service/SKILL.md +12 -0
  357. package/.agent-src/skills/pipeline-strategy/SKILL.md +12 -2
  358. package/.agent-src/skills/pixar-storyteller/SKILL.md +17 -5
  359. package/.agent-src/skills/playwright-architect/SKILL.md +12 -2
  360. package/.agent-src/skills/playwright-testing/SKILL.md +12 -0
  361. package/.agent-src/skills/po-discovery/SKILL.md +12 -0
  362. package/.agent-src/skills/positioning-strategy/SKILL.md +12 -0
  363. package/.agent-src/skills/privacy-review/SKILL.md +12 -2
  364. package/.agent-src/skills/project-analysis-core/SKILL.md +12 -0
  365. package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +12 -0
  366. package/.agent-src/skills/project-analysis-laravel/SKILL.md +12 -0
  367. package/.agent-src/skills/project-analysis-nextjs/SKILL.md +12 -0
  368. package/.agent-src/skills/project-analysis-node-express/SKILL.md +12 -0
  369. package/.agent-src/skills/project-analysis-react/SKILL.md +12 -0
  370. package/.agent-src/skills/project-analysis-symfony/SKILL.md +12 -0
  371. package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +12 -0
  372. package/.agent-src/skills/project-analyzer/SKILL.md +30 -18
  373. package/.agent-src/skills/project-docs/SKILL.md +25 -13
  374. package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +13 -1
  375. package/.agent-src/skills/prompt-optimizer/SKILL.md +13 -1
  376. package/.agent-src/skills/quality-tools/SKILL.md +12 -2
  377. package/.agent-src/skills/react-native-setup/SKILL.md +12 -0
  378. package/.agent-src/skills/react-shadcn-ui/SKILL.md +12 -0
  379. package/.agent-src/skills/readme-reviewer/SKILL.md +64 -3
  380. package/.agent-src/skills/readme-writing/SKILL.md +64 -4
  381. package/.agent-src/skills/readme-writing-package/SKILL.md +60 -5
  382. package/.agent-src/skills/receiving-code-review/SKILL.md +12 -0
  383. package/.agent-src/skills/refine-prompt/SKILL.md +13 -1
  384. package/.agent-src/skills/refine-ticket/SKILL.md +14 -2
  385. package/.agent-src/skills/refine-ticket/detection-map.yml +2 -2
  386. package/.agent-src/skills/release-comms/SKILL.md +12 -2
  387. package/.agent-src/skills/repomix-packer/SKILL.md +13 -1
  388. package/.agent-src/skills/requesting-code-review/SKILL.md +12 -0
  389. package/.agent-src/skills/retention-loops/SKILL.md +12 -0
  390. package/.agent-src/skills/review-routing/SKILL.md +12 -0
  391. package/.agent-src/skills/rice-prioritization/SKILL.md +12 -0
  392. package/.agent-src/skills/risk-officer/SKILL.md +12 -0
  393. package/.agent-src/skills/roadmap-management/SKILL.md +12 -0
  394. package/.agent-src/skills/roadmap-writing/SKILL.md +12 -0
  395. package/.agent-src/skills/rtk-output-filtering/SKILL.md +12 -0
  396. package/.agent-src/skills/rule-refactor/SKILL.md +15 -3
  397. package/.agent-src/skills/rule-writing/SKILL.md +13 -1
  398. package/.agent-src/skills/runway-cognition/SKILL.md +12 -2
  399. package/.agent-src/skills/scenario-modeling/SKILL.md +12 -2
  400. package/.agent-src/skills/scene-expander/SKILL.md +18 -6
  401. package/.agent-src/skills/script-writing/SKILL.md +13 -1
  402. package/.agent-src/skills/secrets-management/SKILL.md +13 -3
  403. package/.agent-src/skills/security/SKILL.md +12 -0
  404. package/.agent-src/skills/security-audit/SKILL.md +12 -0
  405. package/.agent-src/skills/sentry-integration/SKILL.md +12 -0
  406. package/.agent-src/skills/sequential-thinking/SKILL.md +12 -0
  407. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +12 -0
  408. package/.agent-src/skills/skill-management/SKILL.md +12 -0
  409. package/.agent-src/skills/skill-reviewer/SKILL.md +12 -0
  410. package/.agent-src/skills/skill-writing/SKILL.md +12 -0
  411. package/.agent-src/skills/sql-writing/SKILL.md +12 -0
  412. package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +12 -0
  413. package/.agent-src/skills/subagent-orchestration/SKILL.md +13 -1
  414. package/.agent-src/skills/symfony-workflow/SKILL.md +12 -0
  415. package/.agent-src/skills/systematic-debugging/SKILL.md +53 -0
  416. package/.agent-src/skills/tailwind-engineer/SKILL.md +12 -0
  417. package/.agent-src/skills/tech-debt-tracker/SKILL.md +12 -2
  418. package/.agent-src/skills/technical-specification/SKILL.md +12 -0
  419. package/.agent-src/skills/terraform/SKILL.md +12 -0
  420. package/.agent-src/skills/terragrunt/SKILL.md +12 -0
  421. package/.agent-src/skills/test-driven-development/SKILL.md +12 -0
  422. package/.agent-src/skills/test-performance/SKILL.md +13 -1
  423. package/.agent-src/skills/testing-anti-patterns/SKILL.md +13 -1
  424. package/.agent-src/skills/threat-modeling/SKILL.md +12 -0
  425. package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +12 -0
  426. package/.agent-src/skills/token-optimizer/SKILL.md +12 -0
  427. package/.agent-src/skills/traefik/SKILL.md +12 -0
  428. package/.agent-src/skills/ui-component-architect/SKILL.md +12 -0
  429. package/.agent-src/skills/unit-economics-modeling/SKILL.md +12 -2
  430. package/.agent-src/skills/universal-project-analysis/SKILL.md +12 -0
  431. package/.agent-src/skills/upstream-contribute/SKILL.md +12 -0
  432. package/.agent-src/skills/using-git-worktrees/SKILL.md +12 -0
  433. package/.agent-src/skills/validate-feature-fit/SKILL.md +12 -0
  434. package/.agent-src/skills/verify-completion-evidence/SKILL.md +12 -0
  435. package/.agent-src/skills/video-director/SKILL.md +18 -6
  436. package/.agent-src/skills/vision-articulation/SKILL.md +12 -0
  437. package/.agent-src/skills/voc-extract/SKILL.md +12 -2
  438. package/.agent-src/skills/voice-and-tone-design/SKILL.md +12 -2
  439. package/.agent-src/templates/agent-settings.md +5 -5
  440. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  441. package/.agent-src/templates/agents/memory/ownership.example.yml +1 -1
  442. package/.agent-src/templates/agents/proposal.example.md +12 -0
  443. package/.agent-src/templates/command.md +1 -1
  444. package/.agent-src/templates/contexts/auth-model.md +2 -2
  445. package/.agent-src/templates/contexts/data-sensitivity.md +3 -3
  446. package/.agent-src/templates/contexts/deployment-order.md +2 -2
  447. package/.agent-src/templates/contexts/observability.md +3 -3
  448. package/.agent-src/templates/contexts/tenant-boundaries.md +3 -3
  449. package/.agent-src/templates/contexts.md +1 -1
  450. package/.agent-src/templates/hooks/pre-commit-frontmatter +66 -0
  451. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +78 -39
  452. package/.agent-src/templates/rule.md +1 -1
  453. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +7 -4
  454. package/.agent-src/templates/scripts/work_engine/cli.py +6 -6
  455. package/.agent-src/templates/scripts/work_engine/emitters.py +29 -4
  456. package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +3 -3
  457. package/.agent-src/templates/scripts/work_engine/orchestration.py +25 -11
  458. package/.agent-src/templates/scripts/work_engine/state.py +53 -0
  459. package/.agent-src/templates/skill-archive-note.md +4 -4
  460. package/.claude-plugin/marketplace.json +2 -2
  461. package/AGENTS.md +12 -9
  462. package/CHANGELOG.md +268 -90
  463. package/CONTRIBUTING.md +61 -0
  464. package/README.md +173 -558
  465. package/config/agent-settings.template.yml +11 -8
  466. package/config/discovery/packs.yml +162 -0
  467. package/config/discovery/unassigned-artefacts.yml +68 -0
  468. package/config/discovery/workspaces.yml +59 -0
  469. package/config/gitignore-block.txt +36 -23
  470. package/dist/cli/agent-config.js +199 -0
  471. package/dist/cli/agent-config.js.map +1 -0
  472. package/dist/cli/bash/runBash.js +40 -0
  473. package/dist/cli/bash/runBash.js.map +1 -0
  474. package/dist/cli/commands/doctorShell.js +91 -0
  475. package/dist/cli/commands/doctorShell.js.map +1 -0
  476. package/dist/cli/commands/packs.js +59 -0
  477. package/dist/cli/commands/packs.js.map +1 -0
  478. package/dist/cli/commands/settings.js +35 -0
  479. package/dist/cli/commands/settings.js.map +1 -0
  480. package/dist/cli/commands/uiServe.js +119 -0
  481. package/dist/cli/commands/uiServe.js.map +1 -0
  482. package/dist/cli/commands/versions.js +64 -0
  483. package/dist/cli/commands/versions.js.map +1 -0
  484. package/dist/cli/commands/workspaces.js +58 -0
  485. package/dist/cli/commands/workspaces.js.map +1 -0
  486. package/dist/cli/discovery/loadManifest.js +62 -0
  487. package/dist/cli/discovery/loadManifest.js.map +1 -0
  488. package/dist/cli/log/logger.js +41 -0
  489. package/dist/cli/log/logger.js.map +1 -0
  490. package/dist/cli/paths.js +60 -0
  491. package/dist/cli/paths.js.map +1 -0
  492. package/dist/cli/python/resolvePython.js +38 -0
  493. package/dist/cli/python/resolvePython.js.map +1 -0
  494. package/dist/cli/registry.js +77 -0
  495. package/dist/cli/registry.js.map +1 -0
  496. package/dist/discovery/deprecation-report.md +7 -0
  497. package/dist/discovery/discovery-manifest.json +9893 -0
  498. package/dist/discovery/discovery-manifest.json.sha256 +1 -0
  499. package/dist/discovery/discovery-manifest.summary.md +93 -0
  500. package/dist/discovery/orphan-report.md +10 -0
  501. package/dist/discovery/packs.json +1002 -0
  502. package/dist/discovery/trust-report.md +26 -0
  503. package/dist/discovery/workspaces.json +705 -0
  504. package/dist/mcp/awesome-mcp-servers.row.md +1 -0
  505. package/dist/mcp/mcp-cloudflare-catalogue.json +27 -0
  506. package/dist/mcp/registry-manifest.json +63 -0
  507. package/dist/router.json +1623 -0
  508. package/dist/server/app.js +125 -0
  509. package/dist/server/app.js.map +1 -0
  510. package/dist/server/io/atomicMultiWrite.js +204 -0
  511. package/dist/server/io/atomicMultiWrite.js.map +1 -0
  512. package/dist/server/io/atomicWrite.js +79 -0
  513. package/dist/server/io/atomicWrite.js.map +1 -0
  514. package/dist/server/io/substituteTemplate.js +87 -0
  515. package/dist/server/io/substituteTemplate.js.map +1 -0
  516. package/dist/server/io/yamlIO.js +162 -0
  517. package/dist/server/io/yamlIO.js.map +1 -0
  518. package/dist/server/port.js +97 -0
  519. package/dist/server/port.js.map +1 -0
  520. package/dist/server/routes/discovery.js +72 -0
  521. package/dist/server/routes/discovery.js.map +1 -0
  522. package/dist/server/routes/ping.js +57 -0
  523. package/dist/server/routes/ping.js.map +1 -0
  524. package/dist/server/routes/schema.js +41 -0
  525. package/dist/server/routes/schema.js.map +1 -0
  526. package/dist/server/routes/settings.js +236 -0
  527. package/dist/server/routes/settings.js.map +1 -0
  528. package/dist/server/routes/userMd.js +127 -0
  529. package/dist/server/routes/userMd.js.map +1 -0
  530. package/dist/server/routes/wizard.js +374 -0
  531. package/dist/server/routes/wizard.js.map +1 -0
  532. package/dist/server/schemas/settings.js +137 -0
  533. package/dist/server/schemas/settings.js.map +1 -0
  534. package/dist/server/token.js +75 -0
  535. package/dist/server/token.js.map +1 -0
  536. package/dist/server/writeRoot.js +84 -0
  537. package/dist/server/writeRoot.js.map +1 -0
  538. package/dist/server/writeRoot.test.js +91 -0
  539. package/dist/server/writeRoot.test.js.map +1 -0
  540. package/dist/shared/userMd/formAdapter.js +83 -0
  541. package/dist/shared/userMd/formAdapter.js.map +1 -0
  542. package/dist/shared/userMd/schema.js +46 -0
  543. package/dist/shared/userMd/schema.js.map +1 -0
  544. package/dist/shared/userMd/utils.js +88 -0
  545. package/dist/shared/userMd/utils.js.map +1 -0
  546. package/dist/ui/assets/index-D-DY1ywI.js +35 -0
  547. package/dist/ui/assets/index-D-DY1ywI.js.map +1 -0
  548. package/dist/ui/assets/index-Dqfhmg-d.css +1 -0
  549. package/dist/ui/index.html +14 -0
  550. package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
  551. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  552. package/docs/adrs/router/0001-three-tier-routing.md +5 -5
  553. package/docs/adrs/schema/0001-json-schema-frontmatter.md +4 -4
  554. package/docs/adrs/schema/README.md +1 -1
  555. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +3 -3
  556. package/docs/architecture/setup-vs-settings-shared-surface.md +114 -0
  557. package/docs/architecture.md +3 -2
  558. package/docs/archive/CHANGELOG-pre-2.2.0.md +7 -7
  559. package/docs/archive/CHANGELOG-pre-3.0.0.md +130 -0
  560. package/docs/archive/CHANGELOG-pre-3.1.0.md +167 -0
  561. package/docs/catalog.md +92 -100
  562. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  563. package/docs/contracts/STABILITY.md +1 -1
  564. package/docs/contracts/adr-architectural-consensus-mechanism.md +5 -5
  565. package/docs/contracts/adr-chat-history-split.md +1 -1
  566. package/docs/contracts/adr-implement-ticket-runtime.md +1 -1
  567. package/docs/contracts/adr-install-user-type-axis.md +1 -1
  568. package/docs/contracts/adr-mcp-runtime.md +2 -2
  569. package/docs/contracts/agent-user-schema.md +17 -11
  570. package/docs/contracts/ai-council-config.md +13 -13
  571. package/docs/contracts/audit-log-v1.md +2 -2
  572. package/docs/contracts/command-clusters.md +2 -2
  573. package/docs/contracts/compression-default-kill-criterion.md +3 -3
  574. package/docs/contracts/consumer-bridge.md +79 -0
  575. package/docs/contracts/decision-trace-v1.md +5 -5
  576. package/docs/contracts/discovery-manifest.md +209 -0
  577. package/docs/contracts/discovery-manifest.schema.json +219 -0
  578. package/docs/contracts/explain-trace.schema.json +144 -0
  579. package/docs/contracts/file-ownership-matrix.json +288 -328
  580. package/docs/contracts/file-ownership-matrix.md +1 -1
  581. package/docs/contracts/frontmatter-contract.md +140 -0
  582. package/docs/contracts/ghostwriter-schema.md +3 -3
  583. package/docs/contracts/gui-wizard.md +223 -0
  584. package/docs/contracts/hook-architecture-v1.md +10 -10
  585. package/docs/contracts/installer-agent-mode.md +137 -0
  586. package/docs/contracts/kernel-membership.md +5 -5
  587. package/docs/contracts/linter-structural-model.md +3 -3
  588. package/docs/contracts/load-context-schema.md +5 -5
  589. package/docs/contracts/local-server-api.md +134 -0
  590. package/docs/contracts/low-impact-corpus-format.md +1 -1
  591. package/docs/contracts/mcp-cloud-scope.md +2 -2
  592. package/docs/contracts/mcp-discovery-phase-notice.md +1 -1
  593. package/docs/contracts/mcp-phase-1-scope.md +5 -4
  594. package/docs/contracts/mcp-registry-manifest.schema.json +129 -0
  595. package/docs/contracts/mcp-tool-inventory.md +9 -9
  596. package/docs/contracts/mcp-tool-stub-envelope.md +1 -1
  597. package/docs/contracts/memory-visibility-v1.md +2 -2
  598. package/docs/contracts/multi-tool-projection-fidelity.md +3 -3
  599. package/docs/contracts/namespace.md +7 -7
  600. package/docs/contracts/one-off-script-lifecycle.md +1 -1
  601. package/docs/contracts/package-self-orientation.md +1 -1
  602. package/docs/contracts/provider-lifecycle.md +7 -7
  603. package/docs/contracts/router-blending.md +1 -1
  604. package/docs/contracts/rule-classification.md +2 -2
  605. package/docs/contracts/rule-router.md +4 -4
  606. package/docs/contracts/settings-api.md +207 -0
  607. package/docs/contracts/settings-gui-agent-mode.schema.json +128 -0
  608. package/docs/contracts/smoke-contracts.md +3 -3
  609. package/docs/contracts/tier-3-contrib-plugin.md +1 -1
  610. package/docs/contracts/trust-and-safety.md +144 -0
  611. package/docs/contracts/universal-skills.md +1 -1
  612. package/docs/contracts/write-engine.md +1 -1
  613. package/docs/customization.md +139 -13
  614. package/docs/decisions/ADR-001-kernel-swap-deferred.md +1 -1
  615. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +1 -1
  616. package/docs/decisions/ADR-004-rule-governance-pruning.md +8 -8
  617. package/docs/decisions/ADR-006-skill-tools-python-pilot.md +5 -5
  618. package/docs/decisions/ADR-007-agent-discovery-scopes.md +16 -4
  619. package/docs/decisions/ADR-008-installed-tools-manifest.md +2 -2
  620. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +2 -2
  621. package/docs/decisions/ADR-011-domain-pack-readiness.md +4 -4
  622. package/docs/decisions/ADR-012-typescript-cli-shell.md +162 -0
  623. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +234 -0
  624. package/docs/decisions/ADR-014-gui-framework-choice.md +136 -0
  625. package/docs/decisions/ADR-015-discovery-manifest-contract.md +146 -0
  626. package/docs/decisions/ADR-016-installer-architecture.md +189 -0
  627. package/docs/decisions/ADR-017-monorepo-physical-layout.md +261 -0
  628. package/docs/decisions/ADR-018-trust-and-safety-layer.md +159 -0
  629. package/docs/decisions/ADR-019-router-json-dist-location.md +124 -0
  630. package/docs/decisions/ADR-020-global-only-consumer-scope.md +123 -0
  631. package/docs/decisions/ADR-021-deployment-shape.md +153 -0
  632. package/docs/decisions/ADR-rule-kernel-and-router.md +2 -2
  633. package/docs/decisions/INDEX.md +10 -0
  634. package/docs/deploy/connector-setup.md +129 -0
  635. package/docs/deploy/env-vars.md +70 -0
  636. package/docs/deploy/policy-cookbook.md +130 -0
  637. package/docs/deploy/quickstart.md +112 -0
  638. package/docs/distribution/mcp-submission-checklist.md +95 -0
  639. package/docs/distribution/public-install-smoke.md +68 -0
  640. package/docs/distribution/registries.md +55 -0
  641. package/docs/distribution/telemetry-privacy.md +128 -0
  642. package/docs/distribution/telemetry-schema.md +174 -0
  643. package/docs/distribution/topics-equivalents-decay-policy.md +51 -0
  644. package/docs/examples/agent-user.example.md +3 -1
  645. package/docs/featured-skills.md +95 -0
  646. package/docs/getting-started-by-role.md +19 -1
  647. package/docs/getting-started.md +5 -4
  648. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
  649. package/docs/guidelines/agent-infra/installed-tools-manifest.md +11 -8
  650. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +10 -1
  651. package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
  652. package/docs/guidelines/agent-infra/tool-integration.md +1 -1
  653. package/docs/guidelines/docs/readme-size-and-splitting.md +53 -1
  654. package/docs/guidelines/php/api-design.md +1 -1
  655. package/docs/guidelines/prompt-templates.md +2 -2
  656. package/docs/hook-payload-capture.md +3 -3
  657. package/docs/installation.md +39 -18
  658. package/docs/maintainers/dev-mode.md +105 -0
  659. package/docs/migrations/commands-1.15.0.md +3 -3
  660. package/docs/parity/bench-ruflo.json +1 -1
  661. package/docs/parity/ruflo.md +3 -3
  662. package/docs/profiles.md +1 -1
  663. package/docs/quality.md +2 -2
  664. package/docs/recruits/_template.md +3 -3
  665. package/docs/setup/enterprise-and-offline.md +3 -3
  666. package/docs/setup/mcp-server-docker.md +5 -3
  667. package/docs/setup/per-ide/claude-desktop.md +3 -2
  668. package/docs/skills-catalog.md +62 -18
  669. package/docs/wizard.md +156 -0
  670. package/llms.txt +61 -17
  671. package/package.json +63 -3
  672. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  673. package/scripts/_archive/README.md +2 -2
  674. package/scripts/_archive/_p4_migrate.py +1 -1
  675. package/scripts/_cli/cmd_doctor.py +155 -7
  676. package/scripts/_cli/cmd_explain.py +108 -3
  677. package/scripts/_cli/cmd_migrate.py +2 -2
  678. package/scripts/_cli/cmd_migrate_to_global.py +415 -0
  679. package/scripts/_cli/cmd_settings_migrate.py +146 -0
  680. package/scripts/_cli/explain_last/__init__.py +122 -0
  681. package/scripts/_cli/explain_last/assumptions.py +59 -0
  682. package/scripts/_cli/explain_last/council.py +105 -0
  683. package/scripts/_cli/explain_last/halt.py +44 -0
  684. package/scripts/_cli/explain_last/inputs.py +125 -0
  685. package/scripts/_cli/explain_last/memory.py +94 -0
  686. package/scripts/_cli/explain_last/provider.py +52 -0
  687. package/scripts/_cli/explain_last/render.py +52 -0
  688. package/scripts/_cli/explain_last/route.py +59 -0
  689. package/scripts/_cli/explain_last/scrubber.py +105 -0
  690. package/scripts/_cli/explain_last/sections/__init__.py +35 -0
  691. package/scripts/_cli/explain_last/sections/assumptions.py +21 -0
  692. package/scripts/_cli/explain_last/sections/council.py +27 -0
  693. package/scripts/_cli/explain_last/sections/halt.py +31 -0
  694. package/scripts/_cli/explain_last/sections/header.py +24 -0
  695. package/scripts/_cli/explain_last/sections/inputs.py +27 -0
  696. package/scripts/_cli/explain_last/sections/memory.py +21 -0
  697. package/scripts/_cli/explain_last/sections/pack.py +16 -0
  698. package/scripts/_cli/explain_last/sections/provider.py +26 -0
  699. package/scripts/_cli/explain_last/sections/route.py +22 -0
  700. package/scripts/_cli/explain_last/state_loader.py +76 -0
  701. package/scripts/_dispatch.bash +987 -0
  702. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  704. package/scripts/_lib/agent_settings.py +7 -4
  705. package/scripts/_lib/agent_src.py +157 -0
  706. package/scripts/_lib/agents_overlay.py +3 -3
  707. package/scripts/_phase4_bucket.py +210 -0
  708. package/scripts/agent-config +50 -947
  709. package/scripts/ai-video/adapters/higgsfield.sh +1 -1
  710. package/scripts/ai-video/adapters/sora.sh +1 -1
  711. package/scripts/ai-video/test-pipeline.sh +2 -2
  712. package/scripts/ai_council/_default_prices.py +5 -5
  713. package/scripts/ai_council/advisors.py +1 -1
  714. package/scripts/ai_council/clients.py +2 -2
  715. package/scripts/ai_council/compile_corpus.py +9 -8
  716. package/scripts/ai_council/config.py +3 -3
  717. package/scripts/ai_council/events_log.py +8 -4
  718. package/scripts/ai_council/low_impact_corpus.py +1 -1
  719. package/scripts/ai_council/low_impact_intake.py +1 -1
  720. package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +2 -2
  721. package/scripts/ai_council/one_off_archive/2026-05/_one_off_structural_optimization.py +1 -1
  722. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +3 -3
  723. package/scripts/ai_council/pricing.py +8 -7
  724. package/scripts/ai_council/probation_gate.py +1 -1
  725. package/scripts/ai_council/redact_low_impact_entry.py +1 -1
  726. package/scripts/ai_council/session.py +13 -13
  727. package/scripts/ai_council/shadow_dispatch.py +2 -2
  728. package/scripts/annotate_discovery.py +149 -0
  729. package/scripts/audit_adr_coverage.py +1 -1
  730. package/scripts/audit_auto_rules.py +2 -2
  731. package/scripts/audit_cloud_compatibility.py +1 -1
  732. package/scripts/audit_command_surface.py +2 -2
  733. package/scripts/audit_likelihood.py +4 -4
  734. package/scripts/audit_overlap.py +3 -3
  735. package/scripts/audit_skill_descriptions.py +18 -6
  736. package/scripts/audit_user_type_axis.py +1 -1
  737. package/scripts/build_discovery_manifest.py +658 -0
  738. package/scripts/build_mcp_registry_manifest.py +181 -0
  739. package/scripts/build_rule_trigger_matrix.py +2 -2
  740. package/scripts/capture_showcase_session.py +1 -1
  741. package/scripts/chat_history.py +5 -5
  742. package/scripts/check_always_budget.py +7 -2
  743. package/scripts/check_artefact_checksums.py +104 -0
  744. package/scripts/check_cluster_patterns.py +20 -4
  745. package/scripts/check_command_count_messaging.py +33 -14
  746. package/scripts/check_council_layout.py +26 -20
  747. package/scripts/check_council_references.py +53 -14
  748. package/scripts/check_discovery_determinism.py +70 -0
  749. package/scripts/check_kernel_rule_bundle.py +2 -2
  750. package/scripts/check_no_roadmap_refs.py +2 -2
  751. package/scripts/check_one_off_location.py +1 -1
  752. package/scripts/check_overlay_cascade_subdirs.py +7 -3
  753. package/scripts/check_public_links.py +2 -2
  754. package/scripts/check_references.py +19 -23
  755. package/scripts/check_release_includes_discovery.py +61 -0
  756. package/scripts/check_reply_consistency.py +32 -9
  757. package/scripts/check_template_pin_drift.py +24 -7
  758. package/scripts/check_token_optimizer_freshness.py +18 -3
  759. package/scripts/ci_summary.py +2 -2
  760. package/scripts/ci_time_ratio.py +1 -1
  761. package/scripts/command_suggester/__init__.py +1 -1
  762. package/scripts/compile_router.py +34 -2
  763. package/scripts/compress.py +162 -44
  764. package/scripts/config/presets.py +19 -1
  765. package/scripts/config/profiles.py +16 -1
  766. package/scripts/context_hygiene_hook.py +2 -2
  767. package/scripts/council_cli.py +22 -22
  768. package/scripts/council_prune.py +3 -3
  769. package/scripts/discovery_stats.py +70 -0
  770. package/scripts/expected_perms.json +47 -0
  771. package/scripts/extract_audit_patterns.py +2 -2
  772. package/scripts/gen_discovery_baseline.py +127 -0
  773. package/scripts/generate_index.py +78 -46
  774. package/scripts/generate_ownership_matrix.py +99 -44
  775. package/scripts/generate_pack_manifests.py +183 -0
  776. package/scripts/hook_manifest.yaml +5 -5
  777. package/scripts/hooks/cline-dispatcher.sh +1 -1
  778. package/scripts/hooks/cowork-dispatcher.sh +1 -1
  779. package/scripts/hooks/dispatch_hook.py +3 -3
  780. package/scripts/hooks/gemini-dispatcher.sh +1 -1
  781. package/scripts/hooks/replay_hook.py +1 -1
  782. package/scripts/hooks/state_io.py +5 -5
  783. package/scripts/hooks_doctor.py +4 -4
  784. package/scripts/install +18 -1
  785. package/scripts/install-hooks.sh +2 -2
  786. package/scripts/install.py +937 -62
  787. package/scripts/install.sh +147 -27
  788. package/scripts/inventory_frontmatter.py +1 -1
  789. package/scripts/lint_agents_layout.py +183 -0
  790. package/scripts/lint_agents_md.py +1 -1
  791. package/scripts/lint_archived_skills.py +35 -19
  792. package/scripts/lint_artefact_frontmatter.py +180 -0
  793. package/scripts/lint_bench_corpus.py +14 -2
  794. package/scripts/lint_command_tiers.py +15 -2
  795. package/scripts/lint_discovery_manifest.py +136 -0
  796. package/scripts/lint_discovery_vocabulary.py +148 -0
  797. package/scripts/lint_explain_trace.py +80 -0
  798. package/scripts/lint_featured_skills.py +139 -0
  799. package/scripts/lint_framework_leakage.py +33 -6
  800. package/scripts/lint_framework_leakage_allowlist.json +63 -62
  801. package/scripts/lint_ghostwriter_source.py +1 -1
  802. package/scripts/lint_global_paths.py +147 -0
  803. package/scripts/lint_load_context.py +3 -3
  804. package/scripts/lint_mcp_registry_manifest.py +69 -0
  805. package/scripts/lint_media_policy_linkage.py +6 -6
  806. package/scripts/lint_orchestration_dsl.py +6 -3
  807. package/scripts/lint_pack_boundaries.py +147 -0
  808. package/scripts/lint_pack_first_win.py +103 -0
  809. package/scripts/lint_positioning.py +143 -0
  810. package/scripts/lint_readme_jargon.py +131 -0
  811. package/scripts/lint_readme_size.py +33 -0
  812. package/scripts/lint_rule_interactions.py +23 -5
  813. package/scripts/lint_rule_tiers.py +14 -5
  814. package/scripts/lint_skill_tools.py +1 -1
  815. package/scripts/lint_topics_yaml.py +89 -0
  816. package/scripts/lint_trust_coherence.py +212 -0
  817. package/scripts/mcp_server/consumer_tool_catalog.json +3 -3
  818. package/scripts/mcp_server/telemetry.py +2 -2
  819. package/scripts/mcp_server/tools.py +27 -11
  820. package/scripts/mcp_telemetry_health.py +2 -2
  821. package/scripts/mcp_telemetry_store.py +1 -1
  822. package/scripts/measure_augment_budget.py +3 -3
  823. package/scripts/measure_density.py +2 -2
  824. package/scripts/measure_frugality_savings.py +3 -3
  825. package/scripts/measure_roadmap_trajectory.py +1 -1
  826. package/scripts/measure_rule_budget.py +25 -7
  827. package/scripts/memory_report.py +1 -1
  828. package/scripts/migrate_command_suggestions.py +3 -3
  829. package/scripts/minimal_safe_diff_hook.py +1 -1
  830. package/scripts/move_artefact.py +143 -0
  831. package/scripts/new_skill.py +148 -0
  832. package/scripts/onboarding_gate_hook.py +4 -4
  833. package/scripts/plan_physical_move.py +353 -0
  834. package/scripts/prepack-check.mjs +62 -0
  835. package/scripts/probe_projection_fidelity.py +2 -2
  836. package/scripts/refine_ticket_detect.py +31 -8
  837. package/scripts/schemas/command.schema.json +45 -1
  838. package/scripts/schemas/persona.schema.json +1 -1
  839. package/scripts/schemas/rule.schema.json +44 -4
  840. package/scripts/schemas/skill.schema.json +41 -1
  841. package/scripts/score_skill_selection.py +1 -1
  842. package/scripts/skill_collision_clusters.py +1 -1
  843. package/scripts/skill_linter.py +250 -120
  844. package/scripts/skill_overlap.py +1 -1
  845. package/scripts/skill_tools/run_block_d_eval.py +1 -1
  846. package/scripts/skill_trigger_eval.py +28 -8
  847. package/scripts/skill_usage_collect.py +3 -3
  848. package/scripts/skill_usage_report.py +3 -3
  849. package/scripts/smoke/kernel.sh +1 -1
  850. package/scripts/smoke/router.sh +24 -5
  851. package/scripts/smoke/skills.sh +15 -7
  852. package/scripts/smoke_quickstart.py +12 -3
  853. package/scripts/snapshot_agent_outputs.py +144 -0
  854. package/scripts/spotcheck_thin_root.py +1 -1
  855. package/scripts/sync_github_metadata.py +147 -0
  856. package/scripts/sync_gitignore.py +15 -5
  857. package/scripts/update_counts.py +45 -17
  858. package/scripts/update_prices.py +4 -3
  859. package/scripts/validate_decision_engine.py +9 -1
  860. package/scripts/validate_discovery_manifest.py +94 -0
  861. package/scripts/validate_frontmatter.py +39 -20
  862. package/scripts/verify_before_complete_hook.py +1 -1
  863. package/scripts/verify_physical_move.py +185 -0
  864. package/scripts/verify_roadmap_closure.py +1 -1
  865. package/templates/agent-user.md +34 -0
  866. package/templates/agent-user.yml +21 -0
  867. package/templates/minimal/agents-overrides-readme.md +46 -0
  868. package/templates/minimal/overrides-gitkeep +2 -0
  869. package/.agent-src/commands/onboard.md +0 -467
  870. package/templates/minimal/agents-gitkeep +0 -2
@@ -34,6 +34,9 @@ import shlex
34
34
  import shutil
35
35
  import subprocess
36
36
  import sys
37
+ import threading
38
+ import time
39
+ from datetime import datetime, timezone
37
40
  from pathlib import Path
38
41
  from typing import Any, Optional
39
42
 
@@ -1009,7 +1012,7 @@ def ensure_augment_user_hooks(package_root: Path, force: bool) -> list[dict[str,
1009
1012
  # scripts/hook_manifest.yaml to resolve which concerns fire on each
1010
1013
  # (platform, event) tuple. Mirrors AUGMENT_DISPATCHER_BINDINGS so each
1011
1014
  # concern fires on the same logical surface across platforms — the
1012
- # contract from agents/contexts/hardening-pattern.md § Cross-platform
1015
+ # contract from agents/settings/contexts/hardening-pattern.md § Cross-platform
1013
1016
  # parity.
1014
1017
  CLAUDE_DISPATCHER_BINDINGS = (
1015
1018
  ("session_start", "SessionStart"),
@@ -1074,7 +1077,7 @@ def ensure_claude_bridge(project_root: Path, force: bool) -> list[dict[str, Any]
1074
1077
  # Native event names per https://cursor.com/docs/reference/third-party-hooks
1075
1078
  # (camelCase). UserPromptSubmit lives at `beforeSubmitPrompt`. Stop is
1076
1079
  # IDE-only — CLI-only Cursor users get the rule-only checkpoint
1077
- # fallback per agents/contexts/chat-history-platform-hooks.md.
1080
+ # fallback per agents/settings/contexts/chat-history-platform-hooks.md.
1078
1081
  CURSOR_DISPATCHER_BINDINGS = (
1079
1082
  ("session_start", "sessionStart"),
1080
1083
  ("session_end", "sessionEnd"),
@@ -1335,7 +1338,7 @@ def ensure_windsurf_bridge(project_root: Path, force: bool) -> list[dict[str, An
1335
1338
  scope. Idempotent via deep_merge — rerunning replaces hook arrays
1336
1339
  rather than appending duplicates. `show_output: false` keeps post
1337
1340
  hooks silent (per Windsurf docs); concerns stream their own output
1338
- via agents/state/.dispatcher/.
1341
+ via agents/runtime/state/.dispatcher/.
1339
1342
  """
1340
1343
  hooks: dict[str, list] = {}
1341
1344
  for ac_event, native in WINDSURF_DISPATCHER_BINDINGS:
@@ -1602,7 +1605,8 @@ def ensure_roocode_bridge(project_root: Path, force: bool) -> None:
1602
1605
  # `~/Library/Application Support/Claude/` on macOS — no project-local
1603
1606
  # discovery. The project bridge is informational only: a marker file that
1604
1607
  # documents the link and tells humans where the canonical rules live.
1605
- # Phase 2.3 will formalize this as scope=global-only via SCOPE_SUPPORT.
1608
+ # Formalized as scope=global-only via SCOPE_SUPPORT (Phase 3.1 of
1609
+ # road-to-global-only-install — consumer installs are global-only).
1606
1610
  CLAUDE_DESKTOP_MARKER = """# Agent Config bridge — Claude Desktop
1607
1611
 
1608
1612
  This file marks the project as an `event4u/agent-config` consumer.
@@ -2052,26 +2056,36 @@ USER_SCOPE_PATHS = {
2052
2056
  }
2053
2057
 
2054
2058
 
2055
- # Per-tool scope support per ADR-007 matrix + Tier-1/2 verification.
2056
- # Values: "both" · "project" · "global". Used by _validate_scope() to
2057
- # reject explicit `--tools=X` selections that conflict with the chosen
2058
- # scope (project default or `--global`). `--tools=all` silently filters
2059
- # incompatible IDs so the default install path stays backward-compatible.
2059
+ # Per-tool scope support per ADR-007 matrix + ADR-020 consumer global-only
2060
+ # amendment. Values: "both" · "project" · "global". Used by _validate_scope()
2061
+ # to reject explicit `--tools=X` selections that conflict with the chosen
2062
+ # scope. `--tools=all` silently filters incompatible IDs so the default
2063
+ # install path stays backward-compatible.
2060
2064
  #
2061
- # Rationale:
2062
- # - claude-desktop has no project discovery (informational marker only
2063
- # in project trees); --project rejects it explicitly.
2064
- # - jetbrains avoids mutating team-shared .idea/; --project marker is
2065
- # informational only; canonical scope is global.
2066
- # - roocode / kilocode auto-discover `.roo/rules/` and `.kilocode/rules/`
2067
- # per project; no user-scope discovery convention; --global rejects.
2065
+ # road-to-global-only-install § Phase 3.1 — consumer installs are
2066
+ # global-only. Every AI ID with a user-scope convention is pinned to
2067
+ # "global". Maintainers can still drive project-scope installs by
2068
+ # setting AGENT_CONFIG_DEV_MODE=1 `_enforce_consumer_global_only`
2069
+ # gates the scope before validation, so the SCOPE_SUPPORT matrix is the
2070
+ # canonical declaration of "where this tool is allowed to write."
2071
+ #
2072
+ # Exception:
2073
+ # - copilot is "both" because GitHub Copilot has no user-scope
2074
+ # convention for instructions — `copilot-instructions.md` lives
2075
+ # in-repo by design. Project scope still requires
2076
+ # AGENT_CONFIG_DEV_MODE=1 (consumer-floor gate); the "both" value
2077
+ # keeps the gate at the env-flag layer rather than the matrix layer.
2068
2078
  SCOPE_SUPPORT = {
2069
- "claude-code": "both",
2079
+ "claude-code": "global",
2070
2080
  "claude-desktop": "global",
2071
- "cursor": "both",
2072
- "windsurf": "both",
2073
- "cline": "both",
2074
- "gemini-cli": "both",
2081
+ "cursor": "global",
2082
+ "windsurf": "global",
2083
+ "cline": "global",
2084
+ "gemini-cli": "global",
2085
+ # GitHub Copilot ships `copilot-instructions.md` in-repo by design
2086
+ # — no user-scope convention exists. Project scope stays available
2087
+ # but is gated by AGENT_CONFIG_DEV_MODE=1 via the consumer-floor
2088
+ # check, not by the matrix.
2075
2089
  "copilot": "both",
2076
2090
  # `augment` is global-only by design: a single user-scope deploy to
2077
2091
  # `~/.augment/` is the canonical surface. The package owner accepts
@@ -2081,17 +2095,14 @@ SCOPE_SUPPORT = {
2081
2095
  # installs are rejected so the per-repo `.augment/` surface stays
2082
2096
  # out of the install matrix entirely.
2083
2097
  "augment": "global",
2084
- "aider": "both",
2085
- "codex": "both",
2086
- # Phase 2.4: roocode / kilocode lifted to "both"global deploys
2087
- # write to `~/.roo/skills/` and `~/.kilocode/skills/` matching the
2088
- # nextlevelbuilder/ui-ux-pro-max-skill anchors.
2089
- "roocode": "both",
2090
- "continue": "both",
2091
- "kilocode": "both",
2092
- "zed": "both",
2098
+ "aider": "global",
2099
+ "codex": "global",
2100
+ "roocode": "global",
2101
+ "continue": "global",
2102
+ "kilocode": "global",
2103
+ "zed": "global",
2093
2104
  "jetbrains": "global",
2094
- "kiro": "both",
2105
+ "kiro": "global",
2095
2106
  # Phase 2.4 expansion — global-only for new anchors; project bridges
2096
2107
  # are not yet implemented for these IDs.
2097
2108
  "qoder": "global",
@@ -2248,6 +2259,15 @@ To remove this marker, delete this file.
2248
2259
  #: package-owned, not Claude-owned, content.
2249
2260
  _CLAUDE_DESKTOP_BUNDLES_SUBPATH = "claude-desktop/bundles"
2250
2261
 
2262
+ #: road-to-global-only-install § Phase 2.1 — canonical global path
2263
+ #: constants. Single source of truth for the user-scope settings file
2264
+ #: locations. Used by the settings reader (Python + TypeScript via
2265
+ #: docs/contracts/settings-api.md) to merge ``defaults < global <
2266
+ #: project-overrides``.
2267
+ GLOBAL_ROOT = Path.home() / ".event4u" / "agent-config"
2268
+ GLOBAL_USER_SETTINGS_PATH = GLOBAL_ROOT / ".agent-user.yml"
2269
+ GLOBAL_AGENT_SETTINGS_PATH = GLOBAL_ROOT / ".agent-settings.yml"
2270
+
2251
2271
 
2252
2272
  def _bridge_marker(tool_id: str, scope: str) -> str:
2253
2273
  """Return the canonical bridge-marker path for ``(tool_id, scope)``.
@@ -2269,9 +2289,22 @@ def _validate_scope(tools: set[str], scope: str, was_all: bool) -> set[str]:
2269
2289
  `--tools=all` or omitted the flag), incompatible tools are silently
2270
2290
  filtered so the default install stays backward-compatible. Explicit
2271
2291
  tool lists hard-reject with a directive error per Phase 2.3.
2292
+
2293
+ Maintainer dev mode (``AGENT_CONFIG_DEV_MODE=1``) bypasses the matrix
2294
+ filter entirely. Per ``docs/maintainers/dev-mode.md`` the flag
2295
+ "allows project-scope writes back into the repo tree" — that
2296
+ contract requires the full bridge surface (cursor / cline / windsurf
2297
+ / gemini-cli / …) to remain reachable under ``--project`` so
2298
+ ``task dev:install-global`` can dogfood every projection. The
2299
+ consumer-facing gate already runs upstream via
2300
+ ``_enforce_consumer_global_only``; reaching this function with
2301
+ ``scope == "project"`` means the dev gate already approved the
2302
+ write, so the matrix filter would be double-gating maintainer flows.
2272
2303
  """
2273
2304
  if scope not in ("project", "global"):
2274
2305
  fail(f"_validate_scope: unknown scope '{scope}'")
2306
+ if os.environ.get("AGENT_CONFIG_DEV_MODE") == "1":
2307
+ return tools
2275
2308
  incompatible = sorted(
2276
2309
  t for t in tools
2277
2310
  if SCOPE_SUPPORT.get(t, "both") not in ("both", scope)
@@ -2291,6 +2324,125 @@ def _validate_scope(tools: set[str], scope: str, was_all: bool) -> set[str]:
2291
2324
  return tools # unreachable; fail() exits
2292
2325
 
2293
2326
 
2327
+ def _enforce_consumer_global_only(scope: str) -> None:
2328
+ """road-to-global-only-install § Phase 3.2 — gate the project scope.
2329
+
2330
+ Consumer installs ship global-only (ADR-020). The legacy project
2331
+ scope stays available for maintainers via ``AGENT_CONFIG_DEV_MODE=1``
2332
+ so the dogfood-on-this-repo loop keeps working. Anything else
2333
+ routing through the orchestrator with ``scope == "project"`` aborts
2334
+ with a directive error pointing at the maintainer doc.
2335
+
2336
+ Pure side-effect gate — separate from ``_resolve_scope`` so the
2337
+ unit-tested resolver stays a pure function of its inputs.
2338
+ """
2339
+ if scope != "project":
2340
+ return
2341
+ if os.environ.get("AGENT_CONFIG_DEV_MODE") == "1":
2342
+ return
2343
+ fail(
2344
+ "--scope=project is reserved for maintainers (ADR-020 — consumer "
2345
+ "installs are global-only). Set AGENT_CONFIG_DEV_MODE=1 to opt in. "
2346
+ "See docs/maintainers/dev-mode.md."
2347
+ )
2348
+
2349
+
2350
+ # --- road-to-global-only-install § Phase 2.2 — three-layer settings reader ---
2351
+ #
2352
+ # Merge order (per ADR-020 / D9):
2353
+ #
2354
+ # defaults < global < project-overrides
2355
+ #
2356
+ # The defaults layer is the rendered template body in
2357
+ # ``config/agent-settings.template.yml``. The global layer is
2358
+ # ``~/.event4u/agent-config/.agent-settings.yml``. The project layer is
2359
+ # ``<project_root>/.agent-settings.yml`` — tolerated but no longer
2360
+ # required to exist. Any layer that is missing or unparseable falls back
2361
+ # to an empty dict so the merge stays total.
2362
+ #
2363
+ # The TypeScript wizard route ``GET /api/v1/wizard/settings`` mirrors the
2364
+ # same precedence (see :mod:`src.server.routes.wizard`) so the Python
2365
+ # installer and the Fastify server agree on what *the user's effective
2366
+ # settings* look like at any given moment.
2367
+
2368
+ def _load_yaml_doc(path: Path) -> dict:
2369
+ """Load a YAML file as a dict; return ``{}`` on every recoverable error.
2370
+
2371
+ Used by the three-layer settings reader. Mirrors the defensive shape
2372
+ of :func:`scripts.config.profiles._load_yaml`: missing PyYAML, missing
2373
+ file, parse error, or non-dict root all collapse to an empty dict so
2374
+ callers can blindly :func:`deep_merge` the result without guards.
2375
+ """
2376
+ try:
2377
+ import yaml # type: ignore[import-not-found]
2378
+ except ImportError:
2379
+ return {}
2380
+ if not path.exists() or not path.is_file():
2381
+ return {}
2382
+ try:
2383
+ text = path.read_text(encoding="utf-8")
2384
+ except OSError:
2385
+ return {}
2386
+ try:
2387
+ data = yaml.safe_load(text)
2388
+ except yaml.YAMLError:
2389
+ return {}
2390
+ return data if isinstance(data, dict) else {}
2391
+
2392
+
2393
+ def _load_default_settings(package_root: Path) -> dict:
2394
+ """Parse the rendered settings template into a defaults dict.
2395
+
2396
+ The template carries ``__COST_PROFILE__`` / ``__USER_TYPE__``
2397
+ placeholders that PyYAML cannot parse as scalars. We substitute the
2398
+ most permissive defaults (``balanced`` + empty user_type) before
2399
+ parsing — the resulting tree is the *defaults* layer of the merge,
2400
+ and downstream layers overwrite cost_profile / user_type as needed.
2401
+ """
2402
+ template_source = package_root / "config" / "agent-settings.template.yml"
2403
+ if not template_source.exists():
2404
+ return {}
2405
+ try:
2406
+ text = template_source.read_text(encoding="utf-8")
2407
+ except OSError:
2408
+ return {}
2409
+ rendered = text.replace(COST_PROFILE_PLACEHOLDER, DEFAULT_PROFILE).replace(
2410
+ USER_TYPE_PLACEHOLDER, ""
2411
+ )
2412
+ try:
2413
+ import yaml # type: ignore[import-not-found]
2414
+ except ImportError:
2415
+ return {}
2416
+ try:
2417
+ data = yaml.safe_load(rendered)
2418
+ except yaml.YAMLError:
2419
+ return {}
2420
+ return data if isinstance(data, dict) else {}
2421
+
2422
+
2423
+ def read_layered_settings(
2424
+ package_root: Path,
2425
+ project_root: "Path | None" = None,
2426
+ ) -> dict:
2427
+ """Three-layer settings merge — ``defaults < global < project``.
2428
+
2429
+ ``project_root`` is optional: when ``None`` (or the project file is
2430
+ absent), the merge collapses to ``defaults < global`` so a consumer
2431
+ who installs global-only sees the same effective settings the
2432
+ Fastify server would surface. Always returns a dict — never raises.
2433
+
2434
+ Used by :func:`main` to compute the effective configuration before
2435
+ rendering per-tool bridges, and by the Phase 2.4 ``settings migrate``
2436
+ subcommand to detect which keys are local-only overrides.
2437
+ """
2438
+ merged = _load_default_settings(package_root)
2439
+ merged = deep_merge(merged, _load_yaml_doc(GLOBAL_AGENT_SETTINGS_PATH))
2440
+ if project_root is not None:
2441
+ project_file = project_root / SETTINGS_FILE
2442
+ merged = deep_merge(merged, _load_yaml_doc(project_file))
2443
+ return merged
2444
+
2445
+
2294
2446
  def _resolve_scope(
2295
2447
  opts: "argparse.Namespace",
2296
2448
  detected: str,
@@ -2745,6 +2897,284 @@ def _resolve_package_root_for_global() -> Path:
2745
2897
  return candidate
2746
2898
 
2747
2899
 
2900
+ #: Consumer bridge marker filename, relative to the project root.
2901
+ #: Spec: docs/contracts/consumer-bridge.md (event4u-bridge/v1).
2902
+ CONSUMER_BRIDGE_MARKER_RELPATH = Path("agents") / ".event4u-bridge.yml"
2903
+
2904
+
2905
+ # ---------------------------------------------------------------------------
2906
+ # Phase 5.2 — migrate-to-global first-run hook
2907
+ # ---------------------------------------------------------------------------
2908
+ #
2909
+ # Legacy artefacts that signal a pre-ADR-020 install in the project root.
2910
+ # Same surface the ``migrate-to-global`` command detects (see
2911
+ # ``scripts/_cli/cmd_migrate_to_global.py``). Kept in sync intentionally so
2912
+ # the prompt and the migration tool agree on what counts as "legacy".
2913
+ MIGRATE_LEGACY_YAML_FILES = (".agent-settings.yml", ".agent-user.yml")
2914
+ MIGRATE_LEGACY_TOOL_DIRS = (".augment", ".claude", ".cursor")
2915
+
2916
+
2917
+ def _detect_legacy_for_migration(project_root: Path) -> list[str]:
2918
+ """Return a sorted list of legacy artefact relpaths present in ``project_root``.
2919
+
2920
+ Skipped (returns ``[]``) when:
2921
+
2922
+ - ``AGENT_CONFIG_DEV_MODE=1`` is set (maintainer dogfood loop),
2923
+ - the project root IS the agent-config source repo
2924
+ (``.agent-src.uncompressed/`` present),
2925
+ - the bridge marker already exists (project is already global-only).
2926
+ """
2927
+ if os.environ.get("AGENT_CONFIG_DEV_MODE") == "1":
2928
+ return []
2929
+ if (project_root / ".agent-src.uncompressed").is_dir():
2930
+ return []
2931
+ if (project_root / CONSUMER_BRIDGE_MARKER_RELPATH).is_file():
2932
+ return []
2933
+
2934
+ found: list[str] = []
2935
+ for name in MIGRATE_LEGACY_YAML_FILES:
2936
+ if (project_root / name).is_file():
2937
+ found.append(name)
2938
+ elif (project_root / "settings" / name).is_file():
2939
+ found.append(f"settings/{name}")
2940
+ for name in MIGRATE_LEGACY_TOOL_DIRS:
2941
+ p = project_root / name
2942
+ if p.is_dir() and not p.is_symlink():
2943
+ found.append(f"{name}/")
2944
+ return sorted(found)
2945
+
2946
+
2947
+ def _prompt_migrate_to_global(project_root: Path, artefacts: list[str]) -> bool:
2948
+ """Ask the user whether to run ``migrate-to-global`` now.
2949
+
2950
+ Interactive TTY → ``[Y/n]`` prompt (Enter = yes). Non-interactive (CI
2951
+ or no TTY) → auto-yes per roadmap Phase 5.2 contract. Three invalid
2952
+ replies short-circuit to "no" (defensive, never blocks the install).
2953
+ """
2954
+ if not QUIET:
2955
+ print()
2956
+ warn("Legacy project-local artefacts detected — pre-ADR-020 layout:")
2957
+ for rel in artefacts:
2958
+ info(f" {project_root / rel}")
2959
+ info("ADR-020 ships consumer installs as global-only.")
2960
+ info("`agent-config migrate-to-global` copies → verifies → moves them safely.")
2961
+
2962
+ if not _is_interactive():
2963
+ if not QUIET:
2964
+ info("Non-interactive mode → defaulting to YES (run migration).")
2965
+ return True
2966
+
2967
+ attempts = 0
2968
+ while attempts < 3:
2969
+ try:
2970
+ reply = _read_line("Run `agent-config migrate-to-global` now? [Y/n]: ")
2971
+ except EOFError:
2972
+ return False
2973
+ if reply == "" or reply.lower() in ("y", "yes"):
2974
+ return True
2975
+ if reply.lower() in ("n", "no"):
2976
+ return False
2977
+ attempts += 1
2978
+ warn(f"Invalid choice '{reply}'. Enter Y or n.")
2979
+ return False
2980
+
2981
+
2982
+ def _run_migrate_to_global(project_root: Path) -> int:
2983
+ """Invoke ``cmd_migrate_to_global._do_migrate`` against ``project_root``.
2984
+
2985
+ Returns the migrator's exit code so the caller can abort the install
2986
+ on failure. The perms gate is skipped because the install path runs
2987
+ its own checks; surfacing two perm errors back-to-back would be
2988
+ confusing for first-run users.
2989
+ """
2990
+ import importlib # noqa: PLC0415 — local to keep startup lean.
2991
+
2992
+ try:
2993
+ cmd_mod = importlib.import_module("scripts._cli.cmd_migrate_to_global")
2994
+ except ImportError as exc:
2995
+ warn(f"migrate-to-global unavailable: {exc}")
2996
+ return 1
2997
+
2998
+ install_mod = sys.modules[__name__]
2999
+ return cmd_mod._do_migrate(project_root, force=False, install_mod=install_mod, out=sys.stdout)
3000
+
3001
+
3002
+ def _format_global_root_for_marker(global_root: Path) -> str:
3003
+ """Render ``global_root`` for the bridge marker.
3004
+
3005
+ Per ``docs/contracts/consumer-bridge.md``, readers MUST expand ``~``
3006
+ against the **current process's** ``$HOME``. To keep the marker
3007
+ portable across maintainer home dirs, render the path with a
3008
+ leading ``~/`` when it lives under ``Path.home()``; fall back to
3009
+ the absolute path otherwise (e.g. ``EVENT4U_CONFIG_HOME`` override
3010
+ pointing outside ``$HOME``).
3011
+ """
3012
+ try:
3013
+ rel = global_root.resolve().relative_to(Path.home().resolve())
3014
+ except ValueError:
3015
+ return str(global_root)
3016
+ return f"~/{rel.as_posix()}"
3017
+
3018
+
3019
+ def _write_consumer_bridge_marker(
3020
+ project_root: Path,
3021
+ installer_version: str,
3022
+ *,
3023
+ env: Optional[dict] = None,
3024
+ now: Optional[datetime] = None,
3025
+ ) -> Optional[Path]:
3026
+ """Write ``agents/.event4u-bridge.yml`` at the consumer project root.
3027
+
3028
+ Returns the written path, or ``None`` when the write was skipped per
3029
+ ``docs/contracts/consumer-bridge.md`` § Writer contract:
3030
+
3031
+ - ``AGENT_CONFIG_DEV_MODE=1`` (maintainer dev installs never lay the
3032
+ bridge into the source repo).
3033
+ - The project root is the agent-config source repo itself
3034
+ (``.agent-src.uncompressed/`` present) — same rationale.
3035
+
3036
+ Atomic write: ``tempfile`` in the same dir + ``os.replace``. Same
3037
+ pattern the lockfile uses (see ``scripts/_lib/installed_lock.py``).
3038
+ Mode ``0o644`` per contract — no secrets, world-readable.
3039
+ """
3040
+ import tempfile
3041
+
3042
+ env_map = env if env is not None else os.environ
3043
+ if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
3044
+ return None
3045
+ if (project_root / ".agent-src.uncompressed").is_dir():
3046
+ return None
3047
+
3048
+ paths_mod = _load_user_global_paths_module()
3049
+ global_root_str = _format_global_root_for_marker(paths_mod.event4u_root(env=env_map))
3050
+ stamp = (now or datetime.now(timezone.utc)).strftime("%Y-%m-%dT%H:%M:%SZ")
3051
+
3052
+ body = (
3053
+ "# event4u/agent-config — consumer bridge marker (auto-written).\n"
3054
+ "# Spec: docs/contracts/consumer-bridge.md (event4u-bridge/v1).\n"
3055
+ "# Reader contract: expand ~ against the current $HOME; fail closed\n"
3056
+ "# when global_root is missing on disk; never write back through it.\n"
3057
+ "schema: event4u-bridge/v1\n"
3058
+ f"global_root: {global_root_str}\n"
3059
+ f"installed_at: {stamp}\n"
3060
+ f"installer_version: {installer_version}\n"
3061
+ )
3062
+
3063
+ target = project_root / CONSUMER_BRIDGE_MARKER_RELPATH
3064
+ target.parent.mkdir(parents=True, exist_ok=True)
3065
+
3066
+ fd, tmp_name = tempfile.mkstemp(
3067
+ prefix=".event4u-bridge.", suffix=".yml.tmp",
3068
+ dir=str(target.parent), text=False,
3069
+ )
3070
+ try:
3071
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
3072
+ fh.write(body)
3073
+ os.chmod(tmp_name, 0o644)
3074
+ os.replace(tmp_name, target)
3075
+ except Exception:
3076
+ try:
3077
+ os.unlink(tmp_name)
3078
+ except OSError:
3079
+ pass
3080
+ raise
3081
+ return target
3082
+
3083
+
3084
+ #: Per-tool project anchors (Phase 4.3). Some AI tools only load rules
3085
+ #: when an anchor file is **inside** the workspace. For those IDs we
3086
+ #: plant a thin pointer file under the tool's per-project directory
3087
+ #: whose body references the bridge marker (``agents/.event4u-bridge.yml``).
3088
+ #: Tools that load purely from user-scope (Claude Code, Cursor, Augment)
3089
+ #: read the marker once and need no per-tool file — they are absent
3090
+ #: from this map by design (see ``docs/contracts/consumer-bridge.md``
3091
+ #: § Per-tool anchor strategy).
3092
+ PROJECT_ANCHOR_TOOLS: dict[str, str] = {
3093
+ "windsurf": ".windsurf/agent-config.bridge.yml",
3094
+ "cline": ".clinerules/agent-config.bridge.yml",
3095
+ "gemini-cli": ".gemini/agent-config.bridge.yml",
3096
+ }
3097
+
3098
+
3099
+ def _write_per_tool_project_anchors(
3100
+ project_root: Path,
3101
+ tools: set[str],
3102
+ *,
3103
+ env: Optional[dict] = None,
3104
+ now: Optional[datetime] = None,
3105
+ ) -> list[Path]:
3106
+ """Plant thin pointer files for tools in :data:`PROJECT_ANCHOR_TOOLS`.
3107
+
3108
+ Each pointer is a tiny YAML body that references the bridge marker
3109
+ at ``agents/.event4u-bridge.yml`` (relative from the pointer's
3110
+ location) plus the resolved ``global_root`` for convenience. Same
3111
+ gate semantics as :func:`_write_consumer_bridge_marker`:
3112
+
3113
+ - Skipped under ``AGENT_CONFIG_DEV_MODE=1``.
3114
+ - Skipped inside the agent-config source repo
3115
+ (``.agent-src.uncompressed/`` present).
3116
+ - Skipped when the tool is not in ``tools``.
3117
+
3118
+ Atomic write per file (temp file + ``os.replace``); ``0o644``
3119
+ permissions per ``docs/contracts/consumer-bridge.md`` (the pointers
3120
+ contain no secrets, only paths).
3121
+ """
3122
+ import tempfile
3123
+
3124
+ env_map = env if env is not None else os.environ
3125
+ if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
3126
+ return []
3127
+ if (project_root / ".agent-src.uncompressed").is_dir():
3128
+ return []
3129
+
3130
+ paths_mod = _load_user_global_paths_module()
3131
+ global_root_str = _format_global_root_for_marker(paths_mod.event4u_root(env=env_map))
3132
+ stamp = (now or datetime.now(timezone.utc)).strftime("%Y-%m-%dT%H:%M:%SZ")
3133
+ written: list[Path] = []
3134
+
3135
+ for tool_id, rel_path in sorted(PROJECT_ANCHOR_TOOLS.items()):
3136
+ if tool_id not in tools:
3137
+ continue
3138
+ target = project_root / rel_path
3139
+ target.parent.mkdir(parents=True, exist_ok=True)
3140
+
3141
+ # Relative path from the pointer file back to the bridge marker.
3142
+ # Both live inside ``project_root``; ``os.path.relpath`` keeps the
3143
+ # result portable across machines (no absolute path leakage).
3144
+ bridge_abs = project_root / CONSUMER_BRIDGE_MARKER_RELPATH
3145
+ bridge_rel = os.path.relpath(bridge_abs, target.parent)
3146
+
3147
+ body = (
3148
+ "# event4u/agent-config — per-tool project anchor (auto-written).\n"
3149
+ "# Spec: docs/contracts/consumer-bridge.md § Per-tool anchor strategy.\n"
3150
+ f"# Tool: {tool_id}. Bridge marker: agents/.event4u-bridge.yml.\n"
3151
+ "schema: event4u-bridge/v1\n"
3152
+ f"tool: {tool_id}\n"
3153
+ f"bridge: {bridge_rel}\n"
3154
+ f"global_root: {global_root_str}\n"
3155
+ f"installed_at: {stamp}\n"
3156
+ )
3157
+
3158
+ fd, tmp_name = tempfile.mkstemp(
3159
+ prefix=".agent-config.bridge.", suffix=".yml.tmp",
3160
+ dir=str(target.parent), text=False,
3161
+ )
3162
+ try:
3163
+ with os.fdopen(fd, "w", encoding="utf-8") as fh:
3164
+ fh.write(body)
3165
+ os.chmod(tmp_name, 0o644)
3166
+ os.replace(tmp_name, target)
3167
+ except Exception:
3168
+ try:
3169
+ os.unlink(tmp_name)
3170
+ except OSError:
3171
+ pass
3172
+ raise
3173
+ written.append(target)
3174
+
3175
+ return written
3176
+
3177
+
2748
3178
  #: Inline package identifier injected into deployed Markdown
2749
3179
  #: frontmatter (P5.1). Human-readable provenance only; the manifest
2750
3180
  #: remains the authoritative ownership source (see P5.3).
@@ -3137,6 +3567,38 @@ def install_global(
3137
3567
  if rc != 0:
3138
3568
  return rc
3139
3569
 
3570
+ # Consumer bridge marker (Phase 4.2). One declarative pointer at
3571
+ # ``agents/.event4u-bridge.yml`` lets per-tool adapters locate
3572
+ # the global root from inside the repo. Skipped in maintainer
3573
+ # dev mode and in the source repo (see contract § Writer
3574
+ # contract; the surrounding ``.agent-src.uncompressed`` guard
3575
+ # already covers the source-repo case, the dev-mode skip is
3576
+ # enforced inside the writer).
3577
+ marker_path = _write_consumer_bridge_marker(project_root, installed_version)
3578
+ if marker_path is not None and not QUIET:
3579
+ rel = (
3580
+ marker_path.relative_to(project_root)
3581
+ if marker_path.is_relative_to(project_root)
3582
+ else marker_path
3583
+ )
3584
+ info(f"Bridge marker written: {rel}")
3585
+
3586
+ # Per-tool project anchors (Phase 4.3). Plant thin pointer files
3587
+ # for tools that only load rules when an anchor exists inside
3588
+ # the workspace (Windsurf, Cline, Gemini-CLI). Same dev-mode +
3589
+ # source-repo gate as the bridge marker (enforced inside the
3590
+ # writer). Filter to the tools the caller actually selected so
3591
+ # we never plant anchors for tools the user excluded.
3592
+ anchor_paths = _write_per_tool_project_anchors(project_root, tools)
3593
+ if anchor_paths and not QUIET:
3594
+ for p in anchor_paths:
3595
+ rel = (
3596
+ p.relative_to(project_root)
3597
+ if p.is_relative_to(project_root)
3598
+ else p
3599
+ )
3600
+ info(f"Project anchor written: {rel}")
3601
+
3140
3602
  if not QUIET:
3141
3603
  print()
3142
3604
  success("Global install completed.")
@@ -3304,6 +3766,43 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
3304
3766
  "docs/contracts/universal-skills.md for the always-loaded set."
3305
3767
  ),
3306
3768
  )
3769
+ parser.add_argument(
3770
+ "--no-ui",
3771
+ dest="no_ui",
3772
+ action="store_true",
3773
+ help=(
3774
+ "suppress the post-install browser-wizard auto-launch. Also "
3775
+ "honored via AGENT_CONFIG_NO_UI=1 env. CI runners (CI=1) and "
3776
+ "non-TTY stdouts auto-suppress regardless of this flag. See "
3777
+ "agents/roadmaps/wizard-install-py-wiring.md."
3778
+ ),
3779
+ )
3780
+ parser.add_argument(
3781
+ "--dry-run",
3782
+ dest="dry_run",
3783
+ action="store_true",
3784
+ help=(
3785
+ "print a plan summary of what would be installed (profile, "
3786
+ "scope, tools, wizard auto-launch decision) and exit 0 "
3787
+ "without writing any files or spawning subprocesses. "
3788
+ "Distinct from the internal alias-resolution --dry-run "
3789
+ "passed to bridge sub-invocations."
3790
+ ),
3791
+ )
3792
+ parser.add_argument(
3793
+ "--apply-payload",
3794
+ dest="apply_payload",
3795
+ default=None,
3796
+ help=(
3797
+ "path to a WizardApplyPayload JSON file (schemas/"
3798
+ "wizard-apply-payload.schema.json). When supplied, install.py "
3799
+ "reads the payload, validates schema_version, translates "
3800
+ "tools/packs/settings into CLI equivalents, and dispatches "
3801
+ "as if those flags were passed directly. Combine with "
3802
+ "--dry-run for the Phase 1.5 preview path "
3803
+ "(road-to-global-only-install § D12 / Phase 1.5)."
3804
+ ),
3805
+ )
3307
3806
  opts = parser.parse_args(argv)
3308
3807
  opts.tools = _merge_tools_aliases(opts.tools, opts.ai)
3309
3808
  if opts.scope == "global" and opts.custom_path:
@@ -3411,19 +3910,26 @@ def _write_install_mode_marker(project_root: Path, mode: str) -> None:
3411
3910
 
3412
3911
 
3413
3912
  def install_minimal(target_root: Path, force: bool, user_type: str = "") -> int:
3414
- """Bootstrap the project-local override layer only (D2-compliant).
3913
+ """Bootstrap the project-local override layer only (ADR-020-compliant).
3415
3914
 
3416
- Writes:
3915
+ Writes the global-only consumer scaffold:
3417
3916
 
3418
- * ``agents/.gitkeep`` so the folder is committable.
3419
- * ``.agent-settings.yml`` stub (cost_profile=balanced, version pin
3420
- commented out per D4).
3917
+ * ``agents/overrides/{rules,skills,commands}/.gitkeep`` so the
3918
+ override subdirs are committable in a fresh repo.
3919
+ * ``agents/overrides/README.md`` explaining the override layer and
3920
+ its resolution model.
3921
+ * ``agents/.event4u-bridge.yml`` (Phase 4.2) anchoring the project
3922
+ to the user-global ``~/.event4u/agent-config/`` install.
3923
+ * ``.agent-settings.yml`` — only when ``user_type`` is supplied
3924
+ (back-compat with the step-9 interactive flow); otherwise the
3925
+ project-local settings file is **not** written (global config
3926
+ is the source of truth per ADR-020 § D2).
3421
3927
 
3422
3928
  Refuses (exit 1) when ``target_root`` is **inside** an existing
3423
3929
  agent-config project (Phase-1 anchor walk above the target). The
3424
3930
  in-target case is allowed and treated as idempotent — re-running
3425
- ``--minimal`` in a folder that already has ``.agent-settings.yml``
3426
- does nothing unless ``--force`` is passed.
3931
+ ``--minimal`` in a folder that already has the bridge marker does
3932
+ nothing unless ``--force`` is passed.
3427
3933
 
3428
3934
  Does **not** touch ``.gitignore`` (D2 — user owns the ignore file).
3429
3935
  The ``./agent-config`` wrapper is installed by ``scripts/install.sh``
@@ -3455,40 +3961,71 @@ def install_minimal(target_root: Path, force: bool, user_type: str = "") -> int:
3455
3961
 
3456
3962
  templates = _minimal_templates_root()
3457
3963
  settings_src = templates / SETTINGS_FILE
3458
- gitkeep_src = templates / "agents-gitkeep"
3964
+ overrides_gitkeep_src = templates / "overrides-gitkeep"
3965
+ overrides_readme_src = templates / "agents-overrides-readme.md"
3459
3966
 
3460
- if not settings_src.is_file() or not gitkeep_src.is_file():
3461
- fail(f"Bundled minimal templates missing under {templates}")
3967
+ if not settings_src.is_file():
3968
+ fail(f"Bundled minimal settings template missing under {templates}")
3969
+ if not overrides_gitkeep_src.is_file() or not overrides_readme_src.is_file():
3970
+ fail(f"Bundled overrides scaffold templates missing under {templates}")
3462
3971
 
3463
3972
  info(f"Minimal init → {target_root}")
3464
3973
 
3465
- # 1. agents/.gitkeep
3466
- agents_dir = target_root / "agents"
3467
- agents_dir.mkdir(exist_ok=True)
3468
- gitkeep_dst = agents_dir / ".gitkeep"
3469
- if gitkeep_dst.exists() and not force:
3470
- skip(f"agents/.gitkeep already exists (use --force to overwrite)")
3471
- else:
3472
- gitkeep_dst.write_text(gitkeep_src.read_text(encoding="utf-8"), encoding="utf-8")
3473
- success("Wrote agents/.gitkeep")
3974
+ # 1. agents/overrides/{rules,skills,commands}/.gitkeep — committable
3975
+ # scaffold for the project-local override layer (ADR-020 § Phase 4.5).
3976
+ overrides_root = target_root / "agents" / "overrides"
3977
+ overrides_root.mkdir(parents=True, exist_ok=True)
3978
+ gitkeep_body = overrides_gitkeep_src.read_text(encoding="utf-8")
3979
+ for sub in ("rules", "skills", "commands"):
3980
+ sub_dir = overrides_root / sub
3981
+ sub_dir.mkdir(exist_ok=True)
3982
+ gitkeep_dst = sub_dir / ".gitkeep"
3983
+ if gitkeep_dst.exists() and not force:
3984
+ skip(f"agents/overrides/{sub}/.gitkeep already exists (use --force to overwrite)")
3985
+ else:
3986
+ gitkeep_dst.write_text(gitkeep_body, encoding="utf-8")
3987
+ success(f"Wrote agents/overrides/{sub}/.gitkeep")
3474
3988
 
3475
- # 2. .agent-settings.yml stub
3476
- settings_dst = target_root / SETTINGS_FILE
3477
- if settings_dst.exists() and not force:
3478
- skip(f"{SETTINGS_FILE} already exists (use --force to overwrite)")
3989
+ # 2. agents/overrides/README.md — explains the override layer.
3990
+ readme_dst = overrides_root / "README.md"
3991
+ if readme_dst.exists() and not force:
3992
+ skip("agents/overrides/README.md already exists (use --force to overwrite)")
3479
3993
  else:
3480
- body = settings_src.read_text(encoding="utf-8")
3481
- if user_type:
3482
- body = body.rstrip() + (
3994
+ readme_dst.write_text(overrides_readme_src.read_text(encoding="utf-8"), encoding="utf-8")
3995
+ success("Wrote agents/overrides/README.md")
3996
+
3997
+ # 3. .agent-settings.yml stub — only when user_type is supplied
3998
+ # (back-compat with the step-9 interactive flow). Global config is
3999
+ # the source of truth per ADR-020 § D2; a fresh `--minimal` run
4000
+ # without user_type does not write a project-local settings file.
4001
+ if user_type:
4002
+ settings_dst = target_root / SETTINGS_FILE
4003
+ if settings_dst.exists() and not force:
4004
+ skip(f"{SETTINGS_FILE} already exists (use --force to overwrite)")
4005
+ else:
4006
+ body = settings_src.read_text(encoding="utf-8").rstrip() + (
3483
4007
  "\n\n# --- Personal (step-9 user-type axis) ---\n"
3484
4008
  "personal:\n"
3485
4009
  f" user_type: {user_type}\n"
3486
4010
  )
3487
- settings_dst.write_text(body, encoding="utf-8")
3488
- suffix = f" (user_type={user_type})" if user_type else ""
3489
- success(f"Wrote {SETTINGS_FILE}{suffix}")
4011
+ settings_dst.write_text(body, encoding="utf-8")
4012
+ success(f"Wrote {SETTINGS_FILE} (user_type={user_type})")
3490
4013
 
3491
- # 3. install-mode marker (Step 8 A5) authoritative state for
4014
+ # 4. Consumer bridge marker (Phase 4.2). Anchors the project to
4015
+ # the user-global ``~/.event4u/agent-config/`` install. The writer
4016
+ # itself enforces the dev-mode + source-repo skip contract.
4017
+ lock_mod = _load_installed_lock_module()
4018
+ installed_version = lock_mod.current_package_version()
4019
+ marker_path = _write_consumer_bridge_marker(target_root, installed_version)
4020
+ if marker_path is not None:
4021
+ rel = (
4022
+ marker_path.relative_to(target_root)
4023
+ if marker_path.is_relative_to(target_root)
4024
+ else marker_path
4025
+ )
4026
+ success(f"Wrote {rel}")
4027
+
4028
+ # 5. install-mode marker (Step 8 A5) — authoritative state for
3492
4029
  # doctor --context and future install-aware tooling. Written even
3493
4030
  # on idempotent re-runs so the marker is repaired if removed.
3494
4031
  _write_install_mode_marker(target_root, "minimal")
@@ -3508,7 +4045,7 @@ def install_minimal(target_root: Path, force: bool, user_type: str = "") -> int:
3508
4045
  print()
3509
4046
  info("Next steps:")
3510
4047
  info(" • Ensure `agent-config` is on $PATH: npm install -g @event4u/agent-config")
3511
- info(" • Add `.agent-settings.yml` and `agents/` to git (or to .gitignore — your call).")
4048
+ info(" • Drop project-scoped overrides under `agents/overrides/{rules,skills,commands}/`.")
3512
4049
  info(" • Run `agent-config doctor` to verify the layer is picked up.")
3513
4050
  return 0
3514
4051
 
@@ -3627,14 +4164,316 @@ def run_interactive_init(project_root: Path, force: bool) -> int:
3627
4164
  return 0
3628
4165
 
3629
4166
 
4167
+ # --- Wizard auto-launch (Phase 6 follow-up) ---
4168
+ #
4169
+ # Auto-launches the browser configuration wizard at the tail of a
4170
+ # successful install. The TS side ships a `gui` subcommand on the
4171
+ # installer CLI; this Python parent acts as a supervisor that:
4172
+ #
4173
+ # 1. evaluates gate conditions (TTY, CI, --no-ui, env override),
4174
+ # 2. validates the dist exists,
4175
+ # 3. spawns `node <cli> gui --project-root <root>` via subprocess.Popen,
4176
+ # 4. captures stderr on a background thread (for failure surfacing),
4177
+ # 5. reads stdout line-by-line with a progressive timeout
4178
+ # (10s → 20s → 40s → 80s) and matches the strict readiness regex
4179
+ # `^WIZARD_READY url=(http://(?:127.0.0.1|localhost):\d+/)\r?$`,
4180
+ # 6. on success: prints the URL banner and waits for the child to
4181
+ # exit (Ctrl-C in the parent terminal propagates to the child),
4182
+ # 7. on timeout: kills the child, prints captured stderr tail, falls
4183
+ # through to a fallback message; install itself is unaffected.
4184
+ #
4185
+ # Council synthesis: agents/runtime/council/responses/wizard-wiring-2026-05-22.synthesis.md
4186
+ # Roadmap: agents/roadmaps/wizard-install-py-wiring.md Step 3.
4187
+
4188
+ _WIZARD_READY_RE = re.compile(
4189
+ r"^WIZARD_READY url=(http://(?:127\.0\.0\.1|localhost):\d+/)\r?$"
4190
+ )
4191
+ _WIZARD_TIMEOUTS = (10.0, 20.0, 40.0, 80.0) # cumulative budget 150s.
4192
+
4193
+
4194
+ def _wizard_should_launch(opts: argparse.Namespace) -> tuple[bool, str]:
4195
+ """Evaluate gate conditions for the post-install wizard auto-launch.
4196
+
4197
+ Returns (decision, reason). When decision is False the reason
4198
+ string explains why (CI / no-tty / --no-ui / env override) and is
4199
+ suitable for the pre-install banner Council Tier 2 § 8.
4200
+ """
4201
+ if getattr(opts, "no_ui", False):
4202
+ return (False, "--no-ui flag set")
4203
+ env_no_ui = os.environ.get("AGENT_CONFIG_NO_UI", "").strip()
4204
+ if env_no_ui and env_no_ui != "0":
4205
+ return (False, "AGENT_CONFIG_NO_UI env set")
4206
+ if os.environ.get("CI", "").strip():
4207
+ return (False, "CI environment detected")
4208
+ if not sys.stdout.isatty():
4209
+ return (False, "stdout is not a TTY")
4210
+ return (True, "")
4211
+
4212
+
4213
+ def _wizard_cli_dist(project_root: Path) -> Path | None:
4214
+ """Resolve the installer dist path. Returns None if not built.
4215
+
4216
+ Walks up from this file (scripts/install.py is at <pkg>/scripts/)
4217
+ to <pkg>/packages/core/installer/dist/cli.js. That's the layout
4218
+ the monorepo ships; consumer installs run `node <pkg>/.../cli.js`.
4219
+ """
4220
+ package_root = Path(__file__).resolve().parent.parent
4221
+ cli = package_root / "packages" / "core" / "installer" / "dist" / "cli.js"
4222
+ return cli if cli.exists() else None
4223
+
4224
+
4225
+ def _wizard_spawn(project_root: Path) -> int:
4226
+ """Spawn the wizard, await readiness, hand off to the child.
4227
+
4228
+ Returns the child's exit code on clean shutdown, 0 on
4229
+ readiness-timeout (install itself succeeded; wizard is best-effort).
4230
+ Never raises into the parent — every error surfaces as a printed
4231
+ fallback line and a 0 return.
4232
+ """
4233
+ cli = _wizard_cli_dist(project_root)
4234
+ if cli is None:
4235
+ print(
4236
+ "(Wizard not available — installer package not built. "
4237
+ "Run 'npm run build' inside packages/core/installer/.)"
4238
+ )
4239
+ return 0
4240
+
4241
+ cmd = ["node", str(cli), "gui", "--project-root", str(project_root)]
4242
+ env = os.environ.copy()
4243
+ # The Node child writes its own readiness banner; suppress the
4244
+ # browser-open inside the child so the Python parent stays in
4245
+ # charge of the user-facing URL print (Tier 2 § 8 ordering).
4246
+ env.setdefault("AGENT_CONFIG_GUI_NO_OPEN", "1")
4247
+
4248
+ try:
4249
+ child = subprocess.Popen( # noqa: S603 - cmd is locally-built, not user input
4250
+ cmd,
4251
+ stdout=subprocess.PIPE,
4252
+ stderr=subprocess.PIPE,
4253
+ text=True,
4254
+ env=env,
4255
+ bufsize=1, # line-buffered
4256
+ )
4257
+ except OSError as exc:
4258
+ print(f"(Wizard failed to start: {exc}; run 'node {cli} gui' manually.)")
4259
+ return 0
4260
+
4261
+ # Drain stderr on a background thread so a chatty child can't
4262
+ # block the readline loop below. Cap at 80 lines to bound memory.
4263
+ stderr_tail: list[str] = []
4264
+
4265
+ def _drain_stderr() -> None:
4266
+ if child.stderr is None:
4267
+ return
4268
+ for line in child.stderr:
4269
+ stderr_tail.append(line.rstrip("\r\n"))
4270
+ if len(stderr_tail) > 80:
4271
+ del stderr_tail[: len(stderr_tail) - 80]
4272
+
4273
+ stderr_thread = threading.Thread(target=_drain_stderr, daemon=True)
4274
+ stderr_thread.start()
4275
+
4276
+ return _wizard_await_ready(child, stderr_tail, cli)
4277
+
4278
+
4279
+ def _wizard_await_ready(
4280
+ child: subprocess.Popen[str],
4281
+ stderr_tail: list[str],
4282
+ cli: Path,
4283
+ ) -> int:
4284
+ """Read child stdout until the WIZARD_READY regex matches.
4285
+
4286
+ Progressive backoff per Council Tier 1 § 2. On match, prints the
4287
+ URL banner and blocks on child.wait() (parent Ctrl-C is forwarded
4288
+ to the child by the OS via the shared process group).
4289
+ """
4290
+ assert child.stdout is not None
4291
+ elapsed_total = 0.0
4292
+ matched_url: str | None = None
4293
+
4294
+ for interim in _WIZARD_TIMEOUTS:
4295
+ deadline = time.monotonic() + interim
4296
+ while True:
4297
+ remaining = deadline - time.monotonic()
4298
+ if remaining <= 0:
4299
+ break
4300
+ # readline blocks until \n or EOF; we cap total wait per
4301
+ # phase via deadline. Use poll() to detect child exit.
4302
+ if child.poll() is not None:
4303
+ break
4304
+ line = child.stdout.readline()
4305
+ if not line:
4306
+ # EOF — child closed stdout without WIZARD_READY.
4307
+ break
4308
+ m = _WIZARD_READY_RE.match(line)
4309
+ if m is not None:
4310
+ matched_url = m.group(1)
4311
+ break
4312
+ if matched_url is not None or child.poll() is not None:
4313
+ break
4314
+ elapsed_total += interim
4315
+ if elapsed_total < sum(_WIZARD_TIMEOUTS):
4316
+ print(f"(Wizard still booting after {int(elapsed_total)}s — waiting…)")
4317
+
4318
+ if matched_url is None:
4319
+ try:
4320
+ child.terminate()
4321
+ child.wait(timeout=2)
4322
+ except (subprocess.TimeoutExpired, OSError):
4323
+ try:
4324
+ child.kill()
4325
+ except OSError:
4326
+ pass
4327
+ tail = "\n ".join(stderr_tail[-20:]) if stderr_tail else "(no stderr captured)"
4328
+ print(
4329
+ f"(Wizard server boot timed out after {int(sum(_WIZARD_TIMEOUTS))}s; "
4330
+ f"run 'node {cli} gui' manually.)\n"
4331
+ f" Last stderr:\n {tail}"
4332
+ )
4333
+ return 0
4334
+
4335
+ print()
4336
+ print(f"Setup wizard ready: {matched_url}")
4337
+ print("(Wizard runs in the background; close the tab or press Ctrl-C to stop.)")
4338
+ try:
4339
+ return child.wait()
4340
+ except KeyboardInterrupt:
4341
+ try:
4342
+ child.terminate()
4343
+ return child.wait(timeout=5)
4344
+ except (subprocess.TimeoutExpired, OSError):
4345
+ try:
4346
+ child.kill()
4347
+ except OSError:
4348
+ pass
4349
+ return 130
4350
+
4351
+
4352
+ def _dry_run_summary(opts: argparse.Namespace) -> int:
4353
+ """Print a one-block plan summary for --dry-run and exit 0.
4354
+
4355
+ Lists profile, scope, tools, target root, and the wizard
4356
+ auto-launch decision. Writes nothing, spawns nothing. The wizard
4357
+ line is shown per Council Tier 3 § 10 user-requirement carve-out.
4358
+ """
4359
+ target = Path(
4360
+ opts.custom_path or opts.project or os.environ.get("PROJECT_ROOT") or os.getcwd()
4361
+ ).resolve()
4362
+ will_launch, why_not = _wizard_should_launch(opts)
4363
+ print()
4364
+ print("[dry-run] Plan summary — no files written, no subprocesses spawned:")
4365
+ print(f" profile: {opts.profile}")
4366
+ print(f" user-type: {opts.user_type or '(none)'}")
4367
+ print(f" scope: {opts.scope or ('global' if opts.global_install else 'auto')}")
4368
+ print(f" tools: {opts.tools or 'all'}")
4369
+ print(f" target: {target}")
4370
+ print(f" minimal: {opts.minimal}")
4371
+ print(f" force: {opts.force}")
4372
+ print(f" offline: {opts.offline}")
4373
+ if will_launch:
4374
+ print(" wizard: Would auto-launch (pass --no-ui to suppress).")
4375
+ else:
4376
+ print(f" wizard: Suppressed ({why_not}).")
4377
+ print()
4378
+ return 0
4379
+
4380
+
3630
4381
  # --- Main ---
3631
4382
 
4383
+ def _apply_payload_preview(payload: dict[str, Any], opts: argparse.Namespace) -> int:
4384
+ """Render a Phase 1.5 dry-run preview for a WizardApplyPayload.
4385
+
4386
+ Reads schema_version, lists tools / packs / settings keys, and
4387
+ exits 0 without spawning. Used by the wizard `/api/v1/wizard/apply`
4388
+ bridge to surface the apply diff before the maintainer commits.
4389
+ """
4390
+ schema_version = payload.get("schema_version", "<missing>")
4391
+ target = Path(
4392
+ opts.custom_path or opts.project or os.environ.get("PROJECT_ROOT") or os.getcwd()
4393
+ ).resolve()
4394
+ print()
4395
+ print("[apply-payload] Plan summary — no files written, no subprocesses spawned:")
4396
+ print(f" schema: {schema_version}")
4397
+ if schema_version == "wizard-v2":
4398
+ tools = payload.get("tools") or []
4399
+ packs = payload.get("packs") or []
4400
+ settings = payload.get("settings") or {}
4401
+ scope_to_project = bool(payload.get("scope_to_project_only", False))
4402
+ print(f" tools: {','.join(tools) if tools else '(none)'}")
4403
+ print(f" packs: {','.join(packs) if packs else '(base)'}")
4404
+ print(f" settings: {len(settings)} top-level key(s)")
4405
+ print(f" scope: {'project' if scope_to_project else 'global'}")
4406
+ elif schema_version == "installer-v1":
4407
+ ai_tools = payload.get("ai_tools") or []
4408
+ configs = payload.get("configs") or {}
4409
+ print(f" ai_tools: {','.join(ai_tools) if ai_tools else '(none)'}")
4410
+ print(f" configs: {len(configs)} tool config(s)")
4411
+ else:
4412
+ print(f" error: unsupported schema_version: {schema_version!r}")
4413
+ print()
4414
+ return 2
4415
+ print(f" target: {target}")
4416
+ print(f" dry_run: {bool(payload.get('dry_run', opts.dry_run))}")
4417
+ print()
4418
+ return 0
4419
+
4420
+
3632
4421
  def main(argv: list[str]) -> int:
3633
4422
  global QUIET
3634
4423
 
3635
4424
  opts = parse_options(argv)
3636
4425
  QUIET = opts.quiet
3637
4426
 
4427
+ # road-to-global-only-install § Phase 1.5 — Wizard Apply bridge.
4428
+ # When --apply-payload <path> is supplied, read the WizardApplyPayload
4429
+ # JSON, validate schema_version, and (for dry-run) print a preview
4430
+ # block. The bridge calls install.py with `--dry-run` set, so the
4431
+ # short-circuit below this block keeps the run side-effect-free.
4432
+ if getattr(opts, "apply_payload", None):
4433
+ payload_path = Path(opts.apply_payload).resolve()
4434
+ if not payload_path.is_file():
4435
+ fail(f"--apply-payload path not found: {payload_path}")
4436
+ try:
4437
+ payload = json.loads(payload_path.read_text(encoding="utf-8"))
4438
+ except json.JSONDecodeError as exc:
4439
+ fail(f"--apply-payload JSON parse error: {exc}")
4440
+ if not isinstance(payload, dict):
4441
+ fail("--apply-payload root must be a JSON object")
4442
+ schema_version = payload.get("schema_version")
4443
+ if schema_version not in ("wizard-v2", "installer-v1"):
4444
+ fail(
4445
+ f"--apply-payload schema_version must be 'wizard-v2' or "
4446
+ f"'installer-v1', got {schema_version!r}"
4447
+ )
4448
+ # Translate payload → opts so the dry-run / real-install path
4449
+ # downstream sees the same shape it would from CLI flags. Only
4450
+ # dry-run preview is wired in Phase 1.5; real apply lands in a
4451
+ # follow-up minor (kill-switch via package version per D7).
4452
+ if schema_version == "wizard-v2":
4453
+ tools = payload.get("tools") or []
4454
+ if isinstance(tools, list) and tools:
4455
+ opts.tools = ",".join(t for t in tools if isinstance(t, str))
4456
+ if bool(payload.get("scope_to_project_only", False)):
4457
+ opts.scope = "project"
4458
+ else:
4459
+ opts.scope = "global"
4460
+ elif schema_version == "installer-v1":
4461
+ ai_tools = payload.get("ai_tools") or []
4462
+ if isinstance(ai_tools, list) and ai_tools:
4463
+ opts.tools = ",".join(t for t in ai_tools if isinstance(t, str))
4464
+ # Payload dry_run wins over CLI when explicitly set true.
4465
+ if bool(payload.get("dry_run", False)):
4466
+ opts.dry_run = True
4467
+ if opts.dry_run:
4468
+ return _apply_payload_preview(payload, opts)
4469
+ # Real-apply path through the payload bridge is gated by the
4470
+ # follow-up minor (Phase 1.9). Until then, fail loudly so the
4471
+ # caller knows they need --dry-run.
4472
+ fail(
4473
+ "--apply-payload without --dry-run is not yet wired "
4474
+ "(road-to-global-only-install § Phase 1.5 ships dry-run only)."
4475
+ )
4476
+
3638
4477
  # --offline: propagate via env so child subprocesses (versions /
3639
4478
  # update / check_update_banner) honor the air-gap guarantee
3640
4479
  # without each one needing its own flag. AGENT_CONFIG_NO_UPDATE_CHECK
@@ -3647,6 +4486,24 @@ def main(argv: list[str]) -> int:
3647
4486
  if opts.profile not in SUPPORTED_PROFILES:
3648
4487
  fail(f"Unsupported profile: {opts.profile}. Supported: {', '.join(SUPPORTED_PROFILES)}")
3649
4488
 
4489
+ # Dry-run short-circuit (Council Tier 2 § 9): print a plan summary
4490
+ # and exit 0 before any filesystem write or subprocess spawn.
4491
+ # Distinct from the internal `--dry-run` strings passed to
4492
+ # alias-resolution sub-invocations elsewhere in this file.
4493
+ if getattr(opts, "dry_run", False):
4494
+ return _dry_run_summary(opts)
4495
+
4496
+ # Wizard auto-launch decision banner (Council Tier 2 § 8): print
4497
+ # the gate verdict BEFORE the install runs so the user knows what
4498
+ # will happen at the tail without having to wait through every
4499
+ # bridge write to find out.
4500
+ will_launch, why_not = _wizard_should_launch(opts)
4501
+ if will_launch:
4502
+ if not QUIET:
4503
+ info("Setup wizard will launch automatically after install.")
4504
+ elif not QUIET:
4505
+ info(f"Setup wizard auto-launch disabled ({why_not}).")
4506
+
3650
4507
  # Minimal-init short-circuit (Step 7 Phase 2): bypass scope
3651
4508
  # detection, conflict policy, and the full bridge install. Writes
3652
4509
  # only the project-local override layer (agents/.gitkeep +
@@ -3674,6 +4531,7 @@ def main(argv: list[str]) -> int:
3674
4531
  detected, detect_reason = detect_scope(detect_root)
3675
4532
  custom_path: Path | None = Path(opts.custom_path).resolve() if opts.custom_path else None
3676
4533
  scope = _resolve_scope(opts, detected, detect_reason, custom_path)
4534
+ _enforce_consumer_global_only(scope)
3677
4535
 
3678
4536
  # Scope validation runs before filesystem / package detection so
3679
4537
  # --tools=X / --scope conflicts fail fast with a directive error
@@ -3693,6 +4551,14 @@ def main(argv: list[str]) -> int:
3693
4551
 
3694
4552
  try:
3695
4553
  if scope == "global":
4554
+ # Phase 5.2 — first-run hook: when legacy artefacts live in the
4555
+ # project tree, prompt before laying down the global surface so
4556
+ # the user is not left with a dual-stack install.
4557
+ artefacts = _detect_legacy_for_migration(detect_root)
4558
+ if artefacts and _prompt_migrate_to_global(detect_root, artefacts):
4559
+ rc = _run_migrate_to_global(detect_root)
4560
+ if rc != 0:
4561
+ return rc
3696
4562
  # Pass detect_root so the manifest refresh runs when --global is
3697
4563
  # invoked from within a project tree (ADR-008 Phase 3.2).
3698
4564
  return install_global(parsed_tools, opts.force, project_root=detect_root)
@@ -3861,6 +4727,15 @@ def _main_project_install(
3861
4727
  else:
3862
4728
  print(" Re-run complete. Walkthrough: https://github.com/event4u-app/agent-config/blob/main/docs/getting-started.md")
3863
4729
  print()
4730
+
4731
+ # Wizard auto-launch (Phase 6 follow-up). Runs after the success
4732
+ # banner so the user sees install completion even if the wizard
4733
+ # boot times out. Gate was already evaluated at the top of main()
4734
+ # for the pre-install banner; re-check here so the supervisor
4735
+ # logic stays the single source of truth.
4736
+ will_launch, _ = _wizard_should_launch(opts)
4737
+ if will_launch:
4738
+ return _wizard_spawn(project_root)
3864
4739
  return 0
3865
4740
 
3866
4741