vstack 3.2.0__tar.gz → 3.3.0__tar.gz

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 (228) hide show
  1. {vstack-3.2.0 → vstack-3.3.0}/PKG-INFO +61 -2
  2. {vstack-3.2.0 → vstack-3.3.0}/README-pypi.md +60 -1
  3. {vstack-3.2.0 → vstack-3.3.0}/pyproject.toml +1 -1
  4. vstack-3.3.0/src/vstack/_templates/agents/_partials/agent-skill-boundary.md +7 -0
  5. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/architect/template.md +8 -0
  6. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/designer/template.md +8 -0
  7. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/planner/template.md +37 -12
  8. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/template.md +8 -0
  9. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/release/template.md +8 -0
  10. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/tester/template.md +8 -0
  11. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/project/.vstack/config.yaml +12 -3
  12. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/agents/generator.py +35 -9
  13. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/interface.py +192 -5
  14. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/constants.py +39 -2
  15. vstack-3.2.0/src/vstack/_templates/agents/_partials/agent-skill-boundary.md +0 -5
  16. {vstack-3.2.0 → vstack-3.3.0}/LICENSE +0 -0
  17. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/__init__.py +0 -0
  18. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/__main__.py +0 -0
  19. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_migrations/README.md +0 -0
  20. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_migrations/v2_to_v3.yaml +0 -0
  21. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/architect/artifacts/adr/NNN-template.md +0 -0
  22. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/architect/artifacts/overview.md +0 -0
  23. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/architect/config.yaml +0 -0
  24. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/designer/artifacts/overview.md +0 -0
  25. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/designer/config.yaml +0 -0
  26. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/engineer/artifacts/issues/postmortem.md +0 -0
  27. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/engineer/artifacts/issues/rca.md +0 -0
  28. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/engineer/config.yaml +0 -0
  29. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/engineer/template.md +0 -0
  30. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/planner/config.yaml +0 -0
  31. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/artifacts/changes/change-request.md +0 -0
  32. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/artifacts/issues/issue.md +0 -0
  33. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/artifacts/requirements.md +0 -0
  34. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/artifacts/roadmap.md +0 -0
  35. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/artifacts/vision.md +0 -0
  36. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/product/config.yaml +0 -0
  37. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/release/artifacts/release-summary.md +0 -0
  38. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/release/config.yaml +0 -0
  39. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/tester/artifacts/performance-baseline.md +0 -0
  40. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/tester/artifacts/security-report.md +0 -0
  41. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/tester/artifacts/test-report.md +0 -0
  42. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/agents/tester/config.yaml +0 -0
  43. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/log-retention-cleanup/hook.yaml +0 -0
  44. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/post-commit-security-scan/hook.yaml +0 -0
  45. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/post-edit-format/hook.yaml +0 -0
  46. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/post-edit-markdown-quality/hook.yaml +0 -0
  47. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/pre-tool-safety-gate/hook.yaml +0 -0
  48. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/hooks/session-audit/hook.yaml +0 -0
  49. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/git/config.yaml +0 -0
  50. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/git/template.md +0 -0
  51. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/helm/config.yaml +0 -0
  52. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/helm/template.md +0 -0
  53. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/java/config.yaml +0 -0
  54. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/java/template.md +0 -0
  55. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/k8s/config.yaml +0 -0
  56. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/k8s/template.md +0 -0
  57. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/markdown/config.yaml +0 -0
  58. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/markdown/template.md +0 -0
  59. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/python/config.yaml +0 -0
  60. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/python/template.md +0 -0
  61. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/rancher/config.yaml +0 -0
  62. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/rancher/template.md +0 -0
  63. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/security/config.yaml +0 -0
  64. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/security/template.md +0 -0
  65. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/terraform/config.yaml +0 -0
  66. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/terraform/template.md +0 -0
  67. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/terragrunt/config.yaml +0 -0
  68. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/terragrunt/template.md +0 -0
  69. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/testing/config.yaml +0 -0
  70. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/testing/template.md +0 -0
  71. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/typescript/config.yaml +0 -0
  72. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/instructions/typescript/template.md +0 -0
  73. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/api-design-review/config.yaml +0 -0
  74. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/api-design-review/template.md +0 -0
  75. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/architecture-risk/config.yaml +0 -0
  76. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/architecture-risk/template.md +0 -0
  77. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/code-review/config.yaml +0 -0
  78. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/code-review/template.md +0 -0
  79. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/dependency-audit/config.yaml +0 -0
  80. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/dependency-audit/template.md +0 -0
  81. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/incident-timeline/config.yaml +0 -0
  82. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/incident-timeline/template.md +0 -0
  83. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/migration-safety/config.yaml +0 -0
  84. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/migration-safety/template.md +0 -0
  85. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/release-readiness/config.yaml +0 -0
  86. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/prompts/release-readiness/template.md +0 -0
  87. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/_partials/base-branch.md +0 -0
  88. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/_partials/observability-checklist.md +0 -0
  89. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/_partials/run-tests.md +0 -0
  90. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/_partials/skill-context.md +0 -0
  91. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/adr/config.yaml +0 -0
  92. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/adr/template.md +0 -0
  93. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/analyse/config.yaml +0 -0
  94. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/analyse/template.md +0 -0
  95. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/architecture/config.yaml +0 -0
  96. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/architecture/template.md +0 -0
  97. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/aws-cli/config.yaml +0 -0
  98. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/aws-cli/template.md +0 -0
  99. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/cicd/config.yaml +0 -0
  100. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/cicd/template.md +0 -0
  101. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/cloudformation/config.yaml +0 -0
  102. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/cloudformation/template.md +0 -0
  103. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/code-review/config.yaml +0 -0
  104. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/code-review/template.md +0 -0
  105. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/codeql/config.yaml +0 -0
  106. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/codeql/template.md +0 -0
  107. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/concise/config.yaml +0 -0
  108. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/concise/template.md +0 -0
  109. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/consult/config.yaml +0 -0
  110. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/consult/template.md +0 -0
  111. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/container/config.yaml +0 -0
  112. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/container/template.md +0 -0
  113. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/conventional-commit/config.yaml +0 -0
  114. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/conventional-commit/template.md +0 -0
  115. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/debug/config.yaml +0 -0
  116. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/debug/template.md +0 -0
  117. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/dependabot/config.yaml +0 -0
  118. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/dependabot/template.md +0 -0
  119. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/dependency/config.yaml +0 -0
  120. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/dependency/template.md +0 -0
  121. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/design/config.yaml +0 -0
  122. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/design/template.md +0 -0
  123. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/docs/config.yaml +0 -0
  124. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/docs/template.md +0 -0
  125. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/explore/config.yaml +0 -0
  126. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/explore/template.md +0 -0
  127. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gdpr/config.yaml +0 -0
  128. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gdpr/template.md +0 -0
  129. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gh-issues/config.yaml +0 -0
  130. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gh-issues/template.md +0 -0
  131. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gh-release/config.yaml +0 -0
  132. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/gh-release/template.md +0 -0
  133. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/guardrails/config.yaml +0 -0
  134. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/guardrails/template.md +0 -0
  135. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/helm/config.yaml +0 -0
  136. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/helm/template.md +0 -0
  137. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/incident/config.yaml +0 -0
  138. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/incident/template.md +0 -0
  139. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/inspect/config.yaml +0 -0
  140. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/inspect/template.md +0 -0
  141. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/k8s/config.yaml +0 -0
  142. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/k8s/template.md +0 -0
  143. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/migrate/config.yaml +0 -0
  144. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/migrate/template.md +0 -0
  145. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/onboard/config.yaml +0 -0
  146. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/onboard/template.md +0 -0
  147. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/openapi/config.yaml +0 -0
  148. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/openapi/template.md +0 -0
  149. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/performance/config.yaml +0 -0
  150. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/performance/template.md +0 -0
  151. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/postmortem/config.yaml +0 -0
  152. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/postmortem/template.md +0 -0
  153. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/pr/config.yaml +0 -0
  154. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/pr/template.md +0 -0
  155. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/rancher/config.yaml +0 -0
  156. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/rancher/template.md +0 -0
  157. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/rca/config.yaml +0 -0
  158. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/rca/template.md +0 -0
  159. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/refactor/config.yaml +0 -0
  160. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/refactor/template.md +0 -0
  161. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/release-notes/config.yaml +0 -0
  162. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/release-notes/template.md +0 -0
  163. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/requirements/config.yaml +0 -0
  164. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/requirements/template.md +0 -0
  165. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/secret-scan/config.yaml +0 -0
  166. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/secret-scan/template.md +0 -0
  167. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/security/config.yaml +0 -0
  168. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/security/template.md +0 -0
  169. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/terraform/config.yaml +0 -0
  170. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/terraform/template.md +0 -0
  171. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/terragrunt/config.yaml +0 -0
  172. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/terragrunt/template.md +0 -0
  173. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/threat-model/config.yaml +0 -0
  174. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/threat-model/template.md +0 -0
  175. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/verify/config.yaml +0 -0
  176. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/verify/template.md +0 -0
  177. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/vision/config.yaml +0 -0
  178. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/_templates/skills/vision/template.md +0 -0
  179. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/agents/__init__.py +0 -0
  180. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/agents/config.py +0 -0
  181. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/agents/constants.py +0 -0
  182. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/__init__.py +0 -0
  183. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/config.py +0 -0
  184. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/constants.py +0 -0
  185. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/generator.py +0 -0
  186. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/models.py +0 -0
  187. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/artifacts/protocol.py +0 -0
  188. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/__init__.py +0 -0
  189. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/base.py +0 -0
  190. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/catalog.py +0 -0
  191. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/constants.py +0 -0
  192. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/init.py +0 -0
  193. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/install.py +0 -0
  194. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/manifest.py +0 -0
  195. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/migrate.py +0 -0
  196. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/parser.py +0 -0
  197. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/report.py +0 -0
  198. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/service.py +0 -0
  199. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/status.py +0 -0
  200. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/uninstall.py +0 -0
  201. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/validate.py +0 -0
  202. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/cli/verify.py +0 -0
  203. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/frontmatter/__init__.py +0 -0
  204. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/frontmatter/parser.py +0 -0
  205. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/frontmatter/schema.py +0 -0
  206. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/frontmatter/serializer.py +0 -0
  207. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/hooks/__init__.py +0 -0
  208. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/hooks/config.py +0 -0
  209. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/hooks/constants.py +0 -0
  210. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/hooks/generator.py +0 -0
  211. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/instructions/__init__.py +0 -0
  212. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/instructions/config.py +0 -0
  213. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/instructions/constants.py +0 -0
  214. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/instructions/generator.py +0 -0
  215. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/main.py +0 -0
  216. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/manifest/__init__.py +0 -0
  217. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/manifest/store.py +0 -0
  218. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/models.py +0 -0
  219. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/prompts/__init__.py +0 -0
  220. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/prompts/config.py +0 -0
  221. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/prompts/constants.py +0 -0
  222. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/prompts/generator.py +0 -0
  223. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/skills/__init__.py +0 -0
  224. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/skills/config.py +0 -0
  225. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/skills/constants.py +0 -0
  226. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/skills/generator.py +0 -0
  227. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/skills/models.py +0 -0
  228. {vstack-3.2.0 → vstack-3.3.0}/src/vstack/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vstack
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: VS Code-native AI engineering workflow system for microservices, libraries, and backend systems.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -261,7 +261,41 @@ Execution semantics:
261
261
 
