@buoy-design/cli 0.4.0 → 0.5.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/LICENSE +21 -0
- package/README.md +37 -21
- package/dist/bin.js +0 -0
- package/dist/cloud/config.d.ts +5 -0
- package/dist/cloud/config.d.ts.map +1 -1
- package/dist/cloud/config.js.map +1 -1
- package/dist/commands/ignore.d.ts +7 -3
- package/dist/commands/ignore.d.ts.map +1 -1
- package/dist/commands/ignore.js +81 -78
- package/dist/commands/ignore.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +108 -33
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/rescue.d.ts +3 -0
- package/dist/commands/rescue.d.ts.map +1 -0
- package/dist/commands/rescue.js +147 -0
- package/dist/commands/rescue.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/rescue/report.d.ts +9 -0
- package/dist/rescue/report.d.ts.map +1 -0
- package/dist/rescue/report.js +107 -0
- package/dist/rescue/report.js.map +1 -0
- package/dist/rescue/store.d.ts +9 -0
- package/dist/rescue/store.d.ts.map +1 -0
- package/dist/rescue/store.js +50 -0
- package/dist/rescue/store.js.map +1 -0
- package/dist/rescue/types.d.ts +76 -0
- package/dist/rescue/types.d.ts.map +1 -0
- package/dist/rescue/types.js +2 -0
- package/dist/rescue/types.js.map +1 -0
- package/dist/rescue/workflow.d.ts +37 -0
- package/dist/rescue/workflow.d.ts.map +1 -0
- package/dist/rescue/workflow.js +355 -0
- package/dist/rescue/workflow.js.map +1 -0
- package/dist/services/drift-analysis.d.ts +3 -1
- package/dist/services/drift-analysis.d.ts.map +1 -1
- package/dist/services/drift-analysis.js +179 -98
- package/dist/services/drift-analysis.js.map +1 -1
- package/dist/utils/upgrade-hints.d.ts +13 -2
- package/dist/utils/upgrade-hints.d.ts.map +1 -1
- package/dist/utils/upgrade-hints.js +43 -5
- package/dist/utils/upgrade-hints.js.map +1 -1
- package/package.json +14 -14
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Fix } from "@buoy-design/core";
|
|
2
|
+
export type RescueStatus = "planned" | "applied" | "verified" | "guarded" | "verification_failed" | "rolled_back";
|
|
3
|
+
export interface RescueSummary {
|
|
4
|
+
total: number;
|
|
5
|
+
critical: number;
|
|
6
|
+
warning: number;
|
|
7
|
+
info: number;
|
|
8
|
+
}
|
|
9
|
+
export interface RescueFinding {
|
|
10
|
+
id: string;
|
|
11
|
+
fingerprint: string;
|
|
12
|
+
type: string;
|
|
13
|
+
severity: "critical" | "warning" | "info";
|
|
14
|
+
file: string;
|
|
15
|
+
line?: number;
|
|
16
|
+
entity: string;
|
|
17
|
+
message: string;
|
|
18
|
+
classification: "safe-fix" | "review-required" | "accepted-legacy";
|
|
19
|
+
}
|
|
20
|
+
export interface RescueBackup {
|
|
21
|
+
file: string;
|
|
22
|
+
backupPath: string;
|
|
23
|
+
beforeHash: string;
|
|
24
|
+
afterHash?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface RescueVerificationCommand {
|
|
27
|
+
label: string;
|
|
28
|
+
command: string;
|
|
29
|
+
args: string[];
|
|
30
|
+
exitCode: number | null;
|
|
31
|
+
passed: boolean;
|
|
32
|
+
output: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RescueVerification {
|
|
35
|
+
completedAt: string;
|
|
36
|
+
passed: boolean;
|
|
37
|
+
skipped: boolean;
|
|
38
|
+
commands: RescueVerificationCommand[];
|
|
39
|
+
}
|
|
40
|
+
export interface RescueManifest {
|
|
41
|
+
version: 1;
|
|
42
|
+
id: string;
|
|
43
|
+
projectRoot: string;
|
|
44
|
+
projectName: string;
|
|
45
|
+
createdAt: string;
|
|
46
|
+
updatedAt: string;
|
|
47
|
+
status: RescueStatus;
|
|
48
|
+
source: {
|
|
49
|
+
branch: string | null;
|
|
50
|
+
head: string | null;
|
|
51
|
+
};
|
|
52
|
+
rescueBranch?: string;
|
|
53
|
+
before: {
|
|
54
|
+
summary: RescueSummary;
|
|
55
|
+
componentCount: number;
|
|
56
|
+
tokenCount: number;
|
|
57
|
+
};
|
|
58
|
+
after?: {
|
|
59
|
+
summary: RescueSummary;
|
|
60
|
+
componentCount: number;
|
|
61
|
+
tokenCount: number;
|
|
62
|
+
};
|
|
63
|
+
findings: RescueFinding[];
|
|
64
|
+
safeFixes: Fix[];
|
|
65
|
+
appliedFixIds: string[];
|
|
66
|
+
backups: RescueBackup[];
|
|
67
|
+
verification?: RescueVerification;
|
|
68
|
+
baseline?: {
|
|
69
|
+
reason: string;
|
|
70
|
+
actor?: string;
|
|
71
|
+
count: number;
|
|
72
|
+
path: string;
|
|
73
|
+
createdAt: string;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rescue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,UAAU,GACV,SAAS,GACT,qBAAqB,GACrB,aAAa,CAAC;AAElB,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,UAAU,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;CACpE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,yBAAyB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE;QACN,OAAO,EAAE,aAAa,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,aAAa,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rescue/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DriftSignal, Fix } from "@buoy-design/core";
|
|
2
|
+
import { loadIgnoreList } from "../commands/ignore.js";
|
|
3
|
+
import type { RescueManifest, RescueVerification } from "./types.js";
|
|
4
|
+
type Progress = (message: string) => void;
|
|
5
|
+
export declare function resolveProject(cwd?: string): Promise<{
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
config: import("../index.js").BuoyConfig;
|
|
8
|
+
configPath: string | null;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function selectSafeFixes(fixes: Fix[], drifts: DriftSignal[], projectRoot: string, acceptedFingerprints: Set<string>): Fix[];
|
|
11
|
+
export declare function acceptedFingerprintsFor(drifts: DriftSignal[], ignoreList: Awaited<ReturnType<typeof loadIgnoreList>>): Set<string>;
|
|
12
|
+
export declare function createRescuePlan(cwd?: string, onProgress?: Progress): Promise<RescueManifest>;
|
|
13
|
+
export interface VerificationSpec {
|
|
14
|
+
label: string;
|
|
15
|
+
command: string;
|
|
16
|
+
args: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function detectVerificationCommands(projectRoot: string): VerificationSpec[];
|
|
19
|
+
export declare function runVerification(projectRoot: string, specs?: VerificationSpec[], onProgress?: Progress): RescueVerification;
|
|
20
|
+
export declare function statusAfterVerification(current: RescueManifest["status"], verification: RescueVerification): RescueManifest["status"];
|
|
21
|
+
export declare function restoreBackups(manifest: RescueManifest, force: boolean): Promise<void>;
|
|
22
|
+
export declare function applyRescuePlan(cwd?: string, requestedRun?: string, options?: {
|
|
23
|
+
limit?: number;
|
|
24
|
+
}, onProgress?: Progress): Promise<RescueManifest>;
|
|
25
|
+
export declare function verifyRescueRun(cwd?: string, requestedRun?: string, onProgress?: Progress): Promise<RescueManifest>;
|
|
26
|
+
export declare function guardRescueRun(cwd: string | undefined, requestedRun: string | undefined, reason: string, actor?: string, onProgress?: Progress): Promise<RescueManifest>;
|
|
27
|
+
export declare function rollbackRescueRun(cwd?: string, requestedRun?: string, force?: boolean): Promise<RescueManifest>;
|
|
28
|
+
export declare function reportRescueRun(cwd?: string, requestedRun?: string): Promise<{
|
|
29
|
+
manifest: RescueManifest;
|
|
30
|
+
paths: {
|
|
31
|
+
json: string;
|
|
32
|
+
markdown: string;
|
|
33
|
+
html: string;
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/rescue/workflow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAO1D,OAAO,EAIL,cAAc,EAEf,MAAM,uBAAuB,CAAC;AAS/B,OAAO,KAAK,EAGV,cAAc,EACd,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAEpB,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1C,wBAAsB,cAAc,CAAC,GAAG,SAAgB;;;;GAMvD;AA2BD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,GAAG,EAAE,EACZ,MAAM,EAAE,WAAW,EAAE,EACrB,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,GAAG,EAAE,CAoBP;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EAAE,EACrB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,GACrD,GAAG,CAAC,MAAM,CAAC,CASb;AA2BD,wBAAsB,gBAAgB,CACpC,GAAG,SAAgB,EACnB,UAAU,CAAC,EAAE,QAAQ,GACpB,OAAO,CAAC,cAAc,CAAC,CA+CzB;AAyCD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,GAClB,gBAAgB,EAAE,CAwBpB;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,KAAK,qBAA0C,EAC/C,UAAU,CAAC,EAAE,QAAQ,GACpB,kBAAkB,CAyBpB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,EACjC,YAAY,EAAE,kBAAkB,GAC/B,cAAc,CAAC,QAAQ,CAAC,CAG1B;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAqBf;AAaD,wBAAsB,eAAe,CACnC,GAAG,SAAgB,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,EAChC,UAAU,CAAC,EAAE,QAAQ,GACpB,OAAO,CAAC,cAAc,CAAC,CA2EzB;AAED,wBAAsB,eAAe,CACnC,GAAG,SAAgB,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,QAAQ,GACpB,OAAO,CAAC,cAAc,CAAC,CAYzB;AAED,wBAAsB,cAAc,CAClC,GAAG,oBAAgB,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,QAAQ,GACpB,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAED,wBAAsB,iBAAiB,CACrC,GAAG,SAAgB,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,UAAQ,GACZ,OAAO,CAAC,cAAc,CAAC,CAqBzB;AAED,wBAAsB,eAAe,CACnC,GAAG,SAAgB,EACnB,YAAY,CAAC,EAAE,MAAM;;;;;;;GAKtB"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { copyFile, mkdir, readFile } from "node:fs/promises";
|
|
5
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
6
|
+
import { generateFixes } from "@buoy-design/core";
|
|
7
|
+
import { loadConfig } from "../config/loader.js";
|
|
8
|
+
import { DriftAnalysisService, calculateDriftSummary, } from "../services/drift-analysis.js";
|
|
9
|
+
import { createIgnoreList, fingerprintDrift, getIgnorePath, loadIgnoreList, saveIgnoreList, } from "../commands/ignore.js";
|
|
10
|
+
import { applyFixes, validateFixTargets } from "../fix/index.js";
|
|
11
|
+
import { writeRescueReports } from "./report.js";
|
|
12
|
+
import { createRunId, loadRescueManifest, rescueRunDir, saveRescueManifest, } from "./store.js";
|
|
13
|
+
export async function resolveProject(cwd = process.cwd()) {
|
|
14
|
+
const loaded = await loadConfig(cwd);
|
|
15
|
+
const projectRoot = loaded.configPath
|
|
16
|
+
? dirname(loaded.configPath)
|
|
17
|
+
: resolve(cwd);
|
|
18
|
+
return { ...loaded, projectRoot };
|
|
19
|
+
}
|
|
20
|
+
function gitValue(projectRoot, args) {
|
|
21
|
+
try {
|
|
22
|
+
return (execFileSync("git", args, {
|
|
23
|
+
cwd: projectRoot,
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
26
|
+
}).trim() || null);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function pathInside(projectRoot, file) {
|
|
33
|
+
const absolute = resolve(projectRoot, file);
|
|
34
|
+
const rel = relative(projectRoot, absolute);
|
|
35
|
+
return (rel !== "" &&
|
|
36
|
+
!rel.startsWith(`..${sep}`) &&
|
|
37
|
+
rel !== ".." &&
|
|
38
|
+
!isAbsolute(rel));
|
|
39
|
+
}
|
|
40
|
+
export function selectSafeFixes(fixes, drifts, projectRoot, acceptedFingerprints) {
|
|
41
|
+
const driftById = new Map(drifts.map((drift) => [drift.id, drift]));
|
|
42
|
+
const candidates = validateFixTargets(fixes).valid.filter((fix) => {
|
|
43
|
+
const drift = driftById.get(fix.driftSignalId);
|
|
44
|
+
return (!!drift &&
|
|
45
|
+
(fix.confidence === "exact" || fix.confidence === "high") &&
|
|
46
|
+
pathInside(projectRoot, fix.file) &&
|
|
47
|
+
!acceptedFingerprints.has(fingerprintDrift(drift)));
|
|
48
|
+
});
|
|
49
|
+
const counts = new Map();
|
|
50
|
+
for (const fix of candidates) {
|
|
51
|
+
const key = `${resolve(projectRoot, fix.file)}:${fix.line}:${fix.column}`;
|
|
52
|
+
counts.set(key, (counts.get(key) || 0) + 1);
|
|
53
|
+
}
|
|
54
|
+
return candidates.filter((fix) => {
|
|
55
|
+
const key = `${resolve(projectRoot, fix.file)}:${fix.line}:${fix.column}`;
|
|
56
|
+
return counts.get(key) === 1;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function acceptedFingerprintsFor(drifts, ignoreList) {
|
|
60
|
+
const accepted = new Set(ignoreList?.fingerprints || []);
|
|
61
|
+
if (!ignoreList)
|
|
62
|
+
return accepted;
|
|
63
|
+
const acceptedIds = new Set(ignoreList.driftIds || []);
|
|
64
|
+
for (const drift of drifts) {
|
|
65
|
+
if (acceptedIds.has(drift.id))
|
|
66
|
+
accepted.add(fingerprintDrift(drift));
|
|
67
|
+
}
|
|
68
|
+
return accepted;
|
|
69
|
+
}
|
|
70
|
+
function findingFromDrift(drift, safeFixIds, acceptedFingerprints) {
|
|
71
|
+
const location = drift.source.location || "";
|
|
72
|
+
const match = location.match(/^(.*?)(?::(\d+))?(?::\d+)?$/);
|
|
73
|
+
const fingerprint = fingerprintDrift(drift);
|
|
74
|
+
return {
|
|
75
|
+
id: drift.id,
|
|
76
|
+
fingerprint,
|
|
77
|
+
type: drift.type,
|
|
78
|
+
severity: drift.severity,
|
|
79
|
+
file: match?.[1] || location || drift.source.entityName,
|
|
80
|
+
line: match?.[2] ? Number.parseInt(match[2], 10) : undefined,
|
|
81
|
+
entity: drift.source.entityName,
|
|
82
|
+
message: drift.message,
|
|
83
|
+
classification: acceptedFingerprints.has(fingerprint)
|
|
84
|
+
? "accepted-legacy"
|
|
85
|
+
: safeFixIds.has(drift.id)
|
|
86
|
+
? "safe-fix"
|
|
87
|
+
: "review-required",
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export async function createRescuePlan(cwd = process.cwd(), onProgress) {
|
|
91
|
+
const { config, projectRoot } = await resolveProject(cwd);
|
|
92
|
+
const service = new DriftAnalysisService(config, projectRoot);
|
|
93
|
+
const analysis = await service.analyze({ includeIgnored: true, onProgress });
|
|
94
|
+
const existingBaseline = await loadIgnoreList(projectRoot);
|
|
95
|
+
const acceptedFingerprints = acceptedFingerprintsFor(analysis.drifts, existingBaseline);
|
|
96
|
+
const generated = generateFixes(analysis.drifts, analysis.tokens, {
|
|
97
|
+
minConfidence: "high",
|
|
98
|
+
});
|
|
99
|
+
const safeFixes = selectSafeFixes(generated, analysis.drifts, projectRoot, acceptedFingerprints);
|
|
100
|
+
const safeFixIds = new Set(safeFixes.map((fix) => fix.driftSignalId));
|
|
101
|
+
const now = new Date().toISOString();
|
|
102
|
+
const manifest = {
|
|
103
|
+
version: 1,
|
|
104
|
+
id: createRunId(),
|
|
105
|
+
projectRoot,
|
|
106
|
+
projectName: config.project.name,
|
|
107
|
+
createdAt: now,
|
|
108
|
+
updatedAt: now,
|
|
109
|
+
status: "planned",
|
|
110
|
+
source: {
|
|
111
|
+
branch: gitValue(projectRoot, ["branch", "--show-current"]),
|
|
112
|
+
head: gitValue(projectRoot, ["rev-parse", "HEAD"]),
|
|
113
|
+
},
|
|
114
|
+
before: {
|
|
115
|
+
summary: analysis.summary,
|
|
116
|
+
componentCount: analysis.components.length,
|
|
117
|
+
tokenCount: analysis.tokenCount,
|
|
118
|
+
},
|
|
119
|
+
findings: analysis.drifts.map((drift) => findingFromDrift(drift, safeFixIds, acceptedFingerprints)),
|
|
120
|
+
safeFixes,
|
|
121
|
+
appliedFixIds: [],
|
|
122
|
+
backups: [],
|
|
123
|
+
};
|
|
124
|
+
await saveRescueManifest(manifest);
|
|
125
|
+
await writeRescueReports(manifest);
|
|
126
|
+
return manifest;
|
|
127
|
+
}
|
|
128
|
+
function hash(content) {
|
|
129
|
+
return createHash("sha256").update(content).digest("hex");
|
|
130
|
+
}
|
|
131
|
+
function dirtyPaths(projectRoot) {
|
|
132
|
+
const output = gitValue(projectRoot, [
|
|
133
|
+
"status",
|
|
134
|
+
"--porcelain",
|
|
135
|
+
"--untracked-files=all",
|
|
136
|
+
]);
|
|
137
|
+
if (!output)
|
|
138
|
+
return [];
|
|
139
|
+
return output
|
|
140
|
+
.split("\n")
|
|
141
|
+
.map((line) => line.slice(3).trim())
|
|
142
|
+
.filter((path) => path && !path.startsWith(".buoy/rescue/"));
|
|
143
|
+
}
|
|
144
|
+
async function backupFiles(manifest, fixes) {
|
|
145
|
+
const files = [...new Set(fixes.map((fix) => fix.file))];
|
|
146
|
+
const backups = [];
|
|
147
|
+
for (const file of files) {
|
|
148
|
+
const absolute = resolve(manifest.projectRoot, file);
|
|
149
|
+
const rel = relative(manifest.projectRoot, absolute);
|
|
150
|
+
const backupPath = join(rescueRunDir(manifest.projectRoot, manifest.id), "backups", rel);
|
|
151
|
+
await mkdir(dirname(backupPath), { recursive: true });
|
|
152
|
+
const content = await readFile(absolute);
|
|
153
|
+
await copyFile(absolute, backupPath);
|
|
154
|
+
backups.push({ file: rel, backupPath, beforeHash: hash(content) });
|
|
155
|
+
}
|
|
156
|
+
return backups;
|
|
157
|
+
}
|
|
158
|
+
export function detectVerificationCommands(projectRoot) {
|
|
159
|
+
const packagePath = join(projectRoot, "package.json");
|
|
160
|
+
if (!existsSync(packagePath))
|
|
161
|
+
return [];
|
|
162
|
+
const pkg = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
163
|
+
const scripts = pkg.scripts || {};
|
|
164
|
+
const packageManager = pkg.packageManager?.split("@")[0] ||
|
|
165
|
+
(existsSync(join(projectRoot, "pnpm-lock.yaml"))
|
|
166
|
+
? "pnpm"
|
|
167
|
+
: existsSync(join(projectRoot, "yarn.lock"))
|
|
168
|
+
? "yarn"
|
|
169
|
+
: "npm");
|
|
170
|
+
const selected = [
|
|
171
|
+
scripts.typecheck ? "typecheck" : null,
|
|
172
|
+
scripts["test:ci"] ? "test:ci" : scripts.test ? "test" : null,
|
|
173
|
+
].filter((value) => !!value);
|
|
174
|
+
return selected.map((script) => ({
|
|
175
|
+
label: script,
|
|
176
|
+
command: packageManager,
|
|
177
|
+
args: packageManager === "npm" ? ["run", script] : ["run", script],
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
export function runVerification(projectRoot, specs = detectVerificationCommands(projectRoot), onProgress) {
|
|
181
|
+
const commands = [];
|
|
182
|
+
for (const spec of specs) {
|
|
183
|
+
onProgress?.(`Running ${spec.label}...`);
|
|
184
|
+
const result = spawnSync(spec.command, spec.args, {
|
|
185
|
+
cwd: projectRoot,
|
|
186
|
+
encoding: "utf8",
|
|
187
|
+
env: { ...process.env, CI: "1" },
|
|
188
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
189
|
+
});
|
|
190
|
+
const combined = `${result.stdout || ""}\n${result.stderr || ""}`.trim();
|
|
191
|
+
commands.push({
|
|
192
|
+
...spec,
|
|
193
|
+
exitCode: result.status,
|
|
194
|
+
passed: result.status === 0,
|
|
195
|
+
output: combined.slice(-8000),
|
|
196
|
+
});
|
|
197
|
+
if (result.status !== 0)
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
completedAt: new Date().toISOString(),
|
|
202
|
+
passed: commands.length > 0 && commands.every((command) => command.passed),
|
|
203
|
+
skipped: commands.length === 0,
|
|
204
|
+
commands,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
export function statusAfterVerification(current, verification) {
|
|
208
|
+
if (verification.skipped)
|
|
209
|
+
return current;
|
|
210
|
+
return verification.passed ? "verified" : "verification_failed";
|
|
211
|
+
}
|
|
212
|
+
export async function restoreBackups(manifest, force) {
|
|
213
|
+
for (const backup of manifest.backups) {
|
|
214
|
+
const target = resolve(manifest.projectRoot, backup.file);
|
|
215
|
+
if (!pathInside(manifest.projectRoot, backup.file)) {
|
|
216
|
+
throw new Error(`Refusing to restore a path outside the project: ${backup.file}`);
|
|
217
|
+
}
|
|
218
|
+
if (existsSync(target) && backup.afterHash && !force) {
|
|
219
|
+
const currentHash = hash(await readFile(target));
|
|
220
|
+
if (currentHash !== backup.afterHash &&
|
|
221
|
+
currentHash !== backup.beforeHash) {
|
|
222
|
+
throw new Error(`${backup.file} changed after Rescue. Review it or rerun rollback with --force.`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
await copyFile(backup.backupPath, target);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
async function analyzeAfter(manifest, onProgress) {
|
|
229
|
+
const { config } = await loadConfig(manifest.projectRoot);
|
|
230
|
+
const service = new DriftAnalysisService(config, manifest.projectRoot);
|
|
231
|
+
const analysis = await service.analyze({ includeIgnored: true, onProgress });
|
|
232
|
+
manifest.after = {
|
|
233
|
+
summary: calculateDriftSummary(analysis.drifts),
|
|
234
|
+
componentCount: analysis.components.length,
|
|
235
|
+
tokenCount: analysis.tokenCount,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
export async function applyRescuePlan(cwd = process.cwd(), requestedRun, options = {}, onProgress) {
|
|
239
|
+
const { projectRoot } = await resolveProject(cwd);
|
|
240
|
+
const manifest = await loadRescueManifest(projectRoot, requestedRun);
|
|
241
|
+
if (manifest.status !== "planned") {
|
|
242
|
+
throw new Error(`Run ${manifest.id} is ${manifest.status}; only a planned run can be applied.`);
|
|
243
|
+
}
|
|
244
|
+
if (!manifest.source.head || !manifest.source.branch) {
|
|
245
|
+
throw new Error("Rescue apply requires a Git repository with a named branch.");
|
|
246
|
+
}
|
|
247
|
+
const currentHead = gitValue(projectRoot, ["rev-parse", "HEAD"]);
|
|
248
|
+
if (currentHead !== manifest.source.head) {
|
|
249
|
+
throw new Error("The repository changed after planning. Create a new Rescue plan.");
|
|
250
|
+
}
|
|
251
|
+
const dirty = dirtyPaths(projectRoot);
|
|
252
|
+
if (dirty.length > 0) {
|
|
253
|
+
throw new Error(`Commit or stash existing changes before Rescue apply: ${dirty.slice(0, 5).join(", ")}`);
|
|
254
|
+
}
|
|
255
|
+
const fixes = options.limit
|
|
256
|
+
? manifest.safeFixes.slice(0, options.limit)
|
|
257
|
+
: manifest.safeFixes;
|
|
258
|
+
if (fixes.length === 0)
|
|
259
|
+
throw new Error("This plan has no high-confidence fixes to apply.");
|
|
260
|
+
manifest.rescueBranch = `buoy/${manifest.id}`;
|
|
261
|
+
execFileSync("git", ["switch", "-c", manifest.rescueBranch], {
|
|
262
|
+
cwd: projectRoot,
|
|
263
|
+
stdio: "ignore",
|
|
264
|
+
});
|
|
265
|
+
manifest.backups = await backupFiles(manifest, fixes);
|
|
266
|
+
await saveRescueManifest(manifest);
|
|
267
|
+
const absoluteFixes = fixes.map((fix) => ({
|
|
268
|
+
...fix,
|
|
269
|
+
file: resolve(projectRoot, fix.file),
|
|
270
|
+
}));
|
|
271
|
+
const applied = await applyFixes(absoluteFixes, { minConfidence: "high" });
|
|
272
|
+
if (applied.failed > 0) {
|
|
273
|
+
await restoreBackups(manifest, true);
|
|
274
|
+
manifest.status = "rolled_back";
|
|
275
|
+
await saveRescueManifest(manifest);
|
|
276
|
+
await writeRescueReports(manifest);
|
|
277
|
+
throw new Error(`${applied.failed} fix(es) failed; all Rescue edits were rolled back.`);
|
|
278
|
+
}
|
|
279
|
+
manifest.appliedFixIds = applied.results
|
|
280
|
+
.filter((result) => result.status === "applied")
|
|
281
|
+
.map((result) => result.fixId);
|
|
282
|
+
for (const backup of manifest.backups) {
|
|
283
|
+
backup.afterHash = hash(await readFile(resolve(projectRoot, backup.file)));
|
|
284
|
+
}
|
|
285
|
+
manifest.status = "applied";
|
|
286
|
+
manifest.verification = runVerification(projectRoot, undefined, onProgress);
|
|
287
|
+
if (!manifest.verification.skipped && !manifest.verification.passed) {
|
|
288
|
+
await restoreBackups(manifest, true);
|
|
289
|
+
manifest.status = "verification_failed";
|
|
290
|
+
await saveRescueManifest(manifest);
|
|
291
|
+
await writeRescueReports(manifest);
|
|
292
|
+
throw new Error("Project verification failed; Rescue restored every modified file.");
|
|
293
|
+
}
|
|
294
|
+
if (manifest.verification.passed)
|
|
295
|
+
manifest.status = "verified";
|
|
296
|
+
await analyzeAfter(manifest, onProgress);
|
|
297
|
+
await saveRescueManifest(manifest);
|
|
298
|
+
await writeRescueReports(manifest);
|
|
299
|
+
return manifest;
|
|
300
|
+
}
|
|
301
|
+
export async function verifyRescueRun(cwd = process.cwd(), requestedRun, onProgress) {
|
|
302
|
+
const { projectRoot } = await resolveProject(cwd);
|
|
303
|
+
const manifest = await loadRescueManifest(projectRoot, requestedRun);
|
|
304
|
+
manifest.verification = runVerification(projectRoot, undefined, onProgress);
|
|
305
|
+
manifest.status = statusAfterVerification(manifest.status, manifest.verification);
|
|
306
|
+
await analyzeAfter(manifest, onProgress);
|
|
307
|
+
await saveRescueManifest(manifest);
|
|
308
|
+
await writeRescueReports(manifest);
|
|
309
|
+
return manifest;
|
|
310
|
+
}
|
|
311
|
+
export async function guardRescueRun(cwd = process.cwd(), requestedRun, reason, actor, onProgress) {
|
|
312
|
+
const { config, projectRoot } = await resolveProject(cwd);
|
|
313
|
+
const manifest = await loadRescueManifest(projectRoot, requestedRun);
|
|
314
|
+
const service = new DriftAnalysisService(config, projectRoot);
|
|
315
|
+
const analysis = await service.analyze({ includeIgnored: true, onProgress });
|
|
316
|
+
const baseline = createIgnoreList(analysis.drifts, reason, actor);
|
|
317
|
+
await saveIgnoreList(baseline, projectRoot);
|
|
318
|
+
manifest.baseline = {
|
|
319
|
+
reason,
|
|
320
|
+
actor,
|
|
321
|
+
count: baseline.summary.total,
|
|
322
|
+
path: getIgnorePath(projectRoot),
|
|
323
|
+
createdAt: new Date().toISOString(),
|
|
324
|
+
};
|
|
325
|
+
manifest.status = "guarded";
|
|
326
|
+
await saveRescueManifest(manifest);
|
|
327
|
+
await writeRescueReports(manifest);
|
|
328
|
+
return manifest;
|
|
329
|
+
}
|
|
330
|
+
export async function rollbackRescueRun(cwd = process.cwd(), requestedRun, force = false) {
|
|
331
|
+
const { projectRoot } = await resolveProject(cwd);
|
|
332
|
+
const manifest = await loadRescueManifest(projectRoot, requestedRun);
|
|
333
|
+
if (manifest.backups.length === 0)
|
|
334
|
+
throw new Error("This Rescue run has no applied files to roll back.");
|
|
335
|
+
await restoreBackups(manifest, force);
|
|
336
|
+
const currentBranch = gitValue(projectRoot, ["branch", "--show-current"]);
|
|
337
|
+
if (manifest.rescueBranch &&
|
|
338
|
+
currentBranch === manifest.rescueBranch &&
|
|
339
|
+
manifest.source.branch) {
|
|
340
|
+
execFileSync("git", ["switch", manifest.source.branch], {
|
|
341
|
+
cwd: projectRoot,
|
|
342
|
+
stdio: "ignore",
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
manifest.status = "rolled_back";
|
|
346
|
+
await saveRescueManifest(manifest);
|
|
347
|
+
await writeRescueReports(manifest);
|
|
348
|
+
return manifest;
|
|
349
|
+
}
|
|
350
|
+
export async function reportRescueRun(cwd = process.cwd(), requestedRun) {
|
|
351
|
+
const { projectRoot } = await resolveProject(cwd);
|
|
352
|
+
const manifest = await loadRescueManifest(projectRoot, requestedRun);
|
|
353
|
+
return { manifest, paths: await writeRescueReports(manifest) };
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/rescue/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* 3. Applying ignore rules from config
|
|
8
8
|
* 4. Filtering against ignore list
|
|
9
9
|
*/
|
|
10
|
-
import type { DriftSignal, Severity, Component } from "@buoy-design/core";
|
|
10
|
+
import type { DriftSignal, Severity, Component, DesignToken } from "@buoy-design/core";
|
|
11
11
|
import type { BuoyConfig } from "../config/schema.js";
|
|
12
12
|
import { ScanCache } from "@buoy-design/scanners";
|
|
13
13
|
export interface DriftAnalysisOptions {
|
|
@@ -35,6 +35,8 @@ export interface DriftAnalysisResult {
|
|
|
35
35
|
components: Component[];
|
|
36
36
|
/** Number of tokens found during scan */
|
|
37
37
|
tokenCount: number;
|
|
38
|
+
/** Tokens found during the scan, used by safe-fix workflows. */
|
|
39
|
+
tokens: DesignToken[];
|
|
38
40
|
/** Number of drifts filtered out by ignore list */
|
|
39
41
|
ignoredCount: number;
|
|
40
42
|
/** Summary counts by severity */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drift-analysis.d.ts","sourceRoot":"","sources":["../../src/services/drift-analysis.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"drift-analysis.d.ts","sourceRoot":"","sources":["../../src/services/drift-analysis.ts"],"names":[],"mappings":"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"}
|