@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
@@ -876,8 +876,72 @@ def _iter_commands():
876
876
  yield source_file, _command_slug(source_file)
877
877
 
878
878
 
879
+ # --- Per-skill model auto-switch (ADR-035 / road-to-model-capability-tiers) ---
880
+
881
+ # The SINGLE generator-owned tier→Claude-model mapping (ADR-035 § 3). Claude
882
+ # Code is the only surface that consumes a native `model:`, so this is the only
883
+ # place a capability tier resolves to a concrete model. `inherit`/absent emit
884
+ # nothing and stay pure symlinks. Non-Claude agents never get a per-vendor
885
+ # table — the rule surfaces the tier name as a suggestion.
886
+ _TIER_TO_CLAUDE_MODEL = {"high": "opus", "medium": "sonnet", "lite": "haiku"}
887
+ _MODEL_TIER_RE = re.compile(r'^model_tier:\s*"?([a-z]+)"?\s*$', re.MULTILINE)
888
+
889
+
890
+ def _read_model_auto_switch() -> str:
891
+ """Read `model.auto_switch` from .agent-settings.yml.
892
+
893
+ Returns `auto` | `suggest` | `off`; default `suggest`. Only `auto` makes
894
+ the generator emit a native Claude `model:` key (ADR-034 § 4) — `suggest`
895
+ and `off` keep skills/commands as pure symlinks so the package never
896
+ silently overrides a user's explicit `/model` choice.
897
+ """
898
+ try:
899
+ from scripts._lib.agent_settings import load_agent_settings
900
+ except ImportError: # pragma: no cover — script-style invocation
901
+ import sys as _sys
902
+ from pathlib import Path as _Path
903
+ _sys.path.insert(0, str(_Path(__file__).resolve().parent))
904
+ from _lib.agent_settings import load_agent_settings # type: ignore[import-not-found]
905
+ data = load_agent_settings(project_path=SETTINGS_FILE)
906
+ model = data.get("model")
907
+ value = model.get("auto_switch") if isinstance(model, dict) else None
908
+ if isinstance(value, str) and value.strip().lower() in ("auto", "suggest", "off"):
909
+ return value.strip().lower()
910
+ return "suggest"
911
+
912
+
913
+ def _model_tier(skill_md: Path) -> str | None:
914
+ """Return the `model_tier` frontmatter value, or None if absent."""
915
+ if not skill_md.exists():
916
+ return None
917
+ text = skill_md.read_text(encoding="utf-8", errors="replace")
918
+ if not text.startswith("---\n"):
919
+ return None
920
+ end = text.find("\n---\n", 4)
921
+ if end == -1:
922
+ return None
923
+ m = _MODEL_TIER_RE.search(text[4:end])
924
+ return m.group(1) if m else None
925
+
926
+
927
+ def _render_native_model_md(src_md: Path, tier: str) -> str:
928
+ """Rewrite the source `model_tier: <tier>` line to a native Claude
929
+ `model: <mapped>` key via the generator-owned mapping (ADR-035 § 3). The
930
+ rest of the SKILL.md is byte-identical."""
931
+ text = src_md.read_text(encoding="utf-8")
932
+ model = _TIER_TO_CLAUDE_MODEL[tier]
933
+ return _MODEL_TIER_RE.sub(f"model: {model}", text, count=1)
934
+
935
+
879
936
  def generate_claude_skills() -> int:
880
- """Create .claude/skills/ symlinks for ALL skills in .agent-src/skills/.
937
+ """Create .claude/skills/ entries for ALL skills in .agent-src/skills/.
938
+
939
+ Default: a directory symlink → .agent-src/skills/<name> (verbatim).
940
+ When `model.auto_switch: auto` AND a skill declares
941
+ `model_tier: lite|medium|high`, the entry becomes a real directory whose
942
+ sub-files are symlinked but whose SKILL.md is a rendered copy carrying a
943
+ native Claude `model:` key (ADR-034 Option (b) — only model-bearing skills
944
+ break the symlink). Idempotent: each entry is rebuilt from scratch.
881
945
  """
882
946
  if not SKILLS_SOURCE.exists():
883
947
  print(" ⚠️ .agent-src/skills/ not found — skipping skills", file=sys.stderr)
@@ -885,26 +949,58 @@ def generate_claude_skills() -> int:
885
949
 
886
950
  # All skill directories in .agent-src/skills/
887
951
  skills = sorted([d.name for d in SKILLS_SOURCE.iterdir() if d.is_dir()])
952
+ skill_set = set(skills)
888
953
  # All command slugs (to protect from stale cleanup)
889
954
  command_slugs = {slug for _, slug in _iter_commands()}
890
955
 
891
956
  CLAUDE_SKILLS_DIR.mkdir(parents=True, exist_ok=True)
957
+ auto = _read_model_auto_switch() == "auto"
892
958
 
893
- # Clean stale symlinks (but not converted commands or README)
959
+ # Clean stale entries (symlinks AND rendered skill dirs) — but never touch
960
+ # command dirs (real dir whose SKILL.md is a symlink) or the README.
894
961
  for item in CLAUDE_SKILLS_DIR.iterdir():
895
- if item.is_symlink() and item.name not in skills and item.name not in command_slugs and item.name != "README.md":
962
+ if item.name in skill_set or item.name in command_slugs or item.name == "README.md":
963
+ continue
964
+ if item.is_symlink():
896
965
  item.unlink()
966
+ elif item.is_dir():
967
+ skill_md = item / "SKILL.md"
968
+ # A rendered skill dir has a *real* SKILL.md copy; a command dir has
969
+ # a SKILL.md *symlink* (left for generate_claude_commands to manage).
970
+ if skill_md.is_file() and not skill_md.is_symlink():
971
+ shutil.rmtree(item)
897
972
 
898
973
  count = 0
974
+ rendered = 0
899
975
  for skill in skills:
900
976
  link = CLAUDE_SKILLS_DIR / skill
901
- if link.exists() or link.is_symlink():
977
+ src_dir = SKILLS_SOURCE / skill
978
+ value = _model_tier(src_dir / "SKILL.md") if auto else None
979
+ # Rebuild from scratch for idempotency (symlink ↔ rendered-dir flips).
980
+ if link.is_symlink():
902
981
  link.unlink()
903
- rel_target = Path("../../.agent-src/skills") / skill
904
- link.symlink_to(rel_target)
982
+ elif link.is_dir():
983
+ shutil.rmtree(link)
984
+ elif link.exists():
985
+ link.unlink()
986
+ if value in _TIER_TO_CLAUDE_MODEL:
987
+ link.mkdir(parents=True)
988
+ for entry in sorted(src_dir.iterdir()):
989
+ if entry.name == "SKILL.md":
990
+ (link / "SKILL.md").write_text(
991
+ _render_native_model_md(entry, value), encoding="utf-8"
992
+ )
993
+ else:
994
+ (link / entry.name).symlink_to(
995
+ Path("../../../.agent-src/skills") / skill / entry.name
996
+ )
997
+ rendered += 1
998
+ else:
999
+ link.symlink_to(Path("../../.agent-src/skills") / skill)
905
1000
  count += 1
906
1001
 
907
- info(f" ✅ Created {count} skill symlinks in .claude/skills/")
1002
+ suffix = f" ({rendered} rendered with native model:)" if rendered else ""
1003
+ info(f" ✅ Created {count} skill entries in .claude/skills/{suffix}")
908
1004
  return count
909
1005
 
910
1006
 
@@ -945,6 +1041,8 @@ def generate_claude_commands() -> int:
945
1041
  current_slugs: set[str] = set()
946
1042
  count = 0
947
1043
  skipped = 0
1044
+ rendered = 0
1045
+ auto = _read_model_auto_switch() == "auto"
948
1046
  for source_file, slug in _iter_commands():
949
1047
  # Skip if a real skill with the same name exists — skill takes priority
950
1048
  if slug in skill_names:
@@ -953,7 +1051,7 @@ def generate_claude_commands() -> int:
953
1051
 
954
1052
  current_slugs.add(slug)
955
1053
 
956
- # Create skill directory (real dir, symlinked SKILL.md inside)
1054
+ # Create skill directory (real dir, SKILL.md symlinked or rendered)
957
1055
  skill_dir = CLAUDE_SKILLS_DIR / slug
958
1056
  skill_dir.mkdir(parents=True, exist_ok=True)
959
1057
 
@@ -961,10 +1059,18 @@ def generate_claude_commands() -> int:
961
1059
  if skill_file.exists() or skill_file.is_symlink():
962
1060
  skill_file.unlink()
963
1061
 
964
- # Symlink: .claude/skills/{slug}/SKILL.md → ../../../.agent-src/commands/<rel-path>
965
1062
  rel_path = source_file.relative_to(COMMANDS_SOURCE)
966
- rel_target = Path("../../../.agent-src/commands") / rel_path
967
- skill_file.symlink_to(rel_target)
1063
+ value = _model_tier(source_file) if auto else None
1064
+ if value in _TIER_TO_CLAUDE_MODEL:
1065
+ # Render a copy carrying the native Claude model: key (ADR-034).
1066
+ skill_file.write_text(
1067
+ _render_native_model_md(source_file, value), encoding="utf-8"
1068
+ )
1069
+ rendered += 1
1070
+ else:
1071
+ # Symlink: .claude/skills/{slug}/SKILL.md → ../../../.agent-src/commands/<rel-path>
1072
+ rel_target = Path("../../../.agent-src/commands") / rel_path
1073
+ skill_file.symlink_to(rel_target)
968
1074
  count += 1
969
1075
 
970
1076
  # Clean stale command skill directories — real dirs from removed commands.
@@ -976,14 +1082,20 @@ def generate_claude_commands() -> int:
976
1082
  if item.name in skill_names or item.name in current_slugs:
977
1083
  continue
978
1084
  skill_md = item / "SKILL.md"
979
- if skill_md.is_symlink():
1085
+ # Stale command dir = exactly one SKILL.md, either symlinked (default)
1086
+ # or a rendered copy (native-model command, ADR-034). Skill-render dirs
1087
+ # are protected above (item.name in skill_names) and via the skills
1088
+ # generator, so this only reaps removed commands.
1089
+ if skill_md.is_symlink() or skill_md.is_file():
980
1090
  entries = list(item.iterdir())
981
1091
  if len(entries) == 1 and entries[0].name == "SKILL.md":
982
1092
  skill_md.unlink()
983
1093
  item.rmdir()
984
1094
  removed_dirs += 1
985
1095
 
986
- msg = f" ✅ Created {count} command symlinks in .claude/skills/"
1096
+ msg = f" ✅ Created {count} command entries in .claude/skills/"
1097
+ if rendered:
1098
+ msg += f" ({rendered} rendered with native model:)"
987
1099
  if skipped:
988
1100
  msg += f" ({skipped} skipped — same-name skill exists)"
989
1101
  if removed_dirs:
@@ -1080,8 +1192,12 @@ def generate_plugin_hooks() -> int:
1080
1192
  ``settings.local.json``. Claude Code merges plugin-scope and
1081
1193
  settings-scope hooks and dedups by command string.
1082
1194
 
1083
- The command is rooted at ``$CLAUDE_PROJECT_DIR`` so it resolves from
1084
- plugin scope regardless of cwd; the universal dispatcher then reads
1195
+ The command resolves the binary project-local-first
1196
+ (``$CLAUDE_PROJECT_DIR/agent-config`` when executable maintainer dev-loop)
1197
+ and falls back to ``agent-config`` on PATH (global-only consumer per
1198
+ ADR-020, where the repo carries no wrapper). It always passes
1199
+ ``--project-dir "$CLAUDE_PROJECT_DIR"`` so a globally resolved binary still
1200
+ scans the project the event fired in. The universal dispatcher then reads
1085
1201
  ``scripts/hook_manifest.yaml`` at runtime to fan out to the active
1086
1202
  concerns (each a no-op when its feature is disabled).
1087
1203
  """
