@event4u/agent-config 5.3.0 → 5.4.1

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 (404) hide show
  1. package/.agent-src/commands/agent-handoff.md +1 -0
  2. package/.agent-src/commands/agent-status.md +1 -0
  3. package/.agent-src/commands/agents/audit.md +1 -0
  4. package/.agent-src/commands/agents/init.md +1 -0
  5. package/.agent-src/commands/agents/optimize.md +1 -0
  6. package/.agent-src/commands/agents/user/accept.md +1 -0
  7. package/.agent-src/commands/agents/user/init.md +1 -0
  8. package/.agent-src/commands/agents/user/review.md +1 -0
  9. package/.agent-src/commands/agents/user/show.md +1 -0
  10. package/.agent-src/commands/agents/user/update.md +1 -0
  11. package/.agent-src/commands/agents/user.md +1 -0
  12. package/.agent-src/commands/agents.md +1 -0
  13. package/.agent-src/commands/analytics/prune.md +1 -0
  14. package/.agent-src/commands/analytics/show.md +1 -0
  15. package/.agent-src/commands/analytics.md +1 -0
  16. package/.agent-src/commands/analyze-reference-repo.md +1 -0
  17. package/.agent-src/commands/bug-fix.md +1 -0
  18. package/.agent-src/commands/bug-investigate.md +1 -0
  19. package/.agent-src/commands/challenge-me/vision.md +1 -0
  20. package/.agent-src/commands/challenge-me/with-docs.md +1 -0
  21. package/.agent-src/commands/challenge-me.md +1 -0
  22. package/.agent-src/commands/chat-history/import.md +1 -0
  23. package/.agent-src/commands/chat-history/learn.md +1 -0
  24. package/.agent-src/commands/chat-history/show.md +1 -0
  25. package/.agent-src/commands/chat-history.md +1 -0
  26. package/.agent-src/commands/check-current-md.md +1 -0
  27. package/.agent-src/commands/commit/in-chunks.md +1 -0
  28. package/.agent-src/commands/commit.md +1 -0
  29. package/.agent-src/commands/condense.md +1 -0
  30. package/.agent-src/commands/context/create.md +1 -0
  31. package/.agent-src/commands/context/refactor.md +1 -0
  32. package/.agent-src/commands/context.md +1 -0
  33. package/.agent-src/commands/cost-report.md +1 -0
  34. package/.agent-src/commands/council/analysis.md +1 -0
  35. package/.agent-src/commands/council/debate.md +1 -0
  36. package/.agent-src/commands/council/default.md +1 -0
  37. package/.agent-src/commands/council/design.md +1 -0
  38. package/.agent-src/commands/council/optimize.md +1 -0
  39. package/.agent-src/commands/council/pr.md +1 -0
  40. package/.agent-src/commands/council.md +1 -0
  41. package/.agent-src/commands/create-pr/description-only.md +1 -0
  42. package/.agent-src/commands/create-pr.md +1 -0
  43. package/.agent-src/commands/e2e-heal.md +1 -0
  44. package/.agent-src/commands/e2e-plan.md +1 -0
  45. package/.agent-src/commands/estimate-ticket.md +1 -0
  46. package/.agent-src/commands/feature/dev.md +1 -0
  47. package/.agent-src/commands/feature/explore.md +1 -0
  48. package/.agent-src/commands/feature/plan.md +1 -0
  49. package/.agent-src/commands/feature/refactor.md +1 -0
  50. package/.agent-src/commands/feature/roadmap.md +1 -0
  51. package/.agent-src/commands/feature.md +1 -0
  52. package/.agent-src/commands/fix/ci.md +1 -0
  53. package/.agent-src/commands/fix/portability.md +1 -0
  54. package/.agent-src/commands/fix/pr-bot-comments.md +1 -0
  55. package/.agent-src/commands/fix/pr-comments.md +1 -0
  56. package/.agent-src/commands/fix/pr-developer-comments.md +1 -0
  57. package/.agent-src/commands/fix/refs.md +1 -0
  58. package/.agent-src/commands/fix/seeder.md +1 -0
  59. package/.agent-src/commands/fix.md +1 -0
  60. package/.agent-src/commands/ghostwriter/delete.md +1 -0
  61. package/.agent-src/commands/ghostwriter/fetch.md +1 -0
  62. package/.agent-src/commands/ghostwriter/list.md +1 -0
  63. package/.agent-src/commands/ghostwriter/show.md +1 -0
  64. package/.agent-src/commands/ghostwriter/write.md +1 -0
  65. package/.agent-src/commands/ghostwriter.md +1 -0
  66. package/.agent-src/commands/grill-me.md +1 -0
  67. package/.agent-src/commands/implement-ticket.md +1 -0
  68. package/.agent-src/commands/jira-ticket.md +1 -0
  69. package/.agent-src/commands/judge/on-diff.md +1 -0
  70. package/.agent-src/commands/judge/solo.md +1 -0
  71. package/.agent-src/commands/judge/steps.md +1 -0
  72. package/.agent-src/commands/judge.md +1 -0
  73. package/.agent-src/commands/knowledge/forget.md +1 -0
  74. package/.agent-src/commands/knowledge/ingest.md +1 -0
  75. package/.agent-src/commands/knowledge/list.md +1 -0
  76. package/.agent-src/commands/knowledge.md +1 -0
  77. package/.agent-src/commands/memory/add.md +1 -0
  78. package/.agent-src/commands/memory/learn-low-impact.md +1 -0
  79. package/.agent-src/commands/memory/load.md +1 -0
  80. package/.agent-src/commands/memory/mine-session.md +1 -0
  81. package/.agent-src/commands/memory/promote.md +1 -0
  82. package/.agent-src/commands/memory/propose.md +1 -0
  83. package/.agent-src/commands/memory.md +1 -0
  84. package/.agent-src/commands/mode.md +1 -0
  85. package/.agent-src/commands/module/create.md +1 -0
  86. package/.agent-src/commands/module/explore.md +1 -0
  87. package/.agent-src/commands/module.md +1 -0
  88. package/.agent-src/commands/optimize/agents-dir.md +1 -0
  89. package/.agent-src/commands/optimize/augmentignore.md +1 -0
  90. package/.agent-src/commands/optimize/rtk.md +1 -0
  91. package/.agent-src/commands/optimize/skills.md +1 -0
  92. package/.agent-src/commands/optimize-prompt.md +1 -0
  93. package/.agent-src/commands/optimize.md +1 -0
  94. package/.agent-src/commands/orchestrate.md +1 -0
  95. package/.agent-src/commands/override/create.md +1 -0
  96. package/.agent-src/commands/override/manage.md +1 -0
  97. package/.agent-src/commands/override.md +1 -0
  98. package/.agent-src/commands/package-reset.md +1 -0
  99. package/.agent-src/commands/package-test.md +1 -0
  100. package/.agent-src/commands/post-as/ghostwriter.md +1 -0
  101. package/.agent-src/commands/post-as/me.md +1 -0
  102. package/.agent-src/commands/post-as.md +1 -0
  103. package/.agent-src/commands/prepare-for-review.md +1 -0
  104. package/.agent-src/commands/project-analyze.md +1 -0
  105. package/.agent-src/commands/project-health.md +1 -0
  106. package/.agent-src/commands/quality-fix.md +1 -0
  107. package/.agent-src/commands/refine-ticket.md +1 -0
  108. package/.agent-src/commands/research/deep.md +1 -0
  109. package/.agent-src/commands/research/report.md +1 -0
  110. package/.agent-src/commands/research.md +1 -0
  111. package/.agent-src/commands/review-changes.md +1 -0
  112. package/.agent-src/commands/review-routing.md +1 -0
  113. package/.agent-src/commands/roadmap/ai-council.md +1 -0
  114. package/.agent-src/commands/roadmap/create.md +1 -0
  115. package/.agent-src/commands/roadmap/process-full.md +1 -0
  116. package/.agent-src/commands/roadmap/process-phase.md +1 -0
  117. package/.agent-src/commands/roadmap/process-step.md +1 -0
  118. package/.agent-src/commands/roadmap.md +1 -0
  119. package/.agent-src/commands/rule-compliance-audit.md +1 -0
  120. package/.agent-src/commands/set-cost-profile.md +1 -0
  121. package/.agent-src/commands/sync-agent-settings.md +1 -0
  122. package/.agent-src/commands/sync-gitignore/fix.md +1 -0
  123. package/.agent-src/commands/sync-gitignore.md +1 -0
  124. package/.agent-src/commands/tests/create.md +1 -0
  125. package/.agent-src/commands/tests/execute.md +1 -0
  126. package/.agent-src/commands/tests.md +1 -0
  127. package/.agent-src/commands/threat-model.md +1 -0
  128. package/.agent-src/commands/update-form-request-messages.md +1 -0
  129. package/.agent-src/commands/upstream-contribute.md +1 -0
  130. package/.agent-src/commands/video/from-script.md +1 -0
  131. package/.agent-src/commands/video/scene.md +1 -0
  132. package/.agent-src/commands/video/stitch.md +1 -0
  133. package/.agent-src/commands/video/storyboard.md +1 -0
  134. package/.agent-src/commands/video.md +1 -0
  135. package/.agent-src/commands/work.md +1 -0
  136. package/.agent-src/contexts/model-recommendations.md +82 -82
  137. package/.agent-src/rules/model-recommendation.md +69 -6
  138. package/.agent-src/skills/accessibility-auditor/SKILL.md +1 -0
  139. package/.agent-src/skills/activation-design/SKILL.md +1 -0
  140. package/.agent-src/skills/adr-create/SKILL.md +1 -0
  141. package/.agent-src/skills/adversarial-review/SKILL.md +1 -0
  142. package/.agent-src/skills/agent-docs-writing/SKILL.md +1 -0
  143. package/.agent-src/skills/agents-md-thin-root/SKILL.md +1 -0
  144. package/.agent-src/skills/ai-council/SKILL.md +1 -0
  145. package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -0
  146. package/.agent-src/skills/analysis-skill-router/SKILL.md +1 -0
  147. package/.agent-src/skills/api-design/SKILL.md +1 -0
  148. package/.agent-src/skills/api-endpoint/SKILL.md +1 -0
  149. package/.agent-src/skills/api-testing/SKILL.md +1 -0
  150. package/.agent-src/skills/architecture-review-lens/SKILL.md +1 -0
  151. package/.agent-src/skills/artisan-commands/SKILL.md +1 -0
  152. package/.agent-src/skills/async-python-patterns/SKILL.md +1 -0
  153. package/.agent-src/skills/authz-review/SKILL.md +1 -0
  154. package/.agent-src/skills/aws-infrastructure/SKILL.md +1 -0
  155. package/.agent-src/skills/blade-ui/SKILL.md +1 -0
  156. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -0
  157. package/.agent-src/skills/bug-analyzer/SKILL.md +1 -0
  158. package/.agent-src/skills/build-buy-partner/SKILL.md +1 -0
  159. package/.agent-src/skills/canvas-design/SKILL.md +1 -0
  160. package/.agent-src/skills/character-consistency/SKILL.md +1 -0
  161. package/.agent-src/skills/check-refs/SKILL.md +1 -0
  162. package/.agent-src/skills/churn-prevention/SKILL.md +1 -0
  163. package/.agent-src/skills/code-refactoring/SKILL.md +1 -0
  164. package/.agent-src/skills/code-review/SKILL.md +1 -0
  165. package/.agent-src/skills/command-routing/SKILL.md +1 -0
  166. package/.agent-src/skills/command-writing/SKILL.md +1 -0
  167. package/.agent-src/skills/comp-banding/SKILL.md +1 -0
  168. package/.agent-src/skills/competitive-moat-analysis/SKILL.md +1 -0
  169. package/.agent-src/skills/competitive-positioning/SKILL.md +1 -0
  170. package/.agent-src/skills/composer-packages/SKILL.md +1 -0
  171. package/.agent-src/skills/condense-memory/SKILL.md +1 -0
  172. package/.agent-src/skills/content-funnel-design/SKILL.md +1 -0
  173. package/.agent-src/skills/context-authoring/SKILL.md +1 -0
  174. package/.agent-src/skills/context-document/SKILL.md +1 -0
  175. package/.agent-src/skills/contracts-cognition/SKILL.md +1 -0
  176. package/.agent-src/skills/conventional-commits-writing/SKILL.md +1 -0
  177. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +1 -0
  178. package/.agent-src/skills/copilot-config/SKILL.md +1 -0
  179. package/.agent-src/skills/customer-research/SKILL.md +1 -0
  180. package/.agent-src/skills/dashboard-design/SKILL.md +1 -0
  181. package/.agent-src/skills/data-flow-mapper/SKILL.md +1 -0
  182. package/.agent-src/skills/data-handling-judgment/SKILL.md +1 -0
  183. package/.agent-src/skills/database/SKILL.md +1 -0
  184. package/.agent-src/skills/dcf-modeling/SKILL.md +1 -0
  185. package/.agent-src/skills/deal-qualification-meddic/SKILL.md +1 -0
  186. package/.agent-src/skills/decision-record/SKILL.md +1 -0
  187. package/.agent-src/skills/deep-reading-analyst/SKILL.md +2 -0
  188. package/.agent-src/skills/defense-in-depth/SKILL.md +1 -0
  189. package/.agent-src/skills/dependency-upgrade/SKILL.md +1 -0
  190. package/.agent-src/skills/description-assist/SKILL.md +1 -0
  191. package/.agent-src/skills/design-review/SKILL.md +1 -0
  192. package/.agent-src/skills/devcontainer/SKILL.md +1 -0
  193. package/.agent-src/skills/developer-like-execution/SKILL.md +1 -0
  194. package/.agent-src/skills/discovery-interview/SKILL.md +1 -0
  195. package/.agent-src/skills/doc-coauthoring/SKILL.md +1 -0
  196. package/.agent-src/skills/docker/SKILL.md +1 -0
  197. package/.agent-src/skills/editorial-calendar/SKILL.md +1 -0
  198. package/.agent-src/skills/eloquent/SKILL.md +1 -0
  199. package/.agent-src/skills/error-handling-patterns/SKILL.md +1 -0
  200. package/.agent-src/skills/estimate-ticket/SKILL.md +1 -0
  201. package/.agent-src/skills/existing-ui-audit/SKILL.md +1 -0
  202. package/.agent-src/skills/expansion-playbook/SKILL.md +1 -0
  203. package/.agent-src/skills/fe-design/SKILL.md +1 -0
  204. package/.agent-src/skills/feature-planning/SKILL.md +1 -0
  205. package/.agent-src/skills/file-editor/SKILL.md +1 -0
  206. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -0
  207. package/.agent-src/skills/flux/SKILL.md +1 -0
  208. package/.agent-src/skills/forecast-accuracy/SKILL.md +1 -0
  209. package/.agent-src/skills/forecasting/SKILL.md +1 -0
  210. package/.agent-src/skills/form-handler/SKILL.md +1 -0
  211. package/.agent-src/skills/fundraising-narrative/SKILL.md +1 -0
  212. package/.agent-src/skills/funnel-analysis/SKILL.md +1 -0
  213. package/.agent-src/skills/git-workflow/SKILL.md +1 -0
  214. package/.agent-src/skills/github-ci/SKILL.md +1 -0
  215. package/.agent-src/skills/grafana/SKILL.md +1 -0
  216. package/.agent-src/skills/gtm-launch/SKILL.md +1 -0
  217. package/.agent-src/skills/guideline-writing/SKILL.md +1 -0
  218. package/.agent-src/skills/hiring-loop-design/SKILL.md +1 -0
  219. package/.agent-src/skills/incident-commander/SKILL.md +1 -0
  220. package/.agent-src/skills/jira-integration/SKILL.md +1 -0
  221. package/.agent-src/skills/jobs-events/SKILL.md +1 -0
  222. package/.agent-src/skills/judge-bug-hunter/SKILL.md +1 -0
  223. package/.agent-src/skills/judge-code-quality/SKILL.md +1 -0
  224. package/.agent-src/skills/judge-security-auditor/SKILL.md +1 -0
  225. package/.agent-src/skills/judge-test-coverage/SKILL.md +1 -0
  226. package/.agent-src/skills/laravel/SKILL.md +1 -0
  227. package/.agent-src/skills/laravel-api-endpoint/SKILL.md +1 -0
  228. package/.agent-src/skills/laravel-dto/SKILL.md +1 -0
  229. package/.agent-src/skills/laravel-horizon/SKILL.md +1 -0
  230. package/.agent-src/skills/laravel-mail/SKILL.md +1 -0
  231. package/.agent-src/skills/laravel-middleware/SKILL.md +1 -0
  232. package/.agent-src/skills/laravel-migration/SKILL.md +1 -0
  233. package/.agent-src/skills/laravel-notifications/SKILL.md +1 -0
  234. package/.agent-src/skills/laravel-pennant/SKILL.md +1 -0
  235. package/.agent-src/skills/laravel-pulse/SKILL.md +1 -0
  236. package/.agent-src/skills/laravel-reverb/SKILL.md +1 -0
  237. package/.agent-src/skills/laravel-scheduling/SKILL.md +1 -0
  238. package/.agent-src/skills/laravel-validation/SKILL.md +1 -0
  239. package/.agent-src/skills/laravel-websocket/SKILL.md +1 -0
  240. package/.agent-src/skills/launch-readiness/SKILL.md +1 -0
  241. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +1 -0
  242. package/.agent-src/skills/lint-skills/SKILL.md +1 -0
  243. package/.agent-src/skills/livewire/SKILL.md +1 -0
  244. package/.agent-src/skills/livewire-architect/SKILL.md +1 -0
  245. package/.agent-src/skills/logging-monitoring/SKILL.md +1 -0
  246. package/.agent-src/skills/market-entry-analysis/SKILL.md +1 -0
  247. package/.agent-src/skills/markitdown/SKILL.md +1 -0
  248. package/.agent-src/skills/mcp/SKILL.md +1 -0
  249. package/.agent-src/skills/mcp-builder/SKILL.md +1 -0
  250. package/.agent-src/skills/md-language-check/SKILL.md +1 -0
  251. package/.agent-src/skills/memory-consolidation/SKILL.md +1 -0
  252. package/.agent-src/skills/merge-conflicts/SKILL.md +1 -0
  253. package/.agent-src/skills/messaging-architecture/SKILL.md +1 -0
  254. package/.agent-src/skills/migration-architect/SKILL.md +1 -0
  255. package/.agent-src/skills/mobile-e2e-strategy/SKILL.md +1 -0
  256. package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +1 -0
  257. package/.agent-src/skills/module-management/SKILL.md +1 -0
  258. package/.agent-src/skills/motion-choreographer/SKILL.md +1 -0
  259. package/.agent-src/skills/multi-tenancy/SKILL.md +1 -0
  260. package/.agent-src/skills/nextjs-patterns/SKILL.md +1 -0
  261. package/.agent-src/skills/okr-tree-modeling/SKILL.md +1 -0
  262. package/.agent-src/skills/onboarding-design/SKILL.md +1 -0
  263. package/.agent-src/skills/onboarding-program/SKILL.md +1 -0
  264. package/.agent-src/skills/one-on-one-cadence/SKILL.md +1 -0
  265. package/.agent-src/skills/openapi/SKILL.md +1 -0
  266. package/.agent-src/skills/org-design/SKILL.md +1 -0
  267. package/.agent-src/skills/override-management/SKILL.md +1 -0
  268. package/.agent-src/skills/perf-feedback-craft/SKILL.md +1 -0
  269. package/.agent-src/skills/performance/SKILL.md +1 -0
  270. package/.agent-src/skills/performance-analysis/SKILL.md +1 -0
  271. package/.agent-src/skills/persona-writing/SKILL.md +1 -0
  272. package/.agent-src/skills/pest-testing/SKILL.md +1 -0
  273. package/.agent-src/skills/php-coder/SKILL.md +1 -0
  274. package/.agent-src/skills/php-debugging/SKILL.md +1 -0
  275. package/.agent-src/skills/php-service/SKILL.md +1 -0
  276. package/.agent-src/skills/pipeline-strategy/SKILL.md +1 -0
  277. package/.agent-src/skills/pixar-storyteller/SKILL.md +1 -0
  278. package/.agent-src/skills/playwright-architect/SKILL.md +1 -0
  279. package/.agent-src/skills/playwright-testing/SKILL.md +1 -0
  280. package/.agent-src/skills/po-discovery/SKILL.md +1 -0
  281. package/.agent-src/skills/positioning-strategy/SKILL.md +1 -0
  282. package/.agent-src/skills/privacy-review/SKILL.md +1 -0
  283. package/.agent-src/skills/project-analysis-core/SKILL.md +2 -0
  284. package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +2 -0
  285. package/.agent-src/skills/project-analysis-laravel/SKILL.md +1 -0
  286. package/.agent-src/skills/project-analysis-nextjs/SKILL.md +1 -0
  287. package/.agent-src/skills/project-analysis-node-express/SKILL.md +1 -0
  288. package/.agent-src/skills/project-analysis-react/SKILL.md +1 -0
  289. package/.agent-src/skills/project-analysis-symfony/SKILL.md +1 -0
  290. package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +1 -0
  291. package/.agent-src/skills/project-analyzer/SKILL.md +2 -0
  292. package/.agent-src/skills/project-docs/SKILL.md +1 -0
  293. package/.agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -0
  294. package/.agent-src/skills/prompt-optimizer/SKILL.md +1 -0
  295. package/.agent-src/skills/quality-tools/SKILL.md +1 -0
  296. package/.agent-src/skills/react-native-setup/SKILL.md +1 -0
  297. package/.agent-src/skills/react-shadcn-ui/SKILL.md +1 -0
  298. package/.agent-src/skills/readme-reviewer/SKILL.md +1 -0
  299. package/.agent-src/skills/readme-writing/SKILL.md +1 -0
  300. package/.agent-src/skills/readme-writing-package/SKILL.md +1 -0
  301. package/.agent-src/skills/receiving-code-review/SKILL.md +1 -0
  302. package/.agent-src/skills/refine-prompt/SKILL.md +1 -0
  303. package/.agent-src/skills/refine-ticket/SKILL.md +1 -0
  304. package/.agent-src/skills/release-comms/SKILL.md +1 -0
  305. package/.agent-src/skills/repomix-packer/SKILL.md +2 -0
  306. package/.agent-src/skills/requesting-code-review/SKILL.md +1 -0
  307. package/.agent-src/skills/retention-loops/SKILL.md +1 -0
  308. package/.agent-src/skills/review-routing/SKILL.md +1 -0
  309. package/.agent-src/skills/rice-prioritization/SKILL.md +1 -0
  310. package/.agent-src/skills/risk-officer/SKILL.md +1 -0
  311. package/.agent-src/skills/roadmap-management/SKILL.md +1 -0
  312. package/.agent-src/skills/roadmap-writing/SKILL.md +1 -0
  313. package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -0
  314. package/.agent-src/skills/rule-refactor/SKILL.md +1 -0
  315. package/.agent-src/skills/rule-writing/SKILL.md +1 -0
  316. package/.agent-src/skills/runway-cognition/SKILL.md +1 -0
  317. package/.agent-src/skills/scenario-modeling/SKILL.md +1 -0
  318. package/.agent-src/skills/scene-expander/SKILL.md +1 -0
  319. package/.agent-src/skills/script-writing/SKILL.md +1 -0
  320. package/.agent-src/skills/secrets-management/SKILL.md +1 -0
  321. package/.agent-src/skills/security/SKILL.md +1 -0
  322. package/.agent-src/skills/security-audit/SKILL.md +1 -0
  323. package/.agent-src/skills/sentry-integration/SKILL.md +1 -0
  324. package/.agent-src/skills/sequential-thinking/SKILL.md +1 -0
  325. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -0
  326. package/.agent-src/skills/skill-management/SKILL.md +1 -0
  327. package/.agent-src/skills/skill-reviewer/SKILL.md +1 -0
  328. package/.agent-src/skills/skill-writing/SKILL.md +1 -0
  329. package/.agent-src/skills/sql-writing/SKILL.md +1 -0
  330. package/.agent-src/skills/stakeholder-tradeoff/SKILL.md +1 -0
  331. package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -0
  332. package/.agent-src/skills/symfony-workflow/SKILL.md +1 -0
  333. package/.agent-src/skills/systematic-debugging/SKILL.md +1 -0
  334. package/.agent-src/skills/tailwind-engineer/SKILL.md +1 -0
  335. package/.agent-src/skills/tech-debt-tracker/SKILL.md +1 -0
  336. package/.agent-src/skills/technical-specification/SKILL.md +1 -0
  337. package/.agent-src/skills/terraform/SKILL.md +1 -0
  338. package/.agent-src/skills/terragrunt/SKILL.md +1 -0
  339. package/.agent-src/skills/test-driven-development/SKILL.md +1 -0
  340. package/.agent-src/skills/test-performance/SKILL.md +1 -0
  341. package/.agent-src/skills/testing-anti-patterns/SKILL.md +1 -0
  342. package/.agent-src/skills/threat-modeling/SKILL.md +1 -0
  343. package/.agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -0
  344. package/.agent-src/skills/token-optimizer/SKILL.md +1 -0
  345. package/.agent-src/skills/traefik/SKILL.md +1 -0
  346. package/.agent-src/skills/ui-component-architect/SKILL.md +1 -0
  347. package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -0
  348. package/.agent-src/skills/universal-project-analysis/SKILL.md +2 -0
  349. package/.agent-src/skills/upstream-contribute/SKILL.md +1 -0
  350. package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -0
  351. package/.agent-src/skills/validate-feature-fit/SKILL.md +1 -0
  352. package/.agent-src/skills/verify-completion-evidence/SKILL.md +1 -0
  353. package/.agent-src/skills/video-director/SKILL.md +1 -0
  354. package/.agent-src/skills/vision-articulation/SKILL.md +1 -0
  355. package/.agent-src/skills/voc-extract/SKILL.md +1 -0
  356. package/.agent-src/skills/voice-and-tone-design/SKILL.md +1 -0
  357. package/.claude-plugin/marketplace.json +1 -1
  358. package/CHANGELOG.md +31 -230
  359. package/README.md +5 -0
  360. package/config/agent-settings.template.yml +13 -0
  361. package/dist/cli/registry.js +2 -0
  362. package/dist/cli/registry.js.map +1 -1
  363. package/dist/discovery/deprecation-report.md +1 -1
  364. package/dist/discovery/discovery-manifest.json +357 -357
  365. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  366. package/dist/discovery/discovery-manifest.summary.md +1 -1
  367. package/dist/discovery/orphan-report.md +1 -1
  368. package/dist/discovery/packs.json +2 -2
  369. package/dist/discovery/trust-report.md +1 -1
  370. package/dist/discovery/workspaces.json +2 -2
  371. package/dist/mcp/registry-manifest.json +1 -1
  372. package/dist/server/schemas/settings.js +4 -0
  373. package/dist/server/schemas/settings.js.map +1 -1
  374. package/dist/ui/assets/{index-Tk7lkVH8.js → index-DVsyUMZe.js} +2 -2
  375. package/dist/ui/assets/index-DVsyUMZe.js.map +1 -0
  376. package/dist/ui/index.html +1 -1
  377. package/docs/archive/CHANGELOG-pre-5.4.0.md +260 -0
  378. package/docs/contracts/consumer-bridge.md +2 -0
  379. package/docs/contracts/multi-tool-projection-fidelity.md +19 -0
  380. package/docs/contracts/release-pr-gating.md +6 -1
  381. package/docs/decisions/ADR-020-global-only-consumer-scope.md +24 -0
  382. package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +63 -0
  383. package/docs/decisions/ADR-035-model-capability-tiers.md +104 -0
  384. package/docs/decisions/INDEX.md +2 -0
  385. package/docs/getting-started.md +23 -0
  386. package/package.json +1 -1
  387. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  388. package/scripts/_cli/cmd_doctor.py +44 -1
  389. package/scripts/_cli/cmd_refresh.py +173 -0
  390. package/scripts/_cli/cmd_upgrade.py +142 -0
  391. package/scripts/_dispatch.bash +20 -0
  392. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  393. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  394. package/scripts/backfill_model_tier.py +182 -0
  395. package/scripts/check_release_pr_shape.py +7 -0
  396. package/scripts/condense.py +142 -17
  397. package/scripts/hooks/dispatch_hook.py +39 -0
  398. package/scripts/install +14 -0
  399. package/scripts/lint_framework_leakage_allowlist.json +46 -46
  400. package/scripts/lint_model_tier_coverage.py +73 -0
  401. package/scripts/roadmap_progress_hook.py +28 -2
  402. package/scripts/schemas/command.schema.json +10 -0
  403. package/scripts/schemas/skill.schema.json +10 -0
  404. package/dist/ui/assets/index-Tk7lkVH8.js.map +0 -1