262
262
  - `workflow.stages` order is the canonical progression order.
263
263
  - `agentic` is stage-sequential by default: planner advances one stage at a time in configured order.
264
- - Parallelization is still possible inside a stage (independent subtasks), but cross-stage progression remains ordered.
264
+ - Set `depends_on` to unlock a DAG topology and let planner run independent branches in parallel.
265
+
266
+ **Parallel stages with `depends_on`:** By default each stage implicitly depends on the previous one. Add `depends_on` to declare explicit predecessors. The canonical vstack DAG (seeded automatically by `vstack install`):
267
+
268
+ ```yaml
269
+ workflow:
270
+ mode: agentic
271
+ version: 1
272
+ stages:
273
+ - role: product
274
+ gate: required
275
+ hitl: always
276
+ - role: architect
277
+ gate: required
278
+ hitl: always
279
+ depends_on: [product]
280
+ - role: designer
281
+ gate: optional
282
+ hitl: on-change
283
+ depends_on: [product] # runs in parallel with architect
284
+ - role: engineer
285
+ gate: required
286
+ hitl: always
287
+ depends_on: [architect, designer] # waits for both
288
+ - role: tester
289
+ gate: required
290
+ hitl: always
291
+ depends_on: [engineer]
292
+ - role: release
293
+ gate: required
294
+ hitl: always
295
+ depends_on: [tester]
296
+ ```
297
+
298
+ `depends_on: []` marks a root stage. Absent `depends_on` falls back to sequential. Circular dependencies are caught at install/init time.
265
299
 