@@ -1092,6 +1208,7 @@ def generate_plugin_hooks() -> int:
1092
1208
  return 0
1093
1209
 
1094
1210
  manifest = yaml.safe_load(manifest_path.read_text(encoding="utf-8")) or {}
1211
+ hook_spec = manifest.get("schema_version", 1)
1095
1212
  claude_events = manifest.get("platforms", {}).get("claude", {}) or {}
1096
1213
  aliases = manifest.get("native_event_aliases", {}).get("claude", {}) or {}
1097
1214
  # Reverse the native→agent-config map so we can emit native event names.
@@ -1104,9 +1221,17 @@ def generate_plugin_hooks() -> int:
1104
1221
  native = ac_to_native.get(ac_event)
1105
1222
  if native is None:
1106
1223
  continue
1224
+ # Resolve the binary project-local-first, PATH-fallback: a maintainer
1225
+ # dev-loop (or any repo carrying a project-local wrapper) uses its own
1226
+ # ./agent-config; a global-only consumer (ADR-020 — nothing in the
1227
+ # repo) falls back to the globally-installed `agent-config` on PATH.
1228
+ # Either way pass --project-dir "$CLAUDE_PROJECT_DIR" so a globally
1229
+ # resolved binary still scans the project the event fired in.
1107
1230
  command = (
1108
- '"$CLAUDE_PROJECT_DIR"/agent-config dispatch:hook '
1109
- f"--platform claude --event {ac_event} --native-event {native}"
1231
+ 'BIN="$CLAUDE_PROJECT_DIR/agent-config"; [ -x "$BIN" ] || BIN=agent-config; '
1232
+ f'"$BIN" dispatch:hook --platform claude --event {ac_event} '
1233
+ f'--native-event {native} --project-dir "$CLAUDE_PROJECT_DIR" '
1234
+ f'--min-version {hook_spec}'
1110
1235
  )
