@danmoisan/drm-copilot-mcp 0.0.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 (380) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/out/mcp-server.js +17323 -0
  4. package/package.json +36 -0
  5. package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +3 -0
  6. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_repo_root_is_source_of_truth.md +11 -0
  7. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_vsce_verify_package_location.md +19 -0
  8. package/resources/claude-customizations/.claude/agent-memory/orchestrator/project_extension_location.md +11 -0
  9. package/resources/claude-customizations/.claude/agent-memory/prd-feature/MEMORY.md +1 -0
  10. package/resources/claude-customizations/.claude/agent-memory/prd-feature/project_push_down_pattern.md +13 -0
  11. package/resources/claude-customizations/.claude/agent-memory/task-researcher/MEMORY.md +3 -0
  12. package/resources/claude-customizations/.claude/agent-memory/task-researcher/project_push_down_claude_dir.md +11 -0
  13. package/resources/claude-customizations/.claude/agents/atomic-executor.md +135 -0
  14. package/resources/claude-customizations/.claude/agents/atomic-planner.md +71 -0
  15. package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +69 -0
  16. package/resources/claude-customizations/.claude/agents/epic-review.md +40 -0
  17. package/resources/claude-customizations/.claude/agents/feature-review.md +136 -0
  18. package/resources/claude-customizations/.claude/agents/orchestrator.md +83 -0
  19. package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +80 -0
  20. package/resources/claude-customizations/.claude/agents/prd-feature.md +42 -0
  21. package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +72 -0
  22. package/resources/claude-customizations/.claude/agents/staged-review.md +41 -0
  23. package/resources/claude-customizations/.claude/agents/status-updater.md +41 -0
  24. package/resources/claude-customizations/.claude/agents/task-researcher.md +81 -0
  25. package/resources/claude-customizations/.claude/agents/typescript-engineer.md +24 -0
  26. package/resources/claude-customizations/.claude/hooks/check-powershell-test-purity.ps1 +111 -0
  27. package/resources/claude-customizations/.claude/hooks/check-python-test-purity.ps1 +146 -0
  28. package/resources/claude-customizations/.claude/hooks/enforce-evidence-locations.ps1 +150 -0
  29. package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +238 -0
  30. package/resources/claude-customizations/.claude/hooks/enforce-promotion-mcp-only.ps1 +147 -0
  31. package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +235 -0
  32. package/resources/claude-customizations/.claude/hooks/validate-bash.ps1 +69 -0
  33. package/resources/claude-customizations/.claude/hooks/validate-executor-output.ps1 +296 -0
  34. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage.ps1 +389 -0
  35. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +141 -0
  36. package/resources/claude-customizations/.claude/hooks/validate-planner-output.ps1 +288 -0
  37. package/resources/claude-customizations/.claude/hooks/validate-required-artifact-output.ps1 +171 -0
  38. package/resources/claude-customizations/.claude/hooks/validate-task-researcher-output.ps1 +142 -0
  39. package/resources/claude-customizations/.claude/rules/csharp.md +62 -0
  40. package/resources/claude-customizations/.claude/rules/general-code-change.md +71 -0
  41. package/resources/claude-customizations/.claude/rules/general-unit-test.md +60 -0
  42. package/resources/claude-customizations/.claude/rules/powershell.md +97 -0
  43. package/resources/claude-customizations/.claude/rules/python-suppressions.md +143 -0
  44. package/resources/claude-customizations/.claude/rules/python.md +99 -0
  45. package/resources/claude-customizations/.claude/rules/self-explanatory-code-commenting.md +97 -0
  46. package/resources/claude-customizations/.claude/rules/tonality.md +80 -0
  47. package/resources/claude-customizations/.claude/rules/typescript-suppressions.md +66 -0
  48. package/resources/claude-customizations/.claude/rules/typescript.md +45 -0
  49. package/resources/claude-customizations/.claude/settings.json +144 -0
  50. package/resources/claude-customizations/.claude/skills/acceptance-criteria-tracking/SKILL.md +102 -0
  51. package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +189 -0
  52. package/resources/claude-customizations/.claude/skills/commit-message/SKILL.md +65 -0
  53. package/resources/claude-customizations/.claude/skills/csharp-change-budget-router/SKILL.md +90 -0
  54. package/resources/claude-customizations/.claude/skills/csharp-orchestration-state-machine/SKILL.md +58 -0
  55. package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +77 -0
  56. package/resources/claude-customizations/.claude/skills/evidence-and-timestamp-conventions/SKILL.md +164 -0
  57. package/resources/claude-customizations/.claude/skills/execute-hard-lock/SKILL.md +82 -0
  58. package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +115 -0
  59. package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +167 -0
  60. package/resources/claude-customizations/.claude/skills/fill-feature-docs/SKILL.md +22 -0
  61. package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +64 -0
  62. package/resources/claude-customizations/.claude/skills/invoke-powershell-engineer/SKILL.md +65 -0
  63. package/resources/claude-customizations/.claude/skills/invoke-python-engineer/SKILL.md +64 -0
  64. package/resources/claude-customizations/.claude/skills/make-skill-template/SKILL.md +147 -0
  65. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +132 -0
  66. package/resources/claude-customizations/.claude/skills/policy-audit-template-usage/SKILL.md +49 -0
  67. package/resources/claude-customizations/.claude/skills/policy-compliance-order/SKILL.md +40 -0
  68. package/resources/claude-customizations/.claude/skills/powershell-change-budget-router/SKILL.md +49 -0
  69. package/resources/claude-customizations/.claude/skills/powershell-orchestration-state-machine/SKILL.md +58 -0
  70. package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +77 -0
  71. package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +50 -0
  72. package/resources/claude-customizations/.claude/skills/pr-base-branch-merge-base/SKILL.md +56 -0
  73. package/resources/claude-customizations/.claude/skills/pr-context-artifacts/SKILL.md +30 -0
  74. package/resources/claude-customizations/.claude/skills/python-change-budget-router/SKILL.md +79 -0
  75. package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +77 -0
  76. package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +40 -0
  77. package/resources/claude-customizations/.claude/skills/research-issue/SKILL.md +67 -0
  78. package/resources/claude-customizations/.claude/skills/review-epic/SKILL.md +21 -0
  79. package/resources/claude-customizations/.claude/skills/review-feature/SKILL.md +25 -0
  80. package/resources/claude-customizations/.claude/skills/review-staged/SKILL.md +21 -0
  81. package/resources/claude-customizations/.claude/skills/skill-canonical-location-audit/SKILL.md +49 -0
  82. package/resources/claude-customizations/.claude/skills/translate-copilot-to-claude/SKILL.md +295 -0
  83. package/resources/claude-customizations/.claude/skills/update-status/SKILL.md +21 -0
  84. package/resources/claude-dir-customizations/.mcp.json +8 -0
  85. package/resources/codex-and-agents-customizations/.agents/README.md +86 -0
  86. package/resources/codex-and-agents-customizations/.agents/skills/README.md +49 -0
  87. package/resources/codex-and-agents-customizations/.agents/skills/acceptance-criteria-tracking/SKILL.md +107 -0
  88. package/resources/codex-and-agents-customizations/.agents/skills/atomic-executor/SKILL.md +73 -0
  89. package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +194 -0
  90. package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +87 -0
  91. package/resources/codex-and-agents-customizations/.agents/skills/commit-message/SKILL.md +70 -0
  92. package/resources/codex-and-agents-customizations/.agents/skills/commit-message-conventions/SKILL.md +95 -0
  93. package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +67 -0
  94. package/resources/codex-and-agents-customizations/.agents/skills/csharp-change-budget-router/SKILL.md +94 -0
  95. package/resources/codex-and-agents-customizations/.agents/skills/csharp-orchestration-state-machine/SKILL.md +64 -0
  96. package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +82 -0
  97. package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +168 -0
  98. package/resources/codex-and-agents-customizations/.agents/skills/execute-hard-lock/SKILL.md +88 -0
  99. package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +129 -0
  100. package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +106 -0
  101. package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +181 -0
  102. package/resources/codex-and-agents-customizations/.agents/skills/fill-feature-docs/SKILL.md +27 -0
  103. package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +73 -0
  104. package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +74 -0
  105. package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +73 -0
  106. package/resources/codex-and-agents-customizations/.agents/skills/make-skill-template/SKILL.md +152 -0
  107. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +143 -0
  108. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +317 -0
  109. package/resources/codex-and-agents-customizations/.agents/skills/policy-audit-template-usage/SKILL.md +53 -0
  110. package/resources/codex-and-agents-customizations/.agents/skills/policy-compliance-order/SKILL.md +49 -0
  111. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +102 -0
  112. package/resources/codex-and-agents-customizations/.agents/skills/powershell-change-budget-router/SKILL.md +53 -0
  113. package/resources/codex-and-agents-customizations/.agents/skills/powershell-orchestration-state-machine/SKILL.md +64 -0
  114. package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +83 -0
  115. package/resources/codex-and-agents-customizations/.agents/skills/pr-author/SKILL.md +55 -0
  116. package/resources/codex-and-agents-customizations/.agents/skills/pr-authoring/SKILL.md +124 -0
  117. package/resources/codex-and-agents-customizations/.agents/skills/pr-base-branch-merge-base/SKILL.md +60 -0
  118. package/resources/codex-and-agents-customizations/.agents/skills/pr-context-artifacts/SKILL.md +34 -0
  119. package/resources/codex-and-agents-customizations/.agents/skills/python/SKILL.md +104 -0
  120. package/resources/codex-and-agents-customizations/.agents/skills/python-change-budget-router/SKILL.md +84 -0
  121. package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +82 -0
  122. package/resources/codex-and-agents-customizations/.agents/skills/python-suppressions/SKILL.md +148 -0
  123. package/resources/codex-and-agents-customizations/.agents/skills/remediation-handoff-atomic-planner/SKILL.md +49 -0
  124. package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +142 -0
  125. package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/agents/openai.yaml +5 -0
  126. package/resources/codex-and-agents-customizations/.agents/skills/research-issue/SKILL.md +72 -0
  127. package/resources/codex-and-agents-customizations/.agents/skills/review-epic/SKILL.md +26 -0
  128. package/resources/codex-and-agents-customizations/.agents/skills/review-feature/SKILL.md +30 -0
  129. package/resources/codex-and-agents-customizations/.agents/skills/review-staged/SKILL.md +26 -0
  130. package/resources/codex-and-agents-customizations/.agents/skills/self-explanatory-code-commenting/SKILL.md +102 -0
  131. package/resources/codex-and-agents-customizations/.agents/skills/skill-canonical-location-audit/SKILL.md +52 -0
  132. package/resources/codex-and-agents-customizations/.agents/skills/translate-copilot-to-claude/SKILL.md +317 -0
  133. package/resources/codex-and-agents-customizations/.agents/skills/typescript/SKILL.md +50 -0
  134. package/resources/codex-and-agents-customizations/.agents/skills/typescript-suppressions/SKILL.md +71 -0
  135. package/resources/codex-and-agents-customizations/.agents/skills/update-status/SKILL.md +26 -0
  136. package/resources/codex-and-agents-customizations/.codex/agents/5.1-beast-adjusted.toml +23 -0
  137. package/resources/codex-and-agents-customizations/.codex/agents/5.1-thinking-beast-mode-adjusted.toml +23 -0
  138. package/resources/codex-and-agents-customizations/.codex/agents/api-architect.toml +23 -0
  139. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +151 -0
  140. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +93 -0
  141. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planning.toml +24 -0
  142. package/resources/codex-and-agents-customizations/.codex/agents/commentary-remediation.toml +23 -0
  143. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward.toml +20 -0
  144. package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-executor.toml +24 -0
  145. package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-planning.toml +25 -0
  146. package/resources/codex-and-agents-customizations/.codex/agents/csharp-orchestrator.toml +56 -0
  147. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +97 -0
  148. package/resources/codex-and-agents-customizations/.codex/agents/epic-review.toml +52 -0
  149. package/resources/codex-and-agents-customizations/.codex/agents/expert-nextjs-developer.toml +23 -0
  150. package/resources/codex-and-agents-customizations/.codex/agents/expert-react-frontend-engineer.toml +23 -0
  151. package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +149 -0
  152. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer.toml +60 -0
  153. package/resources/codex-and-agents-customizations/.codex/agents/gpt-5-beast-mode.toml +23 -0
  154. package/resources/codex-and-agents-customizations/.codex/agents/hlbpa.toml +23 -0
  155. package/resources/codex-and-agents-customizations/.codex/agents/mentor.toml +23 -0
  156. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +121 -0
  157. package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +24 -0
  158. package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-planning.toml +25 -0
  159. package/resources/codex-and-agents-customizations/.codex/agents/powershell-di-unit-test-engineer.toml +24 -0
  160. package/resources/codex-and-agents-customizations/.codex/agents/powershell-orchestrator.toml +56 -0
  161. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +108 -0
  162. package/resources/codex-and-agents-customizations/.codex/agents/pr-author.toml +26 -0
  163. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature.toml +53 -0
  164. package/resources/codex-and-agents-customizations/.codex/agents/prd.toml +23 -0
  165. package/resources/codex-and-agents-customizations/.codex/agents/pytest-unit-test-coding.toml +24 -0
  166. package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-executor.toml +24 -0
  167. package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-planning.toml +25 -0
  168. package/resources/codex-and-agents-customizations/.codex/agents/python-execution-only-typed.toml +24 -0
  169. package/resources/codex-and-agents-customizations/.codex/agents/python-orchestrator.toml +54 -0
  170. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +100 -0
  171. package/resources/codex-and-agents-customizations/.codex/agents/staged-review.toml +53 -0
  172. package/resources/codex-and-agents-customizations/.codex/agents/status-updater.toml +53 -0
  173. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher.toml +103 -0
  174. package/resources/codex-and-agents-customizations/.codex/agents/tdd-green.toml +23 -0
  175. package/resources/codex-and-agents-customizations/.codex/agents/tdd-red.toml +23 -0
  176. package/resources/codex-and-agents-customizations/.codex/agents/tdd-refactor.toml +23 -0
  177. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer.toml +48 -0
  178. package/resources/codex-and-agents-customizations/.codex/agents/voidbeast-gpt41enhanced.toml +23 -0
  179. package/resources/codex-and-agents-customizations/.codex/codex-web-setup.plan.md +26 -0
  180. package/resources/codex-and-agents-customizations/.codex/codex-web-setup.sh +384 -0
  181. package/resources/codex-and-agents-customizations/.codex/config.toml +137 -0
  182. package/resources/codex-and-agents-customizations/.codex/hooks/check-powershell-test-purity.ps1 +113 -0
  183. package/resources/codex-and-agents-customizations/.codex/hooks/check-python-test-purity.ps1 +149 -0
  184. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-evidence-locations.ps1 +153 -0
  185. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +241 -0
  186. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-promotion-mcp-only.ps1 +150 -0
  187. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +238 -0
  188. package/resources/codex-and-agents-customizations/.codex/hooks/validate-bash.ps1 +72 -0
  189. package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +265 -0
  190. package/resources/codex-and-agents-customizations/.codex/prompts/feature-review-remediate.md +10 -0
  191. package/resources/codex-and-agents-customizations/.codex/prompts/generate-commit-message-repo.md +11 -0
  192. package/resources/codex-and-agents-customizations/.codex/prompts/generate-pr.md +15 -0
  193. package/resources/codex-and-agents-customizations/.codex/prompts/orchestrate-work.md +22 -0
  194. package/resources/codex-and-agents-customizations/AGENTS.md +317 -0
  195. package/resources/customizations/.github/agents/5.1-Beast-adjusted.agent.md +181 -0
  196. package/resources/customizations/.github/agents/5.1-Thinking-Beast-Mode-adjusted.agent.md +361 -0
  197. package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +192 -0
  198. package/resources/customizations/.github/agents/api-architect.agent.md +40 -0
  199. package/resources/customizations/.github/agents/atomic_executor.agent.md +251 -0
  200. package/resources/customizations/.github/agents/atomic_planning.agent.md +658 -0
  201. package/resources/customizations/.github/agents/commentary-remediation.agent.md +35 -0
  202. package/resources/customizations/.github/agents/commit-steward.agent.md +200 -0
  203. package/resources/customizations/.github/agents/csharp-atomic-executor.agent.md +288 -0
  204. package/resources/customizations/.github/agents/csharp-atomic-planning.agent.md +354 -0
  205. package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +375 -0
  206. package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +285 -0
  207. package/resources/customizations/.github/agents/epic-review.agent.md +374 -0
  208. package/resources/customizations/.github/agents/expert-nextjs-developer.agent.md +477 -0
  209. package/resources/customizations/.github/agents/expert-react-frontend-engineer.agent.md +739 -0
  210. package/resources/customizations/.github/agents/feature-review.agent.md +49 -0
  211. package/resources/customizations/.github/agents/gpt-5-beast-mode.agent.md +116 -0
  212. package/resources/customizations/.github/agents/hlbpa.agent.md +219 -0
  213. package/resources/customizations/.github/agents/mentor.agent.md +32 -0
  214. package/resources/customizations/.github/agents/orchestrator.agent.md +449 -0
  215. package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +287 -0
  216. package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +647 -0
  217. package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +382 -0
  218. package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +293 -0
  219. package/resources/customizations/.github/agents/pr-author.agent.md +138 -0
  220. package/resources/customizations/.github/agents/prd-feature.agent.md +52 -0
  221. package/resources/customizations/.github/agents/prd.agent.md +202 -0
  222. package/resources/customizations/.github/agents/pytest-unit-test-coding.agent.md +202 -0
  223. package/resources/customizations/.github/agents/python-atomic-executor.agent.md +289 -0
  224. package/resources/customizations/.github/agents/python-atomic-planning.agent.md +429 -0
  225. package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +217 -0
  226. package/resources/customizations/.github/agents/python-orchestrator.agent.md +380 -0
  227. package/resources/customizations/.github/agents/python-typed-engineer.agent.md +271 -0
  228. package/resources/customizations/.github/agents/staged-review.agent.md +246 -0
  229. package/resources/customizations/.github/agents/status_updater.agent.md +279 -0
  230. package/resources/customizations/.github/agents/task-researcher.agent.md +298 -0
  231. package/resources/customizations/.github/agents/tdd-green.agent.md +60 -0
  232. package/resources/customizations/.github/agents/tdd-red.agent.md +66 -0
  233. package/resources/customizations/.github/agents/tdd-refactor.agent.md +94 -0
  234. package/resources/customizations/.github/agents/typescript-engineer.agent.md +167 -0
  235. package/resources/customizations/.github/agents/voidbeast-gpt41enhanced.agent.md +230 -0
  236. package/resources/customizations/.github/codex/execute-hard-lock.prompt.md +105 -0
  237. package/resources/customizations/.github/codex/resume-hard-lock.prompt.md +92 -0
  238. package/resources/customizations/.github/copilot-instructions.md +7 -0
  239. package/resources/customizations/.github/instructions/csharp-code-change.instructions.md +184 -0
  240. package/resources/customizations/.github/instructions/csharp-unit-test.instructions.md +52 -0
  241. package/resources/customizations/.github/instructions/general-code-change.instructions.md +290 -0
  242. package/resources/customizations/.github/instructions/general-unit-test.instructions.md +106 -0
  243. package/resources/customizations/.github/instructions/github-actions-ci-cd-best-practices.instructions.md +607 -0
  244. package/resources/customizations/.github/instructions/github-actions.instructions.md +23 -0
  245. package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +81 -0
  246. package/resources/customizations/.github/instructions/powershell-unit-test.instructions.md +69 -0
  247. package/resources/customizations/.github/instructions/python-code-change.instructions.md +232 -0
  248. package/resources/customizations/.github/instructions/python-suppressions.instructions.md +609 -0
  249. package/resources/customizations/.github/instructions/python-unit-test.instructions.md +71 -0
  250. package/resources/customizations/.github/instructions/self-explanatory-code-commenting.instructions.md +238 -0
  251. package/resources/customizations/.github/instructions/tonality.instructions.md +133 -0
  252. package/resources/customizations/.github/instructions/typescript-code-change.instructions.md +203 -0
  253. package/resources/customizations/.github/instructions/typescript-suppressions.instructions.md +157 -0
  254. package/resources/customizations/.github/instructions/typescript-unit-test.instructions.md +112 -0
  255. package/resources/customizations/.github/prompts/add-educational-comments.prompt.md +129 -0
  256. package/resources/customizations/.github/prompts/breakdown-bug-prd.prompt.md +29 -0
  257. package/resources/customizations/.github/prompts/breakdown-epic-arch.prompt.md +66 -0
  258. package/resources/customizations/.github/prompts/breakdown-epic-pm.prompt.md +58 -0
  259. package/resources/customizations/.github/prompts/breakdown-feature-implementation.prompt.md +128 -0
  260. package/resources/customizations/.github/prompts/breakdown-feature-prd.prompt.md +61 -0
  261. package/resources/customizations/.github/prompts/code-exemplars-blueprint-generator.prompt.md +126 -0
  262. package/resources/customizations/.github/prompts/drafts/create-github-issues-feature-from-implementation-plan.prompt.md +28 -0
  263. package/resources/customizations/.github/prompts/drafts/create-implementation-plan.prompt.md +158 -0
  264. package/resources/customizations/.github/prompts/drafts/create-technical-spike.prompt.md +231 -0
  265. package/resources/customizations/.github/prompts/drafts/potential-feature-prd.prompt.md +19 -0
  266. package/resources/customizations/.github/prompts/drafts/update-implementation-plan.prompt.md +158 -0
  267. package/resources/customizations/.github/prompts/execute-plan-template.md +21 -0
  268. package/resources/customizations/.github/prompts/export-chat.prompt.md +7 -0
  269. package/resources/customizations/.github/prompts/fillout-prd-feature.prompt.md +46 -0
  270. package/resources/customizations/.github/prompts/generate-atomic-plan.prompt.md +96 -0
  271. package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +108 -0
  272. package/resources/customizations/.github/prompts/generate-pr.prompt.md +151 -0
  273. package/resources/customizations/.github/prompts/javascript-typescript-jest.prompt.md +44 -0
  274. package/resources/customizations/.github/prompts/orchestrate-csharp-work.prompt.md +66 -0
  275. package/resources/customizations/.github/prompts/orchestrate-powershell-work.prompt.md +50 -0
  276. package/resources/customizations/.github/prompts/orchestrate-python-work.prompt.md +50 -0
  277. package/resources/customizations/.github/prompts/orchestrate-work.prompt.md +66 -0
  278. package/resources/customizations/.github/prompts/remediate-comments.prompt.md +53 -0
  279. package/resources/customizations/.github/prompts/research-issue.prompt.md +125 -0
  280. package/resources/customizations/.github/prompts/review-epic.prompt.md +94 -0
  281. package/resources/customizations/.github/prompts/review-feature.prompt.md +130 -0
  282. package/resources/customizations/.github/prompts/review-staged.prompt.md +43 -0
  283. package/resources/customizations/.github/prompts/update_status.prompt.md +68 -0
  284. package/resources/customizations/.github/skills/README.md +26 -0
  285. package/resources/customizations/.github/skills/acceptance-criteria-tracking/SKILL.md +102 -0
  286. package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +174 -0
  287. package/resources/customizations/.github/skills/csharp-change-budget-router/SKILL.md +48 -0
  288. package/resources/customizations/.github/skills/csharp-orchestration-state-machine/SKILL.md +57 -0
  289. package/resources/customizations/.github/skills/evidence-and-timestamp-conventions/SKILL.md +135 -0
  290. package/resources/customizations/.github/skills/feature-promotion-lifecycle/SKILL.md +121 -0
  291. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +153 -0
  292. package/resources/customizations/.github/skills/make-skill-template/SKILL.md +147 -0
  293. package/resources/customizations/.github/skills/policy-audit-template-usage/SKILL.md +48 -0
  294. package/resources/customizations/.github/skills/policy-compliance-order/SKILL.md +37 -0
  295. package/resources/customizations/.github/skills/powershell-change-budget-router/SKILL.md +48 -0
  296. package/resources/customizations/.github/skills/powershell-orchestration-state-machine/SKILL.md +57 -0
  297. package/resources/customizations/.github/skills/pr-base-branch-merge-base/SKILL.md +55 -0
  298. package/resources/customizations/.github/skills/pr-context-artifacts/SKILL.md +29 -0
  299. package/resources/customizations/.github/skills/remediation-handoff-atomic-planner/SKILL.md +39 -0
  300. package/resources/customizations/.github/skills/skill-canonical-location-audit/SKILL.md +48 -0
  301. package/resources/feature-templates/bug/plan.yyyy-MM-ddTHH-mm.md +44 -0
  302. package/resources/feature-templates/bug/potential_bug.md +59 -0
  303. package/resources/feature-templates/bug/spec.md +99 -0
  304. package/resources/feature-templates/epic/initiative.md +43 -0
  305. package/resources/feature-templates/feature/plan.yyyy-MM-ddTHH-mm.md +53 -0
  306. package/resources/feature-templates/feature/spec.md +66 -0
  307. package/resources/feature-templates/feature/user-story.md +42 -0
  308. package/resources/feature-templates/potential/template.md +33 -0
  309. package/resources/feature-templates/refactor/plan.yyyy-MM-ddTHH-mm.md +52 -0
  310. package/resources/feature-templates/refactor/spec.md +69 -0
  311. package/resources/powershell/PoshQC/PoshQC.Analyzer.psm1 +254 -0
  312. package/resources/powershell/PoshQC/PoshQC.FileDiscovery.psm1 +138 -0
  313. package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +409 -0
  314. package/resources/powershell/PoshQC/PoshQC.psd1 +31 -0
  315. package/resources/powershell/PoshQC/PoshQC.psm1 +101 -0
  316. package/resources/powershell/PoshQC/README.md +80 -0
  317. package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +59 -0
  318. package/resources/powershell/PoshQC/settings/pssa.settings.psd1 +55 -0
  319. package/resources/scripts/dev_tools/__init__.py +0 -0
  320. package/resources/scripts/dev_tools/agentic_sync.py +819 -0
  321. package/resources/scripts/dev_tools/codex_native_converter/__init__.py +11 -0
  322. package/resources/scripts/dev_tools/codex_native_converter/__main__.py +6 -0
  323. package/resources/scripts/dev_tools/codex_native_converter/cli.py +11 -0
  324. package/resources/scripts/dev_tools/new_active_feature_folder.py +79 -0
  325. package/resources/scripts/dev_tools/new_active_feature_folder_docs.py +268 -0
  326. package/resources/scripts/dev_tools/new_active_feature_folder_flow.py +366 -0
  327. package/resources/scripts/dev_tools/new_active_feature_folder_io.py +306 -0
  328. package/resources/scripts/dev_tools/new_active_feature_folder_markdown.py +252 -0
  329. package/resources/scripts/dev_tools/new_active_feature_folder_models.py +136 -0
  330. package/resources/scripts/dev_tools/new_potential_bug_entry.py +465 -0
  331. package/resources/scripts/dev_tools/potential_to_issue.py +421 -0
  332. package/resources/scripts/dev_tools/potential_to_issue_content.py +212 -0
  333. package/resources/scripts/dev_tools/pr_context/__init__.py +0 -0
  334. package/resources/scripts/dev_tools/pr_context/collector.py +619 -0
  335. package/resources/scripts/dev_tools/pr_context/feature_docs.py +349 -0
  336. package/resources/scripts/dev_tools/pr_context/git.py +153 -0
  337. package/resources/scripts/dev_tools/pr_context/github.py +549 -0
  338. package/resources/scripts/dev_tools/pr_context/models.py +198 -0
  339. package/resources/scripts/dev_tools/pr_context/render.py +342 -0
  340. package/resources/scripts/dev_tools/pr_context/render_feature_excerpts.py +256 -0
  341. package/resources/scripts/dev_tools/pr_context/render_pr_helpers.py +291 -0
  342. package/resources/scripts/dev_tools/pr_context/summary_helpers.py +386 -0
  343. package/resources/scripts/dev_tools/pr_context/verification_evidence.py +171 -0
  344. package/resources/scripts/dev_tools/prompt_mode_contract.py +152 -0
  345. package/resources/scripts/dev_tools/push_down_claude_customizations.py +188 -0
  346. package/resources/scripts/dev_tools/push_down_codex_and_agents_customizations.py +139 -0
  347. package/resources/scripts/dev_tools/push_down_copilot_customizations.py +504 -0
  348. package/resources/scripts/dev_tools/push_down_copilot_customizations_filesystem.py +217 -0
  349. package/resources/scripts/dev_tools/push_down_copilot_customizations_rewrites.py +293 -0
  350. package/resources/scripts/dev_tools/resolve_file_prompt.py +457 -0
  351. package/resources/scripts/dev_tools/resolve_hard_lock_prompt.py +444 -0
  352. package/resources/scripts/dev_tools/validate_orchestration_artifacts.py +554 -0
  353. package/resources/templates/codex_native_converter.py +35 -0
  354. package/resources/templates/collect_commit_context.py +212 -0
  355. package/resources/templates/collect_pr_context.py +74 -0
  356. package/resources/templates/hello_pwsh.ps1 +3 -0
  357. package/resources/templates/hello_python.py +11 -0
  358. package/resources/templates/link-parent-child.ps1 +480 -0
  359. package/resources/templates/new-claude-worktree-session.ps1 +232 -0
  360. package/resources/templates/new-potential-entry.ps1 +187 -0
  361. package/resources/templates/new_active_feature_folder.py +67 -0
  362. package/resources/templates/new_potential_bug_entry.py +54 -0
  363. package/resources/templates/policy_audit/AGENTS.md +117 -0
  364. package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +165 -0
  365. package/resources/templates/policy_audit/feature-audit.yyyy-MM-ddTHH-mm.md +124 -0
  366. package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +649 -0
  367. package/resources/templates/potential_to_issue.py +55 -0
  368. package/resources/templates/push_down_claude_customizations.py +188 -0
  369. package/resources/templates/push_down_codex_and_agents_customizations.py +95 -0
  370. package/resources/templates/push_down_copilot_customizations.py +124 -0
  371. package/resources/templates/resolve_atomic_plan_prompt.py +75 -0
  372. package/resources/templates/resolve_hard_lock_prompt.py +65 -0
  373. package/resources/templates/run-poshqc-analyze-autofix.ps1 +16 -0
  374. package/resources/templates/run-poshqc-analyze.ps1 +26 -0
  375. package/resources/templates/run-poshqc-format.ps1 +26 -0
  376. package/resources/templates/run-poshqc-suite.ps1 +24 -0
  377. package/resources/templates/run-poshqc-test.ps1 +32 -0
  378. package/resources/templates/sync-agents-from-instructions.ps1 +400 -0
  379. package/resources/templates/validate_orchestration_artifacts.py +55 -0
  380. package/resources/templates/vscode-cli.helpers.ps1 +63 -0