266
300
  Handoff target semantics:
267
301
 
@@ -272,12 +306,37 @@ Handoff target semantics:
272
306
 
273
307
  Mode quickstart in Copilot Agent Mode:
274
308
 
309
+ In `agentic` mode, `@planner` is the primary entry point. Start every session with `@planner` and let it drive all stage transitions automatically.
310
+
275
311
  | Mode | Start here | First prompt example |
276
312
  | --------- | ------------------------ | ------------------------------------------------------- |
277
313
  | `agentic` | `@planner` | `@planner Run the workflow for this repository change.` |
278
314
  | `manual` | `@product` | `@product Define requirements for this change.` |
279
315
  | `hybrid` | `@planner` or `@product` | `@planner Run the workflow for this repository change.` |
280
316
 
317
+ What planner does: reads `workflow.stages` and `depends_on`, invokes each role agent as a subagent at the right time, runs independent branches in parallel when `depends_on` permits, pauses at each gate for human approval, and reports a structured stage outcome after each step. Valid role names: `product`, `architect`, `designer`, `engineer`, `tester`, `release`.
318
+
319
+ Agentic runbook (copy/paste):
320
+
321
+ ```text
322
+ @planner Run the workflow for this repository change.
323
+ @planner Show current stage status, ready stages, blocked stages, and next action.
324
+ @planner Continue with all ready stages in parallel where workflow.depends_on allows it.
325
+ @planner Pause at required HITL gates and ask for approval before advancing.
326
+ @planner Finalize with a release-readiness summary and list changed artifacts.
327
+ ```
328
+
329
+ Troubleshooting: why planner is not running stages in parallel
330
+
331
+ - Check `workflow.mode` in `.vstack/config.yaml`: parallel orchestration requires `agentic` (or planner-led `hybrid`).
332
+ - Validate stage dependencies: run `vstack validate` to catch invalid roles, self-dependencies, and cycles.
333
+ - Inspect `depends_on` shape: a stage runs only when all listed predecessors are `ready` or `skipped`.
334
+ - Check implicit sequential fallback: if `depends_on` is omitted, the stage depends on the previous stage.
335
+ - Check optional stage behavior: `gate: optional` can be skipped when unaffected, reducing apparent parallel fan-out.
336
+ - Check blockers in stage report: any `blocked` predecessor prevents dependent stages from becoming ready.
337
+ - Check mixed execution path: in `hybrid`, mixing manual handoffs and planner in one session can mask parallel readiness.
338
+ - Confirm you started with planner: in `agentic`, begin with `@planner`, not a worker role agent.
339
+
281
340
  Usage guidance:
