@danmoisan/drm-copilot-mcp 1.1.26 → 1.1.27
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/out/mcp-server.js +170 -52
- package/package.json +1 -1
- package/resources/claude-customizations/.claude/agents/atomic-executor.md +3 -3
- package/resources/claude-customizations/.claude/agents/atomic-planner.md +2 -2
- package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +7 -7
- package/resources/claude-customizations/.claude/agents/feature-review.md +6 -3
- package/resources/claude-customizations/.claude/agents/orchestrator.md +11 -7
- package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +7 -7
- package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +6 -6
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +16 -1
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-rules.ps1 +50 -16
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorState.psm1 +6 -1
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletion.psm1 +4 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletionChecks.psm1 +51 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateReceipts.psm1 +5 -2
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateRemediationAccounting.psm1 +116 -4
- package/resources/claude-customizations/.claude/rules/csharp.md +8 -8
- package/resources/claude-customizations/.claude/rules/orchestrator-state.md +28 -2
- package/resources/claude-customizations/.claude/rules/powershell.md +2 -2
- package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +14 -15
- package/resources/claude-customizations/.claude/skills/epic-progress-report/SKILL.md +338 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Logic.ps1 +248 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Metrics.ps1 +232 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Render.ps1 +196 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.State.ps1 +286 -0
- package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 +475 -0
- package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +18 -13
- package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +21 -9
- package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +5 -5
- package/resources/claude-customizations/.claude/skills/invoke-powershell-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/.claude/skills/invoke-python-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +24 -2
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +8 -0
- package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +16 -17
- package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +15 -16
- package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +1 -1
- package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +6 -6
- package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/claude-customizations/pack-manifests/core.json +7 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +18 -13
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +5 -1
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +18 -5
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +24 -2
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-state/SKILL.md +16 -1
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +3 -3
- package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +15 -16
- package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +14 -15
- package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +2 -0
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +3 -3
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-di-unit-test-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +7 -7
- package/resources/codex-and-agents-customizations/.codex/agents/pytest-unit-test-coding.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-executor.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-planning.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-execution-only-typed.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-orchestrator.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate.ps1 +29 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +51 -4
- package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +6 -6
- package/resources/codex-and-agents-customizations/pack-manifests/core.json +1 -0
- package/resources/customizations/.github/agents/5.1-Beast-adjusted.agent.md +1 -1
- package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +20 -26
- package/resources/customizations/.github/agents/atomic_executor.agent.md +4 -4
- package/resources/customizations/.github/agents/atomic_planning.agent.md +4 -4
- package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
- package/resources/customizations/.github/agents/commit-steward.agent.md +1 -1
- package/resources/customizations/.github/agents/csharp-atomic-executor.agent.md +14 -14
- package/resources/customizations/.github/agents/csharp-atomic-planning.agent.md +2 -2
- package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +4 -4
- package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +19 -22
- package/resources/customizations/.github/agents/epic-review.agent.md +1 -1
- package/resources/customizations/.github/agents/gpt-5-beast-mode.agent.md +3 -3
- package/resources/customizations/.github/agents/orchestrator.agent.md +8 -8
- package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +12 -12
- package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +4 -4
- package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +6 -6
- package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +21 -24
- package/resources/customizations/.github/agents/pytest-unit-test-coding.agent.md +13 -17
- package/resources/customizations/.github/agents/python-atomic-executor.agent.md +11 -11
- package/resources/customizations/.github/agents/python-atomic-planning.agent.md +2 -2
- package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +14 -17
- package/resources/customizations/.github/agents/python-orchestrator.agent.md +7 -7
- package/resources/customizations/.github/agents/python-typed-engineer.agent.md +17 -20
- package/resources/customizations/.github/agents/staged-review.agent.md +2 -2
- package/resources/customizations/.github/agents/tdd-green.agent.md +1 -1
- package/resources/customizations/.github/agents/tdd-red.agent.md +3 -3
- package/resources/customizations/.github/agents/tdd-refactor.agent.md +2 -2
- package/resources/customizations/.github/agents/typescript-engineer.agent.md +3 -3
- package/resources/customizations/.github/codex/execute-hard-lock.prompt.md +3 -3
- package/resources/customizations/.github/instructions/general-code-change.instructions.md +1 -1
- package/resources/customizations/.github/instructions/powershell-unit-test.instructions.md +1 -1
- package/resources/customizations/.github/instructions/python-code-change.instructions.md +5 -5
- package/resources/customizations/.github/instructions/python-suppressions.instructions.md +3 -3
- package/resources/customizations/.github/instructions/python-unit-test.instructions.md +1 -1
- package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +2 -2
- package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +2 -2
- package/resources/customizations/.github/prompts/remediate-comments.prompt.md +2 -2
- package/resources/customizations/.github/prompts/review-feature.prompt.md +1 -1
- package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +8 -12
- package/resources/customizations/.github/skills/execution-environment/SKILL.md +18 -13
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +15 -2
- package/resources/feature-templates/bug/plan.yyyy-MM-ddTHH-mm.md +4 -4
- package/resources/feature-templates/feature/plan.yyyy-MM-ddTHH-mm.md +3 -3
- package/resources/feature-templates/refactor/plan.yyyy-MM-ddTHH-mm.md +2 -2
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +2 -2
- package/resources/powershell/PoshQC/PoshQC.psm1 +3 -3
- package/resources/powershell/PoshQC/README.md +8 -8
- package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +2 -2
- package/resources/templates/policy_audit/AGENTS.md +9 -10
- package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +19 -20
|
@@ -32,7 +32,7 @@ Rules:
|
|
|
32
32
|
- **Tool routes are not restated.** Tool routes, launchers, wrapper scripts, command-text restrictions, the batch budget, hook context, and CI shape are owned by the `execution-environment` skill. A plan references that skill instead of restating its content.
|
|
33
33
|
- **Changed existing behavior names its asserting tests.** A task that changes the observable behavior of an existing function, script, fixture, or test stub (its signature, argv, output, exit status, or the files it writes) names every existing test that asserts that behavior and states each test's disposition: unchanged because it is unaffected, or updated, with the reason for the update. The tests are found by searching the test tree for the symbol, the file name, and the asserted output. A test that asserts the current behavior and is outside the task's file set fails once the change lands, and the plan's own acceptance condition then cannot be met. The planner's adversarial self-review includes this search for every task that changes existing behavior.
|
|
34
34
|
- **Size guideline.** A plan stays within 40 canonical tasks and 400 physical lines. A plan that needs more carries a `## Size Justification` section with at least one line stating why the size is necessary (validator rule G13). Files produced by one generator run count as one generator task.
|
|
35
|
-
- **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the
|
|
35
|
+
- **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the parallel gates the plan uses: one `Invoke-PoshQCParallelTest` run, one `pytest -n auto` run, and Jest through its normal parallel workers, each re-run only after a fix. The `Mirror parity` bullet also covers the execution-environment brief: a plan that alters a fact the brief states (for example, it adds or renames a CI job, changes a required status context, a tool route, or a batch-budget rule) includes a task that updates the brief in the same change, in all six byte-identical copies, and the bullet names that task. Without that task the brief states a superseded fact once the change lands, which breaks the brief's own maintenance rule. The planner SubagentStop hook blocks a plan without a complete section.
|
|
36
36
|
- **Final-phase self-review.** The final phase of every plan contains a self-review task that walks the policy-audit, code-review, and feature-audit templates under `docs/features/templates/policy_audit/` against the branch diff from the merge base and writes `<FEATURE>/evidence/qa-gates/self-review.<timestamp>.md` with one PASS, FAIL, or N/A row per checklist item. A FAIL row is fixed and the QA loop is re-run before the self-review is rewritten; the plan does not complete with a FAIL row.
|
|
37
37
|
|
|
38
38
|
This section takes precedence over the literal-quoting rules of `## Wrap-Tolerant Assertion Authoring (Mandatory)`: those rules govern the asserted value of an acceptance condition, not context.
|
|
@@ -43,12 +43,11 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
|
|
|
43
43
|
|
|
44
44
|
1) Baseline capture block
|
|
45
45
|
- policy reads in required order,
|
|
46
|
-
- baseline
|
|
46
|
+
- static baseline capture (format, lint, type check, and analyzer findings) for each language that has explicit baseline command tasks in the plan; no test suite runs in this block.
|
|
47
47
|
- required artifacts:
|
|
48
48
|
- a Phase 0 policy-read evidence artifact in the canonical evidence location defined by `evidence-and-timestamp-conventions`
|
|
49
49
|
- one baseline artifact per baseline command step (no aggregate-only baseline artifact)
|
|
50
50
|
- each baseline step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
|
|
51
|
-
- baseline test-step artifacts for languages with mandatory coverage policy MUST include numeric coverage headline values in `Output Summary:` (baseline percent and, when applicable, targeted module/new-code percent).
|
|
52
51
|
|
|
53
52
|
2) Delegated implementation block
|
|
54
53
|
- explicit handoff task to the small-path implementation engineer,
|
|
@@ -59,7 +58,7 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
|
|
|
59
58
|
- rerun behavior when any step changes files or fails.
|
|
60
59
|
- one final-QC artifact per QC command step (no aggregate-only final-QC artifact)
|
|
61
60
|
- each final-QC step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
|
|
62
|
-
- final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric
|
|
61
|
+
- final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric coverage values from the single gate run in `Output Summary:`.
|
|
63
62
|
- final-QC command tasks that are present in the approved plan MUST execute their stated commands; `SKIPPED` is invalid unless the task text itself explicitly authorizes a skip condition.
|
|
64
63
|
|
|
65
64
|
4) Reduced audit block
|
|
@@ -109,7 +108,7 @@ When a fully automated equivalent is unavailable, the plan MUST fail closed by r
|
|
|
109
108
|
|
|
110
109
|
Phase 0 must include tasks to read policy files in the order defined in `policy-compliance-order`.
|
|
111
110
|
|
|
112
|
-
Phase 0 must also capture
|
|
111
|
+
Phase 0 must also capture static baselines (format, lint, type check, and analyzer findings) for the languages touched, and no test suite runs in it. Baseline artifact conventions (location + required fields) are defined in `evidence-and-timestamp-conventions`.
|
|
113
112
|
|
|
114
113
|
For short-path/minimal-audit plans, Phase 0 evidence is incomplete unless both artifacts exist:
|
|
115
114
|
- `phase0-instructions-read.md` with at least: `Timestamp:`, `Policy Order:`, and explicit list of files read.
|
|
@@ -126,12 +125,9 @@ Plans name evidence artifacts `<name>.<timestamp>.md` and never fix a plan-time
|
|
|
126
125
|
|
|
127
126
|
For any language in scope where repository policy requires coverage validation:
|
|
128
127
|
|
|
129
|
-
- The approved plan MUST include explicit
|
|
130
|
-
-
|
|
131
|
-
-
|
|
132
|
-
- baseline coverage,
|
|
133
|
-
- post-change coverage,
|
|
134
|
-
- new/changed-code coverage.
|
|
128
|
+
- The approved plan MUST include an explicit final-QC coverage capture task.
|
|
129
|
+
- The final-QC artifact MUST record numeric coverage values (not placeholders such as `UNVERIFIED`).
|
|
130
|
+
- The plan MUST include a threshold task that reports each changed file from the single gate run against the coverage thresholds. New behavior is tested. No earlier figure is compared.
|
|
135
131
|
- If required coverage values are unavailable, the plan outcome MUST be remediation-required and MUST NOT be reported as PASS.
|
|
136
132
|
|
|
137
133
|
## Final QA Loop (Required for Code/Test Changes)
|
|
@@ -218,7 +214,7 @@ When a plan is generated or validated from a feature folder, resolve selected mo
|
|
|
218
214
|
|
|
219
215
|
## Mode-Specific Mandatory Plan Gates
|
|
220
216
|
|
|
221
|
-
- `minor-audit` plans MUST include baseline evidence tasks, targeted verification evidence tasks, and end-state evidence tasks.
|
|
217
|
+
- `minor-audit` plans MUST include static baseline evidence tasks, targeted verification evidence tasks read from the gate run, and end-state evidence tasks.
|
|
222
218
|
- `minor-audit` plans MUST require `${feature-folder}/issue.md` to contain an explicit `## Acceptance Criteria` section; do not infer acceptance criteria from other `issue.md` sections.
|
|
223
219
|
- `minor-audit` plans MUST NOT treat missing `spec.md` or `user-story.md` as automatic blockers.
|
|
224
220
|
- `minor-audit` execution/validation/audit MUST fail closed when `spec.md` or `user-story.md` exists unexpectedly in the active folder, when the explicit `## Acceptance Criteria` section is missing from `issue.md`, when required Phase 0 artifacts are missing, or when checklist state contradicts evidence on disk.
|
|
@@ -13,9 +13,9 @@ Maintenance rule: this brief is updated in the same change that alters any fact
|
|
|
13
13
|
|
|
14
14
|
## Development Toolchain Baseline
|
|
15
15
|
|
|
16
|
-
The host manifest, both devcontainer Dockerfiles, and development CI
|
|
16
|
+
The host manifest, both devcontainer Dockerfiles, and development CI select Python 3.13.18, Node.js 26.13.0/npm 11.20.0, PowerShell 7.6.9, and Poetry 2.5.1. Both images use `mcr.microsoft.com/devcontainers/python:3.3.2-3.13-bookworm`, require Git >=2.56.0, and install GitHub CLI 2.103.3, .NET SDK 10.0.403, uv 0.13.7, Claude Code 2.1.318, claude-swap 0.29.0, and Codex 0.166.0. Shell validation pins shfmt 3.14.1, ShellCheck 0.11.0, actionlint 1.7.12, and kcov v43. PowerShell selects Pester 6.2.0 and PSScriptAnalyzer 1.25.0. The images also retain Graphite 1.7.14, GitHub Copilot CLI 0.0.377, Bats, and bashdb. Host bootstrap treats manifest versions as minima and preserves equal/newer installations; the container verifier accepts later Python patches within 3.13 and later Git versions, and checks the other selected pins.
|
|
17
17
|
|
|
18
|
-
The
|
|
18
|
+
The pinned base supplies Python and Git; image-managed CLI installs take precedence on PATH. Full configuration builds include the selected devcontainer features. Local Docker retains the Docker outside-of-Docker feature; floating Git/GitHub CLI features do not replace image pins. Both configurations run the same shared post-create script and mandatory verifier. Local source is a live host bind mount with four `volume-nocopy` Linux dependency volumes for `.venv` and the root, extension, and MCP `node_modules`; setup prepares only their mount roots. A container-only Git environment override disables the host Windows fsmonitor without changing host configuration. The former workspace volume is retained for recovery. Runtime verification uses the Linux environment rather than host Windows dependencies. Codex includes its native optional package, disables the startup update prompt through root-owned system settings, and uses the file credential store; the image does not populate user authentication state. Python bytecode stays under `/tmp/pycache`.
|
|
19
19
|
|
|
20
20
|
Python 3.11/3.12 compatibility jobs, consumer package engines, and independent release-publishing runtime pins remain unchanged. The shared version predicate lives in `scripts/bash/container_versions.sh`; `.devcontainer/verify-container.sh` resolves it relative to its own repository location.
|
|
21
21
|
|
|
@@ -39,7 +39,8 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
|
|
|
39
39
|
|
|
40
40
|
- PoshQC MCP results carry no output. The summary string is composed from a fixed template before the child process runs (`runPoshQcWorkflow` in `extensions/drm-copilot/src/repo-automation-service.ts`), and `RepoAutomationExecutionResult` has no exit-code or output field. An `ok: true` result proves only that the tool was invoked.
|
|
41
41
|
- Counts, percentages, and findings therefore come from files or direct runs: pass and fail counts from `artifacts/pester/pester-junit.xml`, line coverage from `artifacts/pester/powershell-coverage.xml`, and analyzer findings from a direct `Invoke-ScriptAnalyzer` run with `scripts/powershell/PoshQC/settings/pssa.settings.psd1`.
|
|
42
|
-
- The MCP test tool reads the installed extension's settings. Branch-current Pester runs import `scripts/powershell/PoshQC/PoshQC.psd1` and call `Invoke-
|
|
42
|
+
- The MCP test tool reads the installed extension's settings. Branch-current Pester runs import `scripts/powershell/PoshQC/PoshQC.psd1` and call `Invoke-PoshQCParallelTest` from a `sh`-launched PowerShell 7. The coverage population is derived by `Invoke-PoshQCTest`, which each shard runs, from `config/poshqc-coverage.json`; there is no hand-maintained coverage path list.
|
|
43
|
+
- `Invoke-PoshQCParallelTest` returns an object whose `ExitCode` is read first, and the launcher exits with that value. Merged JUnit and coverage exist only after a fully green run, and a failed run can leave older merged files in place. Failure detail is under `artifacts/pester/parallel/shard-<i>/`.
|
|
43
44
|
- `Invoke-Pester` without `-EnableExit` (or `Run.Exit`) exits 0 when tests fail; read the JUnit file rather than the exit code of such a run.
|
|
44
45
|
|
|
45
46
|
## Batch Budget
|
|
@@ -88,7 +89,7 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
|
|
|
88
89
|
- `_shell-coverage.yml` checks out at depth one, so `origin/main` does not exist in that job; no test may diff against it.
|
|
89
90
|
- The Linux hook-suite job runs `tests/scripts/claude-hooks` and `tests/scripts/codex-hooks` on a case-sensitive file system: use `Join-Path`, forward-slash relative paths, exact file-name case, and no drive letters or backslash literals.
|
|
90
91
|
- The `.gitattributes` rule `* text=auto eol=lf` normalizes line endings on checkout, so a CRLF fixture committed as text is not CRLF in CI.
|
|
91
|
-
-
|
|
92
|
+
- Files in one shard share a process, so a leak surfaces when shard contents change.
|
|
92
93
|
|
|
93
94
|
## Contract Tests That Pin Mirrored Files
|
|
94
95
|
|
|
@@ -105,6 +106,7 @@ Run these after editing any mirrored or bundled file; each is under `tests/scrip
|
|
|
105
106
|
- `test_push_down_issue_824_follow_ups.py`: pushed rules and skills name no consuming product.
|
|
106
107
|
- `test_typescript_toolchain_instruction_contracts.py`: no reference to another test framework, and every backticked npm script token in the pinned mirrors exists in the root `package.json`.
|
|
107
108
|
- `tests/scripts/claude-runtime/claude-architecture-doc.Tests.ps1` and `tests/scripts/claude-runtime/hook-dependency-guard-completeness.Tests.ps1`: agent tool names in the architecture document and the guarded dot-source pattern in hooks.
|
|
109
|
+
- `tests/scripts/claude-runtime/parallel-gate-wording.Tests.ps1`: per-file required and forbidden gate wording in the mirrored skills, agents, and templates, and the sweep of those surfaces for removed test-suite baseline wording.
|
|
108
110
|
|
|
109
111
|
## Preflight Defect Classes the Validator Cannot See
|
|
110
112
|
|
|
@@ -135,6 +137,7 @@ These pass every validator rule and are found only by reading the plan against t
|
|
|
135
137
|
- Python: measure a module with `--cov=<dotted.module>`, `--cov-branch`, `--cov-report=term-missing`, and `--cov-report=json:<path>`; read branch figures from the JSON report.
|
|
136
138
|
- TypeScript: a new production file needs its own entry in the `coverageThreshold` map of `extensions/drm-copilot/jest.config.cjs`; Jest runs through `node run-jest.cjs` in `extensions/drm-copilot/`.
|
|
137
139
|
- PowerShell: per-file line coverage is read from `artifacts/pester/powershell-coverage.xml` written by the self-hosted PoshQC module.
|
|
140
|
+
- Per-file figures are read from the single gate run, and no earlier figure is compared.
|
|
138
141
|
- File size follows three tiers for production, test, and reusable script files, counted in logical lines (a trailing terminator adds no line): at 500 lines look for a logical split (guidance); at 700 lines split more aggressively, and reviewers report a non-blocking Warning (advisory); above 800 lines a split is enforced regardless of logical separability (hard limit; exactly 800 passes). The hard limit is enforced by `tests/scripts/ci/FileSizePolicy.RepoGate.Tests.ps1` in the existing PowerShell shards against `config/file-size-baseline.json`, where legacy files above 800 may shrink (with the entry tightened) or stay equal but may not grow, and by the PreToolUse hook `.claude/hooks/enforce-file-size-limit.ps1` (`.codex/hooks/enforce-file-size-limit.ps1`). New logic in a file near a tier goes into a new module and a new test file. Markdown is exempt.
|
|
139
142
|
|
|
140
143
|
## Test Runtime
|
|
@@ -144,17 +147,19 @@ These pass every validator rule and are found only by reading the plan against t
|
|
|
144
147
|
- Fix repeated production work first. An immutable structure, such as a schema registry that is rebuilt and re-verified on every call, is built once per owning instance. This speeds up the runtime as well as the tests.
|
|
145
148
|
- Second, build an expensive immutable fixture once per session and hand each test its own copy wherever a test could mutate it, so test independence is unchanged.
|
|
146
149
|
- Parallel workers reduce wall-clock time only: they are capped by the slowest test and leave the cost in the product.
|
|
147
|
-
- pytest: pass `-n auto` (pytest-xdist) on the command line of the CI step `Run tests with Pytest` and of the parallel VS Code tasks, never in `addopts`, because the VS Code Test Explorer keys results to the wrong file when `addopts` carries it. `-n auto` counts physical cores, so a runner can start fewer workers than it has vCPUs; measure it against an explicit count such as `-n 4` before keeping it. pytest-cov combines the worker coverage into one report
|
|
148
|
-
- Pester:
|
|
150
|
+
- pytest: pass `-n auto` (pytest-xdist) on the command line of the CI step `Run tests with Pytest` and of the parallel VS Code tasks, never in `addopts`, because the VS Code Test Explorer keys results to the wrong file when `addopts` carries it. `-n auto` counts physical cores, so a runner can start fewer workers than it has vCPUs; measure it against an explicit count such as `-n 4` before keeping it. pytest-cov combines the worker coverage into one report.
|
|
151
|
+
- Pester: parallel validation uses separate Pester 6 processes: `Invoke-PoshQCTest -ShardIndex -ShardCount` on the CI runners and `Invoke-PoshQCParallelTest` locally. Read the per-file `time` of the JUnit `testsuite` elements before changing the shard count or the weights in `config/poshqc-shard-weights.json`.
|
|
149
152
|
- A candidate fix can be measured before the tree is edited by loading a pytest plugin module from `SCRATCH` with `-p <module>` and `PYTHONPATH`.
|
|
150
153
|
|
|
151
154
|
## Test Isolation Checks
|
|
152
155
|
|
|
153
156
|
- Tests create no temporary files; file and transcript reads go through injected seams with in-memory content.
|
|
154
|
-
-
|
|
155
|
-
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
-
|
|
157
|
+
- The test gates are parallel:
|
|
158
|
+
- the Pester gate is one `Invoke-PoshQCParallelTest` run;
|
|
159
|
+
- the pytest gate is one `pytest -n auto` run;
|
|
160
|
+
- Jest runs through its normal parallel workers.
|
|
161
|
+
- Each gate reaches zero failures and is re-run only after a fix.
|
|
162
|
+
- A focused run of one test file to debug a specific failure is debugging only; it is never a gate or evidence.
|
|
163
|
+
- Serial tasks remain for debugging one failure and are not gates.
|
|
164
|
+
- A leak found by a gate is fixed on both sides: the suite that leaves state behind (globals, functions, environment variables, mocks, imported modules, script-scope state) and the suite that assumes prior state.
|
|
165
|
+
- The parallel gates govern where a policy file names a toolchain test command.
|
|
@@ -42,12 +42,21 @@ Always apply:
|
|
|
42
42
|
- `code-review-template` for `code-review.<timestamp>.md`
|
|
43
43
|
- `feature-audit-template` for `feature-audit.<timestamp>.md`
|
|
44
44
|
- The MCP-resolved asset is the authoritative template source for review artifacts in this workflow.
|
|
45
|
+
- When an installed template older than this change carries baseline fields, each baseline field is recorded as `N/A - no pre-change run`, and the comparison line reads `Baseline: N/A - no pre-change run -> Post-change: <percent>. Change: N/A.`
|
|
45
46
|
|
|
46
47
|
### No silent fixes
|
|
47
48
|
|
|
48
49
|
- Do not clean up code during review.
|
|
49
50
|
- If checks fail, document the failure and include exact remediation guidance.
|
|
50
51
|
|
|
52
|
+
### Process-reduction ledger
|
|
53
|
+
|
|
54
|
+
- This rule applies only when `docs/engineering/process-reductions/` exists, so a repository without that folder is unaffected.
|
|
55
|
+
- A change that reduces evidence, plan tasks, gates, or review process adds its ledger entry in the same commit, in the format of that folder's `README.md`.
|
|
56
|
+
- A branch diff that makes such a reduction with no entry is a Blocking finding.
|
|
57
|
+
- The reviewer confirms from the branch log that each reduction is its own commit, with the `reduction: NNNN` token in its subject.
|
|
58
|
+
- One-off waivers for a single item are not entries.
|
|
59
|
+
|
|
51
60
|
### Work-mode acceptance-criteria contract
|
|
52
61
|
|
|
53
62
|
- Read the persisted marker from `issue.md` using one of:
|
|
@@ -92,7 +101,7 @@ Always apply:
|
|
|
92
101
|
2. lint check
|
|
93
102
|
3. type check
|
|
94
103
|
4. tests
|
|
95
|
-
-
|
|
104
|
+
- A focused run of one test file to debug a specific failure is debugging only; a review check does not rest on it.
|
|
96
105
|
- If a tool cannot run in the environment, mark the affected section unverified or partial with a concrete reason.
|
|
97
106
|
|
|
98
107
|
6. **Produce the code review**
|
|
@@ -123,7 +132,11 @@ Always apply:
|
|
|
123
132
|
- toolchain checks fail
|
|
124
133
|
- the code review contains blockers
|
|
125
134
|
- required acceptance criteria are FAIL or PARTIAL
|
|
126
|
-
- coverage below the governing thresholds (the root `CLAUDE.md` thresholds when stated, otherwise the defaults: line 85%, branch 75% for branch-capable languages; repo-wide per language, modified files
|
|
135
|
+
- coverage below the governing thresholds (the root `CLAUDE.md` thresholds when stated, otherwise the defaults: line 85%, branch 75% for branch-capable languages; repo-wide per language, modified files, or new files)
|
|
136
|
+
- Choose the remediation path. Write one line `Remediation-Path: light` or `Remediation-Path: full` into the remediation inputs, and inside each blocking finding block one line `Finding-Scope: contained` or `Finding-Scope: design`. A missing path line reads as `full`, and a missing scope line reads as `design`. These lines never contain the substrings the orchestrator counts.
|
|
137
|
+
- Write `Remediation-Path: light` only when all of these hold: at most 3 blocking findings, every one `autonomous` with `Finding-Scope: contained`; no change to a spec acceptance criterion, a public interface, or the file inventory beyond the branch diff plus tests and mirrors; no change to a validator contract, hook decision, or production logic beyond the finding's named location; the cycle is opened by a review; and the prior cycle was not light. Otherwise write `Remediation-Path: full`. The orchestrator may move a cycle to a heavier path and never to a lighter one.
|
|
138
|
+
- With `Remediation-Path: light`, also write a `## Light Fix Tasks` section: one canonical `- [ ] [P0-T1] ...` line per fix, numbered in order, each naming the file and the finding it fixes. Write no checkbox line anywhere else in the file, because the executor stop hook counts every checkbox line of the file it executes.
|
|
139
|
+
- The remediation plan target stays for both paths, because this review contract requires it.
|
|
127
140
|
- Create `remediation-inputs.<timestamp>.md` first.
|
|
128
141
|
- Create the target remediation plan file from the canonical plan template.
|
|
129
142
|
- Hand off plan creation through `remediation-handoff-atomic-planner`.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- **Status:** <template>
|
|
8
8
|
- **Version:** <version_number>
|
|
9
9
|
|
|
10
|
-
**Fail-closed evidence rule:** Include explicit baseline
|
|
10
|
+
**Fail-closed evidence rule:** Include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for each in-scope language when policy requires coverage. If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
|
|
11
11
|
|
|
12
12
|
**Evidence accounting rule:** Record the expected artifact path or location in each evidence-producing task. Do not mark evidence-backed work complete without the artifact.
|
|
13
13
|
|
|
@@ -33,15 +33,15 @@
|
|
|
33
33
|
|
|
34
34
|
**Phase 2 — Regression Test (must fail first)**
|
|
35
35
|
- [ ] [P2-T1] [expect-fail] Add a small, deterministic regression test in the standard module file (use `tests/bugs/<YYYY>/<issue>-<desc>.py` only if no clear home exists)
|
|
36
|
-
- [ ] [P2-T2] [expect-fail] Run the
|
|
36
|
+
- [ ] [P2-T2] [expect-fail] Run the parallel test gate to confirm the new regression test fails and captures the repro
|
|
37
37
|
|
|
38
38
|
**Phase 3 — Minimal Fix**
|
|
39
39
|
- [ ] [P3-T1] Apply the smallest change needed to make the regression test pass; avoid opportunistic refactors
|
|
40
40
|
|
|
41
41
|
**Phase 4 — Verification Loop**
|
|
42
|
-
- [ ] [P4-T1] Re-run repro
|
|
42
|
+
- [ ] [P4-T1] Re-run the repro to confirm expected behavior
|
|
43
43
|
- [ ] [P4-T2] Run formatter → linter → type checker → tests; restart loop if any step changes files or fails
|
|
44
|
-
- [ ] [P4-T3] Record baseline
|
|
44
|
+
- [ ] [P4-T3] Record the static baseline and final-QA artifact paths and the per-file threshold results for each in-scope language where coverage is required
|
|
45
45
|
|
|
46
46
|
**Phase 5 — Documentation & Status**
|
|
47
47
|
- [ ] [P5-T1] Update spec/issue with outcomes, decisions, and any deviations from scope
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
> - Start every task with a **strong verb** (Implement, Create, Update, Verify).
|
|
24
24
|
> - No "bucket" tasks like "Refactor module" or "Write tests"; split them into specific, verifiable steps.
|
|
25
25
|
> - **Self-Validating Phases:** Include necessary test creation/update tasks *within* the phase that implements the code. Do not defer verification to a final "Testing" phase.
|
|
26
|
-
> - Include explicit baseline
|
|
26
|
+
> - Include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for every language in scope when policy requires coverage.
|
|
27
27
|
> - Name the expected artifact path or location in each evidence-producing task's acceptance criteria.
|
|
28
|
-
> - If any required baseline artifact, QA artifact, or
|
|
28
|
+
> - If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
|
|
29
29
|
|
|
30
30
|
### Phase 0: Compliance & Context
|
|
31
31
|
- [ ] [P0-T1] Confirm alignment with repo policies by reading `.github/instructions/general-code-change.instructions.md`, `.github/instructions/python-code-change.instructions.md`, `.github/instructions/general-unit-test.instructions.md`, and `.github/instructions/python-unit-test.instructions.md` before touching code
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
- Unit: ...
|
|
58
58
|
- Integration: ...
|
|
59
59
|
- Manual/CLI: ...
|
|
60
|
-
- Coverage evidence: list baseline artifact paths,
|
|
60
|
+
- Coverage evidence: list the static baseline artifact paths, the final-QA artifact paths, and the per-file threshold results from the single gate run for each in-scope language
|
|
61
61
|
|
|
62
62
|
## Open Questions / Notes
|
|
63
63
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
Brief approach to reach the target structure while keeping behavior stable.
|
|
18
18
|
|
|
19
|
-
Fail-closed evidence rule: include explicit baseline
|
|
19
|
+
Fail-closed evidence rule: include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for each in-scope language when policy requires coverage. If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
|
|
20
20
|
|
|
21
21
|
Evidence accounting rule: record the expected artifact path or location in each evidence-producing task. Do not mark evidence-backed work complete without the artifact.
|
|
22
22
|
|
|
@@ -52,7 +52,7 @@ Evidence accounting rule: record the expected artifact path or location in each
|
|
|
52
52
|
- Unit/Integration: impacted modules and any regression tests for invariants
|
|
53
53
|
- CLI/Workflow: end-to-end commands/tasks expected to remain stable
|
|
54
54
|
- Tooling: lint/type checks after path updates
|
|
55
|
-
- Coverage evidence: list baseline artifact paths,
|
|
55
|
+
- Coverage evidence: list the static baseline artifact paths, the final-QA artifact paths, and the per-file threshold results from the single gate run for each in-scope language
|
|
56
56
|
|
|
57
57
|
## Rollback / Contingency
|
|
58
58
|
|
|
@@ -183,7 +183,7 @@ function Invoke-PoshQCTest {
|
|
|
183
183
|
[scriptblock] $EnsureModule = {
|
|
184
184
|
param([string] $Name, [string] $ErrorMessage, [string] $MinimumVersion, [string] $MaximumVersion)
|
|
185
185
|
# Issue #953 (CR-1): only an installed version inside the supported range counts as present, so a host
|
|
186
|
-
# whose only Pester is
|
|
186
|
+
# whose only Pester is 7.x or the inbox 3.4.0 receives the actionable message instead of an import error.
|
|
187
187
|
if (-not (Get-Module -ListAvailable -FullyQualifiedName @{ ModuleName = $Name; ModuleVersion = $MinimumVersion; MaximumVersion = $MaximumVersion })) { throw $ErrorMessage }
|
|
188
188
|
# Import globally so Pester's Describe/It/Mock resolve in test containers. Under the default
|
|
189
189
|
# $InvokePester trampoline, test code runs in this module's session state, not the global
|
|
@@ -327,7 +327,7 @@ function Invoke-PoshQCTest {
|
|
|
327
327
|
$Root = [IO.Path]::GetFullPath([IO.Path]::Combine($PWD.ProviderPath, $Root))
|
|
328
328
|
}
|
|
329
329
|
|
|
330
|
-
& $EnsureModule 'Pester' "Pester is not installed in the supported range (
|
|
330
|
+
& $EnsureModule 'Pester' "Pester is not installed in the supported range (6.2.0 to 6.99.99). Run Install-PoshQCTool (alias Install-PoshQCTools) first." '6.2.0' '6.99.99'
|
|
331
331
|
|
|
332
332
|
if (-not (& $TestPathExists $SettingsPath)) {
|
|
333
333
|
throw "Settings not found: $SettingsPath"
|
|
@@ -53,9 +53,9 @@ function Install-PoshQCTool {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
$requiredModules = @(
|
|
56
|
-
@{ Name = 'PSScriptAnalyzer'; Version = '1.
|
|
57
|
-
#
|
|
58
|
-
@{ Name = 'Pester'; Version = '
|
|
56
|
+
@{ Name = 'PSScriptAnalyzer'; Version = '1.25.0' },
|
|
57
|
+
# The selected Pester 6 range excludes the next major until separately validated (issue #1082).
|
|
58
|
+
@{ Name = 'Pester'; Version = '6.2.0'; UpperBound = '7.0.0' }
|
|
59
59
|
)
|
|
60
60
|
|
|
61
61
|
# Issue #953 (CR-3): one version-range predicate serves the present check and the post-install check.
|
|
@@ -6,14 +6,14 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
6
6
|
|
|
7
7
|
- Formats PowerShell code with consistent indentation and pipeline alignment.
|
|
8
8
|
- Lints with PSScriptAnalyzer using a strict, dual-runtime ruleset.
|
|
9
|
-
- Runs Pester tests with code coverage (
|
|
9
|
+
- Runs Pester tests with code coverage (JaCoCo output), plus an optional Koverage-friendly copy.
|
|
10
10
|
- Provides a single suite entry point that can format, analyze, and test a selected workspace scope.
|
|
11
11
|
- Provides a one-time dependency installer for PSScriptAnalyzer and Pester.
|
|
12
12
|
|
|
13
13
|
## Requirements
|
|
14
14
|
|
|
15
15
|
- PowerShell 5.1 or 7.6+
|
|
16
|
-
- Modules: PSScriptAnalyzer 1.
|
|
16
|
+
- Modules: PSScriptAnalyzer 1.25.0, Pester 6.2.0 or later, below 7.0 (installed automatically via the helper if missing)
|
|
17
17
|
|
|
18
18
|
## Getting started
|
|
19
19
|
|
|
@@ -48,7 +48,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
- Writes JUnit XML to `artifacts/pester/pester-junit.xml`.
|
|
51
|
-
- Writes
|
|
51
|
+
- Writes JaCoCo XML to `artifacts/pester/powershell-coverage.xml`.
|
|
52
52
|
- Also emits `*.koverage.xml` (relative paths) for VS Code Coverage Gutters and Koverage. Disable with `-DisableKoverageCopy` or override the path with `-KoverageOutputPath`.
|
|
53
53
|
|
|
54
54
|
## Functions
|
|
@@ -63,7 +63,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
63
63
|
- `New-PoshQCShardManifest`: build the in-memory shard manifest (`shardIndex`, `shardCount`, `all`, `selected`, `selectedFullPath`).
|
|
64
64
|
- `Test-PoshQCShardCompleteness`: throw unless a set of shard manifests selects every test file exactly once.
|
|
65
65
|
- `Test-PoshQCShardTestCount`: throw unless the shard test counts sum to a discovery-pass test count.
|
|
66
|
-
- `Merge-PoshQCCoverageReport`: merge the
|
|
66
|
+
- `Merge-PoshQCCoverageReport`: merge the JaCoCo XML texts of the shards at LINE granularity (no file I/O, no threshold).
|
|
67
67
|
- `Get-PoshQCCoverageLineSummary`: return covered, missed, total, and percent from a report's LINE counter.
|
|
68
68
|
- `Invoke-PoshQCParallelTest`: run the Pester suite as concurrent shard processes on one machine and merge the results (see Local concurrent runs below).
|
|
69
69
|
- `Get-PoshQCParallelWorkerCount`: return the default worker count, half the logical processors, at least 1 and at most 8.
|
|
@@ -75,8 +75,8 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
75
75
|
- PSScriptAnalyzer settings: `./settings/pssa.settings.psd1`
|
|
76
76
|
- Enforces compatible syntax for 5.1 and 7.6, 4-space indentation, ShouldProcess for state-changing functions, and safety guards (no Invoke-Expression, no global vars, etc.).
|
|
77
77
|
- Pester settings: `./settings/pester.runsettings.psd1`
|
|
78
|
-
- Runs tests under `scripts` and `tests/powershell`, outputs JUnit XML and
|
|
79
|
-
- Coverage uses Pester's profiler-based mode (`CodeCoverage.UseBreakpoints = $false`, issue #953), which needs Pester
|
|
78
|
+
- Runs tests under `scripts` and `tests/powershell`, outputs JUnit XML and JaCoCo coverage, and enables coverage. The shipped runsettings carry no `CodeCoverage.Path` list; `Invoke-PoshQCTest` derives the coverage population from the workspace (see Coverage population below).
|
|
79
|
+
- Coverage uses Pester's profiler-based mode (`CodeCoverage.UseBreakpoints = $false`, issue #953), which needs Pester 6.2 or later and is faster than breakpoint mode on the same coverage population. The PoshQC suites target PowerShell 7; profiler mode under Windows PowerShell 5.1 is not exercised in CI. To use breakpoint mode, pass a settings file with `UseBreakpoints = $true` through `-SettingsPath`.
|
|
80
80
|
- When `-ScanFolders` is supplied to `Invoke-PoshQCSuite` or the lower-level commands, the suite narrows discovery to those workspace-relative or workspace-contained folders.
|
|
81
81
|
- Coverage population (issue #527): `Invoke-PoshQCTest` measures the same file set for the same workspace whichever module copy is loaded.
|
|
82
82
|
- Workspace configuration: `config/poshqc-coverage.json` with the schema `{"version": 1, "roots": [...]}`. Each root is a workspace-relative folder. The file is validated fail-fast, and every error names `config/poshqc-coverage.json`: empty content, invalid JSON, a `version` other than 1, a missing or non-array `roots`, and a blank, absolute, or `..`-segment entry are rejected. An empty `roots` array yields an empty population.
|
|
@@ -98,7 +98,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
98
98
|
- A shard that selects no test file (more shards than test files) stops with an error before Pester runs.
|
|
99
99
|
- `Merge-PoshQCCoverageReport` merges the shard reports with `ci = max(ci)` per line and recomputes the LINE and INSTRUCTION counters, so the merged LINE figures are exact. It omits `class` and `method` elements and METHOD and CLASS counters, because those cannot be recomputed from line hits.
|
|
100
100
|
- Output-path parameters (issue #1048): `Invoke-PoshQCTest -TestResultPath <path> -CoverageOutputPath <path>` replace the JUnit and coverage output paths of the settings file for one invocation; a relative path is resolved against `-Root`. When a parameter is omitted or blank, the settings value is used.
|
|
101
|
-
- Local concurrent runs (issue #1048): `Invoke-PoshQCParallelTest -Root . [-WorkerCount <n>]` runs the suite as concurrent shard processes on one machine.
|
|
101
|
+
- Local concurrent runs (issue #1048): `Invoke-PoshQCParallelTest -Root . [-WorkerCount <n>]` runs the suite as concurrent shard processes on one machine. Each shard runs Pester 6 in a separate `pwsh` process; the VS Code task `PoshQC: 4 test (Pester, parallel)` runs it.
|
|
102
102
|
- The worker count defaults to half the logical processor count, at least 1 and at most 8 (`Get-PoshQCParallelWorkerCount`); `-WorkerCount` overrides it.
|
|
103
103
|
- Each shard runs `Invoke-PoshQCTest -ShardIndex <i> -ShardCount <N>` with its JUnit, coverage, and manifest files and its console log (`shard.log`, standard error in `shard.log.err`) under `artifacts/pester/parallel/shard-<i>/`.
|
|
104
104
|
- After every shard has exited, the runner checks the manifests with `Test-PoshQCShardCompleteness`, merges the JUnit reports with `Merge-PoshQCJunitReport` and the coverage reports with `Merge-PoshQCCoverageReport`, and writes `artifacts/pester/pester-junit.xml`, `artifacts/pester/powershell-coverage.xml`, and the `powershell-coverage.koverage.xml` copy.
|
|
@@ -109,7 +109,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
109
109
|
|
|
110
110
|
- Day-to-day: run `Invoke-PoshQCFormat`, `Invoke-PoshQCAnalyze`, then `Invoke-PoshQCTest` before committing.
|
|
111
111
|
- Bundled / scoped: run `Invoke-PoshQCSuite -Root . -ScanFolders @('scripts', 'tests/powershell')` when you want the suite to focus on selected workspace folders.
|
|
112
|
-
- CI: call `Invoke-PoshQCTest` to get tests + coverage and consume JUnit/
|
|
112
|
+
- CI: call `Invoke-PoshQCTest` to get tests + coverage and consume JUnit/JaCoCo artifacts.
|
|
113
113
|
|
|
114
114
|
## Notes for standalone use
|
|
115
115
|
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
}
|
|
17
17
|
CodeCoverage = @{
|
|
18
18
|
Enabled = $true
|
|
19
|
-
# Use Pester's
|
|
19
|
+
# Use Pester's JaCoCo format so VS Code Coverage Gutters
|
|
20
20
|
# can map file paths correctly.
|
|
21
|
-
OutputFormat = '
|
|
21
|
+
OutputFormat = 'JaCoCo'
|
|
22
22
|
OutputPath = 'artifacts/pester/powershell-coverage.xml'
|
|
23
23
|
# Issue #527: no Path list. Invoke-PoshQCTest derives the coverage population from the
|
|
24
24
|
# workspace (config/poshqc-coverage.json, else the effective test scan folders); see README.md.
|
|
@@ -42,9 +42,8 @@ When performing a policy audit:
|
|
|
42
42
|
When asked to perform a Policy Audit for a component, branch, or PR:
|
|
43
43
|
|
|
44
44
|
1. **Identify scope**
|
|
45
|
-
- Determine what is being audited (e.g., "fix-all.ps1 unit tests", "
|
|
45
|
+
- Determine what is being audited (e.g., "fix-all.ps1 unit tests", "scoring pipeline refactor", "new Python module X").
|
|
46
46
|
- Identify the relevant code files and test files.
|
|
47
|
-
- **Document baseline coverage BEFORE making changes** (if development has not yet started, or shelve changes temporarily to establish baseline).
|
|
48
47
|
|
|
49
48
|
2. **Create an audit document**
|
|
50
49
|
- Generate a timestamp in ISO-8601 format `yyyy-MM-ddTHH-mm` (e.g., "2026-01-08T14-30" for Jan 8, 2026 at 2:30 PM).
|
|
@@ -57,7 +56,7 @@ When asked to perform a Policy Audit for a component, branch, or PR:
|
|
|
57
56
|
- Fill in the Coverage Metrics by Language table with one row per language.
|
|
58
57
|
- Complete all applicable language sections (3A, 3B, 3C, 3D for code; 4A, 4B for tests).
|
|
59
58
|
- Delete sections for languages NOT involved in this change.
|
|
60
|
-
-
|
|
59
|
+
- Record each retained baseline field as `N/A - no pre-change run`.
|
|
61
60
|
- Add one per-language comparison bullet for every in-scope language that has coverage requirements.
|
|
62
61
|
|
|
63
62
|
3. **Evaluate policy compliance**
|
|
@@ -69,17 +68,17 @@ When asked to perform a Policy Audit for a component, branch, or PR:
|
|
|
69
68
|
- Record **status** (`✅ PASS`, `⚠️ PARTIAL`, `❌ FAIL`, `N/A`) and **evidence** in the appropriate table rows.
|
|
70
69
|
- **For multi-language changes:**
|
|
71
70
|
- Run each language's toolchain separately and document results in its section.
|
|
72
|
-
- **Python:** Black → Ruff → Pyright →
|
|
73
|
-
- **PowerShell:** Invoke-PoshQCFormat → Invoke-PoshQCAnalyze → Invoke-
|
|
71
|
+
- **Python:** Black → Ruff → Pyright → `poetry run pytest -n auto` (with coverage)
|
|
72
|
+
- **PowerShell:** Invoke-PoshQCFormat → Invoke-PoshQCAnalyze → Invoke-PoshQCParallelTest (with coverage)
|
|
74
73
|
- **Bash:** shfmt → shellcheck → bats (coverage N/A)
|
|
75
74
|
- **JSON:** format_json → validate_json (coverage N/A)
|
|
76
75
|
- **For coverage metrics (Python and PowerShell only):**
|
|
77
|
-
-
|
|
76
|
+
- Read each changed file from the single gate run and compare it with the coverage thresholds (per language).
|
|
78
77
|
- Isolate and measure coverage of new/modified code only (must be ≥90% per language).
|
|
79
|
-
- Use concrete examples showing calculations: "
|
|
78
|
+
- Use concrete examples showing calculations: "Post-change: 87.1% against the 85% line threshold ✅"
|
|
80
79
|
- **Fail-closed evidence handling:**
|
|
81
|
-
- No policy audit may report PASS unless it includes numeric
|
|
82
|
-
- If any required
|
|
80
|
+
- No policy audit may report PASS unless it includes numeric post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
|
|
81
|
+
- If any required QA artifact or post-change coverage metric is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
|
|
83
82
|
- Do not synthesize or backfill missing audit evidence from memory or inference.
|
|
84
83
|
- If evidence is missing, stop and report the exact missing artifact paths.
|
|
85
84
|
- **For scenario testing:**
|
|
@@ -105,7 +104,7 @@ When asked to perform a Policy Audit for a component, branch, or PR:
|
|
|
105
104
|
6. **Summarize and recommend**
|
|
106
105
|
- Complete the summary sections at the end of the template:
|
|
107
106
|
- Policy-by-policy summary
|
|
108
|
-
- Metrics summary (with deterministic
|
|
107
|
+
- Metrics summary (with deterministic post-change and new code coverage)
|
|
109
108
|
- Recommendation (`Ready for merge`, `Needs revision`, or `Blocked`)
|
|
110
109
|
- Ensure the final audit document is consistent with the underlying evidence and toolchain output.
|
|
111
110
|
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
|
|
31
31
|
| Language | Files Changed | Tests | Test Result | Baseline Coverage | Post-Change Coverage | New Code Coverage |
|
|
32
32
|
|----------|--------------|-------|-------------|-------------------|---------------------|-------------------|
|
|
33
|
-
| Python | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail |
|
|
34
|
-
| PowerShell | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail |
|
|
33
|
+
| Python | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | N/A - no pre-change run | [N]% lines, [N]% funcs | [N]% |
|
|
34
|
+
| PowerShell | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | N/A - no pre-change run | [N]% cmds, [N]% funcs | [N]% |
|
|
35
35
|
| Bash | [N] files | [N/A] tests | [✅/❌/N/A] | N/A (no coverage) | N/A (no coverage) | N/A |
|
|
36
36
|
| JSON | [N] files | N/A | [✅/❌] validation | N/A (config files) | N/A (config files) | N/A |
|
|
37
37
|
|
|
@@ -39,15 +39,15 @@
|
|
|
39
39
|
|
|
40
40
|
### Coverage Evidence Checklist
|
|
41
41
|
|
|
42
|
-
- TypeScript baseline coverage artifact:
|
|
42
|
+
- TypeScript baseline coverage artifact: N/A - no pre-change run
|
|
43
43
|
- TypeScript post-change coverage artifact: [path or `N/A - out of scope`]
|
|
44
|
-
- PowerShell baseline coverage artifact:
|
|
44
|
+
- PowerShell baseline coverage artifact: N/A - no pre-change run
|
|
45
45
|
- PowerShell post-change coverage artifact: [path or `N/A - out of scope`]
|
|
46
46
|
- Per-language comparison summary: [section reference or artifact path]
|
|
47
47
|
|
|
48
|
-
**Non-negotiable verdict rule:** No policy audit may report PASS unless it includes numeric
|
|
48
|
+
**Non-negotiable verdict rule:** No policy audit may report PASS unless it includes numeric post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
|
|
49
49
|
|
|
50
|
-
**Fail-closed rule:** If any required
|
|
50
|
+
**Fail-closed rule:** If any required QA artifact or post-change coverage metric is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
|
|
51
51
|
|
|
52
52
|
**Evidence rule:** Do not synthesize or backfill missing audit evidence from memory or inference. If evidence is missing, stop and list the exact missing artifact paths.
|
|
53
53
|
|
|
@@ -94,8 +94,7 @@
|
|
|
94
94
|
|
|
95
95
|
| Requirement | Status | Evidence |
|
|
96
96
|
|------------|--------|----------|
|
|
97
|
-
| **
|
|
98
|
-
| **No Coverage Regression** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Post-change coverage:** [N]% lines, [N]% functions<br>**Change:** [+/-N]% lines, [+/-N]% functions<br>**Status:** [No regression / Regression detected: justification]<br>**Example:** "Baseline: 85.2% → Post-change: 87.1% (+1.9%) ✅ PASS" |
|
|
97
|
+
| **Changed Files Meet Thresholds** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Post-change coverage:** [N]% lines, [N]% functions, read from the single gate run<br>**Thresholds:** [line and branch thresholds that apply]<br>**Status:** [All changed files meet the thresholds / Files below a threshold: list]<br>**Example:** "Post-change: 87.1% against the 85% line threshold ✅ PASS" |
|
|
99
98
|
| **New Code Coverage ≥90%** | [✅/❌/N/A] [PASS/FAIL/N/A] | **New/modified files:** [list files]<br>**New code coverage:** [N]% (must be ≥90%)<br>**Calculation method:** [describe how new code was isolated for measurement]<br>**Example:** "New module `foo.py`: 127/135 lines covered = 94.1% ✅ PASS" |
|
|
100
99
|
| **Comprehensive Coverage** | [✅/❌/N/A] [PASS/FAIL/N/A] | **All functions/classes tested:**<br>- `function_name()` (lines X-Y): [N] tests<br>- `ClassName` (lines A-B): [N] tests<br>**Untested code:** [list with justification]<br>**Example:**<br>- `parse_config()` (lines 45-67): 3 tests<br>- `ConfigLoader` (lines 100-150): 5 tests<br>- Untested: `__repr__()` (trivial representation, no business logic) |
|
|
101
100
|
| **Positive Flows** - Valid inputs | [✅/❌/N/A] [PASS/FAIL/N/A] | **All positive scenarios tested:**<br>- `test_function_with_valid_string`: Tests normal string input → returns expected output<br>- `test_function_with_valid_number`: Tests numeric input in valid range → performs calculation<br>- `test_function_with_default_params`: Tests function with default parameters → uses correct defaults<br>**Total positive tests:** [N] |
|
|
@@ -109,7 +108,7 @@
|
|
|
109
108
|
|
|
110
109
|
Repeat one bullet per in-scope language that has coverage requirements. Keep the checklist above even when a language is out of scope, but use `N/A - out of scope` for the artifact path.
|
|
111
110
|
|
|
112
|
-
- [Language]: Baseline:
|
|
111
|
+
- [Language]: Baseline: N/A - no pre-change run -> Post-change: [N]% [unit]. Change: N/A. New/changed-code coverage: [N]% or `N/A - out of scope`. Disposition: [PASS/FAIL/N/A]. Evidence: [artifact path(s)].
|
|
113
112
|
|
|
114
113
|
### 1.3 Test Structure and Diagnostics
|
|
115
114
|
|
|
@@ -208,7 +207,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
208
207
|
| **Formatting with Black** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run black .`<br>**Result:** [Describe result] |
|
|
209
208
|
| **Linting with Ruff** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run ruff check`<br>**Result:** [Describe result] |
|
|
210
209
|
| **Type checking with Pyright** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pyright`<br>**Result:** [Describe result] |
|
|
211
|
-
| **Testing with Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest`<br>**Result:** [Describe result] |
|
|
210
|
+
| **Testing with Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest -n auto`<br>**Result:** [Describe result] |
|
|
212
211
|
|
|
213
212
|
#### 3A.2 Python Design & Typing
|
|
214
213
|
|
|
@@ -342,7 +341,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
342
341
|
|
|
343
342
|
| Requirement | Status | Evidence |
|
|
344
343
|
|------------|--------|----------|
|
|
345
|
-
| **Use Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest`<br>**Result:** [Describe test results] |
|
|
344
|
+
| **Use Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest -n auto`<br>**Result:** [Describe test results] |
|
|
346
345
|
| **No Alternative Test Runners** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Confirm only Pytest is used.] |
|
|
347
346
|
|
|
348
347
|
---
|
|
@@ -353,8 +352,8 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
353
352
|
|
|
354
353
|
| Requirement | Status | Evidence |
|
|
355
354
|
|------------|--------|----------|
|
|
356
|
-
| **Use Pester
|
|
357
|
-
| **Use PoshQC Configuration** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-
|
|
355
|
+
| **Use Pester v6.x** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe Pester v6 features used (BeforeAll, BeforeEach, Describe/Context/It, modern Should syntax).] |
|
|
356
|
+
| **Use PoshQC Configuration** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCParallelTest -Root .`<br>**Config:** `scripts/powershell/PoshQC/settings/pester.runsettings.psd1`<br>[Describe configuration updates if any.] |
|
|
358
357
|
| **PowerShell 5.1 & 7.6+ Compatible** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe compatibility testing. Note any version-specific features.] |
|
|
359
358
|
|
|
360
359
|
#### 4B.2 Test Style and Structure
|
|
@@ -379,7 +378,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
379
378
|
|
|
380
379
|
| Requirement | Status | Evidence |
|
|
381
380
|
|------------|--------|----------|
|
|
382
|
-
| **Use PoshQCTest Command** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-
|
|
381
|
+
| **Use PoshQCTest Command** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCParallelTest -Root .`<br>**Result:** [Describe test results] |
|
|
383
382
|
| **No Alternative Test Runners** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Confirm only Pester is used through PoshQC.] |
|
|
384
383
|
|
|
385
384
|
---
|
|
@@ -438,7 +437,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
438
437
|
| Black Formatting | `poetry run black .` | [result] | [✅/❌] |
|
|
439
438
|
| Ruff Linting | `poetry run ruff check` | [result] | [✅/❌] |
|
|
440
439
|
| Pyright Type Checking | `poetry run pyright` | [result] | [✅/❌] |
|
|
441
|
-
| Pytest Tests | `poetry run pytest` | [result] | [✅/❌] |
|
|
440
|
+
| Pytest Tests | `poetry run pytest -n auto` | [result] | [✅/❌] |
|
|
442
441
|
|
|
443
442
|
**For PowerShell:**
|
|
444
443
|
|
|
@@ -446,7 +445,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
446
445
|
|-------|---------|--------|--------|
|
|
447
446
|
| Invoke-Formatter | `Invoke-PoshQCFormat -Root .` | [result] | [✅/❌] |
|
|
448
447
|
| PSScriptAnalyzer | `Invoke-PoshQCAnalyze -Root .` | [result] | [✅/❌] |
|
|
449
|
-
| Pester Tests | `Invoke-
|
|
448
|
+
| Pester Tests | `Invoke-PoshQCParallelTest -Root .` | [result] | [✅/❌] |
|
|
450
449
|
|
|
451
450
|
**Notes:**
|
|
452
451
|
[Document any pre-existing failures unrelated to this work. Explain any deviations from clean runs.]
|
|
@@ -515,7 +514,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
515
514
|
|
|
516
515
|
[Provide a brief summary of overall compliance status and any major findings.]
|
|
517
516
|
|
|
518
|
-
**Fail-closed reminder:** Do not mark the audit PASS, fully compliant, or ready for merge when any required
|
|
517
|
+
**Fail-closed reminder:** Do not mark the audit PASS, fully compliant, or ready for merge when any required QA artifact or post-change coverage metric is missing.
|
|
519
518
|
|
|
520
519
|
---
|
|
521
520
|
|
|
@@ -626,8 +625,8 @@ poetry run ruff check --fix # auto-fix
|
|
|
626
625
|
poetry run pyright
|
|
627
626
|
|
|
628
627
|
# Testing
|
|
629
|
-
poetry run pytest
|
|
630
|
-
poetry run pytest --cov=src/[package] --cov-report=term-missing
|
|
628
|
+
poetry run pytest -n auto
|
|
629
|
+
poetry run pytest -n auto --cov=src/[package] --cov-report=term-missing
|
|
631
630
|
```
|
|
632
631
|
|
|
633
632
|
**For PowerShell:**
|
|
@@ -639,7 +638,7 @@ Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCFormat -Root .
|
|
|
639
638
|
Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCAnalyze -Root .
|
|
640
639
|
|
|
641
640
|
# Testing
|
|
642
|
-
Import-Module ./scripts/powershell/PoshQC; Invoke-
|
|
641
|
+
Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCParallelTest -Root .
|
|
643
642
|
```
|
|
644
643
|
|
|
645
644
|
---
|