@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
@@ -15,8 +15,11 @@ import sys
15
15
  from pathlib import Path
16
16
 
17
17
  ROOT = Path(__file__).resolve().parent.parent
18
+ # ADR-017: rules now live across multiple source roots. Legacy
19
+ # .agent-src.uncompressed/rules/ is kept as a fallback for the
20
+ # pure-compressed consumer projection.
18
21
  RULES_DIR = ROOT / ".agent-src.uncompressed" / "rules"
19
- OUT_PATH = ROOT / "router.json"
22
+ OUT_PATH = ROOT / "dist" / "router.json"
20
23
  SETTINGS_PATH = ROOT / ".agent-settings.yml"
21
24
  SCHEMA_VERSION = 1
22
25
 
@@ -116,11 +119,39 @@ def _load_settings() -> dict:
116
119
  return load_agent_settings(project_path=SETTINGS_PATH)
117
120
 
118
121
 
122
+ def _iter_rule_files() -> list[Path]:
123
+ """Walk every source root for rule files. First root wins per id."""
124
+ try:
125
+ from scripts._lib.agent_src import artefact_roots # type: ignore
126
+ except ImportError:
127
+ import sys as _sys
128
+ from pathlib import Path as _Path
129
+ _sys.path.insert(0, str(_Path(__file__).resolve().parent))
130
+ from _lib.agent_src import artefact_roots # type: ignore[import-not-found]
131
+
132
+ seen: dict[str, Path] = {}
133
+ roots = artefact_roots()
134
+ if not roots:
135
+ # Pure-compressed fallback for consumer projections that vendor
136
+ # the flat .agent-src/ tree without sources.
137
+ if RULES_DIR.exists():
138
+ for path in sorted(RULES_DIR.glob("*.md")):
139
+ seen.setdefault(path.stem, path)
140
+ else:
141
+ for src_root in roots:
142
+ rd = src_root / "rules"
143
+ if not rd.exists():
144
+ continue
145
+ for path in sorted(rd.glob("*.md")):
146
+ seen.setdefault(path.stem, path)
147
+ return [seen[k] for k in sorted(seen)]
148
+
149
+
119
150
  def _collect(rules_dir: Path) -> dict:
120
151
  settings = _load_settings()
121
152
  kernel: list[str] = []
122
153
  tiered: dict[str, list[dict]] = {"tier-1": [], "tier-2": []}
123
- for path in sorted(rules_dir.glob("*.md")):
154
+ for path in _iter_rule_files():
124
155
  fm = _parse_frontmatter(path.read_text(encoding="utf-8"))
125
156
  if not fm:
126
157
  continue
@@ -172,6 +203,7 @@ def main(argv: list[str]) -> int:
172
203
  return 1
173
204
  print("✅ router.json is up to date")
174
205
  return 0
206
+ OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
175
207
  OUT_PATH.write_text(text, encoding="utf-8")
176
208
  counts = (len(out["kernel"]), len(out["tier_1"]), len(out["tier_2"]))
177
209
  print(f"✅ router.json — kernel={counts[0]} tier-1={counts[1]} tier-2={counts[2]}")
@@ -32,14 +32,43 @@ import yaml
32
32
 
33
33
  sys.path.insert(0, str(Path(__file__).resolve().parent))
34
34
  from _lib.script_output import info, success, flush_summary, resolve_level # noqa: E402
35
+ from _lib.agent_src import ( # noqa: E402
36
+ artefact_roots,
37
+ iter_all_sources,
38
+ resolve_logical,
39
+ )
35
40
 
36
41
  PROJECT_ROOT = Path(__file__).resolve().parent.parent
42
+ # Legacy single-root anchor — kept for backward compatibility with callers
43
+ # that pass it explicitly. Multi-root iteration (post-ADR-017 physical
44
+ # move) goes through `_lib.agent_src` helpers.
37
45
  SOURCE_DIR = PROJECT_ROOT / ".agent-src.uncompressed"
38
46
  TARGET_DIR = PROJECT_ROOT / ".agent-src"
39
47
  AUGMENT_DIR = PROJECT_ROOT / ".augment"
40
48
  HASH_FILE = PROJECT_ROOT / ".compression-hashes.json"
41
49
  SETTINGS_FILE = PROJECT_ROOT / ".agent-settings.yml"
42
50
 