282
341
 
283
342
  - Use `agentic` when you want one deterministic orchestration path.
@@ -230,7 +230,41 @@ Execution semantics:
230
230
 
231
231
  - `workflow.stages` order is the canonical progression order.
232
232
  - `agentic` is stage-sequential by default: planner advances one stage at a time in configured order.
233
- - Parallelization is still possible inside a stage (independent subtasks), but cross-stage progression remains ordered.
233
+ - Set `depends_on` to unlock a DAG topology and let planner run independent branches in parallel.
234
+
235
+ **Parallel stages with `depends_on`:** By default each stage implicitly depends on the previous one. Add `depends_on` to declare explicit predecessors. The canonical vstack DAG (seeded automatically by `vstack install`):
236
+
237
+ ```yaml
238
+ workflow:
239
+ mode: agentic
240
+ version: 1
241
+ stages:
242
+ - role: product
243
+ gate: required
244
+ hitl: always
245
+ - role: architect
246
+ gate: required
247
+ hitl: always
248
+ depends_on: [product]
249
+ - role: designer
250
+ gate: optional
251
+ hitl: on-change
252
+ depends_on: [product] # runs in parallel with architect
253
+ - role: engineer
254
+ gate: required
255
+ hitl: always
256
+ depends_on: [architect, designer] # waits for both
257
+ - role: tester
258
+ gate: required
259
+ hitl: always
260
+ depends_on: [engineer]
261
+ - role: release
262
+ gate: required
263
+ hitl: always
264
+ depends_on: [tester]
265
+ ```
266
+
267
+ `depends_on: []` marks a root stage. Absent `depends_on` falls back to sequential. Circular dependencies are caught at install/init time.
234
268
 
235
269
  Handoff target semantics:
236
270
 
@@ -241,12 +275,37 @@ Handoff target semantics:
241
275
 
242
276
  Mode quickstart in Copilot Agent Mode:
243
277
 
278
+ In `agentic` mode, `@planner` is the primary entry point. Start every session with `@planner` and let it drive all stage transitions automatically.
279
+
244
280
  | Mode | Start here | First prompt example |
245
281
  | --------- | ------------------------ | ------------------------------------------------------- |
246
282
  | `agentic` | `@planner` | `@planner Run the workflow for this repository change.` |
247
283
  | `manual` | `@product` | `@product Define requirements for this change.` |