@@ -49,7 +49,7 @@ import sys
49
49
  from pathlib import Path
50
50
  from typing import Any
51
51
 
52
- from scripts._lib import installed_tools
52
+ from scripts._lib import installed_lock, installed_tools
53
53
  from scripts._lib.agent_settings import (
54
54
  PROJECT_ROOT_ENV,
55
55
  ROOT_OVERRIDE_ENV,
@@ -440,6 +440,7 @@ def _foreign_records(
440
440
  #: a runner below and an entry in :func:`_run_checks`.
441
441
  CHECK_IDS = (
442
442
  "scope",
443
+ "global-binary",
443
444
  "manifest-integrity",
444
445
  "lockfile-freshness",
445
446
  "bridge-drift",
@@ -587,6 +588,47 @@ def _check_lockfile_freshness(manifest: dict[str, Any]) -> dict[str, Any]:
587
588
  }
588
589
 
589
590
 
591
+ def _check_global_binary(project_root: Path) -> dict[str, Any]:
592
+ """`agent-config` PATH resolution + global-install version parity.
593
+
594
+ The Claude plugin hook resolves `agent-config` from PATH (ADR-020
595
+ global-only); if it is missing, every PostToolUse hook fails silently —
596
+ this is the root cause of the "dashboard never updates" report. Version
597
+ drift between the binary on PATH and the global install root means the
598
+ plugin may emit a hook spec the installed binary predates.
599
+ """
600
+ binary = shutil.which("agent-config")
601
+ if not binary:
602
+ return {
603
+ "id": "global-binary", "status": "fail",
604
+ "message": "`agent-config` is not on PATH — Claude plugin hooks "
605
+ "cannot resolve it (hooks silently no-op)",
606
+ "remedy": "npm install -g @event4u/agent-config, then re-run doctor",
607
+ }
608
+ lock = installed_lock.read_lockfile()
609
+ global_v = ""
610
+ if isinstance(lock, dict):
611
+ raw = lock.get("agent_config_version")
612
+ global_v = raw.strip().lstrip("v") if isinstance(raw, str) else ""
613
+ binary_v = (_current_package_version() or "").lstrip("v")
614
+ if global_v and binary_v and global_v != binary_v:
615
+ return {
616
+ "id": "global-binary", "status": "warn",
617
+ "message": f"version drift — binary {binary_v}, global install "
618
+ f"{global_v}",
619
+ "remedy": "agent-config upgrade (refresh the global install + plugin)",
620
+ }
621
+ bridge = project_root / "agents" / ".event4u-bridge.yml"
622
+ bridge_note = "" if bridge.is_file() else " · no project bridge marker"
623
+ return {
624
+ "id": "global-binary", "status": "ok",
625
+ "message": f"on PATH ({binary}); version {binary_v or 'unknown'}"
626
+ f"{bridge_note}",
627
+ "remedy": "" if not bridge_note else
628
+ "agent-config refresh --project (scaffold the bridge marker)",
629
+ }
630
+
631
+
590
632
  def _check_bridge_drift(
591
633
  missing: list[dict[str, Any]],
592
634
  modified: list[dict[str, Any]],
@@ -1092,6 +1134,7 @@ def _run_checks(
1092
1134
  """
1093
1135
  runners: dict[str, Any] = {
1094
1136
  "scope": lambda: _check_scope(project_root),
1137
+ "global-binary": lambda: _check_global_binary(project_root),
1095
1138
  "manifest-integrity": lambda: _check_manifest_integrity(manifest),
1096
1139
  "lockfile-freshness": lambda: _check_lockfile_freshness(manifest),
1097
1140
  "bridge-drift": lambda: _check_bridge_drift(
@@ -0,0 +1,173 @@
1
+ """``agent-config refresh`` — idempotent re-install, no version change.
2
+
3
+ The same-version counterpart to ``agent-config upgrade`` (which fetches
4
+ the latest). Two scopes, exactly one required:
5
+
6
+ * ``--global`` — re-run the global install (``scripts/install --global``)
7
+ so the global root + Claude plugin hooks are rewritten from the
8
+ currently-installed package. Idempotent: a second run is a no-op diff.
9
+ * ``--project`` — refresh the **minimal** project surface ADR-020 permits
10
+ for a consumer: the ``agents/.event4u-bridge.yml`` marker, an
11
+ ``agents/overrides/`` scaffold, and the managed ``agents/`` block in
12
+ ``.gitignore``. Writes **no** distributed content (no ``.augment/`` /
13
+ ``.claude/`` / skills / hooks). No wizard.
14
+
15
+ Bare ``agent-config refresh`` (no scope flag) errors — never a silent
16
+ global default (council 2026-05-30).
17
+
18
+ Exit codes: ``0`` success · ``1`` a step failed / bad invocation.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import argparse
23
+ import subprocess
24
+ import sys
25
+ from pathlib import Path
26
+ from typing import Callable, Optional
27
+
28
+ PACKAGE_ROOT = Path(__file__).resolve().parents[2]
29
+
30
+ Runner = Callable[[list[str]], int]
31
+
32
+
33
+ def _default_runner(cmd: list[str]) -> int:
34
+ try:
35
+ return subprocess.run(cmd, check=False).returncode
36
+ except OSError as exc:
37
+ sys.stderr.write(f"agent-config refresh: cannot run {cmd[0]}: {exc}\n")
38
+ return 1
39
+
40
+
41
+ def _refresh_global(runner: Runner, out, err) -> int:
42
+ install_sh = PACKAGE_ROOT / "scripts" / "install"
43
+ if not install_sh.is_file():
44
+ print(f"❌ agent-config refresh: installer not found at {install_sh}",
45
+ file=err)
46
+ return 1
47
+ print("→ refreshing global install (scripts/install --global)", file=out)
48
+ rc = runner(["bash", str(install_sh), "--global"])
49
+ if rc != 0:
50
+ print(f"❌ agent-config refresh --global: install failed (exit {rc})",
51
+ file=err)
52
+ return 1
53
+ print("✅ global install refreshed.", file=out)
54
+ return 0
55
+
56
+
57
+ def _is_source_repo(project_root: Path) -> bool:
58
+ """True when project_root is the agent-config package itself.
59
+
60
+ ``_write_consumer_bridge_marker`` only guards on a root-level
61
+ ``.agent-src.uncondensed/``, which the monorepo keeps under
62
+ ``packages/*/`` instead — so the narrow guard misses here and would
63
+ write a consumer marker into the maintainer tree. This broader check
64
+ (condensed output, packaged source, or the package's own
65
+ ``package.json`` name) makes ``refresh --project`` a no-op in any
66
+ agent-config checkout. Consumers use dev-mode, not refresh.
67
+ """
68
+ if (project_root / ".agent-src").is_dir():
69
+ return True
70
+ if any((project_root / "packages").glob("*/.agent-src.uncondensed")):
71
+ return True
72
+ pkg = project_root / "package.json"
73
+ if pkg.is_file():
74
+ try:
75
+ import json
76
+ if json.loads(pkg.read_text(encoding="utf-8")).get("name") == \
77
+ "@event4u/agent-config":
78
+ return True
79
+ except (OSError, ValueError):
80
+ pass
81
+ return False
82
+
83
+
84
+ def _refresh_project(project_root: Path, out, err) -> int:
85
+ # Imported lazily: scripts.install is large and only needed for --project.
86
+ from scripts import install as installer
87
+ from scripts._lib import installed_lock
88
+
89
+ if _is_source_repo(project_root):
90
+ print("ℹ️ refresh --project skipped: this is the agent-config package "
91
+ "itself (or a checkout of it). Maintainers use "
92
+ "AGENT_CONFIG_DEV_MODE=1, not a consumer refresh.", file=out)
93
+ return 0
94
+
95
+ version = installed_lock.current_package_version() or "0.0.0"
96
+ marker = installer._write_consumer_bridge_marker(project_root, version)
97
+ if marker is None:
98
+ print("ℹ️ refresh --project skipped the bridge marker: this is the "
99
+ "agent-config source repo (or AGENT_CONFIG_DEV_MODE=1). Nothing "
100
+ "to scaffold in a maintainer checkout.", file=out)
101
+ return 0
102
+
103
+ print(f"✅ bridge marker: {marker}", file=out)
104
+
105
+ overrides = project_root / "agents" / "overrides"
106
+ overrides.mkdir(parents=True, exist_ok=True)
107
+ keep = overrides / "README.md"
108
+ if not keep.exists():
109
+ keep.write_text(
110
+ "# Project overrides\n\n"
111
+ "Project-local overrides/extensions of shared skills, rules, and "
112
+ "commands. The only project-side agent surface ADR-020 permits "
113
+ "besides the bridge marker. See the `override-management` skill.\n",
114
+ encoding="utf-8")
115
+ print(f"✅ overrides scaffold: {overrides}", file=out)
116
+
117
+ rc = _sync_gitignore(project_root, out, err)
118
+ if rc != 0:
119
+ return rc
120
+ print("✅ refresh --project complete.", file=out)
121
+ return 0
122
+
123
+
124
+ def _sync_gitignore(project_root: Path, out, err) -> int:
125
+ try:
126
+ from scripts import sync_gitignore
127
+ except ImportError as exc:
128
+ print(f"⚠️ refresh --project: gitignore sync unavailable ({exc})",
129
+ file=err)
130
+ return 0 # advisory — do not fail the refresh on a missing helper
131
+ rc = sync_gitignore.main(["--path", str(project_root / ".gitignore")])
132
+ if rc not in (0, None):
133
+ print(f"⚠️ refresh --project: gitignore sync returned {rc}", file=err)
134
+ else:
135
+ print("✅ .gitignore agents/ block synced.", file=out)
136
+ return 0
137
+
138
+
139
+ def main(
140
+ argv: Optional[list[str]] = None,
141
+ *,
142
+ runner: Runner = _default_runner,
143
+ project_root: Optional[Path] = None,
144
+ out=sys.stdout,
145
+ err=sys.stderr,
146
+ ) -> int:
147
+ parser = argparse.ArgumentParser(
148
+ prog="agent-config refresh",
149
+ description="Idempotent re-install (no version change). Requires a scope.",
150
+ )
151
+ parser.add_argument("--global", dest="is_global", action="store_true",
152
+ help="Re-run the global install (root + Claude plugin).")
153
+ parser.add_argument("--project", dest="is_project", action="store_true",
154
+ help="Refresh the minimal project surface (bridge "
155
+ "marker, overrides scaffold, .gitignore).")
156
+ args = parser.parse_args(argv)
157
+
158
+ if not args.is_global and not args.is_project:
159
+ print("❌ agent-config refresh: specify a scope — --global "
160
+ "and/or --project (never a silent default).", file=err)
161
+ return 1
162
+
163
+ root = project_root or Path.cwd()
164
+ rc = 0
165
+ if args.is_global:
166
+ rc = _refresh_global(runner, out, err) or rc
167
+ if args.is_project and rc == 0:
168
+ rc = _refresh_project(root, out, err) or rc
169
+ return rc
170
+
171
+
172
+ if __name__ == "__main__":
173
+ raise SystemExit(main())
@@ -0,0 +1,142 @@
1
+ """``agent-config upgrade`` — fetch + install the latest global binary + refresh.
2
+
3
+ Distinct from ``agent-config update`` (which only flips the
4
+ ``agent_config_version`` pin in ``.agent-settings.yml`` — a project
5
+ decision, see :mod:`scripts._cli.cmd_update`). ``upgrade`` is the
6
+ **global** self-update path mandated by ADR-020's "no per-repo bump"
7
+ goal: it installs the latest published package globally and re-runs the
8
+ global install so new skills / rules / hooks reach every consumer at
9
+ once.
10
+
11
+ Two side effects, in order:
12
+
13
+ 1. ``npm install -g @event4u/agent-config@latest`` — refresh the global
14
+ binary on PATH (the binary the Claude plugin hook resolves).
15
+ 2. ``agent-config global`` (→ ``install.py --global``) — refresh the
16
+ global root (``~/.event4u/agent-config/``) + regenerate plugin hooks.
17
+
18
+ The **Claude marketplace plugin** updates on Claude Code's own cadence,
19
+ independent of npm; ``upgrade`` cannot drive it. ``agent-config doctor``
20
+ surfaces binary↔plugin drift so the user knows when to update the plugin
21
+ from the marketplace.
22
+
23
+ Flags:
24
+
25
+ * ``--check`` — report installed vs latest; install nothing. Exit 0.
26
+ * ``--dry-run`` — print the exact commands that would run; execute none.
27
+ * (no flag) — perform the upgrade.
28
+
29
+ Exit codes: ``0`` success / already-latest / check / dry-run · ``1`` a
30
+ step failed.
31
+ """
32
+ from __future__ import annotations
33
+
34
+ import argparse
35
+ import subprocess
36
+ import sys
37
+ from pathlib import Path
38
+ from typing import Callable, Optional
39
+
40
+ from scripts._lib import installed_lock, update_check
41
+
42
+ PACKAGE_NAME = "@event4u/agent-config"
43
+
44
+ # A runner is injected in tests so the global-mutating commands are never
45
+ # executed in CI / sandbox. Returns the subprocess return code.
46
+ Runner = Callable[[list[str]], int]
47
+
48
+
49
+ def _default_runner(cmd: list[str]) -> int:
50
+ try:
51
+ return subprocess.run(cmd, check=False).returncode
52
+ except OSError as exc: # npm / bash missing
53
+ sys.stderr.write(f"agent-config upgrade: cannot run {cmd[0]}: {exc}\n")
54
+ return 1
55
+
56
+
57
+ def _installed_version() -> str:
58
+ lock = installed_lock.read_lockfile()
59
+ if isinstance(lock, dict):
60
+ v = lock.get("agent_config_version")
61
+ if isinstance(v, str) and v:
62
+ return v.strip().lstrip("v")
63
+ return ""
64
+
65
+
66
+ def _agent_config_bin() -> str:
67
+ """The global wrapper the second step invokes. Prefer the binary on
68
+ PATH; fall back to the package-local wrapper so a maintainer dev-loop
69
+ (no global install yet) still refreshes."""
70
+ from shutil import which
71
+ return which("agent-config") or str(
72
+ Path(__file__).resolve().parents[2] / "agent-config")
73
+
74
+
75
+ def main(
76
+ argv: Optional[list[str]] = None,
77
+ *,
78
+ runner: Runner = _default_runner,
79
+ fetcher=update_check.fetch_latest_from_npm,
80
+ installed: Optional[str] = None,
81
+ out=sys.stdout,
82
+ err=sys.stderr,
83
+ ) -> int:
84
+ parser = argparse.ArgumentParser(
85
+ prog="agent-config upgrade",
86
+ description="Install the latest @event4u/agent-config globally and "
87
+ "refresh the global install.",
88
+ )
89
+ parser.add_argument("--check", action="store_true",
90
+ help="Report installed vs latest; install nothing.")
91
+ parser.add_argument("--dry-run", action="store_true",
92
+ help="Print the commands that would run; execute none.")
93
+ args = parser.parse_args(argv)
94
+
95
+ installed = installed if installed is not None else _installed_version()
96
+ latest = fetcher() or ""
97
+
98
+ if args.check:
99
+ if not latest:
100
+ print("agent-config upgrade: latest version unavailable "
101
+ "(registry unreachable).", file=err)
102
+ return 0
103
+ if installed and not installed_lock_is_newer(latest, installed):
104
+ print(f"✅ agent-config is up to date ({installed}).", file=out)
105
+ else:
106
+ print(f"ℹ️ agent-config {latest} available "
107
+ f"(installed: {installed or 'unknown'}). Run "
108
+ f"`agent-config upgrade`.", file=out)
109
+ return 0
110
+
111
+ target = f"{PACKAGE_NAME}@latest"
112
+ steps = [
113
+ ["npm", "install", "-g", target],
114
+ [_agent_config_bin(), "global"],
115
+ ]
116
+
117
+ if args.dry_run:
118
+ print("agent-config upgrade — dry run, would execute:", file=out)
119
+ for cmd in steps:
120
+ print(" " + " ".join(cmd), file=out)
121
+ return 0
122
+
123
+ for cmd in steps:
124
+ print("→ " + " ".join(cmd), file=out)
125
+ rc = runner(cmd)
126
+ if rc != 0:
127
+ print(f"❌ agent-config upgrade: step failed (exit {rc}): "
128
+ f"{' '.join(cmd)}", file=err)
129
+ return 1
130
+
131
+ print("✅ agent-config upgraded. Run `agent-config doctor` to verify "
132
+ "PATH + plugin parity.", file=out)
133
+ return 0
134
+
135
+
136
+ def installed_lock_is_newer(latest: str, installed: str) -> bool:
137
+ """Thin wrapper around update_check._is_newer for one import site."""
138
+ return update_check._is_newer(latest, installed)
139
+
140
+
141
+ if __name__ == "__main__":
142
+ raise SystemExit(main())
@@ -72,11 +72,19 @@ EOF
72
72
  Tier 1 — power-user (release shape, audit, migration):
73
73
  update Update the agent_config_version pin in .agent-settings.yml
74
74
  Flags: --check (read-only) | --to <version> (explicit pin)
75
+ upgrade Install the latest @event4u/agent-config globally
76
+ (npm i -g) and refresh the global install + plugin.
77
+ Flags: --check (report only) | --dry-run
78
+ refresh Idempotent re-install, no version change.
79
+ --global (root + plugin) | --project (bridge
80
+ marker + overrides + .gitignore). Scope required.
75
81
  versions List available @event4u/agent-config versions
76
82
  on npm. Marks the current pin and latest.
77
83
  Flags: --offline | --limit=N | --json
78
84
  global Install to user-scope paths (~/.claude/, ~/.cursor/, …)
79
85
  Forwards to `scripts/install --global` (ADR-007).
86
+ `refresh --global` is the clearer name for a re-run;
87
+ `global` is retained as the original alias.
80
88
  Flags: --tools=<list> | --ai=<list> | --yes | --force
81
89
  export Eject a tool's canonical content into a chosen path
82
90
  (real file, no symlink). Idempotent; --force overrides
@@ -773,6 +781,16 @@ cmd_update() {
773
781
  exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_update "$@"
774
782
  }
775
783
 
784
+ cmd_upgrade() {
785
+ require_python3
786
+ exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_upgrade "$@"
787
+ }
788
+
789
+ cmd_refresh() {
790
+ require_python3
791
+ exec env PYTHONPATH="$PACKAGE_ROOT" python3 -m scripts._cli.cmd_refresh "$@"
792
+ }
793
+
776
794
  # `agent-config migrate` — one-shot migration off legacy composer / npm
777
795
  # install paths onto the npx-only runtime. See scripts/_cli/cmd_migrate.py
778
796
  # (P3.5 of road-to-portable-runtime-and-update-check.md).
@@ -932,6 +950,8 @@ main() {
932
950
  council:run) cmd_council run "$@" ;;
933
951
  council:render) cmd_council render "$@" ;;
934
952
  update) cmd_update "$@" ;;
953
+ upgrade) cmd_upgrade "$@" ;;
954
+ refresh) cmd_refresh "$@" ;;
935
955
  migrate) cmd_migrate "$@" ;;