51
+
52
+ def _iter_sources():
53
+ """Yield (physical_path, logical_relpath) for every source artefact.
54
+
55
+ Wraps `_lib.agent_src.iter_all_sources` so the compressor walks every
56
+ active source root (legacy `.agent-src.uncompressed/` plus any
57
+ `packages/*/.agent-src.uncompressed/`) and keys outputs by the
58
+ logical relative path that survives the physical move (ADR-017).
59
+ """
60
+ yield from iter_all_sources()
61
+
62
+
63
+ def _resolve_source(relative: str) -> Path | None:
64
+ """Find the physical path that backs a logical relative path."""
65
+ return resolve_logical(relative)
66
+
67
+
68
+ def _any_source_root_exists() -> bool:
69
+ """True if at least one artefact source root contains files."""
70
+ return bool(artefact_roots())
71
+
43
72
  # Self-projection tool toggle — see .agent-tools.yml. When the file is
44
73
  # absent (e.g. tests run in tmp dirs, consumer projects), `_active_tools`
45
74
  # returns ``None`` which is treated as "emit every tool".
@@ -148,8 +177,8 @@ def mark_done(relative_path: str) -> None:
148
177
  relative paths in the shipped layer (P1 of road-to-path-fixes.md).
149
178
  Idempotent — re-running is a no-op.
150
179
  """
151
- source_file = SOURCE_DIR / relative_path
152
- if not source_file.exists():
180
+ source_file = _resolve_source(relative_path)
181
+ if source_file is None or not source_file.exists():
153
182
  print(f"❌ Source file not found: {relative_path}")
154
183
  sys.exit(1)
155
184
  apply_path_rewriter(relative_path)
@@ -181,12 +210,9 @@ def mark_all_done() -> None:
181
210
  """Mark ALL .md files as compressed (e.g. after initial full compression)."""
182
211
  hashes = load_hashes()
183
212
  count = 0
184
- for source_file in sorted(SOURCE_DIR.rglob("*")):
185
- if source_file.is_dir():
186
- continue
213
+ for source_file, relative in _iter_sources():
187
214
  if not should_compress(source_file):
188
215
  continue
189
- relative = str(source_file.relative_to(SOURCE_DIR))
190
216
  hashes[relative] = file_hash(source_file)
191
217
  count += 1
192
218
  save_hashes(hashes)
@@ -194,15 +220,17 @@ def mark_all_done() -> None:
194
220
 
195
221
 
196
222
  def list_changed_md(source_dir: Path) -> list:
197
- """List .md files whose source hash differs from stored hash (= need recompression)."""
223
+ """List .md files whose source hash differs from stored hash (= need recompression).
224
+
225
+ The ``source_dir`` parameter is retained for backward compatibility but
226
+ ignored — iteration walks every active source root (ADR-017).
227
+ """
228
+ del source_dir # multi-root: ignored, kept for signature stability
198
229
  hashes = load_hashes()
199
230
  changed = []
200
- for source_file in sorted(source_dir.rglob("*")):
201
- if source_file.is_dir():
202
- continue
231
+ for source_file, relative in _iter_sources():
203
232
  if not should_compress(source_file):
204
233
  continue
205
- relative = str(source_file.relative_to(source_dir))
206
234
  current_hash = file_hash(source_file)
207
235
  stored_hash = hashes.get(relative)
208
236
  if stored_hash != current_hash:
@@ -211,12 +239,12 @@ def list_changed_md(source_dir: Path) -> list:
211
239
 
212
240
 
213
241
  def find_stale_hashes(source_dir: Path) -> list:
214
- """Find hashes stored for source files that no longer exist."""
242
+ """Find hashes stored for source files that no longer exist in any root."""
243
+ del source_dir # multi-root: ignored, kept for signature stability
215
244
  hashes = load_hashes()
216
245
  stale = []
217
246
  for relative in sorted(hashes.keys()):
218
- source_file = source_dir / relative
219
- if not source_file.exists():
247
+ if _resolve_source(relative) is None:
220
248
  stale.append(relative)
221
249
  return stale
222
250
 
@@ -240,10 +268,16 @@ def should_compress(filepath: Path) -> bool:
240
268
  return False
241
269
  if filepath.name in COPY_AS_IS:
242
270
  return False
243
- try:
244
- rel_parts = filepath.relative_to(SOURCE_DIR).parts
245
- except ValueError:
246
- rel_parts = filepath.parts
271
+ # Determine the logical relative path so the COPY_AS_IS_DIRS check
272
+ # works for both legacy (`.agent-src.uncompressed/`) and post-move
273
+ # (`packages/*/.agent-src.uncompressed/`) source roots.
274
+ rel_parts: tuple[str, ...] = filepath.parts
275
+ for root in artefact_roots():
276
+ try:
277
+ rel_parts = filepath.relative_to(root).parts
278
+ break
279
+ except ValueError:
280
+ continue
247
281
  if rel_parts and rel_parts[0] in COPY_AS_IS_DIRS:
248
282
  return False
249
283
  return True
@@ -256,7 +290,8 @@ def copy_file(source: Path, target: Path) -> None:
256
290
 
257
291
 
258
292
  def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
259
- """Delete files in target that don't exist in source. Returns count."""
293
+ """Delete files in target that don't exist in any source root. Returns count."""
294
+ del source_dir # multi-root: ignored, kept for signature stability
260
295
  deleted = 0
