@hongmaple0820/scale-engine 0.20.0 → 0.21.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/README.md +36 -0
- package/dist/api/cli.js +181 -1
- package/dist/api/cli.js.map +1 -1
- package/dist/memory/MemoryBrain.js +52 -52
- package/dist/output/GovernanceDashboard.js +44 -44
- package/dist/workflow/GovernanceTemplates.js +26 -0
- package/dist/workflow/GovernanceTemplates.js.map +1 -1
- package/dist/workflow/UpgradeManager.d.ts +140 -0
- package/dist/workflow/UpgradeManager.js +434 -0
- package/dist/workflow/UpgradeManager.js.map +1 -0
- package/docs/README.md +1 -0
- package/docs/start/README.md +5 -1
- package/examples/demo-projects/agent-governance-demo/CONTEXT.md +14 -0
- package/examples/demo-projects/agent-governance-demo/README.md +32 -21
- package/examples/demo-projects/agent-governance-demo/docs/CONTEXT-MAP.md +14 -0
- package/examples/demo-projects/agent-governance-demo/package.json +6 -1
- package/package.json +1 -1
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { TOOL_CAPABILITY_CATALOG } from '../tools/ToolCapabilityRegistry.js';
|
|
4
|
+
import { SCALE_ENGINE_VERSION } from '../version.js';
|
|
5
|
+
import { computeGovernanceDrift, readGovernanceLock } from './GovernanceLock.js';
|
|
6
|
+
import { listGovernanceTemplatePacks, resolveGovernanceTemplatePack } from './GovernanceTemplatePacks.js';
|
|
7
|
+
import { writeGovernanceTemplates } from './GovernanceTemplates.js';
|
|
8
|
+
export function createUpgradeCheckReport(options = {}) {
|
|
9
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
10
|
+
const lock = readGovernanceLock(projectDir);
|
|
11
|
+
const drift = computeGovernanceDrift(projectDir);
|
|
12
|
+
const latestScaleVersion = normalizeTargetVersion(options.targetScaleVersion);
|
|
13
|
+
const pack = lock ? resolveGovernanceTemplatePack(lock.pack) : null;
|
|
14
|
+
const scaleUpToDate = Boolean(lock && lock.scaleVersion === latestScaleVersion);
|
|
15
|
+
const packUpToDate = Boolean(lock && pack && lock.packVersion === pack.version);
|
|
16
|
+
const generatedTotal = drift.clean.length + drift.changed.length + drift.missing.length;
|
|
17
|
+
const thirdParty = createThirdPartyUpdateReport();
|
|
18
|
+
const status = resolveUpgradeStatus({
|
|
19
|
+
hasLock: Boolean(lock),
|
|
20
|
+
hasLocalChanges: drift.changed.length > 0,
|
|
21
|
+
hasMissingFiles: drift.missing.length > 0,
|
|
22
|
+
scaleUpToDate,
|
|
23
|
+
packUpToDate,
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
projectDir,
|
|
28
|
+
status,
|
|
29
|
+
scaleEngine: {
|
|
30
|
+
currentVersion: lock?.scaleVersion ?? null,
|
|
31
|
+
latestVersion: latestScaleVersion,
|
|
32
|
+
upToDate: scaleUpToDate,
|
|
33
|
+
},
|
|
34
|
+
governanceLock: {
|
|
35
|
+
exists: Boolean(lock),
|
|
36
|
+
path: join(projectDir, '.scale', 'governance.lock.json'),
|
|
37
|
+
},
|
|
38
|
+
governancePack: {
|
|
39
|
+
id: lock?.pack ?? null,
|
|
40
|
+
currentVersion: lock?.packVersion ?? null,
|
|
41
|
+
latestVersion: pack?.version ?? null,
|
|
42
|
+
upToDate: packUpToDate,
|
|
43
|
+
},
|
|
44
|
+
generatedFiles: {
|
|
45
|
+
total: generatedTotal,
|
|
46
|
+
clean: drift.clean.length,
|
|
47
|
+
changed: drift.changed.length,
|
|
48
|
+
missing: drift.missing.length,
|
|
49
|
+
},
|
|
50
|
+
drift,
|
|
51
|
+
thirdParty,
|
|
52
|
+
recommendedCommands: [
|
|
53
|
+
'scale upgrade plan --dir .',
|
|
54
|
+
'scale tools outdated --dir .',
|
|
55
|
+
'scale skill outdated --dir .',
|
|
56
|
+
'scale preflight --preflight-profile quick',
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function createUpgradePlanReport(options = {}) {
|
|
61
|
+
const check = createUpgradeCheckReport(options);
|
|
62
|
+
const blockers = [];
|
|
63
|
+
const steps = [];
|
|
64
|
+
if (!check.governanceLock.exists) {
|
|
65
|
+
blockers.push({
|
|
66
|
+
code: 'missing-governance-lock',
|
|
67
|
+
message: 'No governance lock exists; SCALE cannot determine which generated files are safe to upgrade.',
|
|
68
|
+
});
|
|
69
|
+
steps.push({
|
|
70
|
+
action: 'initialize-governance-lock',
|
|
71
|
+
risk: 'medium',
|
|
72
|
+
reason: 'Create a lock before upgrading generated governance assets.',
|
|
73
|
+
command: 'scale init --governance-pack standard',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (!check.scaleEngine.upToDate && check.scaleEngine.currentVersion) {
|
|
77
|
+
steps.push({
|
|
78
|
+
action: 'upgrade-scale-engine',
|
|
79
|
+
risk: 'low',
|
|
80
|
+
reason: `SCALE Engine changed from ${check.scaleEngine.currentVersion} to ${check.scaleEngine.latestVersion}.`,
|
|
81
|
+
command: 'npm install -g @hongmaple0820/scale-engine',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (!check.governancePack.upToDate && check.governancePack.id) {
|
|
85
|
+
steps.push({
|
|
86
|
+
action: 'upgrade-governance-pack',
|
|
87
|
+
risk: 'medium',
|
|
88
|
+
reason: `Governance pack ${check.governancePack.id} changed from v${check.governancePack.currentVersion} to v${check.governancePack.latestVersion}.`,
|
|
89
|
+
command: `scale init --governance-pack ${check.governancePack.id}`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
for (const entry of check.drift.missing) {
|
|
93
|
+
steps.push({
|
|
94
|
+
action: 'restore-missing-generated-file',
|
|
95
|
+
path: entry.path,
|
|
96
|
+
risk: 'low',
|
|
97
|
+
reason: 'The file is tracked by the governance lock but is missing locally.',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
for (const entry of check.drift.changed) {
|
|
101
|
+
blockers.push({
|
|
102
|
+
code: 'local-generated-file-changed',
|
|
103
|
+
path: entry.path,
|
|
104
|
+
message: 'Generated governance file has local edits and needs a three-way/manual review before upgrade.',
|
|
105
|
+
});
|
|
106
|
+
steps.push({
|
|
107
|
+
action: 'review-local-change',
|
|
108
|
+
path: entry.path,
|
|
109
|
+
risk: 'medium',
|
|
110
|
+
reason: 'Local edits must be preserved or intentionally replaced.',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const thirdPartyReview = check.thirdParty.entries.filter(entry => entry.updatePolicy !== 'check-only');
|
|
114
|
+
for (const entry of thirdPartyReview) {
|
|
115
|
+
steps.push({
|
|
116
|
+
action: 'review-third-party-capability',
|
|
117
|
+
risk: entry.trust === 'high-risk' ? 'high' : 'medium',
|
|
118
|
+
reason: `${entry.name} updates require ${entry.updatePolicy}; SCALE never auto-installs third-party capabilities.`,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
steps.push({
|
|
122
|
+
action: 'run-preflight',
|
|
123
|
+
risk: 'low',
|
|
124
|
+
reason: 'Validate the project after any accepted upgrade.',
|
|
125
|
+
command: 'scale preflight --preflight-profile quick',
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
version: 1,
|
|
129
|
+
projectDir: check.projectDir,
|
|
130
|
+
status: check.status,
|
|
131
|
+
applyMode: blockers.length === 0 ? 'safe' : 'manual-review',
|
|
132
|
+
blockers,
|
|
133
|
+
steps,
|
|
134
|
+
check,
|
|
135
|
+
recommendedCommands: [
|
|
136
|
+
'scale upgrade check --dir .',
|
|
137
|
+
'scale upgrade plan --dir . --html',
|
|
138
|
+
'scale preflight --preflight-profile quick',
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function applyUpgradePlan(options = {}) {
|
|
143
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
144
|
+
const plan = createUpgradePlanReport(options);
|
|
145
|
+
if (!options.confirm) {
|
|
146
|
+
return upgradeApplyResult(projectDir, plan, false, false, 'Review scale upgrade plan first, then rerun with --confirm.', []);
|
|
147
|
+
}
|
|
148
|
+
if (plan.applyMode !== 'safe') {
|
|
149
|
+
return upgradeApplyResult(projectDir, plan, false, false, 'Upgrade requires manual review because generated files have local changes or the lock is missing.', []);
|
|
150
|
+
}
|
|
151
|
+
if (!plan.check.governanceLock.exists || !plan.check.governancePack.id) {
|
|
152
|
+
return upgradeApplyResult(projectDir, plan, false, false, 'Cannot apply without a governance lock and pack id.', []);
|
|
153
|
+
}
|
|
154
|
+
if (!plan.check.governancePack.upToDate) {
|
|
155
|
+
return upgradeApplyResult(projectDir, plan, false, false, 'Governance pack version changes require manual review before automatic apply.', []);
|
|
156
|
+
}
|
|
157
|
+
const missingFiles = plan.check.drift.missing.map(entry => entry.path);
|
|
158
|
+
const shouldRefreshLock = !plan.check.scaleEngine.upToDate || missingFiles.length > 0;
|
|
159
|
+
if (!shouldRefreshLock) {
|
|
160
|
+
return upgradeApplyResult(projectDir, plan, true, false, 'No safe upgrade changes were needed.', []);
|
|
161
|
+
}
|
|
162
|
+
const backup = createUpgradeBackup(projectDir, uniqueStrings([...missingFiles, '.scale/governance.lock.json']));
|
|
163
|
+
const result = writeGovernanceTemplates(projectDir, { pack: plan.check.governancePack.id });
|
|
164
|
+
const createdFiles = result.created
|
|
165
|
+
.map(path => normalizeProjectRelativePath(projectDir, path))
|
|
166
|
+
.filter((path) => Boolean(path));
|
|
167
|
+
mergeCreatedFilesIntoBackup(backup.manifestPath, createdFiles);
|
|
168
|
+
const changedFiles = uniqueStrings([
|
|
169
|
+
...missingFiles.filter(path => existsSync(join(projectDir, path))),
|
|
170
|
+
...createdFiles,
|
|
171
|
+
'.scale/governance.lock.json',
|
|
172
|
+
]);
|
|
173
|
+
return {
|
|
174
|
+
version: 1,
|
|
175
|
+
projectDir,
|
|
176
|
+
ok: true,
|
|
177
|
+
applied: changedFiles.length > 0,
|
|
178
|
+
reason: changedFiles.length > 0 ? 'Safe upgrade changes were applied.' : 'No safe upgrade changes were needed.',
|
|
179
|
+
changedFiles,
|
|
180
|
+
backup,
|
|
181
|
+
plan: createUpgradePlanReport(options),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
export function rollbackLatestUpgrade(options = {}) {
|
|
185
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
186
|
+
const backup = latestUpgradeBackup(projectDir);
|
|
187
|
+
if (!backup) {
|
|
188
|
+
return {
|
|
189
|
+
version: 1,
|
|
190
|
+
projectDir,
|
|
191
|
+
ok: false,
|
|
192
|
+
applied: false,
|
|
193
|
+
reason: 'No SCALE-managed upgrade backup was found.',
|
|
194
|
+
restoredFiles: [],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const manifest = JSON.parse(readFileSync(backup.manifestPath, 'utf-8'));
|
|
198
|
+
const restoredFiles = [];
|
|
199
|
+
for (const entry of manifest.files) {
|
|
200
|
+
const target = join(projectDir, entry.path);
|
|
201
|
+
if (entry.existed && entry.backupPath) {
|
|
202
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
203
|
+
copyFileSync(join(backup.dir, entry.backupPath), target);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
rmSync(target, { force: true, recursive: true });
|
|
207
|
+
}
|
|
208
|
+
restoredFiles.push(entry.path);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
version: 1,
|
|
212
|
+
projectDir,
|
|
213
|
+
ok: true,
|
|
214
|
+
applied: true,
|
|
215
|
+
reason: 'Latest SCALE-managed upgrade backup was rolled back.',
|
|
216
|
+
backup,
|
|
217
|
+
restoredFiles: uniqueStrings(restoredFiles),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
export function createThirdPartyUpdateReport(category) {
|
|
221
|
+
const selectedCategories = Array.isArray(category) ? new Set(category) : category ? new Set([category]) : undefined;
|
|
222
|
+
const entries = TOOL_CAPABILITY_CATALOG
|
|
223
|
+
.filter(tool => !selectedCategories || selectedCategories.has(tool.category))
|
|
224
|
+
.map(tool => {
|
|
225
|
+
const trust = classifyThirdPartyTrust(tool.category, tool.source);
|
|
226
|
+
const updatePolicy = updatePolicyForTrust(trust);
|
|
227
|
+
return {
|
|
228
|
+
id: tool.id,
|
|
229
|
+
name: tool.name,
|
|
230
|
+
category: tool.category,
|
|
231
|
+
source: tool.source,
|
|
232
|
+
trust,
|
|
233
|
+
updatePolicy,
|
|
234
|
+
installPolicy: 'never-auto-install',
|
|
235
|
+
latestVersion: 'unknown',
|
|
236
|
+
reason: updateReason(tool.category, trust),
|
|
237
|
+
};
|
|
238
|
+
});
|
|
239
|
+
const trusted = entries.filter(entry => entry.trust === 'trusted').length;
|
|
240
|
+
const community = entries.filter(entry => entry.trust === 'community').length;
|
|
241
|
+
const highRisk = entries.filter(entry => entry.trust === 'high-risk').length;
|
|
242
|
+
const blocked = entries.filter(entry => entry.updatePolicy === 'blocked').length;
|
|
243
|
+
const reviewRequired = entries.filter(entry => entry.updatePolicy !== 'check-only').length;
|
|
244
|
+
return {
|
|
245
|
+
version: 1,
|
|
246
|
+
policy: 'check-only',
|
|
247
|
+
summary: {
|
|
248
|
+
total: entries.length,
|
|
249
|
+
trusted,
|
|
250
|
+
community,
|
|
251
|
+
highRisk,
|
|
252
|
+
reviewRequired,
|
|
253
|
+
blocked,
|
|
254
|
+
},
|
|
255
|
+
reviewRequired,
|
|
256
|
+
entries,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function upgradeApplyResult(projectDir, plan, ok, applied, reason, changedFiles) {
|
|
260
|
+
return {
|
|
261
|
+
version: 1,
|
|
262
|
+
projectDir,
|
|
263
|
+
ok,
|
|
264
|
+
applied,
|
|
265
|
+
reason,
|
|
266
|
+
changedFiles,
|
|
267
|
+
plan,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function createUpgradeBackup(projectDir, relativePaths) {
|
|
271
|
+
const id = `upgrade-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
272
|
+
const dir = join(projectDir, '.scale', 'backups', id);
|
|
273
|
+
const filesDir = join(dir, 'files');
|
|
274
|
+
mkdirSync(filesDir, { recursive: true });
|
|
275
|
+
const manifest = {
|
|
276
|
+
version: 1,
|
|
277
|
+
id,
|
|
278
|
+
createdAt: new Date().toISOString(),
|
|
279
|
+
projectDir,
|
|
280
|
+
files: uniqueStrings(relativePaths).map(path => {
|
|
281
|
+
const target = join(projectDir, path);
|
|
282
|
+
if (!existsSync(target))
|
|
283
|
+
return { path, existed: false };
|
|
284
|
+
const backupPath = join('files', path.replace(/^[\\/]+/, '').replace(/\\/g, '/'));
|
|
285
|
+
const backupTarget = join(dir, backupPath);
|
|
286
|
+
mkdirSync(dirname(backupTarget), { recursive: true });
|
|
287
|
+
copyFileSync(target, backupTarget);
|
|
288
|
+
return { path, existed: true, backupPath };
|
|
289
|
+
}),
|
|
290
|
+
};
|
|
291
|
+
const manifestPath = join(dir, 'manifest.json');
|
|
292
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
293
|
+
return { id, dir, manifestPath };
|
|
294
|
+
}
|
|
295
|
+
function mergeCreatedFilesIntoBackup(manifestPath, createdFiles) {
|
|
296
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
297
|
+
const existing = new Set(manifest.files.map(file => file.path));
|
|
298
|
+
for (const path of createdFiles) {
|
|
299
|
+
if (!existing.has(path)) {
|
|
300
|
+
manifest.files.push({ path, existed: false });
|
|
301
|
+
existing.add(path);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
305
|
+
}
|
|
306
|
+
function latestUpgradeBackup(projectDir) {
|
|
307
|
+
const backupsDir = join(projectDir, '.scale', 'backups');
|
|
308
|
+
if (!existsSync(backupsDir))
|
|
309
|
+
return null;
|
|
310
|
+
const candidates = readdirSync(backupsDir, { withFileTypes: true })
|
|
311
|
+
.filter(entry => entry.isDirectory() && entry.name.startsWith('upgrade-'))
|
|
312
|
+
.map(entry => ({
|
|
313
|
+
id: entry.name,
|
|
314
|
+
dir: join(backupsDir, entry.name),
|
|
315
|
+
manifestPath: join(backupsDir, entry.name, 'manifest.json'),
|
|
316
|
+
}))
|
|
317
|
+
.filter(entry => existsSync(entry.manifestPath))
|
|
318
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
319
|
+
return candidates.at(-1) ?? null;
|
|
320
|
+
}
|
|
321
|
+
function normalizeProjectRelativePath(projectDir, path) {
|
|
322
|
+
const normalizedProject = resolve(projectDir).replace(/\\/g, '/');
|
|
323
|
+
const normalizedPath = resolve(path).replace(/\\/g, '/');
|
|
324
|
+
if (!normalizedPath.startsWith(`${normalizedProject}/`))
|
|
325
|
+
return null;
|
|
326
|
+
return normalizedPath.slice(normalizedProject.length + 1);
|
|
327
|
+
}
|
|
328
|
+
function uniqueStrings(items) {
|
|
329
|
+
return [...new Set(items)];
|
|
330
|
+
}
|
|
331
|
+
export function writeUpgradePlanHtml(report, outputPath) {
|
|
332
|
+
const target = outputPath ?? join(report.projectDir, '.scale', 'reports', 'upgrade-plan.html');
|
|
333
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
334
|
+
writeFileSync(target, renderUpgradePlanHtml(report), 'utf-8');
|
|
335
|
+
return target;
|
|
336
|
+
}
|
|
337
|
+
export function listAvailableGovernancePackVersions() {
|
|
338
|
+
return listGovernanceTemplatePacks().map(pack => ({ id: pack.id, version: pack.version }));
|
|
339
|
+
}
|
|
340
|
+
function resolveUpgradeStatus(input) {
|
|
341
|
+
if (!input.hasLock)
|
|
342
|
+
return 'missing-lock';
|
|
343
|
+
if (input.hasLocalChanges)
|
|
344
|
+
return 'local-changes';
|
|
345
|
+
if (input.hasMissingFiles || !input.scaleUpToDate || !input.packUpToDate)
|
|
346
|
+
return 'updates-available';
|
|
347
|
+
return 'clean';
|
|
348
|
+
}
|
|
349
|
+
function normalizeTargetVersion(version) {
|
|
350
|
+
if (!version || version === 'latest')
|
|
351
|
+
return SCALE_ENGINE_VERSION;
|
|
352
|
+
return version;
|
|
353
|
+
}
|
|
354
|
+
function classifyThirdPartyTrust(category, source) {
|
|
355
|
+
if (category === 'desktop')
|
|
356
|
+
return 'high-risk';
|
|
357
|
+
if (!source)
|
|
358
|
+
return 'community';
|
|
359
|
+
if (source.includes('anthropics/') ||
|
|
360
|
+
source.includes('playwright.dev') ||
|
|
361
|
+
source.includes('openai/') ||
|
|
362
|
+
source.includes('google-gemini/') ||
|
|
363
|
+
source.includes('vercel-labs/'))
|
|
364
|
+
return 'trusted';
|
|
365
|
+
return 'community';
|
|
366
|
+
}
|
|
367
|
+
function updatePolicyForTrust(trust) {
|
|
368
|
+
if (trust === 'high-risk')
|
|
369
|
+
return 'blocked';
|
|
370
|
+
if (trust === 'community')
|
|
371
|
+
return 'manual-review';
|
|
372
|
+
return 'check-only';
|
|
373
|
+
}
|
|
374
|
+
function updateReason(category, trust) {
|
|
375
|
+
if (trust === 'high-risk')
|
|
376
|
+
return 'High-privilege desktop automation must be reviewed and confirmed by a human.';
|
|
377
|
+
if (trust === 'community')
|
|
378
|
+
return 'Community source requires source, script, and permission review before update.';
|
|
379
|
+
if (category === 'mcp')
|
|
380
|
+
return 'MCP updates must still be checked for command and permission changes.';
|
|
381
|
+
return 'Trusted source; check version and changelog before applying.';
|
|
382
|
+
}
|
|
383
|
+
function renderUpgradePlanHtml(report) {
|
|
384
|
+
const rows = report.steps.map(step => `
|
|
385
|
+
<tr>
|
|
386
|
+
<td>${escapeHtml(step.action)}</td>
|
|
387
|
+
<td>${escapeHtml(step.path ?? '')}</td>
|
|
388
|
+
<td>${escapeHtml(step.risk)}</td>
|
|
389
|
+
<td>${escapeHtml(step.reason)}</td>
|
|
390
|
+
<td><code>${escapeHtml(step.command ?? '')}</code></td>
|
|
391
|
+
</tr>`).join('');
|
|
392
|
+
const blockers = report.blockers.length
|
|
393
|
+
? report.blockers.map(blocker => `<li><strong>${escapeHtml(blocker.code)}</strong> ${escapeHtml(blocker.path ?? '')} ${escapeHtml(blocker.message)}</li>`).join('')
|
|
394
|
+
: '<li>No blockers detected.</li>';
|
|
395
|
+
return `<!doctype html>
|
|
396
|
+
<html lang="zh-CN">
|
|
397
|
+
<head>
|
|
398
|
+
<meta charset="utf-8" />
|
|
399
|
+
<title>SCALE Upgrade Plan</title>
|
|
400
|
+
<style>
|
|
401
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; margin: 32px; color: #1f2937; }
|
|
402
|
+
h1 { margin-bottom: 8px; }
|
|
403
|
+
table { border-collapse: collapse; width: 100%; margin-top: 16px; }
|
|
404
|
+
th, td { border: 1px solid #d1d5db; padding: 8px; text-align: left; vertical-align: top; }
|
|
405
|
+
th { background: #f3f4f6; }
|
|
406
|
+
code { white-space: pre-wrap; }
|
|
407
|
+
.badge { display: inline-block; padding: 2px 8px; border-radius: 999px; background: #eef2ff; }
|
|
408
|
+
</style>
|
|
409
|
+
</head>
|
|
410
|
+
<body>
|
|
411
|
+
<h1>SCALE Upgrade Plan</h1>
|
|
412
|
+
<p>Project: <code>${escapeHtml(report.projectDir)}</code></p>
|
|
413
|
+
<p>Status: <span class="badge">${escapeHtml(report.status)}</span> Apply mode: <span class="badge">${escapeHtml(report.applyMode)}</span></p>
|
|
414
|
+
<h2>Blockers</h2>
|
|
415
|
+
<ul>${blockers}</ul>
|
|
416
|
+
<h2>Steps</h2>
|
|
417
|
+
<table>
|
|
418
|
+
<thead><tr><th>Action</th><th>Path</th><th>Risk</th><th>Reason</th><th>Command</th></tr></thead>
|
|
419
|
+
<tbody>${rows}</tbody>
|
|
420
|
+
</table>
|
|
421
|
+
<h2>Third-party Policy</h2>
|
|
422
|
+
<p>Policy: ${escapeHtml(report.check.thirdParty.policy)}. Review required: ${report.check.thirdParty.reviewRequired}.</p>
|
|
423
|
+
</body>
|
|
424
|
+
</html>
|
|
425
|
+
`;
|
|
426
|
+
}
|
|
427
|
+
function escapeHtml(value) {
|
|
428
|
+
return value
|
|
429
|
+
.replace(/&/g, '&')
|
|
430
|
+
.replace(/</g, '<')
|
|
431
|
+
.replace(/>/g, '>')
|
|
432
|
+
.replace(/"/g, '"');
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=UpgradeManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UpgradeManager.js","sourceRoot":"","sources":["../../src/workflow/UpgradeManager.ts"],"names":[],"mappings":"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"}
|
package/docs/README.md
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
| [CODE_INTELLIGENCE.md](CODE_INTELLIGENCE.md) | CodeGraph、Graphify 和显式 fallback 的代码智能与探索 ROI |
|
|
26
26
|
| [WORKFLOW_EVAL.md](WORKFLOW_EVAL.md) | Workflow Eval、pass@k 指标、Failure Replay 和改进候选 |
|
|
27
27
|
| [SKILL_RADAR.md](SKILL_RADAR.md) | Skill Radar、能力置信度、证据要求和供应链安全检查 |
|
|
28
|
+
| [UPGRADE_MANAGEMENT.md](UPGRADE_MANAGEMENT.md) | SCALE CLI、governance pack、skills、MCP 和 CLI 工具的安全升级流程 |
|
|
28
29
|
| [GOVERNANCE_DASHBOARD.md](GOVERNANCE_DASHBOARD.md) | Runtime、eval、memory、resource、HTML artifact 的统一治理面板 |
|
|
29
30
|
| [RELEASE_READINESS.md](RELEASE_READINESS.md) | 发版前质量门槛、官方 demo 和真实项目落地验收 |
|
|
30
31
|
| [SKILL-REPOSITORY.md](SKILL-REPOSITORY.md) | 受治理 skill repository 和安装安全策略 |
|
package/docs/start/README.md
CHANGED
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
3. 回到根目录 [README](../../README.md)
|
|
14
14
|
理解 SCALE Engine 的核心能力和 governance pack 选择。
|
|
15
15
|
|
|
16
|
-
4.
|
|
16
|
+
4. [升级管理](../UPGRADE_MANAGEMENT.md)
|
|
17
|
+
理解工作流更新、第三方 skills/MCP/CLI 更新时如何先检查、生成计划、避免覆盖本地改动。
|
|
18
|
+
|
|
19
|
+
5. 查看 [文档地图](../README.md)
|
|
17
20
|
区分哪些文档是用户指南、哪些是参考资料、哪些是历史规划和过程记录。
|
|
18
21
|
|
|
19
22
|
## 你应该先看到什么
|
|
@@ -39,4 +42,5 @@
|
|
|
39
42
|
| Go 多服务后端 | `scale init --governance-pack go-service-matrix` |
|
|
40
43
|
| 多仓库/MOE 工作区 | `scale init --governance-pack moe-workspace` |
|
|
41
44
|
| 文档、报告、截图、脚本混乱 | `scale init --governance-pack resource-governance` |
|
|
45
|
+
| 工作流或第三方能力要升级 | `scale upgrade check && scale upgrade plan --html` |
|
|
42
46
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# CONTEXT.md
|
|
2
|
+
|
|
3
|
+
Project: Agent Governance Demo
|
|
4
|
+
|
|
5
|
+
| Term | Definition | Examples | Aliases | Source |
|
|
6
|
+
|------|------------|----------|---------|--------|
|
|
7
|
+
| OAuth state | One-time callback correlation value that binds authorization return traffic to a user session | `state-123` | callback state | `src/oauth-state.ts` |
|
|
8
|
+
| Consumed state | A state record that has already been used and must not be accepted again | `consumedAt: 900` | replayed state | `tests/oauth-state.test.ts` |
|
|
9
|
+
| Evidence | A command result or artifact that proves what was verified | `npm test`, eval report, dashboard | verification proof | SCALE workflow |
|
|
10
|
+
|
|
11
|
+
## Rejected Meanings
|
|
12
|
+
|
|
13
|
+
- Do not treat an expired state as recoverable without a new authorization flow.
|
|
14
|
+
- Do not treat a dashboard or eval report as a substitute for the business test.
|
|
@@ -1,37 +1,48 @@
|
|
|
1
1
|
# Agent Governance Demo
|
|
2
2
|
|
|
3
|
-
这是 SCALE Engine 的最小官方 demo
|
|
3
|
+
这是 SCALE Engine 的最小官方 demo 项目,用一个 OAuth state 校验场景展示 Agent 工程治理如何落到真实代码、测试、证据和报告里。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
业务目标很小:OAuth callback 必须拒绝缺失、过期、已消费或不匹配的 state。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
治理目标更重要:Agent 不能只说“我完成了”,必须留下可验证证据。
|
|
8
|
+
|
|
9
|
+
## 快速运行
|
|
8
10
|
|
|
9
11
|
```bash
|
|
10
12
|
npm install
|
|
11
13
|
npm test
|
|
12
14
|
```
|
|
13
15
|
|
|
14
|
-
##
|
|
16
|
+
## 一键治理烟测
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm run workflow:smoke
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
这个命令会依次运行:
|
|
23
|
+
|
|
24
|
+
- `npm test`:验证业务行为。
|
|
25
|
+
- `scale eval run --dir .`:运行工作流基线评测。
|
|
26
|
+
- `scale context budget --dir .`:检查上下文预算,避免无节制读取。
|
|
27
|
+
- `scale artifact dashboard --dir . --lang zh`:生成本地治理 HTML 看板。
|
|
28
|
+
|
|
29
|
+
## 适合演示的 SCALE 命令
|
|
15
30
|
|
|
16
31
|
```bash
|
|
17
|
-
scale
|
|
18
|
-
scale
|
|
19
|
-
scale
|
|
20
|
-
scale
|
|
21
|
-
scale
|
|
22
|
-
scale diagnose plan --task-id 2026-05-18-oauth-state --symptom "OAuth callback 在 state 过期或不匹配时行为不明确"
|
|
23
|
-
scale tdd slice --task-id 2026-05-18-oauth-state --behavior "拒绝过期、已消费或不匹配的 OAuth state" --public-interface "verifyOAuthState(record, providedState, now)" --failing-test "expired, consumed, mismatched state should return ok=false" --test-file tests/oauth-state.test.ts --impl-files src/oauth-state.ts
|
|
24
|
-
scale runtime record --title "demo business tests" --kind command --status passed --command "npm test" --exit-code 0 --summary "official demo OAuth state tests passed"
|
|
25
|
-
scale runtime final-check --task-id 2026-05-18-oauth-state --session-id 2026-05-18-oauth-state --level M
|
|
26
|
-
scale memory pack --task-id 2026-05-18-oauth-state --session-id 2026-05-18-oauth-state --task "加固 OAuth state 校验" --level M --budget 4000
|
|
27
|
-
scale memory settle --task-id 2026-05-18-oauth-state --session-id 2026-05-18-oauth-state --task "加固 OAuth state 校验" --level M
|
|
28
|
-
scale artifact render --task-id 2026-05-18-oauth-state --artifact-dir docs/worklog/tasks/2026-05-18-oauth-state
|
|
29
|
-
scale artifact doctor --artifact-dir docs/worklog/tasks/2026-05-18-oauth-state
|
|
32
|
+
scale governance mode --task "修复 OAuth state 校验绕过问题" --files "src/oauth-state.ts,tests/oauth-state.test.ts"
|
|
33
|
+
scale skill radar --dir . --task "修复 OAuth state 校验绕过问题" --phase verify --level M --files "src/oauth-state.ts,tests/oauth-state.test.ts"
|
|
34
|
+
scale codegraph status --dir .
|
|
35
|
+
scale eval run --dir .
|
|
36
|
+
scale artifact dashboard --dir . --lang zh
|
|
30
37
|
```
|
|
31
38
|
|
|
32
|
-
##
|
|
39
|
+
## 观察点
|
|
40
|
+
|
|
41
|
+
- `src/oauth-state.ts` 保持很小,便于核对 Agent 是否过度设计。
|
|
42
|
+
- `tests/oauth-state.test.ts` 覆盖成功、缺失、过期、已消费和不匹配 state。
|
|
43
|
+
- `CONTEXT.md` 和 `docs/CONTEXT-MAP.md` 只提供必要上下文,避免 demo 自己变成 token 污染源。
|
|
44
|
+
- `.scale/evals/suites/workflow-baseline.json` 可由 `scale eval init --dir .` 重新生成。
|
|
33
45
|
|
|
34
|
-
|
|
35
|
-
- 测试覆盖成功、过期、已消费、不匹配和缺失记录。
|
|
36
|
-
- SCALE 命令会生成任务证据、运行证据、记忆候选和 HTML 交付视图,避免 Agent 只口头说“已完成”。
|
|
46
|
+
## 这不是业务模板
|
|
37
47
|
|
|
48
|
+
这个 demo 不是 OAuth 产品模板,而是治理闭环模板。真实项目接入时,应保留 SCALE 的证据、评测、上下文预算和看板机制,再替换成自己的业务代码、服务矩阵和验证脚本。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# CONTEXT-MAP.md
|
|
2
|
+
|
|
3
|
+
Project: Agent Governance Demo
|
|
4
|
+
|
|
5
|
+
| Module | Owner | Product Doc | Architecture Doc |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| OAuth state verifier | SCALE demo | `README.md` | `src/oauth-state.ts` |
|
|
8
|
+
| Workflow evidence | SCALE demo | `README.md` | `.scale/evals/suites/workflow-baseline.json` |
|
|
9
|
+
|
|
10
|
+
## Cross-Module Rules
|
|
11
|
+
|
|
12
|
+
- Behavior changes in `src/oauth-state.ts` must update `tests/oauth-state.test.ts`.
|
|
13
|
+
- Workflow command changes must update `README.md`.
|
|
14
|
+
- Generated reports under `.scale/reports/` are review artifacts, not source of truth.
|
|
@@ -6,9 +6,14 @@
|
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
|
|
8
8
|
"lint": "tsc --noEmit --module NodeNext --moduleResolution NodeNext --target ES2022 src/oauth-state.ts tests/oauth-state.test.ts",
|
|
9
|
-
"test": "vitest run"
|
|
9
|
+
"test": "vitest run",
|
|
10
|
+
"scale:eval": "scale eval run --dir .",
|
|
11
|
+
"scale:budget": "scale context budget --dir .",
|
|
12
|
+
"scale:dashboard": "scale artifact dashboard --dir . --lang zh",
|
|
13
|
+
"workflow:smoke": "npm test && npm run scale:eval && npm run scale:budget && npm run scale:dashboard"
|
|
10
14
|
},
|
|
11
15
|
"devDependencies": {
|
|
16
|
+
"@hongmaple0820/scale-engine": "^0.20.0",
|
|
12
17
|
"typescript": "^5.5.0",
|
|
13
18
|
"vitest": "^2.1.9"
|
|
14
19
|
}
|
package/package.json
CHANGED