@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,235 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Pre-tool-use hook that enforces the Python per-batch change budget.
4
+
5
+ .DESCRIPTION
6
+ This script is invoked by the Claude Code PreToolUse hook before any Write or Edit
7
+ operation. When the target file is a Python file, it classifies the file as either
8
+ production or test and checks the running count against the per-batch cap:
9
+ - 3 production .py files per batch
10
+ - 3 test .py files per batch
11
+
12
+ A "batch" is scoped to the current Claude Code session. The running count is
13
+ persisted under .claude/state/python-batch-budget.<session_id>.json. Only distinct
14
+ file paths are counted; repeated edits to the same file consume one slot.
15
+
16
+ Test files are those matching:
17
+ - tests/**/*.py
18
+ - test_*.py
19
+
20
+ All other .py files are treated as production files. Non-Python paths pass through.
21
+
22
+ The cap may be overridden per session by setting the environment variable
23
+ CLAUDE_PYTHON_BUDGET_PROD or CLAUDE_PYTHON_BUDGET_TEST to a positive integer before
24
+ the session starts, or by writing {"prodCap": N, "testCap": M} into the state file.
25
+
26
+ When the cap would be exceeded by a new file, the script emits a JSON response with
27
+ 'decision': 'block' and exits 0. The session must explicitly reset the counter by
28
+ deleting the state file before starting a new batch. Files already counted are
29
+ always allowed through.
30
+
31
+ .NOTES
32
+ Compatible with PowerShell 7+.
33
+ #>
34
+ [CmdletBinding()]
35
+ param()
36
+
37
+ function Get-PythonBatchBudgetState {
38
+ [CmdletBinding()]
39
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
40
+ param(
41
+ [Parameter(Mandatory)]
42
+ [int] $ProdCap,
43
+
44
+ [Parameter(Mandatory)]
45
+ [int] $TestCap
46
+ )
47
+
48
+ [ordered]@{
49
+ prodCap = $ProdCap
50
+ testCap = $TestCap
51
+ prodFiles = @()
52
+ testFiles = @()
53
+ }
54
+ }
55
+
56
+ function ConvertTo-PythonBatchBudgetState {
57
+ [CmdletBinding()]
58
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
59
+ param(
60
+ [Parameter(Mandatory)]
61
+ $InputObject,
62
+
63
+ [Parameter(Mandatory)]
64
+ [int] $ProdCap,
65
+
66
+ [Parameter(Mandatory)]
67
+ [int] $TestCap
68
+ )
69
+
70
+ $state = Get-PythonBatchBudgetState -ProdCap $ProdCap -TestCap $TestCap
71
+ if ($null -ne $InputObject.prodCap) { $state.prodCap = [int]$InputObject.prodCap }
72
+ if ($null -ne $InputObject.testCap) { $state.testCap = [int]$InputObject.testCap }
73
+ if ($null -ne $InputObject.prodFiles) { $state.prodFiles = @($InputObject.prodFiles) }
74
+ if ($null -ne $InputObject.testFiles) { $state.testFiles = @($InputObject.testFiles) }
75
+
76
+ return $state
77
+ }
78
+
79
+ function Get-PythonBatchBudgetBlockDecision {
80
+ [CmdletBinding()]
81
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
82
+ param(
83
+ [Parameter(Mandatory)]
84
+ [string] $Reason,
85
+
86
+ [System.Collections.IDictionary] $State
87
+ )
88
+
89
+ $decision = [ordered]@{
90
+ decision = 'block'
91
+ reason = $Reason
92
+ }
93
+ if ($State) {
94
+ $decision.state = $State
95
+ }
96
+
97
+ return $decision
98
+ }
99
+
100
+ function Invoke-PythonBatchBudgetDecision {
101
+ [CmdletBinding()]
102
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
103
+ param(
104
+ [Parameter(Mandatory)]
105
+ [string] $FilePath,
106
+
107
+ [Parameter(Mandatory)]
108
+ [System.Collections.IDictionary] $State,
109
+
110
+ [Parameter(Mandatory)]
111
+ [string] $StateFile
112
+ )
113
+
114
+ $normalized = $FilePath -replace '\\', '/'
115
+ if ($normalized -notmatch '\.py$') {
116
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $false }
117
+ }
118
+
119
+ $isTestFile = ($normalized -match '(^|/)tests/.*\.py$') -or ($normalized -match '(^|/)test_[^/]+\.py$')
120
+ $targetList = if ($isTestFile) { @($State.testFiles) } else { @($State.prodFiles) }
121
+ $cap = if ($isTestFile) { [int]$State.testCap } else { [int]$State.prodCap }
122
+ $kind = if ($isTestFile) { 'test' } else { 'production' }
123
+
124
+ if ($targetList -contains $normalized) {
125
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $false }
126
+ }
127
+
128
+ if ($targetList.Count -ge $cap) {
129
+ $currentFiles = ($targetList -join ', ')
130
+ $kindUpper = $kind.ToUpperInvariant()
131
+ $reason = "Python per-batch budget exceeded: $kind file cap is $cap and is already full ($currentFiles). Requested new file: $normalized. Split the work into a new batch, raise the cap via CLAUDE_PYTHON_BUDGET_$kindUpper environment variable with approved scope, or reset the batch by deleting $StateFile."
132
+ return Get-PythonBatchBudgetBlockDecision -Reason $reason -State $State
133
+ }
134
+
135
+ if ($isTestFile) {
136
+ $State.testFiles = @($State.testFiles) + @($normalized)
137
+ } else {
138
+ $State.prodFiles = @($State.prodFiles) + @($normalized)
139
+ }
140
+
141
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $true }
142
+ }
143
+
144
+ function Invoke-PythonBatchBudgetHook {
145
+ [CmdletBinding()]
146
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
147
+ param(
148
+ [string] $ToolInputRaw,
149
+ [string] $SessionId = 'default',
150
+ [string] $Root = (Get-Location).Path,
151
+ [int] $ProdCap = 3,
152
+ [int] $TestCap = 3,
153
+ [scriptblock] $TestPathExists = { param([string] $Path) Test-Path -Path $Path },
154
+ [scriptblock] $EnsureDirectory = { param([string] $Path) New-Item -ItemType Directory -Path $Path -Force | Out-Null },
155
+ [scriptblock] $ReadState = { param([string] $Path) Get-Content -Path $Path -Raw },
156
+ [scriptblock] $WriteState = {
157
+ param([string] $Path, [System.Collections.IDictionary] $State)
158
+ $State | ConvertTo-Json -Depth 5 | Set-Content -Path $Path -Encoding UTF8
159
+ }
160
+ )
161
+
162
+ if (-not $ToolInputRaw) {
163
+ return [ordered]@{ decision = 'allow' }
164
+ }
165
+
166
+ try {
167
+ $toolInput = $ToolInputRaw | ConvertFrom-Json -ErrorAction Stop
168
+ } catch {
169
+ return Get-PythonBatchBudgetBlockDecision -Reason 'Python batch-budget hook received malformed JSON in CLAUDE_TOOL_INPUT.'
170
+ }
171
+
172
+ $filePath = $toolInput.file_path
173
+ if (-not $filePath) {
174
+ return [ordered]@{ decision = 'allow' }
175
+ }
176
+
177
+ $normalized = $filePath -replace '\\', '/'
178
+ if ($normalized -notmatch '\.py$') {
179
+ return [ordered]@{ decision = 'allow' }
180
+ }
181
+
182
+ $stateDir = Join-Path -Path $Root -ChildPath '.claude/state'
183
+ if (-not (& $TestPathExists $stateDir)) {
184
+ & $EnsureDirectory $stateDir
185
+ }
186
+
187
+ $stateFile = Join-Path -Path $stateDir -ChildPath ("python-batch-budget.$SessionId.json")
188
+ $state = Get-PythonBatchBudgetState -ProdCap $ProdCap -TestCap $TestCap
189
+
190
+ if (& $TestPathExists $stateFile) {
191
+ try {
192
+ $loaded = & $ReadState $stateFile | ConvertFrom-Json -ErrorAction Stop
193
+ $state = ConvertTo-PythonBatchBudgetState -InputObject $loaded -ProdCap $ProdCap -TestCap $TestCap
194
+ } catch {
195
+ Write-Verbose "Ignoring unreadable Python batch-budget state file '$stateFile': $($_.Exception.Message)"
196
+ }
197
+ }
198
+
199
+ $decision = Invoke-PythonBatchBudgetDecision -FilePath $filePath -State $state -StateFile $stateFile
200
+ if ($decision.shouldWriteState) {
201
+ try {
202
+ & $WriteState $stateFile $decision.state
203
+ } catch {
204
+ Write-Verbose "Unable to write Python batch-budget state file '$stateFile': $($_.Exception.Message)"
205
+ }
206
+ }
207
+
208
+ return $decision
209
+ }
210
+
211
+ if ($MyInvocation.InvocationName -eq '.') {
212
+ return
213
+ }
214
+
215
+ $sessionId = $env:CLAUDE_SESSION_ID
216
+ if (-not $sessionId) {
217
+ $sessionId = 'default'
218
+ }
219
+
220
+ $prodCap = 3
221
+ $testCap = 3
222
+ if ($env:CLAUDE_PYTHON_BUDGET_PROD -match '^\d+$') {
223
+ $prodCap = [int]$env:CLAUDE_PYTHON_BUDGET_PROD
224
+ }
225
+ if ($env:CLAUDE_PYTHON_BUDGET_TEST -match '^\d+$') {
226
+ $testCap = [int]$env:CLAUDE_PYTHON_BUDGET_TEST
227
+ }
228
+
229
+ $decision = Invoke-PythonBatchBudgetHook -ToolInputRaw $env:CLAUDE_TOOL_INPUT -SessionId $sessionId -ProdCap $prodCap -TestCap $testCap
230
+ if ($decision.decision -eq 'block') {
231
+ $decision.Remove('state')
232
+ $decision | ConvertTo-Json -Compress | Write-Output
233
+ }
234
+
235
+ exit 0
@@ -0,0 +1,69 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Pre-tool-use hook for Claude Code that blocks dangerous Bash commands.
4
+
5
+ .DESCRIPTION
6
+ This script is invoked by the Claude Code PreToolUse hook before any Bash
7
+ command is executed. It reads the proposed command string from the
8
+ CLAUDE_TOOL_INPUT environment variable (JSON with a 'command' field) or
9
+ falls back to the first positional argument. If the command matches any
10
+ blocked pattern (destructive operations such as forced deletions, forced
11
+ pushes, or hard resets), the script exits with code 1 to prevent execution.
12
+ Safe commands exit with code 0.
13
+
14
+ .NOTES
15
+ Compatible with PowerShell 7+.
16
+ This script must not modify any state; it is a read-only validation gate.
17
+ #>
18
+ [CmdletBinding()]
19
+ param(
20
+ [Parameter(Position = 0, Mandatory = $false)]
21
+ [string]$CommandInput
22
+ )
23
+
24
+ # Blocked patterns that represent destructive or irreversible operations.
25
+ $blockedPatterns = @(
26
+ 'rm -rf',
27
+ 'git push --force',
28
+ 'git push origin --force',
29
+ 'Remove-Item -Recurse -Force',
30
+ 'git reset --hard',
31
+ 'git push -f'
32
+ )
33
+
34
+ # Resolve the command string from CLAUDE_TOOL_INPUT JSON or positional argument.
35
+ $commandToCheck = ''
36
+
37
+ if ($env:CLAUDE_TOOL_INPUT) {
38
+ try {
39
+ $parsed = $env:CLAUDE_TOOL_INPUT | ConvertFrom-Json
40
+ if ($parsed.command) {
41
+ $commandToCheck = $parsed.command
42
+ }
43
+ }
44
+ catch {
45
+ # If JSON parsing fails, treat the raw environment variable as the command.
46
+ $commandToCheck = $env:CLAUDE_TOOL_INPUT
47
+ }
48
+ }
49
+
50
+ # Fall back to positional argument when the environment variable is absent or empty.
51
+ if (-not $commandToCheck -and $CommandInput) {
52
+ $commandToCheck = $CommandInput
53
+ }
54
+
55
+ # When no command is provided, allow execution (nothing to validate).
56
+ if (-not $commandToCheck) {
57
+ exit 0
58
+ }
59
+
60
+ # Check the command against each blocked pattern.
61
+ foreach ($pattern in $blockedPatterns) {
62
+ if ($commandToCheck.Contains($pattern)) {
63
+ Write-Error "Blocked dangerous command pattern detected: '$pattern'"
64
+ exit 1
65
+ }
66
+ }
67
+
68
+ # Command passed all checks.
69
+ exit 0
@@ -0,0 +1,296 @@
1
+ <#
2
+ .SYNOPSIS
3
+ SubagentStop hook for the atomic-executor subagent.
4
+
5
+ .DESCRIPTION
6
+ Blocks termination of the atomic-executor subagent unless the output and
7
+ plan state satisfy the executor's mechanical contract.
8
+
9
+ Enforced checks:
10
+ - hook payload is valid JSON and contains non-empty output,
11
+ - output advertises `plan-path: <path>` (or supported equivalent forms),
12
+ - the advertised plan exists on disk,
13
+ - preflight-only runs return an exact preflight signal and may not claim
14
+ non-canonical blocked text,
15
+ - non-preflight runs may not stop in a blocked state,
16
+ - non-preflight plans contain checkboxes and all are checked,
17
+ - non-preflight output includes `AC Status Summary`,
18
+ - non-preflight output includes command/status reporting,
19
+ - for each language referenced by explicit file paths in the plan, the
20
+ output includes a PASS or FAIL status line for that language.
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. Plan file contents are
25
+ read through Get-PlanFileContent so tests can mock the filesystem boundary
26
+ without writing temporary files.
27
+ #>
28
+
29
+ [CmdletBinding()]
30
+ param()
31
+
32
+ Set-StrictMode -Version Latest
33
+ $ErrorActionPreference = 'Stop'
34
+
35
+ function Get-PlanFileContent {
36
+ [CmdletBinding()]
37
+ [OutputType([hashtable])]
38
+ param(
39
+ [Parameter(Mandatory = $true)]
40
+ [string] $Path
41
+ )
42
+
43
+ if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) {
44
+ return @{ Exists = $false; Lines = @() }
45
+ }
46
+
47
+ $lines = Get-Content -LiteralPath $Path -ErrorAction Stop
48
+ if ($null -eq $lines) {
49
+ $lines = @()
50
+ }
51
+ elseif ($lines -isnot [array]) {
52
+ $lines = @($lines)
53
+ }
54
+
55
+ return @{ Exists = $true; Lines = $lines }
56
+ }
57
+
58
+ function Get-PlanPathFromOutput {
59
+ [CmdletBinding()]
60
+ [OutputType([string])]
61
+ param(
62
+ [Parameter(Mandatory = $true)]
63
+ [string] $AgentOutput
64
+ )
65
+
66
+ $pattern = 'plan-path\s*[:=]\s*["'']?([^\s"''\)`]+)|\[plan-path\]\(([^)]+)\)'
67
+ $match = [regex]::Match($AgentOutput, $pattern, [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)
68
+ if (-not $match.Success) {
69
+ return $null
70
+ }
71
+
72
+ $value = if ($match.Groups[1].Success) { $match.Groups[1].Value } else { $match.Groups[2].Value }
73
+ $value = $value.Trim()
74
+ if ([string]::IsNullOrWhiteSpace($value)) {
75
+ return $null
76
+ }
77
+
78
+ return $value
79
+ }
80
+
81
+ function Test-IsPreflightPlan {
82
+ [CmdletBinding()]
83
+ [OutputType([bool])]
84
+ param(
85
+ [Parameter(Mandatory = $true)]
86
+ [string[]] $Lines
87
+ )
88
+
89
+ return @($Lines | Where-Object { $_ -match '(?i)^\s*DIRECTIVE:\s*PREFLIGHT VALIDATION ONLY\s*$' }).Count -gt 0
90
+ }
91
+
92
+ function Get-TouchedLanguagesFromPlan {
93
+ [CmdletBinding()]
94
+ [OutputType([string[]])]
95
+ param(
96
+ [Parameter(Mandatory = $true)]
97
+ [string[]] $Lines
98
+ )
99
+
100
+ $languages = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)
101
+ $pathPattern = '(?i)(?:[.\w*?-]+[\\/])+[.\w*?-]+'
102
+
103
+ foreach ($line in $Lines) {
104
+ foreach ($match in [regex]::Matches($line, $pathPattern)) {
105
+ $extension = [System.IO.Path]::GetExtension($match.Value).ToLowerInvariant()
106
+ switch -Regex ($extension) {
107
+ '^\.(ts|tsx)$' { $null = $languages.Add('TypeScript') }
108
+ '^\.py$' { $null = $languages.Add('Python') }
109
+ '^\.(ps1|psm1|psd1)$' { $null = $languages.Add('PowerShell') }
110
+ '^\.cs$' { $null = $languages.Add('CSharp') }
111
+ }
112
+ }
113
+ }
114
+
115
+ return [string[]]@($languages)
116
+ }
117
+
118
+ function Test-OutputHasLanguageStatus {
119
+ [CmdletBinding()]
120
+ [OutputType([bool])]
121
+ param(
122
+ [Parameter(Mandatory = $true)]
123
+ [string] $AgentOutput,
124
+
125
+ [Parameter(Mandatory = $true)]
126
+ [string] $Language
127
+ )
128
+
129
+ $labelMap = @{
130
+ 'TypeScript' = @('TypeScript', 'typescript')
131
+ 'Python' = @('Python', 'python')
132
+ 'PowerShell' = @('PowerShell', 'powershell')
133
+ 'CSharp' = @('C#', 'CSharp', 'csharp', '\.NET', 'dotnet')
134
+ }
135
+
136
+ $labels = $labelMap[$Language]
137
+ $labelPattern = '(?i)(' + (($labels | ForEach-Object { $_ }) -join '|') + ')'
138
+ return [regex]::IsMatch($AgentOutput, "(?im)^.*$labelPattern.*\b(PASS|FAIL)\b.*$")
139
+ }
140
+
141
+ function Test-HasPreflightSignal {
142
+ [CmdletBinding()]
143
+ [OutputType([bool])]
144
+ param(
145
+ [Parameter(Mandatory = $true)]
146
+ [string] $AgentOutput
147
+ )
148
+
149
+ return [regex]::IsMatch(
150
+ $AgentOutput,
151
+ '(?m)^\s*PREFLIGHT:\s*(ALL CLEAR|REVISIONS REQUIRED)\s*$'
152
+ )
153
+ }
154
+
155
+ function Test-HasCanonicalBlockedText {
156
+ [CmdletBinding()]
157
+ [OutputType([bool])]
158
+ param(
159
+ [Parameter(Mandatory = $true)]
160
+ [string] $AgentOutput
161
+ )
162
+
163
+ if ($AgentOutput -notmatch 'BLOCKED') {
164
+ return $true
165
+ }
166
+
167
+ if ($AgentOutput -notmatch 'BLOCKED at preflight \(before \[P0-T1\]\)') {
168
+ return $false
169
+ }
170
+
171
+ if ($AgentOutput -notmatch '(?i)plan delta' -and $AgentOutput -notmatch '\[P\d+-T\d+\]') {
172
+ return $false
173
+ }
174
+
175
+ return $true
176
+ }
177
+
178
+ function Invoke-ExecutorOutputValidation {
179
+ [CmdletBinding()]
180
+ [OutputType([hashtable])]
181
+ param(
182
+ [string] $RawPayload
183
+ )
184
+
185
+ if ([string]::IsNullOrWhiteSpace($RawPayload)) {
186
+ return @{ Ok = $false; Message = 'atomic-executor hook: CLAUDE_HOOK_INPUT is empty; cannot validate executor output.' }
187
+ }
188
+
189
+ try {
190
+ $payload = $RawPayload | ConvertFrom-Json -ErrorAction Stop
191
+ }
192
+ catch {
193
+ return @{ Ok = $false; Message = "atomic-executor hook: failed to parse CLAUDE_HOOK_INPUT as JSON: $($_.Exception.Message)" }
194
+ }
195
+
196
+ $agentOutput = $null
197
+ if ($payload.PSObject.Properties.Name -contains 'output') {
198
+ $agentOutput = $payload.output
199
+ }
200
+ if ([string]::IsNullOrWhiteSpace($agentOutput)) {
201
+ return @{ Ok = $false; Message = 'atomic-executor hook: agent output is empty; executor must return plan-path and final completion summary.' }
202
+ }
203
+
204
+ $planPath = Get-PlanPathFromOutput -AgentOutput $agentOutput
205
+ if ($null -eq $planPath) {
206
+ return @{ Ok = $false; Message = 'atomic-executor hook: agent output does not advertise a plan-path. Executor must report `plan-path: <path>` per atomic-plan-contract.' }
207
+ }
208
+
209
+ $file = Get-PlanFileContent -Path $planPath
210
+ if (-not $file.Exists) {
211
+ return @{ Ok = $false; Message = "atomic-executor hook: executor advertised plan-path '$planPath' but no file exists at that location." }
212
+ }
213
+
214
+ $isPreflight = Test-IsPreflightPlan -Lines $file.Lines
215
+ if ($isPreflight) {
216
+ if (-not (Test-HasCanonicalBlockedText -AgentOutput $agentOutput)) {
217
+ return @{ Ok = $false; Message = 'atomic-executor hook: blocked preflight output must include the exact text `BLOCKED at preflight (before [P0-T1])` plus a concrete plan delta.' }
218
+ }
219
+ if ($agentOutput -notmatch 'BLOCKED' -and -not (Test-HasPreflightSignal -AgentOutput $agentOutput)) {
220
+ return @{ Ok = $false; Message = 'atomic-executor hook: preflight output must include `PREFLIGHT: ALL CLEAR` or `PREFLIGHT: REVISIONS REQUIRED`.' }
221
+ }
222
+ return @{ Ok = $true; Message = $null }
223
+ }
224
+
225
+ if ($agentOutput -match 'BLOCKED') {
226
+ return @{ Ok = $false; Message = 'atomic-executor hook: blocking is permitted only during preflight validation (before [P0-T1]).' }
227
+ }
228
+
229
+ $checkboxLineCount = 0
230
+ $uncheckedLineNumbers = [System.Collections.Generic.List[int]]::new()
231
+ $uncheckedPattern = '^\s*-\s\[\s\]\s'
232
+ $checkedPattern = '^\s*-\s\[[xX]\]\s'
233
+
234
+ for ($i = 0; $i -lt $file.Lines.Count; $i++) {
235
+ $line = $file.Lines[$i]
236
+ if ($line -match $uncheckedPattern) {
237
+ $checkboxLineCount++
238
+ $uncheckedLineNumbers.Add($i + 1)
239
+ }
240
+ elseif ($line -match $checkedPattern) {
241
+ $checkboxLineCount++
242
+ }
243
+ }
244
+
245
+ if ($checkboxLineCount -eq 0) {
246
+ return @{ Ok = $false; Message = "atomic-executor hook: plan file '$planPath' contains no task checkboxes; executor cannot complete against an empty plan." }
247
+ }
248
+
249
+ if ($uncheckedLineNumbers.Count -gt 0) {
250
+ $reported = $uncheckedLineNumbers
251
+ $suffix = ''
252
+ if ($uncheckedLineNumbers.Count -gt 5) {
253
+ $reported = $uncheckedLineNumbers.GetRange(0, 5)
254
+ $suffix = ' (showing first 5)'
255
+ }
256
+ $lineList = ($reported -join ', ')
257
+ $message = "atomic-executor hook: plan file '$planPath' has $($uncheckedLineNumbers.Count) unchecked task(s) at line(s) ${lineList}${suffix}. All `- [ ]` items must be ticked to `- [x]` before termination."
258
+ return @{ Ok = $false; Message = $message }
259
+ }
260
+
261
+ if ($agentOutput -notmatch '(?i)\bAC Status Summary\b') {
262
+ return @{ Ok = $false; Message = 'atomic-executor hook: completion output must include an `AC Status Summary` section.' }
263
+ }
264
+
265
+ $hasCommandEvidence = $agentOutput -match '(?i)(Commands Run|Command[s]?:|poetry run |npx |pwsh |git |mcp__drmCopilotExtension__)'
266
+ $hasStatusEvidence = $agentOutput -match '(?i)\b(PASS|FAIL)\b'
267
+ if (-not $hasCommandEvidence -or -not $hasStatusEvidence) {
268
+ return @{ Ok = $false; Message = 'atomic-executor hook: completion output must report commands run and pass/fail status results.' }
269
+ }
270
+
271
+ $missingLanguageStatuses = [System.Collections.Generic.List[string]]::new()
272
+ foreach ($language in Get-TouchedLanguagesFromPlan -Lines $file.Lines) {
273
+ if (-not (Test-OutputHasLanguageStatus -AgentOutput $agentOutput -Language $language)) {
274
+ $missingLanguageStatuses.Add($language)
275
+ }
276
+ }
277
+
278
+ if ($missingLanguageStatuses.Count -gt 0) {
279
+ $missingList = $missingLanguageStatuses -join ', '
280
+ return @{ Ok = $false; Message = "atomic-executor hook: completion output is missing explicit PASS/FAIL toolchain status lines for: $missingList." }
281
+ }
282
+
283
+ return @{ Ok = $true; Message = $null }
284
+ }
285
+
286
+ if ($MyInvocation.InvocationName -eq '.') {
287
+ return
288
+ }
289
+
290
+ $result = Invoke-ExecutorOutputValidation -RawPayload $env:CLAUDE_HOOK_INPUT
291
+ if (-not $result.Ok) {
292
+ Write-Error $result.Message
293
+ exit 1
294
+ }
295
+
296
+ exit 0