248
284
  | `hybrid` | `@planner` or `@product` | `@planner Run the workflow for this repository change.` |
249
285
 
286
+ What planner does: reads `workflow.stages` and `depends_on`, invokes each role agent as a subagent at the right time, runs independent branches in parallel when `depends_on` permits, pauses at each gate for human approval, and reports a structured stage outcome after each step. Valid role names: `product`, `architect`, `designer`, `engineer`, `tester`, `release`.
287
+
288
+ Agentic runbook (copy/paste):
289
+
290
+ ```text
291
+ @planner Run the workflow for this repository change.
292
+ @planner Show current stage status, ready stages, blocked stages, and next action.
293
+ @planner Continue with all ready stages in parallel where workflow.depends_on allows it.
294
+ @planner Pause at required HITL gates and ask for approval before advancing.
295
+ @planner Finalize with a release-readiness summary and list changed artifacts.
296
+ ```
297
+
298
+ Troubleshooting: why planner is not running stages in parallel
299
+
300
+ - Check `workflow.mode` in `.vstack/config.yaml`: parallel orchestration requires `agentic` (or planner-led `hybrid`).
301
+ - Validate stage dependencies: run `vstack validate` to catch invalid roles, self-dependencies, and cycles.
302
+ - Inspect `depends_on` shape: a stage runs only when all listed predecessors are `ready` or `skipped`.
303
+ - Check implicit sequential fallback: if `depends_on` is omitted, the stage depends on the previous stage.
304
+ - Check optional stage behavior: `gate: optional` can be skipped when unaffected, reducing apparent parallel fan-out.
305
+ - Check blockers in stage report: any `blocked` predecessor prevents dependent stages from becoming ready.
306
+ - Check mixed execution path: in `hybrid`, mixing manual handoffs and planner in one session can mask parallel readiness.
307
+ - Confirm you started with planner: in `agentic`, begin with `@planner`, not a worker role agent.
308
+
250
309
  Usage guidance:
251
310
 
252
311
  - Use `agentic` when you want one deterministic orchestration path.
@@ -45,7 +45,7 @@ classifiers = [
45
45
  "Topic :: Software Development :: Libraries :: Python Modules",
46
46
  "Topic :: Utilities",
47
47
  ]
48
- version = "3.2.0"
48
+ version = "3.3.0"
49
49
 
50
50
  [project.urls]
51
51
  Homepage = "https://github.com/eschaar/vstack"
@@ -0,0 +1,7 @@
1
+ ## agent-skill boundary
2
+
3
+ - **You (agent) = who/what/when** — decisions, scope, escalation, and handoffs within your role.
4
+ - **Skills = how** — detailed procedures, checklists, and execution playbooks.
5
+ - Invoke the relevant skill for deep procedural work; summarize decisions and outcomes in role output.
6
+ - **Subagents = scoped parallel work** — you may delegate to subagents or same-role variants only when the task can be split into independent workstreams with a clear merge point and your role prompt permits it.
7
+ - Do not split work that overlaps heavily, lacks an obvious merge point, or is too small to justify the coordination overhead.
@@ -37,6 +37,14 @@ You are a **senior software architect** acting as the **architect role**. You de
37
37
  - Capture significant structural choices in ADRs.
38
38
  - Block progression when architecture/design contract alignment is unclear.
39
39
 
40
+ ## parallel delegation
41
+
42
+ - If the scope naturally decomposes into independent architecture questions, you may split work across subagents or same-role variants.
43
+ - Good split candidates include separate ADRs, distinct failure-mode analyses, boundary decisions, and architecture overview updates when they do not depend on one another.
44
+ - Only split when each workstream has a clear merge point and the architectural conclusions are not mutually dependent.
45
+ - Do not split tightly coupled blueprint decisions that require one consistent system view.
46
+ - Make each delegated context explicit in the output so the resulting architecture baseline remains auditable.
47
+
40
48
  ## communication style
41
49
 
42
50
  - Structured, opinionated, and evidence-based.
@@ -37,6 +37,14 @@ You are a **senior interaction designer** acting as the **designer role**. You t
37
37
  - Escalate structural implications before finalizing design items.
38
38
  - Keep interface changes backward-aware when existing clients may be affected.
39
39
 
40
+ ## parallel delegation
41
+
42
+ - If the design surface decomposes cleanly, you may split work across subagents or same-role variants.
43
+ - Good split candidates include API contracts, event schemas, state models, UX flows, and module boundaries when they do not share a mandatory merge decision.
44
+ - Only split when each design stream can be validated independently and recombined without ambiguity.
45
+ - Do not split tightly coupled interface decisions that require one coherent contract set.
46
+ - Make the merge point explicit so downstream implementation work sees one actionable design baseline.
47
+
40
48
  ## communication style
