@hongmaple0820/scale-engine 0.13.0 → 0.14.0
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/dist/adapters/AiderAdapter.js +1 -1
- package/dist/adapters/AiderAdapter.js.map +1 -1
- package/dist/adapters/ClaudeCodeAdapter.js +5 -3
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +1 -1
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CursorAdapter.js +1 -1
- package/dist/adapters/CursorAdapter.js.map +1 -1
- package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
- package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
- package/dist/adapters/DoubaoAdapter.js +1 -1
- package/dist/adapters/DoubaoAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.js +1 -1
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.js +1 -1
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/KimiAdapter.js +1 -1
- package/dist/adapters/KimiAdapter.js.map +1 -1
- package/dist/adapters/KiroAdapter.js +1 -1
- package/dist/adapters/KiroAdapter.js.map +1 -1
- package/dist/adapters/OpenClawAdapter.js +1 -1
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +1 -1
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.js +1 -1
- package/dist/adapters/QCoderAdapter.js.map +1 -1
- package/dist/adapters/TraeAdapter.js +1 -1
- package/dist/adapters/TraeAdapter.js.map +1 -1
- package/dist/adapters/VSCAdapter.js +1 -1
- package/dist/adapters/VSCAdapter.js.map +1 -1
- package/dist/adapters/WindsurfAdapter.js +1 -1
- package/dist/adapters/WindsurfAdapter.js.map +1 -1
- package/dist/adapters/WorkBuddyAdapter.js +1 -1
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
- package/dist/api/cli.js +308 -13
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +1 -0
- package/dist/api/doctor.js +29 -0
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +1 -0
- package/dist/api/quickstart.js +2 -2
- package/dist/api/quickstart.js.map +1 -1
- package/dist/cli/phaseCommands.d.ts +5 -0
- package/dist/cli/phaseCommands.js +149 -25
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/skills/ExternalSkills.js +2 -0
- package/dist/skills/ExternalSkills.js.map +1 -1
- package/dist/skills/SkillCatalog.d.ts +13 -0
- package/dist/skills/SkillCatalog.js +184 -0
- package/dist/skills/SkillCatalog.js.map +1 -0
- package/dist/skills/SkillDoctor.d.ts +37 -0
- package/dist/skills/SkillDoctor.js +90 -0
- package/dist/skills/SkillDoctor.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/routing/SkillGate.d.ts +2 -1
- package/dist/skills/routing/SkillGate.js +19 -2
- package/dist/skills/routing/SkillGate.js.map +1 -1
- package/dist/skills/routing/SkillPolicy.js +39 -12
- package/dist/skills/routing/SkillPolicy.js.map +1 -1
- package/dist/workflow/GovernanceLock.d.ts +35 -0
- package/dist/workflow/GovernanceLock.js +58 -0
- package/dist/workflow/GovernanceLock.js.map +1 -0
- package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
- package/dist/workflow/GovernanceTemplatePacks.js +83 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.d.ts +6 -1
- package/dist/workflow/GovernanceTemplates.js +239 -68
- package/dist/workflow/GovernanceTemplates.js.map +1 -1
- package/dist/workflow/TaskArtifactScaffolder.js +7 -7
- package/dist/workflow/TaskArtifactScaffolder.js.map +1 -1
- package/dist/workflow/VerificationCommands.js +1 -8
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +1 -0
- package/dist/workflow/VerificationProfile.js +42 -5
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts +6 -3
- package/dist/workflow/WorkflowEngine.js +1 -1
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
- package/dist/workflow/WorkspaceLifecycle.js +259 -0
- package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
- package/dist/workflow/index.d.ts +3 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,29 +1,56 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { skillRoutingPolicyTemplate } from '../skills/routing/SkillPolicy.js';
|
|
4
|
+
import { readGovernanceLock, writeGovernanceLock } from './GovernanceLock.js';
|
|
5
|
+
import { resolveGovernanceTemplatePack, } from './GovernanceTemplatePacks.js';
|
|
4
6
|
export function writeGovernanceTemplates(projectDir = process.cwd(), options = {}) {
|
|
5
7
|
const mode = options.mode ?? 'standard';
|
|
6
8
|
const projectName = options.projectName ?? 'Project';
|
|
9
|
+
const pack = resolveGovernanceTemplatePack(options.pack);
|
|
10
|
+
const packMode = pack.modeDefaults[mode];
|
|
11
|
+
const services = options.services ?? pack.defaultServices ?? [];
|
|
12
|
+
const exclude = options.exclude ?? pack.exclude ?? ['node_modules', 'dist', 'tmp', 'vendor'];
|
|
7
13
|
const result = { created: [], skipped: [] };
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
const lockFiles = new Map();
|
|
15
|
+
for (const file of readGovernanceLock(projectDir)?.files ?? []) {
|
|
16
|
+
lockFiles.set(file.path, file);
|
|
17
|
+
}
|
|
18
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/README.md', workflowReadme(projectName, mode, pack.id));
|
|
19
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/explore.md', governanceTemplateContent('explore.md'));
|
|
20
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/mini-prd.md', governanceTemplateContent('mini-prd.md'));
|
|
21
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/skill-plan.md', governanceTemplateContent('skill-plan.md'));
|
|
22
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/skill-evidence.md', governanceTemplateContent('skill-evidence.md'));
|
|
23
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/ui-spec.md', governanceTemplateContent('ui-spec.md'));
|
|
24
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/visual-review.md', governanceTemplateContent('visual-review.md'));
|
|
25
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/api-contract.md', governanceTemplateContent('api-contract.md'));
|
|
26
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/docs-impact.md', governanceTemplateContent('docs-impact.md'));
|
|
27
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/security-review.md', governanceTemplateContent('security-review.md'));
|
|
28
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/db-change-plan.md', governanceTemplateContent('db-change-plan.md'));
|
|
29
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/e2e-plan.md', governanceTemplateContent('e2e-plan.md'));
|
|
30
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/plan.md', governanceTemplateContent('plan.md'));
|
|
31
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/verification.md', governanceTemplateContent('verification.md'));
|
|
32
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/review.md', governanceTemplateContent('review.md'));
|
|
33
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/summary.md', governanceTemplateContent('summary.md'));
|
|
34
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/github-actions-scale-preflight.yml', githubActionsPreflightTemplate());
|
|
35
|
+
writeTracked(result, lockFiles, projectDir, 'docs/workflow/templates/pre-push-scale-preflight.sh', prePushPreflightTemplate());
|
|
36
|
+
writeTracked(result, lockFiles, projectDir, 'docs/worklog/metrics.md', metricsTemplate());
|
|
37
|
+
writeTracked(result, lockFiles, projectDir, '.scale/verification.json', verificationMatrixTemplate(mode, {
|
|
38
|
+
services,
|
|
39
|
+
exclude,
|
|
40
|
+
artifactGate: packMode.artifactGate,
|
|
41
|
+
}));
|
|
42
|
+
writeTracked(result, lockFiles, projectDir, '.scale/skills.json', skillRoutingPolicyTemplate(mode));
|
|
43
|
+
for (const file of pack.generatedFiles) {
|
|
44
|
+
writePackGeneratedFile(result, lockFiles, projectDir, pack.id, pack.version, file);
|
|
45
|
+
}
|
|
46
|
+
const lockPath = join(projectDir, '.scale', 'governance.lock.json');
|
|
47
|
+
writeGovernanceLock(projectDir, {
|
|
48
|
+
pack: pack.id,
|
|
49
|
+
packVersion: pack.version,
|
|
50
|
+
scaleVersion: packageVersion(),
|
|
51
|
+
files: [...lockFiles.values()],
|
|
52
|
+
});
|
|
53
|
+
result.created.push(lockPath);
|
|
27
54
|
return result;
|
|
28
55
|
}
|
|
29
56
|
export function governanceTemplateContent(name) {
|
|
@@ -31,9 +58,11 @@ export function governanceTemplateContent(name) {
|
|
|
31
58
|
case 'explore.md': return exploreTemplate();
|
|
32
59
|
case 'mini-prd.md': return miniPrdTemplate();
|
|
33
60
|
case 'skill-plan.md': return skillPlanTemplate();
|
|
61
|
+
case 'skill-evidence.md': return skillEvidenceTemplate();
|
|
34
62
|
case 'ui-spec.md': return uiSpecTemplate();
|
|
35
63
|
case 'visual-review.md': return visualReviewTemplate();
|
|
36
64
|
case 'api-contract.md': return apiContractTemplate();
|
|
65
|
+
case 'docs-impact.md': return docsImpactTemplate();
|
|
37
66
|
case 'security-review.md': return securityReviewTemplate();
|
|
38
67
|
case 'db-change-plan.md': return dbChangePlanTemplate();
|
|
39
68
|
case 'e2e-plan.md': return e2ePlanTemplate();
|
|
@@ -46,18 +75,42 @@ export function governanceTemplateContent(name) {
|
|
|
46
75
|
function writeIfMissing(result, path, content) {
|
|
47
76
|
if (existsSync(path)) {
|
|
48
77
|
result.skipped.push(path);
|
|
49
|
-
return;
|
|
78
|
+
return false;
|
|
50
79
|
}
|
|
51
80
|
const dir = path.split(/[\\/]/).slice(0, -1).join('/');
|
|
52
81
|
if (dir && !existsSync(dir))
|
|
53
82
|
mkdirSync(dir, { recursive: true });
|
|
54
83
|
writeFileSync(path, content, 'utf-8');
|
|
55
84
|
result.created.push(path);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
function writeTracked(result, lockFiles, projectDir, relativePath, content) {
|
|
88
|
+
const created = writeIfMissing(result, join(projectDir, relativePath), content);
|
|
89
|
+
if (created)
|
|
90
|
+
lockFiles.set(relativePath, { path: relativePath, owned: true });
|
|
91
|
+
}
|
|
92
|
+
function writePackGeneratedFile(result, lockFiles, projectDir, packId, packVersion, file) {
|
|
93
|
+
const content = shouldUseGeneratedHeader(file)
|
|
94
|
+
? generatedHeader(packId, packVersion) + file.content
|
|
95
|
+
: file.content;
|
|
96
|
+
const created = writeIfMissing(result, join(projectDir, file.path), content);
|
|
97
|
+
if (created)
|
|
98
|
+
lockFiles.set(file.path, { path: file.path, owned: file.owned });
|
|
99
|
+
}
|
|
100
|
+
function shouldUseGeneratedHeader(file) {
|
|
101
|
+
return file.kind === 'doc' || file.kind === 'template' || file.kind === 'script';
|
|
56
102
|
}
|
|
57
|
-
function
|
|
103
|
+
function generatedHeader(packId, packVersion) {
|
|
104
|
+
return `# Generated by scale-engine governance pack: ${packId}@${packVersion}
|
|
105
|
+
# Edit policy: prefer editing the pack in scale-engine; local overrides should be documented.
|
|
106
|
+
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
function workflowReadme(projectName, mode, packId = 'standard') {
|
|
58
110
|
return `# ${projectName} Workflow
|
|
59
111
|
|
|
60
112
|
Governance mode: ${mode}
|
|
113
|
+
Governance pack: ${packId}
|
|
61
114
|
|
|
62
115
|
## Task Levels
|
|
63
116
|
|
|
@@ -86,10 +139,12 @@ Use service-aware verification when configured:
|
|
|
86
139
|
|
|
87
140
|
\`\`\`bash
|
|
88
141
|
scale preflight --service all
|
|
142
|
+
scale preflight --service all --preflight-profile full
|
|
89
143
|
scale verify <task-id> --profile default
|
|
90
144
|
scale verify <task-id> --service <service-name>
|
|
91
145
|
scale verify <task-id> --artifact-gate warn
|
|
92
146
|
scale verify <task-id> --artifact-gate block
|
|
147
|
+
scale verify <task-id> --require-installed-skills
|
|
93
148
|
scale task-artifacts check --dir docs/worklog/tasks/<task-dir> --level L
|
|
94
149
|
\`\`\`
|
|
95
150
|
|
|
@@ -97,14 +152,40 @@ Keep \`.scale/verification.json\` as the source of truth for profiles and servic
|
|
|
97
152
|
Keep \`.scale/skills.json\` as the source of truth for active skill routing policy.
|
|
98
153
|
Use \`artifactGate: "warn"\` while introducing the workflow, then move M/L/CRITICAL work to \`"block"\` once templates and local gates are stable.
|
|
99
154
|
|
|
155
|
+
## Active Skill Routing
|
|
156
|
+
|
|
157
|
+
SCALE plans required skills from task description, service selection, and changed files. UI/API work requires a Mini-PRD plus domain evidence such as \`ui-spec.md\`, \`visual-review.md\`, or \`api-contract.md\`. Security and database work require explicit review or rollback artifacts.
|
|
158
|
+
|
|
159
|
+
When a task records \`servicesTouched\`, \`scale verify <task-id>\` uses those services automatically. You can still override selection with \`--service all\`, \`--service api\`, or \`--service api,gateway\`.
|
|
160
|
+
|
|
161
|
+
Before M/L work, check whether required workflow skills are physically installed:
|
|
162
|
+
|
|
163
|
+
\`\`\`bash
|
|
164
|
+
scale skill doctor --json
|
|
165
|
+
scale skill check --require-installed --json
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
## Workspace Lifecycle
|
|
169
|
+
|
|
170
|
+
Before finishing an agent-created branch or deleting a temporary worktree, inspect root and child repository state:
|
|
171
|
+
|
|
172
|
+
\`\`\`bash
|
|
173
|
+
scale workspace status --json
|
|
174
|
+
scale workspace finish --json
|
|
175
|
+
scale workspace cleanup --dir <temporary-worktree> --dry-run --json
|
|
176
|
+
scale workspace cleanup --dir <temporary-worktree> --apply --confirm <branch-or-head> --json
|
|
177
|
+
\`\`\`
|
|
178
|
+
|
|
179
|
+
Do not remove a temporary worktree while any submodule or nested repository has uncommitted or unpushed work. Child repositories must be committed and reviewed in their own remotes, then the root repository can record any required pointer or governance updates. Cleanup defaults to dry-run. Applying cleanup requires the reported confirmation token, normally the temporary branch name.
|
|
180
|
+
|
|
100
181
|
## Automation Templates
|
|
101
182
|
|
|
102
183
|
Optional automation templates are generated under \`docs/workflow/templates/\`:
|
|
103
184
|
|
|
104
|
-
- \`github-actions-scale-preflight.yml\`: CI workflow that runs \`scale preflight --service all\`.
|
|
105
|
-
- \`pre-push-scale-preflight.sh\`: local pre-push hook template
|
|
185
|
+
- \`github-actions-scale-preflight.yml\`: CI workflow that runs \`scale preflight --service all --preflight-profile ci\`.
|
|
186
|
+
- \`pre-push-scale-preflight.sh\`: local pre-push hook template that runs the default quick preflight.
|
|
106
187
|
|
|
107
|
-
Keep these templates advisory until \`scale preflight --service all\` is reliable locally for the project.
|
|
188
|
+
Keep these templates advisory until \`scale preflight --service all --preflight-profile full\` is reliable locally for the project.
|
|
108
189
|
`;
|
|
109
190
|
}
|
|
110
191
|
function exploreTemplate() {
|
|
@@ -112,20 +193,22 @@ function exploreTemplate() {
|
|
|
112
193
|
|
|
113
194
|
## Files Read
|
|
114
195
|
|
|
115
|
-
-
|
|
196
|
+
- TBD
|
|
116
197
|
|
|
117
198
|
## Current Behavior
|
|
118
199
|
|
|
200
|
+
TBD
|
|
119
201
|
|
|
120
202
|
## Main Conflict
|
|
121
203
|
|
|
204
|
+
TBD
|
|
122
205
|
|
|
123
206
|
## Affected Modules
|
|
124
207
|
|
|
208
|
+
TBD
|
|
125
209
|
|
|
126
210
|
## Evidence
|
|
127
|
-
|
|
128
|
-
|
|
211
|
+
TBD
|
|
129
212
|
`;
|
|
130
213
|
}
|
|
131
214
|
function miniPrdTemplate() {
|
|
@@ -133,38 +216,44 @@ function miniPrdTemplate() {
|
|
|
133
216
|
|
|
134
217
|
## Background
|
|
135
218
|
|
|
219
|
+
TBD
|
|
136
220
|
|
|
137
221
|
## Target Users
|
|
138
222
|
|
|
223
|
+
TBD
|
|
139
224
|
|
|
140
225
|
## Core Scenario
|
|
141
226
|
|
|
227
|
+
TBD
|
|
142
228
|
|
|
143
229
|
## Non-Goals
|
|
144
230
|
|
|
231
|
+
TBD
|
|
145
232
|
|
|
146
233
|
## User Path
|
|
147
234
|
|
|
235
|
+
TBD
|
|
148
236
|
|
|
149
237
|
## Permission Rules
|
|
150
238
|
|
|
239
|
+
TBD
|
|
151
240
|
|
|
152
241
|
## Data Impact
|
|
153
242
|
|
|
243
|
+
TBD
|
|
154
244
|
|
|
155
245
|
## Exception Scenarios
|
|
156
246
|
|
|
157
|
-
1.
|
|
158
|
-
2.
|
|
159
|
-
3.
|
|
247
|
+
1. TBD
|
|
248
|
+
2. TBD
|
|
249
|
+
3. TBD
|
|
160
250
|
|
|
161
251
|
## Acceptance Criteria
|
|
162
252
|
|
|
163
|
-
- [ ]
|
|
253
|
+
- [ ] TBD
|
|
164
254
|
|
|
165
255
|
## Rollback Or Disable Strategy
|
|
166
|
-
|
|
167
|
-
|
|
256
|
+
TBD
|
|
168
257
|
`;
|
|
169
258
|
}
|
|
170
259
|
function skillPlanTemplate() {
|
|
@@ -178,19 +267,19 @@ function skillPlanTemplate() {
|
|
|
178
267
|
|
|
179
268
|
## Required Skills
|
|
180
269
|
|
|
181
|
-
-
|
|
270
|
+
- TBD
|
|
182
271
|
|
|
183
272
|
## Recommended Skills
|
|
184
273
|
|
|
185
|
-
-
|
|
274
|
+
- TBD
|
|
186
275
|
|
|
187
276
|
## Required Artifacts
|
|
188
277
|
|
|
189
|
-
-
|
|
278
|
+
- TBD
|
|
190
279
|
|
|
191
280
|
## Required Verification Evidence
|
|
192
281
|
|
|
193
|
-
-
|
|
282
|
+
- TBD
|
|
194
283
|
|
|
195
284
|
## Skipped Skills
|
|
196
285
|
|
|
@@ -199,14 +288,36 @@ function skillPlanTemplate() {
|
|
|
199
288
|
| | | |
|
|
200
289
|
`;
|
|
201
290
|
}
|
|
291
|
+
function skillEvidenceTemplate() {
|
|
292
|
+
return `# Skill Evidence
|
|
293
|
+
|
|
294
|
+
## Planned Skills
|
|
295
|
+
|
|
296
|
+
- TBD
|
|
297
|
+
|
|
298
|
+
## Used Skills
|
|
299
|
+
|
|
300
|
+
| Skill | Phase | Trigger | Evidence | Status |
|
|
301
|
+
| --- | --- | --- | --- | --- |
|
|
302
|
+
| skill-id | plan/build/verify/review | why it was selected | command, screenshot, report, or artifact path | executed/skipped/fallback |
|
|
303
|
+
|
|
304
|
+
## Skipped Skills
|
|
305
|
+
|
|
306
|
+
| Skill | Reason | Fallback Evidence |
|
|
307
|
+
| --- | --- | --- |
|
|
308
|
+
| skill-id | why it could not run | manual review, alternate command, or explicit risk |
|
|
309
|
+
`;
|
|
310
|
+
}
|
|
202
311
|
function uiSpecTemplate() {
|
|
203
312
|
return `# UI Spec
|
|
204
313
|
|
|
205
314
|
## User Goal
|
|
206
315
|
|
|
316
|
+
TBD
|
|
207
317
|
|
|
208
318
|
## Primary Flow
|
|
209
319
|
|
|
320
|
+
TBD
|
|
210
321
|
|
|
211
322
|
## Interaction States
|
|
212
323
|
|
|
@@ -218,13 +329,15 @@ function uiSpecTemplate() {
|
|
|
218
329
|
|
|
219
330
|
## Responsive Behavior
|
|
220
331
|
|
|
332
|
+
TBD
|
|
221
333
|
|
|
222
334
|
## Accessibility Requirements
|
|
223
335
|
|
|
336
|
+
TBD
|
|
224
337
|
|
|
225
338
|
## Acceptance Criteria
|
|
226
339
|
|
|
227
|
-
- [ ]
|
|
340
|
+
- [ ] TBD
|
|
228
341
|
`;
|
|
229
342
|
}
|
|
230
343
|
function visualReviewTemplate() {
|
|
@@ -232,19 +345,22 @@ function visualReviewTemplate() {
|
|
|
232
345
|
|
|
233
346
|
## Screenshots Or Evidence
|
|
234
347
|
|
|
348
|
+
TBD
|
|
235
349
|
|
|
236
350
|
## Layout And Responsiveness
|
|
237
351
|
|
|
352
|
+
TBD
|
|
238
353
|
|
|
239
354
|
## Text Fit And Overlap
|
|
240
355
|
|
|
356
|
+
TBD
|
|
241
357
|
|
|
242
358
|
## Accessibility Notes
|
|
243
359
|
|
|
360
|
+
TBD
|
|
244
361
|
|
|
245
362
|
## Final Verdict
|
|
246
|
-
|
|
247
|
-
|
|
363
|
+
TBD
|
|
248
364
|
`;
|
|
249
365
|
}
|
|
250
366
|
function apiContractTemplate() {
|
|
@@ -252,25 +368,51 @@ function apiContractTemplate() {
|
|
|
252
368
|
|
|
253
369
|
## Endpoint Or Interface
|
|
254
370
|
|
|
371
|
+
TBD
|
|
255
372
|
|
|
256
373
|
## Request
|
|
257
374
|
|
|
375
|
+
TBD
|
|
258
376
|
|
|
259
377
|
## Response
|
|
260
378
|
|
|
379
|
+
TBD
|
|
261
380
|
|
|
262
381
|
## Errors
|
|
263
382
|
|
|
383
|
+
TBD
|
|
264
384
|
|
|
265
385
|
## Permission Rules
|
|
266
386
|
|
|
387
|
+
TBD
|
|
267
388
|
|
|
268
389
|
## Compatibility Notes
|
|
269
390
|
|
|
391
|
+
TBD
|
|
270
392
|
|
|
271
393
|
## Acceptance Criteria
|
|
272
394
|
|
|
273
|
-
- [ ]
|
|
395
|
+
- [ ] TBD
|
|
396
|
+
`;
|
|
397
|
+
}
|
|
398
|
+
function docsImpactTemplate() {
|
|
399
|
+
return `# Docs Impact
|
|
400
|
+
|
|
401
|
+
## Code Changes Requiring Docs
|
|
402
|
+
|
|
403
|
+
- TBD
|
|
404
|
+
|
|
405
|
+
## Documentation Updated
|
|
406
|
+
|
|
407
|
+
- TBD
|
|
408
|
+
|
|
409
|
+
## No-Docs-Needed Rationale
|
|
410
|
+
|
|
411
|
+
TBD
|
|
412
|
+
|
|
413
|
+
## Links Checked
|
|
414
|
+
|
|
415
|
+
- TBD
|
|
274
416
|
`;
|
|
275
417
|
}
|
|
276
418
|
function securityReviewTemplate() {
|
|
@@ -278,25 +420,28 @@ function securityReviewTemplate() {
|
|
|
278
420
|
|
|
279
421
|
## Assets And Trust Boundaries
|
|
280
422
|
|
|
423
|
+
TBD
|
|
281
424
|
|
|
282
425
|
## Authorization Rules
|
|
283
426
|
|
|
427
|
+
TBD
|
|
284
428
|
|
|
285
429
|
## Abuse Cases
|
|
286
430
|
|
|
287
|
-
1.
|
|
288
|
-
2.
|
|
289
|
-
3.
|
|
431
|
+
1. TBD
|
|
432
|
+
2. TBD
|
|
433
|
+
3. TBD
|
|
290
434
|
|
|
291
435
|
## Sensitive Data Impact
|
|
292
436
|
|
|
437
|
+
TBD
|
|
293
438
|
|
|
294
439
|
## Rollback Or Disable Strategy
|
|
295
440
|
|
|
441
|
+
TBD
|
|
296
442
|
|
|
297
443
|
## Final Verdict
|
|
298
|
-
|
|
299
|
-
|
|
444
|
+
TBD
|
|
300
445
|
`;
|
|
301
446
|
}
|
|
302
447
|
function dbChangePlanTemplate() {
|
|
@@ -304,19 +449,22 @@ function dbChangePlanTemplate() {
|
|
|
304
449
|
|
|
305
450
|
## Schema Or Data Change
|
|
306
451
|
|
|
452
|
+
TBD
|
|
307
453
|
|
|
308
454
|
## Backward Compatibility
|
|
309
455
|
|
|
456
|
+
TBD
|
|
310
457
|
|
|
311
458
|
## Migration Steps
|
|
312
459
|
|
|
460
|
+
TBD
|
|
313
461
|
|
|
314
462
|
## Rollback Plan
|
|
315
463
|
|
|
464
|
+
TBD
|
|
316
465
|
|
|
317
466
|
## Verification
|
|
318
|
-
|
|
319
|
-
|
|
467
|
+
TBD
|
|
320
468
|
`;
|
|
321
469
|
}
|
|
322
470
|
function e2ePlanTemplate() {
|
|
@@ -324,19 +472,22 @@ function e2ePlanTemplate() {
|
|
|
324
472
|
|
|
325
473
|
## User Paths
|
|
326
474
|
|
|
475
|
+
TBD
|
|
327
476
|
|
|
328
477
|
## Browser Coverage
|
|
329
478
|
|
|
479
|
+
TBD
|
|
330
480
|
|
|
331
481
|
## Test Data
|
|
332
482
|
|
|
483
|
+
TBD
|
|
333
484
|
|
|
334
485
|
## Assertions
|
|
335
486
|
|
|
487
|
+
TBD
|
|
336
488
|
|
|
337
489
|
## Evidence
|
|
338
|
-
|
|
339
|
-
|
|
490
|
+
TBD
|
|
340
491
|
`;
|
|
341
492
|
}
|
|
342
493
|
function planTemplate() {
|
|
@@ -344,22 +495,24 @@ function planTemplate() {
|
|
|
344
495
|
|
|
345
496
|
## Approach
|
|
346
497
|
|
|
498
|
+
TBD
|
|
347
499
|
|
|
348
500
|
## Boundaries
|
|
349
501
|
|
|
502
|
+
TBD
|
|
350
503
|
|
|
351
504
|
## Exception Contract
|
|
352
505
|
|
|
353
|
-
1.
|
|
354
|
-
2.
|
|
355
|
-
3.
|
|
506
|
+
1. TBD
|
|
507
|
+
2. TBD
|
|
508
|
+
3. TBD
|
|
356
509
|
|
|
357
510
|
## Rollback Plan
|
|
358
511
|
|
|
512
|
+
TBD
|
|
359
513
|
|
|
360
514
|
## Test Strategy
|
|
361
|
-
|
|
362
|
-
|
|
515
|
+
TBD
|
|
363
516
|
`;
|
|
364
517
|
}
|
|
365
518
|
function verificationTemplate() {
|
|
@@ -373,13 +526,14 @@ function verificationTemplate() {
|
|
|
373
526
|
|
|
374
527
|
## Output Summary
|
|
375
528
|
|
|
529
|
+
TBD
|
|
376
530
|
|
|
377
531
|
## Failures And Fixes
|
|
378
532
|
|
|
533
|
+
TBD
|
|
379
534
|
|
|
380
535
|
## Final Status
|
|
381
|
-
|
|
382
|
-
|
|
536
|
+
TBD
|
|
383
537
|
`;
|
|
384
538
|
}
|
|
385
539
|
function reviewTemplate() {
|
|
@@ -387,16 +541,18 @@ function reviewTemplate() {
|
|
|
387
541
|
|
|
388
542
|
## Code Review
|
|
389
543
|
|
|
544
|
+
TBD
|
|
390
545
|
|
|
391
546
|
## Security Review
|
|
392
547
|
|
|
548
|
+
TBD
|
|
393
549
|
|
|
394
550
|
## Same-Pattern Scan
|
|
395
551
|
|
|
552
|
+
TBD
|
|
396
553
|
|
|
397
554
|
## Residual Risks
|
|
398
|
-
|
|
399
|
-
|
|
555
|
+
TBD
|
|
400
556
|
`;
|
|
401
557
|
}
|
|
402
558
|
function summaryTemplate() {
|
|
@@ -404,12 +560,15 @@ function summaryTemplate() {
|
|
|
404
560
|
|
|
405
561
|
## Delivered Changes
|
|
406
562
|
|
|
563
|
+
TBD
|
|
407
564
|
|
|
408
565
|
## Remaining Risks
|
|
409
566
|
|
|
567
|
+
TBD
|
|
410
568
|
|
|
411
569
|
## Follow-Ups
|
|
412
570
|
|
|
571
|
+
TBD
|
|
413
572
|
|
|
414
573
|
## Metric Row
|
|
415
574
|
|
|
@@ -431,41 +590,53 @@ function metricsTemplate() {
|
|
|
431
590
|
|
|
432
591
|
### Repeated Failure Patterns
|
|
433
592
|
|
|
593
|
+
TBD
|
|
434
594
|
|
|
435
595
|
### Slowest Gates
|
|
436
596
|
|
|
597
|
+
TBD
|
|
437
598
|
|
|
438
599
|
### Documentation Gaps
|
|
439
600
|
|
|
601
|
+
TBD
|
|
440
602
|
|
|
441
603
|
### Product Design Misses
|
|
442
604
|
|
|
605
|
+
TBD
|
|
443
606
|
|
|
444
607
|
### Proposed Workflow Changes
|
|
445
|
-
|
|
446
|
-
|
|
608
|
+
TBD
|
|
447
609
|
`;
|
|
448
610
|
}
|
|
449
|
-
function verificationMatrixTemplate(mode) {
|
|
611
|
+
function verificationMatrixTemplate(mode, options = {}) {
|
|
450
612
|
return JSON.stringify({
|
|
451
613
|
version: 1,
|
|
452
614
|
defaultProfile: 'default',
|
|
453
615
|
profiles: {
|
|
454
616
|
default: {
|
|
455
617
|
commands: {},
|
|
456
|
-
services: [],
|
|
618
|
+
services: options.services?.filter(service => service.required !== false).map(service => service.name) ?? [],
|
|
457
619
|
},
|
|
458
620
|
},
|
|
459
|
-
services: [],
|
|
460
|
-
exclude: ['node_modules', 'dist', 'tmp', 'vendor'],
|
|
621
|
+
services: options.services ?? [],
|
|
622
|
+
exclude: options.exclude ?? ['node_modules', 'dist', 'tmp', 'vendor'],
|
|
461
623
|
policy: {
|
|
462
624
|
mode,
|
|
463
625
|
optionalToolsWarnOnly: true,
|
|
464
|
-
artifactGate: mode === 'critical' ? 'block' : 'warn',
|
|
626
|
+
artifactGate: options.artifactGate ?? (mode === 'critical' ? 'block' : 'warn'),
|
|
465
627
|
artifactGateLevels: ['M', 'L', 'CRITICAL'],
|
|
466
628
|
},
|
|
467
629
|
}, null, 2) + '\n';
|
|
468
630
|
}
|
|
631
|
+
function packageVersion() {
|
|
632
|
+
try {
|
|
633
|
+
const pkg = JSON.parse(readFileSync(join(process.cwd(), 'package.json'), 'utf-8'));
|
|
634
|
+
return pkg.version ?? '0.0.0-dev';
|
|
635
|
+
}
|
|
636
|
+
catch {
|
|
637
|
+
return '0.0.0-dev';
|
|
638
|
+
}
|
|
639
|
+
}
|
|
469
640
|
function githubActionsPreflightTemplate() {
|
|
470
641
|
return `name: SCALE Preflight
|
|
471
642
|
|
|
@@ -498,7 +669,7 @@ jobs:
|
|
|
498
669
|
fi
|
|
499
670
|
|
|
500
671
|
- name: Run SCALE preflight
|
|
501
|
-
run: npx @hongmaple0820/scale-engine@latest preflight --service all
|
|
672
|
+
run: npx @hongmaple0820/scale-engine@latest preflight --service all --preflight-profile ci
|
|
502
673
|
`;
|
|
503
674
|
}
|
|
504
675
|
function prePushPreflightTemplate() {
|