@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,444 @@
|
|
|
1
|
+
"""Resolve the execute-hard-lock prompt with the plan file path.
|
|
2
|
+
|
|
3
|
+
Purpose:
|
|
4
|
+
This helper resolves the active plan file path from the target file,
|
|
5
|
+
substitutes the ${plan-path} variable into the execute-hard-lock.prompt.md
|
|
6
|
+
template, prints the result, and attempts to copy it to the clipboard for
|
|
7
|
+
pasting into Copilot Chat.
|
|
8
|
+
|
|
9
|
+
Supported variables:
|
|
10
|
+
- ${plan-path}: Workspace-relative path to the target plan file (forward
|
|
11
|
+
slashes).
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
python resolve_hard_lock_prompt.py --target <path_to_plan_file>
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import shutil
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
from dev_tools.prompt_mode_contract import (
|
|
26
|
+
build_fallback_reason,
|
|
27
|
+
resolve_selected_work_mode,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _resolve_template_name(template_kind: str) -> str:
|
|
32
|
+
"""Map the CLI template-kind flag to a concrete template filename.
|
|
33
|
+
|
|
34
|
+
Purpose:
|
|
35
|
+
Keeps filename selection centralized so both root and bundled callers
|
|
36
|
+
resolve the same prompt asset names for `execute` and `resume` flows.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
template_kind: CLI selector constrained to `execute` or `resume`.
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
str: The prompt filename associated with the requested template kind.
|
|
43
|
+
|
|
44
|
+
Side Effects:
|
|
45
|
+
None.
|
|
46
|
+
"""
|
|
47
|
+
return (
|
|
48
|
+
"execute-hard-lock.prompt.md"
|
|
49
|
+
if template_kind == "execute"
|
|
50
|
+
else "resume-hard-lock.prompt.md"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _resolve_template_path(
|
|
55
|
+
template_name: str,
|
|
56
|
+
workspace_root: Path,
|
|
57
|
+
template_root: Path | None,
|
|
58
|
+
) -> tuple[Path | None, tuple[Path, ...]]:
|
|
59
|
+
"""Resolve the first available prompt template path in deterministic order.
|
|
60
|
+
|
|
61
|
+
Purpose:
|
|
62
|
+
Supports bundled extension resources by checking an explicit template
|
|
63
|
+
root first while preserving the existing workspace `.github/codex`
|
|
64
|
+
fallback for repo-root usage.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
template_name: Prompt filename to resolve.
|
|
68
|
+
workspace_root: Workspace root used for repo-local fallback lookup.
|
|
69
|
+
template_root: Optional explicit template directory to probe first.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
tuple[Path | None, tuple[Path, ...]]: The selected template path when
|
|
73
|
+
found, plus the ordered list of checked candidate paths.
|
|
74
|
+
|
|
75
|
+
Side Effects:
|
|
76
|
+
None.
|
|
77
|
+
"""
|
|
78
|
+
candidates: list[Path] = []
|
|
79
|
+
if template_root is not None:
|
|
80
|
+
candidates.append(template_root / template_name)
|
|
81
|
+
candidates.append(workspace_root / ".github" / "codex" / template_name)
|
|
82
|
+
|
|
83
|
+
# Probe the explicit template root before the workspace fallback so bundled
|
|
84
|
+
# extension resources stay authoritative when they are intentionally passed.
|
|
85
|
+
for candidate in candidates:
|
|
86
|
+
if candidate.exists():
|
|
87
|
+
return candidate, tuple(candidates)
|
|
88
|
+
|
|
89
|
+
return None, tuple(candidates)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def copy_to_clipboard(text: str) -> bool:
|
|
93
|
+
"""Attempt to copy text to the clipboard using common tools.
|
|
94
|
+
|
|
95
|
+
Purpose:
|
|
96
|
+
Provides cross-platform clipboard support using either pyperclip
|
|
97
|
+
(if installed) or native system clipboard commands.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
text: The text to copy to the clipboard.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
True on success, False if no supported clipboard mechanism is found.
|
|
104
|
+
|
|
105
|
+
Side Effects:
|
|
106
|
+
Writes to the system clipboard.
|
|
107
|
+
Prints error to stderr if pyperclip fails.
|
|
108
|
+
"""
|
|
109
|
+
try:
|
|
110
|
+
import pyperclip # type: ignore[import-untyped]
|
|
111
|
+
except ImportError:
|
|
112
|
+
pyperclip = None # type: ignore[assignment]
|
|
113
|
+
|
|
114
|
+
pyperclip_error: Exception | None = None
|
|
115
|
+
if pyperclip is not None:
|
|
116
|
+
try:
|
|
117
|
+
pyperclip.copy(text)
|
|
118
|
+
return True
|
|
119
|
+
except Exception as error: # noqa: BLE001 - CLI top-level error handling
|
|
120
|
+
pyperclip_error = error
|
|
121
|
+
|
|
122
|
+
# Fallback chain: try common clipboard commands across platforms
|
|
123
|
+
commands: tuple[list[str], ...] = (
|
|
124
|
+
["pbcopy"],
|
|
125
|
+
["wl-copy"],
|
|
126
|
+
["xclip", "-selection", "clipboard"],
|
|
127
|
+
["xsel", "--clipboard", "--input"],
|
|
128
|
+
["clip"],
|
|
129
|
+
["clip.exe"],
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
for command in commands:
|
|
133
|
+
executable = shutil.which(command[0])
|
|
134
|
+
if executable is None:
|
|
135
|
+
continue
|
|
136
|
+
try:
|
|
137
|
+
subprocess.run( # noqa: S603 - static analysis can't verify runtime validation
|
|
138
|
+
[executable, *command[1:]],
|
|
139
|
+
input=text,
|
|
140
|
+
text=True,
|
|
141
|
+
check=True,
|
|
142
|
+
)
|
|
143
|
+
return True
|
|
144
|
+
except subprocess.CalledProcessError:
|
|
145
|
+
continue
|
|
146
|
+
|
|
147
|
+
if pyperclip_error is not None:
|
|
148
|
+
print(f"pyperclip copy failed: {pyperclip_error}", file=sys.stderr)
|
|
149
|
+
|
|
150
|
+
return False
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _try_relative_to_workspace(path: Path, workspace_root: Path) -> Path:
|
|
154
|
+
"""Return path relative to workspace_root when possible.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
path: The path to make relative.
|
|
158
|
+
workspace_root: The workspace root directory.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
The relative path if possible, otherwise the original path.
|
|
162
|
+
"""
|
|
163
|
+
try:
|
|
164
|
+
return path.resolve().relative_to(workspace_root.resolve())
|
|
165
|
+
except ValueError:
|
|
166
|
+
return path
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _write_resolved_prompt(
|
|
170
|
+
resolved_prompt: str,
|
|
171
|
+
output_path: Path,
|
|
172
|
+
workspace_root: Path,
|
|
173
|
+
) -> Path:
|
|
174
|
+
"""Persist the resolved prompt text to a UTF-8 file, creating parents.
|
|
175
|
+
|
|
176
|
+
Purpose:
|
|
177
|
+
Provide a deterministic file-write side channel for non-interactive MCP
|
|
178
|
+
callers that cannot capture stdout from the wrapping ``executeScript``
|
|
179
|
+
invocation. Mirrors ``--target`` resolution: absolute paths are used
|
|
180
|
+
verbatim; relative paths resolve against ``workspace_root``.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
resolved_prompt (str): Fully resolved prompt text to persist verbatim.
|
|
184
|
+
output_path (Path): Path supplied via ``--output`` (absolute or
|
|
185
|
+
workspace-relative).
|
|
186
|
+
workspace_root (Path): Active workspace root used to resolve relative
|
|
187
|
+
output paths against the same base used for ``--target``.
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
Path: Absolute path that was actually written.
|
|
191
|
+
|
|
192
|
+
Raises:
|
|
193
|
+
OSError: When creating the parent directory or writing the file fails.
|
|
194
|
+
|
|
195
|
+
Side Effects:
|
|
196
|
+
Creates missing parent directories and writes the file as UTF-8 text
|
|
197
|
+
with no BOM.
|
|
198
|
+
"""
|
|
199
|
+
# Absolute paths are honored verbatim; relative paths resolve against the
|
|
200
|
+
# workspace root to match how `--target` is resolved.
|
|
201
|
+
resolved_output = (
|
|
202
|
+
output_path if output_path.is_absolute() else workspace_root / output_path
|
|
203
|
+
)
|
|
204
|
+
# Create any missing parents so MCP callers can target deep directory paths
|
|
205
|
+
# without pre-staging. `exist_ok=True` keeps repeated writes idempotent.
|
|
206
|
+
resolved_output.parent.mkdir(parents=True, exist_ok=True)
|
|
207
|
+
resolved_output.write_text(resolved_prompt, encoding="utf-8")
|
|
208
|
+
return resolved_output
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _resolve_issue_file_for_target(target_path: Path, workspace_root: Path) -> Path:
|
|
212
|
+
"""Resolve the most likely issue.md path for a target plan file.
|
|
213
|
+
|
|
214
|
+
Purpose:
|
|
215
|
+
Hard-lock prompts are usually generated from a plan file located in a
|
|
216
|
+
feature folder (or a version subfolder like `v2`). This helper selects
|
|
217
|
+
the nearest deterministic `issue.md` candidate.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
target_path: Path to the target plan file.
|
|
221
|
+
workspace_root: Workspace root for normalization.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Path: Candidate issue.md path to parse for work-mode marker.
|
|
225
|
+
"""
|
|
226
|
+
relative_target = _try_relative_to_workspace(target_path, workspace_root)
|
|
227
|
+
plan_dir = relative_target.parent
|
|
228
|
+
direct_issue = workspace_root / plan_dir / "issue.md"
|
|
229
|
+
if direct_issue.exists():
|
|
230
|
+
return direct_issue
|
|
231
|
+
|
|
232
|
+
if plan_dir.name.startswith("v") and len(plan_dir.parts) >= 2:
|
|
233
|
+
parent_issue = workspace_root / plan_dir.parent / "issue.md"
|
|
234
|
+
if parent_issue.exists():
|
|
235
|
+
return parent_issue
|
|
236
|
+
|
|
237
|
+
return direct_issue
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _resolve_work_mode_from_issue(
|
|
241
|
+
target_path: Path, workspace_root: Path
|
|
242
|
+
) -> tuple[str, str]:
|
|
243
|
+
"""Resolve selected work mode from issue.md with fail-closed behavior.
|
|
244
|
+
|
|
245
|
+
Purpose:
|
|
246
|
+
Enforce deterministic mode selection for prompt templates by reading the
|
|
247
|
+
persisted issue marker first and failing closed to `full-feature` on
|
|
248
|
+
missing or malformed data.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
target_path: Target plan file path.
|
|
252
|
+
workspace_root: Workspace root for path resolution.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
tuple[str, str]: Selected mode and fallback reason text.
|
|
256
|
+
"""
|
|
257
|
+
issue_path = _resolve_issue_file_for_target(target_path, workspace_root)
|
|
258
|
+
if not issue_path.exists():
|
|
259
|
+
return resolve_selected_work_mode(None), build_fallback_reason(None)
|
|
260
|
+
|
|
261
|
+
try:
|
|
262
|
+
issue_content = issue_path.read_text(encoding="utf-8")
|
|
263
|
+
except OSError:
|
|
264
|
+
return (
|
|
265
|
+
resolve_selected_work_mode(None),
|
|
266
|
+
"issue.md unreadable; fail closed to full-feature",
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
return resolve_selected_work_mode(issue_content), build_fallback_reason(
|
|
270
|
+
issue_content
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def resolve_prompt(
|
|
275
|
+
template_content: str,
|
|
276
|
+
target_path: Path,
|
|
277
|
+
workspace_root: Path,
|
|
278
|
+
*,
|
|
279
|
+
work_mode: str | None = None,
|
|
280
|
+
fallback_reason: str | None = None,
|
|
281
|
+
) -> str:
|
|
282
|
+
"""Resolve ${plan-path} in the template with the target file path.
|
|
283
|
+
|
|
284
|
+
Purpose:
|
|
285
|
+
Substitutes the ${plan-path} variable with the workspace-relative path
|
|
286
|
+
to the target file, using forward slashes for consistency.
|
|
287
|
+
|
|
288
|
+
Args:
|
|
289
|
+
template_content: The raw template content containing ${plan-path}.
|
|
290
|
+
target_path: The path to the plan file.
|
|
291
|
+
workspace_root: The workspace root directory.
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
The resolved template with ${plan-path} replaced.
|
|
295
|
+
|
|
296
|
+
Side Effects:
|
|
297
|
+
None. Pure function.
|
|
298
|
+
"""
|
|
299
|
+
relative_target = _try_relative_to_workspace(target_path, workspace_root)
|
|
300
|
+
plan_path_value = relative_target.as_posix()
|
|
301
|
+
|
|
302
|
+
selected_mode, resolved_fallback_reason = _resolve_work_mode_from_issue(
|
|
303
|
+
target_path,
|
|
304
|
+
workspace_root,
|
|
305
|
+
)
|
|
306
|
+
mode_value = work_mode if work_mode is not None else selected_mode
|
|
307
|
+
fallback_value = (
|
|
308
|
+
fallback_reason if fallback_reason is not None else resolved_fallback_reason
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
resolved = template_content.replace("${plan-path}", plan_path_value)
|
|
312
|
+
resolved = resolved.replace("${work-mode}", mode_value)
|
|
313
|
+
resolved = resolved.replace("${fallback-reason}", fallback_value)
|
|
314
|
+
|
|
315
|
+
return resolved
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def main() -> int:
|
|
319
|
+
"""Main CLI entry point.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Exit code: 0 on success, 1 on error.
|
|
323
|
+
|
|
324
|
+
Side Effects:
|
|
325
|
+
Reads files, writes to clipboard, prints to stdout/stderr.
|
|
326
|
+
"""
|
|
327
|
+
parser = argparse.ArgumentParser(
|
|
328
|
+
description="Resolve execute-hard-lock prompt with plan file path"
|
|
329
|
+
)
|
|
330
|
+
parser.add_argument(
|
|
331
|
+
"--target",
|
|
332
|
+
type=Path,
|
|
333
|
+
required=True,
|
|
334
|
+
help="Path to the plan file",
|
|
335
|
+
)
|
|
336
|
+
parser.add_argument(
|
|
337
|
+
"--workspace",
|
|
338
|
+
type=Path,
|
|
339
|
+
default=None,
|
|
340
|
+
help="Workspace root directory (default: current working directory)",
|
|
341
|
+
)
|
|
342
|
+
parser.add_argument(
|
|
343
|
+
"--template-kind",
|
|
344
|
+
choices=("execute", "resume"),
|
|
345
|
+
default="execute",
|
|
346
|
+
help="Hard-lock template kind to resolve.",
|
|
347
|
+
)
|
|
348
|
+
parser.add_argument(
|
|
349
|
+
"--template-root",
|
|
350
|
+
type=Path,
|
|
351
|
+
default=None,
|
|
352
|
+
help="Optional directory containing hard-lock prompt templates.",
|
|
353
|
+
)
|
|
354
|
+
parser.add_argument(
|
|
355
|
+
"--output",
|
|
356
|
+
type=Path,
|
|
357
|
+
default=None,
|
|
358
|
+
help=(
|
|
359
|
+
"Optional path to write the resolved prompt text as UTF-8. "
|
|
360
|
+
"Relative paths resolve against --workspace (or cwd when omitted). "
|
|
361
|
+
"Parent directories are created if missing."
|
|
362
|
+
),
|
|
363
|
+
)
|
|
364
|
+
parser.add_argument(
|
|
365
|
+
"--quiet",
|
|
366
|
+
action="store_true",
|
|
367
|
+
default=False,
|
|
368
|
+
help=(
|
|
369
|
+
"Suppress stdout print and clipboard copy when --output is also "
|
|
370
|
+
"provided. Using --quiet without --output is a hard error because "
|
|
371
|
+
"it would produce no user-visible output."
|
|
372
|
+
),
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
args = parser.parse_args()
|
|
376
|
+
|
|
377
|
+
# --quiet without --output would silently drop the resolved prompt; reject
|
|
378
|
+
# the combination explicitly so misconfigured callers see the failure.
|
|
379
|
+
if args.quiet and args.output is None:
|
|
380
|
+
print(
|
|
381
|
+
"Error: --quiet requires --output; --quiet alone would suppress all "
|
|
382
|
+
"output.",
|
|
383
|
+
file=sys.stderr,
|
|
384
|
+
)
|
|
385
|
+
return 1
|
|
386
|
+
|
|
387
|
+
workspace_root = args.workspace if args.workspace else Path.cwd()
|
|
388
|
+
template_name = _resolve_template_name(args.template_kind)
|
|
389
|
+
template_path, checked_paths = _resolve_template_path(
|
|
390
|
+
template_name,
|
|
391
|
+
workspace_root,
|
|
392
|
+
args.template_root,
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
if template_path is None:
|
|
396
|
+
checked_paths_text = "\n".join(f"- {candidate}" for candidate in checked_paths)
|
|
397
|
+
print(
|
|
398
|
+
"Error: Template "
|
|
399
|
+
f"'{template_name}' not found. Checked locations:\n{checked_paths_text}",
|
|
400
|
+
file=sys.stderr,
|
|
401
|
+
)
|
|
402
|
+
return 1
|
|
403
|
+
|
|
404
|
+
if not args.target.exists():
|
|
405
|
+
print(f"Error: Target file not found at {args.target}", file=sys.stderr)
|
|
406
|
+
return 1
|
|
407
|
+
|
|
408
|
+
try:
|
|
409
|
+
template_content = template_path.read_text(encoding="utf-8")
|
|
410
|
+
except OSError as error:
|
|
411
|
+
print(f"Error reading template: {error}", file=sys.stderr)
|
|
412
|
+
return 1
|
|
413
|
+
|
|
414
|
+
resolved_prompt = resolve_prompt(template_content, args.target, workspace_root)
|
|
415
|
+
|
|
416
|
+
# When --output is provided, persist the resolved prompt so MCP callers
|
|
417
|
+
# that cannot capture stdout still receive the full content.
|
|
418
|
+
if args.output is not None:
|
|
419
|
+
try:
|
|
420
|
+
_write_resolved_prompt(resolved_prompt, args.output, workspace_root)
|
|
421
|
+
except OSError as error:
|
|
422
|
+
print(f"Error writing output file: {error}", file=sys.stderr)
|
|
423
|
+
return 1
|
|
424
|
+
|
|
425
|
+
# --quiet combined with --output suppresses both stdout and clipboard so
|
|
426
|
+
# non-interactive callers produce only the file side channel.
|
|
427
|
+
if args.quiet:
|
|
428
|
+
return 0
|
|
429
|
+
|
|
430
|
+
print(resolved_prompt)
|
|
431
|
+
|
|
432
|
+
if copy_to_clipboard(resolved_prompt):
|
|
433
|
+
print("\n✓ Copied to clipboard", file=sys.stderr)
|
|
434
|
+
else:
|
|
435
|
+
print(
|
|
436
|
+
"\n✗ Could not copy to clipboard (no supported mechanism found)",
|
|
437
|
+
file=sys.stderr,
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
return 0
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
if __name__ == "__main__":
|
|
444
|
+
sys.exit(main())
|