41
49
 
42
50
  - Concrete and specification-oriented.
@@ -7,11 +7,20 @@ invoking role agents as subagents and enforcing explicit gate progression.
7
7
 
8
8
  ## responsibilities
9
9
 
10
- - Read the configured workflow stages and run them in order.
11
- - Invoke the correct role agent for each stage.
10
+ - Read the configured workflow stages and evaluate `depends_on` to determine execution order.
11
+ - Invoke the correct role agent for each stage when all its predecessors are complete.
12
+ - Run independent branches in parallel when their `depends_on` sets do not overlap.
12
13
  - Apply gate and human-in-the-loop policy at each transition.
13
14
  - Keep a concise execution log: completed, skipped, blocked, and pending stages.
14
15
 
16
+ ## parallel and variant delegation
17
+
18
+ - When workflow branches are independent, the planner may fan out to multiple subagents in parallel and merge their results before the next gate.
19
+ - When a role prompt explicitly allows self-decomposition, the planner may invoke that same role more than once with different scoped contexts (for example, tester/security and tester/performance).
20
+ - Only do this when the contexts are independent enough to avoid duplicated effort or conflicting conclusions.
21
+ - Keep each delegated context explicit in the execution log so the merge point remains auditable.
22
+ - Do not invent duplicate stage identities that are not represented in workflow config.
23
+
15
24
  ## scope and boundaries
16
25
 
17
26
  - Planner owns orchestration and progression logic.
@@ -27,7 +36,11 @@ invoking role agents as subagents and enforcing explicit gate progression.
27
36
  ## working principles
28
37
 
29
38
  - Use the configured workflow contract as source of truth.
30
- - Execute one stage at a time unless the user asks otherwise.
39
+ - Evaluate `depends_on` before each stage: a stage is **ready** when all its listed predecessors
40
+ have status `ready` or `skipped`. A stage without `depends_on` implicitly depends on the
41
+ previous stage in declaration order.
42
+ - Run all ready stages before advancing past a gate boundary. When multiple stages are ready
43
+ simultaneously, invoke them in parallel.
31
44
  - Prefer explicit user confirmation at gate boundaries.
32
45
  - Keep summaries short, factual, and stage-oriented.
33
46
 
@@ -49,15 +62,23 @@ invoking role agents as subagents and enforcing explicit gate progression.
49
62
 
50
63
  Execution model:
51
64
 
52
- 1. Load workflow stages from project config.
65
+ 1. Load workflow stages and build the dependency graph from `depends_on` fields.
66
+ - A stage without `depends_on` implicitly depends on the previous stage in declaration order.
67
+ - `depends_on: []` marks a stage as a root with no predecessors.
53
68
  1. Read `workflow.mode` and apply mode behavior:
54
- - `manual`: do not orchestrate automatically; tell the user to continue via direct agent invocation/handoffs or switch to `agentic` mode.
55
- - `agentic`: orchestrate stages sequentially and treat planner as the progression controller.
69
+ - `manual`: do not orchestrate automatically; tell the user to continue via direct agent
70
+ invocation/handoffs or switch to `agentic` mode.
71
+ - `agentic`: orchestrate stage progression using the dependency graph; planner is the sole
72
+ progression controller.
56
73
  - `hybrid`: orchestrate when explicitly requested; otherwise allow manual flow.
57
- 1. For each stage, invoke the mapped role agent as a subagent.
58
- 1. Capture stage result and evaluate gate policy.
59
- 1. Pause for user approval when required.
60
- 1. Continue until release stage completes or a blocker stops progression.
74
+ 1. Repeat until the graph is fully resolved or a blocker stops progression:
75
+ a. Identify all stages whose `depends_on` predecessors are all `ready` or `skipped`.
76
+ These are the **ready set**.
77
+ b. Invoke all stages in the ready set. Stages with no unresolved predecessors may run
78
+ in parallel.
79
+ c. Collect stage reports and mark each stage `ready`, `skipped`, or `blocked`.
80
+ d. Evaluate gate and hitl policy. Pause for user approval where required before continuing.
81
+ 1. Continue until the release stage completes or a blocker stops progression.
61
82
 
62
83
  When invoking a worker stage, require this structured stage report at the end:
63
84
 
