@danmoisan/drm-copilot-mcp 1.0.22 → 1.0.24
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 +164 -7
- package/package.json +1 -1
- package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +27 -8
- package/resources/claude-customizations/.claude/agents/parallel-planner.md +44 -10
- package/resources/claude-customizations/.claude/lib/bash/compute-cohorts.sh +143 -0
- package/resources/claude-customizations/.claude/lib/bash/compute-concurrency-batches.sh +122 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-cohorts.sh +330 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-common.sh +238 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-items-validate.sh +244 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-manifest-validate.sh +187 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-yaml-emit.sh +340 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-yaml-scan.sh +335 -0
- package/resources/claude-customizations/.claude/lib/bash/validate-parallel-manifest.sh +134 -0
- package/resources/claude-customizations/.claude/rules/shell.md +7 -2
- package/resources/claude-customizations/.claude/settings.json +3 -0
- package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +9 -5
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +24 -13
- package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +62 -21
- package/resources/claude-customizations/.claude-variants/csharp-legacy/rules/csharp.md +4 -4
- package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +5 -3
- package/resources/claude-customizations/config/blast-radius.json +16 -0
- package/resources/claude-customizations/config/orchestration-routing.json +355 -0
- package/resources/claude-customizations/pack-manifests/core.json +14 -1
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp/SKILL.md +3 -3
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +5 -3
- package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"routes": {
|
|
5
|
+
"small": {
|
|
6
|
+
"description": "Minor-audit path for work inside the applicable language budget.",
|
|
7
|
+
"codex_topology_requirement": {
|
|
8
|
+
"receipt_key": "codex_topology_receipts",
|
|
9
|
+
"required_execution_context": "standalone",
|
|
10
|
+
"required_route": "small",
|
|
11
|
+
"delegation_agent_source": "resolved_language_typed_engineer"
|
|
12
|
+
},
|
|
13
|
+
"required_agents": [
|
|
14
|
+
"atomic-planner",
|
|
15
|
+
"atomic-executor",
|
|
16
|
+
"feature-review"
|
|
17
|
+
],
|
|
18
|
+
"required_skills": [
|
|
19
|
+
"orchestrate",
|
|
20
|
+
"feature-promotion-lifecycle",
|
|
21
|
+
"atomic-plan-contract",
|
|
22
|
+
"acceptance-criteria-tracking",
|
|
23
|
+
"pr-context-artifacts",
|
|
24
|
+
"pr-base-branch-merge-base"
|
|
25
|
+
],
|
|
26
|
+
"required_mcp_tools": [
|
|
27
|
+
"new_potential_entry",
|
|
28
|
+
"potential_to_issue",
|
|
29
|
+
"new_active_feature_folder",
|
|
30
|
+
"collect_pr_context",
|
|
31
|
+
"validate_orchestration_artifacts"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"large": {
|
|
35
|
+
"description": "Full feature or bug path for work outside small-path budget.",
|
|
36
|
+
"requires_pr_gate": true,
|
|
37
|
+
"required_agents": [
|
|
38
|
+
"task-researcher",
|
|
39
|
+
"prd-feature",
|
|
40
|
+
"atomic-planner",
|
|
41
|
+
"atomic-executor",
|
|
42
|
+
"feature-review",
|
|
43
|
+
"pr-author"
|
|
44
|
+
],
|
|
45
|
+
"required_skills": [
|
|
46
|
+
"orchestrate",
|
|
47
|
+
"feature-promotion-lifecycle",
|
|
48
|
+
"atomic-plan-contract",
|
|
49
|
+
"acceptance-criteria-tracking",
|
|
50
|
+
"pr-context-artifacts",
|
|
51
|
+
"pr-base-branch-merge-base"
|
|
52
|
+
],
|
|
53
|
+
"required_mcp_tools": [
|
|
54
|
+
"new_potential_entry",
|
|
55
|
+
"potential_to_issue",
|
|
56
|
+
"new_active_feature_folder",
|
|
57
|
+
"collect_pr_context",
|
|
58
|
+
"validate_orchestration_artifacts"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"remediation": {
|
|
62
|
+
"description": "Review-triggered remediation loop.",
|
|
63
|
+
"required_agents": [
|
|
64
|
+
"atomic-planner",
|
|
65
|
+
"atomic-executor",
|
|
66
|
+
"feature-review"
|
|
67
|
+
],
|
|
68
|
+
"required_skills": [
|
|
69
|
+
"orchestrate",
|
|
70
|
+
"atomic-plan-contract",
|
|
71
|
+
"acceptance-criteria-tracking",
|
|
72
|
+
"pr-context-artifacts"
|
|
73
|
+
],
|
|
74
|
+
"required_mcp_tools": [
|
|
75
|
+
"collect_pr_context",
|
|
76
|
+
"validate_orchestration_artifacts"
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"preparation": {
|
|
80
|
+
"description": "Epic preparation path driven by epic-planner: promotion, research, feature documents, atomic planning, and preflight clearance only. Atomic execution, PR authoring, and CI monitoring are out of scope and deferred to the epic execution phase, so this route requires no CI gate at completion.",
|
|
81
|
+
"requires_ci_gate": false,
|
|
82
|
+
"required_agents": [
|
|
83
|
+
"task-researcher",
|
|
84
|
+
"prd-feature",
|
|
85
|
+
"atomic-planner",
|
|
86
|
+
"atomic-executor"
|
|
87
|
+
],
|
|
88
|
+
"required_skills": [
|
|
89
|
+
"orchestrate",
|
|
90
|
+
"feature-promotion-lifecycle",
|
|
91
|
+
"atomic-plan-contract"
|
|
92
|
+
],
|
|
93
|
+
"required_mcp_tools": [
|
|
94
|
+
"new_potential_entry",
|
|
95
|
+
"potential_to_issue",
|
|
96
|
+
"new_active_feature_folder",
|
|
97
|
+
"validate_orchestration_artifacts"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"parallel": {
|
|
101
|
+
"description": "Parallel path for scheduling independent items into blast-radius cohorts across parallel worktrees; each item PRs to main independently with no integration branch.",
|
|
102
|
+
"requires_pr_gate": false,
|
|
103
|
+
"required_agents": [
|
|
104
|
+
"orchestrator",
|
|
105
|
+
"pr-author"
|
|
106
|
+
],
|
|
107
|
+
"required_skills": [
|
|
108
|
+
"parallel-orchestrate",
|
|
109
|
+
"orchestrate",
|
|
110
|
+
"feature-promotion-lifecycle",
|
|
111
|
+
"atomic-plan-contract",
|
|
112
|
+
"acceptance-criteria-tracking",
|
|
113
|
+
"evidence-and-timestamp-conventions",
|
|
114
|
+
"pr-context-artifacts",
|
|
115
|
+
"pr-base-branch-merge-base"
|
|
116
|
+
],
|
|
117
|
+
"required_mcp_tools": [
|
|
118
|
+
"collect_pr_context",
|
|
119
|
+
"validate_orchestration_artifacts"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"epic": {
|
|
123
|
+
"description": "Epic path for scheduling a dependency graph of child features across parallel worktrees with fan-in via a shared integration branch.",
|
|
124
|
+
"requires_pr_gate": true,
|
|
125
|
+
"required_agents": [
|
|
126
|
+
"orchestrator",
|
|
127
|
+
"pr-author"
|
|
128
|
+
],
|
|
129
|
+
"required_skills": [
|
|
130
|
+
"epic-orchestrate",
|
|
131
|
+
"orchestrate",
|
|
132
|
+
"feature-promotion-lifecycle",
|
|
133
|
+
"atomic-plan-contract",
|
|
134
|
+
"acceptance-criteria-tracking",
|
|
135
|
+
"evidence-and-timestamp-conventions",
|
|
136
|
+
"pr-context-artifacts",
|
|
137
|
+
"pr-base-branch-merge-base"
|
|
138
|
+
],
|
|
139
|
+
"required_mcp_tools": [
|
|
140
|
+
"collect_pr_context",
|
|
141
|
+
"validate_orchestration_artifacts"
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"model_policy": {
|
|
146
|
+
"description": "Judgment-based complexity-band model selection. This block governs only the delegation model tier. It is not a route input, and route is not an input to model selection.",
|
|
147
|
+
"tier_order": [
|
|
148
|
+
"haiku",
|
|
149
|
+
"sonnet",
|
|
150
|
+
"opus",
|
|
151
|
+
"fable"
|
|
152
|
+
],
|
|
153
|
+
"complexity": {
|
|
154
|
+
"scale": "C1 trivial or mechanical change with no behavior effect. C2 localized feature or bug change confined to a small surface. C3 cross-cutting change that alters an invariant, contract, or behavior across module boundaries. C4 novel, ambiguous, or research-heavy change requiring the most capable tier; C4 is reached only by judgment and is never floor-forced.",
|
|
155
|
+
"signals": [
|
|
156
|
+
{
|
|
157
|
+
"name": "classifier_or_model_logic",
|
|
158
|
+
"floor": true,
|
|
159
|
+
"anchor": "Changes to classifier engines, scoring, or model-affecting logic (T1 modules)."
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"name": "auth_or_token_handling",
|
|
163
|
+
"floor": true,
|
|
164
|
+
"anchor": "Changes to authentication, token handling, or other security-sensitive paths."
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"name": "concurrency_or_ordering",
|
|
168
|
+
"floor": true,
|
|
169
|
+
"anchor": "Introduces or modifies concurrency, ordering, or state-transition invariants."
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"name": "cross_module_contract_change",
|
|
173
|
+
"floor": true,
|
|
174
|
+
"anchor": "Alters a public contract or schema consumed across module boundaries."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "single_file_localized_edit",
|
|
178
|
+
"floor": false,
|
|
179
|
+
"anchor": "A localized edit confined to one file with no cross-cutting effect."
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "mechanical_rename_or_move",
|
|
183
|
+
"floor": false,
|
|
184
|
+
"anchor": "A mechanical rename, move, or formatting change with no behavior change."
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "docs_or_comment_only",
|
|
188
|
+
"floor": false,
|
|
189
|
+
"anchor": "A documentation-only or comment-only change."
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
"complexity_to_model": {
|
|
194
|
+
"C1": "haiku",
|
|
195
|
+
"C2": "sonnet",
|
|
196
|
+
"C3": "opus",
|
|
197
|
+
"C4": "fable"
|
|
198
|
+
},
|
|
199
|
+
"preferred_overlay": {
|
|
200
|
+
"description": "Applied only under fable_policy preferred. Changes only the C3 cell to fable, and only for the listed agents. No other agent and no other band is affected.",
|
|
201
|
+
"agents": [
|
|
202
|
+
"atomic-planner",
|
|
203
|
+
"prd-feature",
|
|
204
|
+
"feature-review",
|
|
205
|
+
"task-researcher"
|
|
206
|
+
],
|
|
207
|
+
"band": "C3",
|
|
208
|
+
"model": "fable"
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
"model_budget": {
|
|
212
|
+
"description": "Session-level model budget. fable_policy is a three-way switch controlling whether the fable tier is disabled (removed and clamped to opus), available (used as-is), or preferred (applies the preferred_overlay).",
|
|
213
|
+
"fable_policy": "preferred"
|
|
214
|
+
},
|
|
215
|
+
"codex_topology_policy": {
|
|
216
|
+
"description": "Codex-native production-file-count routing. This axis selects the initial implementation topology independently from C1-C4 model selection.",
|
|
217
|
+
"execution_contexts": [
|
|
218
|
+
"standalone",
|
|
219
|
+
"epic_preparation_child",
|
|
220
|
+
"epic_execution_child"
|
|
221
|
+
],
|
|
222
|
+
"language_budgets": {
|
|
223
|
+
"python": {
|
|
224
|
+
"direct_mode_enabled": true,
|
|
225
|
+
"max_production_files": 3,
|
|
226
|
+
"max_test_files": 3,
|
|
227
|
+
"logical_agent": "python-typed-engineer"
|
|
228
|
+
},
|
|
229
|
+
"powershell": {
|
|
230
|
+
"direct_mode_enabled": true,
|
|
231
|
+
"max_production_files": 2,
|
|
232
|
+
"max_test_files": 3,
|
|
233
|
+
"logical_agent": "powershell-typed-engineer"
|
|
234
|
+
},
|
|
235
|
+
"csharp": {
|
|
236
|
+
"direct_mode_enabled": true,
|
|
237
|
+
"max_production_files": 3,
|
|
238
|
+
"max_test_files": 3,
|
|
239
|
+
"logical_agent": "csharp-typed-engineer"
|
|
240
|
+
},
|
|
241
|
+
"typescript": {
|
|
242
|
+
"direct_mode_enabled": false,
|
|
243
|
+
"max_production_files": 0,
|
|
244
|
+
"max_test_files": 0,
|
|
245
|
+
"logical_agent": "typescript-engineer"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"orchestrator_logical_agent": "orchestrator",
|
|
249
|
+
"epic_child_contexts": [
|
|
250
|
+
"epic_preparation_child",
|
|
251
|
+
"epic_execution_child"
|
|
252
|
+
],
|
|
253
|
+
"forced_root_personas": [
|
|
254
|
+
"epic-planner",
|
|
255
|
+
"epic-orchestrator"
|
|
256
|
+
],
|
|
257
|
+
"parallelism": {
|
|
258
|
+
"default_max_parallel_features": 4,
|
|
259
|
+
"hard_max_parallel_features": 8
|
|
260
|
+
},
|
|
261
|
+
"escalation_precedence": [
|
|
262
|
+
"epic_child_context",
|
|
263
|
+
"invalid_estimate",
|
|
264
|
+
"cross_language",
|
|
265
|
+
"unsupported_language",
|
|
266
|
+
"cross_cutting",
|
|
267
|
+
"direct_mode_disabled",
|
|
268
|
+
"production_budget_exceeded"
|
|
269
|
+
],
|
|
270
|
+
"receipt_key": "codex_topology_receipts"
|
|
271
|
+
},
|
|
272
|
+
"codex_model_policy": {
|
|
273
|
+
"description": "Codex-native deployment profiles. Complexity selects model and reasoning independently from the file-count route; exact model slugs are mandatory and unavailable profiles do not fall back silently.",
|
|
274
|
+
"profile_order": [
|
|
275
|
+
"c1",
|
|
276
|
+
"c2",
|
|
277
|
+
"c3",
|
|
278
|
+
"c3-elevated",
|
|
279
|
+
"c4"
|
|
280
|
+
],
|
|
281
|
+
"execution_contexts": [
|
|
282
|
+
"standalone",
|
|
283
|
+
"epic_preparation_child",
|
|
284
|
+
"epic_execution_child"
|
|
285
|
+
],
|
|
286
|
+
"logical_agent_aliases": {
|
|
287
|
+
"feature-review": "feature-reviewer"
|
|
288
|
+
},
|
|
289
|
+
"complexity_to_profile": {
|
|
290
|
+
"C1": {
|
|
291
|
+
"suffix": "c1",
|
|
292
|
+
"model": "gpt-5.6-luna",
|
|
293
|
+
"model_reasoning_effort": "low"
|
|
294
|
+
},
|
|
295
|
+
"C2": {
|
|
296
|
+
"suffix": "c2",
|
|
297
|
+
"model": "gpt-5.6-terra",
|
|
298
|
+
"model_reasoning_effort": "medium"
|
|
299
|
+
},
|
|
300
|
+
"C3": {
|
|
301
|
+
"suffix": "c3",
|
|
302
|
+
"model": "gpt-5.6-terra",
|
|
303
|
+
"model_reasoning_effort": "high"
|
|
304
|
+
},
|
|
305
|
+
"C4": {
|
|
306
|
+
"suffix": "c4",
|
|
307
|
+
"model": "gpt-5.6-sol",
|
|
308
|
+
"model_reasoning_effort": "max"
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
"c3_elevated_profile": {
|
|
312
|
+
"suffix": "c3-elevated",
|
|
313
|
+
"model": "gpt-5.6-sol",
|
|
314
|
+
"model_reasoning_effort": "high",
|
|
315
|
+
"activation": {
|
|
316
|
+
"operator": "any",
|
|
317
|
+
"execution_contexts": [
|
|
318
|
+
"epic_execution_child",
|
|
319
|
+
"epic_preparation_child"
|
|
320
|
+
],
|
|
321
|
+
"orchestration_complexity_ceiling": "C4"
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
"ceiling_transition_policy": {
|
|
325
|
+
"monotonic": true,
|
|
326
|
+
"receipt_key": "ceiling_transition",
|
|
327
|
+
"affected_delegation_ids_required_on_increase": true
|
|
328
|
+
},
|
|
329
|
+
"forced_personas": {
|
|
330
|
+
"epic-planner": {
|
|
331
|
+
"suffix": "",
|
|
332
|
+
"model": "gpt-5.6-sol",
|
|
333
|
+
"model_reasoning_effort": "ultra"
|
|
334
|
+
},
|
|
335
|
+
"epic-orchestrator": {
|
|
336
|
+
"suffix": "",
|
|
337
|
+
"model": "gpt-5.6-sol",
|
|
338
|
+
"model_reasoning_effort": "ultra"
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"generated_agent_families": [
|
|
342
|
+
"orchestrator",
|
|
343
|
+
"atomic-planner",
|
|
344
|
+
"atomic-executor",
|
|
345
|
+
"feature-reviewer",
|
|
346
|
+
"task-researcher",
|
|
347
|
+
"prd-feature",
|
|
348
|
+
"pr-author",
|
|
349
|
+
"python-typed-engineer",
|
|
350
|
+
"powershell-typed-engineer",
|
|
351
|
+
"csharp-typed-engineer",
|
|
352
|
+
"typescript-engineer"
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -111,6 +111,19 @@
|
|
|
111
111
|
".claude/lib/blast-radius/BlastRadiusGlob.psm1",
|
|
112
112
|
".claude/lib/blast-radius/BlastRadiusConfig.psm1",
|
|
113
113
|
".claude/lib/blast-radius/BlastRadiusValidation.psm1",
|
|
114
|
-
".claude/lib/blast-radius/BlastRadius.psm1"
|
|
114
|
+
".claude/lib/blast-radius/BlastRadius.psm1",
|
|
115
|
+
".claude/rules/parallel-orchestration.md",
|
|
116
|
+
".claude/rules/shell.md",
|
|
117
|
+
".claude/lib/bash/compute-cohorts.sh",
|
|
118
|
+
".claude/lib/bash/compute-concurrency-batches.sh",
|
|
119
|
+
".claude/lib/bash/parallel-cohorts.sh",
|
|
120
|
+
".claude/lib/bash/parallel-common.sh",
|
|
121
|
+
".claude/lib/bash/parallel-items-validate.sh",
|
|
122
|
+
".claude/lib/bash/parallel-manifest-validate.sh",
|
|
123
|
+
".claude/lib/bash/parallel-yaml-emit.sh",
|
|
124
|
+
".claude/lib/bash/parallel-yaml-scan.sh",
|
|
125
|
+
".claude/lib/bash/validate-parallel-manifest.sh",
|
|
126
|
+
"config/orchestration-routing.json",
|
|
127
|
+
"config/blast-radius.json"
|
|
115
128
|
]
|
|
116
129
|
}
|
|
@@ -14,9 +14,9 @@ This rule file summarizes the C#-specific policies for this repository.
|
|
|
14
14
|
|
|
15
15
|
## Toolchain
|
|
16
16
|
|
|
17
|
-
1. **Formatting — CSharpier**: All C# source files must be formatted with CSharpier. Do not use `dotnet format`.
|
|
18
|
-
2. **Linting — .NET Analyzers**: C# code must pass Roslyn/.NET analyzer diagnostics. Command: `msbuild TaskMaster.sln /t:
|
|
19
|
-
3. **Type Checking — Nullable Analysis**:
|
|
17
|
+
1. **Formatting — CSharpier**: All C# source files must be formatted with CSharpier. Do not use `dotnet format`. Run `dotnet tool restore` first when the manifest tool has not been restored. Apply formatting with `dotnet tool run csharpier format .` and verify read-only with `dotnet tool run csharpier check .`. Always invoke through `dotnet tool run` so the manifest-pinned CSharpier version is used.
|
|
18
|
+
2. **Linting — .NET Analyzers**: C# code must pass Roslyn/.NET analyzer diagnostics. Command: `msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true`. `/t:Rebuild` is intentional for a warm local worktree: `/t:Build` can skip `CoreCompile` through MSBuild incrementality and exit 0 without running analyzers. CI may retain `/t:Build` on a cold checkout.
|
|
19
|
+
3. **Type Checking — Nullable Analysis**: Compiler and nullable-flow diagnostics must pass with warnings as errors. Command: `msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true`. `/t:Rebuild` is required locally so compiler and nullable-flow diagnostics actually run. Projects opt into nullable per file with `#nullable enable`; do not pass `/p:Nullable=enable`, which opts every unannotated file in at once.
|
|
20
20
|
4. **Testing — MSTest + Moq + FluentAssertions**: Run tests with: `vstest.console.exe <test-assembly-paths> /EnableCodeCoverage`
|
|
21
21
|
|
|
22
22
|
Run the toolchain in order: format → lint → type-check → test. Restart from step 1 if any step fails or changes files.
|
|
@@ -29,11 +29,13 @@ Before invoking this gate, the agent must have:
|
|
|
29
29
|
|
|
30
30
|
Run the full toolchain in this exact order. If any step fails or modifies files, fix the issue and restart from step 1. Do not stop the loop until all four steps complete without errors in a single pass.
|
|
31
31
|
|
|
32
|
-
1. `dotnet tool run csharpier .`
|
|
33
|
-
2. `msbuild TaskMaster.sln /t:
|
|
34
|
-
3. `msbuild TaskMaster.sln /t:
|
|
32
|
+
1. `dotnet tool restore` (when the manifest tool has not been restored), then `dotnet tool run csharpier format .` to apply formatting and `dotnet tool run csharpier check .` to verify read-only.
|
|
33
|
+
2. `msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true`
|
|
34
|
+
3. `msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true`
|
|
35
35
|
4. `vstest.console.exe <test-assembly-paths> /EnableCodeCoverage`
|
|
36
36
|
|
|
37
|
+
`/t:Rebuild /m` is intentional for the local gate: on a warm worktree `/t:Build` can skip `CoreCompile` through MSBuild incrementality and exit 0 without running analyzers or the compiler. CI may retain `/t:Build` on a cold checkout. Projects opt into nullable per file with `#nullable enable`; do not pass `/p:Nullable=enable`.
|
|
38
|
+
|
|
37
39
|
If the environment prevents running any tool, stop and report the change as **unverified**. Do not declare completion.
|
|
38
40
|
|
|
39
41
|
## Delta Requirements (Zero-Regression Hard Gate)
|