@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.
Files changed (87) hide show
  1. package/dist/adapters/AiderAdapter.js +1 -1
  2. package/dist/adapters/AiderAdapter.js.map +1 -1
  3. package/dist/adapters/ClaudeCodeAdapter.js +5 -3
  4. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  5. package/dist/adapters/CodexAdapter.js +1 -1
  6. package/dist/adapters/CodexAdapter.js.map +1 -1
  7. package/dist/adapters/CursorAdapter.js +1 -1
  8. package/dist/adapters/CursorAdapter.js.map +1 -1
  9. package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
  10. package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
  11. package/dist/adapters/DoubaoAdapter.js +1 -1
  12. package/dist/adapters/DoubaoAdapter.js.map +1 -1
  13. package/dist/adapters/GeminiAdapter.js +1 -1
  14. package/dist/adapters/GeminiAdapter.js.map +1 -1
  15. package/dist/adapters/HermesAdapter.js +1 -1
  16. package/dist/adapters/HermesAdapter.js.map +1 -1
  17. package/dist/adapters/KimiAdapter.js +1 -1
  18. package/dist/adapters/KimiAdapter.js.map +1 -1
  19. package/dist/adapters/KiroAdapter.js +1 -1
  20. package/dist/adapters/KiroAdapter.js.map +1 -1
  21. package/dist/adapters/OpenClawAdapter.js +1 -1
  22. package/dist/adapters/OpenClawAdapter.js.map +1 -1
  23. package/dist/adapters/OpenCodeAdapter.js +1 -1
  24. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  25. package/dist/adapters/QCoderAdapter.js +1 -1
  26. package/dist/adapters/QCoderAdapter.js.map +1 -1
  27. package/dist/adapters/TraeAdapter.js +1 -1
  28. package/dist/adapters/TraeAdapter.js.map +1 -1
  29. package/dist/adapters/VSCAdapter.js +1 -1
  30. package/dist/adapters/VSCAdapter.js.map +1 -1
  31. package/dist/adapters/WindsurfAdapter.js +1 -1
  32. package/dist/adapters/WindsurfAdapter.js.map +1 -1
  33. package/dist/adapters/WorkBuddyAdapter.js +1 -1
  34. package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
  35. package/dist/api/cli.js +308 -13
  36. package/dist/api/cli.js.map +1 -1
  37. package/dist/api/doctor.d.ts +1 -0
  38. package/dist/api/doctor.js +29 -0
  39. package/dist/api/doctor.js.map +1 -1
  40. package/dist/api/quickstart.d.ts +1 -0
  41. package/dist/api/quickstart.js +2 -2
  42. package/dist/api/quickstart.js.map +1 -1
  43. package/dist/cli/phaseCommands.d.ts +5 -0
  44. package/dist/cli/phaseCommands.js +149 -25
  45. package/dist/cli/phaseCommands.js.map +1 -1
  46. package/dist/skills/ExternalSkills.js +2 -0
  47. package/dist/skills/ExternalSkills.js.map +1 -1
  48. package/dist/skills/SkillCatalog.d.ts +13 -0
  49. package/dist/skills/SkillCatalog.js +184 -0
  50. package/dist/skills/SkillCatalog.js.map +1 -0
  51. package/dist/skills/SkillDoctor.d.ts +37 -0
  52. package/dist/skills/SkillDoctor.js +90 -0
  53. package/dist/skills/SkillDoctor.js.map +1 -0
  54. package/dist/skills/index.d.ts +1 -0
  55. package/dist/skills/index.js +1 -0
  56. package/dist/skills/index.js.map +1 -1
  57. package/dist/skills/routing/SkillGate.d.ts +2 -1
  58. package/dist/skills/routing/SkillGate.js +19 -2
  59. package/dist/skills/routing/SkillGate.js.map +1 -1
  60. package/dist/skills/routing/SkillPolicy.js +39 -12
  61. package/dist/skills/routing/SkillPolicy.js.map +1 -1
  62. package/dist/workflow/GovernanceLock.d.ts +35 -0
  63. package/dist/workflow/GovernanceLock.js +58 -0
  64. package/dist/workflow/GovernanceLock.js.map +1 -0
  65. package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
  66. package/dist/workflow/GovernanceTemplatePacks.js +83 -0
  67. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
  68. package/dist/workflow/GovernanceTemplates.d.ts +6 -1
  69. package/dist/workflow/GovernanceTemplates.js +239 -68
  70. package/dist/workflow/GovernanceTemplates.js.map +1 -1
  71. package/dist/workflow/TaskArtifactScaffolder.js +7 -7
  72. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -1
  73. package/dist/workflow/VerificationCommands.js +1 -8
  74. package/dist/workflow/VerificationCommands.js.map +1 -1
  75. package/dist/workflow/VerificationProfile.d.ts +1 -0
  76. package/dist/workflow/VerificationProfile.js +42 -5
  77. package/dist/workflow/VerificationProfile.js.map +1 -1
  78. package/dist/workflow/WorkflowEngine.d.ts +6 -3
  79. package/dist/workflow/WorkflowEngine.js +1 -1
  80. package/dist/workflow/WorkflowEngine.js.map +1 -1
  81. package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
  82. package/dist/workflow/WorkspaceLifecycle.js +259 -0
  83. package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
  84. package/dist/workflow/index.d.ts +3 -0
  85. package/dist/workflow/index.js +3 -0
  86. package/dist/workflow/index.js.map +1 -1
  87. 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
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'README.md'), workflowReadme(projectName, mode));
9
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'explore.md'), governanceTemplateContent('explore.md'));
10
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'mini-prd.md'), governanceTemplateContent('mini-prd.md'));
11
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'skill-plan.md'), governanceTemplateContent('skill-plan.md'));
12
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'ui-spec.md'), governanceTemplateContent('ui-spec.md'));
13
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'visual-review.md'), governanceTemplateContent('visual-review.md'));
14
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'api-contract.md'), governanceTemplateContent('api-contract.md'));
15
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'security-review.md'), governanceTemplateContent('security-review.md'));
16
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'db-change-plan.md'), governanceTemplateContent('db-change-plan.md'));
17
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'e2e-plan.md'), governanceTemplateContent('e2e-plan.md'));
18
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'plan.md'), governanceTemplateContent('plan.md'));
19
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'verification.md'), governanceTemplateContent('verification.md'));
20
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'review.md'), governanceTemplateContent('review.md'));
21
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'summary.md'), governanceTemplateContent('summary.md'));
22
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'github-actions-scale-preflight.yml'), githubActionsPreflightTemplate());
23
- writeIfMissing(result, join(projectDir, 'docs', 'workflow', 'templates', 'pre-push-scale-preflight.sh'), prePushPreflightTemplate());
24
- writeIfMissing(result, join(projectDir, 'docs', 'worklog', 'metrics.md'), metricsTemplate());
25
- writeIfMissing(result, join(projectDir, '.scale', 'verification.json'), verificationMatrixTemplate(mode));
26
- writeIfMissing(result, join(projectDir, '.scale', 'skills.json'), skillRoutingPolicyTemplate(mode));
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 workflowReadme(projectName, mode) {
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 for the same checks.
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() {