@@ -69,7 +90,9 @@ When invoking a worker stage, require this structured stage report at the end:
69
90
 
70
91
  ## success criteria
71
92
 
72
- - Stage order follows configured workflow.
93
+ - Dependency graph was evaluated before each stage transition.
94
+ - All ready stages ran before each gate boundary advanced.
95
+ - Independent branches ran in parallel where `depends_on` permitted.
73
96
  - Gate progression decisions are explicit and auditable.
74
97
  - User always understands current stage and next action.
75
98
 
@@ -92,7 +115,9 @@ that requires changes to upstream items, flag it and trigger a reverse handoff.
92
115
 
93
116
  ## completion checklist
94
117
 
95
- - Workflow stages were evaluated in declared order.
118
+ - Dependency graph was evaluated; stages ran only after all predecessors were complete.
119
+ - All ready stages were identified before advancing past each gate.
120
+ - Independent branches ran in parallel where `depends_on` permitted.
96
121
  - Each stage has a clear outcome (`ready`, `blocked`, or `skipped`).
97
122
  - User approval points were respected.
98
123
  - Final summary includes completed work and pending actions.
@@ -37,6 +37,14 @@ You are a **senior product manager** acting as the **product role**. You define
37
37
  - Prefer small, reviewable scope slices over broad ambiguous deliveries.
38
38
  - Escalate unresolved cross-role conflicts before approving the next gate.
39
39
 
40
+ ## parallel delegation
41
+
42
+ - If discovery naturally separates into independent tracks, you may split work across subagents or same-role variants.
43
+ - Good split candidates include vision, requirements, roadmap shaping, and release-scope analysis when they can be merged back into one acceptance story.
44
+ - Only split when the tracks are independent enough to avoid contradictory scope decisions.
45
+ - Do not split the final acceptance decision or any scope slice that requires a single integrated product judgment.
46
+ - Keep the merge point explicit so downstream roles receive one coherent baseline.
47
+
40
48
  ## communication style
41
49
 
42
50
  - Be concise, explicit, and decision-oriented.
@@ -37,6 +37,14 @@ You are a **senior platform and release engineer** acting as the **release role*
37
37
  - Treat contradictory evidence as a blocker until reconciled.
38
38
  - Prioritize auditability and deterministic release records.
39
39
 
40
+ ## parallel delegation
41
+
42
+ - If evidence gathering or sign-off collection can be separated safely, you may split it across subagents or same-role variants.
43
+ - Good split candidates include independent baseline checks, artifact validation, and role-perspective review collection when the findings can be merged before the final release decision.
44
+ - Only split when the outputs are independent and the final release gate still remains a single coherent decision.
45
+ - Do not split the release verdict itself or any activity that would create conflicting acceptance signals.
46
+ - Record the merge point explicitly so the release record stays deterministic and auditable.
47
+
40
48
  ## communication style
41
49
 
42
50
  - Gate-oriented and explicit about pass/fail state.
@@ -38,6 +38,14 @@ You are a **senior QA, security, and reliability engineer** acting as the **test
38
38
  - Escalate immediately when required evidence cannot be produced.
39
39
  - Use explicit go/no-go language for release readiness.
40
40
 
41
+ ## parallel delegation
42
+
43
+ - If the verification scope spans independent dimensions, you may split the work into specialized subagents and run them in parallel.
44
+ - Good split candidates include security, performance, functional correctness, compatibility, and regression checks when those areas do not share critical setup or state.
45
+ - Only split when each subagent has a clearly bounded context and the results can be merged into one verdict.
46
+ - Do not split narrow or tightly coupled test scopes; the coordination overhead will outweigh the benefit.
47
+ - Make the subagent context explicit in the report so the merge step is reproducible.
48
+
41
49
  ## communication style
42
50
 
43
51
  - Clear verdicts with severity and reproduction steps.
@@ -135,9 +135,12 @@
135
135
  #
136
136
  # Execution order:
137
137
  # - Stage order in workflow.stages is the canonical progression order.
138
- # - agentic is stage-sequential by default (planner advances per stage in order).
139
- # - Parallel work can still happen inside a stage (for independent subtasks),
140
- # but cross-stage progression remains ordered by workflow.stages.
138
+ # - Without depends_on, each stage implicitly depends on the previous stage
139
+ # (fully sequential, backward-compatible behavior).
140
+ # - Set depends_on explicitly to enable DAG orchestration and parallel branches.
141
+ # Example: architect and designer can both depend on product.
142
+ # - Use depends_on: [] to make a stage an independent root.
143
+ # - In agentic mode planner can evaluate ready stages from dependency completion.
141
144
  #
