@event4u/agent-config 1.9.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 (446) hide show
  1. package/.agent-src/README.md +64 -0
  2. package/.agent-src/commands/agent-handoff.md +64 -0
  3. package/.agent-src/commands/agent-status.md +83 -0
  4. package/.agent-src/commands/agents-audit.md +243 -0
  5. package/.agent-src/commands/agents-cleanup.md +169 -0
  6. package/.agent-src/commands/agents-prepare.md +137 -0
  7. package/.agent-src/commands/analyze-reference-repo.md +191 -0
  8. package/.agent-src/commands/bug-fix.md +181 -0
  9. package/.agent-src/commands/bug-investigate.md +175 -0
  10. package/.agent-src/commands/commit.md +121 -0
  11. package/.agent-src/commands/compress.md +177 -0
  12. package/.agent-src/commands/config-agent-settings.md +126 -0
  13. package/.agent-src/commands/context-create.md +167 -0
  14. package/.agent-src/commands/context-refactor.md +170 -0
  15. package/.agent-src/commands/copilot-agents-init.md +150 -0
  16. package/.agent-src/commands/copilot-agents-optimize.md +251 -0
  17. package/.agent-src/commands/create-pr-description.md +112 -0
  18. package/.agent-src/commands/create-pr.md +76 -0
  19. package/.agent-src/commands/do-and-judge.md +114 -0
  20. package/.agent-src/commands/do-in-steps.md +84 -0
  21. package/.agent-src/commands/e2e-heal.md +98 -0
  22. package/.agent-src/commands/e2e-plan.md +85 -0
  23. package/.agent-src/commands/estimate-ticket.md +80 -0
  24. package/.agent-src/commands/feature-dev.md +111 -0
  25. package/.agent-src/commands/feature-explore.md +180 -0
  26. package/.agent-src/commands/feature-plan.md +288 -0
  27. package/.agent-src/commands/feature-refactor.md +181 -0
  28. package/.agent-src/commands/feature-roadmap.md +184 -0
  29. package/.agent-src/commands/fix-ci.md +48 -0
  30. package/.agent-src/commands/fix-portability.md +97 -0
  31. package/.agent-src/commands/fix-pr-bot-comments.md +146 -0
  32. package/.agent-src/commands/fix-pr-comments.md +58 -0
  33. package/.agent-src/commands/fix-pr-developer-comments.md +152 -0
  34. package/.agent-src/commands/fix-references.md +94 -0
  35. package/.agent-src/commands/fix-seeder.md +146 -0
  36. package/.agent-src/commands/implement-ticket.md +133 -0
  37. package/.agent-src/commands/jira-ticket.md +71 -0
  38. package/.agent-src/commands/judge.md +86 -0
  39. package/.agent-src/commands/memory-add.md +130 -0
  40. package/.agent-src/commands/memory-full.md +97 -0
  41. package/.agent-src/commands/memory-promote.md +144 -0
  42. package/.agent-src/commands/mode.md +121 -0
  43. package/.agent-src/commands/module-create.md +132 -0
  44. package/.agent-src/commands/module-explore.md +157 -0
  45. package/.agent-src/commands/optimize-agents.md +139 -0
  46. package/.agent-src/commands/optimize-augmentignore.md +262 -0
  47. package/.agent-src/commands/optimize-rtk-filters.md +120 -0
  48. package/.agent-src/commands/optimize-skills.md +121 -0
  49. package/.agent-src/commands/override-create.md +97 -0
  50. package/.agent-src/commands/override-manage.md +96 -0
  51. package/.agent-src/commands/package-reset.md +154 -0
  52. package/.agent-src/commands/package-test.md +154 -0
  53. package/.agent-src/commands/prepare-for-review.md +91 -0
  54. package/.agent-src/commands/project-analyze.md +300 -0
  55. package/.agent-src/commands/project-health.md +95 -0
  56. package/.agent-src/commands/propose-memory.md +108 -0
  57. package/.agent-src/commands/quality-fix.md +106 -0
  58. package/.agent-src/commands/refine-ticket.md +81 -0
  59. package/.agent-src/commands/review-changes.md +130 -0
  60. package/.agent-src/commands/review-routing.md +111 -0
  61. package/.agent-src/commands/roadmap-create.md +110 -0
  62. package/.agent-src/commands/roadmap-execute.md +68 -0
  63. package/.agent-src/commands/rule-compliance-audit.md +139 -0
  64. package/.agent-src/commands/tests-create.md +73 -0
  65. package/.agent-src/commands/tests-execute.md +58 -0
  66. package/.agent-src/commands/threat-model.md +115 -0
  67. package/.agent-src/commands/update-form-request-messages.md +189 -0
  68. package/.agent-src/commands/upstream-contribute.md +171 -0
  69. package/.agent-src/contexts/augment-infrastructure.md +181 -0
  70. package/.agent-src/contexts/documentation-hierarchy.md +142 -0
  71. package/.agent-src/contexts/model-recommendations.md +142 -0
  72. package/.agent-src/contexts/override-system.md +187 -0
  73. package/.agent-src/contexts/skills-and-commands.md +154 -0
  74. package/.agent-src/contexts/subagent-configuration.md +62 -0
  75. package/.agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +110 -0
  76. package/.agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
  77. package/.agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
  78. package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +117 -0
  79. package/.agent-src/guidelines/agent-infra/layered-settings.md +158 -0
  80. package/.agent-src/guidelines/agent-infra/memory-access.md +121 -0
  81. package/.agent-src/guidelines/agent-infra/naming.md +69 -0
  82. package/.agent-src/guidelines/agent-infra/output-patterns.md +117 -0
  83. package/.agent-src/guidelines/agent-infra/review-routing-data-format.md +144 -0
  84. package/.agent-src/guidelines/agent-infra/role-contracts.md +211 -0
  85. package/.agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
  86. package/.agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
  87. package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +135 -0
  88. package/.agent-src/guidelines/agent-infra/size-and-scope.md +189 -0
  89. package/.agent-src/guidelines/agent-infra/tool-integration.md +73 -0
  90. package/.agent-src/guidelines/docs/readme-size-and-splitting.md +153 -0
  91. package/.agent-src/guidelines/e2e/playwright.md +363 -0
  92. package/.agent-src/guidelines/php/api-design.md +115 -0
  93. package/.agent-src/guidelines/php/artisan-commands.md +81 -0
  94. package/.agent-src/guidelines/php/blade-ui.md +78 -0
  95. package/.agent-src/guidelines/php/controllers.md +90 -0
  96. package/.agent-src/guidelines/php/database.md +111 -0
  97. package/.agent-src/guidelines/php/eloquent.md +208 -0
  98. package/.agent-src/guidelines/php/flux.md +80 -0
  99. package/.agent-src/guidelines/php/general.md +191 -0
  100. package/.agent-src/guidelines/php/git.md +96 -0
  101. package/.agent-src/guidelines/php/jobs.md +111 -0
  102. package/.agent-src/guidelines/php/livewire.md +71 -0
  103. package/.agent-src/guidelines/php/logging.md +79 -0
  104. package/.agent-src/guidelines/php/naming.md +89 -0
  105. package/.agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
  106. package/.agent-src/guidelines/php/patterns/dtos.md +199 -0
  107. package/.agent-src/guidelines/php/patterns/events.md +67 -0
  108. package/.agent-src/guidelines/php/patterns/factory.md +53 -0
  109. package/.agent-src/guidelines/php/patterns/pipelines.md +66 -0
  110. package/.agent-src/guidelines/php/patterns/policies.md +66 -0
  111. package/.agent-src/guidelines/php/patterns/repositories.md +122 -0
  112. package/.agent-src/guidelines/php/patterns/service-layer.md +64 -0
  113. package/.agent-src/guidelines/php/patterns/strategy.md +69 -0
  114. package/.agent-src/guidelines/php/patterns.md +28 -0
  115. package/.agent-src/guidelines/php/performance.md +92 -0
  116. package/.agent-src/guidelines/php/resources.md +100 -0
  117. package/.agent-src/guidelines/php/security.md +110 -0
  118. package/.agent-src/guidelines/php/sql.md +97 -0
  119. package/.agent-src/guidelines/php/validations.md +119 -0
  120. package/.agent-src/guidelines/php/websocket.md +100 -0
  121. package/.agent-src/personas/README.md +104 -0
  122. package/.agent-src/personas/ai-agent.md +77 -0
  123. package/.agent-src/personas/critical-challenger.md +73 -0
  124. package/.agent-src/personas/developer.md +73 -0
  125. package/.agent-src/personas/product-owner.md +78 -0
  126. package/.agent-src/personas/qa.md +67 -0
  127. package/.agent-src/personas/senior-engineer.md +77 -0
  128. package/.agent-src/personas/stakeholder.md +78 -0
  129. package/.agent-src/rules/agent-docs.md +61 -0
  130. package/.agent-src/rules/analysis-skill-routing.md +48 -0
  131. package/.agent-src/rules/architecture.md +62 -0
  132. package/.agent-src/rules/artifact-drafting-protocol.md +73 -0
  133. package/.agent-src/rules/ask-when-uncertain.md +52 -0
  134. package/.agent-src/rules/augment-portability.md +38 -0
  135. package/.agent-src/rules/augment-source-of-truth.md +128 -0
  136. package/.agent-src/rules/capture-learnings.md +89 -0
  137. package/.agent-src/rules/cli-output-handling.md +94 -0
  138. package/.agent-src/rules/commit-conventions.md +64 -0
  139. package/.agent-src/rules/context-hygiene.md +90 -0
  140. package/.agent-src/rules/docker-commands.md +55 -0
  141. package/.agent-src/rules/docs-sync.md +79 -0
  142. package/.agent-src/rules/downstream-changes.md +70 -0
  143. package/.agent-src/rules/e2e-testing.md +53 -0
  144. package/.agent-src/rules/guidelines.md +90 -0
  145. package/.agent-src/rules/improve-before-implement.md +94 -0
  146. package/.agent-src/rules/language-and-tone.md +104 -0
  147. package/.agent-src/rules/laravel-translations.md +48 -0
  148. package/.agent-src/rules/markdown-safe-codeblocks.md +18 -0
  149. package/.agent-src/rules/minimal-safe-diff.md +87 -0
  150. package/.agent-src/rules/missing-tool-handling.md +62 -0
  151. package/.agent-src/rules/model-recommendation.md +70 -0
  152. package/.agent-src/rules/package-ci-checks.md +80 -0
  153. package/.agent-src/rules/php-coding.md +63 -0
  154. package/.agent-src/rules/preservation-guard.md +29 -0
  155. package/.agent-src/rules/review-routing-awareness.md +125 -0
  156. package/.agent-src/rules/reviewer-awareness.md +92 -0
  157. package/.agent-src/rules/roadmap-progress-sync.md +56 -0
  158. package/.agent-src/rules/role-mode-adherence.md +54 -0
  159. package/.agent-src/rules/rule-type-governance.md +46 -0
  160. package/.agent-src/rules/runtime-safety.md +42 -0
  161. package/.agent-src/rules/scope-control.md +40 -0
  162. package/.agent-src/rules/security-sensitive-stop.md +77 -0
  163. package/.agent-src/rules/size-enforcement.md +29 -0
  164. package/.agent-src/rules/skill-improvement-trigger.md +58 -0
  165. package/.agent-src/rules/skill-quality.md +110 -0
  166. package/.agent-src/rules/slash-commands.md +30 -0
  167. package/.agent-src/rules/think-before-action.md +91 -0
  168. package/.agent-src/rules/token-efficiency.md +99 -0
  169. package/.agent-src/rules/tool-safety.md +36 -0
  170. package/.agent-src/rules/upstream-proposal.md +76 -0
  171. package/.agent-src/rules/user-interaction.md +79 -0
  172. package/.agent-src/rules/verify-before-complete.md +120 -0
  173. package/.agent-src/scripts/scan-seeder-violations.php +145 -0
  174. package/.agent-src/scripts/update_roadmap_progress.py +244 -0
  175. package/.agent-src/skills/adversarial-review/SKILL.md +149 -0
  176. package/.agent-src/skills/agent-docs-writing/SKILL.md +234 -0
  177. package/.agent-src/skills/analysis-autonomous-mode/SKILL.md +197 -0
  178. package/.agent-src/skills/analysis-skill-router/SKILL.md +134 -0
  179. package/.agent-src/skills/api-design/SKILL.md +104 -0
  180. package/.agent-src/skills/api-endpoint/SKILL.md +185 -0
  181. package/.agent-src/skills/api-testing/SKILL.md +206 -0
  182. package/.agent-src/skills/artisan-commands/SKILL.md +78 -0
  183. package/.agent-src/skills/authz-review/SKILL.md +171 -0
  184. package/.agent-src/skills/aws-infrastructure/SKILL.md +152 -0
  185. package/.agent-src/skills/blade-ui/SKILL.md +75 -0
  186. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +185 -0
  187. package/.agent-src/skills/bug-analyzer/SKILL.md +256 -0
  188. package/.agent-src/skills/check-refs/SKILL.md +72 -0
  189. package/.agent-src/skills/code-refactoring/SKILL.md +200 -0
  190. package/.agent-src/skills/code-review/SKILL.md +214 -0
  191. package/.agent-src/skills/command-routing/SKILL.md +96 -0
  192. package/.agent-src/skills/command-writing/SKILL.md +143 -0
  193. package/.agent-src/skills/composer-packages/SKILL.md +172 -0
  194. package/.agent-src/skills/context-authoring/SKILL.md +157 -0
  195. package/.agent-src/skills/context-document/SKILL.md +153 -0
  196. package/.agent-src/skills/conventional-commits-writing/SKILL.md +70 -0
  197. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +220 -0
  198. package/.agent-src/skills/copilot-config/SKILL.md +203 -0
  199. package/.agent-src/skills/dashboard-design/SKILL.md +116 -0
  200. package/.agent-src/skills/data-flow-mapper/SKILL.md +160 -0
  201. package/.agent-src/skills/database/SKILL.md +91 -0
  202. package/.agent-src/skills/dependency-upgrade/SKILL.md +204 -0
  203. package/.agent-src/skills/description-assist/SKILL.md +169 -0
  204. package/.agent-src/skills/design-review/SKILL.md +228 -0
  205. package/.agent-src/skills/devcontainer/SKILL.md +121 -0
  206. package/.agent-src/skills/developer-like-execution/SKILL.md +276 -0
  207. package/.agent-src/skills/docker/SKILL.md +245 -0
  208. package/.agent-src/skills/dto-creator/SKILL.md +117 -0
  209. package/.agent-src/skills/eloquent/SKILL.md +92 -0
  210. package/.agent-src/skills/eloquent/evals/last-run.json +99 -0
  211. package/.agent-src/skills/eloquent/evals/triggers.json +16 -0
  212. package/.agent-src/skills/estimate-ticket/SKILL.md +186 -0
  213. package/.agent-src/skills/estimate-ticket/evals/output-schema.yml +20 -0
  214. package/.agent-src/skills/estimate-ticket/evals/triggers.json +18 -0
  215. package/.agent-src/skills/fe-design/SKILL.md +223 -0
  216. package/.agent-src/skills/feature-planning/SKILL.md +226 -0
  217. package/.agent-src/skills/file-editor/SKILL.md +129 -0
  218. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +200 -0
  219. package/.agent-src/skills/flux/SKILL.md +64 -0
  220. package/.agent-src/skills/git-workflow/SKILL.md +102 -0
  221. package/.agent-src/skills/github-ci/SKILL.md +122 -0
  222. package/.agent-src/skills/grafana/SKILL.md +168 -0
  223. package/.agent-src/skills/guideline-writing/SKILL.md +147 -0
  224. package/.agent-src/skills/jira-integration/SKILL.md +182 -0
  225. package/.agent-src/skills/jobs-events/SKILL.md +87 -0
  226. package/.agent-src/skills/judge-bug-hunter/SKILL.md +157 -0
  227. package/.agent-src/skills/judge-code-quality/SKILL.md +158 -0
  228. package/.agent-src/skills/judge-security-auditor/SKILL.md +167 -0
  229. package/.agent-src/skills/judge-test-coverage/SKILL.md +154 -0
  230. package/.agent-src/skills/laravel/SKILL.md +195 -0
  231. package/.agent-src/skills/laravel-horizon/SKILL.md +169 -0
  232. package/.agent-src/skills/laravel-mail/SKILL.md +193 -0
  233. package/.agent-src/skills/laravel-middleware/SKILL.md +185 -0
  234. package/.agent-src/skills/laravel-notifications/SKILL.md +168 -0
  235. package/.agent-src/skills/laravel-pennant/SKILL.md +188 -0
  236. package/.agent-src/skills/laravel-pulse/SKILL.md +160 -0
  237. package/.agent-src/skills/laravel-reverb/SKILL.md +205 -0
  238. package/.agent-src/skills/laravel-scheduling/SKILL.md +167 -0
  239. package/.agent-src/skills/laravel-validation/SKILL.md +71 -0
  240. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +249 -0
  241. package/.agent-src/skills/lint-skills/SKILL.md +72 -0
  242. package/.agent-src/skills/livewire/SKILL.md +79 -0
  243. package/.agent-src/skills/logging-monitoring/SKILL.md +100 -0
  244. package/.agent-src/skills/mcp/SKILL.md +193 -0
  245. package/.agent-src/skills/merge-conflicts/SKILL.md +158 -0
  246. package/.agent-src/skills/migration-creator/SKILL.md +160 -0
  247. package/.agent-src/skills/module-management/SKILL.md +154 -0
  248. package/.agent-src/skills/multi-tenancy/SKILL.md +129 -0
  249. package/.agent-src/skills/openapi/SKILL.md +154 -0
  250. package/.agent-src/skills/override-management/SKILL.md +186 -0
  251. package/.agent-src/skills/performance/SKILL.md +69 -0
  252. package/.agent-src/skills/performance-analysis/SKILL.md +118 -0
  253. package/.agent-src/skills/pest-testing/SKILL.md +321 -0
  254. package/.agent-src/skills/php-coder/SKILL.md +78 -0
  255. package/.agent-src/skills/php-coder/evals/triggers.json +16 -0
  256. package/.agent-src/skills/php-debugging/SKILL.md +184 -0
  257. package/.agent-src/skills/php-service/SKILL.md +96 -0
  258. package/.agent-src/skills/playwright-testing/SKILL.md +244 -0
  259. package/.agent-src/skills/project-analysis-core/SKILL.md +138 -0
  260. package/.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +130 -0
  261. package/.agent-src/skills/project-analysis-laravel/SKILL.md +119 -0
  262. package/.agent-src/skills/project-analysis-nextjs/SKILL.md +123 -0
  263. package/.agent-src/skills/project-analysis-node-express/SKILL.md +111 -0
  264. package/.agent-src/skills/project-analysis-react/SKILL.md +119 -0
  265. package/.agent-src/skills/project-analysis-symfony/SKILL.md +111 -0
  266. package/.agent-src/skills/project-analysis-zend-laminas/SKILL.md +108 -0
  267. package/.agent-src/skills/project-analyzer/SKILL.md +341 -0
  268. package/.agent-src/skills/project-docs/SKILL.md +137 -0
  269. package/.agent-src/skills/quality-tools/SKILL.md +411 -0
  270. package/.agent-src/skills/readme-reviewer/SKILL.md +187 -0
  271. package/.agent-src/skills/readme-writing/SKILL.md +142 -0
  272. package/.agent-src/skills/readme-writing-package/SKILL.md +185 -0
  273. package/.agent-src/skills/receiving-code-review/SKILL.md +190 -0
  274. package/.agent-src/skills/refine-ticket/SKILL.md +310 -0
  275. package/.agent-src/skills/refine-ticket/detection-map.yml +124 -0
  276. package/.agent-src/skills/refine-ticket/evals/output-schema.yml +16 -0
  277. package/.agent-src/skills/refine-ticket/evals/triggers.json +16 -0
  278. package/.agent-src/skills/requesting-code-review/SKILL.md +199 -0
  279. package/.agent-src/skills/review-routing/SKILL.md +195 -0
  280. package/.agent-src/skills/roadmap-management/SKILL.md +303 -0
  281. package/.agent-src/skills/rtk-output-filtering/SKILL.md +184 -0
  282. package/.agent-src/skills/rule-writing/SKILL.md +148 -0
  283. package/.agent-src/skills/security/SKILL.md +79 -0
  284. package/.agent-src/skills/security-audit/SKILL.md +123 -0
  285. package/.agent-src/skills/sentry-integration/SKILL.md +170 -0
  286. package/.agent-src/skills/sequential-thinking/SKILL.md +158 -0
  287. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +155 -0
  288. package/.agent-src/skills/skill-management/SKILL.md +121 -0
  289. package/.agent-src/skills/skill-reviewer/SKILL.md +218 -0
  290. package/.agent-src/skills/skill-writing/SKILL.md +291 -0
  291. package/.agent-src/skills/skill-writing/evals/triggers.json +16 -0
  292. package/.agent-src/skills/sql-writing/SKILL.md +74 -0
  293. package/.agent-src/skills/subagent-orchestration/SKILL.md +190 -0
  294. package/.agent-src/skills/systematic-debugging/SKILL.md +244 -0
  295. package/.agent-src/skills/technical-specification/SKILL.md +185 -0
  296. package/.agent-src/skills/terraform/SKILL.md +137 -0
  297. package/.agent-src/skills/terragrunt/SKILL.md +217 -0
  298. package/.agent-src/skills/test-driven-development/SKILL.md +252 -0
  299. package/.agent-src/skills/test-performance/SKILL.md +172 -0
  300. package/.agent-src/skills/threat-modeling/SKILL.md +189 -0
  301. package/.agent-src/skills/traefik/SKILL.md +319 -0
  302. package/.agent-src/skills/universal-project-analysis/SKILL.md +179 -0
  303. package/.agent-src/skills/upstream-contribute/SKILL.md +255 -0
  304. package/.agent-src/skills/using-git-worktrees/SKILL.md +148 -0
  305. package/.agent-src/skills/validate-feature-fit/SKILL.md +113 -0
  306. package/.agent-src/skills/verify-before-complete/SKILL.md +188 -0
  307. package/.agent-src/skills/websocket/SKILL.md +75 -0
  308. package/.agent-src/templates/AGENTS.md +146 -0
  309. package/.agent-src/templates/agent-settings.md +256 -0
  310. package/.agent-src/templates/agents/.gitattributes.fragment +16 -0
  311. package/.agent-src/templates/agents/agent-project-settings.example.yml +138 -0
  312. package/.agent-src/templates/agents/memory/architecture-decisions.example.yml +95 -0
  313. package/.agent-src/templates/agents/memory/domain-invariants.example.yml +80 -0
  314. package/.agent-src/templates/agents/memory/historical-patterns.example.yml +82 -0
  315. package/.agent-src/templates/agents/memory/incident-learnings.example.yml +113 -0
  316. package/.agent-src/templates/agents/memory/ownership.example.yml +75 -0
  317. package/.agent-src/templates/agents/memory/product-rules.example.yml +87 -0
  318. package/.agent-src/templates/agents/proposal.example.md +143 -0
  319. package/.agent-src/templates/command.md +84 -0
  320. package/.agent-src/templates/contexts/auth-model.md +59 -0
  321. package/.agent-src/templates/contexts/data-sensitivity.md +60 -0
  322. package/.agent-src/templates/contexts/deployment-order.md +72 -0
  323. package/.agent-src/templates/contexts/observability.md +64 -0
  324. package/.agent-src/templates/contexts/tenant-boundaries.md +68 -0
  325. package/.agent-src/templates/contexts.md +116 -0
  326. package/.agent-src/templates/copilot-instructions.md +115 -0
  327. package/.agent-src/templates/features.md +125 -0
  328. package/.agent-src/templates/github-workflows/memory-hygiene.yml +133 -0
  329. package/.agent-src/templates/github-workflows/pr-risk-review.yml +123 -0
  330. package/.agent-src/templates/github-workflows/proposal-drift.yml +118 -0
  331. package/.agent-src/templates/overrides/command.md +24 -0
  332. package/.agent-src/templates/overrides/guideline.md +21 -0
  333. package/.agent-src/templates/overrides/rule.md +19 -0
  334. package/.agent-src/templates/overrides/skill.md +24 -0
  335. package/.agent-src/templates/overrides/template.md +21 -0
  336. package/.agent-src/templates/persona.md +99 -0
  337. package/.agent-src/templates/roadmaps.md +109 -0
  338. package/.agent-src/templates/scripts/README.md +195 -0
  339. package/.agent-src/templates/scripts/check_memory.py +283 -0
  340. package/.agent-src/templates/scripts/check_memory_proposal.py +180 -0
  341. package/.agent-src/templates/scripts/historical-bug-patterns.example.yml +84 -0
  342. package/.agent-src/templates/scripts/implement_ticket/__init__.py +57 -0
  343. package/.agent-src/templates/scripts/implement_ticket/__main__.py +9 -0
  344. package/.agent-src/templates/scripts/implement_ticket/cli.py +171 -0
  345. package/.agent-src/templates/scripts/implement_ticket/delivery_state.py +130 -0
  346. package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +134 -0
  347. package/.agent-src/templates/scripts/implement_ticket/persona_policy.py +85 -0
  348. package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +49 -0
  349. package/.agent-src/templates/scripts/implement_ticket/steps/analyze.py +98 -0
  350. package/.agent-src/templates/scripts/implement_ticket/steps/implement.py +145 -0
  351. package/.agent-src/templates/scripts/implement_ticket/steps/memory.py +136 -0
  352. package/.agent-src/templates/scripts/implement_ticket/steps/plan.py +175 -0
  353. package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +140 -0
  354. package/.agent-src/templates/scripts/implement_ticket/steps/report.py +195 -0
  355. package/.agent-src/templates/scripts/implement_ticket/steps/test.py +180 -0
  356. package/.agent-src/templates/scripts/implement_ticket/steps/verify.py +170 -0
  357. package/.agent-src/templates/scripts/memory_hash.py +75 -0
  358. package/.agent-src/templates/scripts/memory_lookup.py +216 -0
  359. package/.agent-src/templates/scripts/memory_report.py +184 -0
  360. package/.agent-src/templates/scripts/memory_signal.py +167 -0
  361. package/.agent-src/templates/scripts/memory_status.py +156 -0
  362. package/.agent-src/templates/scripts/ownership-map.example.yml +87 -0
  363. package/.agent-src/templates/scripts/pr-risk-config.example.yml +76 -0
  364. package/.agent-src/templates/scripts/pr_review_routing.py +340 -0
  365. package/.agent-src/templates/scripts/pr_risk_review.py +211 -0
  366. package/.agent-src/templates/skill.md +136 -0
  367. package/.augment-plugin/marketplace.json +32 -0
  368. package/.augment-plugin/plugin.json +21 -0
  369. package/.claude-plugin/marketplace.json +119 -0
  370. package/AGENTS.md +121 -0
  371. package/CHANGELOG.md +279 -0
  372. package/CONTRIBUTING.md +176 -0
  373. package/LICENSE +21 -0
  374. package/README.md +357 -0
  375. package/bin/install.php +38 -0
  376. package/composer.json +29 -0
  377. package/config/agent-settings.template.yml +96 -0
  378. package/config/profiles/balanced.ini +10 -0
  379. package/config/profiles/full.ini +10 -0
  380. package/config/profiles/minimal.ini +10 -0
  381. package/docs/architecture.md +144 -0
  382. package/docs/customization.md +88 -0
  383. package/docs/development.md +171 -0
  384. package/docs/getting-started.md +130 -0
  385. package/docs/github-topics.md +84 -0
  386. package/docs/installation.md +376 -0
  387. package/docs/mcp.md +133 -0
  388. package/docs/quality.md +98 -0
  389. package/docs/skills-catalog.md +136 -0
  390. package/docs/troubleshooting.md +167 -0
  391. package/llms.txt +130 -0
  392. package/package.json +31 -0
  393. package/scripts/audit_skill_descriptions.py +168 -0
  394. package/scripts/check_compression.py +221 -0
  395. package/scripts/check_memory.py +341 -0
  396. package/scripts/check_memory_proposal.py +180 -0
  397. package/scripts/check_portability.py +320 -0
  398. package/scripts/check_proposal.py +269 -0
  399. package/scripts/check_references.py +400 -0
  400. package/scripts/ci_summary.py +131 -0
  401. package/scripts/compress.py +671 -0
  402. package/scripts/compress.sh +18 -0
  403. package/scripts/first-run.sh +109 -0
  404. package/scripts/generate_catalog.py +116 -0
  405. package/scripts/install +151 -0
  406. package/scripts/install-hooks.sh +29 -0
  407. package/scripts/install.py +487 -0
  408. package/scripts/install.sh +637 -0
  409. package/scripts/install_anthropic_key.sh +101 -0
  410. package/scripts/inventory_frontmatter.py +164 -0
  411. package/scripts/lint_marketplace.py +142 -0
  412. package/scripts/lint_regression.py +232 -0
  413. package/scripts/mcp_render.py +159 -0
  414. package/scripts/measure_patterns.py +376 -0
  415. package/scripts/memory_hash.py +75 -0
  416. package/scripts/memory_lookup.py +441 -0
  417. package/scripts/memory_report.py +336 -0
  418. package/scripts/memory_signal.py +210 -0
  419. package/scripts/memory_status.py +195 -0
  420. package/scripts/postinstall.sh +60 -0
  421. package/scripts/readme_linter.py +580 -0
  422. package/scripts/refine_ticket_detect.py +623 -0
  423. package/scripts/requirements-evals.txt +7 -0
  424. package/scripts/runtime_dispatcher.py +265 -0
  425. package/scripts/runtime_handler.py +148 -0
  426. package/scripts/runtime_registry.py +166 -0
  427. package/scripts/schemas/command.schema.json +32 -0
  428. package/scripts/schemas/persona.schema.json +42 -0
  429. package/scripts/schemas/rule.schema.json +28 -0
  430. package/scripts/schemas/skill.schema.json +73 -0
  431. package/scripts/setup.sh +230 -0
  432. package/scripts/setup_eval_venv.sh +58 -0
  433. package/scripts/skill_linter.py +2175 -0
  434. package/scripts/skill_trigger_eval.py +651 -0
  435. package/scripts/tool_registry.py +146 -0
  436. package/scripts/tools/__init__.py +1 -0
  437. package/scripts/tools/adapter_errors.py +63 -0
  438. package/scripts/tools/base_adapter.py +91 -0
  439. package/scripts/tools/github_adapter.py +128 -0
  440. package/scripts/tools/jira_adapter.py +115 -0
  441. package/scripts/update_counts.py +147 -0
  442. package/scripts/validate_frontmatter.py +424 -0
  443. package/templates/consumer-settings/README.md +46 -0
  444. package/templates/consumer-settings/augment-settings.json +12 -0
  445. package/templates/consumer-settings/claude-settings.json +9 -0
  446. package/templates/consumer-settings/copilot-settings.json +14 -0
