@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,217 @@
1
+ """Filesystem abstractions for the push-down customization publisher.
2
+
3
+ Purpose:
4
+ Isolate the publisher's filesystem contract and real-disk adapter so the
5
+ orchestration module can stay focused on validation, rewriting, and summary
6
+ reporting.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import TYPE_CHECKING, Protocol
12
+
13
+ if TYPE_CHECKING:
14
+ from pathlib import Path
15
+
16
+
17
+ class PushDownFileSystem(Protocol):
18
+ """
19
+ Define the filesystem operations required by the push-down publisher.
20
+
21
+ Purpose:
22
+ Provide a small, typed seam that keeps the core publisher logic
23
+ deterministic in tests while still allowing the production CLI to work
24
+ against the real filesystem.
25
+
26
+ Usage:
27
+ Pass `RealPushDownFileSystem` in production or a deterministic test
28
+ double in unit tests.
29
+
30
+ Flow:
31
+ The publisher validates the destination, enumerates source files, then
32
+ reads and writes text through this protocol.
33
+
34
+ Invariants / Constraints:
35
+ - `list_files()` returns files that are beneath the requested root.
36
+ - `is_dir()` and `is_file()` reflect the current filesystem state.
37
+ - `read_text()` and `write_text()` operate on UTF-8 repository text.
38
+
39
+ Side Effects:
40
+ Concrete implementations may touch the real filesystem.
41
+ """
42
+
43
+ def list_files(self, root: Path) -> list[Path]: ...
44
+
45
+ def is_dir(self, path: Path) -> bool: ...
46
+
47
+ def is_file(self, path: Path) -> bool: ...
48
+
49
+ def read_text(self, path: Path) -> str: ...
50
+
51
+ def write_text(self, path: Path, content: str) -> None: ...
52
+
53
+ def ensure_dir(self, path: Path) -> None: ...
54
+
55
+
56
+ class RealPushDownFileSystem:
57
+ """
58
+ Implement push-down filesystem operations against the real disk.
59
+
60
+ Purpose:
61
+ Provide the production filesystem behavior for source enumeration,
62
+ destination writes, and summary-artifact emission.
63
+
64
+ Usage:
65
+ Instantiated by `scripts.dev_tools.push_down_copilot_customizations`
66
+ when callers do not inject a test double.
67
+
68
+ Flow:
69
+ Uses `pathlib.Path` primitives for recursive enumeration and UTF-8 text
70
+ I/O.
71
+
72
+ Invariants / Constraints:
73
+ The scoped `.github` trees currently contain repository text content, so
74
+ this adapter reads and writes UTF-8 text.
75
+
76
+ Side Effects:
77
+ Reads from and writes to the real filesystem.
78
+ """
79
+
80
+ def list_files(self, root: Path) -> list[Path]:
81
+ """
82
+ Return all files beneath a root path in sorted order.
83
+
84
+ Purpose:
85
+ Preserve deterministic enumeration for summary artifacts and tests.
86
+
87
+ Args:
88
+ root (Path): Root path to enumerate.
89
+
90
+ Returns:
91
+ list[Path]: Sorted file paths beneath `root`.
92
+
93
+ Raises:
94
+ None.
95
+
96
+ Side Effects:
97
+ Reads directory metadata from disk.
98
+ """
99
+ if not root.is_dir():
100
+ return []
101
+
102
+ files: list[Path] = []
103
+ # Collect files in stable order so summary artifacts remain deterministic.
104
+ for path in root.rglob("*"):
105
+ if path.is_file():
106
+ files.append(path)
107
+ return sorted(files)
108
+
109
+ def is_dir(self, path: Path) -> bool:
110
+ """
111
+ Return whether the path is an existing directory.
112
+
113
+ Purpose:
114
+ Support destination validation without leaking `pathlib` directly
115
+ into the orchestration layer.
116
+
117
+ Args:
118
+ path (Path): Path to inspect.
119
+
120
+ Returns:
121
+ bool: True when `path` exists and is a directory.
122
+
123
+ Raises:
124
+ None.
125
+
126
+ Side Effects:
127
+ Reads filesystem metadata.
128
+ """
129
+ return path.is_dir()
130
+
131
+ def is_file(self, path: Path) -> bool:
132
+ """
133
+ Return whether the path is an existing file.
134
+
135
+ Purpose:
136
+ Let the publisher classify writes as created versus overwritten.
137
+
138
+ Args:
139
+ path (Path): Path to inspect.
140
+
141
+ Returns:
142
+ bool: True when `path` exists and is a file.
143
+
144
+ Raises:
145
+ None.
146
+
147
+ Side Effects:
148
+ Reads filesystem metadata.
149
+ """
150
+ return path.is_file()
151
+
152
+ def read_text(self, path: Path) -> str:
153
+ """
154
+ Read UTF-8 text from a file path.
155
+
156
+ Purpose:
157
+ Provide the production text-read primitive used by the publisher.
158
+
159
+ Args:
160
+ path (Path): File path to read.
161
+
162
+ Returns:
163
+ str: File content decoded as UTF-8.
164
+
165
+ Raises:
166
+ OSError: Propagated when the file cannot be read.
167
+
168
+ Side Effects:
169
+ Reads file contents from disk.
170
+ """
171
+ return path.read_text(encoding="utf-8")
172
+
173
+ def write_text(self, path: Path, content: str) -> None:
174
+ """
175
+ Write UTF-8 text to a file path.
176
+
177
+ Purpose:
178
+ Persist copied customization content and summary artifacts.
179
+
180
+ Args:
181
+ path (Path): Destination file path.
182
+ content (str): UTF-8 text to write.
183
+
184
+ Returns:
185
+ None.
186
+
187
+ Raises:
188
+ OSError: Propagated when the file cannot be written.
189
+
190
+ Side Effects:
191
+ Creates parent directories and writes LF-normalized file content to
192
+ disk.
193
+ """
194
+ path.parent.mkdir(parents=True, exist_ok=True)
195
+ path.write_text(content, encoding="utf-8", newline="\n")
196
+
197
+ def ensure_dir(self, path: Path) -> None:
198
+ """
199
+ Ensure a directory exists.
200
+
201
+ Purpose:
202
+ Share one directory-creation primitive between destination writes
203
+ and artifact output.
204
+
205
+ Args:
206
+ path (Path): Directory path to create.
207
+
208
+ Returns:
209
+ None.
210
+
211
+ Raises:
212
+ OSError: Propagated when the directory cannot be created.
213
+
214
+ Side Effects:
215
+ Creates the directory path on disk when needed.
216
+ """
217
+ path.mkdir(parents=True, exist_ok=True)
@@ -0,0 +1,293 @@
1
+ """Reference rewrite helpers for the push-down customization publisher.
2
+
3
+ Purpose:
4
+ Keep command-reference normalization and rewrite catalog logic separate from
5
+ the publisher's orchestration flow so each module stays cohesive and easier
6
+ to test.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from dataclasses import dataclass
13
+
14
+ TRAILING_PUNCTUATION = ".,;:!?)"
15
+ SCRIPT_REFERENCE_PATTERN = re.compile(
16
+ r"(?:(?:poetry\s+run\s+python\s+-m)\s+)?(?:\$\{workspaceFolder\}[\\/])?scripts(?:\.dev_tools\.[A-Za-z0-9_.]+|[\\/](?:dev_tools|dev-tools)[A-Za-z0-9_.\\/-]+)"
17
+ )
18
+
19
+
20
+ @dataclass(frozen=True, slots=True)
21
+ class RewriteTarget:
22
+ """
23
+ Describe how a known script reference maps to a VS Code command.
24
+
25
+ Purpose:
26
+ Keep rewrite metadata explicit so implemented commands and placeholder
27
+ commands render the same stable textual command-reference format.
28
+
29
+ Usage:
30
+ Selected by normalized script-reference keys during text rewriting.
31
+
32
+ Flow:
33
+ A matched reference normalizes to `normalized_key`, then the target is
34
+ rendered through `render_command_reference()`.
35
+
36
+ Invariants / Constraints:
37
+ `command_id` values must match the extension's registered command IDs.
38
+
39
+ Side Effects:
40
+ None.
41
+
42
+ Attributes:
43
+ normalized_key (str): Canonical lookup key for a script reference.
44
+ command_id (str): VS Code command identifier.
45
+ title (str): User-facing command title.
46
+ script_reference (str): Original script reference documented by the
47
+ placeholder contract.
48
+ is_placeholder (bool): Whether the command intentionally remains a
49
+ placeholder.
50
+ """
51
+
52
+ normalized_key: str
53
+ command_id: str
54
+ title: str
55
+ script_reference: str
56
+ is_placeholder: bool
57
+
58
+
59
+ def build_rewrite_catalog() -> dict[str, RewriteTarget]:
60
+ """
61
+ Build the command rewrite catalog for supported script references.
62
+
63
+ Purpose:
64
+ Keep the supported rewrite surface explicit and deterministic.
65
+
66
+ Args:
67
+ None.
68
+
69
+ Returns:
70
+ dict[str, RewriteTarget]: Catalog keyed by normalized reference.
71
+
72
+ Raises:
73
+ None.
74
+
75
+ Side Effects:
76
+ None.
77
+ """
78
+ targets = (
79
+ RewriteTarget(
80
+ normalized_key="scripts.dev_tools.pr_context.collector",
81
+ command_id="drmCopilotExtension.collectPrContext",
82
+ title="drm-copilot: Collect PR Context",
83
+ script_reference="scripts.dev_tools.pr_context.collector",
84
+ is_placeholder=False,
85
+ ),
86
+ RewriteTarget(
87
+ normalized_key="scripts.dev_tools.new_active_feature_folder",
88
+ command_id="drmCopilotExtension.newActiveFeatureFolder",
89
+ title="drm-copilot: New Active Feature Folder",
90
+ script_reference="scripts.dev_tools.new_active_feature_folder",
91
+ is_placeholder=False,
92
+ ),
93
+ RewriteTarget(
94
+ normalized_key="scripts.dev_tools.potential_to_issue",
95
+ command_id="drmCopilotExtension.potentialToIssue",
96
+ title="drm-copilot: Potential To Issue",
97
+ script_reference="scripts.dev_tools.potential_to_issue",
98
+ is_placeholder=False,
99
+ ),
100
+ RewriteTarget(
101
+ normalized_key="scripts/dev_tools/new_potential_bug_entry.py",
102
+ command_id="drmCopilotExtension.newPotentialBugEntry",
103
+ title="drm-copilot: New Potential Bug Entry",
104
+ script_reference="scripts/dev_tools/new_potential_bug_entry.py",
105
+ is_placeholder=False,
106
+ ),
107
+ RewriteTarget(
108
+ normalized_key="scripts/dev_tools/new-potential-entry.ps1",
109
+ command_id="drmCopilotExtension.newPotentialEntry",
110
+ title="drm-copilot: New Potential Entry",
111
+ script_reference="scripts/dev-tools/new-potential-entry.ps1",
112
+ is_placeholder=False,
113
+ ),
114
+ RewriteTarget(
115
+ normalized_key="scripts.dev_tools.push_down_copilot_customizations",
116
+ command_id="drmCopilotExtension.pushDownCopilotCustomizations",
117
+ title="drm-copilot: Push Down Copilot Customizations",
118
+ script_reference="scripts.dev_tools.push_down_copilot_customizations",
119
+ is_placeholder=False,
120
+ ),
121
+ RewriteTarget(
122
+ normalized_key="scripts/dev_tools/sync-agents-from-instructions.ps1",
123
+ command_id="drmCopilotExtension.syncAgentsFromInstructions",
124
+ title="drm-copilot: Sync AGENTS.md from Instructions",
125
+ script_reference="scripts/dev-tools/sync-agents-from-instructions.ps1",
126
+ is_placeholder=False,
127
+ ),
128
+ )
129
+ return {target.normalized_key: target for target in targets}
130
+
131
+
132
+ def render_command_reference(target: RewriteTarget) -> str:
133
+ """
134
+ Render a canonical textual command reference for copied files.
135
+
136
+ Purpose:
137
+ Keep replacement text uniform regardless of whether the destination
138
+ command is implemented or still a placeholder.
139
+
140
+ Args:
141
+ target (RewriteTarget): Catalog entry for the matched reference.
142
+
143
+ Returns:
144
+ str: Stable textual command reference.
145
+
146
+ Raises:
147
+ None.
148
+
149
+ Side Effects:
150
+ None.
151
+ """
152
+ return f"VS Code command: `{target.title}` (command ID: `{target.command_id}`)"
153
+
154
+
155
+ def normalize_reference_for_lookup(reference_text: str) -> str:
156
+ """
157
+ Normalize a matched textual reference before catalog lookup.
158
+
159
+ Purpose:
160
+ Collapse workspace prefixes and slash variants onto canonical lookup
161
+ keys so the rewrite catalog has one stable matching surface.
162
+
163
+ Args:
164
+ reference_text (str): Raw matched script reference.
165
+
166
+ Returns:
167
+ str: Canonical lookup key.
168
+
169
+ Raises:
170
+ None.
171
+
172
+ Side Effects:
173
+ None.
174
+ """
175
+ normalized = reference_text.strip()
176
+ normalized = re.sub(r"^poetry\s+run\s+python\s+-m\s+", "", normalized)
177
+ normalized = normalized.replace("${workspaceFolder}\\", "")
178
+ normalized = normalized.replace("${workspaceFolder}/", "")
179
+ normalized = normalized.replace("\\", "/")
180
+ normalized = normalized.replace("scripts/dev-tools/", "scripts/dev_tools/")
181
+ return normalized
182
+
183
+
184
+ def split_trailing_punctuation(reference_text: str) -> tuple[str, str]:
185
+ """
186
+ Split a matched reference into its core text and trailing punctuation.
187
+
188
+ Purpose:
189
+ Preserve prose punctuation so rewrites do not disturb surrounding
190
+ documentation.
191
+
192
+ Args:
193
+ reference_text (str): Matched reference including surrounding
194
+ punctuation.
195
+
196
+ Returns:
197
+ tuple[str, str]: Core reference text and trailing punctuation.
198
+
199
+ Raises:
200
+ None.
201
+
202
+ Side Effects:
203
+ None.
204
+ """
205
+ core = reference_text
206
+ suffix = ""
207
+ # Preserve trailing sentence punctuation so rewrites do not disturb prose.
208
+ while core and core[-1] in TRAILING_PUNCTUATION:
209
+ suffix = core[-1] + suffix
210
+ core = core[:-1]
211
+ return core, suffix
212
+
213
+
214
+ def rewrite_matched_reference(
215
+ reference_text: str,
216
+ catalog: dict[str, RewriteTarget],
217
+ ) -> tuple[str, int, int, list[str]]:
218
+ """
219
+ Rewrite one matched script reference when it belongs to the catalog.
220
+
221
+ Purpose:
222
+ Handle one matched reference so the surrounding regex pass can stay
223
+ focused on streaming replacements and counts.
224
+
225
+ Args:
226
+ reference_text (str): Matched script reference text.
227
+ catalog (dict[str, RewriteTarget]): Lookup table keyed by normalized
228
+ reference.
229
+
230
+ Returns:
231
+ tuple[str, int, int, list[str]]: Replacement text, implemented rewrite
232
+ count, placeholder rewrite count, and unmatched references.
233
+
234
+ Raises:
235
+ None.
236
+
237
+ Side Effects:
238
+ None.
239
+ """
240
+ core_reference, suffix = split_trailing_punctuation(reference_text)
241
+ normalized_reference = normalize_reference_for_lookup(core_reference)
242
+ target = catalog.get(normalized_reference)
243
+ if target is None:
244
+ return reference_text, 0, 0, [normalized_reference]
245
+
246
+ replacement = render_command_reference(target) + suffix
247
+ if target.is_placeholder:
248
+ return replacement, 0, 1, []
249
+ return replacement, 1, 0, []
250
+
251
+
252
+ def rewrite_text_references(text: str) -> tuple[str, int, int, list[str]]:
253
+ """
254
+ Rewrite supported script references within text content.
255
+
256
+ Purpose:
257
+ Apply replacements only to matched script references and report unknown
258
+ references without changing them.
259
+
260
+ Args:
261
+ text (str): Source text to rewrite.
262
+
263
+ Returns:
264
+ tuple[str, int, int, list[str]]: Rewritten text, implemented rewrite
265
+ count, placeholder rewrite count, and ordered unmatched references.
266
+
267
+ Raises:
268
+ None.
269
+
270
+ Side Effects:
271
+ None.
272
+ """
273
+ catalog = build_rewrite_catalog()
274
+ rewritten_count = 0
275
+ placeholder_count = 0
276
+ unmatched_references: list[str] = []
277
+
278
+ def replace_match(match: re.Match[str]) -> str:
279
+ """Rewrite one regex match while accumulating deterministic counters."""
280
+ nonlocal rewritten_count, placeholder_count
281
+ replacement, rewritten_delta, placeholder_delta, unmatched = (
282
+ rewrite_matched_reference(match.group(0), catalog)
283
+ )
284
+ rewritten_count += rewritten_delta
285
+ placeholder_count += placeholder_delta
286
+ # Preserve first-seen order so unmatched reporting stays deterministic.
287
+ for reference in unmatched:
288
+ if reference not in unmatched_references:
289
+ unmatched_references.append(reference)
290
+ return replacement
291
+
292
+ rewritten_text = SCRIPT_REFERENCE_PATTERN.sub(replace_match, text)
293
+ return rewritten_text, rewritten_count, placeholder_count, unmatched_references