1111
1236
  hooks[native] = [{"hooks": [{"type": "command", "command": command}]}]
1112
1237
 
@@ -349,8 +349,36 @@ def main(argv: list[str] | None = None) -> int:
349
349
  parser.add_argument("--manifest", default=str(MANIFEST_PATH))
350
350
  parser.add_argument("--dry-run", action="store_true",
351
351
  help="Resolve concerns and print plan; do not invoke them.")
352
+ parser.add_argument("--project-dir", default="",
353
+ help="Project root the event fired in (the Claude "
354
+ "plugin passes $CLAUDE_PROJECT_DIR). A globally "
355
+ "resolved binary (ADR-020 global-only) has no "
356
+ "implicit project context, so concerns are "
357
+ "resolved relative to this directory.")
358
+ parser.add_argument("--min-version", type=int, default=0,
359
+ help="Minimum hook-spec (manifest schema_version) the "
360
+ "caller — typically the Claude marketplace plugin "
361
+ "— was generated against. Plugin and binary update "
362
+ "on independent cadences; when the binary's "
363
+ "manifest is older than the plugin expects, warn "
364
+ "(never block).")
352
365
  args = parser.parse_args(argv)
353
366
 
367
+ # Honour --project-dir: chdir so workspace_root (envelope) and every
368
+ # concern's cwd resolve consumer-local paths (agents/roadmaps/,
369
+ # agents/runtime/state/) against the project the event fired in, not the
370
+ # cwd a globally-installed binary happened to inherit. Fail loud (never
371
+ # block) when the path is bad — a wrong project root is a silent-no-op
372
+ # trap otherwise.
373
+ if args.project_dir:
374
+ project_dir = Path(args.project_dir).expanduser()
375
+ if project_dir.is_dir():
376
+ os.chdir(project_dir)
377
+ else:
378
+ sys.stderr.write(
379
+ f"dispatch_hook: --project-dir is not a directory: "
380
+ f"{project_dir} — resolving against cwd {Path.cwd()}\n")
381
+
354
382
  if args.event not in EVENT_VOCABULARY:
355
383
  sys.stderr.write(f"dispatch_hook: unknown event '{args.event}'; allowed: "
356
384
  f"{sorted(EVENT_VOCABULARY)}\n")
@@ -362,6 +390,17 @@ def main(argv: list[str] | None = None) -> int:
362
390
  return EXIT_ALLOW
363
391
  manifest = _load_yaml(manifest_path)
364
392
 
393
+ # Plugin↔binary drift guard (never blocks). The Claude marketplace plugin
394
+ # embeds the hook-spec it was generated against; if this globally-installed
395
+ # binary carries an older manifest, surface a one-line upgrade hint.
396
+ if args.min_version:
397
+ local_spec = manifest.get("schema_version") or 0
398
+ if isinstance(local_spec, int) and local_spec < args.min_version:
399
+ sys.stderr.write(
400
+ f"dispatch_hook: plugin expects hook-spec >= {args.min_version} "
401
+ f"but this agent-config provides {local_spec}; "
402
+ f"run `agent-config upgrade`.\n")
403
+
365
404
  payload_text = "" if sys.stdin.isatty() else sys.stdin.read()
366
405
  _maybe_capture_payload(args, payload_text)
367
406
  concerns = _resolve_concerns(manifest, args.platform, args.event)
package/scripts/install CHANGED
@@ -394,4 +394,18 @@ if ! $SKIP_BRIDGES; then
394
394
  run_bridges || RC=$?
395
395
  fi
396
396
 
397
+ # Post-install PATH advisory. The Claude plugin hook resolves `agent-config`
398
+ # from PATH on a global-only consumer (ADR-020); if it is unreachable every
399
+ # PostToolUse hook silently no-ops — the documented "dashboard never updates"
400
+ # failure. Advisory only: a bad PATH must not fail an otherwise-clean install.
401
+ if [[ $RC -eq 0 ]] && ! command -v agent-config >/dev/null 2>&1; then
402
+ $QUIET || {
403
+ echo " ⚠️ \`agent-config\` is not on your PATH." >&2
404
+ echo " Claude plugin hooks resolve it from PATH; without it the" >&2
405
+ echo " roadmap-progress dashboard (and other hooks) will not fire." >&2
406
+ echo " Add your npm global bin dir (\`npm prefix -g\`/bin) to PATH," >&2
407
+ echo " then verify with \`agent-config doctor\`." >&2
408
+ }
409
+ fi
410
+
397
411
  exit $RC
@@ -5,37 +5,37 @@
5
5
  {
6
6
  "file": ".agent-src.uncondensed/skills/module-detect-on-the-fly/SKILL.md",
7
7
  "lines": [
8
- 33,
9
- 95
8
+ 34,
9
+ 96
10
10
  ],
11
11
  "reason": "Cross-stack noise-segment enumeration (vendor + node_modules + dist/Modules) documenting the module-detection path filter"
12
12
  },
13
13
  {
14
14
  "file": ".agent-src.uncondensed/skills/using-git-worktrees/SKILL.md",
15
15
  "lines": [
16
- 133,
17
16
  134,
18
17
  135,
19
- 155
18
+ 136,
19
+ 156
20
20
  ],
21
21
  "reason": "Multi-stack package-manager comparison table"
22
22
  },
23
23
  {
24
24
  "file": ".agent-src.uncondensed/skills/refine-prompt/SKILL.md",
25
25
  "lines": [
26
- 91,
27
- 93,
28
- 95,
29
- 140,
30
- 183,
31
- 272
26
+ 92,
27
+ 94,
28
+ 96,
29
+ 141,
30
+ 184,
31
+ 273
32
32
  ],
33
33
  "reason": "Project-detection enumeration listing all supported stacks"
34
34
  },