@@ -0,0 +1,265 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Runtime Dispatcher — resolves execution type and drives real handler execution.
4
+
5
+ Two modes:
6
+
7
+ - resolve (default): produce a structured execution request, enforce safety,
8
+ return dispatch metadata. No side effects.
9
+ - run: dispatch the skill, then hand it to the matching runtime handler to
10
+ actually execute. Returns a typed ExecutionResult.
11
+
12
+ Usage:
13
+ python3 scripts/runtime_dispatcher.py --skill NAME [--format text|json]
14
+ python3 scripts/runtime_dispatcher.py resolve --skill NAME
15
+ python3 scripts/runtime_dispatcher.py run --skill NAME [--cwd PATH] [--output FILE]
16
+
17
+ `run --output FILE` persists the ExecutionResult as JSON to FILE. CI uses
18
+ this to feed `scripts/ci_summary.py`.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import argparse
24
+ import json
25
+ import sys
26
+ from dataclasses import dataclass, asdict
27
+ from pathlib import Path
28
+ from typing import List, Optional
29
+
30
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
31
+ from runtime_registry import SkillRuntime, build_registry
32
+ from runtime_handler import ExecutionResult, HandlerError, execute_shell
33
+
34
+
35
+ @dataclass
36
+ class ExecutionRequest:
37
+ """Structured execution request produced by the dispatcher."""
38
+ skill_name: str
39
+ execution_type: str
40
+ handler: str
41
+ timeout_seconds: int
42
+ safety_mode: Optional[str]
43
+ allowed_tools: List[str]
44
+ status: str # "ready", "blocked", "not_found"
45
+ reason: Optional[str]
46
+
47
+ @property
48
+ def is_ready(self) -> bool:
49
+ return self.status == "ready"
50
+
51
+
52
+ @dataclass
53
+ class DispatchResult:
54
+ """Result of dispatching a skill for execution."""
55
+ request: ExecutionRequest
56
+ warnings: List[str]
57
+
58
+
59
+ def dispatch(skill_name: str, registry: List[SkillRuntime]) -> DispatchResult:
60
+ """Resolve and validate a skill for execution."""
61
+ warnings: List[str] = []
62
+
63
+ # Find skill in registry
64
+ matches = [s for s in registry if s.name == skill_name]
65
+ if not matches:
66
+ return DispatchResult(
67
+ request=ExecutionRequest(
68
+ skill_name=skill_name,
69
+ execution_type="unknown",
70
+ handler="none",
71
+ timeout_seconds=0,
72
+ safety_mode=None,
73
+ allowed_tools=[],
74
+ status="not_found",
75
+ reason=f"Skill '{skill_name}' not found in runtime registry",
76
+ ),
77
+ warnings=[],
78
+ )
79
+
80
+ skill = matches[0]
81
+
82
+ # Manual skills cannot be dispatched
83
+ if skill.execution_type == "manual":
84
+ return DispatchResult(
85
+ request=ExecutionRequest(
86
+ skill_name=skill.name,
87
+ execution_type=skill.execution_type,
88
+ handler=skill.handler,
89
+ timeout_seconds=skill.timeout_seconds,
90
+ safety_mode=skill.safety_mode,
91
+ allowed_tools=skill.allowed_tools,
92
+ status="blocked",
93
+ reason="Manual skills cannot be dispatched for execution",
94
+ ),
95
+ warnings=[],
96
+ )
97
+
98
+ # Automated skills must pass safety checks
99
+ if skill.is_automated:
100
+ if skill.handler == "none":
101
+ return DispatchResult(
102
+ request=ExecutionRequest(
103
+ skill_name=skill.name,
104
+ execution_type=skill.execution_type,
105
+ handler=skill.handler,
106
+ timeout_seconds=skill.timeout_seconds,
107
+ safety_mode=skill.safety_mode,
108
+ allowed_tools=skill.allowed_tools,
109
+ status="blocked",
110
+ reason="Automated skill has no handler",
111
+ ),
112
+ warnings=[],
113
+ )
114
+ if skill.safety_mode != "strict":
115
+ return DispatchResult(
116
+ request=ExecutionRequest(
117
+ skill_name=skill.name,
118
+ execution_type=skill.execution_type,
119
+ handler=skill.handler,
120
+ timeout_seconds=skill.timeout_seconds,
121
+ safety_mode=skill.safety_mode,
122
+ allowed_tools=skill.allowed_tools,
123
+ status="blocked",
124
+ reason="Automated skill requires safety_mode: strict",
125
+ ),
126
+ warnings=[],
127
+ )
128
+
129
+ # Assisted/automated skill is ready
130
+ if skill.execution_type == "assisted":
131
+ warnings.append("Assisted execution requires human confirmation before action")
132
+
133
+ return DispatchResult(
134
+ request=ExecutionRequest(
135
+ skill_name=skill.name,
136
+ execution_type=skill.execution_type,
137
+ handler=skill.handler,
138
+ timeout_seconds=skill.timeout_seconds,
139
+ safety_mode=skill.safety_mode,
140
+ allowed_tools=skill.allowed_tools,
141
+ status="ready",
142
+ reason=None,
143
+ ),
144
+ warnings=warnings,
145
+ )
146
+
147
+
148
+ def run(skill_name: str, registry: List[SkillRuntime], cwd: Path) -> ExecutionResult:
149
+ """Dispatch and execute a skill. Raises HandlerError on structural issues."""
150
+ dispatch_result = dispatch(skill_name, registry)
151
+ req = dispatch_result.request
152
+ if not req.is_ready:
153
+ raise HandlerError(
154
+ f"Skill '{skill_name}' is not ready to run: "
155
+ f"{req.status} — {req.reason or 'no reason given'}"
156
+ )
157
+
158
+ skill = next(s for s in registry if s.name == skill_name)
159
+ if skill.handler in {"shell", "php", "node"}:
160
+ return execute_shell(skill, cwd)
161
+ raise HandlerError(
162
+ f"Handler '{skill.handler}' has no executor yet — "
163
+ f"only 'shell' is implemented in this phase"
164
+ )
165
+
166
+
167
+ def _print_dispatch(result: DispatchResult, fmt: str) -> None:
168
+ if fmt == "json":
169
+ print(json.dumps(asdict(result), indent=2))
170
+ return
171
+ req = result.request
172
+ print(f"Skill: {req.skill_name}")
173
+ print(f"Status: {req.status}")
174
+ if req.reason:
175
+ print(f"Reason: {req.reason}")
176
+ if req.is_ready:
177
+ print(f"Type: {req.execution_type}")
178
+ print(f"Handler: {req.handler}")
179
+ print(f"Timeout: {req.timeout_seconds}s")
180
+ tools = ", ".join(req.allowed_tools) if req.allowed_tools else "none"
181
+ print(f"Tools: {tools}")
182
+ for w in result.warnings:
183
+ print(f"WARNING: {w}")
184
+
185
+
186
+ def _print_execution(result: ExecutionResult, fmt: str) -> None:
187
+ if fmt == "json":
188
+ print(json.dumps(asdict(result), indent=2))
189
+ return
190
+ print(f"Skill: {result.skill_name}")
191
+ print(f"Handler: {result.handler}")
192
+ print(f"Command: {' '.join(result.command)}")
193
+ print(f"Cwd: {result.cwd}")
194
+ print(f"Status: {result.status}")
195
+ print(f"Exit code: {result.exit_code}")
196
+ print(f"Duration: {result.duration_ms}ms")
197
+ if result.error:
198
+ print(f"Error: {result.error}")
199
+ if result.stdout:
200
+ print("--- stdout ---")
201
+ print(result.stdout.rstrip())
202
+ if result.stderr:
203
+ print("--- stderr ---")
204
+ print(result.stderr.rstrip())
205
+
206
+
207
+ def _build_parser() -> argparse.ArgumentParser:
208
+ parser = argparse.ArgumentParser(description="Runtime Dispatcher — resolve or run skill execution")
209
+ sub = parser.add_subparsers(dest="action")
210
+
211
+ # Legacy flat flags retained for backward compatibility.
212
+ parser.add_argument("--skill", help="Skill name to dispatch")
213
+ parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
214
+ parser.add_argument("--format", choices=["text", "json"], default="text")
215
+
216
+ resolve_p = sub.add_parser("resolve", help="Resolve skill and return dispatch metadata (no execution)")
217
+ resolve_p.add_argument("--skill", required=True)
218
+ resolve_p.add_argument("--root", type=Path, default=Path("."))
219
+ resolve_p.add_argument("--format", choices=["text", "json"], default="text")
220
+
221
+ run_p = sub.add_parser("run", help="Dispatch and execute the skill via its handler")
222
+ run_p.add_argument("--skill", required=True)
223
+ run_p.add_argument("--root", type=Path, default=Path("."))
224
+ run_p.add_argument("--cwd", type=Path, default=None, help="Working directory (default: --root)")
225
+ run_p.add_argument("--format", choices=["text", "json"], default="text")
226
+ run_p.add_argument(
227
+ "--output",
228
+ type=Path,
229
+ default=None,
230
+ help="Persist ExecutionResult as JSON to this path (parents created)",
231
+ )
232
+ return parser
233
+
234
+
235
+ def main() -> int:
236
+ parser = _build_parser()
237
+ args = parser.parse_args()
238
+
239
+ action = args.action or "resolve"
240
+ if action == "resolve" and not args.skill:
241
+ parser.error("--skill is required for resolve")
242
+
243
+ registry = build_registry(args.root)
244
+
245
+ if action == "run":
246
+ cwd = args.cwd if args.cwd is not None else args.root
247
+ try:
248
+ result = run(args.skill, registry, cwd)
249
+ except HandlerError as exc:
250
+ print(f"HandlerError: {exc}", file=sys.stderr)
251
+ return 2
252
+ _print_execution(result, args.format)
253
+ output = getattr(args, "output", None)
254
+ if output is not None:
255
+ output.parent.mkdir(parents=True, exist_ok=True)
256
+ output.write_text(json.dumps(asdict(result), indent=2) + "\n", encoding="utf-8")
257
+ return 0 if result.is_success else 1
258
+
259
+ result = dispatch(args.skill, registry)
260
+ _print_dispatch(result, args.format)
261
+ return 0 if result.request.is_ready or result.request.status == "blocked" else 1
262
+
263
+
264
+ if __name__ == "__main__":
265
+ sys.exit(main())
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Runtime Handler — executes a skill's declared command and captures the result.
4
+
5
+ This is the first real execution path in the runtime layer. It consumes a
6
+ SkillRuntime (from the registry), runs its `command` argv through the
7
+ appropriate handler, and returns a typed ExecutionResult.
8
+
9
+ Responsibilities:
10
+ - Shell-out safely: no shell=True, argv form only
11
+ - Enforce timeout (SkillRuntime.timeout_seconds)
12
+ - Capture stdout, stderr, exit code, wall-clock duration
13
+ - Scrub environment to an allowlist
14
+ - Resolve working directory relative to repository root
15
+
16
+ Out of scope (remain in scaffold layers for now):
17
+ - php/node handlers beyond running their binaries
18
+ - tool registry integration
19
+ - streaming output
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import os
25
+ import subprocess
26
+ import sys
27
+ import time
28
+ from dataclasses import dataclass, field
29
+ from pathlib import Path
30
+ from typing import Dict, List, Optional
31
+
32
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
33
+ from runtime_registry import SkillRuntime
34
+
35
+
36
+ # Environment variables that are always forwarded to the child process.
37
+ # Kept deliberately narrow — no credentials, no shell config, no auth tokens.
38
+ DEFAULT_ENV_ALLOWLIST: tuple[str, ...] = (
39
+ "PATH",
40
+ "HOME",
41
+ "LANG",
42
+ "LC_ALL",
43
+ "LC_CTYPE",
44
+ "TZ",
45
+ "TMPDIR",
46
+ "PYTHONPATH",
47
+ "PYTHONDONTWRITEBYTECODE",
48
+ )
49
+
50
+
51
+ @dataclass
52
+ class ExecutionResult:
53
+ """Typed result of a real command execution."""
54
+ skill_name: str
55
+ handler: str
56
+ command: List[str]
57
+ cwd: str
58
+ exit_code: int
59
+ stdout: str
60
+ stderr: str
61
+ duration_ms: int
62
+ status: str # "success" | "failure" | "timeout" | "error"
63
+ timed_out: bool = False
64
+ error: Optional[str] = None
65
+ artifacts: List[str] = field(default_factory=list)
66
+
67
+ @property
68
+ def is_success(self) -> bool:
69
+ return self.status == "success"
70
+
71
+
72
+ class HandlerError(Exception):
73
+ """Raised when a handler cannot execute for structural reasons."""
74
+
75
+
76
+ def _build_env(allowlist: tuple[str, ...]) -> Dict[str, str]:
77
+ """Build a scrubbed environment dict from the allowlist."""
78
+ env: Dict[str, str] = {}
79
+ for key in allowlist:
80
+ value = os.environ.get(key)
81
+ if value is not None:
82
+ env[key] = value
83
+ # Guarantee a minimum PATH so subprocess can find binaries.
84
+ env.setdefault("PATH", "/usr/local/bin:/usr/bin:/bin")
85
+ return env
86
+
87
+
88
+ def execute_shell(
89
+ skill: SkillRuntime,
90
+ cwd: Path,
91
+ env_allowlist: tuple[str, ...] = DEFAULT_ENV_ALLOWLIST,
92
+ ) -> ExecutionResult:
93
+ """Run a skill's command as a subprocess and capture the result."""
94
+ if not skill.command:
95
+ raise HandlerError(
96
+ f"Skill '{skill.name}' has no 'command' declared — cannot execute"
97
+ )
98
+ if skill.handler not in {"shell", "php", "node"}:
99
+ raise HandlerError(
100
+ f"Skill '{skill.name}' handler '{skill.handler}' is not a real-execution handler"
101
+ )
102
+
103
+ env = _build_env(env_allowlist)
104
+ cwd_str = str(cwd.resolve())
105
+ start = time.monotonic()
106
+
107
+ try:
108
+ completed = subprocess.run(
109
+ skill.command,
110
+ cwd=cwd_str,
111
+ env=env,
112
+ capture_output=True,
113
+ text=True,
114
+ timeout=skill.timeout_seconds,
115
+ shell=False,
116
+ check=False,
117
+ )
118
+ except subprocess.TimeoutExpired as exc:
119
+ duration_ms = int((time.monotonic() - start) * 1000)
120
+ return ExecutionResult(
121
+ skill_name=skill.name, handler=skill.handler,
122
+ command=list(skill.command), cwd=cwd_str,
123
+ exit_code=-1,
124
+ stdout=(exc.stdout or "") if isinstance(exc.stdout, str) else "",
125
+ stderr=(exc.stderr or "") if isinstance(exc.stderr, str) else "",
126
+ duration_ms=duration_ms, status="timeout", timed_out=True,
127
+ error=f"Timed out after {skill.timeout_seconds}s",
128
+ )
129
+ except FileNotFoundError as exc:
130
+ duration_ms = int((time.monotonic() - start) * 1000)
131
+ return ExecutionResult(
132
+ skill_name=skill.name, handler=skill.handler,
133
+ command=list(skill.command), cwd=cwd_str,
134
+ exit_code=-1, stdout="", stderr="",
135
+ duration_ms=duration_ms, status="error",
136
+ error=f"Command not found: {exc.filename or skill.command[0]}",
137
+ )
138
+
139
+ duration_ms = int((time.monotonic() - start) * 1000)
140
+ status = "success" if completed.returncode == 0 else "failure"
141
+ return ExecutionResult(
142
+ skill_name=skill.name, handler=skill.handler,
143
+ command=list(skill.command), cwd=cwd_str,
144
+ exit_code=completed.returncode,
145
+ stdout=completed.stdout or "",
146
+ stderr=completed.stderr or "",
147
+ duration_ms=duration_ms, status=status,
148
+ )
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Runtime Registry — discovers skills with execution metadata.
4
+
5
+ Responsibilities:
6
+ - Discover skills with execution blocks in frontmatter
7
+ - Validate handler support
8
+ - Expose list of runtime-capable skills
9
+ - Provide skill metadata lookup
10
+
11
+ Usage:
12
+ python3 scripts/runtime_registry.py [--root ROOT] [--format text|json]
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import argparse
18
+ import json
19
+ import re
20
+ import sys
21
+ from dataclasses import dataclass, asdict, field
22
+ from pathlib import Path
23
+ from typing import List, Optional
24
+
25
+ # Import shared parsing from skill_linter
26
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
27
+ from skill_linter import (
28
+ FRONTMATTER_PATTERN,
29
+ DESCRIPTION_PATTERN,
30
+ NAME_PATTERN,
31
+ VALID_EXECUTION_TYPES,
32
+ VALID_EXECUTION_HANDLERS,
33
+ parse_execution_block,
34
+ extract_frontmatter,
35
+ )
36
+
37
+
38
+ @dataclass
39
+ class SkillRuntime:
40
+ """Runtime metadata for a single skill."""
41
+ name: str
42
+ path: str
43
+ description: str
44
+ execution_type: str
45
+ handler: str
46
+ timeout_seconds: int
47
+ safety_mode: Optional[str]
48
+ allowed_tools: List[str]
49
+ command: List[str] = field(default_factory=list)
50
+
51
+ @property
52
+ def is_executable(self) -> bool:
53
+ return self.execution_type in ("assisted", "automated")
54
+
55
+ @property
56
+ def is_automated(self) -> bool:
57
+ return self.execution_type == "automated"
58
+
59
+ @property
60
+ def is_runnable(self) -> bool:
61
+ """True when the skill declares an executable command for a real handler."""
62
+ return bool(self.command) and self.handler in {"shell", "php", "node"}
63
+
64
+
65
+ def discover_skills(root: Path) -> List[Path]:
66
+ """Find all SKILL.md files, preferring .agent-src.uncompressed/."""
67
+ uncompressed = root / ".agent-src.uncompressed" / "skills"
68
+ compressed = root / ".agent-src" / "skills"
69
+ base = uncompressed if uncompressed.exists() else compressed
70
+ if not base.exists():
71
+ return []
72
+ return sorted(f for f in base.rglob("SKILL.md") if not f.is_symlink())
73
+
74
+
75
+ def parse_skill_runtime(path: Path) -> Optional[SkillRuntime]:
76
+ """Parse a skill file and return its runtime metadata, or None if no execution block."""
77
+ text = path.read_text(encoding="utf-8")
78
+ frontmatter = extract_frontmatter(text)
79
+ if frontmatter is None:
80
+ return None
81
+
82
+ execution = parse_execution_block(frontmatter)
83
+ if execution is None:
84
+ return None
85
+
86
+ # Extract name and description
87
+ name_match = NAME_PATTERN.search(frontmatter)
88
+ name = name_match.group(1).strip() if name_match else path.parent.name
89
+ desc_match = DESCRIPTION_PATTERN.search(frontmatter)
90
+ description = desc_match.group(1).strip() if desc_match else ""
91
+
92
+ return SkillRuntime(
93
+ name=name,
94
+ path=str(path),
95
+ description=description,
96
+ execution_type=execution.get("type", "manual"),
97
+ handler=execution.get("handler", "none"),
98
+ timeout_seconds=execution.get("timeout_seconds", 30),
99
+ safety_mode=execution.get("safety_mode"),
100
+ allowed_tools=execution.get("allowed_tools", []),
101
+ command=execution.get("command", []),
102
+ )
103
+
104
+
105
+ def build_registry(root: Path) -> List[SkillRuntime]:
106
+ """Build the full runtime registry from all skills."""
107
+ skills = discover_skills(root)
108
+ registry: List[SkillRuntime] = []
109
+ for skill_path in skills:
110
+ runtime = parse_skill_runtime(skill_path)
111
+ if runtime is not None:
112
+ registry.append(runtime)
113
+ return registry
114
+
115
+
116
+ def validate_registry(registry: List[SkillRuntime]) -> List[str]:
117
+ """Validate the registry for consistency issues."""
118
+ errors: List[str] = []
119
+ for skill in registry:
120
+ if skill.execution_type not in VALID_EXECUTION_TYPES:
121
+ errors.append(f"{skill.name}: invalid execution type '{skill.execution_type}'")
122
+ if skill.handler not in VALID_EXECUTION_HANDLERS:
123
+ errors.append(f"{skill.name}: invalid handler '{skill.handler}'")
124
+ if skill.is_automated:
125
+ if skill.handler == "none":
126
+ errors.append(f"{skill.name}: automated skill has handler 'none'")
127
+ if skill.safety_mode != "strict":
128
+ errors.append(f"{skill.name}: automated skill missing safety_mode 'strict'")
129
+ return errors
130
+
131
+
132
+ def main() -> int:
133
+ parser = argparse.ArgumentParser(description="Runtime Registry — list runtime-capable skills")
134
+ parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
135
+ parser.add_argument("--format", choices=["text", "json"], default="text", help="Output format")
136
+ parser.add_argument("--validate", action="store_true", help="Validate registry consistency")
137
+ args = parser.parse_args()
138
+
139
+ registry = build_registry(args.root)
140
+
141
+ if args.validate:
142
+ errors = validate_registry(registry)
143
+ if errors:
144
+ for e in errors:
145
+ print(f"ERROR: {e}", file=sys.stderr)
146
+ return 1
147
+ print(f"Registry valid: {len(registry)} runtime-capable skills")
148
+ return 0
149
+
150
+ if args.format == "json":
151
+ print(json.dumps([asdict(s) for s in registry], indent=2))
152
+ else:
153
+ if not registry:
154
+ print("No runtime-capable skills found.")
155
+ else:
156
+ print(f"Runtime-capable skills: {len(registry)}\n")
157
+ for s in registry:
158
+ tools = ", ".join(s.allowed_tools) if s.allowed_tools else "none"
159
+ print(f" {s.name}")
160
+ print(f" type: {s.execution_type} | handler: {s.handler} | "
161
+ f"timeout: {s.timeout_seconds}s | tools: {tools}")
162
+ return 0
163
+
164
+
165
+ if __name__ == "__main__":
166
+ sys.exit(main())
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/event4u-app/agent-config/scripts/schemas/command.schema.json",
4
+ "title": "Command frontmatter",
5
+ "$comment": "Source: agents/docs/frontmatter-contract.md#commands. `description` is required at schema level because 66/67 commands declare it — the one exception is a known gap, not a supported shape.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["name", "description", "disable-model-invocation"],
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "pattern": "^[a-z][a-z0-9-]*$"
13
+ },
14
+ "description": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "maxLength": 500
18
+ },
19
+ "disable-model-invocation": {
20
+ "type": "boolean",
21
+ "enum": [true],
22
+ "description": "Commands are always user-invoked; model-invocation is disabled."
23
+ },
24
+ "skills": {
25
+ "type": "array",
26
+ "items": {
27
+ "type": "string",
28
+ "pattern": "^[a-z][a-z0-9-]*$"
29
+ }
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/event4u-app/agent-config/scripts/schemas/persona.schema.json",
4
+ "title": "Persona frontmatter",
5
+ "$comment": "Source: agents/docs/frontmatter-contract.md#personas. `mode` enum mirrors the values declared in personas/*.md plus the additional `incident` value from templates/persona.md.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["id", "role", "description", "tier", "mode", "version", "source"],
9
+ "properties": {
10
+ "id": {
11
+ "type": "string",
12
+ "pattern": "^[a-z][a-z0-9-]*$",
13
+ "description": "Must match the persona filename stem."
14
+ },
15
+ "role": {
16
+ "type": "string",
17
+ "minLength": 1,
18
+ "maxLength": 80
19
+ },
20
+ "description": {
21
+ "type": "string",
22
+ "minLength": 1,
23
+ "maxLength": 240
24
+ },
25
+ "tier": {
26
+ "type": "string",
27
+ "enum": ["core", "specialist"]
28
+ },
29
+ "mode": {
30
+ "type": "string",
31
+ "enum": ["developer", "reviewer", "tester", "product-owner", "incident", "planner"]
32
+ },
33
+ "version": {
34
+ "type": "string",
35
+ "pattern": "^[0-9]+(\\.[0-9]+){0,2}$"
36
+ },
37
+ "source": {
38
+ "type": "string",
39
+ "enum": ["package", "project"]
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/event4u-app/agent-config/scripts/schemas/rule.schema.json",
4
+ "title": "Rule frontmatter",
5
+ "$comment": "Source: agents/docs/frontmatter-contract.md#rules. `type` is authoritative; `alwaysApply` is a Cursor/Cline sidecar and accepted but not enforced.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["type", "source", "description"],
9
+ "properties": {
10
+ "type": {
11
+ "type": "string",
12
+ "enum": ["always", "auto"]
13
+ },
14
+ "source": {
15
+ "type": "string",
16
+ "enum": ["package", "project"]
17
+ },
18
+ "description": {
19
+ "type": "string",
20
+ "minLength": 1,
21
+ "maxLength": 500
22
+ },
23
+ "alwaysApply": {
24
+ "type": "boolean",
25
+ "description": "Optional sidecar for Cursor/Cline; by convention true when type=always, false when type=auto."
26
+ }
27
+ }
28
+ }