@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.
- package/LICENSE +21 -0
- package/README.md +50 -0
- package/out/mcp-server.js +17323 -0
- package/package.json +36 -0
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +3 -0
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_repo_root_is_source_of_truth.md +11 -0
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_vsce_verify_package_location.md +19 -0
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/project_extension_location.md +11 -0
- package/resources/claude-customizations/.claude/agent-memory/prd-feature/MEMORY.md +1 -0
- package/resources/claude-customizations/.claude/agent-memory/prd-feature/project_push_down_pattern.md +13 -0
- package/resources/claude-customizations/.claude/agent-memory/task-researcher/MEMORY.md +3 -0
- package/resources/claude-customizations/.claude/agent-memory/task-researcher/project_push_down_claude_dir.md +11 -0
- package/resources/claude-customizations/.claude/agents/atomic-executor.md +135 -0
- package/resources/claude-customizations/.claude/agents/atomic-planner.md +71 -0
- package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +69 -0
- package/resources/claude-customizations/.claude/agents/epic-review.md +40 -0
- package/resources/claude-customizations/.claude/agents/feature-review.md +136 -0
- package/resources/claude-customizations/.claude/agents/orchestrator.md +83 -0
- package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +80 -0
- package/resources/claude-customizations/.claude/agents/prd-feature.md +42 -0
- package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +72 -0
- package/resources/claude-customizations/.claude/agents/staged-review.md +41 -0
- package/resources/claude-customizations/.claude/agents/status-updater.md +41 -0
- package/resources/claude-customizations/.claude/agents/task-researcher.md +81 -0
- package/resources/claude-customizations/.claude/agents/typescript-engineer.md +24 -0
- package/resources/claude-customizations/.claude/hooks/check-powershell-test-purity.ps1 +111 -0
- package/resources/claude-customizations/.claude/hooks/check-python-test-purity.ps1 +146 -0
- package/resources/claude-customizations/.claude/hooks/enforce-evidence-locations.ps1 +150 -0
- package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +238 -0
- package/resources/claude-customizations/.claude/hooks/enforce-promotion-mcp-only.ps1 +147 -0
- package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +235 -0
- package/resources/claude-customizations/.claude/hooks/validate-bash.ps1 +69 -0
- package/resources/claude-customizations/.claude/hooks/validate-executor-output.ps1 +296 -0
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage.ps1 +389 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +141 -0
- package/resources/claude-customizations/.claude/hooks/validate-planner-output.ps1 +288 -0
- package/resources/claude-customizations/.claude/hooks/validate-required-artifact-output.ps1 +171 -0
- package/resources/claude-customizations/.claude/hooks/validate-task-researcher-output.ps1 +142 -0
- package/resources/claude-customizations/.claude/rules/csharp.md +62 -0
- package/resources/claude-customizations/.claude/rules/general-code-change.md +71 -0
- package/resources/claude-customizations/.claude/rules/general-unit-test.md +60 -0
- package/resources/claude-customizations/.claude/rules/powershell.md +97 -0
- package/resources/claude-customizations/.claude/rules/python-suppressions.md +143 -0
- package/resources/claude-customizations/.claude/rules/python.md +99 -0
- package/resources/claude-customizations/.claude/rules/self-explanatory-code-commenting.md +97 -0
- package/resources/claude-customizations/.claude/rules/tonality.md +80 -0
- package/resources/claude-customizations/.claude/rules/typescript-suppressions.md +66 -0
- package/resources/claude-customizations/.claude/rules/typescript.md +45 -0
- package/resources/claude-customizations/.claude/settings.json +144 -0
- package/resources/claude-customizations/.claude/skills/acceptance-criteria-tracking/SKILL.md +102 -0
- package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +189 -0
- package/resources/claude-customizations/.claude/skills/commit-message/SKILL.md +65 -0
- package/resources/claude-customizations/.claude/skills/csharp-change-budget-router/SKILL.md +90 -0
- package/resources/claude-customizations/.claude/skills/csharp-orchestration-state-machine/SKILL.md +58 -0
- package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +77 -0
- package/resources/claude-customizations/.claude/skills/evidence-and-timestamp-conventions/SKILL.md +164 -0
- package/resources/claude-customizations/.claude/skills/execute-hard-lock/SKILL.md +82 -0
- package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +115 -0
- package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +167 -0
- package/resources/claude-customizations/.claude/skills/fill-feature-docs/SKILL.md +22 -0
- package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +64 -0
- package/resources/claude-customizations/.claude/skills/invoke-powershell-engineer/SKILL.md +65 -0
- package/resources/claude-customizations/.claude/skills/invoke-python-engineer/SKILL.md +64 -0
- package/resources/claude-customizations/.claude/skills/make-skill-template/SKILL.md +147 -0
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +132 -0
- package/resources/claude-customizations/.claude/skills/policy-audit-template-usage/SKILL.md +49 -0
- package/resources/claude-customizations/.claude/skills/policy-compliance-order/SKILL.md +40 -0
- package/resources/claude-customizations/.claude/skills/powershell-change-budget-router/SKILL.md +49 -0
- package/resources/claude-customizations/.claude/skills/powershell-orchestration-state-machine/SKILL.md +58 -0
- package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +77 -0
- package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +50 -0
- package/resources/claude-customizations/.claude/skills/pr-base-branch-merge-base/SKILL.md +56 -0
- package/resources/claude-customizations/.claude/skills/pr-context-artifacts/SKILL.md +30 -0
- package/resources/claude-customizations/.claude/skills/python-change-budget-router/SKILL.md +79 -0
- package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +77 -0
- package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +40 -0
- package/resources/claude-customizations/.claude/skills/research-issue/SKILL.md +67 -0
- package/resources/claude-customizations/.claude/skills/review-epic/SKILL.md +21 -0
- package/resources/claude-customizations/.claude/skills/review-feature/SKILL.md +25 -0
- package/resources/claude-customizations/.claude/skills/review-staged/SKILL.md +21 -0
- package/resources/claude-customizations/.claude/skills/skill-canonical-location-audit/SKILL.md +49 -0
- package/resources/claude-customizations/.claude/skills/translate-copilot-to-claude/SKILL.md +295 -0
- package/resources/claude-customizations/.claude/skills/update-status/SKILL.md +21 -0
- package/resources/claude-dir-customizations/.mcp.json +8 -0
- package/resources/codex-and-agents-customizations/.agents/README.md +86 -0
- package/resources/codex-and-agents-customizations/.agents/skills/README.md +49 -0
- package/resources/codex-and-agents-customizations/.agents/skills/acceptance-criteria-tracking/SKILL.md +107 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-executor/SKILL.md +73 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +194 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +87 -0
- package/resources/codex-and-agents-customizations/.agents/skills/commit-message/SKILL.md +70 -0
- package/resources/codex-and-agents-customizations/.agents/skills/commit-message-conventions/SKILL.md +95 -0
- package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +67 -0
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-change-budget-router/SKILL.md +94 -0
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-orchestration-state-machine/SKILL.md +64 -0
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +82 -0
- package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +168 -0
- package/resources/codex-and-agents-customizations/.agents/skills/execute-hard-lock/SKILL.md +88 -0
- package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +129 -0
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +106 -0
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +181 -0
- package/resources/codex-and-agents-customizations/.agents/skills/fill-feature-docs/SKILL.md +27 -0
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +73 -0
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +74 -0
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +73 -0
- package/resources/codex-and-agents-customizations/.agents/skills/make-skill-template/SKILL.md +152 -0
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +143 -0
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +317 -0
- package/resources/codex-and-agents-customizations/.agents/skills/policy-audit-template-usage/SKILL.md +53 -0
- package/resources/codex-and-agents-customizations/.agents/skills/policy-compliance-order/SKILL.md +49 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +102 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell-change-budget-router/SKILL.md +53 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell-orchestration-state-machine/SKILL.md +64 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +83 -0
- package/resources/codex-and-agents-customizations/.agents/skills/pr-author/SKILL.md +55 -0
- package/resources/codex-and-agents-customizations/.agents/skills/pr-authoring/SKILL.md +124 -0
- package/resources/codex-and-agents-customizations/.agents/skills/pr-base-branch-merge-base/SKILL.md +60 -0
- package/resources/codex-and-agents-customizations/.agents/skills/pr-context-artifacts/SKILL.md +34 -0
- package/resources/codex-and-agents-customizations/.agents/skills/python/SKILL.md +104 -0
- package/resources/codex-and-agents-customizations/.agents/skills/python-change-budget-router/SKILL.md +84 -0
- package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +82 -0
- package/resources/codex-and-agents-customizations/.agents/skills/python-suppressions/SKILL.md +148 -0
- package/resources/codex-and-agents-customizations/.agents/skills/remediation-handoff-atomic-planner/SKILL.md +49 -0
- package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +142 -0
- package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/agents/openai.yaml +5 -0
- package/resources/codex-and-agents-customizations/.agents/skills/research-issue/SKILL.md +72 -0
- package/resources/codex-and-agents-customizations/.agents/skills/review-epic/SKILL.md +26 -0
- package/resources/codex-and-agents-customizations/.agents/skills/review-feature/SKILL.md +30 -0
- package/resources/codex-and-agents-customizations/.agents/skills/review-staged/SKILL.md +26 -0
- package/resources/codex-and-agents-customizations/.agents/skills/self-explanatory-code-commenting/SKILL.md +102 -0
- package/resources/codex-and-agents-customizations/.agents/skills/skill-canonical-location-audit/SKILL.md +52 -0
- package/resources/codex-and-agents-customizations/.agents/skills/translate-copilot-to-claude/SKILL.md +317 -0
- package/resources/codex-and-agents-customizations/.agents/skills/typescript/SKILL.md +50 -0
- package/resources/codex-and-agents-customizations/.agents/skills/typescript-suppressions/SKILL.md +71 -0
- package/resources/codex-and-agents-customizations/.agents/skills/update-status/SKILL.md +26 -0
- package/resources/codex-and-agents-customizations/.codex/agents/5.1-beast-adjusted.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/5.1-thinking-beast-mode-adjusted.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/api-architect.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +151 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +93 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planning.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/commentary-remediation.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/commit-steward.toml +20 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-executor.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-planning.toml +25 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-orchestrator.toml +56 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +97 -0
- package/resources/codex-and-agents-customizations/.codex/agents/epic-review.toml +52 -0
- package/resources/codex-and-agents-customizations/.codex/agents/expert-nextjs-developer.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/expert-react-frontend-engineer.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +149 -0
- package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer.toml +60 -0
- package/resources/codex-and-agents-customizations/.codex/agents/gpt-5-beast-mode.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/hlbpa.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/mentor.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +121 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-planning.toml +25 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-di-unit-test-engineer.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-orchestrator.toml +56 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +108 -0
- package/resources/codex-and-agents-customizations/.codex/agents/pr-author.toml +26 -0
- package/resources/codex-and-agents-customizations/.codex/agents/prd-feature.toml +53 -0
- package/resources/codex-and-agents-customizations/.codex/agents/prd.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/pytest-unit-test-coding.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-executor.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-planning.toml +25 -0
- package/resources/codex-and-agents-customizations/.codex/agents/python-execution-only-typed.toml +24 -0
- package/resources/codex-and-agents-customizations/.codex/agents/python-orchestrator.toml +54 -0
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +100 -0
- package/resources/codex-and-agents-customizations/.codex/agents/staged-review.toml +53 -0
- package/resources/codex-and-agents-customizations/.codex/agents/status-updater.toml +53 -0
- package/resources/codex-and-agents-customizations/.codex/agents/task-researcher.toml +103 -0
- package/resources/codex-and-agents-customizations/.codex/agents/tdd-green.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/tdd-red.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/tdd-refactor.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer.toml +48 -0
- package/resources/codex-and-agents-customizations/.codex/agents/voidbeast-gpt41enhanced.toml +23 -0
- package/resources/codex-and-agents-customizations/.codex/codex-web-setup.plan.md +26 -0
- package/resources/codex-and-agents-customizations/.codex/codex-web-setup.sh +384 -0
- package/resources/codex-and-agents-customizations/.codex/config.toml +137 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/check-powershell-test-purity.ps1 +113 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/check-python-test-purity.ps1 +149 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-evidence-locations.ps1 +153 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +241 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-promotion-mcp-only.ps1 +150 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +238 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-bash.ps1 +72 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +265 -0
- package/resources/codex-and-agents-customizations/.codex/prompts/feature-review-remediate.md +10 -0
- package/resources/codex-and-agents-customizations/.codex/prompts/generate-commit-message-repo.md +11 -0
- package/resources/codex-and-agents-customizations/.codex/prompts/generate-pr.md +15 -0
- package/resources/codex-and-agents-customizations/.codex/prompts/orchestrate-work.md +22 -0
- package/resources/codex-and-agents-customizations/AGENTS.md +317 -0
- package/resources/customizations/.github/agents/5.1-Beast-adjusted.agent.md +181 -0
- package/resources/customizations/.github/agents/5.1-Thinking-Beast-Mode-adjusted.agent.md +361 -0
- package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +192 -0
- package/resources/customizations/.github/agents/api-architect.agent.md +40 -0
- package/resources/customizations/.github/agents/atomic_executor.agent.md +251 -0
- package/resources/customizations/.github/agents/atomic_planning.agent.md +658 -0
- package/resources/customizations/.github/agents/commentary-remediation.agent.md +35 -0
- package/resources/customizations/.github/agents/commit-steward.agent.md +200 -0
- package/resources/customizations/.github/agents/csharp-atomic-executor.agent.md +288 -0
- package/resources/customizations/.github/agents/csharp-atomic-planning.agent.md +354 -0
- package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +375 -0
- package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +285 -0
- package/resources/customizations/.github/agents/epic-review.agent.md +374 -0
- package/resources/customizations/.github/agents/expert-nextjs-developer.agent.md +477 -0
- package/resources/customizations/.github/agents/expert-react-frontend-engineer.agent.md +739 -0
- package/resources/customizations/.github/agents/feature-review.agent.md +49 -0
- package/resources/customizations/.github/agents/gpt-5-beast-mode.agent.md +116 -0
- package/resources/customizations/.github/agents/hlbpa.agent.md +219 -0
- package/resources/customizations/.github/agents/mentor.agent.md +32 -0
- package/resources/customizations/.github/agents/orchestrator.agent.md +449 -0
- package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +287 -0
- package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +647 -0
- package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +382 -0
- package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +293 -0
- package/resources/customizations/.github/agents/pr-author.agent.md +138 -0
- package/resources/customizations/.github/agents/prd-feature.agent.md +52 -0
- package/resources/customizations/.github/agents/prd.agent.md +202 -0
- package/resources/customizations/.github/agents/pytest-unit-test-coding.agent.md +202 -0
- package/resources/customizations/.github/agents/python-atomic-executor.agent.md +289 -0
- package/resources/customizations/.github/agents/python-atomic-planning.agent.md +429 -0
- package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +217 -0
- package/resources/customizations/.github/agents/python-orchestrator.agent.md +380 -0
- package/resources/customizations/.github/agents/python-typed-engineer.agent.md +271 -0
- package/resources/customizations/.github/agents/staged-review.agent.md +246 -0
- package/resources/customizations/.github/agents/status_updater.agent.md +279 -0
- package/resources/customizations/.github/agents/task-researcher.agent.md +298 -0
- package/resources/customizations/.github/agents/tdd-green.agent.md +60 -0
- package/resources/customizations/.github/agents/tdd-red.agent.md +66 -0
- package/resources/customizations/.github/agents/tdd-refactor.agent.md +94 -0
- package/resources/customizations/.github/agents/typescript-engineer.agent.md +167 -0
- package/resources/customizations/.github/agents/voidbeast-gpt41enhanced.agent.md +230 -0
- package/resources/customizations/.github/codex/execute-hard-lock.prompt.md +105 -0
- package/resources/customizations/.github/codex/resume-hard-lock.prompt.md +92 -0
- package/resources/customizations/.github/copilot-instructions.md +7 -0
- package/resources/customizations/.github/instructions/csharp-code-change.instructions.md +184 -0
- package/resources/customizations/.github/instructions/csharp-unit-test.instructions.md +52 -0
- package/resources/customizations/.github/instructions/general-code-change.instructions.md +290 -0
- package/resources/customizations/.github/instructions/general-unit-test.instructions.md +106 -0
- package/resources/customizations/.github/instructions/github-actions-ci-cd-best-practices.instructions.md +607 -0
- package/resources/customizations/.github/instructions/github-actions.instructions.md +23 -0
- package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +81 -0
- package/resources/customizations/.github/instructions/powershell-unit-test.instructions.md +69 -0
- package/resources/customizations/.github/instructions/python-code-change.instructions.md +232 -0
- package/resources/customizations/.github/instructions/python-suppressions.instructions.md +609 -0
- package/resources/customizations/.github/instructions/python-unit-test.instructions.md +71 -0
- package/resources/customizations/.github/instructions/self-explanatory-code-commenting.instructions.md +238 -0
- package/resources/customizations/.github/instructions/tonality.instructions.md +133 -0
- package/resources/customizations/.github/instructions/typescript-code-change.instructions.md +203 -0
- package/resources/customizations/.github/instructions/typescript-suppressions.instructions.md +157 -0
- package/resources/customizations/.github/instructions/typescript-unit-test.instructions.md +112 -0
- package/resources/customizations/.github/prompts/add-educational-comments.prompt.md +129 -0
- package/resources/customizations/.github/prompts/breakdown-bug-prd.prompt.md +29 -0
- package/resources/customizations/.github/prompts/breakdown-epic-arch.prompt.md +66 -0
- package/resources/customizations/.github/prompts/breakdown-epic-pm.prompt.md +58 -0
- package/resources/customizations/.github/prompts/breakdown-feature-implementation.prompt.md +128 -0
- package/resources/customizations/.github/prompts/breakdown-feature-prd.prompt.md +61 -0
- package/resources/customizations/.github/prompts/code-exemplars-blueprint-generator.prompt.md +126 -0
- package/resources/customizations/.github/prompts/drafts/create-github-issues-feature-from-implementation-plan.prompt.md +28 -0
- package/resources/customizations/.github/prompts/drafts/create-implementation-plan.prompt.md +158 -0
- package/resources/customizations/.github/prompts/drafts/create-technical-spike.prompt.md +231 -0
- package/resources/customizations/.github/prompts/drafts/potential-feature-prd.prompt.md +19 -0
- package/resources/customizations/.github/prompts/drafts/update-implementation-plan.prompt.md +158 -0
- package/resources/customizations/.github/prompts/execute-plan-template.md +21 -0
- package/resources/customizations/.github/prompts/export-chat.prompt.md +7 -0
- package/resources/customizations/.github/prompts/fillout-prd-feature.prompt.md +46 -0
- package/resources/customizations/.github/prompts/generate-atomic-plan.prompt.md +96 -0
- package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +108 -0
- package/resources/customizations/.github/prompts/generate-pr.prompt.md +151 -0
- package/resources/customizations/.github/prompts/javascript-typescript-jest.prompt.md +44 -0
- package/resources/customizations/.github/prompts/orchestrate-csharp-work.prompt.md +66 -0
- package/resources/customizations/.github/prompts/orchestrate-powershell-work.prompt.md +50 -0
- package/resources/customizations/.github/prompts/orchestrate-python-work.prompt.md +50 -0
- package/resources/customizations/.github/prompts/orchestrate-work.prompt.md +66 -0
- package/resources/customizations/.github/prompts/remediate-comments.prompt.md +53 -0
- package/resources/customizations/.github/prompts/research-issue.prompt.md +125 -0
- package/resources/customizations/.github/prompts/review-epic.prompt.md +94 -0
- package/resources/customizations/.github/prompts/review-feature.prompt.md +130 -0
- package/resources/customizations/.github/prompts/review-staged.prompt.md +43 -0
- package/resources/customizations/.github/prompts/update_status.prompt.md +68 -0
- package/resources/customizations/.github/skills/README.md +26 -0
- package/resources/customizations/.github/skills/acceptance-criteria-tracking/SKILL.md +102 -0
- package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +174 -0
- package/resources/customizations/.github/skills/csharp-change-budget-router/SKILL.md +48 -0
- package/resources/customizations/.github/skills/csharp-orchestration-state-machine/SKILL.md +57 -0
- package/resources/customizations/.github/skills/evidence-and-timestamp-conventions/SKILL.md +135 -0
- package/resources/customizations/.github/skills/feature-promotion-lifecycle/SKILL.md +121 -0
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +153 -0
- package/resources/customizations/.github/skills/make-skill-template/SKILL.md +147 -0
- package/resources/customizations/.github/skills/policy-audit-template-usage/SKILL.md +48 -0
- package/resources/customizations/.github/skills/policy-compliance-order/SKILL.md +37 -0
- package/resources/customizations/.github/skills/powershell-change-budget-router/SKILL.md +48 -0
- package/resources/customizations/.github/skills/powershell-orchestration-state-machine/SKILL.md +57 -0
- package/resources/customizations/.github/skills/pr-base-branch-merge-base/SKILL.md +55 -0
- package/resources/customizations/.github/skills/pr-context-artifacts/SKILL.md +29 -0
- package/resources/customizations/.github/skills/remediation-handoff-atomic-planner/SKILL.md +39 -0
- package/resources/customizations/.github/skills/skill-canonical-location-audit/SKILL.md +48 -0
- package/resources/feature-templates/bug/plan.yyyy-MM-ddTHH-mm.md +44 -0
- package/resources/feature-templates/bug/potential_bug.md +59 -0
- package/resources/feature-templates/bug/spec.md +99 -0
- package/resources/feature-templates/epic/initiative.md +43 -0
- package/resources/feature-templates/feature/plan.yyyy-MM-ddTHH-mm.md +53 -0
- package/resources/feature-templates/feature/spec.md +66 -0
- package/resources/feature-templates/feature/user-story.md +42 -0
- package/resources/feature-templates/potential/template.md +33 -0
- package/resources/feature-templates/refactor/plan.yyyy-MM-ddTHH-mm.md +52 -0
- package/resources/feature-templates/refactor/spec.md +69 -0
- package/resources/powershell/PoshQC/PoshQC.Analyzer.psm1 +254 -0
- package/resources/powershell/PoshQC/PoshQC.FileDiscovery.psm1 +138 -0
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +409 -0
- package/resources/powershell/PoshQC/PoshQC.psd1 +31 -0
- package/resources/powershell/PoshQC/PoshQC.psm1 +101 -0
- package/resources/powershell/PoshQC/README.md +80 -0
- package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +59 -0
- package/resources/powershell/PoshQC/settings/pssa.settings.psd1 +55 -0
- package/resources/scripts/dev_tools/__init__.py +0 -0
- package/resources/scripts/dev_tools/agentic_sync.py +819 -0
- package/resources/scripts/dev_tools/codex_native_converter/__init__.py +11 -0
- package/resources/scripts/dev_tools/codex_native_converter/__main__.py +6 -0
- package/resources/scripts/dev_tools/codex_native_converter/cli.py +11 -0
- package/resources/scripts/dev_tools/new_active_feature_folder.py +79 -0
- package/resources/scripts/dev_tools/new_active_feature_folder_docs.py +268 -0
- package/resources/scripts/dev_tools/new_active_feature_folder_flow.py +366 -0
- package/resources/scripts/dev_tools/new_active_feature_folder_io.py +306 -0
- package/resources/scripts/dev_tools/new_active_feature_folder_markdown.py +252 -0
- package/resources/scripts/dev_tools/new_active_feature_folder_models.py +136 -0
- package/resources/scripts/dev_tools/new_potential_bug_entry.py +465 -0
- package/resources/scripts/dev_tools/potential_to_issue.py +421 -0
- package/resources/scripts/dev_tools/potential_to_issue_content.py +212 -0
- package/resources/scripts/dev_tools/pr_context/__init__.py +0 -0
- package/resources/scripts/dev_tools/pr_context/collector.py +619 -0
- package/resources/scripts/dev_tools/pr_context/feature_docs.py +349 -0
- package/resources/scripts/dev_tools/pr_context/git.py +153 -0
- package/resources/scripts/dev_tools/pr_context/github.py +549 -0
- package/resources/scripts/dev_tools/pr_context/models.py +198 -0
- package/resources/scripts/dev_tools/pr_context/render.py +342 -0
- package/resources/scripts/dev_tools/pr_context/render_feature_excerpts.py +256 -0
- package/resources/scripts/dev_tools/pr_context/render_pr_helpers.py +291 -0
- package/resources/scripts/dev_tools/pr_context/summary_helpers.py +386 -0
- package/resources/scripts/dev_tools/pr_context/verification_evidence.py +171 -0
- package/resources/scripts/dev_tools/prompt_mode_contract.py +152 -0
- package/resources/scripts/dev_tools/push_down_claude_customizations.py +188 -0
- package/resources/scripts/dev_tools/push_down_codex_and_agents_customizations.py +139 -0
- package/resources/scripts/dev_tools/push_down_copilot_customizations.py +504 -0
- package/resources/scripts/dev_tools/push_down_copilot_customizations_filesystem.py +217 -0
- package/resources/scripts/dev_tools/push_down_copilot_customizations_rewrites.py +293 -0
- package/resources/scripts/dev_tools/resolve_file_prompt.py +457 -0
- package/resources/scripts/dev_tools/resolve_hard_lock_prompt.py +444 -0
- package/resources/scripts/dev_tools/validate_orchestration_artifacts.py +554 -0
- package/resources/templates/codex_native_converter.py +35 -0
- package/resources/templates/collect_commit_context.py +212 -0
- package/resources/templates/collect_pr_context.py +74 -0
- package/resources/templates/hello_pwsh.ps1 +3 -0
- package/resources/templates/hello_python.py +11 -0
- package/resources/templates/link-parent-child.ps1 +480 -0
- package/resources/templates/new-claude-worktree-session.ps1 +232 -0
- package/resources/templates/new-potential-entry.ps1 +187 -0
- package/resources/templates/new_active_feature_folder.py +67 -0
- package/resources/templates/new_potential_bug_entry.py +54 -0
- package/resources/templates/policy_audit/AGENTS.md +117 -0
- package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +165 -0
- package/resources/templates/policy_audit/feature-audit.yyyy-MM-ddTHH-mm.md +124 -0
- package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +649 -0
- package/resources/templates/potential_to_issue.py +55 -0
- package/resources/templates/push_down_claude_customizations.py +188 -0
- package/resources/templates/push_down_codex_and_agents_customizations.py +95 -0
- package/resources/templates/push_down_copilot_customizations.py +124 -0
- package/resources/templates/resolve_atomic_plan_prompt.py +75 -0
- package/resources/templates/resolve_hard_lock_prompt.py +65 -0
- package/resources/templates/run-poshqc-analyze-autofix.ps1 +16 -0
- package/resources/templates/run-poshqc-analyze.ps1 +26 -0
- package/resources/templates/run-poshqc-format.ps1 +26 -0
- package/resources/templates/run-poshqc-suite.ps1 +24 -0
- package/resources/templates/run-poshqc-test.ps1 +32 -0
- package/resources/templates/sync-agents-from-instructions.ps1 +400 -0
- package/resources/templates/validate_orchestration_artifacts.py +55 -0
- 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())
|