261
296
  if not target_dir.exists():
262
297
  return 0
@@ -265,8 +300,7 @@ def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
265
300
  if target_file.is_dir():
266
301
  continue
267
302
  relative = target_file.relative_to(target_dir)
268
- source_file = source_dir / relative
269
- if not source_file.exists():
303
+ if _resolve_source(str(relative)) is None:
270
304
  print(f" Deleting stale: {relative}")
271
305
  target_file.unlink()
272
306
  deleted += 1
@@ -281,14 +315,17 @@ def cleanup_stale(source_dir: Path, target_dir: Path) -> int:
281
315
 
282
316
 
283
317
  def sync_non_md(source_dir: Path, target_dir: Path) -> int:
284
- """Copy all non-.md files (and COPY_AS_IS .md files) from source to target. Returns count."""
318
+ """Copy all non-.md files (and COPY_AS_IS .md files) from every source
319
+ root to target. Returns count."""
320
+ del source_dir # multi-root: ignored, kept for signature stability
285
321
  copied = 0
286
- for source_file in sorted(source_dir.rglob("*")):
287
- if source_file.is_dir():
288
- continue
322
+ seen: set[str] = set()
323
+ for source_file, relative in _iter_sources():
289
324
  if should_compress(source_file):
290
325
  continue # .md files are compressed by the agent, not copied here
291
- relative = source_file.relative_to(source_dir)
326
+ if relative in seen:
327
+ continue
328
+ seen.add(relative)
292
329
  target_file = target_dir / relative
293
330
  copy_file(source_file, target_file)
294
331
  print(f" Copied: {relative}")
@@ -298,36 +335,41 @@ def sync_non_md(source_dir: Path, target_dir: Path) -> int:
298
335
 
299
336
  def list_md_files(source_dir: Path) -> list:
300
337
  """List all .md files that need compression by the agent."""
301
- files = []
302
- for source_file in sorted(source_dir.rglob("*")):
303
- if source_file.is_dir():
338
+ del source_dir # multi-root: ignored, kept for signature stability
339
+ files: list[str] = []
340
+ seen: set[str] = set()
341
+ for source_file, relative in _iter_sources():
342
+ if not should_compress(source_file):
304
343
  continue
305
- if should_compress(source_file):
306
- files.append(str(source_file.relative_to(source_dir)))
307
- return files
344
+ if relative in seen:
345
+ continue
346
+ seen.add(relative)
347
+ files.append(relative)
348
+ return sorted(files)
308
349
 
309
350
 
310
351
  def check_sync(source_dir: Path, target_dir: Path) -> tuple:
311
- """Check if target is in sync with source. Returns (missing, stale) lists."""
352
+ """Check if target is in sync with source(s). Returns (missing, stale) lists."""
353
+ del source_dir # multi-root: ignored, kept for signature stability
312
354
  missing = []
313
355
  stale = []
314
356
 
315
- # Files in source but not in target
316
- for source_file in sorted(source_dir.rglob("*")):
317
- if source_file.is_dir():
357
+ # Files in any source root but not in target
358
+ seen: set[str] = set()
359
+ for _source_file, relative in _iter_sources():
360
+ if relative in seen:
318
361
  continue
319
- relative = str(source_file.relative_to(source_dir))
362
+ seen.add(relative)
320
363
  if not (target_dir / relative).exists():
321
364
  missing.append(relative)
322
365
 
323
- # Files in target but not in source (stale)
366
+ # Files in target but not in any source root (stale)
324
367
  if target_dir.exists():
325
368
  for target_file in sorted(target_dir.rglob("*")):
326
369
  if target_file.is_dir():
327
370
  continue
328
371
  relative = str(target_file.relative_to(target_dir))
329
-
330
- if not (source_dir / relative).exists():
372
+ if _resolve_source(relative) is None:
331
373
  stale.append(relative)