936
956
  init) cmd_init "$@" ;;
937
957
  global) cmd_global "$@" ;;
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env python3
2
+ """Backfill / migrate `model_tier` on every skill and command (ADR-035).
3
+
4
+ Vendor-neutral capability band `lite | medium | high | inherit` (replaces the
5
+ concrete-model `recommended_model` from ADR-034). Behaviour per artefact:
6
+
7
+ - **Has `recommended_model`** (ADR-034 legacy) → migrate via the value map
8
+ (`opus→high`, `sonnet→medium`, `gpt→high`, `inherit→inherit`) and rename the
9
+ key to `model_tier`. Same line count — no body shift.
10
+ - **Already `model_tier`** → leave (idempotent).
11
+ - **Untagged** → classify fresh from the task→tier heuristic
12
+ (`contexts/model-recommendations.md`): deep reasoning → high; mechanical /
13
+ impl / docs / tests / quality → medium; clearly-trivial → lite; meta /
14
+ ambiguous → inherit.
15
+
16
+ A small explicit `_LITE` set demotes obviously-trivial mechanical skills to the
17
+ cheapest band; `_CONTEXT_LARGE` adds the orthogonal `context: large` modifier to
18
+ genuinely long-context skills. Writes BOTH the source and its `.agent-src` copy
19
+ (frontmatter stays byte-identical); refresh condensation hashes afterwards.
20
+
21
+ CLI: python3 scripts/backfill_model_tier.py [--dry-run]
22
+ """
23
+ from __future__ import annotations
24
+
25
+ import argparse
26
+ import re
27
+ import sys
28
+ from collections import Counter
29
+ from pathlib import Path
30
+
31
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
32
+ from validate_frontmatter import parse_frontmatter # noqa: E402
33
+ from _lib.agent_src import artefact_roots # noqa: E402
34
+
35
+ ROOT = Path(__file__).resolve().parents[1]
36
+ CONDENSED = ROOT / ".agent-src"
37
+
38
+ # ADR-034 → ADR-035 value map.
39
+ _MIGRATE = {"opus": "high", "sonnet": "medium", "gpt": "high", "inherit": "inherit"}
40
+
41
+ # Fresh-classification slug signals (deep reasoning / large-analysis → high).
42
+ _HIGH = (
43
+ "architect", "refactor", "debug", "threat", "authz", "adversarial",
44
+ "blast-radius", "defense-in-depth", "data-flow", "decision-record",
45
+ "adr-create", "security-audit", "privacy-review", "review", "judge-",
46
+ "bug-analyzer", "systematic-debugging", "incident", "risk-officer",
47
+ "migration-architect", "moat", "analysis", "analyze", "analyzer",
48
+ "research", "deep-reading", "repomix", "sequential-thinking",
49
+ "project-analysis", "universal-project", "market-entry",
50
+ "scenario-modeling", "forecast", "dcf-modeling", "unit-economics",
51
+ "funnel-analysis",
52
+ )
53
+ _MEDIUM = (
54
+ "test", "pest", "playwright", "lint", "quality-tools", "format", "docs",
55
+ "readme-writing", "commit", "conventional", "css", "tailwind", "blade",
56
+ "flux", "livewire", "form-handler", "api-endpoint", "api-testing",
57
+ "eloquent", "laravel", "dto", "mail", "notification", "migration",
58
+ "middleware", "scheduling", "websocket", "reverb", "horizon", "pulse",
59
+ "pennant", "validation", "docker", "terraform", "terragrunt", "github-ci",
60
+ "traefik", "grafana", "dashboard", "openapi", "sql", "artisan", "composer",
61
+ "jobs-events", "multi-tenancy", "secrets", "logging", "database",
62
+ "php-coder", "php-service", "nextjs", "react", "symfony", "mcp",
63
+ "devcontainer", "copilot", "module",
64
+ )
65
+ _DOMAIN_DEFAULT = {
66
+ "engineering": "medium", "quality": "medium", "devops": "medium",
67
+ "discovery": "high", "product": "inherit", "process": "inherit",
68
+ }
69
+
70
+ # Clearly-trivial, no-reasoning mechanical skills → cheapest band.
71
+ _LITE = {"file-editor", "md-language-check"}
72
+ # Genuinely long-context skills → orthogonal context modifier (ADR-035).
73
+ _CONTEXT_LARGE = {
74
+ "project-analysis-core", "project-analysis-hypothesis-driven",
75
+ "project-analyzer", "universal-project-analysis", "repomix-packer",
76
+ "deep-reading-analyst",
77
+ }
78
+
79
+ _RM_RE = re.compile(r'^recommended_model:[ \t]*"?[a-z0-9-]+"?[ \t]*$', re.MULTILINE)
80
+ _MT_RE = re.compile(r'^model_tier:', re.MULTILINE)
81
+ _CTX_RE = re.compile(r'^context:', re.MULTILINE)
82
+
83
+
84
+ def _classify(slug: str, domain: str | None) -> str:
85
+ s = slug.lower()
86
+ if s in _LITE:
87
+ return "lite"
88
+ if any(k in s for k in _HIGH):
89
+ return "high"
90
+ if any(k in s for k in _MEDIUM):
91
+ return "medium"
92
+ return _DOMAIN_DEFAULT.get(domain or "", "inherit")
93
+
94
+
95
+ def _resolve_tier(slug: str, fm: dict | None) -> str:
96
+ existing_mt = fm.get("model_tier") if isinstance(fm, dict) else None
97
+ if existing_mt:
98
+ tier = existing_mt
99
+ else:
100
+ existing_rm = fm.get("recommended_model") if isinstance(fm, dict) else None
101
+ if existing_rm:
102
+ tier = _MIGRATE.get(existing_rm, "inherit")
103
+ else:
104
+ tier = _classify(slug, fm.get("domain") if isinstance(fm, dict) else None)
105
+ return "lite" if slug in _LITE else tier
106
+
107
+
108
+ def _apply(path: Path, tier: str, want_context: bool) -> bool:
109
+ text = path.read_text(encoding="utf-8")
110
+ if not text.startswith("---\n"):
111
+ return False
112
+ end = text.find("\n---\n", 4)
113
+ if end == -1:
114
+ return False
115
+ fm, body = text[4:end], text[end:]
116
+ changed = False
117
+ if _MT_RE.search(fm):
118
+ pass # already migrated — idempotent
119
+ elif _RM_RE.search(fm):
120
+ fm = _RM_RE.sub(f"model_tier: {tier}", fm, count=1)
121
+ changed = True
122
+ else:
123
+ fm = f"model_tier: {tier}\n" + fm
124
+ changed = True
125
+ if want_context and not _CTX_RE.search(fm):
126
+ fm = re.sub(r'(^model_tier:.*$)', r'\1\ncontext: large', fm, count=1, flags=re.MULTILINE)
127
+ changed = True
128
+ if changed:
129
+ path.write_text("---\n" + fm + body, encoding="utf-8")
130
+ return changed
131
+
132
+
133
+ def _iter():
134
+ for root in artefact_roots():
135
+ sdir = root / "skills"
136
+ if sdir.exists():
137
+ for p in sorted(sdir.rglob("SKILL.md")):
138
+ slug = p.parent.name
139
+ yield p, CONDENSED / "skills" / slug / "SKILL.md", slug
140
+ cdir = root / "commands"
141
+ if cdir.exists():
142
+ for p in sorted(cdir.rglob("*.md")):
143
+ if p.name == "AGENTS.md":
144
+ continue
145
+ rel = p.relative_to(cdir)
146
+ slug = "-".join(rel.with_suffix("").parts)
147
+ yield p, CONDENSED / "commands" / rel, slug
148
+
149
+
150
+ def run(apply: bool) -> int:
151
+ dist: Counter = Counter()
152
+ ctx = 0
153
+ touched = 0
154
+ for src, cond, slug in _iter():
155
+ fm, _ = parse_frontmatter(src.read_text(encoding="utf-8"))
156
+ tier = _resolve_tier(slug, fm)
157
+ want_ctx = slug in _CONTEXT_LARGE
158
+ dist[tier] += 1
159
+ if want_ctx:
160
+ ctx += 1
161
+ if apply:
162
+ if _apply(src, tier, want_ctx):
163
+ touched += 1
164
+ if cond.exists():
165
+ _apply(cond, tier, want_ctx)
166
+ verb = "would set" if not apply else "set"
167
+ print(f"model_tier backfill ({'dry-run' if not apply else 'apply'}):")
168
+ for t in ("lite", "medium", "high", "inherit"):
169
+ print(f" {t:8s}: {dist[t]}")
170
+ print(f" context:large on {ctx} skills · {verb} {touched} newly · total {sum(dist.values())}")
171
+ return 0
172
+
173
+
174
+ def main(argv=None) -> int:
175
+ ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
176
+ ap.add_argument("--dry-run", action="store_true")
177
+ args = ap.parse_args(argv)
178
+ return run(apply=not args.dry_run)
179
+
180
+
181
+ if __name__ == "__main__":
182
+ sys.exit(main())
@@ -9,6 +9,7 @@ and asserts every changed file matches the version-bump allowlist:
9
9
  * `.claude-plugin/marketplace.json`
10
10
  * `packages/*/pack.yaml`
11
11
  * `packages/*/README.md`
12
+ * `docs/archive/CHANGELOG-pre-*.md`
12
13
 
13
14
  Exit codes:
14
15
 
@@ -40,6 +41,12 @@ ALLOWLIST_GLOBS = (
40
41
  ".claude-plugin/marketplace.json",
41
42
  "packages/*/pack.yaml",
42
43
  "packages/*/README.md",
44
+ # `scripts/release.py` auto-splits the CHANGELOG era before bumping
45
+ # (perform_split / plan_split in `_lib/changelog_eras.py`) whenever the
46
+ # current era body crosses CURRENT_ERA_BODY_CAP. The split emits a new
47
+ # `docs/archive/CHANGELOG-pre-X.Y.Z.md` — part of the release surface,
48
+ # so the shape gate must allow it. Test-enforced by test_changelog_eras.
49
+ "docs/archive/CHANGELOG-pre-*.md",
43
50
  )
44
51
 
45
52