@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,400 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Cross-reference checker for agent-config repositories.
4
+
5
+ Scans .md files in .agent-src/ and agents/ for internal references
6
+ (file paths, skill names, rule names) and reports broken ones.
7
+
8
+ Exit codes: 0 = clean, 1 = broken refs found, 3 = internal error
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+ import json
15
+ import re
16
+ import sys
17
+ from dataclasses import dataclass, asdict
18
+ from pathlib import Path
19
+ from typing import List, Literal
20
+
21
+ Severity = Literal["error", "warning"]
22
+
23
+
24
+ @dataclass
25
+ class BrokenRef:
26
+ file: str
27
+ line: int
28
+ ref: str
29
+ ref_type: str
30
+ severity: Severity
31
+ suggestion: str = ""
32
+
33
+
34
+ SCAN_DIRS = [".agent-src", "agents"]
35
+ SKIP_DIRS = ["agents/roadmaps/archive"] # archived roadmaps have historical refs
36
+ ROOT = Path(".")
37
+
38
+ # YAML memory files (engineering-memory layer) live under `agents/memory/`.
39
+ # Each entry may reference skills, ADR paths, or local files via
40
+ # `source:` / `enforcement:` / `skill:`. We validate those paths so a
41
+ # memory entry cannot rot silently when a file is moved or deleted.
42
+ MEMORY_YAML_ROOT = "agents/memory"
43
+ MEMORY_FILE_EXTS = (".php", ".py", ".md", ".yml", ".yaml", ".json", ".sh",
44
+ ".js", ".ts", ".tsx", ".jsx")
45
+ MEMORY_SKIP_URI_PREFIXES = ("http://", "https://", "adr://", "ticket://",
46
+ "incident://", "pr://")
47
+
48
+ # File path references like `guidelines/agent-infra/size-and-scope.md`
49
+ PATH_PATTERN = re.compile(
50
+ r'[`"\s]'
51
+ r'(\.?(?:augment|agents|guidelines|rules|skills|commands|contexts|templates|patterns|personas)'
52
+ r'(?:/[\w._-]+)+\.(?:md|php|py|yml|yaml|json|sh))'
53
+ r'[`"\s,;)\]]'
54
+ )
55
+
56
+ # Frontmatter `personas:` entries (skills/commands cite personas). Either
57
+ # inline list `[a, b]` or YAML block list on subsequent lines.
58
+ _FM_PERSONAS_INLINE = re.compile(r"^personas:\s*\[([^\]]*)\]\s*$")
59
+ _FM_PERSONAS_KEY = re.compile(r"^personas:\s*$")
60
+ _FM_LIST_ITEM = re.compile(r"^\s*-\s*([\w-]+)\s*$")
61
+
62
+ SKILL_REF_PATTERN = re.compile(r'`([\w-]+)`\s+skill')
63
+ RULE_REF_PATTERN = re.compile(r'`([\w-]+)`\s+rule')
64
+
65
+ # Unchecked TODO items (roadmap checkboxes) legitimately reference files
66
+ # and artifacts that do not exist yet. Skip these lines.
67
+ UNCHECKED_TODO_PATTERN = re.compile(r'^\s*[-*+]\s+\[ \]\s')
68
+ _SKIP_NAMES = {"the", "a", "an", "this", "that", "your", "my", "no", "any", "each", "one",
69
+ "always", "auto", "fail", "vue", "guidelines", "naming",
70
+ "orderBy", "no-commit", "skill-linter", "skill-validator",
71
+ "skill-refactor", "skill-caveman-compression", "skill-decompression",
72
+ "broad_scope", "composer"}
73
+
74
+ # Paths that are clearly example/template placeholders (not real references)
75
+ EXAMPLE_PATH_PATTERNS = [
76
+ re.compile(r"agents/analysis/"), # project-analyze output template
77
+ re.compile(r"agents/roadmaps/template"), # template reference
78
+ re.compile(r"agents/overrides/"), # override examples
79
+ re.compile(r"commands/old-cmd"), # example placeholder
80
+ re.compile(r"agents/README"), # README reference (may not exist in package)
81
+ re.compile(r"agents/docs/"), # project-specific docs (not in package)
82
+ re.compile(r"agents/contexts/"), # project-specific contexts (not in package)
83
+ re.compile(r"agents/gates"), # project-specific policy docs
84
+ re.compile(r"agents/features/"), # project-specific feature docs
85
+ re.compile(r"agents/authentication"), # project-specific auth docs
86
+ re.compile(r"agents/roadmaps/agents-"), # dynamically created roadmaps
87
+ re.compile(r"agents/roadmaps/test-"), # project-specific roadmaps
88
+ re.compile(r"agents/ownership-map\.yml"), # consumer-project routing data
89
+ re.compile(r"agents/historical-bug-patterns\.yml"), # consumer-project routing data
90
+ re.compile(r"agents/memory/"), # consumer-project memory data
91
+ re.compile(r"agents/learnings/"), # consumer-project learning notes
92
+ re.compile(r"agents/proposals/"), # consumer-project self-improvement proposals
93
+ re.compile(r"agents/drafts/"), # consumer-project artefact drafts
94
+ re.compile(r"guidelines/php-"), # flattened override naming convention
95
+ re.compile(r"rules/no-commit"), # example rule in commands
96
+ re.compile(r"skills/[\w-]+\.md"), # short skill refs in examples (not SKILL.md path)
97
+ re.compile(r"skills/[\w-]+/SKILL\.md"), # example skill paths in commands
98
+ re.compile(r"\{"), # template placeholders like {module}
99
+ re.compile(r"\.compression-hashes\.json"), # JSON file, not .md
100
+ ]
101
+
102
+
103
+ def collect_artifacts(root: Path) -> dict[str, set[str]]:
104
+ """Build lookup sets for skills, rules, commands, guidelines, personas."""
105
+ arts: dict[str, set[str]] = {
106
+ "skills": set(), "rules": set(), "commands": set(),
107
+ "guidelines": set(), "personas": set(),
108
+ }
109
+ augment = root / ".agent-src"
110
+ if not augment.exists():
111
+ return arts
112
+ for d in (augment / "skills").iterdir() if (augment / "skills").exists() else []:
113
+ if d.is_dir() and (d / "SKILL.md").exists():
114
+ arts["skills"].add(d.name)
115
+ for f in (augment / "rules").glob("*.md") if (augment / "rules").exists() else []:
116
+ arts["rules"].add(f.stem)
117
+ for f in (augment / "commands").glob("*.md") if (augment / "commands").exists() else []:
118
+ arts["commands"].add(f.stem)
119
+ gdir = augment / "guidelines"
120
+ if gdir.exists():
121
+ for f in gdir.rglob("*.md"):
122
+ arts["guidelines"].add(str(f.relative_to(augment)))
123
+ pdir = augment / "personas"
124
+ if pdir.exists():
125
+ for f in pdir.glob("*.md"):
126
+ if f.stem != "README":
127
+ arts["personas"].add(f.stem)
128
+ return arts
129
+
130
+
131
+ def _extract_personas_frontmatter(text: str) -> list[tuple[int, str]]:
132
+ """Parse frontmatter for `personas:` list entries. Returns (line_no, id)."""
133
+ if not text.startswith("---"):
134
+ return []
135
+ end = text.find("\n---", 3)
136
+ if end < 0:
137
+ return []
138
+ fm_lines = text[3:end].splitlines()
139
+ results: list[tuple[int, str]] = []
140
+ i = 0
141
+ # Frontmatter starts at file line 2 (after opening `---` on line 1).
142
+ while i < len(fm_lines):
143
+ line = fm_lines[i]
144
+ line_no = i + 2
145
+ m_inline = _FM_PERSONAS_INLINE.match(line)
146
+ if m_inline:
147
+ inner = m_inline.group(1)
148
+ for raw in inner.split(","):
149
+ v = raw.strip().strip('"').strip("'")
150
+ if v:
151
+ results.append((line_no, v))
152
+ i += 1
153
+ continue
154
+ if _FM_PERSONAS_KEY.match(line):
155
+ j = i + 1
156
+ while j < len(fm_lines):
157
+ item_m = _FM_LIST_ITEM.match(fm_lines[j])
158
+ if not item_m:
159
+ break
160
+ results.append((j + 2, item_m.group(1)))
161
+ j += 1
162
+ i = j
163
+ continue
164
+ i += 1
165
+ return results
166
+
167
+
168
+ def _find_suggestion(path: str, root: Path) -> str:
169
+ name = Path(path).name
170
+ for d in [root / ".agent-src", root / ".agent-src.uncompressed", root / "agents"]:
171
+ if d.exists():
172
+ for f in d.rglob(name):
173
+ return str(f.relative_to(root))
174
+ return ""
175
+
176
+
177
+ def _closest_match(name: str, candidates: set[str]) -> str:
178
+ for c in sorted(candidates):
179
+ if name in c or c in name:
180
+ return c
181
+ return ""
182
+
183
+
184
+
185
+ def check_file(filepath: Path, artifacts: dict[str, set[str]], root: Path) -> List[BrokenRef]:
186
+ """Check a single .md file for broken references."""
187
+ broken: List[BrokenRef] = []
188
+ try:
189
+ text = filepath.read_text(encoding="utf-8")
190
+ except Exception:
191
+ return broken
192
+
193
+ # Validate `personas:` frontmatter entries against known persona ids.
194
+ for line_no, pid in _extract_personas_frontmatter(text):
195
+ if pid not in artifacts["personas"]:
196
+ broken.append(BrokenRef(
197
+ file=str(filepath), line=line_no, ref=pid,
198
+ ref_type="persona", severity="error",
199
+ suggestion=_closest_match(pid, artifacts["personas"]),
200
+ ))
201
+
202
+ in_code_block = False
203
+ for i, line in enumerate(text.splitlines(), 1):
204
+ stripped = line.strip()
205
+ if stripped.startswith("```"):
206
+ in_code_block = not in_code_block
207
+ continue
208
+ if in_code_block:
209
+ continue
210
+
211
+ # Unchecked TODO checkboxes document future work — their refs are
212
+ # forward-looking and will not resolve yet.
213
+ if UNCHECKED_TODO_PATTERN.match(line):
214
+ continue
215
+
216
+ # File path references
217
+ for m in PATH_PATTERN.finditer(line):
218
+ raw_ref = m.group(1)
219
+
220
+ # Skip known example/template paths
221
+ if any(p.search(raw_ref) for p in EXAMPLE_PATH_PATTERNS):
222
+ continue
223
+
224
+ resolved = False
225
+ # Try raw ref as-is from root (covers .agent-src/..., agents/..., etc.)
226
+ if (root / raw_ref).exists():
227
+ resolved = True
228
+ else:
229
+ # Strip leading ./ and try with prefixes
230
+ ref = raw_ref.lstrip("./")
231
+ for prefix in [root, root / ".agent-src", root / ".agent-src.uncompressed"]:
232
+ if (prefix / ref).exists():
233
+ resolved = True
234
+ break
235
+ # `.augment/` is a local projection of `.agent-src/` (gitignored).
236
+ # In CI the projection doesn't exist, so resolve `.augment/X`
237
+ # against the canonical source at `.agent-src/X` (and the
238
+ # uncompressed authoring tree as a fallback). Note: `raw_ref`
239
+ # keeps the leading dot; `ref` above was stripped via lstrip.
240
+ if not resolved and raw_ref.startswith(".augment/"):
241
+ rel = raw_ref[len(".augment/") :]
242
+ for prefix in [root / ".agent-src", root / ".agent-src.uncompressed"]:
243
+ if (prefix / rel).exists():
244
+ resolved = True
245
+ break
246
+ if not resolved:
247
+ broken.append(BrokenRef(
248
+ file=str(filepath), line=i, ref=m.group(1),
249
+ ref_type="path", severity="error",
250
+ suggestion=_find_suggestion(raw_ref, root),
251
+ ))
252
+
253
+ # Skill name references
254
+ for m in SKILL_REF_PATTERN.finditer(line):
255
+ name = m.group(1)
256
+ if name not in artifacts["skills"] and name not in _SKIP_NAMES:
257
+ broken.append(BrokenRef(
258
+ file=str(filepath), line=i, ref=name,
259
+ ref_type="skill", severity="warning",
260
+ suggestion=_closest_match(name, artifacts["skills"]),
261
+ ))
262
+
263
+ # Rule name references
264
+ for m in RULE_REF_PATTERN.finditer(line):
265
+ name = m.group(1)
266
+ if name not in artifacts["rules"] and name not in _SKIP_NAMES:
267
+ broken.append(BrokenRef(
268
+ file=str(filepath), line=i, ref=name,
269
+ ref_type="rule", severity="warning",
270
+ suggestion=_closest_match(name, artifacts["rules"]),
271
+ ))
272
+
273
+ return broken
274
+
275
+
276
+ def _looks_like_local_path(value: str) -> bool:
277
+ """Heuristic: treat as a path if it has a known extension and no URI scheme."""
278
+ if not isinstance(value, str) or not value.strip():
279
+ return False
280
+ v = value.strip()
281
+ if any(v.startswith(p) for p in MEMORY_SKIP_URI_PREFIXES):
282
+ return False
283
+ # Globs and wildcard patterns can't be resolved as files
284
+ if any(ch in v for ch in ("*", "?", "[")):
285
+ return False
286
+ # Must contain a directory separator AND end with a known extension
287
+ if "/" not in v:
288
+ return False
289
+ return v.lower().endswith(MEMORY_FILE_EXTS)
290
+
291
+
292
+ def _walk_yaml(data, paths: list[str], skills: list[str]) -> None:
293
+ """Recursively collect path-like strings and `skill:` values."""
294
+ if isinstance(data, dict):
295
+ for k, v in data.items():
296
+ if k in ("skill", "skills") and isinstance(v, str):
297
+ skills.append(v)
298
+ elif k in ("skill", "skills") and isinstance(v, list):
299
+ skills.extend(x for x in v if isinstance(x, str))
300
+ else:
301
+ _walk_yaml(v, paths, skills)
302
+ elif isinstance(data, list):
303
+ for item in data:
304
+ _walk_yaml(item, paths, skills)
305
+ elif isinstance(data, str):
306
+ if _looks_like_local_path(data):
307
+ paths.append(data)
308
+
309
+
310
+ def check_memory_yaml(filepath: Path, artifacts: dict[str, set[str]],
311
+ root: Path) -> List[BrokenRef]:
312
+ """Validate path/skill refs inside an engineering-memory YAML file."""
313
+ broken: List[BrokenRef] = []
314
+ try:
315
+ import yaml # type: ignore
316
+ except ImportError:
317
+ return broken # PyYAML optional; text-ref checker still runs
318
+ try:
319
+ text = filepath.read_text(encoding="utf-8")
320
+ data = yaml.safe_load(text)
321
+ except Exception:
322
+ return broken
323
+ if not data:
324
+ return broken
325
+ paths: list[str] = []
326
+ skills: list[str] = []
327
+ _walk_yaml(data, paths, skills)
328
+ for p in paths:
329
+ if not (root / p.lstrip("./")).exists():
330
+ broken.append(BrokenRef(
331
+ file=str(filepath), line=0, ref=p,
332
+ ref_type="memory-path", severity="error",
333
+ suggestion=_find_suggestion(p, root),
334
+ ))
335
+ for s in skills:
336
+ if s not in artifacts["skills"] and s not in _SKIP_NAMES:
337
+ broken.append(BrokenRef(
338
+ file=str(filepath), line=0, ref=s,
339
+ ref_type="memory-skill", severity="warning",
340
+ suggestion=_closest_match(s, artifacts["skills"]),
341
+ ))
342
+ return broken
343
+
344
+
345
+ def scan_all(root: Path) -> List[BrokenRef]:
346
+ artifacts = collect_artifacts(root)
347
+ broken: List[BrokenRef] = []
348
+ for scan_dir in SCAN_DIRS:
349
+ d = root / scan_dir
350
+ if not d.exists():
351
+ continue
352
+ for f in sorted(d.rglob("*.md")):
353
+ # Skip archived directories
354
+ if any(str(f).startswith(str(root / skip)) for skip in SKIP_DIRS):
355
+ continue
356
+ broken.extend(check_file(f, artifacts, root))
357
+ memory_dir = root / MEMORY_YAML_ROOT
358
+ if memory_dir.is_dir():
359
+ for f in sorted(memory_dir.rglob("*.yml")):
360
+ broken.extend(check_memory_yaml(f, artifacts, root))
361
+ for f in sorted(memory_dir.rglob("*.yaml")):
362
+ broken.extend(check_memory_yaml(f, artifacts, root))
363
+ return broken
364
+
365
+
366
+ def format_text(broken: List[BrokenRef]) -> str:
367
+ if not broken:
368
+ return "✅ No broken references found."
369
+ lines = [f"❌ Found {len(broken)} broken reference(s):\n"]
370
+ for b in broken:
371
+ icon = "🔴" if b.severity == "error" else "🟡"
372
+ line = f" {icon} {b.file}:{b.line} — {b.ref_type} `{b.ref}`"
373
+ if b.suggestion:
374
+ line += f" → did you mean `{b.suggestion}`?"
375
+ lines.append(line)
376
+ return "\n".join(lines)
377
+
378
+
379
+ def main() -> int:
380
+ parser = argparse.ArgumentParser(description="Check for broken cross-references in agent config")
381
+ parser.add_argument("--format", choices=["text", "json"], default="text")
382
+ parser.add_argument("--root", type=Path, default=Path("."), help="Repository root")
383
+ args = parser.parse_args()
384
+
385
+ try:
386
+ broken = scan_all(args.root)
387
+ except Exception as e:
388
+ print(f"Internal error: {e}", file=sys.stderr)
389
+ return 3
390
+
391
+ if args.format == "json":
392
+ print(json.dumps([asdict(b) for b in broken], indent=2))
393
+ else:
394
+ print(format_text(broken))
395
+
396
+ return 1 if broken else 0
397
+
398
+
399
+ if __name__ == "__main__":
400
+ sys.exit(main())
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ CI Summary — render a GitHub Step Summary from dispatcher run results.
4
+
5
+ Consumes JSON files produced by `scripts/runtime_dispatcher.py run
6
+ --output FILE`. Each file is an ExecutionResult dump (see runtime_handler).
7
+
8
+ Usage:
9
+ python3 scripts/ci_summary.py --runs agents/reports/runs [--title TITLE]
10
+
11
+ Writes to $GITHUB_STEP_SUMMARY if the environment variable is set,
12
+ otherwise prints the markdown to stdout. Missing or empty run
13
+ directories render a short "no runs" note and exit 0.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import json
20
+ import os
21
+ from pathlib import Path
22
+ from typing import List, Dict
23
+
24
+
25
+ def load_runs(runs_dir: Path) -> List[Dict]:
26
+ """Load every *.json in runs_dir as an ExecutionResult dict. Sorted by filename."""
27
+ if not runs_dir.is_dir():
28
+ return []
29
+ runs: List[Dict] = []
30
+ for path in sorted(runs_dir.glob("*.json")):
31
+ try:
32
+ runs.append(json.loads(path.read_text(encoding="utf-8")))
33
+ except (OSError, json.JSONDecodeError):
34
+ # Skip unreadable/malformed files — CI still reports the rest.
35
+ continue
36
+ return runs
37
+
38
+
39
+ _STATUS_ICON = {
40
+ "success": "✅",
41
+ "failure": "❌",
42
+ "timeout": "⏱️",
43
+ "error": "⚠️",
44
+ }
45
+
46
+
47
+ def render_summary(runs: List[Dict], title: str) -> str:
48
+ """Render a markdown summary for the given runs."""
49
+ lines: List[str] = [f"## {title}", ""]
50
+
51
+ if not runs:
52
+ lines.append("*No dispatcher runs recorded in this job.*")
53
+ lines.append("")
54
+ return "\n".join(lines)
55
+
56
+ total = len(runs)
57
+ passed = sum(1 for r in runs if r.get("status") == "success")
58
+ failed = total - passed
59
+
60
+ lines.append(f"- Runs: **{total}** · Passed: **{passed}** · Failed: **{failed}**")
61
+ lines.append("")
62
+ lines.append("| Skill | Status | Exit | Duration |")
63
+ lines.append("|---|---|---:|---:|")
64
+ for r in runs:
65
+ status = str(r.get("status", "?"))
66
+ icon = _STATUS_ICON.get(status, "•")
67
+ duration_ms = r.get("duration_ms", 0) or 0
68
+ lines.append(
69
+ f"| `{r.get('skill_name', '?')}` "
70
+ f"| {icon} {status} "
71
+ f"| {r.get('exit_code', '?')} "
72
+ f"| {duration_ms} ms |"
73
+ )
74
+
75
+ failures = [r for r in runs if r.get("status") != "success"]
76
+ if failures:
77
+ lines.append("")
78
+ lines.append("### Failure details")
79
+ for r in failures:
80
+ name = r.get("skill_name", "?")
81
+ lines.append(f"<details><summary><code>{name}</code></summary>")
82
+ err = r.get("error")
83
+ if err:
84
+ lines.append("")
85
+ lines.append(f"**Error:** {err}")
86
+ stderr = (r.get("stderr") or "").rstrip()
87
+ if stderr:
88
+ lines.append("")
89
+ lines.append("```")
90
+ lines.append(stderr[-1500:])
91
+ lines.append("```")
92
+ lines.append("</details>")
93
+
94
+ lines.append("")
95
+ return "\n".join(lines)
96
+
97
+
98
+ def write_output(summary: str) -> bool:
99
+ """Append to $GITHUB_STEP_SUMMARY if set; return True when the env path was used."""
100
+ path = os.environ.get("GITHUB_STEP_SUMMARY")
101
+ if not path:
102
+ return False
103
+ with open(path, "a", encoding="utf-8") as fh:
104
+ fh.write(summary)
105
+ if not summary.endswith("\n"):
106
+ fh.write("\n")
107
+ return True
108
+
109
+
110
+ def main() -> int:
111
+ parser = argparse.ArgumentParser(description="Render CI summary from dispatcher runs")
112
+ parser.add_argument(
113
+ "--runs", type=Path, default=Path("agents/reports/runs"),
114
+ help="Directory containing ExecutionResult JSON files",
115
+ )
116
+ parser.add_argument(
117
+ "--title", default="🤖 Dispatcher runs",
118
+ help="Section title for the summary",
119
+ )
120
+ args = parser.parse_args()
121
+
122
+ runs = load_runs(args.runs)
123
+ summary = render_summary(runs, args.title)
124
+
125
+ if not write_output(summary):
126
+ print(summary)
127
+ return 0
128
+
129
+
130
+ if __name__ == "__main__":
131
+ raise SystemExit(main())