332
374
 
333
375
  return missing, stale
@@ -512,11 +554,80 @@ def _rewrite_body_links(body: str, prefix: str) -> str:
512
554
  return _BODY_DOCS_RE.sub(prefix + r"\1", body)
513
555
 
514
556
 
557
+ # ── Human-review banner injection (Phase 5.3 / ADR-018) ───────────────────
558
+ # Source artefacts may set `trust.human_review_required: true` in their
559
+ # frontmatter. The compressor injects a short, parser-stable banner block
560
+ # at the top of the projected body so every downstream surface (agent
561
+ # memory, .augment, .claude, etc.) surfaces the gate. Idempotent — the
562
+ # marker comment prevents double-injection on re-compress.
563
+
564
+ _HRR_BANNER_MARKER = "<!-- agent-config:human-review-banner -->"
565
+
566
+ # Plain YAML list item — any scalar, used to read `packs:` / `workspaces:`
567
+ # blocks where values are bare identifiers, not file paths.
568
+ _FM_PLAIN_LIST_RE = re.compile(r'^\s*-\s*(["\']?)([^"\'\n]+?)\1\s*$')
569
+
570
+
571
+ def _parse_trust_and_owner(fm_lines):
572
+ """Extract `trust.level`, `human_review_required`, and an owner hint
573
+ from a frontmatter line list. Owner falls back to the first pack
574
+ prefix (`finance-basic` → `finance`), then the first workspace,
575
+ then `unknown`.
576
+ """
577
+ level = None
578
+ hrr = False
579
+ packs: list[str] = []
580
+ workspaces: list[str] = []
581
+ in_trust = False
582
+ in_packs = False
583
+ in_workspaces = False
584
+ for line in fm_lines:
585
+ stripped = line.lstrip()
586
+ indent = len(line) - len(stripped)
587
+ if indent == 0 and stripped.endswith(":"):
588
+ key = stripped[:-1]
589
+ in_trust = key == "trust"
590
+ in_packs = key == "packs"
591
+ in_workspaces = key == "workspaces"
592
+ continue
593
+ if in_trust and stripped.startswith("level:"):
594
+ level = stripped.split(":", 1)[1].strip().strip('"').strip("'")
595
+ elif in_trust and stripped.startswith("human_review_required:"):
596
+ val = stripped.split(":", 1)[1].strip()
597
+ hrr = val.lower() == "true"
598
+ elif in_packs or in_workspaces:
599
+ m = _FM_PLAIN_LIST_RE.match(line)
600
+ if m:
601
+ value = m.group(2).strip()
602
+ (packs if in_packs else workspaces).append(value)
603
+ owner = "unknown"
604
+ if packs:
605
+ owner = packs[0].split("-")[0]
606
+ elif workspaces:
607
+ owner = workspaces[0]
608
+ return level, hrr, owner
609
+
610
+
611
+ def _inject_hrr_banner(body: str, level: str, owner: str) -> str:
612
+ """Prepend the HUMAN_REVIEW banner block to `body`. Idempotent — a
613
+ body that already carries `_HRR_BANNER_MARKER` is returned unchanged.
614
+ """
615
+ if _HRR_BANNER_MARKER in body:
616
+ return body
617
+ banner = (
618
+ f"{_HRR_BANNER_MARKER}\n"
619
+ f"> HUMAN REVIEW REQUIRED · trust: {level} · owner: {owner}\n\n"
620
+ )
621
+ return banner + body.lstrip("\n")
622
+
623
+
515
624
  def _rewrite_paths(content: str, source_relative_path: str) -> str:
516
625
  """Rewrite logical / legacy paths in `content` for a file shipped at
517
626
  `.agent-src/{source_relative_path}`. Idempotent.
518
627
 
519
628
  See module-level comment above for the full pattern catalog.
629
+ Also injects the HUMAN_REVIEW banner when the source frontmatter
630
+ sets `trust.human_review_required: true` (Phase 5.3 / ADR-018).
520
631
  """
521
632
  prefix = _depth_prefix(source_relative_path)
522
633
  fm_lines, body = _split_frontmatter(content)
@@ -524,6 +635,9 @@ def _rewrite_paths(content: str, source_relative_path: str) -> str:
524
635
  if fm_lines is None:
525
636
  return body
526
637
  new_fm = _rewrite_frontmatter_lines(fm_lines, prefix)
