@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,554 @@
|
|
|
1
|
+
"""Validate orchestration plan, review, and checkpoint artifacts.
|
|
2
|
+
|
|
3
|
+
Purpose:
|
|
4
|
+
Provide a fail-closed validator for deterministic orchestration contracts so
|
|
5
|
+
plan approval, review completion, and checkpoint completion can rely on
|
|
6
|
+
schema checks instead of narrative judgment.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import json
|
|
13
|
+
import re
|
|
14
|
+
import sys
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, cast
|
|
17
|
+
|
|
18
|
+
PLAN_PHASE_RE = re.compile(r"^### Phase (?P<phase>\d+) — (?P<title>.+)$")
|
|
19
|
+
PLAN_TASK_RE = re.compile(
|
|
20
|
+
r"^- \[(?P<state>[ xX])\] \[P(?P<phase>\d+)-T(?P<task>\d+)\] (?P<title>.+)$"
|
|
21
|
+
)
|
|
22
|
+
COVERAGE_PERCENT_RE = re.compile(r"\b\d+(?:\.\d+)?%")
|
|
23
|
+
|
|
24
|
+
POLICY_AUDIT_REQUIRED_HEADINGS = (
|
|
25
|
+
"## Executive Summary",
|
|
26
|
+
"## 1. General Unit Test Policy Compliance",
|
|
27
|
+
"## 2. General Code Change Policy Compliance",
|
|
28
|
+
"## 3. Language-Specific Code Change Policy Compliance",
|
|
29
|
+
"## 4. Language-Specific Unit Test Policy Compliance",
|
|
30
|
+
"## 5. Test Coverage Detail",
|
|
31
|
+
"## 6. Test Execution Metrics",
|
|
32
|
+
"## 7. Code Quality Checks",
|
|
33
|
+
"## 8. Gaps and Exceptions",
|
|
34
|
+
"## 9. Summary of Changes",
|
|
35
|
+
"## 10. Compliance Verdict",
|
|
36
|
+
"## Appendix A: Test Inventory",
|
|
37
|
+
"## Appendix B: Toolchain Commands Reference",
|
|
38
|
+
)
|
|
39
|
+
POLICY_AUDIT_REQUIRED_CHECKLIST_LABELS = (
|
|
40
|
+
"TypeScript baseline coverage artifact:",
|
|
41
|
+
"TypeScript post-change coverage artifact:",
|
|
42
|
+
"PowerShell baseline coverage artifact:",
|
|
43
|
+
"PowerShell post-change coverage artifact:",
|
|
44
|
+
"Per-language comparison summary:",
|
|
45
|
+
)
|
|
46
|
+
POLICY_AUDIT_COMPARISON_HEADING = "### 1.2.1 Per-Language Coverage Comparison"
|
|
47
|
+
CODE_REVIEW_REQUIRED_HEADINGS = (
|
|
48
|
+
"## Executive Summary",
|
|
49
|
+
"## Findings Table",
|
|
50
|
+
)
|
|
51
|
+
FEATURE_AUDIT_REQUIRED_HEADINGS = (
|
|
52
|
+
"## Scope and Baseline",
|
|
53
|
+
"## Acceptance Criteria Inventory",
|
|
54
|
+
"## Acceptance Criteria Evaluation",
|
|
55
|
+
"## Summary",
|
|
56
|
+
"## Acceptance Criteria Check-off",
|
|
57
|
+
)
|
|
58
|
+
REQUIRED_STATE_KEYS = (
|
|
59
|
+
"objective",
|
|
60
|
+
"change_budget_estimate",
|
|
61
|
+
"path_selected",
|
|
62
|
+
"promotion-type",
|
|
63
|
+
"short-name",
|
|
64
|
+
"relativeFile",
|
|
65
|
+
"long-name",
|
|
66
|
+
"issue-num",
|
|
67
|
+
"feature-folder",
|
|
68
|
+
"work-mode",
|
|
69
|
+
"plan-path",
|
|
70
|
+
"completed_steps",
|
|
71
|
+
"next_step",
|
|
72
|
+
"last_updated",
|
|
73
|
+
"step5_status",
|
|
74
|
+
"step6_status",
|
|
75
|
+
"step7_status",
|
|
76
|
+
"step8_status",
|
|
77
|
+
"step9_status",
|
|
78
|
+
"step10_status",
|
|
79
|
+
"delegation_receipts",
|
|
80
|
+
"blocked_reason",
|
|
81
|
+
)
|
|
82
|
+
VALID_STEP_STATUS = {"not-applicable", "pending", "delegated", "verified", "blocked"}
|
|
83
|
+
VALID_BLOCKED_REASONS = {
|
|
84
|
+
"none",
|
|
85
|
+
"spawn_agent_unavailable",
|
|
86
|
+
"delegation_launch_failed",
|
|
87
|
+
"delegate_no_receipt",
|
|
88
|
+
"delegate_contract_incomplete",
|
|
89
|
+
"validator_failed",
|
|
90
|
+
"user_requested_stop",
|
|
91
|
+
}
|
|
92
|
+
REQUIRED_RECEIPT_KEYS = (
|
|
93
|
+
"step",
|
|
94
|
+
"agent_name",
|
|
95
|
+
"agent_id",
|
|
96
|
+
"skill_source",
|
|
97
|
+
"started_at",
|
|
98
|
+
"completed_at",
|
|
99
|
+
"result_signal",
|
|
100
|
+
"artifact_paths",
|
|
101
|
+
)
|
|
102
|
+
PLACEHOLDER_MARKERS = (
|
|
103
|
+
"[n]",
|
|
104
|
+
"[path",
|
|
105
|
+
"[artifact",
|
|
106
|
+
"[section reference",
|
|
107
|
+
"[language]",
|
|
108
|
+
"tbd",
|
|
109
|
+
"unverified",
|
|
110
|
+
"missing",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _read_text(path: Path) -> str:
|
|
115
|
+
"""Read a UTF-8 artifact from disk."""
|
|
116
|
+
|
|
117
|
+
return path.read_text(encoding="utf-8")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def validate_plan_text(text: str) -> list[str]:
|
|
121
|
+
"""Validate canonical atomic-plan structure."""
|
|
122
|
+
|
|
123
|
+
errors: list[str] = []
|
|
124
|
+
current_phase: int | None = None
|
|
125
|
+
seen_phases: list[int] = []
|
|
126
|
+
expected_task_num: dict[int, int] = {}
|
|
127
|
+
found_task = False
|
|
128
|
+
|
|
129
|
+
for line_number, line in enumerate(text.splitlines(), start=1):
|
|
130
|
+
if line.startswith("### Phase "):
|
|
131
|
+
match = PLAN_PHASE_RE.match(line)
|
|
132
|
+
if match is None:
|
|
133
|
+
errors.append(
|
|
134
|
+
f"Line {line_number}: phase heading must match "
|
|
135
|
+
"`### Phase N — <Title>`."
|
|
136
|
+
)
|
|
137
|
+
current_phase = None
|
|
138
|
+
continue
|
|
139
|
+
current_phase = int(match.group("phase"))
|
|
140
|
+
seen_phases.append(current_phase)
|
|
141
|
+
expected_task_num.setdefault(current_phase, 1)
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
if line.startswith("- [") and "[P" in line and "-T" in line:
|
|
145
|
+
found_task = True
|
|
146
|
+
match = PLAN_TASK_RE.match(line)
|
|
147
|
+
if match is None:
|
|
148
|
+
errors.append(
|
|
149
|
+
f"Line {line_number}: task line must match "
|
|
150
|
+
"`- [ ] [P#-T#] <Title>`."
|
|
151
|
+
)
|
|
152
|
+
continue
|
|
153
|
+
task_phase = int(match.group("phase"))
|
|
154
|
+
task_num = int(match.group("task"))
|
|
155
|
+
if current_phase is None:
|
|
156
|
+
errors.append(
|
|
157
|
+
"Line "
|
|
158
|
+
f"{line_number}: task appears before a canonical phase "
|
|
159
|
+
"heading."
|
|
160
|
+
)
|
|
161
|
+
continue
|
|
162
|
+
if task_phase != current_phase:
|
|
163
|
+
errors.append(
|
|
164
|
+
f"Line {line_number}: task phase P{task_phase} does not match "
|
|
165
|
+
f"current phase {current_phase}."
|
|
166
|
+
)
|
|
167
|
+
expected = expected_task_num.setdefault(task_phase, 1)
|
|
168
|
+
if task_num != expected:
|
|
169
|
+
errors.append(
|
|
170
|
+
f"Line {line_number}: expected task number T{expected} for phase "
|
|
171
|
+
f"{task_phase}, found T{task_num}."
|
|
172
|
+
)
|
|
173
|
+
expected_task_num[task_phase] = max(expected, task_num) + 1
|
|
174
|
+
|
|
175
|
+
if not seen_phases:
|
|
176
|
+
errors.append("Plan does not contain any canonical phase headings.")
|
|
177
|
+
if not found_task:
|
|
178
|
+
errors.append("Plan does not contain any canonical task lines.")
|
|
179
|
+
return errors
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _has_numeric_coverage(value: str) -> bool:
|
|
183
|
+
"""Return True when a coverage value contains a numeric percentage."""
|
|
184
|
+
|
|
185
|
+
return COVERAGE_PERCENT_RE.search(value) is not None
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _is_na_value(value: str) -> bool:
|
|
189
|
+
"""Return True when an audit field explicitly records not-applicable."""
|
|
190
|
+
|
|
191
|
+
return value.strip().lower().startswith("n/a")
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _has_placeholder_marker(value: str) -> bool:
|
|
195
|
+
"""Return True when an audit field still contains template placeholders."""
|
|
196
|
+
|
|
197
|
+
lowered = value.lower()
|
|
198
|
+
return any(marker in lowered for marker in PLACEHOLDER_MARKERS)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _extract_policy_audit_coverage_rows(text: str) -> list[dict[str, str]]:
|
|
202
|
+
"""Parse the coverage metrics table rows from a policy audit."""
|
|
203
|
+
|
|
204
|
+
rows: list[dict[str, str]] = []
|
|
205
|
+
for line in text.splitlines():
|
|
206
|
+
if not line.startswith("|"):
|
|
207
|
+
continue
|
|
208
|
+
cells = [cell.strip() for cell in line.split("|")[1:-1]]
|
|
209
|
+
if len(cells) != 7:
|
|
210
|
+
continue
|
|
211
|
+
language = cells[0]
|
|
212
|
+
if language in {"Language", "----------"} or not language:
|
|
213
|
+
continue
|
|
214
|
+
if set(language) == {"-"}:
|
|
215
|
+
continue
|
|
216
|
+
rows.append(
|
|
217
|
+
{
|
|
218
|
+
"Language": language,
|
|
219
|
+
"Files Changed": cells[1],
|
|
220
|
+
"Tests": cells[2],
|
|
221
|
+
"Test Result": cells[3],
|
|
222
|
+
"Baseline Coverage": cells[4],
|
|
223
|
+
"Post-Change Coverage": cells[5],
|
|
224
|
+
"New Code Coverage": cells[6],
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
return rows
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _find_policy_audit_checklist_line(text: str, label: str) -> str | None:
|
|
231
|
+
"""Return the checklist line containing the provided label, if present."""
|
|
232
|
+
|
|
233
|
+
for line in text.splitlines():
|
|
234
|
+
stripped = line.strip()
|
|
235
|
+
if stripped.startswith("- ") and label in stripped:
|
|
236
|
+
return stripped
|
|
237
|
+
return None
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _extract_policy_audit_comparison_lines(text: str) -> dict[str, str]:
|
|
241
|
+
"""Return per-language comparison lines keyed by normalized language name."""
|
|
242
|
+
|
|
243
|
+
in_section = False
|
|
244
|
+
comparison_lines: dict[str, str] = {}
|
|
245
|
+
|
|
246
|
+
for line in text.splitlines():
|
|
247
|
+
stripped = line.strip()
|
|
248
|
+
if stripped == POLICY_AUDIT_COMPARISON_HEADING:
|
|
249
|
+
in_section = True
|
|
250
|
+
continue
|
|
251
|
+
if in_section and stripped.startswith("### "):
|
|
252
|
+
break
|
|
253
|
+
if not in_section or not stripped.startswith("- "):
|
|
254
|
+
continue
|
|
255
|
+
language, separator, _ = stripped[2:].partition(":")
|
|
256
|
+
if not separator:
|
|
257
|
+
continue
|
|
258
|
+
comparison_lines[language.strip().lower()] = stripped
|
|
259
|
+
|
|
260
|
+
return comparison_lines
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _comparison_line_has_labelled_percentage(line: str, label: str) -> bool:
|
|
264
|
+
"""Return True when the line contains a numeric percentage after a label."""
|
|
265
|
+
|
|
266
|
+
pattern = re.compile(rf"{re.escape(label)}.*?\d+(?:\.\d+)?%")
|
|
267
|
+
return pattern.search(line) is not None
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def validate_policy_audit_substantive_requirements(text: str) -> list[str]:
|
|
271
|
+
"""Validate policy-audit evidence requirements beyond headings."""
|
|
272
|
+
|
|
273
|
+
errors: list[str] = []
|
|
274
|
+
|
|
275
|
+
for label in POLICY_AUDIT_REQUIRED_CHECKLIST_LABELS:
|
|
276
|
+
line = _find_policy_audit_checklist_line(text, label)
|
|
277
|
+
if line is None:
|
|
278
|
+
errors.append(f"Policy audit missing required checklist line: {label}")
|
|
279
|
+
continue
|
|
280
|
+
if _has_placeholder_marker(line):
|
|
281
|
+
errors.append(
|
|
282
|
+
f"Policy audit checklist line still contains placeholder text: {label}"
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
coverage_rows = _extract_policy_audit_coverage_rows(text)
|
|
286
|
+
if not coverage_rows:
|
|
287
|
+
errors.append("Policy audit missing coverage metrics table rows.")
|
|
288
|
+
|
|
289
|
+
if POLICY_AUDIT_COMPARISON_HEADING not in text:
|
|
290
|
+
errors.append(
|
|
291
|
+
"Policy audit missing required heading: "
|
|
292
|
+
f"{POLICY_AUDIT_COMPARISON_HEADING}"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
comparison_lines = _extract_policy_audit_comparison_lines(text)
|
|
296
|
+
for row in coverage_rows:
|
|
297
|
+
language = row["Language"]
|
|
298
|
+
baseline = row["Baseline Coverage"]
|
|
299
|
+
post_change = row["Post-Change Coverage"]
|
|
300
|
+
new_code = row["New Code Coverage"]
|
|
301
|
+
requires_coverage_comparison = any(
|
|
302
|
+
not _is_na_value(value) for value in (baseline, post_change, new_code)
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
if not _is_na_value(baseline) and not _has_numeric_coverage(baseline):
|
|
306
|
+
errors.append(
|
|
307
|
+
f"Policy audit missing numeric baseline coverage for {language}."
|
|
308
|
+
)
|
|
309
|
+
if not _is_na_value(post_change) and not _has_numeric_coverage(post_change):
|
|
310
|
+
errors.append(
|
|
311
|
+
f"Policy audit missing numeric post-change coverage for {language}."
|
|
312
|
+
)
|
|
313
|
+
if not _is_na_value(new_code) and not _has_numeric_coverage(new_code):
|
|
314
|
+
errors.append(
|
|
315
|
+
f"Policy audit missing numeric new/changed-code coverage for "
|
|
316
|
+
f"{language}."
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
if not requires_coverage_comparison:
|
|
320
|
+
continue
|
|
321
|
+
|
|
322
|
+
comparison_line = comparison_lines.get(language.lower())
|
|
323
|
+
if comparison_line is None:
|
|
324
|
+
errors.append(
|
|
325
|
+
"Policy audit missing per-language comparison line for " f"{language}."
|
|
326
|
+
)
|
|
327
|
+
continue
|
|
328
|
+
|
|
329
|
+
if not _comparison_line_has_labelled_percentage(comparison_line, "Baseline:"):
|
|
330
|
+
errors.append(
|
|
331
|
+
f"Policy audit comparison line missing numeric baseline for "
|
|
332
|
+
f"{language}."
|
|
333
|
+
)
|
|
334
|
+
if not _comparison_line_has_labelled_percentage(
|
|
335
|
+
comparison_line, "Post-change:"
|
|
336
|
+
):
|
|
337
|
+
errors.append(
|
|
338
|
+
f"Policy audit comparison line missing numeric post-change "
|
|
339
|
+
f"coverage for {language}."
|
|
340
|
+
)
|
|
341
|
+
if "Change:" not in comparison_line:
|
|
342
|
+
errors.append(
|
|
343
|
+
f"Policy audit comparison line missing explicit change text for "
|
|
344
|
+
f"{language}."
|
|
345
|
+
)
|
|
346
|
+
if (
|
|
347
|
+
re.search(
|
|
348
|
+
r"Disposition:\s*(PASS|FAIL|N/A|INCOMPLETE|BLOCKED)",
|
|
349
|
+
comparison_line,
|
|
350
|
+
)
|
|
351
|
+
is None
|
|
352
|
+
):
|
|
353
|
+
errors.append(
|
|
354
|
+
f"Policy audit comparison line missing disposition for " f"{language}."
|
|
355
|
+
)
|
|
356
|
+
if not _is_na_value(new_code) and not _comparison_line_has_labelled_percentage(
|
|
357
|
+
comparison_line, "New/changed-code coverage:"
|
|
358
|
+
):
|
|
359
|
+
errors.append(
|
|
360
|
+
"Policy audit comparison line missing numeric new/changed-code "
|
|
361
|
+
f"coverage for {language}."
|
|
362
|
+
)
|
|
363
|
+
if "Evidence:" not in comparison_line:
|
|
364
|
+
errors.append(
|
|
365
|
+
f"Policy audit comparison line missing evidence reference for "
|
|
366
|
+
f"{language}."
|
|
367
|
+
)
|
|
368
|
+
elif _has_placeholder_marker(comparison_line):
|
|
369
|
+
errors.append(
|
|
370
|
+
"Policy audit comparison line still contains placeholder text for "
|
|
371
|
+
f"{language}."
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
return errors
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def validate_policy_audit_text(text: str) -> list[str]:
|
|
378
|
+
"""Validate template-derived policy-audit structure."""
|
|
379
|
+
|
|
380
|
+
errors: list[str] = []
|
|
381
|
+
if "Template Usage Instructions" in text:
|
|
382
|
+
errors.append("Policy audit still contains the template instruction block.")
|
|
383
|
+
if "[Component Name]" in text:
|
|
384
|
+
errors.append("Policy audit still contains placeholder component text.")
|
|
385
|
+
for heading in POLICY_AUDIT_REQUIRED_HEADINGS:
|
|
386
|
+
if heading not in text:
|
|
387
|
+
errors.append(f"Policy audit missing required heading: {heading}")
|
|
388
|
+
errors.extend(validate_policy_audit_substantive_requirements(text))
|
|
389
|
+
return errors
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def validate_code_review_text(text: str) -> list[str]:
|
|
393
|
+
"""Validate audit-grade code-review structure."""
|
|
394
|
+
|
|
395
|
+
errors: list[str] = []
|
|
396
|
+
for heading in CODE_REVIEW_REQUIRED_HEADINGS:
|
|
397
|
+
if heading not in text:
|
|
398
|
+
errors.append(f"Code review missing required heading: {heading}")
|
|
399
|
+
table_header = (
|
|
400
|
+
"| Severity | File | Location | Finding | Recommendation | "
|
|
401
|
+
"Rationale | Evidence |"
|
|
402
|
+
)
|
|
403
|
+
if table_header not in text:
|
|
404
|
+
errors.append("Code review missing the required findings table header.")
|
|
405
|
+
return errors
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def validate_feature_audit_text(text: str) -> list[str]:
|
|
409
|
+
"""Validate feature-audit structure."""
|
|
410
|
+
|
|
411
|
+
errors: list[str] = []
|
|
412
|
+
for heading in FEATURE_AUDIT_REQUIRED_HEADINGS:
|
|
413
|
+
if heading not in text:
|
|
414
|
+
errors.append(f"Feature audit missing required heading: {heading}")
|
|
415
|
+
return errors
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
def validate_orchestrator_state_text(
|
|
419
|
+
text: str, *, require_complete: bool = False
|
|
420
|
+
) -> list[str]:
|
|
421
|
+
"""Validate checkpoint schema and completion-state fields."""
|
|
422
|
+
|
|
423
|
+
errors: list[str] = []
|
|
424
|
+
try:
|
|
425
|
+
state = json.loads(text)
|
|
426
|
+
except json.JSONDecodeError as exc:
|
|
427
|
+
return [f"Checkpoint is not valid JSON: {exc}"]
|
|
428
|
+
|
|
429
|
+
if not isinstance(state, dict):
|
|
430
|
+
return ["Checkpoint root must be a JSON object."]
|
|
431
|
+
state_map = cast("dict[str, Any]", state)
|
|
432
|
+
|
|
433
|
+
for key in REQUIRED_STATE_KEYS:
|
|
434
|
+
if key not in state_map:
|
|
435
|
+
errors.append(f"Checkpoint missing required key: {key}")
|
|
436
|
+
|
|
437
|
+
for key in (
|
|
438
|
+
"step5_status",
|
|
439
|
+
"step6_status",
|
|
440
|
+
"step7_status",
|
|
441
|
+
"step8_status",
|
|
442
|
+
"step9_status",
|
|
443
|
+
"step10_status",
|
|
444
|
+
):
|
|
445
|
+
value = state_map.get(key)
|
|
446
|
+
if value is not None and value not in VALID_STEP_STATUS:
|
|
447
|
+
errors.append(f"Checkpoint has invalid {key}: {value}")
|
|
448
|
+
|
|
449
|
+
blocked_reason = state_map.get("blocked_reason")
|
|
450
|
+
if blocked_reason is not None and blocked_reason not in VALID_BLOCKED_REASONS:
|
|
451
|
+
errors.append(f"Checkpoint has invalid blocked_reason: {blocked_reason}")
|
|
452
|
+
|
|
453
|
+
receipts = state_map.get("delegation_receipts")
|
|
454
|
+
if receipts is not None and not isinstance(receipts, list):
|
|
455
|
+
errors.append("Checkpoint delegation_receipts must be a list.")
|
|
456
|
+
if isinstance(receipts, list):
|
|
457
|
+
typed_receipts = cast("list[object]", receipts)
|
|
458
|
+
for index, receipt in enumerate(typed_receipts):
|
|
459
|
+
if not isinstance(receipt, dict):
|
|
460
|
+
errors.append(
|
|
461
|
+
f"Checkpoint delegation receipt #{index} must be an object."
|
|
462
|
+
)
|
|
463
|
+
continue
|
|
464
|
+
for key in REQUIRED_RECEIPT_KEYS:
|
|
465
|
+
if key not in receipt:
|
|
466
|
+
errors.append(
|
|
467
|
+
f"Checkpoint delegation receipt #{index} missing key: {key}"
|
|
468
|
+
)
|
|
469
|
+
artifact_paths = cast("dict[str, Any]", receipt).get("artifact_paths")
|
|
470
|
+
if artifact_paths is not None and not isinstance(artifact_paths, list):
|
|
471
|
+
errors.append(
|
|
472
|
+
"Checkpoint delegation receipt "
|
|
473
|
+
f"#{index} artifact_paths must be a list."
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
if require_complete:
|
|
477
|
+
for key in (
|
|
478
|
+
"step5_status",
|
|
479
|
+
"step6_status",
|
|
480
|
+
"step7_status",
|
|
481
|
+
"step8_status",
|
|
482
|
+
"step9_status",
|
|
483
|
+
"step10_status",
|
|
484
|
+
):
|
|
485
|
+
value = state_map.get(key)
|
|
486
|
+
if value in {"pending", "blocked"}:
|
|
487
|
+
errors.append(
|
|
488
|
+
f"Checkpoint completion validation failed: {key} is {value}."
|
|
489
|
+
)
|
|
490
|
+
if state_map.get("blocked_reason") not in {None, "none"}:
|
|
491
|
+
errors.append(
|
|
492
|
+
"Checkpoint completion validation failed: blocked_reason is not `none`."
|
|
493
|
+
)
|
|
494
|
+
return errors
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
498
|
+
"""Create the CLI parser."""
|
|
499
|
+
|
|
500
|
+
parser = argparse.ArgumentParser(
|
|
501
|
+
description="Validate deterministic orchestration artifacts."
|
|
502
|
+
)
|
|
503
|
+
subparsers = parser.add_subparsers(dest="artifact_type", required=True)
|
|
504
|
+
|
|
505
|
+
for artifact_type in ("plan", "policy-audit", "code-review", "feature-audit"):
|
|
506
|
+
artifact_parser = subparsers.add_parser(artifact_type)
|
|
507
|
+
artifact_parser.add_argument("path")
|
|
508
|
+
|
|
509
|
+
state_parser = subparsers.add_parser("orchestrator-state")
|
|
510
|
+
state_parser.add_argument("path")
|
|
511
|
+
state_parser.add_argument(
|
|
512
|
+
"--require-complete",
|
|
513
|
+
action="store_true",
|
|
514
|
+
help="Require all tracked statuses to be complete-state safe.",
|
|
515
|
+
)
|
|
516
|
+
return parser
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
def _validate_from_args(args: argparse.Namespace) -> list[str]:
|
|
520
|
+
"""Dispatch the requested validator."""
|
|
521
|
+
|
|
522
|
+
path = Path(args.path)
|
|
523
|
+
text = _read_text(path)
|
|
524
|
+
if args.artifact_type == "plan":
|
|
525
|
+
return validate_plan_text(text)
|
|
526
|
+
if args.artifact_type == "policy-audit":
|
|
527
|
+
return validate_policy_audit_text(text)
|
|
528
|
+
if args.artifact_type == "code-review":
|
|
529
|
+
return validate_code_review_text(text)
|
|
530
|
+
if args.artifact_type == "feature-audit":
|
|
531
|
+
return validate_feature_audit_text(text)
|
|
532
|
+
if args.artifact_type == "orchestrator-state":
|
|
533
|
+
return validate_orchestrator_state_text(
|
|
534
|
+
text, require_complete=bool(args.require_complete)
|
|
535
|
+
)
|
|
536
|
+
return [f"Unsupported artifact type: {args.artifact_type}"]
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
def main(argv: list[str] | None = None) -> int:
|
|
540
|
+
"""Run the orchestration-artifact validator CLI."""
|
|
541
|
+
|
|
542
|
+
parser = build_parser()
|
|
543
|
+
args = parser.parse_args(argv)
|
|
544
|
+
errors = _validate_from_args(args)
|
|
545
|
+
if errors:
|
|
546
|
+
for error in errors:
|
|
547
|
+
print(error, file=sys.stderr)
|
|
548
|
+
return 1
|
|
549
|
+
print(f"{args.artifact_type} validation passed: {args.path}")
|
|
550
|
+
return 0
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
if __name__ == "__main__":
|
|
554
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Compatibility wrapper for the bundled Codex-native converter.
|
|
2
|
+
|
|
3
|
+
Purpose:
|
|
4
|
+
Preserve an extension-side Python entry point that delegates converter
|
|
5
|
+
execution to the bundled ``dev_tools`` package published with the extension
|
|
6
|
+
resources.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import importlib
|
|
12
|
+
import sys
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _ensure_bundled_scripts_import_path() -> None:
|
|
17
|
+
"""Prepend bundled `resources/scripts` directory to ``sys.path``."""
|
|
18
|
+
|
|
19
|
+
scripts_dir = Path(__file__).resolve().parent.parent / "scripts"
|
|
20
|
+
scripts_dir_str = str(scripts_dir)
|
|
21
|
+
if scripts_dir_str not in sys.path:
|
|
22
|
+
sys.path.insert(0, scripts_dir_str)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def main() -> int:
|
|
26
|
+
"""Execute the bundled Codex-native converter in-process."""
|
|
27
|
+
|
|
28
|
+
_ensure_bundled_scripts_import_path()
|
|
29
|
+
module = importlib.import_module("dev_tools.codex_native_converter.cli")
|
|
30
|
+
module.main()
|
|
31
|
+
return 0
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
if __name__ == "__main__":
|
|
35
|
+
raise SystemExit(main())
|