@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,171 @@
1
+ """Command-line entry point for ``/implement-ticket``.
2
+
3
+ Minimal Option-A transport: the script loads a persisted
4
+ ``DeliveryState`` (or builds one from a ticket file), runs the
5
+ dispatcher once, writes the updated state back, and prints either
6
+ the delivery report (on SUCCESS) or the halt surface — directive
7
+ plus numbered questions — on BLOCKED/PARTIAL.
8
+
9
+ The script never edits code, runs tests, or opens pull requests.
10
+ All of that is delegated to the agent via ``@agent-directive:``
11
+ markers per
12
+ ``agents/contexts/implement-ticket-flow.md#agent-directives``. The
13
+ agent executes the directive, writes the resulting slice back to
14
+ the state file, and re-invokes this script to resume.
15
+
16
+ Exit codes:
17
+
18
+ - ``0`` — flow reached SUCCESS; ``state.report`` printed.
19
+ - ``1`` — flow halted BLOCKED; halt surface printed on stdout, the
20
+ state file carries the updated ``outcomes`` and ``questions`` so
21
+ the agent can resume.
22
+ - ``2`` — argument or I/O error (ticket file missing, JSON parse
23
+ failure, etc.). The state file is *not* written in this case.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import argparse
28
+ import json
29
+ import sys
30
+ from dataclasses import asdict
31
+ from pathlib import Path
32
+ from typing import Sequence
33
+
34
+ from .delivery_state import DeliveryState, Outcome
35
+ from .dispatcher import dispatch
36
+ from .steps import analyze, implement, memory, plan, refine, report, verify
37
+ from .steps import test as test_step
38
+
39
+ DEFAULT_STATE_FILE = Path(".implement-ticket-state.json")
40
+ """State file used when ``--state-file`` is not passed."""
41
+
42
+ _STEPS = {
43
+ "refine": refine.run,
44
+ "memory": memory.run,
45
+ "analyze": analyze.run,
46
+ "plan": plan.run,
47
+ "implement": implement.run,
48
+ "test": test_step.run,
49
+ "verify": verify.run,
50
+ "report": report.run,
51
+ }
52
+
53
+
54
+ def main(argv: Sequence[str] | None = None) -> int:
55
+ """Run one dispatch cycle against the persisted state.
56
+
57
+ ``argv`` is taken as-is; pass ``None`` to fall back to
58
+ ``sys.argv[1:]`` (the usual entry-point contract).
59
+ """
60
+ parser = _build_parser()
61
+ args = parser.parse_args(argv)
62
+ state_file: Path = args.state_file
63
+
64
+ try:
65
+ state = _load_or_build(state_file, args)
66
+ except _CLIError as exc:
67
+ print(f"error: {exc}", file=sys.stderr)
68
+ return 2
69
+
70
+ final, halting = dispatch(state, _STEPS)
71
+ _save(state_file, state)
72
+ _emit(state, final, halting)
73
+ return 0 if final is Outcome.SUCCESS else 1
74
+
75
+
76
+ def _build_parser() -> argparse.ArgumentParser:
77
+ parser = argparse.ArgumentParser(
78
+ prog="implement-ticket",
79
+ description="Run one dispatch cycle of the /implement-ticket flow.",
80
+ )
81
+ parser.add_argument(
82
+ "--state-file",
83
+ type=Path,
84
+ default=DEFAULT_STATE_FILE,
85
+ help=f"Path to persisted state JSON (default: {DEFAULT_STATE_FILE}).",
86
+ )
87
+ parser.add_argument(
88
+ "--ticket-file",
89
+ type=Path,
90
+ default=None,
91
+ help="JSON file carrying the ticket payload; used only when the "
92
+ "state file does not exist yet.",
93
+ )
94
+ parser.add_argument(
95
+ "--persona",
96
+ type=str,
97
+ default=None,
98
+ help="Persona name (senior-engineer | qa | advisory). Only honoured "
99
+ "when the state file does not exist yet; ignored on resume so a "
100
+ "mid-flight persona switch cannot silently change behaviour.",
101
+ )
102
+ return parser
103
+
104
+
105
+ def _load_or_build(state_file: Path, args: argparse.Namespace) -> DeliveryState:
106
+ """Return the state to dispatch against — either loaded or freshly built."""
107
+ if state_file.exists():
108
+ return _load(state_file)
109
+ if args.ticket_file is None:
110
+ raise _CLIError(
111
+ f"No state file at {state_file} and no --ticket-file given; "
112
+ "cannot build an initial DeliveryState.",
113
+ )
114
+ ticket = _read_json(args.ticket_file)
115
+ if not isinstance(ticket, dict):
116
+ raise _CLIError(
117
+ f"--ticket-file must carry a JSON object; got {type(ticket).__name__}.",
118
+ )
119
+ kwargs: dict = {"ticket": ticket}
120
+ if args.persona:
121
+ kwargs["persona"] = args.persona
122
+ return DeliveryState(**kwargs)
123
+
124
+
125
+ def _load(state_file: Path) -> DeliveryState:
126
+ data = _read_json(state_file)
127
+ if not isinstance(data, dict):
128
+ raise _CLIError(
129
+ f"State file {state_file} must carry a JSON object; "
130
+ f"got {type(data).__name__}.",
131
+ )
132
+ try:
133
+ return DeliveryState(**data)
134
+ except TypeError as exc:
135
+ raise _CLIError(f"State file shape is invalid: {exc}") from exc
136
+
137
+
138
+ def _save(state_file: Path, state: DeliveryState) -> None:
139
+ """Persist ``state`` as pretty JSON for diffing + human inspection."""
140
+ state_file.parent.mkdir(parents=True, exist_ok=True)
141
+ state_file.write_text(
142
+ json.dumps(asdict(state), indent=2, ensure_ascii=False) + "\n",
143
+ encoding="utf-8",
144
+ )
145
+
146
+
147
+ def _read_json(path: Path):
148
+ try:
149
+ raw = path.read_text(encoding="utf-8")
150
+ except OSError as exc:
151
+ raise _CLIError(f"Cannot read {path}: {exc}") from exc
152
+ try:
153
+ return json.loads(raw)
154
+ except json.JSONDecodeError as exc:
155
+ raise _CLIError(f"Invalid JSON in {path}: {exc}") from exc
156
+
157
+
158
+ def _emit(state: DeliveryState, final: Outcome, halting: str | None) -> None:
159
+ if final is Outcome.SUCCESS:
160
+ print(state.report)
161
+ return
162
+ print(f"[halt] outcome={final.value} step={halting or '(none)'}")
163
+ for line in state.questions:
164
+ print(line)
165
+
166
+
167
+ class _CLIError(Exception):
168
+ """Raised on configuration or I/O problems. Converted to exit code 2."""
169
+
170
+
171
+ __all__ = ["DEFAULT_STATE_FILE", "main"]
@@ -0,0 +1,130 @@
1
+ """``DeliveryState`` — the only object shared between orchestrator steps.
2
+
3
+ The shape mirrors ``agents/contexts/implement-ticket-flow.md``. No step
4
+ may invent fields not declared here; extensions require a roadmap
5
+ amendment plus a flow-contract update.
6
+
7
+ Steps return a ``StepResult`` with one of three ``Outcome`` values:
8
+
9
+ - ``SUCCESS`` — step populated its slice of ``DeliveryState`` and the
10
+ dispatcher continues to the next step.
11
+ - ``BLOCKED`` — step hit an ambiguity it cannot resolve on its own.
12
+ ``questions`` carries pre-formatted numbered options per the
13
+ ``user-interaction`` rule. The dispatcher halts.
14
+ - ``PARTIAL`` — step populated its slice *and* produced open
15
+ questions. The dispatcher halts with the same surface as BLOCKED;
16
+ the calling orchestrator (Phase 3) decides whether to prompt the
17
+ user to continue or stop.
18
+
19
+ ``DeliveryState`` is a plain dataclass rather than a typed dict so
20
+ step handlers can rely on attribute access, defaults, and mutation
21
+ semantics without resorting to dictionary indirection.
22
+ """
23
+ from __future__ import annotations
24
+
25
+ from dataclasses import dataclass, field
26
+ from enum import Enum
27
+ from typing import Any, Callable
28
+
29
+
30
+ class Outcome(str, Enum):
31
+ """Terminal outcome of a single step.
32
+
33
+ Subclassing ``str`` keeps JSON serialisation trivial (Outcome
34
+ values round-trip as their string form) without hand-rolling a
35
+ ``__str__`` override.
36
+ """
37
+
38
+ SUCCESS = "success"
39
+ BLOCKED = "blocked"
40
+ PARTIAL = "partial"
41
+
42
+
43
+ @dataclass
44
+ class StepResult:
45
+ """Return value of a single ``Step`` invocation.
46
+
47
+ ``questions`` is only populated for ``BLOCKED`` / ``PARTIAL``
48
+ outcomes. Each entry is a fully-formatted numbered line so the
49
+ dispatcher can surface them verbatim without reformatting.
50
+ """
51
+
52
+ outcome: Outcome
53
+ questions: list[str] = field(default_factory=list)
54
+ message: str = ""
55
+
56
+
57
+ @dataclass
58
+ class DeliveryState:
59
+ """Canonical state passed between orchestrator steps.
60
+
61
+ Field order matches the table in
62
+ ``agents/contexts/implement-ticket-flow.md``. Mutable defaults use
63
+ ``field(default_factory=...)`` so every instance owns its own
64
+ containers — a single shared list across runs would be a
65
+ cross-run contamination hazard for the metrics pipeline.
66
+ """
67
+
68
+ ticket: dict[str, Any]
69
+ persona: str = "senior-engineer"
70
+ memory: list[dict[str, Any]] = field(default_factory=list)
71
+ plan: Any = None
72
+ changes: list[dict[str, Any]] = field(default_factory=list)
73
+ tests: Any = None
74
+ verify: Any = None
75
+ outcomes: dict[str, str] = field(default_factory=dict)
76
+ questions: list[str] = field(default_factory=list)
77
+ report: str = ""
78
+
79
+
80
+ Step = Callable[[DeliveryState], StepResult]
81
+ """Protocol every step handler must satisfy.
82
+
83
+ A step reads and writes ``DeliveryState`` in place; its return value
84
+ carries only the terminal ``Outcome`` and any surfaced questions.
85
+ """
86
+
87
+
88
+ AGENT_DIRECTIVE_PREFIX = "@agent-directive:"
89
+ """Marker that flags a ``questions[0]`` entry as agent-addressed, not user-addressed.
90
+
91
+ When a step cannot run deterministically from pure Python (edits,
92
+ subprocess calls, anything that needs tools the dispatcher doesn't
93
+ own), it returns ``BLOCKED`` with this prefix as the first entry of
94
+ ``questions``. The orchestrator reads it and drives the matching
95
+ skill; the user-facing numbered options follow on subsequent lines.
96
+
97
+ The prefix is public contract: changing it breaks every agent that
98
+ has learned to recognise it. See
99
+ ``agents/contexts/implement-ticket-flow.md#agent-directives``.
100
+ """
101
+
102
+
103
+ def agent_directive(name: str, **payload: Any) -> str:
104
+ """Format a canonical ``@agent-directive:`` line.
105
+
106
+ ``name`` is the directive verb the agent dispatches on (for
107
+ example ``"implement-plan"`` or ``"run-tests"``). ``payload``
108
+ entries are rendered as ``key=value`` pairs on the same line, so
109
+ the whole directive stays a single greppable string. Values are
110
+ coerced with ``str`` — richer payloads belong on the
111
+ ``DeliveryState`` itself, not in the directive line.
112
+ """
113
+ suffix = " ".join(f"{key}={value}" for key, value in payload.items())
114
+ return (
115
+ f"{AGENT_DIRECTIVE_PREFIX} {name} {suffix}".strip()
116
+ if suffix
117
+ else f"{AGENT_DIRECTIVE_PREFIX} {name}"
118
+ )
119
+
120
+
121
+ def is_agent_directive(question: str) -> bool:
122
+ """True when ``question`` is an agent-addressed directive line.
123
+
124
+ Used by the orchestrator to split ``state.questions`` into the
125
+ agent-facing directive (at most one, always at index 0) and the
126
+ user-facing numbered options (everything else).
127
+ """
128
+ return isinstance(question, str) and question.lstrip().startswith(
129
+ AGENT_DIRECTIVE_PREFIX,
130
+ )
@@ -0,0 +1,134 @@
1
+ """Linear step dispatcher for ``/implement-ticket``.
2
+
3
+ The dispatcher holds no business logic. It walks the fixed eight-step
4
+ order declared in ``agents/contexts/implement-ticket-flow.md``, hands
5
+ each step a live ``DeliveryState``, and honours the three terminal
6
+ outcomes:
7
+
8
+ - ``SUCCESS`` — record and advance.
9
+ - ``BLOCKED`` — record, copy questions onto the state, halt.
10
+ - ``PARTIAL`` — record, copy questions onto the state, halt.
11
+
12
+ Resumption semantics (Option A, flow contract §agent-directives):
13
+ steps whose name is already marked ``success`` in
14
+ ``state.outcomes`` are **skipped**. This lets a caller re-invoke the
15
+ dispatcher after executing an agent-directive (the ``implement``,
16
+ ``test``, ``verify`` steps cannot run from pure Python), update the
17
+ relevant slice of ``DeliveryState``, record ``success`` on the
18
+ resumed step, and continue without replaying earlier work.
19
+
20
+ Step handlers are injected by the caller rather than discovered at
21
+ import time. Phase 1 shipped the dispatcher with mock handlers;
22
+ Phase 2 wires the real ones under ``steps/``. Keeping injection
23
+ explicit means the dispatcher is trivially testable and never
24
+ depends on handler import order.
25
+ """
26
+ from __future__ import annotations
27
+
28
+ from collections.abc import Mapping
29
+
30
+ from .delivery_state import DeliveryState, Outcome, Step, StepResult
31
+
32
+ STEP_ORDER: tuple[str, ...] = (
33
+ "refine",
34
+ "memory",
35
+ "analyze",
36
+ "plan",
37
+ "implement",
38
+ "test",
39
+ "verify",
40
+ "report",
41
+ )
42
+ """Canonical execution order. Eight steps, fixed, no branching.
43
+
44
+ Changing this order is a roadmap-level decision — not a PR rider — per
45
+ the surface-growth guardrails in
46
+ ``agents/roadmaps/road-to-implement-ticket.md``.
47
+ """
48
+
49
+
50
+ def dispatch(
51
+ state: DeliveryState,
52
+ steps: Mapping[str, Step],
53
+ ) -> tuple[Outcome, str | None]:
54
+ """Run the eight steps linearly against ``state``.
55
+
56
+ Returns a ``(final_outcome, halting_step)`` tuple. ``halting_step``
57
+ is ``None`` when every step succeeded; otherwise it carries the
58
+ name of the step whose result halted the flow.
59
+
60
+ Parameters
61
+ ----------
62
+ state:
63
+ Live ``DeliveryState``. Mutated in place: each step's outcome
64
+ is recorded in ``state.outcomes`` under the step name, and
65
+ any surfaced questions land on ``state.questions``.
66
+ steps:
67
+ Mapping from step name to handler. Every entry in
68
+ :data:`STEP_ORDER` must be present; missing entries raise
69
+ ``KeyError`` at dispatch time rather than silently skipping,
70
+ so incomplete wiring surfaces as a hard failure.
71
+
72
+ Raises
73
+ ------
74
+ KeyError
75
+ If ``steps`` does not cover every entry in
76
+ :data:`STEP_ORDER`.
77
+ """
78
+ _assert_all_steps_present(steps)
79
+
80
+ # Clear stale questions from a previous halt before we resume so
81
+ # the caller never mistakes old options for fresh ones.
82
+ state.questions = []
83
+
84
+ for name in STEP_ORDER:
85
+ if state.outcomes.get(name) == Outcome.SUCCESS.value:
86
+ # Already completed on an earlier invocation — skip per the
87
+ # resume contract. The caller is responsible for keeping
88
+ # ``state.outcomes`` and the matching slice in sync.
89
+ continue
90
+
91
+ handler = steps[name]
92
+ result = handler(state)
93
+ _validate_step_result(name, result)
94
+
95
+ state.outcomes[name] = result.outcome.value
96
+
97
+ if result.outcome is Outcome.BLOCKED:
98
+ state.questions = list(result.questions)
99
+ return Outcome.BLOCKED, name
100
+
101
+ if result.outcome is Outcome.PARTIAL:
102
+ state.questions = list(result.questions)
103
+ return Outcome.PARTIAL, name
104
+
105
+ return Outcome.SUCCESS, None
106
+
107
+
108
+ def _assert_all_steps_present(steps: Mapping[str, Step]) -> None:
109
+ """Reject an incomplete step mapping up front.
110
+
111
+ We deliberately fail loudly here: a missing step would otherwise
112
+ raise deep inside the dispatch loop after partial state mutation,
113
+ which makes debugging the wiring harder than it needs to be.
114
+ """
115
+ missing = [name for name in STEP_ORDER if name not in steps]
116
+ if missing:
117
+ raise KeyError(
118
+ "Step mapping is missing handlers for: " + ", ".join(missing),
119
+ )
120
+
121
+
122
+ def _validate_step_result(name: str, result: StepResult) -> None:
123
+ """Enforce the blocked/partial invariant: questions must be set.
124
+
125
+ A step that blocks without surfacing a question is a bug — there
126
+ is nothing for the user to answer. We raise ``ValueError`` instead
127
+ of silently recording the outcome so the defect is visible at the
128
+ earliest possible point.
129
+ """
130
+ if result.outcome in (Outcome.BLOCKED, Outcome.PARTIAL) and not result.questions:
131
+ raise ValueError(
132
+ f"Step {name!r} returned {result.outcome.value} with no questions; "
133
+ "blocked and partial outcomes must surface at least one numbered option.",
134
+ )
@@ -0,0 +1,85 @@
1
+ """Persona policy — behavioural parameters resolved from ``state.persona``.
2
+
3
+ Three personas ship today, each keyed by the string already carried
4
+ on ``DeliveryState.persona`` (see
5
+ ``agents/contexts/implement-ticket-flow.md#personas``):
6
+
7
+ ``senior-engineer``
8
+ Default. Runs every step. No test widening.
9
+ ``qa``
10
+ Runs every step but widens the ``test`` scope to the full suite
11
+ (``scope=full`` in the ``run-tests`` directive) so regressions
12
+ outside the changed paths are caught.
13
+ ``advisory``
14
+ Plan-only mode. ``implement``, ``test``, and ``verify`` short-
15
+ circuit to SUCCESS without doing work — the flow produces a
16
+ delivery report whose value is the plan itself, and next-command
17
+ suggestions are suppressed (nothing was committed).
18
+
19
+ Unknown persona names fall back to ``senior-engineer`` rather than
20
+ raising, so a mistyped value never aborts a run mid-flight. The
21
+ caller is responsible for validating the string at the state-
22
+ construction boundary if strict behaviour is needed.
23
+ """
24
+ from __future__ import annotations
25
+
26
+ from dataclasses import dataclass
27
+ from typing import Any
28
+
29
+ DEFAULT_PERSONA = "senior-engineer"
30
+ """Name used when ``state.persona`` is empty or unrecognised."""
31
+
32
+
33
+ @dataclass(frozen=True)
34
+ class PersonaPolicy:
35
+ """Behavioural flags read by individual step handlers.
36
+
37
+ Frozen so a step cannot mutate the policy mid-run by accident —
38
+ policy is resolved once and treated as read-only configuration.
39
+ """
40
+
41
+ name: str
42
+ allows_implement: bool = True
43
+ allows_test: bool = True
44
+ allows_verify: bool = True
45
+ widen_tests: bool = False
46
+ suggests_next_commands: bool = True
47
+
48
+
49
+ _POLICIES: dict[str, PersonaPolicy] = {
50
+ "senior-engineer": PersonaPolicy(name="senior-engineer"),
51
+ "qa": PersonaPolicy(name="qa", widen_tests=True),
52
+ "advisory": PersonaPolicy(
53
+ name="advisory",
54
+ allows_implement=False,
55
+ allows_test=False,
56
+ allows_verify=False,
57
+ suggests_next_commands=False,
58
+ ),
59
+ }
60
+
61
+
62
+ def resolve_policy(persona: Any) -> PersonaPolicy:
63
+ """Return the policy for ``persona``; fall back to the default on miss.
64
+
65
+ ``persona`` is typed ``Any`` because it originates from
66
+ ``DeliveryState.persona`` which the dataclass declares as ``str``
67
+ but does not enforce — a caller may set it to ``None`` while
68
+ wiring up a partial state in tests.
69
+ """
70
+ if isinstance(persona, str) and persona in _POLICIES:
71
+ return _POLICIES[persona]
72
+ return _POLICIES[DEFAULT_PERSONA]
73
+
74
+
75
+ def known_personas() -> tuple[str, ...]:
76
+ """Return the persona names shipped today, in insertion order."""
77
+ return tuple(_POLICIES.keys())
78
+
79
+
80
+ __all__ = [
81
+ "DEFAULT_PERSONA",
82
+ "PersonaPolicy",
83
+ "known_personas",
84
+ "resolve_policy",
85
+ ]
@@ -0,0 +1,49 @@
1
+ """Step handlers for the ``/implement-ticket`` dispatcher.
2
+
3
+ Each module exposes a single ``run`` callable that matches the
4
+ ``Step`` protocol defined in ``..delivery_state``. The dispatcher
5
+ wires them into the ``STEP_ORDER`` mapping at call time; nothing in
6
+ this package imports handlers eagerly, so a partial wiring during
7
+ development is caught by the dispatcher's missing-step check rather
8
+ than by an import-time failure.
9
+
10
+ Phase 2 ships all eight step handlers. The deterministic gates
11
+ (``refine``, ``memory``, ``analyze``) validate upstream state; the
12
+ delegation gates (``plan``, ``implement``, ``test``, ``verify``)
13
+ halt with ``@agent-directive:`` markers so the orchestrator can
14
+ invoke the matching skill and resume. ``report`` renders the
15
+ delivery Markdown once everything else has succeeded. See
16
+ ``agents/roadmaps/road-to-implement-ticket.md`` for the shipping
17
+ order and ``agents/contexts/implement-ticket-flow.md`` for the
18
+ slice contracts each handler writes to.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ from . import analyze, implement, memory, plan, refine, report, test, verify
23
+
24
+ _STEPS = (refine, memory, analyze, plan, implement, test, verify, report)
25
+
26
+
27
+ def all_ambiguities() -> dict[str, tuple[dict[str, str], ...]]:
28
+ """Return `{step_name: AMBIGUITIES}` for every step in flow order.
29
+
30
+ Used by documentation generators and the ``test_ambiguity_coverage``
31
+ suite to prove every step explicitly declares what can surface a
32
+ ``BLOCKED`` outcome. Steps that always succeed (``memory``,
33
+ ``report``) return an empty tuple — declared intent, not an
34
+ omission.
35
+ """
36
+ return {step.__name__.rsplit(".", 1)[-1]: step.AMBIGUITIES for step in _STEPS}
37
+
38
+
39
+ __all__ = [
40
+ "all_ambiguities",
41
+ "analyze",
42
+ "implement",
43
+ "memory",
44
+ "plan",
45
+ "refine",
46
+ "report",
47
+ "test",
48
+ "verify",
49
+ ]
@@ -0,0 +1,98 @@
1
+ """``analyze`` step — deterministic precondition gate.
2
+
3
+ The step runs no analysis of its own: the real impact analysis is
4
+ owned by the agent between the ``memory`` and ``plan`` steps. The
5
+ gate's job is to confirm the upstream slices are populated enough
6
+ for planning to be meaningful.
7
+
8
+ Checks, in order:
9
+
10
+ 1. ``refine`` outcome must be ``success`` — the ticket is refined.
11
+ 2. ``memory`` outcome must be ``success`` — priors were queried
12
+ (an empty result set is still a successful query, per the
13
+ ``memory`` step's own contract).
14
+ 3. The ticket must still carry acceptance criteria — guards against
15
+ a resuming caller overwriting ``state.ticket`` between runs.
16
+
17
+ On any missing precondition the step returns ``BLOCKED`` with the
18
+ reason spelled out and numbered options per the ``user-interaction``
19
+ rule. Otherwise it returns ``SUCCESS`` without mutating state.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ from ..delivery_state import DeliveryState, Outcome, StepResult
24
+
25
+ AMBIGUITIES: tuple[dict[str, str], ...] = (
26
+ {
27
+ "code": "upstream_refine_failed",
28
+ "trigger": "`refine` outcome is not `success`",
29
+ "resolution": "re-run `/implement-ticket` from the start",
30
+ },
31
+ {
32
+ "code": "upstream_memory_failed",
33
+ "trigger": "`memory` outcome is not `success`",
34
+ "resolution": "re-run `/implement-ticket` from the start",
35
+ },
36
+ {
37
+ "code": "lost_ac",
38
+ "trigger": "ticket lost its `acceptance_criteria` between runs",
39
+ "resolution": "restart with the full ticket payload",
40
+ },
41
+ )
42
+ """Declared ambiguity surfaces. Every BLOCKED return maps to one code."""
43
+
44
+
45
+ def run(state: DeliveryState) -> StepResult:
46
+ """Return SUCCESS when upstream is coherent, BLOCKED otherwise."""
47
+ missing = _diagnose(state)
48
+ if not missing:
49
+ return StepResult(outcome=Outcome.SUCCESS)
50
+
51
+ ticket_id = (state.ticket or {}).get("id") or "(no id)"
52
+ return StepResult(
53
+ outcome=Outcome.BLOCKED,
54
+ questions=_format_questions(ticket_id, missing),
55
+ message=(
56
+ f"Ticket {ticket_id} cannot enter the plan step: "
57
+ + "; ".join(missing)
58
+ ),
59
+ )
60
+
61
+
62
+ def _diagnose(state: DeliveryState) -> list[str]:
63
+ """List the precondition failures in the order a reader needs them."""
64
+ issues: list[str] = []
65
+
66
+ if state.outcomes.get("refine") != Outcome.SUCCESS.value:
67
+ issues.append("refine step did not complete successfully")
68
+
69
+ if state.outcomes.get("memory") != Outcome.SUCCESS.value:
70
+ issues.append("memory step did not complete successfully")
71
+
72
+ ac = (state.ticket or {}).get("acceptance_criteria")
73
+ if not isinstance(ac, list) or not ac:
74
+ issues.append("ticket lost its acceptance criteria")
75
+
76
+ return issues
77
+
78
+
79
+ def _format_questions(ticket_id: str, missing: list[str]) -> list[str]:
80
+ """Render the numbered options shown to the user when BLOCKED.
81
+
82
+ Two options: retry from the first failing step, or abort. The
83
+ headnote names the ticket and every failure so the user can
84
+ decide without re-reading the earlier output.
85
+ """
86
+ headnote = (
87
+ f"> Ticket {ticket_id} \u2014 analyze gate failed: "
88
+ + "; ".join(missing)
89
+ + "."
90
+ )
91
+ return [
92
+ headnote,
93
+ "> 1. Re-run `/implement-ticket` from the start \u2014 rebuild upstream state",
94
+ "> 2. Abort \u2014 the flow cannot continue",
95
+ ]
96
+
97
+
98
+ __all__ = ["AMBIGUITIES", "run"]