638
+ level, hrr, owner = _parse_trust_and_owner(fm_lines)
639
+ if hrr and level:
640
+ body = _inject_hrr_banner(body, level, owner)
527
641
  return "---\n" + "\n".join(new_fm) + "\n---\n" + body
528
642
 
529
643
 
@@ -1096,8 +1210,11 @@ def clean_tools() -> None:
1096
1210
 
1097
1211
 
1098
1212
  def main() -> None:
1099
- if not SOURCE_DIR.exists():
1100
- print(f"❌ Source directory not found: {SOURCE_DIR}")
1213
+ # Multi-root awareness (ADR-017): tolerate a missing legacy
1214
+ # `.agent-src.uncompressed/` as long as at least one package-scoped
1215
+ # source root carries artefacts.
1216
+ if not SOURCE_DIR.exists() and not _any_source_root_exists():
1217
+ print(f"❌ No source directory found (looked at {SOURCE_DIR} and packages/*/.agent-src.uncompressed)")
1101
1218
  sys.exit(1)
1102
1219
 
1103
1220
  arg = sys.argv[1] if len(sys.argv) > 1 else "--sync"
@@ -1149,9 +1266,10 @@ def main() -> None:
1149
1266
  copied = sync_non_md(SOURCE_DIR, TARGET_DIR)
1150
1267
  print(f"\n--- Cleanup stale files ---")
1151
1268
  deleted = cleanup_stale(SOURCE_DIR, TARGET_DIR)
1152
- # Also cleanup stale hashes
1269
+ # Also cleanup stale hashes (multi-root aware — resolve against
1270
+ # every artefact root, not just the legacy SOURCE_DIR).
1153
1271
  hashes = load_hashes()
1154
- stale_keys = [k for k in hashes if not (SOURCE_DIR / k).exists()]
1272
+ stale_keys = [k for k in hashes if _resolve_source(k) is None]
1155
1273
  for k in stale_keys:
1156
1274
  del hashes[k]
1157
1275
  if stale_keys:
@@ -93,7 +93,25 @@ def _load_yaml(path: Path) -> dict[str, Any]:
93
93
 
94
94
 
95
95
  def _preset_file(project_root: Path, preset_id: str) -> Path:
96
- return project_root / PRESETS_DIRNAME / f"{preset_id}.yml"
96
+ # Legacy single-root layout honor when present so tests that mock a
97
+ # ``.agent-src.uncompressed/`` sub-tree under ``project_root`` keep working.
98
+ legacy = project_root / PRESETS_DIRNAME / f"{preset_id}.yml"
99
+ if legacy.exists():
100
+ return legacy
101
+ # Monorepo layout — scan every package root via the agent_src helper.
102
+ try:
103
+ import sys as _sys
104
+ scripts_root = Path(__file__).resolve().parents[1]
105
+ if str(scripts_root) not in _sys.path:
106
+ _sys.path.insert(0, str(scripts_root))
107
+ from _lib.agent_src import artefact_roots # type: ignore
108
+ except Exception:
109
+ return legacy
110
+ for root in artefact_roots():
111
+ candidate = root / "presets" / f"{preset_id}.yml"
112
+ if candidate.exists():
113
+ return candidate
114
+ return legacy
97
115
 
98
116
 
99
117
  def _coerce_scalar(raw: str) -> Any:
@@ -89,7 +89,22 @@ def _load_yaml(path: Path) -> dict[str, Any]:
89
89
 
90
90
 
91
91
  def _profile_file(project_root: Path, profile_id: str) -> Path:
92
- return project_root / PROFILES_DIRNAME / f"{profile_id}.yml"
92
+ legacy = project_root / PROFILES_DIRNAME / f"{profile_id}.yml"
93
+ if legacy.exists():
94
+ return legacy
95
+ try:
96
+ import sys as _sys
97
+ scripts_root = Path(__file__).resolve().parents[1]
98
+ if str(scripts_root) not in _sys.path:
99
+ _sys.path.insert(0, str(scripts_root))
100
+ from _lib.agent_src import artefact_roots # type: ignore
101
+ except Exception:
102
+ return legacy
103
+ for root in artefact_roots():
104
+ candidate = root / "profiles" / f"{profile_id}.yml"
105
+ if candidate.exists():
106
+ return candidate
107
+ return legacy
93
108
 
94
109
 