35
35
  {
36
36
  "file": ".agent-src.uncondensed/commands/analyze-reference-repo.md",
37
37
  "lines": [
38
- 53
38
+ 54
39
39
  ],
40
40
  "reason": "Manifest-file enumeration across ecosystems"
41
41
  },
@@ -77,51 +77,51 @@
77
77
  {
78
78
  "file": ".agent-src.uncondensed/skills/api-endpoint/SKILL.md",
79
79
  "lines": [
80
- 44,
81
- 61
80
+ 45,
81
+ 62
82
82
  ],
83
83
  "reason": "Cross-stack validation primitive enumeration and pointer to laravel-api-endpoint carve-out"
84
84
  },
85
85
  {
86
86
  "file": ".agent-src.uncondensed/skills/code-review/SKILL.md",
87
87
  "lines": [
88
- 43,
89
88
  44,
90
89
  45,
91
- 52,
92
- 65,
90
+ 46,
91
+ 53,
93
92
  66,
94
- 77,
95
- 86,
96
- 88,
97
- 90,
98
- 222
93
+ 67,
94
+ 78,
95
+ 87,
96
+ 89,
97
+ 91,
98
+ 223
99
99
  ],
100
100
  "reason": "Cross-stack code-review checklist enumerates handler shape, validation, authz, ORM, escaping per framework"
101
101
  },
102
102
  {
103
103
  "file": ".agent-src.uncondensed/skills/security/SKILL.md",
104
104
  "lines": [
105
- 19,
106
- 26,
107
- 30,
105
+ 20,
106
+ 27,
108
107
  31,
109
- 40,
110
- 44,
111
- 51,
112
- 61,
113
- 79
108
+ 32,
109
+ 41,
110
+ 45,
111
+ 52,
112
+ 62,
113
+ 80
114
114
  ],
115
115
  "reason": "Cross-stack security review enumerates auth primitives (Policies, voters, guards, middleware) and config paths"
116
116
  },
117
117
  {
118
118
  "file": ".agent-src.uncondensed/skills/verify-completion-evidence/SKILL.md",
119
119
  "lines": [
120
- 56,
121
120
  57,
122
121
  58,
123
- 103,
124
- 180
122
+ 59,
123
+ 104,
124
+ 181
125
125
  ],
126
126
  "reason": "Evidence-mapping table enumerates the type-checker / linter / refactor tool per stack including PHPStan, Rector, ECS"
127
127
  },
@@ -473,7 +473,7 @@
473
473
  {
474
474
  "file": ".agent-src.uncondensed/skills/code-review/SKILL.md",
475
475
  "lines": [
476
- 226
476
+ 227
477
477
  ],
478
478
  "reason": "Multi-stack formatter enumeration (ECS, Prettier, Ruff, gofmt) \u2014 comparative example, no project mandate"
479
479
  },
@@ -492,16 +492,16 @@
492
492
  {
493
493
  "file": ".agent-src.uncondensed/skills/context-document/SKILL.md",
494
494
  "lines": [
495
- 54,
496
495
  55,
497
- 78
496
+ 56,
497
+ 79
498
498
  ],
499
499
  "reason": "Cross-stack target-directory examples (Laravel / Symfony) for module-scoped context docs \u2014 comparative example, no mandate"
500
500
  },
501
501
  {
502
502
  "file": ".agent-src.uncondensed/skills/roadmap-writing/SKILL.md",
503
503
  "lines": [
504
- 19
504
+ 20
505
505
  ],
506
506
  "reason": "Single Laravel-shape example showing how `{module_root}/{agent_folder}/roadmaps/` resolves on a Laravel HMVC project"
507
507
  },
@@ -522,52 +522,52 @@
522
522
  {
523
523
  "file": ".agent-src.uncondensed/commands/context/create.md",
524
524
  "lines": [
525
- 52
525
+ 53
526
526
  ],
527
527
  "reason": "Single Laravel-shape example for module-context target directory (road-to-configurable-modules Phase D)"
528
528
  },