@@ -0,0 +1,389 @@
1
+ <#
2
+ .SYNOPSIS
3
+ SubagentStop hook that validates feature-review artifacts and coverage verdicts.
4
+
5
+ .DESCRIPTION
6
+ Runs when the feature-review subagent terminates. Validates that the final
7
+ output advertises the required review artifact paths, that those artifacts
8
+ exist in the canonical active-feature location, and that the policy audit
9
+ carries explicit PASS or FAIL coverage verdicts for each language with
10
+ changed files in the branch diff.
11
+
12
+ Required advertised output tokens:
13
+ - policy-audit-path
14
+ - code-review-path
15
+ - feature-audit-path
16
+
17
+ Optional advertised output token:
18
+ - remediation-inputs-path
19
+
20
+ Additional coverage rules:
21
+ - Enumerate languages that have changed files in artifacts/pr_context.summary.txt:
22
+ .ts / .tsx -> TypeScript
23
+ .py -> Python
24
+ .ps1 / .psm1 -> PowerShell
25
+ .cs -> CSharp
26
+ - For each changed language, the policy audit must contain a
27
+ coverage-scoped PASS or FAIL verdict.
28
+ - Scope-narrowing phrases on coverage rows are treated as failures.
29
+ - When repo-wide coverage is below 80 percent for an available artifact,
30
+ the policy audit must carry a FAIL verdict for that language.
31
+
32
+ .NOTES
33
+ Reads the hook payload from CLAUDE_HOOK_INPUT as JSON. Exits 0 to allow
34
+ termination; exits 1 with an error message to block.
35
+ #>
36
+ [CmdletBinding()]
37
+ param()
38
+
39
+ $ErrorActionPreference = 'Stop'
40
+
41
+ function Get-ArtifactFileContent {
42
+ [CmdletBinding()]
43
+ [OutputType([hashtable])]
44
+ param(
45
+ [Parameter(Mandatory = $true)]
46
+ [string] $Path
47
+ )
48
+
49
+ if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) {
50
+ return @{ Exists = $false; Text = $null; Lines = @() }
51
+ }
52
+
53
+ $text = Get-Content -LiteralPath $Path -Raw -ErrorAction Stop
54
+ $lines = Get-Content -LiteralPath $Path -ErrorAction Stop
55
+ if ($null -eq $lines) {
56
+ $lines = @()
57
+ }
58
+ elseif ($lines -isnot [array]) {
59
+ $lines = @($lines)
60
+ }
61
+
62
+ return @{ Exists = $true; Text = $text; Lines = $lines }
63
+ }
64
+
65
+ function Get-ReviewArtifactPathFromOutput {
66
+ [CmdletBinding()]
67
+ [OutputType([string])]
68
+ param(
69
+ [Parameter(Mandatory = $true)]
70
+ [string] $AgentOutput,
71
+
72
+ [Parameter(Mandatory = $true)]
73
+ [string] $Token
74
+ )
75
+
76
+ $escapedToken = [regex]::Escape($Token)
77
+ $pattern = "$escapedToken\s*[:=]\s*[""']?([^\s""'\)`]+)|\[$escapedToken\]\(([^)]+)\)"
78
+ $match = [regex]::Match(
79
+ $AgentOutput,
80
+ $pattern,
81
+ [System.Text.RegularExpressions.RegexOptions]::IgnoreCase
82
+ )
83
+ if (-not $match.Success) {
84
+ return $null
85
+ }
86
+
87
+ $value = if ($match.Groups[1].Success) { $match.Groups[1].Value } else { $match.Groups[2].Value }
88
+ $value = $value.Trim()
89
+ if ([string]::IsNullOrWhiteSpace($value)) {
90
+ return $null
91
+ }
92
+
93
+ return $value
94
+ }
95
+
96
+ function Get-ReviewArtifactInfo {
97
+ [CmdletBinding()]
98
+ [OutputType([hashtable])]
99
+ param(
100
+ [Parameter(Mandatory = $true)]
101
+ [string] $Path,
102
+
103
+ [Parameter(Mandatory = $true)]
104
+ [string] $Stem
105
+ )
106
+
107
+ $normalized = $Path -replace '\\', '/'
108
+ $pattern = "^docs/features/active/(?<Folder>.+)/$Stem\.(?<Timestamp>\d{4}-\d{2}-\d{2}T\d{2}-\d{2})\.md$"
109
+ $match = [regex]::Match($normalized, $pattern, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
110
+ if (-not $match.Success) {
111
+ return $null
112
+ }
113
+
114
+ return @{
115
+ Folder = $match.Groups['Folder'].Value
116
+ Timestamp = $match.Groups['Timestamp'].Value
117
+ Path = $normalized
118
+ }
119
+ }
120
+
121
+ function Get-ChangedLanguageSet {
122
+ [OutputType([System.Collections.Hashtable])]
123
+ param([string[]]$Lines)
124
+
125
+ $langs = [ordered]@{}
126
+ foreach ($line in $Lines) {
127
+ if ($line -notmatch '^\s*-\s+(\S+)\s+\(\+\d+/-\d+\)\s*$') { continue }
128
+ $path = $matches[1]
129
+ $ext = [IO.Path]::GetExtension($path).ToLowerInvariant()
130
+ switch -Regex ($ext) {
131
+ '^\.(ts|tsx)$' { $langs['TypeScript'] = $true }
132
+ '^\.py$' { $langs['Python'] = $true }
133
+ '^\.(ps1|psm1)$' { $langs['PowerShell'] = $true }
134
+ '^\.cs$' { $langs['CSharp'] = $true }
135
+ }
136
+ }
137
+ return $langs
138
+ }
139
+
140
+ function Get-LcovRepoCoverage {
141
+ [OutputType([Nullable[double]])]
142
+ param([string]$Path)
143
+
144
+ $file = Get-ArtifactFileContent -Path $Path
145
+ if (-not $file.Exists) { return $null }
146
+
147
+ $totalFound = 0
148
+ $totalHit = 0
149
+ foreach ($line in $file.Lines) {
150
+ if ($line.StartsWith('LF:')) {
151
+ $totalFound += [int]($line.Substring(3))
152
+ }
153
+ elseif ($line.StartsWith('LH:')) {
154
+ $totalHit += [int]($line.Substring(3))
155
+ }
156
+ }
157
+ if ($totalFound -le 0) { return $null }
158
+ return [math]::Round(($totalHit * 100.0) / $totalFound, 2)
159
+ }
160
+
161
+ function Get-JacocoRepoCoverage {
162
+ [OutputType([Nullable[double]])]
163
+ param([string]$Path)
164
+
165
+ $file = Get-ArtifactFileContent -Path $Path
166
+ if (-not $file.Exists) { return $null }
167
+
168
+ [xml]$doc = $file.Text
169
+ $counters = $doc.SelectNodes('//counter[@type="LINE"]')
170
+ if (-not $counters -or $counters.Count -eq 0) { return $null }
171
+
172
+ $missed = 0
173
+ $covered = 0
174
+ foreach ($counter in $counters) {
175
+ $missed += [int]$counter.missed
176
+ $covered += [int]$counter.covered
177
+ }
178
+ $total = $missed + $covered
179
+ if ($total -le 0) { return $null }
180
+ return [math]::Round(($covered * 100.0) / $total, 2)
181
+ }
182
+
183
+ function Get-LanguageRepoCoverage {
184
+ [OutputType([Nullable[double]])]
185
+ param(
186
+ [string]$Language
187
+ )
188
+
189
+ switch ($Language) {
190
+ 'TypeScript' { return Get-LcovRepoCoverage -Path 'coverage/lcov.info' }
191
+ 'Python' { return Get-LcovRepoCoverage -Path 'artifacts/python/lcov.info' }
192
+ 'PowerShell' { return Get-JacocoRepoCoverage -Path 'artifacts/pester/powershell-coverage.xml' }
193
+ 'CSharp' { return Get-JacocoRepoCoverage -Path 'artifacts/csharp/coverage.xml' }
194
+ }
195
+ return $null
196
+ }
197
+
198
+ function Test-LanguageCoverageRow {
199
+ [OutputType([System.Collections.Hashtable])]
200
+ param(
201
+ [string]$AuditText,
202
+ [string]$Language,
203
+ [Nullable[double]]$RepoWidePct
204
+ )
205
+
206
+ $languageLabelMap = @{
207
+ 'TypeScript' = @('TypeScript', 'typescript')
208
+ 'Python' = @('Python', 'python', 'pytest')
209
+ 'PowerShell' = @('PowerShell', 'powershell', 'pester')
210
+ 'CSharp' = @('C#', 'CSharp', 'csharp', '\.NET', 'dotnet')
211
+ }
212
+
213
+ $labels = $languageLabelMap[$Language]
214
+ $labelPattern = '(?i)(' + (($labels | ForEach-Object { [regex]::Escape($_) }) -join '|') + ')'
215
+
216
+ $lines = $AuditText -split "`r?`n"
217
+ $languageLines = $lines | Where-Object { $_ -match $labelPattern }
218
+
219
+ if (-not $languageLines -or $languageLines.Count -eq 0) {
220
+ return @{
221
+ Ok = $false
222
+ Reason = "$Language has changed files on the branch but the policy-audit does not mention $Language."
223
+ }
224
+ }
225
+
226
+ $coverageLines = $languageLines | Where-Object { $_ -match '(?i)(coverage|lcov|line[s]?\s+hit|pester)' }
227
+ if (-not $coverageLines -or $coverageLines.Count -eq 0) {
228
+ return @{
229
+ Ok = $false
230
+ Reason = "$Language has changed files on the branch but no coverage-scoped row in the policy-audit mentions $Language."
231
+ }
232
+ }
233
+
234
+ $narrowingPattern = '(?i)(informational only|context only|out of plan scope|out of scope|not applicable|\bN/A\b|\bUNVERIFIED\b)'
235
+ $narrowing = $coverageLines | Where-Object { $_ -match $narrowingPattern }
236
+ if ($narrowing -and $narrowing.Count -gt 0) {
237
+ $first = ($narrowing | Select-Object -First 1).ToString().Trim()
238
+ return @{
239
+ Ok = $false
240
+ Reason = "$Language has changed files on the branch but a coverage-scoped row narrows scope: '$first'. Scope narrowing is not permitted for languages with changed files."
241
+ }
242
+ }
243
+
244
+ $verdictLines = $coverageLines | Where-Object { $_ -match '\b(PASS|FAIL)\b' }
245
+ if (-not $verdictLines -or $verdictLines.Count -eq 0) {
246
+ return @{
247
+ Ok = $false
248
+ Reason = "$Language coverage rows contain neither a PASS nor a FAIL verdict."
249
+ }
250
+ }
251
+
252
+ if ($null -ne $RepoWidePct -and $RepoWidePct -lt 80.0) {
253
+ $failLines = $coverageLines | Where-Object { $_ -match '\bFAIL\b' }
254
+ if (-not $failLines -or $failLines.Count -eq 0) {
255
+ return @{
256
+ Ok = $false
257
+ Reason = ("{0} repo-wide coverage is {1}% (below the 80% floor) but the policy-audit contains no FAIL verdict on a coverage row for {0}." -f $Language, $RepoWidePct)
258
+ }
259
+ }
260
+ }
261
+
262
+ return @{ Ok = $true; Reason = $null }
263
+ }
264
+
265
+ function Invoke-FeatureReviewCoverageValidation {
266
+ [CmdletBinding()]
267
+ [OutputType([hashtable])]
268
+ param(
269
+ [string] $RawPayload
270
+ )
271
+
272
+ if ([string]::IsNullOrWhiteSpace($RawPayload)) {
273
+ return @{ Ok = $false; Message = 'feature-review hook: CLAUDE_HOOK_INPUT is empty; cannot validate review output.' }
274
+ }
275
+
276
+ try {
277
+ $payload = $RawPayload | ConvertFrom-Json -ErrorAction Stop
278
+ }
279
+ catch {
280
+ return @{ Ok = $false; Message = "feature-review hook: failed to parse CLAUDE_HOOK_INPUT as JSON: $($_.Exception.Message)" }
281
+ }
282
+
283
+ $agentOutput = $null
284
+ if ($payload.PSObject.Properties.Name -contains 'output') {
285
+ $agentOutput = $payload.output
286
+ }
287
+ if ([string]::IsNullOrWhiteSpace($agentOutput)) {
288
+ return @{ Ok = $false; Message = 'feature-review hook: agent output is empty; feature-review must report required artifact paths before termination.' }
289
+ }
290
+
291
+ $requiredArtifacts = @(
292
+ @{ Token = 'policy-audit-path'; Stem = 'policy-audit'; Description = 'policy audit artifact' },
293
+ @{ Token = 'code-review-path'; Stem = 'code-review'; Description = 'code review artifact' },
294
+ @{ Token = 'feature-audit-path'; Stem = 'feature-audit'; Description = 'feature audit artifact' }
295
+ )
296
+
297
+ $artifactMeta = @{}
298
+ $errors = [System.Collections.Generic.List[string]]::new()
299
+
300
+ foreach ($artifact in $requiredArtifacts) {
301
+ $path = Get-ReviewArtifactPathFromOutput -AgentOutput $agentOutput -Token $artifact.Token
302
+ if ($null -eq $path) {
303
+ $errors.Add("missing $($artifact.Token): <path> for the required $($artifact.Description)")
304
+ continue
305
+ }
306
+
307
+ $metadata = Get-ReviewArtifactInfo -Path $path -Stem $artifact.Stem
308
+ if ($null -eq $metadata) {
309
+ $errors.Add("$($artifact.Token) '$path' is outside the required docs/features/active/.../$($artifact.Stem).<timestamp>.md location")
310
+ continue
311
+ }
312
+
313
+ $file = Get-ArtifactFileContent -Path $path
314
+ if (-not $file.Exists) {
315
+ $errors.Add("$($artifact.Token) '$path' was advertised for the $($artifact.Description) but no file exists at that location")
316
+ continue
317
+ }
318
+
319
+ $metadata['Text'] = $file.Text
320
+ $artifactMeta[$artifact.Stem] = $metadata
321
+ }
322
+
323
+ if ($artifactMeta.ContainsKey('policy-audit')) {
324
+ $reference = $artifactMeta['policy-audit']
325
+ foreach ($stem in @('code-review', 'feature-audit')) {
326
+ if (-not $artifactMeta.ContainsKey($stem)) {
327
+ continue
328
+ }
329
+ $candidate = $artifactMeta[$stem]
330
+ if ($candidate.Folder -ne $reference.Folder -or $candidate.Timestamp -ne $reference.Timestamp) {
331
+ $errors.Add("$stem artifact must share the same feature folder and timestamp as the policy audit artifact.")
332
+ }
333
+ }
334
+
335
+ $remediationPath = Get-ReviewArtifactPathFromOutput -AgentOutput $agentOutput -Token 'remediation-inputs-path'
336
+ if ($null -ne $remediationPath) {
337
+ $remediation = Get-ReviewArtifactInfo -Path $remediationPath -Stem 'remediation-inputs'
338
+ if ($null -eq $remediation) {
339
+ $errors.Add("remediation-inputs-path '$remediationPath' is outside the required docs/features/active/.../remediation-inputs.<timestamp>.md location")
340
+ }
341
+ elseif ($remediation.Folder -ne $reference.Folder -or $remediation.Timestamp -ne $reference.Timestamp) {
342
+ $errors.Add('remediation-inputs artifact must share the same feature folder and timestamp as the policy audit artifact.')
343
+ }
344
+ elseif (-not (Get-ArtifactFileContent -Path $remediationPath).Exists) {
345
+ $errors.Add("remediation-inputs-path '$remediationPath' was advertised but no file exists at that location")
346
+ }
347
+ }
348
+ }
349
+
350
+ if ($errors.Count -gt 0) {
351
+ $message = "feature-review hook: required review artifact validation failed:`n - " + ($errors -join "`n - ")
352
+ return @{ Ok = $false; Message = $message }
353
+ }
354
+
355
+ $prSummary = Get-ArtifactFileContent -Path 'artifacts/pr_context.summary.txt'
356
+ $changedLanguages = if ($prSummary.Exists) { Get-ChangedLanguageSet -Lines $prSummary.Lines } else { [ordered]@{} }
357
+ if ($changedLanguages.Count -eq 0) {
358
+ return @{ Ok = $true; Message = $null }
359
+ }
360
+
361
+ $policyAuditText = $artifactMeta['policy-audit'].Text
362
+ $coverageFailures = [System.Collections.Generic.List[string]]::new()
363
+ foreach ($lang in $changedLanguages.Keys) {
364
+ $repoPct = Get-LanguageRepoCoverage -Language $lang
365
+ $result = Test-LanguageCoverageRow -AuditText $policyAuditText -Language $lang -RepoWidePct $repoPct
366
+ if (-not $result.Ok) {
367
+ $coverageFailures.Add($result.Reason)
368
+ }
369
+ }
370
+
371
+ if ($coverageFailures.Count -gt 0) {
372
+ $message = "feature-review hook: coverage validation failed against branch diff:`n - " + ($coverageFailures -join "`n - ")
373
+ return @{ Ok = $false; Message = $message }
374
+ }
375
+
376
+ return @{ Ok = $true; Message = $null }
377
+ }
378
+
379
+ if ($MyInvocation.InvocationName -eq '.') {
380
+ return
381
+ }
382
+
383
+ $result = Invoke-FeatureReviewCoverageValidation -RawPayload $env:CLAUDE_HOOK_INPUT
384
+ if (-not $result.Ok) {
385
+ Write-Error $result.Message
386
+ exit 1
387
+ }
388
+
389
+ exit 0
@@ -0,0 +1,141 @@
1
+ <#
2
+ .SYNOPSIS
3
+ SubagentStop hook for the orchestrator subagent.
4
+
5
+ .DESCRIPTION
6
+ Blocks termination of the orchestrator subagent unless the orchestration
7
+ checkpoint file at artifacts/orchestration/orchestrator-state.json has been
8
+ updated with current `completed_steps` and `next_step` fields.
9
+
10
+ Per the powershell-orchestration-state-machine and atomic-plan-contract
11
+ skills, the orchestrator must persist progress to the checkpoint file
12
+ after every completed step. This hook confirms that:
13
+
14
+ - the hook payload is well-formed JSON,
15
+ - the orchestrator's final output is non-empty,
16
+ - the checkpoint file exists on disk,
17
+ - the checkpoint is valid JSON,
18
+ - the checkpoint contains the required progress fields:
19
+ objective, completed_steps, next_step, last_updated,
20
+ - the `objective` field is non-empty.
21
+
22
+ .NOTES
23
+ Reads the hook payload from CLAUDE_HOOK_INPUT as JSON. Exits 0 to allow
24
+ termination; exits 1 with an error message to block. Filesystem reads go
25
+ through Get-CheckpointFileContent so tests can mock the boundary without
26
+ writing temporary files.
27
+ #>
28
+
29
+ [CmdletBinding()]
30
+ param()
31
+
32
+ Set-StrictMode -Version Latest
33
+ $ErrorActionPreference = 'Stop'
34
+
35
+ function Get-CheckpointFileContent {
36
+ <#
37
+ .SYNOPSIS
38
+ Thin wrapper around the filesystem-read boundary for the checkpoint.
39
+ .DESCRIPTION
40
+ Returns a hashtable with two keys:
41
+ - Exists: $true when the path resolves to a file on disk.
42
+ - Content: full file text as a single string ($null when missing).
43
+ Tests mock this function to inject checkpoint content without temp files.
44
+ #>
45
+ [CmdletBinding()]
46
+ [OutputType([hashtable])]
47
+ param(
48
+ [Parameter(Mandatory = $true)]
49
+ [string] $Path
50
+ )
51
+
52
+ if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) {
53
+ return @{ Exists = $false; Content = $null }
54
+ }
55
+
56
+ $content = Get-Content -LiteralPath $Path -Raw -ErrorAction Stop
57
+ return @{ Exists = $true; Content = $content }
58
+ }
59
+
60
+ function Invoke-OrchestratorOutputValidation {
61
+ <#
62
+ .SYNOPSIS
63
+ Parses the hook payload and returns an ok-or-block decision.
64
+ .DESCRIPTION
65
+ Returns a hashtable with keys:
66
+ - Ok: $true to allow termination, $false to block.
67
+ - Message: error message when blocking; $null on success.
68
+ #>
69
+ [CmdletBinding()]
70
+ [OutputType([hashtable])]
71
+ param(
72
+ [string] $RawPayload,
73
+ [string] $CheckpointPath = 'artifacts/orchestration/orchestrator-state.json'
74
+ )
75
+
76
+ if ([string]::IsNullOrWhiteSpace($RawPayload)) {
77
+ return @{ Ok = $false; Message = 'orchestrator hook: CLAUDE_HOOK_INPUT is empty; cannot validate orchestrator output.' }
78
+ }
79
+
80
+ try {
81
+ $payload = $RawPayload | ConvertFrom-Json -ErrorAction Stop
82
+ } catch {
83
+ return @{ Ok = $false; Message = "orchestrator hook: failed to parse CLAUDE_HOOK_INPUT as JSON: $($_.Exception.Message)" }
84
+ }
85
+
86
+ $agentOutput = $null
87
+ if ($payload.PSObject.Properties.Name -contains 'output') {
88
+ $agentOutput = $payload.output
89
+ }
90
+ if ([string]::IsNullOrWhiteSpace($agentOutput)) {
91
+ return @{ Ok = $false; Message = 'orchestrator hook: agent output is empty; orchestrator must report final completion summary before termination.' }
92
+ }
93
+
94
+ $file = Get-CheckpointFileContent -Path $CheckpointPath
95
+ if (-not $file.Exists) {
96
+ return @{ Ok = $false; Message = "orchestrator hook: checkpoint file '$CheckpointPath' does not exist. Orchestrator must persist progress per powershell-orchestration-state-machine before termination." }
97
+ }
98
+
99
+ if ([string]::IsNullOrWhiteSpace($file.Content)) {
100
+ return @{ Ok = $false; Message = "orchestrator hook: checkpoint file '$CheckpointPath' is empty; cannot validate orchestrator progress." }
101
+ }
102
+
103
+ try {
104
+ $checkpoint = $file.Content | ConvertFrom-Json -ErrorAction Stop
105
+ } catch {
106
+ return @{ Ok = $false; Message = "orchestrator hook: checkpoint file '$CheckpointPath' is not valid JSON: $($_.Exception.Message)" }
107
+ }
108
+
109
+ $requiredFields = @('objective', 'completed_steps', 'next_step', 'last_updated')
110
+ $missingFields = New-Object System.Collections.Generic.List[string]
111
+ $checkpointProps = @($checkpoint.PSObject.Properties.Name)
112
+ foreach ($field in $requiredFields) {
113
+ if ($checkpointProps -notcontains $field) {
114
+ $missingFields.Add($field)
115
+ }
116
+ }
117
+
118
+ if ($missingFields.Count -gt 0) {
119
+ $missingList = ($missingFields -join ', ')
120
+ return @{ Ok = $false; Message = "orchestrator hook: checkpoint file '$CheckpointPath' is missing required field(s): $missingList. Orchestrator must persist objective, completed_steps, next_step, and last_updated." }
121
+ }
122
+
123
+ if ([string]::IsNullOrWhiteSpace([string]$checkpoint.objective)) {
124
+ return @{ Ok = $false; Message = "orchestrator hook: checkpoint file '$CheckpointPath' has an empty 'objective' field; orchestrator must record the active objective." }
125
+ }
126
+
127
+ return @{ Ok = $true; Message = $null }
128
+ }
129
+
130
+ # Guard allows dot-sourcing in tests without executing the entrypoint.
131
+ if ($MyInvocation.InvocationName -eq '.') {
132
+ return
133
+ }
134
+
135
+ $result = Invoke-OrchestratorOutputValidation -RawPayload $env:CLAUDE_HOOK_INPUT
136
+ if (-not $result.Ok) {
137
+ Write-Error $result.Message
138
+ exit 1
139
+ }
140
+
141
+ exit 0