142
145
  # Handoffs:
143
146
  # - handoffs.prompt is the message used when transitioning to the next stage.
@@ -156,6 +159,7 @@
156
159
  # gate: required — stage always runs
157
160
  # gate: optional — stage may be skipped when its domain is unaffected
158
161
  # gate: skip — stage is never executed (explicit opt-out)
162
+ # depends_on: [] — optional list of prerequisite stage roles
159
163
  #
160
164
  # hitl: always — pipeline pauses for human approval before handoff (default for required)
161
165
  # hitl: on-change — pipeline pauses only when the stage made changes (default for optional)
@@ -188,15 +192,20 @@ workflow:
188
192
  - role: architect
189
193
  gate: required
190
194
  hitl: always
195
+ depends_on: [product]
191
196
  - role: designer
192
197
  gate: optional
193
198
  hitl: on-change
199
+ depends_on: [product]
194
200
  - role: engineer
195
201
  gate: required
196
202
  hitl: always
203
+ depends_on: [architect, designer]
197
204
  - role: tester
198
205
  gate: required
199
206
  hitl: always
207
+ depends_on: [engineer]
200
208
  - role: release
201
209
  gate: required
202
210
  hitl: always
211
+ depends_on: [tester]
@@ -260,16 +260,37 @@ class AgentGenerator(GenericArtifactGenerator):
260
260
  }
261
261
  ]
262
262
 
263
- roles = [s["role"] for s in self.workflow_stages]
264
- try:
265
- idx = roles.index(agent_role)
266
- except ValueError:
267
- return []
268
- if idx >= len(roles) - 1:
263
+ stage_by_role = {
264
+ str(stage.get("role", "")).strip(): stage for stage in self.workflow_stages
265
+ }
266
+ if agent_role not in stage_by_role:
269
267
  return []
270
- next_role = roles[idx + 1]
271
268
 
272
- stage_handoffs: list[dict[str, str]] = self.workflow_stages[idx].get("handoffs", [])
269
+ dependencies_by_role: dict[str, list[str]] = {}
270
+ ordered_roles = [str(stage.get("role", "")).strip() for stage in self.workflow_stages]
271
+ role_set = set(ordered_roles)
272
+ for index, role in enumerate(ordered_roles):
273
+ stage = stage_by_role.get(role, {})
274
+ if "depends_on" in stage:
275
+ raw_depends_on = stage.get("depends_on", [])
276
+ depends_on = raw_depends_on if isinstance(raw_depends_on, list) else []
277
+ normalized = []
278
+ for dep in depends_on:
279
+ dep_role = str(dep).strip()
280
+ if dep_role and dep_role in role_set and dep_role not in normalized:
281
+ normalized.append(dep_role)
282
+ dependencies_by_role[role] = normalized
283
+ elif index > 0:
284
+ dependencies_by_role[role] = [ordered_roles[index - 1]]
285
+ else:
286
+ dependencies_by_role[role] = []
287
+
288
+ next_roles = [
289
+ role for role in ordered_roles if agent_role in dependencies_by_role.get(role, [])
290
+ ]
291
+ primary_next_role = next_roles[0] if next_roles else ""
292
+
293
+ stage_handoffs: list[dict[str, str]] = stage_by_role[agent_role].get("handoffs", [])
273
294
  if not isinstance(stage_handoffs, list):
274
295
  stage_handoffs = []
275
296
 
@@ -278,12 +299,15 @@ class AgentGenerator(GenericArtifactGenerator):
278
299
  if not stage_handoffs:
279
300
  if not handoff_prompt.strip():
280
301
  return []
302
+ if not next_roles:
303
+ return []
281
304
  return [
282
305
  {
283
306
  "label": f"Go to next stage: {next_role.capitalize()}",
284
307
  "agent": next_role,
285
308
  "prompt": handoff_prompt.strip(),
286
309
  }
310
+ for next_role in next_roles
287
311
  ]
288
312
 
289
313
  result: list[dict[str, str]] = []
@@ -293,7 +317,9 @@ class AgentGenerator(GenericArtifactGenerator):
293
317
  if not isinstance(h, dict):
294
318
  continue
295
319
  h_agent = str(h.get("agent", "") or "").strip()
296
- target_agent = h_agent or next_role
320
+ target_agent = h_agent or primary_next_role
321
+ if not target_agent:
322
+ continue
297
323
 
298
324
  # Apply per-agent handoff_prompt override to the first handoff that
299
325
  # targets the natural next stage (no explicit agent override).