529
529
  {
530
530
  "file": ".agent-src.uncondensed/commands/context/refactor.md",
531
531
  "lines": [
532
- 26
532
+ 27
533
533
  ],
534
534
  "reason": "Single Laravel-shape example for module-context discovery path (road-to-configurable-modules Phase D)"
535
535
  },
536
536
  {
537
537
  "file": ".agent-src.uncondensed/commands/feature/explore.md",
538
538
  "lines": [
539
- 122
539
+ 123
540
540
  ],
541
541
  "reason": "Single Laravel-shape example showing how `enumerate_modules()` resolves on a Laravel HMVC project (road-to-configurable-modules Phase D)"
542
542
  },
543
543
  {
544
544
  "file": ".agent-src.uncondensed/commands/feature/plan.md",
545
545
  "lines": [
546
- 141,
547
- 170,
548
- 254
546
+ 142,
547
+ 171,
548
+ 255
549
549
  ],
550
550
  "reason": "Laravel-shape examples for module-scoped contexts and feature target paths (road-to-configurable-modules Phase D)"
551
551
  },
552
552
  {
553
553
  "file": ".agent-src.uncondensed/commands/feature/refactor.md",
554
554
  "lines": [
555
- 26
555
+ 27
556
556
  ],
557
557
  "reason": "Single Laravel-shape example for module-feature discovery path (road-to-configurable-modules Phase D)"
558
558
  },
559
559
  {
560
560
  "file": ".agent-src.uncondensed/commands/feature/roadmap.md",
561
561
  "lines": [
562
- 26,
563
- 126
562
+ 27,
563
+ 127
564
564
  ],
565
565
  "reason": "Laravel-shape examples for module-feature/roadmap discovery and target paths (road-to-configurable-modules Phase D)"
566
566
  },
