@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,149 @@
1
+ # Converted hook
2
+ # Review the generated hook behavior before enabling it.
3
+
4
+ <#
5
+ .SYNOPSIS
6
+ Pre-tool-use hook for Claude Code that blocks forbidden patterns in Python unit tests.
7
+
8
+ .DESCRIPTION
9
+ This script is invoked by the Claude Code PreToolUse hook before any Write or Edit
10
+ operation on a file path matching tests/**/*.py. It reads the tool input from the
11
+ CLAUDE_TOOL_INPUT environment variable (JSON with 'file_path' and a content field:
12
+ 'content' for Write, 'new_string' for Edit) and rejects the operation when the
13
+ proposed content introduces forbidden runtime dependencies.
14
+
15
+ Forbidden patterns in unit tests include:
16
+ - temporary filesystem usage (tempfile, NamedTemporaryFile, TemporaryDirectory,
17
+ mkstemp, mkdtemp, Path.touch)
18
+ - network access (requests, httpx, urllib.request, socket, http.client)
19
+ - subprocess execution (subprocess, os.system, os.popen)
20
+ - time-based flakiness (time.sleep)
21
+ - real database drivers (psycopg2, pymysql, sqlite3.connect on real files)
22
+
23
+ If the content contains any forbidden pattern, the script writes a JSON response
24
+ to stdout with 'decision': 'block' and exits with code 0 to let Claude Code surface
25
+ the reason.
26
+
27
+ .NOTES
28
+ Compatible with PowerShell 7+.
29
+ This script must not modify any state; it is a read-only validation gate.
30
+ It only inspects tool inputs targeting tests/ paths; all other paths pass through.
31
+ #>
32
+ [CmdletBinding()]
33
+ param()
34
+
35
+ function Get-PythonTestPurityBlockDecision {
36
+ [CmdletBinding()]
37
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
38
+ param(
39
+ [Parameter(Mandatory)]
40
+ [string] $Reason
41
+ )
42
+
43
+ [ordered]@{
44
+ decision = 'block'
45
+ reason = $Reason
46
+ }
47
+ }
48
+
49
+ function Test-PythonTestFilePath {
50
+ [CmdletBinding()]
51
+ [OutputType([bool])]
52
+ param(
53
+ [Parameter(Mandatory)]
54
+ [string] $FilePath
55
+ )
56
+
57
+ $normalized = $FilePath -replace '\\', '/'
58
+ return (($normalized -match '(^|/)tests/.*\.py$') -or ($normalized -match '(^|/)test_[^/]+\.py$'))
59
+ }
60
+
61
+ function Invoke-PythonTestPurityDecision {
62
+ [CmdletBinding()]
63
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
64
+ param(
65
+ [string] $ToolInputRaw
66
+ )
67
+
68
+ if (-not $ToolInputRaw) {
69
+ return [ordered]@{ decision = 'allow' }
70
+ }
71
+
72
+ try {
73
+ $toolInput = $ToolInputRaw | ConvertFrom-Json -ErrorAction Stop
74
+ } catch {
75
+ return Get-PythonTestPurityBlockDecision -Reason 'Python unit test purity hook received malformed JSON in CLAUDE_TOOL_INPUT.'
76
+ }
77
+
78
+ $filePath = $toolInput.file_path
79
+ if (-not $filePath) {
80
+ return [ordered]@{ decision = 'allow' }
81
+ }
82
+
83
+ if (-not (Test-PythonTestFilePath -FilePath $filePath)) {
84
+ return [ordered]@{ decision = 'allow' }
85
+ }
86
+
87
+ $content = $null
88
+ if ($null -ne $toolInput.content) {
89
+ $content = [string]$toolInput.content
90
+ } elseif ($null -ne $toolInput.new_string) {
91
+ $content = [string]$toolInput.new_string
92
+ }
93
+
94
+ if (-not $content) {
95
+ return [ordered]@{ decision = 'allow' }
96
+ }
97
+
98
+ $forbiddenPatterns = @(
99
+ @{ Pattern = 'import\s+tempfile'; Reason = 'tempfile usage forbidden in unit tests' },
100
+ @{ Pattern = 'from\s+tempfile\s+import'; Reason = 'tempfile usage forbidden in unit tests' },
101
+ @{ Pattern = 'NamedTemporaryFile'; Reason = 'temporary files forbidden in unit tests' },
102
+ @{ Pattern = 'TemporaryDirectory'; Reason = 'temporary directories forbidden in unit tests' },
103
+ @{ Pattern = '\bmkstemp\s*\('; Reason = 'temporary files forbidden in unit tests' },
104
+ @{ Pattern = '\bmkdtemp\s*\('; Reason = 'temporary directories forbidden in unit tests' },
105
+ @{ Pattern = '\.touch\s*\('; Reason = 'Path.touch forbidden in unit tests' },
106
+ @{ Pattern = 'import\s+requests\b'; Reason = 'network access forbidden in unit tests' },
107
+ @{ Pattern = 'from\s+requests\b'; Reason = 'network access forbidden in unit tests' },
108
+ @{ Pattern = 'import\s+httpx\b'; Reason = 'network access forbidden in unit tests' },
109
+ @{ Pattern = 'from\s+httpx\b'; Reason = 'network access forbidden in unit tests' },
110
+ @{ Pattern = 'urllib\.request'; Reason = 'network access forbidden in unit tests' },
111
+ @{ Pattern = 'import\s+socket\b'; Reason = 'raw socket access forbidden in unit tests' },
112
+ @{ Pattern = 'from\s+http\.client'; Reason = 'network access forbidden in unit tests' },
113
+ @{ Pattern = 'import\s+subprocess\b'; Reason = 'subprocess execution forbidden in unit tests' },
114
+ @{ Pattern = 'from\s+subprocess\s+import'; Reason = 'subprocess execution forbidden in unit tests' },
115
+ @{ Pattern = 'os\.system\s*\('; Reason = 'os.system forbidden in unit tests' },
116
+ @{ Pattern = 'os\.popen\s*\('; Reason = 'os.popen forbidden in unit tests' },
117
+ @{ Pattern = 'time\.sleep\s*\('; Reason = 'time.sleep forbidden in unit tests; avoid timing hacks' },
118
+ @{ Pattern = 'import\s+psycopg2\b'; Reason = 'real database drivers forbidden in unit tests' },
119
+ @{ Pattern = 'import\s+pymysql\b'; Reason = 'real database drivers forbidden in unit tests' },
120
+ @{ Pattern = 'sqlite3\.connect\s*\('; Reason = 'sqlite3.connect on real files forbidden in unit tests' }
121
+ )
122
+
123
+ $violations = @()
124
+ foreach ($entry in $forbiddenPatterns) {
125
+ if ($content -match $entry.Pattern) {
126
+ $violations += $entry.Reason
127
+ }
128
+ }
129
+
130
+ if ($violations.Count -eq 0) {
131
+ return [ordered]@{ decision = 'allow' }
132
+ }
133
+
134
+ $uniqueViolations = $violations | Select-Object -Unique
135
+ $reason = "Python unit test purity violations in '$filePath': " + ($uniqueViolations -join '; ') + ". Replace with pure code paths, dependency-injection seams, or in-memory fakes per .agents/skills/python/SKILL.md."
136
+
137
+ return Get-PythonTestPurityBlockDecision -Reason $reason
138
+ }
139
+
140
+ if ($MyInvocation.InvocationName -eq '.') {
141
+ return
142
+ }
143
+
144
+ $decision = Invoke-PythonTestPurityDecision -ToolInputRaw $env:CLAUDE_TOOL_INPUT
145
+ if ($decision.decision -eq 'block') {
146
+ $decision | ConvertTo-Json -Compress | Write-Output
147
+ }
148
+
149
+ exit 0
@@ -0,0 +1,153 @@
1
+ # Converted hook
2
+ # Review the generated hook behavior before enabling it.
3
+
4
+ <#
5
+ .SYNOPSIS
6
+ Pre-tool-use hook that blocks writes to non-canonical evidence storage locations.
7
+
8
+ .DESCRIPTION
9
+ This script is invoked by the Claude Code PreToolUse hook before any Write or Edit
10
+ operation. It reads the tool input from the CLAUDE_TOOL_INPUT environment variable
11
+ (JSON with a 'file_path' field) and rejects the operation when the target path is
12
+ a non-canonical evidence location.
13
+
14
+ Forbidden path prefixes (case-sensitive, normalized to forward-slash):
15
+ - artifacts/baselines/
16
+ - artifacts/baseline/
17
+ - artifacts/qa/
18
+ - artifacts/qa-gates/
19
+ - artifacts/coverage/
20
+ - artifacts/evidence/
21
+ - artifacts/regression-testing/
22
+ - artifacts/post-change/
23
+
24
+ All other paths pass through, including canonical evidence paths of the form
25
+ <FEATURE>/evidence/<kind>/ and permitted artifacts/ sub-paths such as
26
+ artifacts/orchestration/, artifacts/research/, artifacts/pr_context,
27
+ artifacts/reviews/, artifacts/status/, artifacts/python/, artifacts/pester/,
28
+ and artifacts/csharp/.
29
+
30
+ If the file_path resolves to a forbidden prefix, the script writes a JSON response
31
+ to stdout with 'decision': 'block' and exits with code 0 so Claude Code surfaces
32
+ the reason. For allowed paths, 'decision': 'allow' is written to stdout and the
33
+ script exits 0. On hard failure (malformed JSON input), the script exits 1.
34
+
35
+ .NOTES
36
+ Compatible with PowerShell 7+.
37
+ This script must not modify any state; it is a read-only validation gate.
38
+ #>
39
+ [CmdletBinding()]
40
+ param()
41
+
42
+ function Test-EvidenceLocationForbidden {
43
+ <#
44
+ .SYNOPSIS
45
+ Returns $true when the supplied file path targets a forbidden evidence sub-path.
46
+ .PARAMETER FilePath
47
+ The raw file_path value from the Claude Code tool-input JSON.
48
+ #>
49
+ [CmdletBinding()]
50
+ [OutputType([bool])]
51
+ param(
52
+ [Parameter(Mandatory)]
53
+ [string] $FilePath
54
+ )
55
+
56
+ # Normalize separators so both absolute Windows paths and relative POSIX paths match.
57
+ $normalized = $FilePath -replace '\\', '/'
58
+
59
+ $forbiddenPrefixes = @(
60
+ 'artifacts/baselines/',
61
+ 'artifacts/baseline/',
62
+ 'artifacts/qa/',
63
+ 'artifacts/qa-gates/',
64
+ 'artifacts/coverage/',
65
+ 'artifacts/evidence/',
66
+ 'artifacts/regression-testing/',
67
+ 'artifacts/post-change/'
68
+ )
69
+
70
+ # Match the prefix either at the start of the string or after any directory separator,
71
+ # to handle both relative and absolute path forms.
72
+ foreach ($prefix in $forbiddenPrefixes) {
73
+ $escapedPrefix = [regex]::Escape($prefix)
74
+ if ($normalized -match "(^|/)$escapedPrefix") {
75
+ return $true
76
+ }
77
+ }
78
+
79
+ return $false
80
+ }
81
+
82
+ function Get-EvidenceLocationBlockDecision {
83
+ <#
84
+ .SYNOPSIS
85
+ Constructs a block-decision ordered dictionary for the supplied forbidden path.
86
+ .PARAMETER FilePath
87
+ The file path that triggered the block.
88
+ #>
89
+ [CmdletBinding()]
90
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
91
+ param(
92
+ [Parameter(Mandatory)]
93
+ [string] $FilePath
94
+ )
95
+
96
+ [ordered]@{
97
+ decision = 'block'
98
+ reason = "EVIDENCE_LOCATION_BLOCKED: '$FilePath' is not a canonical evidence location. Use <FEATURE>/evidence/<kind>/ instead. See .agents/skills/evidence-and-timestamp-conventions/SKILL.md for the canonical scheme."
99
+ }
100
+ }
101
+
102
+ function Invoke-EvidenceLocationDecision {
103
+ <#
104
+ .SYNOPSIS
105
+ Parses the Claude Code tool-input JSON and returns an allow-or-block decision.
106
+ .PARAMETER ToolInputRaw
107
+ The raw JSON string from $env:CLAUDE_TOOL_INPUT. An empty or null value
108
+ results in an allow decision (non-file tool calls have no file_path).
109
+ #>
110
+ [CmdletBinding()]
111
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
112
+ param(
113
+ [string] $ToolInputRaw
114
+ )
115
+
116
+ if (-not $ToolInputRaw) {
117
+ return [ordered]@{ decision = 'allow' }
118
+ }
119
+
120
+ try {
121
+ $toolInput = $ToolInputRaw | ConvertFrom-Json -ErrorAction Stop
122
+ } catch {
123
+ # Malformed JSON is a hard failure; caller exits 1 to surface the issue.
124
+ throw "enforce-evidence-locations hook received malformed JSON in CLAUDE_TOOL_INPUT: $_"
125
+ }
126
+
127
+ $filePath = $toolInput.file_path
128
+ if (-not $filePath) {
129
+ return [ordered]@{ decision = 'allow' }
130
+ }
131
+
132
+ if (Test-EvidenceLocationForbidden -FilePath $filePath) {
133
+ return Get-EvidenceLocationBlockDecision -FilePath $filePath
134
+ }
135
+
136
+ return [ordered]@{ decision = 'allow' }
137
+ }
138
+
139
+ # Guard allows dot-sourcing in tests without executing the entrypoint.
140
+ if ($MyInvocation.InvocationName -eq '.') {
141
+ return
142
+ }
143
+
144
+ try {
145
+ $decision = Invoke-EvidenceLocationDecision -ToolInputRaw $env:CLAUDE_TOOL_INPUT
146
+ } catch {
147
+ Write-Error $_
148
+ exit 1
149
+ }
150
+
151
+ $decision | ConvertTo-Json -Compress | Write-Output
152
+
153
+ exit 0
@@ -0,0 +1,241 @@
1
+ # Converted hook
2
+ # Review the generated hook behavior before enabling it.
3
+
4
+ <#
5
+ .SYNOPSIS
6
+ Pre-tool-use hook that enforces the PowerShell per-batch change budget.
7
+
8
+ .DESCRIPTION
9
+ This script is invoked by the Claude Code PreToolUse hook before any Write or Edit
10
+ operation. When the target file is a PowerShell source file (.ps1, .psm1, .psd1),
11
+ it classifies the file as either production or test and checks the running count
12
+ against the per-batch cap:
13
+ - 3 production PowerShell files per batch
14
+ - 3 test PowerShell files per batch
15
+
16
+ A "batch" is scoped to the current Claude Code session. The running count is
17
+ persisted under .claude/state/powershell-batch-budget.<session_id>.json. Only
18
+ distinct file paths are counted; repeated edits to the same file consume one slot.
19
+
20
+ Test files are those matching:
21
+ - tests/**/*.ps1
22
+ - *.Tests.ps1
23
+
24
+ All other .ps1/.psm1/.psd1 files are treated as production files. Non-PowerShell
25
+ paths pass through.
26
+
27
+ The cap may be overridden per session by setting the environment variable
28
+ CLAUDE_POWERSHELL_BUDGET_PROD or CLAUDE_POWERSHELL_BUDGET_TEST to a positive integer
29
+ before the session starts, or by writing {"prodCap": N, "testCap": M} into the
30
+ state file.
31
+
32
+ When the cap would be exceeded by a new file, the script emits a JSON response with
33
+ 'decision': 'block' and exits 0. The session must explicitly reset the counter by
34
+ deleting the state file before starting a new batch. Files already counted are
35
+ always allowed through.
36
+
37
+ .NOTES
38
+ Compatible with PowerShell 7+.
39
+ #>
40
+ [CmdletBinding()]
41
+ param()
42
+
43
+ function Get-PowerShellBatchBudgetState {
44
+ [CmdletBinding()]
45
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
46
+ param(
47
+ [Parameter(Mandatory)]
48
+ [int] $ProdCap,
49
+
50
+ [Parameter(Mandatory)]
51
+ [int] $TestCap
52
+ )
53
+
54
+ [ordered]@{
55
+ prodCap = $ProdCap
56
+ testCap = $TestCap
57
+ prodFiles = @()
58
+ testFiles = @()
59
+ }
60
+ }
61
+
62
+ function ConvertTo-PowerShellBatchBudgetState {
63
+ [CmdletBinding()]
64
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
65
+ param(
66
+ [Parameter(Mandatory)]
67
+ $InputObject,
68
+
69
+ [Parameter(Mandatory)]
70
+ [int] $ProdCap,
71
+
72
+ [Parameter(Mandatory)]
73
+ [int] $TestCap
74
+ )
75
+
76
+ $state = Get-PowerShellBatchBudgetState -ProdCap $ProdCap -TestCap $TestCap
77
+ if ($null -ne $InputObject.prodCap) { $state.prodCap = [int]$InputObject.prodCap }
78
+ if ($null -ne $InputObject.testCap) { $state.testCap = [int]$InputObject.testCap }
79
+ if ($null -ne $InputObject.prodFiles) { $state.prodFiles = @($InputObject.prodFiles) }
80
+ if ($null -ne $InputObject.testFiles) { $state.testFiles = @($InputObject.testFiles) }
81
+
82
+ return $state
83
+ }
84
+
85
+ function Get-PowerShellBatchBudgetBlockDecision {
86
+ [CmdletBinding()]
87
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
88
+ param(
89
+ [Parameter(Mandatory)]
90
+ [string] $Reason,
91
+
92
+ [System.Collections.IDictionary] $State
93
+ )
94
+
95
+ $decision = [ordered]@{
96
+ decision = 'block'
97
+ reason = $Reason
98
+ }
99
+ if ($State) {
100
+ $decision.state = $State
101
+ }
102
+
103
+ return $decision
104
+ }
105
+
106
+ function Invoke-PowerShellBatchBudgetDecision {
107
+ [CmdletBinding()]
108
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
109
+ param(
110
+ [Parameter(Mandatory)]
111
+ [string] $FilePath,
112
+
113
+ [Parameter(Mandatory)]
114
+ [System.Collections.IDictionary] $State,
115
+
116
+ [Parameter(Mandatory)]
117
+ [string] $StateFile
118
+ )
119
+
120
+ $normalized = $FilePath -replace '\\', '/'
121
+ if ($normalized -notmatch '\.(ps1|psm1|psd1)$') {
122
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $false }
123
+ }
124
+
125
+ $isTestFile = ($normalized -match '(^|/)tests/.*\.ps1$') -or ($normalized -match '\.Tests\.ps1$')
126
+ $targetList = if ($isTestFile) { @($State.testFiles) } else { @($State.prodFiles) }
127
+ $cap = if ($isTestFile) { [int]$State.testCap } else { [int]$State.prodCap }
128
+ $kind = if ($isTestFile) { 'test' } else { 'production' }
129
+
130
+ if ($targetList -contains $normalized) {
131
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $false }
132
+ }
133
+
134
+ if ($targetList.Count -ge $cap) {
135
+ $currentFiles = ($targetList -join ', ')
136
+ $kindUpper = $kind.ToUpperInvariant()
137
+ $reason = "PowerShell 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_POWERSHELL_BUDGET_$kindUpper environment variable with approved scope, or reset the batch by deleting $StateFile."
138
+ return Get-PowerShellBatchBudgetBlockDecision -Reason $reason -State $State
139
+ }
140
+
141
+ if ($isTestFile) {
142
+ $State.testFiles = @($State.testFiles) + @($normalized)
143
+ } else {
144
+ $State.prodFiles = @($State.prodFiles) + @($normalized)
145
+ }
146
+
147
+ return [ordered]@{ decision = 'allow'; state = $State; shouldWriteState = $true }
148
+ }
149
+
150
+ function Invoke-PowerShellBatchBudgetHook {
151
+ [CmdletBinding()]
152
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
153
+ param(
154
+ [string] $ToolInputRaw,
155
+ [string] $SessionId = 'default',
156
+ [string] $Root = (Get-Location).Path,
157
+ [int] $ProdCap = 3,
158
+ [int] $TestCap = 3,
159
+ [scriptblock] $TestPathExists = { param([string] $Path) Test-Path -Path $Path },
160
+ [scriptblock] $EnsureDirectory = { param([string] $Path) New-Item -ItemType Directory -Path $Path -Force | Out-Null },
161
+ [scriptblock] $ReadState = { param([string] $Path) Get-Content -Path $Path -Raw },
162
+ [scriptblock] $WriteState = {
163
+ param([string] $Path, [System.Collections.IDictionary] $State)
164
+ $State | ConvertTo-Json -Depth 5 | Set-Content -Path $Path -Encoding UTF8
165
+ }
166
+ )
167
+
168
+ if (-not $ToolInputRaw) {
169
+ return [ordered]@{ decision = 'allow' }
170
+ }
171
+
172
+ try {
173
+ $toolInput = $ToolInputRaw | ConvertFrom-Json -ErrorAction Stop
174
+ } catch {
175
+ return Get-PowerShellBatchBudgetBlockDecision -Reason 'PowerShell batch-budget hook received malformed JSON in CLAUDE_TOOL_INPUT.'
176
+ }
177
+
178
+ $filePath = $toolInput.file_path
179
+ if (-not $filePath) {
180
+ return [ordered]@{ decision = 'allow' }
181
+ }
182
+
183
+ $normalized = $filePath -replace '\\', '/'
184
+ if ($normalized -notmatch '\.(ps1|psm1|psd1)$') {
185
+ return [ordered]@{ decision = 'allow' }
186
+ }
187
+
188
+ $stateDir = Join-Path -Path $Root -ChildPath '.claude/state'
189
+ if (-not (& $TestPathExists $stateDir)) {
190
+ & $EnsureDirectory $stateDir
191
+ }
192
+
193
+ $stateFile = Join-Path -Path $stateDir -ChildPath ("powershell-batch-budget.$SessionId.json")
194
+ $state = Get-PowerShellBatchBudgetState -ProdCap $ProdCap -TestCap $TestCap
195
+
196
+ if (& $TestPathExists $stateFile) {
197
+ try {
198
+ $loaded = & $ReadState $stateFile | ConvertFrom-Json -ErrorAction Stop
199
+ $state = ConvertTo-PowerShellBatchBudgetState -InputObject $loaded -ProdCap $ProdCap -TestCap $TestCap
200
+ } catch {
201
+ Write-Verbose "Ignoring unreadable PowerShell batch-budget state file '$stateFile': $($_.Exception.Message)"
202
+ }
203
+ }
204
+
205
+ $decision = Invoke-PowerShellBatchBudgetDecision -FilePath $filePath -State $state -StateFile $stateFile
206
+ if ($decision.shouldWriteState) {
207
+ try {
208
+ & $WriteState $stateFile $decision.state
209
+ } catch {
210
+ Write-Verbose "Unable to write PowerShell batch-budget state file '$stateFile': $($_.Exception.Message)"
211
+ }
212
+ }
213
+
214
+ return $decision
215
+ }
216
+
217
+ if ($MyInvocation.InvocationName -eq '.') {
218
+ return
219
+ }
220
+
221
+ $sessionId = $env:CLAUDE_SESSION_ID
222
+ if (-not $sessionId) {
223
+ $sessionId = 'default'
224
+ }
225
+
226
+ $prodCap = 3
227
+ $testCap = 3
228
+ if ($env:CLAUDE_POWERSHELL_BUDGET_PROD -match '^\d+$') {
229
+ $prodCap = [int]$env:CLAUDE_POWERSHELL_BUDGET_PROD
230
+ }
231
+ if ($env:CLAUDE_POWERSHELL_BUDGET_TEST -match '^\d+$') {
232
+ $testCap = [int]$env:CLAUDE_POWERSHELL_BUDGET_TEST
233
+ }
234
+
235
+ $decision = Invoke-PowerShellBatchBudgetHook -ToolInputRaw $env:CLAUDE_TOOL_INPUT -SessionId $sessionId -ProdCap $prodCap -TestCap $testCap
236
+ if ($decision.decision -eq 'block') {
237
+ $decision.Remove('state')
238
+ $decision | ConvertTo-Json -Compress | Write-Output
239
+ }
240
+
241
+ exit 0
@@ -0,0 +1,150 @@
1
+ # Converted hook
2
+ # Review the generated hook behavior before enabling it.
3
+
4
+ <#
5
+ .SYNOPSIS
6
+ Pre-tool-use hook that blocks Bash promotion-script bypass attempts.
7
+
8
+ .DESCRIPTION
9
+ This script is invoked by the Claude Code PreToolUse hook before any Bash
10
+ command runs. It reads the tool input from the CLAUDE_TOOL_INPUT environment
11
+ variable, inspects the attempted command text, and blocks direct promotion
12
+ script execution that would bypass the repository's MCP-only promotion path.
13
+
14
+ Forbidden command tokens:
15
+ - new-potential-entry.ps1
16
+ - new_potential_bug_entry
17
+ - potential_to_issue
18
+ - new_active_feature_folder
19
+
20
+ The hook is read-only: it inspects the attempted command and emits a JSON
21
+ allow-or-block decision without mutating the command text.
22
+
23
+ .NOTES
24
+ Compatible with PowerShell 7+.
25
+ #>
26
+ [CmdletBinding()]
27
+ param()
28
+
29
+ $script:PromotionMcpOnlyBlockedReason = 'PROMOTION_MCP_ONLY_BLOCKED: Direct Bash promotion-script execution is not allowed in agent sessions. Use the drmCopilotExtension MCP promotion tools instead.'
30
+
31
+ function Get-PromotionMcpOnlyBlockedReason {
32
+ <#
33
+ .SYNOPSIS
34
+ Return the canonical deny message for promotion-script bypass attempts.
35
+ .OUTPUTS
36
+ System.String
37
+ #>
38
+ [CmdletBinding()]
39
+ [OutputType([string])]
40
+ param()
41
+
42
+ return $script:PromotionMcpOnlyBlockedReason
43
+ }
44
+
45
+ function Test-PromotionBypassToken {
46
+ <#
47
+ .SYNOPSIS
48
+ Return $true when a Bash command contains a forbidden promotion token.
49
+ .PARAMETER CommandText
50
+ The Bash command text extracted from CLAUDE_TOOL_INPUT.
51
+ .OUTPUTS
52
+ System.Boolean
53
+ #>
54
+ [CmdletBinding()]
55
+ [OutputType([bool])]
56
+ param(
57
+ [Parameter(Mandatory)]
58
+ [string] $CommandText
59
+ )
60
+
61
+ # Inspect only the command text so the hook remains a narrow, non-mutating
62
+ # policy gate for direct promotion-script bypass attempts.
63
+ $forbiddenTokens = @(
64
+ 'new-potential-entry.ps1',
65
+ 'new_potential_bug_entry',
66
+ 'potential_to_issue',
67
+ 'new_active_feature_folder'
68
+ )
69
+
70
+ foreach ($token in $forbiddenTokens) {
71
+ if ($CommandText.IndexOf($token, [System.StringComparison]::OrdinalIgnoreCase) -ge 0) {
72
+ return $true
73
+ }
74
+ }
75
+
76
+ return $false
77
+ }
78
+
79
+ function Get-PromotionMcpOnlyBlockDecision {
80
+ <#
81
+ .SYNOPSIS
82
+ Construct the structured block decision for a forbidden Bash command.
83
+ .OUTPUTS
84
+ System.Collections.Specialized.OrderedDictionary
85
+ #>
86
+ [CmdletBinding()]
87
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
88
+ param()
89
+
90
+ return [ordered]@{
91
+ decision = 'block'
92
+ reason = (Get-PromotionMcpOnlyBlockedReason)
93
+ }
94
+ }
95
+
96
+ function Invoke-PromotionMcpOnlyDecision {
97
+ <#
98
+ .SYNOPSIS
99
+ Parse CLAUDE_TOOL_INPUT and return an allow-or-block decision.
100
+ .PARAMETER ToolInputRaw
101
+ The raw JSON tool payload supplied by Claude Code.
102
+ .OUTPUTS
103
+ System.Collections.Specialized.OrderedDictionary
104
+ .NOTES
105
+ Missing tool input or missing command text is treated as allow because
106
+ non-Bash invocations or empty Bash requests cannot bypass promotion flow.
107
+ #>
108
+ [CmdletBinding()]
109
+ [OutputType([System.Collections.Specialized.OrderedDictionary])]
110
+ param(
111
+ [string] $ToolInputRaw
112
+ )
113
+
114
+ if (-not $ToolInputRaw) {
115
+ return [ordered]@{ decision = 'allow' }
116
+ }
117
+
118
+ try {
119
+ $toolInput = $ToolInputRaw | ConvertFrom-Json -ErrorAction Stop
120
+ } catch {
121
+ throw "enforce-promotion-mcp-only hook received malformed JSON in CLAUDE_TOOL_INPUT: $_"
122
+ }
123
+
124
+ $commandText = $toolInput.command
125
+ if (-not $commandText) {
126
+ return [ordered]@{ decision = 'allow' }
127
+ }
128
+
129
+ if (Test-PromotionBypassToken -CommandText $commandText) {
130
+ return Get-PromotionMcpOnlyBlockDecision
131
+ }
132
+
133
+ return [ordered]@{ decision = 'allow' }
134
+ }
135
+
136
+ # Allow dot-sourcing in tests without executing the entrypoint.
137
+ if ($MyInvocation.InvocationName -eq '.') {
138
+ return
139
+ }
140
+
141
+ try {
142
+ $decision = Invoke-PromotionMcpOnlyDecision -ToolInputRaw $env:CLAUDE_TOOL_INPUT
143
+ } catch {
144
+ Write-Error $_
145
+ exit 1
146
+ }
147
+
148
+ $decision | ConvertTo-Json -Compress | Write-Output
149
+
150
+ exit 0