@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,504 @@
1
+ """Publish scoped Copilot customizations into a destination workspace.
2
+
3
+ Purpose:
4
+ Provide the stable public entry point for the repository's one-way
5
+ customization publisher while delegating filesystem and rewrite concerns to
6
+ smaller helper modules.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import json
13
+ import os
14
+ from collections.abc import Callable
15
+ from dataclasses import asdict, dataclass
16
+ from datetime import datetime, timezone
17
+ from pathlib import Path, PureWindowsPath
18
+ from typing import TypedDict
19
+
20
+ try:
21
+ from scripts.dev_tools.agentic_sync import ROOT_FOLDERS
22
+ from scripts.dev_tools.push_down_copilot_customizations_filesystem import (
23
+ PushDownFileSystem,
24
+ RealPushDownFileSystem,
25
+ )
26
+ from scripts.dev_tools.push_down_copilot_customizations_rewrites import (
27
+ rewrite_text_references,
28
+ )
29
+ except ModuleNotFoundError as error:
30
+ if error.name is None or not error.name.startswith("scripts"):
31
+ raise
32
+ from dev_tools.agentic_sync import ROOT_FOLDERS
33
+ from dev_tools.push_down_copilot_customizations_filesystem import (
34
+ PushDownFileSystem,
35
+ RealPushDownFileSystem,
36
+ )
37
+ from dev_tools.push_down_copilot_customizations_rewrites import (
38
+ rewrite_text_references,
39
+ )
40
+
41
+ ARTIFACT_DIRECTORY = "artifacts/copilot-customizations"
42
+ MODULE_ENTRY_POINT = "scripts.dev_tools.push_down_copilot_customizations"
43
+ RewriteFunction = Callable[[str], tuple[str, int, int, list[str]]]
44
+
45
+ __all__ = ["PushDownSummary", "main", "parse_args", "push_down_customizations"]
46
+
47
+
48
+ class PushDownSummaryPayload(TypedDict):
49
+ """Describe the JSON artifact schema for a push-down run."""
50
+
51
+ repo_root: str
52
+ destination_root: str
53
+ started_at: str
54
+ finished_at: str
55
+ created_count: int
56
+ overwritten_count: int
57
+ rewritten_reference_count: int
58
+ placeholder_rewrite_count: int
59
+ unmatched_references: list[str]
60
+ files: list[dict[str, object]]
61
+
62
+
63
+ @dataclass(frozen=True, slots=True)
64
+ class PushDownFileResult:
65
+ """
66
+ Record the outcome for a copied file.
67
+
68
+ Purpose:
69
+ Capture created-versus-overwritten classification and rewrite details so
70
+ the JSON artifact stays auditable.
71
+
72
+ Usage:
73
+ Appended to the run summary in source-file processing order.
74
+
75
+ Attributes:
76
+ relative_path (str): Destination-relative file path.
77
+ destination_status (str): Either `created` or `overwritten`.
78
+ rewritten_reference_count (int): Number of non-placeholder rewrites.
79
+ placeholder_rewrite_count (int): Number of placeholder rewrites.
80
+ unmatched_references (list[str]): Unknown references left untouched.
81
+ """
82
+
83
+ relative_path: str
84
+ destination_status: str
85
+ rewritten_reference_count: int
86
+ placeholder_rewrite_count: int
87
+ unmatched_references: list[str]
88
+
89
+
90
+ @dataclass(frozen=True, slots=True)
91
+ class PushDownSummary:
92
+ """
93
+ Summarize a push-down publication run.
94
+
95
+ Purpose:
96
+ Return stable counts and per-file outcomes to callers and to the JSON
97
+ summary artifact writer.
98
+
99
+ Usage:
100
+ Returned by `push_down_customizations()` and printed by `main()`.
101
+
102
+ Flow:
103
+ Validation runs first, then file enumeration, rewrite/copy, artifact
104
+ emission, and finally summary reporting.
105
+
106
+ Invariants / Constraints:
107
+ Timestamps are timezone-aware UTC datetimes.
108
+
109
+ Side Effects:
110
+ None as a data container; artifact writing happens separately.
111
+
112
+ Attributes:
113
+ repo_root (str): Source repository root.
114
+ destination_root (str): Destination workspace root.
115
+ started_at (datetime): UTC start timestamp.
116
+ finished_at (datetime): UTC finish timestamp.
117
+ created_count (int): Number of created destination files.
118
+ overwritten_count (int): Number of overwritten destination files.
119
+ rewritten_reference_count (int): Number of implemented-command rewrites.
120
+ placeholder_rewrite_count (int): Number of placeholder rewrites.
121
+ unmatched_references (list[str]): Ordered unmatched script references.
122
+ files (list[PushDownFileResult]): Per-file outcomes.
123
+ artifact_path (str): JSON artifact path written for the run.
124
+ """
125
+
126
+ repo_root: str
127
+ destination_root: str
128
+ started_at: datetime
129
+ finished_at: datetime
130
+ created_count: int
131
+ overwritten_count: int
132
+ rewritten_reference_count: int
133
+ placeholder_rewrite_count: int
134
+ unmatched_references: list[str]
135
+ files: list[PushDownFileResult]
136
+ artifact_path: str
137
+
138
+
139
+ def enumerate_source_files(
140
+ repo_root: Path,
141
+ fs: PushDownFileSystem,
142
+ *,
143
+ source_root: Path | None = None,
144
+ root_folders: tuple[Path, ...] | None = None,
145
+ ) -> list[Path]:
146
+ """
147
+ Enumerate scoped source files in deterministic root and path order.
148
+
149
+ Purpose:
150
+ Preserve the `ROOT_FOLDERS` ordering contract while keeping file-order
151
+ stable within each scoped root.
152
+
153
+ Args:
154
+ repo_root (Path): Source repository root (used as default source root).
155
+ fs (PushDownFileSystem): Filesystem adapter.
156
+ source_root (Path | None): Explicit source root for packaged content.
157
+ Defaults to ``repo_root`` when ``None``.
158
+
159
+ Returns:
160
+ list[Path]: Ordered source file paths.
161
+
162
+ Raises:
163
+ None.
164
+
165
+ Side Effects:
166
+ Reads directory metadata through ``fs``.
167
+ """
168
+ effective_source = source_root if source_root is not None else repo_root
169
+ effective_roots = root_folders if root_folders is not None else ROOT_FOLDERS
170
+ ordered_files: list[Path] = []
171
+ # Enumerate by scoped root first so summaries match the feature contract.
172
+ for root in effective_roots:
173
+ root_path = effective_source / root
174
+ root_files = fs.list_files(root_path)
175
+ ordered_files.extend(
176
+ sorted(root_files, key=lambda path: path.relative_to(root_path).as_posix())
177
+ )
178
+ return ordered_files
179
+
180
+
181
+ def validate_destination(
182
+ destination_root: Path,
183
+ repo_root: Path,
184
+ fs: PushDownFileSystem,
185
+ ) -> None:
186
+ """
187
+ Validate the destination before any copy action begins.
188
+
189
+ Raises:
190
+ ValueError: When the destination path is missing, equals the source repo,
191
+ or is not a directory.
192
+ """
193
+ if not fs.is_dir(destination_root):
194
+ raise ValueError(
195
+ "Invalid destination: destination directory does not exist: "
196
+ f"{destination_root}"
197
+ )
198
+ if destination_root.resolve() == repo_root.resolve():
199
+ raise ValueError(
200
+ "Invalid destination: destination must not be the source "
201
+ f"repository root: {destination_root}"
202
+ )
203
+
204
+
205
+ def build_artifact_path(
206
+ repo_root: Path,
207
+ started_at: datetime,
208
+ *,
209
+ artifact_root: Path | None = None,
210
+ artifact_directory: str = ARTIFACT_DIRECTORY,
211
+ ) -> Path:
212
+ """
213
+ Build the deterministic JSON summary artifact path for a push-down run.
214
+
215
+ Purpose:
216
+ Keep artifact naming stable and predictable for audits and automation.
217
+
218
+ Args:
219
+ repo_root (Path): Source repository root (used as default artifact root).
220
+ started_at (datetime): UTC timestamp captured at run start.
221
+ artifact_root (Path | None): Explicit artifact root for bundled execution.
222
+ Defaults to ``repo_root`` when ``None``.
223
+
224
+ Returns:
225
+ Path: Artifact path beneath the configured artifact directory.
226
+
227
+ Raises:
228
+ None.
229
+
230
+ Side Effects:
231
+ None.
232
+ """
233
+ effective_root = artifact_root if artifact_root is not None else repo_root
234
+ timestamp = started_at.strftime("%Y%m%dT%H%M%SZ")
235
+ return effective_root / artifact_directory / f"push-down-{timestamp}.json"
236
+
237
+
238
+ def render_push_down_summary(summary: PushDownSummary) -> str:
239
+ """
240
+ Render the push-down summary artifact as deterministic JSON.
241
+
242
+ Purpose:
243
+ Serialize summary output in a stable form for auditing and regression
244
+ tests.
245
+
246
+ Args:
247
+ summary (PushDownSummary): Completed push-down summary.
248
+
249
+ Returns:
250
+ str: Deterministic JSON payload.
251
+
252
+ Raises:
253
+ None.
254
+
255
+ Side Effects:
256
+ None.
257
+ """
258
+ payload: PushDownSummaryPayload = {
259
+ "repo_root": summary.repo_root,
260
+ "destination_root": summary.destination_root,
261
+ "started_at": summary.started_at.isoformat(),
262
+ "finished_at": summary.finished_at.isoformat(),
263
+ "created_count": summary.created_count,
264
+ "overwritten_count": summary.overwritten_count,
265
+ "rewritten_reference_count": summary.rewritten_reference_count,
266
+ "placeholder_rewrite_count": summary.placeholder_rewrite_count,
267
+ "unmatched_references": summary.unmatched_references,
268
+ "files": [asdict(result) for result in summary.files],
269
+ }
270
+ return json.dumps(payload, indent=2, sort_keys=True)
271
+
272
+
273
+ def write_summary_artifact(
274
+ fs: PushDownFileSystem,
275
+ repo_root: Path,
276
+ summary: PushDownSummary,
277
+ *,
278
+ artifact_root: Path | None = None,
279
+ artifact_directory: str = ARTIFACT_DIRECTORY,
280
+ ) -> Path:
281
+ """
282
+ Write the JSON summary artifact under `artifacts/copilot-customizations`.
283
+
284
+ Purpose:
285
+ Persist the run summary in the canonical artifact location.
286
+
287
+ Args:
288
+ fs (PushDownFileSystem): Filesystem adapter used for writes.
289
+ repo_root (Path): Source repository root.
290
+ summary (PushDownSummary): Summary to serialize.
291
+ artifact_root (Path | None): Explicit artifact root for bundled
292
+ execution. Defaults to ``repo_root`` when ``None``.
293
+
294
+ Returns:
295
+ Path: Written artifact path.
296
+
297
+ Raises:
298
+ OSError: Propagated when artifact creation fails.
299
+
300
+ Side Effects:
301
+ Creates the artifact directory and writes JSON to disk.
302
+ """
303
+ artifact_path = build_artifact_path(
304
+ repo_root,
305
+ summary.started_at,
306
+ artifact_root=artifact_root,
307
+ artifact_directory=artifact_directory,
308
+ )
309
+ fs.ensure_dir(artifact_path.parent)
310
+ fs.write_text(artifact_path, render_push_down_summary(summary))
311
+ return artifact_path
312
+
313
+
314
+ def resolve_cli_path(path_value: str | Path) -> Path:
315
+ """
316
+ Resolve CLI paths without breaking Windows absolute paths on Linux hosts.
317
+
318
+ Purpose:
319
+ Keep test-injected Windows paths stable when a Linux runner validates
320
+ the push-down CLIs against the in-memory filesystem doubles.
321
+
322
+ Args:
323
+ path_value (str | Path): CLI or test path value to normalize.
324
+
325
+ Returns:
326
+ Path: Expanded path that is resolved only when the host semantics match.
327
+ """
328
+ raw_value = str(path_value)
329
+ candidate = Path(raw_value).expanduser()
330
+ if os.name != "nt" and PureWindowsPath(raw_value).is_absolute():
331
+ return candidate
332
+ return candidate.resolve()
333
+
334
+
335
+ def push_down_customizations(
336
+ *,
337
+ repo_root: Path,
338
+ destination_root: Path,
339
+ fs: PushDownFileSystem,
340
+ source_root: Path | None = None,
341
+ artifact_root: Path | None = None,
342
+ root_folders: tuple[Path, ...] | None = None,
343
+ artifact_directory: str = ARTIFACT_DIRECTORY,
344
+ rewrite_references: RewriteFunction = rewrite_text_references,
345
+ ) -> PushDownSummary:
346
+ """
347
+ Copy scoped customizations into the destination workspace.
348
+
349
+ Purpose:
350
+ Execute validation, deterministic enumeration, text rewriting,
351
+ overwrite-aware writes, and summary artifact emission for the one-way
352
+ customization publisher.
353
+ """
354
+ effective_source = source_root if source_root is not None else repo_root
355
+ effective_artifact = artifact_root if artifact_root is not None else repo_root
356
+ validate_destination(destination_root, repo_root, fs)
357
+ started_at = datetime.now(timezone.utc)
358
+ created_count = 0
359
+ overwritten_count = 0
360
+ rewritten_reference_count = 0
361
+ placeholder_rewrite_count = 0
362
+ unmatched_references: list[str] = []
363
+ file_results: list[PushDownFileResult] = []
364
+
365
+ # Process files in stable order so artifacts and test expectations are reproducible.
366
+ for source_path in enumerate_source_files(
367
+ repo_root,
368
+ fs,
369
+ source_root=effective_source,
370
+ root_folders=root_folders,
371
+ ):
372
+ relative_path = source_path.relative_to(effective_source)
373
+ destination_path = destination_root / relative_path
374
+ destination_status = (
375
+ "overwritten" if fs.is_file(destination_path) else "created"
376
+ )
377
+ if destination_status == "created":
378
+ created_count += 1
379
+ else:
380
+ overwritten_count += 1
381
+
382
+ source_text = fs.read_text(source_path)
383
+ rewritten_text, rewritten_delta, placeholder_delta, unmatched = (
384
+ rewrite_references(source_text)
385
+ )
386
+ rewritten_reference_count += rewritten_delta
387
+ placeholder_rewrite_count += placeholder_delta
388
+ for reference in unmatched:
389
+ if reference not in unmatched_references:
390
+ unmatched_references.append(reference)
391
+
392
+ # Create the destination parent first so both write paths share one
393
+ # deterministic directory-preparation step.
394
+ fs.ensure_dir(destination_path.parent)
395
+ fs.write_text(destination_path, rewritten_text)
396
+ file_results.append(
397
+ PushDownFileResult(
398
+ relative_path=relative_path.as_posix(),
399
+ destination_status=destination_status,
400
+ rewritten_reference_count=rewritten_delta,
401
+ placeholder_rewrite_count=placeholder_delta,
402
+ unmatched_references=unmatched,
403
+ )
404
+ )
405
+
406
+ finished_at = datetime.now(timezone.utc)
407
+ provisional_summary = PushDownSummary(
408
+ repo_root=repo_root.as_posix(),
409
+ destination_root=destination_root.as_posix(),
410
+ started_at=started_at,
411
+ finished_at=finished_at,
412
+ created_count=created_count,
413
+ overwritten_count=overwritten_count,
414
+ rewritten_reference_count=rewritten_reference_count,
415
+ placeholder_rewrite_count=placeholder_rewrite_count,
416
+ unmatched_references=unmatched_references,
417
+ files=file_results,
418
+ artifact_path="",
419
+ )
420
+ artifact_path = write_summary_artifact(
421
+ fs,
422
+ repo_root,
423
+ provisional_summary,
424
+ artifact_root=effective_artifact,
425
+ artifact_directory=artifact_directory,
426
+ )
427
+ return PushDownSummary(
428
+ repo_root=provisional_summary.repo_root,
429
+ destination_root=provisional_summary.destination_root,
430
+ started_at=provisional_summary.started_at,
431
+ finished_at=provisional_summary.finished_at,
432
+ created_count=provisional_summary.created_count,
433
+ overwritten_count=provisional_summary.overwritten_count,
434
+ rewritten_reference_count=provisional_summary.rewritten_reference_count,
435
+ placeholder_rewrite_count=provisional_summary.placeholder_rewrite_count,
436
+ unmatched_references=provisional_summary.unmatched_references,
437
+ files=provisional_summary.files,
438
+ artifact_path=artifact_path.as_posix(),
439
+ )
440
+
441
+
442
+ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
443
+ """
444
+ Parse CLI arguments for the push-down publisher.
445
+
446
+ Purpose:
447
+ Define the stable CLI contract for callers using the module entry point.
448
+
449
+ Args:
450
+ argv (list[str] | None): Optional argument list for tests or embedding.
451
+
452
+ Returns:
453
+ argparse.Namespace: Parsed command-line arguments.
454
+
455
+ Raises:
456
+ SystemExit: Raised by `argparse` when arguments are invalid.
457
+
458
+ Side Effects:
459
+ Emits usage/help text through `argparse` when parsing fails.
460
+ """
461
+ parser = argparse.ArgumentParser(
462
+ description=(
463
+ "Publish scoped Copilot customizations with "
464
+ f"python -m {MODULE_ENTRY_POINT}."
465
+ )
466
+ )
467
+ parser.add_argument(
468
+ "--destination",
469
+ required=True,
470
+ help="Destination workspace root that will receive the copied .github trees.",
471
+ )
472
+ return parser.parse_args(argv)
473
+
474
+
475
+ def main(
476
+ argv: list[str] | None = None,
477
+ *,
478
+ repo_root: Path | None = None,
479
+ fs: PushDownFileSystem | None = None,
480
+ ) -> int:
481
+ """
482
+ Run the push-down publisher CLI.
483
+
484
+ Purpose:
485
+ Parse arguments, resolve defaults, execute the publisher, and print the
486
+ JSON summary artifact path on success.
487
+ """
488
+ args = parse_args(argv)
489
+ resolved_repo_root = resolve_cli_path(repo_root or Path.cwd())
490
+ resolved_destination = resolve_cli_path(args.destination)
491
+ resolved_fs = fs or RealPushDownFileSystem()
492
+ summary = push_down_customizations(
493
+ repo_root=resolved_repo_root,
494
+ destination_root=resolved_destination,
495
+ fs=resolved_fs,
496
+ source_root=resolved_repo_root,
497
+ artifact_root=resolved_repo_root,
498
+ )
499
+ print(f"Wrote push-down summary artifact to: {summary.artifact_path}")
500
+ return 0
501
+
502
+
503
+ if __name__ == "__main__":
504
+ raise SystemExit(main())