567
567
  {
568
568
  "file": ".agent-src.uncondensed/commands/optimize/agents-dir.md",
569
569
  "lines": [
570
- 23
570
+ 24
571
571
  ],
572
572
  "reason": "Single Laravel-shape example for per-module agents directory (road-to-configurable-modules Phase D)"
573
573
  }
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env python3
2
+ """Fail when a skill or command lacks a `model_tier` value.
3
+
4
+ Phase 5 coverage gate of `road-to-model-capability-tiers.md` (ADR-035):
5
+ every skill and command MUST declare an explicit `model_tier`
6
+ (`opus | sonnet | gpt`) or `inherit`. An untagged artefact is an error — it
7
+ leaves the per-skill model-switch surface with a silent gap. Run
8
+ `python3 scripts/backfill_model_tier.py` to seed missing tags.
9
+
10
+ The enum itself is validated by `scripts/validate_frontmatter.py`; this gate
11
+ only enforces *presence* (an explicit decision was made for every artefact).
12
+
13
+ CLI: python3 scripts/lint_model_tier_coverage.py [--quiet]
14
+ Exit: 0 clean · 1 at least one untagged skill/command.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import sys
20
+ from pathlib import Path
21
+
22
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
23
+ from validate_frontmatter import parse_frontmatter # noqa: E402
24
+ from _lib.agent_src import artefact_roots # noqa: E402
25
+
26
+ ROOT = Path(__file__).resolve().parents[1]
27
+
28
+
29
+ def _targets():
30
+ for root in artefact_roots():
31
+ sdir = root / "skills"
32
+ if sdir.exists():
33
+ for p in sorted(sdir.rglob("SKILL.md")):
34
+ yield "skill", p
35
+ cdir = root / "commands"
36
+ if cdir.exists():
37
+ for p in sorted(cdir.rglob("*.md")):
38
+ if p.name != "AGENTS.md":
39
+ yield "command", p
40
+
41
+
42
+ def main(argv=None) -> int:
43
+ ap = argparse.ArgumentParser(description=__doc__.splitlines()[0])
44
+ ap.add_argument("--quiet", action="store_true")
45
+ args = ap.parse_args(argv)
46
+
47
+ total = 0
48
+ missing = []
49
+ for kind, path in _targets():
50
+ total += 1
51
+ fm, _ = parse_frontmatter(path.read_text(encoding="utf-8"))
52
+ if not isinstance(fm, dict) or not fm.get("model_tier"):
53
+ missing.append((kind, path.relative_to(ROOT).as_posix()))
54
+
55
+ if missing:
56
+ for kind, rel in missing[:40]:
57
+ print(f"❌ [{kind}] {rel}: missing `model_tier` "
58
+ f"(set lite/medium/high or inherit)")
59
+ if len(missing) > 40:
60
+ print(f" ... and {len(missing) - 40} more")
61
+ print(
62
+ f"\n== model_tier coverage: {len(missing)}/{total} artefact(s) "
63
+ "untagged. Run `python3 scripts/backfill_model_tier.py`. ==",
64
+ file=sys.stderr,
65
+ )
66
+ return 1
67
+ if not args.quiet:
68
+ print(f"✅ lint-model-tier-coverage: {total} artefact(s) tagged.")
69
+ return 0
70
+
71
+
72
+ if __name__ == "__main__":
73
+ sys.exit(main())
@@ -75,6 +75,26 @@ def _candidate_paths(payload: dict) -> list[str]:
75
75
  return out
76
76
 
77
77
 
78
+ def _relativize(path: str, root: Path) -> str:
79
+ """Make an absolute path project-relative so the `agents/roadmaps/` prefix
80
+ check fires.
81
+
82
+ Claude Code passes an absolute `tool_input.file_path`
83
+ (`/Users/.../<repo>/agents/roadmaps/x.md`); Augment passes a repo-relative
84
+ one. Without this, an absolute path never matches the relative prefix and
85
+ the hook silently no-ops. Already-relative paths and out-of-tree paths are
86
+ returned unchanged — an out-of-tree roadmap correctly fails the prefix
87
+ check downstream.
88
+ """
89
+ p = Path(path)
90
+ if not p.is_absolute():
91
+ return path
92
+ try:
93
+ return str(p.resolve().relative_to(root.resolve()))
94
+ except (ValueError, OSError):
95
+ return path
96
+
97
+
78
98
  def _is_roadmap_touch(path: str) -> bool:
79
99
  """Return True if `path` is a roadmap file we should react to."""
80
100
  norm = path.lstrip("./").replace("\\", "/")
@@ -126,7 +146,7 @@ def run(stdin_text: str, *, consumer_root: Path, verbose: bool = False) -> int:
126
146
  if not isinstance(tool, str) or tool not in WRITE_TOOLS:
127
147
  return 0
128
148
 
129
- paths = _candidate_paths(payload)
149
+ paths = [_relativize(p, consumer_root) for p in _candidate_paths(payload)]
130
150
  if not any(_is_roadmap_touch(p) for p in paths):
131
151
  return 0
132
152
 
@@ -188,10 +208,16 @@ def main(argv: list[str] | None = None) -> int:
188
208
  parser = argparse.ArgumentParser(description=__doc__)
189
209
  parser.add_argument("--platform", default="generic",
190
210
  help="informational platform tag (augment/claude/...)")
211
+ parser.add_argument("--project-dir", default="",
212
+ help="project root override; falls back to cwd. The "
213
+ "Claude plugin passes $CLAUDE_PROJECT_DIR so a "
214
+ "globally-resolved binary (ADR-020) scans the "
215
+ "right project's agents/roadmaps/.")
191
216
  parser.add_argument("--verbose", action="store_true",
192
217
  help="emit one stderr line per invocation")
193
218
  args = parser.parse_args(argv)
194
- return run(sys.stdin.read(), consumer_root=Path.cwd(), verbose=args.verbose)
219
+ root = Path(args.project_dir).expanduser() if args.project_dir else Path.cwd()
220
+ return run(sys.stdin.read(), consumer_root=root, verbose=args.verbose)
195
221
 
196
222
 
197
223
  if __name__ == "__main__": # pragma: no cover