95
110
  def _build_resolved(
@@ -6,7 +6,7 @@ freshness threshold, the 3-failure stop, and tool-loop detection. The
6
6
  agent's job shrinks from "remember three counters" to "read this file
7
7
  before responding".
8
8
 
9
- Output: `agents/state/context-hygiene.json`
9
+ Output: `agents/runtime/state/context-hygiene.json`
10
10
  {
11
11
  "tool_calls": <int>, // running PostToolUse count
12
12
  "consecutive_same_tool": <int>, // includes the latest call
@@ -31,7 +31,7 @@ import sys
31
31
  from pathlib import Path
32
32
 
33
33
  # Re-use the shared atomic-write helper so concerns honour the single
34
- # `agents/state/.dispatcher.lock` discipline (hook-architecture-v1.md
34
+ # `agents/runtime/state/.dispatcher.lock` discipline (hook-architecture-v1.md
35
35
  # § Concurrency, Phase 7.4).
36
36
  sys.path.insert(0, str(Path(__file__).resolve().parent))
37
37
  from hooks.state_io import atomic_write_json # noqa: E402
@@ -24,15 +24,15 @@ import yaml
24
24
 
25
25
  REPO_ROOT = Path(__file__).resolve().parents[1]
26
26
  SETTINGS_FILE = REPO_ROOT / ".agent-settings.yml"
27
- AI_COUNCIL_FILE = REPO_ROOT / "agents" / ".ai-council.yml"
27
+ AI_COUNCIL_FILE = REPO_ROOT / "agents" / "settings" / ".ai-council.yml"
28
28
 
29
29
  # Canonical output dirs per ai-council § "Output path convention".
30
30
  # Enforced at write-time by `_validate_council_output_path` so shell-side
31
31
  # `>` redirects and forgetful agents can't strand artefacts at agents/ root.
32
32
  COUNCIL_CANONICAL_DIRS: dict[str, str] = {
33
- "responses": "agents/council-responses",
34
- "sessions": "agents/council-sessions",
35
- "questions": "agents/council-questions",
33
+ "responses": "agents/runtime/council/responses",
34
+ "sessions": "agents/runtime/council/sessions",
35
+ "questions": "agents/runtime/council/questions",
36
36
  }
37
37
 
38
38
 
@@ -139,7 +139,7 @@ def load_settings(
139
139
  ``load_agent_settings``. ``ai_council.*`` keys are not whitelisted,
140
140
  so the project file remains authoritative for council config.
141
141
 
142
- Step-2 council-redesign overlay: when ``agents/.ai-council.yml``
142
+ Step-2 council-redesign overlay: when ``agents/settings/.ai-council.yml``
143
143
  exists it is the single source of truth — the validated config is
144
144
  synthesized back into ``settings['ai_council']`` and wins over any
145
145
  legacy block in ``.agent-settings.yml``. The pre-2 path stays alive
@@ -478,7 +478,7 @@ def _construct_api_member(
478
478
  """Build an api-mode client for a known provider name.
479
479
 
480
480
  ``api_key_ref`` carries the validated ``file:<path>`` / ``env:<VAR>``
481
- reference from ``agents/.ai-council.yml`` and is resolved lazily here
481
+ reference from ``agents/settings/.ai-council.yml`` and is resolved lazily here
482
482
  so the council does not require keys for disabled providers. When
483
483
  ``api_key_ref`` is ``None`` (no new config yet, or legacy code path),
484
484
  fall back to the per-provider loaders so the pre-step-2
@@ -500,7 +500,7 @@ def _construct_api_member(
500
500
  if name == "gemini":
501
501
  if not api_key_ref:
502
502
  raise CouncilDisabledError(
503
- "member 'gemini' requires api_key_ref in agents/.ai-council.yml "
503
+ "member 'gemini' requires api_key_ref in agents/settings/.ai-council.yml "
504
504
  "(e.g. `env:GEMINI_API_KEY`) — no legacy fallback."
505
505
  )
506
506
  api_key = resolve_api_key(api_key_ref, scope="ai_council.members.gemini")
@@ -508,7 +508,7 @@ def _construct_api_member(
508
508
  if name == "xai":
509
509
  if not api_key_ref:
510
510
  raise CouncilDisabledError(
511
- "member 'xai' requires api_key_ref in agents/.ai-council.yml "
511
+ "member 'xai' requires api_key_ref in agents/settings/.ai-council.yml "
512
512
  "(e.g. `env:XAI_API_KEY`) — no legacy fallback."
513
513
  )
514
514
  api_key = resolve_api_key(api_key_ref, scope="ai_council.members.xai")
@@ -516,7 +516,7 @@ def _construct_api_member(
516
516
  if name == "perplexity":
517
517
  if not api_key_ref:
518
518
  raise CouncilDisabledError(
519
- "member 'perplexity' requires api_key_ref in agents/.ai-council.yml "
519
+ "member 'perplexity' requires api_key_ref in agents/settings/.ai-council.yml "
520
520
  "(e.g. `env:PERPLEXITY_API_KEY`) — no legacy fallback."
521
521
  )
522
522
  api_key = resolve_api_key(api_key_ref, scope="ai_council.members.perplexity")
@@ -794,7 +794,7 @@ def _peer_review_active(ai_cfg: dict[str, Any], args: argparse.Namespace) -> boo
794
794
  Resolution chain (highest priority first):
795
795
  1. ``--peer-review`` CLI flag — explicit opt-in.
796
796
  2. ``ai_council.peer_review.enabled: true`` in
797
- ``agents/.ai-council.yml`` — opt-in via config.
797
+ ``agents/settings/.ai-council.yml`` — opt-in via config.
798
798
  Both default to false; peer-review is opt-in by R2 verdict.
799
799
  """
800
800
  if getattr(args, "peer_review", False):
@@ -1037,7 +1037,7 @@ def _emit_debate_estimate(
1037
1037
  if requested > max_rounds_cap:
1038
1038
  raise argparse.ArgumentTypeError(
1039
1039
  f"--rounds={requested} exceeds debate_max_rounds={max_rounds_cap}; "
1040
- f"raise the cap in agents/.ai-council.yml or lower --rounds."
1040
+ f"raise the cap in agents/settings/.ai-council.yml or lower --rounds."
1041
1041
  )
1042
1042
  rounds = requested
1043
1043
  per_round_usd = sum(e.total_usd for e in estimates)
@@ -1424,7 +1424,7 @@ def _debate_refusal_cap(
1424
1424
  def _emit_shadow_slo_banner() -> None:
1425
1425
  """Pre-flight SLO banner for solo-dispatch invocations (step-9 P10).
1426
1426
 
1427
- Reads ``agents/council-shadow-log.jsonl`` and prints the 7-day rolling
1427
+ Reads ``agents/runtime/council/shadow-log.jsonl`` and prints the 7-day rolling
1428
1428
  disagreement rate. ``OK``, ``WARN``, ``BREACH`` are all surfaced so the
1429
1429
  user can see when single-member quality is drifting. Never auto-flips
1430
1430
  back to full council \u2014 visibility-first, action-second (D10).
@@ -1444,7 +1444,7 @@ def _apply_solo_dispatch(
1444
1444
  ) -> tuple[list[ExternalAIClient], str | None]:
1445
1445
  """Filter ``members`` to a single solo-dispatch pick (step-9 P9).
1446
1446
 
1447
- Loads the routing chain from ``agents/.ai-council.yml`` and asks
1447
+ Loads the routing chain from ``agents/settings/.ai-council.yml`` and asks
1448
1448
  :func:`select_solo_member` for the first chain entry whose member
1449
1449
  is runtime-present. The probe is conservative: a member counts as
1450
1450
  auth-valid iff ``build_members`` returned a runtime client for it
@@ -1596,7 +1596,7 @@ def cmd_run(
1596
1596
  # Phase 8 step 5 — opt-in cost disclosure for non-debate lenses.
1597
1597
  # Default mode is "off" for analysis / default (cheap enough that
1598
1598
  # the disclosure is friction); users opt in by setting
1599
- # `lenses.<name>.cost_disclosure.mode` in agents/.ai-council.yml.
1599
+ # `lenses.<name>.cost_disclosure.mode` in agents/settings/.ai-council.yml.
1600
1600
  disc_mode, disc_threshold, disc_show = _resolve_cost_disclosure(
1601
1601
  ai_cfg, question.mode,
1602
1602
  )
@@ -1885,7 +1885,7 @@ def cmd_debate(
1885
1885
  if requested > max_rounds_cap:
1886
1886
  raise argparse.ArgumentTypeError(
1887
1887
  f"--rounds={requested} exceeds debate_max_rounds={max_rounds_cap}; "
1888
- f"raise the cap in agents/.ai-council.yml or lower --rounds."
1888
+ f"raise the cap in agents/settings/.ai-council.yml or lower --rounds."
1889
1889
  )
1890
1890
  rounds = requested
1891
1891
 
@@ -1942,7 +1942,7 @@ def cmd_debate(
1942
1942
  f"❌ council:debate refused · high-end estimate "
1943
1943
  f"${debate_estimate.high_usd:.4f} exceeds "
1944
1944
  f"debate.max_cost_usd=${cap:.2f}. Lower --rounds, drop "
1945
- f"members, or raise the cap in agents/.ai-council.yml.\n"
1945
+ f"members, or raise the cap in agents/settings/.ai-council.yml.\n"
1946
1946
  )
1947
1947
  return 4
1948
1948
 
@@ -2037,7 +2037,7 @@ def cmd_render(args: argparse.Namespace) -> int:
2037
2037
  Lens resolution order: explicit ``--prompt-mode`` > ``prompt_mode``
2038
2038
  in the payload > ``mode`` in the payload > ``None`` (default decision
2039
2039
  template). R4 Q4 escape hatch ``--prose-synthesis`` overrides the
2040
- table. ``--output`` writes to ``agents/council-sessions/`` (enforced);
2040
+ table. ``--output`` writes to ``agents/runtime/council/sessions/`` (enforced);
2041
2041
  omit it for stdout.
2042
2042
  """
2043
2043
  payload = json.loads(Path(args.responses).read_text(encoding="utf-8"))
@@ -2258,7 +2258,7 @@ def _add_common_input_args(p: argparse.ArgumentParser) -> None:
2258
2258
  "(anonymised) responses for blind spots before "
2259
2259
  "synthesis. Adds N extra API calls. Opt-in per the "
2260
2260
  "R2 verdict; also accepts ai_council.peer_review."
2261
- "enabled: true in agents/.ai-council.yml.")
2261
+ "enabled: true in agents/settings/.ai-council.yml.")
2262
2262
 
2263
2263
 
2264
2264
  def cmd_shadow_report(args: argparse.Namespace) -> int:
@@ -2405,7 +2405,7 @@ def build_parser() -> argparse.ArgumentParser:
2405
2405
  help="Required to actually start the debate.")
2406
2406
  p_deb.add_argument("--rounds", type=int, default=None,
2407
2407
  help="Number of debate rounds (default 2). Capped by "
2408
- "ai_council.debate_max_rounds in agents/.ai-council.yml.")
2408
+ "ai_council.debate_max_rounds in agents/settings/.ai-council.yml.")
2409
2409
  p_deb.add_argument("--auto-continue", action="store_true",
2410
2410
  default=False, dest="auto_continue",
2411
2411
  help="Skip the between-round y/N prompt. The hard cap "
@@ -2441,7 +2441,7 @@ def build_parser() -> argparse.ArgumentParser:
2441
2441
  "to the `mode` recorded in the responses JSON.")
2442
2442
  p_ren.add_argument("--output", default=None,
2443
2443
  help="Write the rendered markdown to a file under "
2444
- "agents/council-sessions/ (enforced). Omit for "
2444
+ "agents/runtime/council/sessions/ (enforced). Omit for "
2445
2445
  "stdout. Prefer this over shell redirects so "
2446
2446
  "the canonical-path check fires at write-time.")
2447
2447
  _add_prose_synthesis_arg(p_ren)
@@ -2483,12 +2483,12 @@ def build_parser() -> argparse.ArgumentParser:
2483
2483
 
2484
2484
  p_sha = sub.add_parser(
2485
2485
  "shadow-report",
2486
- help="Read agents/council-shadow-log.jsonl and print the 7-day "
2486
+ help="Read agents/runtime/council/shadow-log.jsonl and print the 7-day "
2487
2487
  "rolling disagreement rate + SLO status (step-9 P10).",
2488
2488
  )
2489
2489
  p_sha.add_argument("--log", default=None,
2490
2490
  help="Path to the shadow log (default: "
2491
- "agents/council-shadow-log.jsonl).")
2491
+ "agents/runtime/council/shadow-log.jsonl).")
2492
2492
  p_sha.add_argument("--window-days", type=int, default=7,
2493
2493
  help="Rolling window in days (default: 7).")
2494
2494
 
@@ -4,9 +4,9 @@
4
4
  Deletes council files older than `ai_council.session_retention_days`
5
5
  (default 7) across all four artefact directories:
6
6
 
7
- - agents/council-sessions/ (timestamp subdirs + root files)
8
- - agents/council-questions/ (mtime-based)
9
- - agents/council-responses/ (mtime-based)
7
+ - agents/runtime/council/sessions/ (timestamp subdirs + root files)
8
+ - agents/runtime/council/questions/ (mtime-based)
9
+ - agents/runtime/council/responses/ (mtime-based)
10
10
 
11
11
  Same logic as the auto-prune that runs on every `council save()`,
12
12
  exposed as a Task target so the user can sweep on demand.