@buoy-design/cli 0.4.1 → 0.6.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 +50 -21
- package/dist/cloud/config.d.ts +12 -0
- package/dist/cloud/config.d.ts.map +1 -1
- package/dist/cloud/config.js.map +1 -1
- package/dist/commands/ahoy.d.ts.map +1 -1
- package/dist/commands/ahoy.js +3 -1
- package/dist/commands/ahoy.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +14 -0
- package/dist/commands/check.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 +136 -34
- 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/commands/telemetry.d.ts +9 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +51 -0
- package/dist/commands/telemetry.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/telemetry/index.d.ts +53 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +117 -0
- package/dist/telemetry/index.js.map +1 -0
- 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 +45 -7
- package/dist/utils/upgrade-hints.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { error, header, info, keyValue, newline, setJsonMode, spinner, success, warning, } from "../output/reporters.js";
|
|
3
|
+
import { applyRescuePlan, createRescuePlan, guardRescueRun, reportRescueRun, rollbackRescueRun, verifyRescueRun, } from "../rescue/workflow.js";
|
|
4
|
+
import { rescueRunDir } from "../rescue/store.js";
|
|
5
|
+
function failure(cause) {
|
|
6
|
+
error(cause instanceof Error ? cause.message : String(cause));
|
|
7
|
+
process.exitCode = 1;
|
|
8
|
+
}
|
|
9
|
+
export function createRescueCommand() {
|
|
10
|
+
const command = new Command("rescue").description("Measure, repair, guard, and prove design-system health");
|
|
11
|
+
command
|
|
12
|
+
.command("plan", { isDefault: true })
|
|
13
|
+
.description("Create a read-only Rescue baseline and repair plan")
|
|
14
|
+
.option("--json", "Output the plan as JSON")
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
if (options.json)
|
|
17
|
+
setJsonMode(true);
|
|
18
|
+
const spin = spinner("Building Rescue plan...");
|
|
19
|
+
try {
|
|
20
|
+
const manifest = await createRescuePlan(process.cwd(), (message) => {
|
|
21
|
+
spin.text = message;
|
|
22
|
+
});
|
|
23
|
+
spin.stop();
|
|
24
|
+
if (options.json) {
|
|
25
|
+
console.log(JSON.stringify(manifest, null, 2));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
header("Buoy Rescue plan");
|
|
29
|
+
newline();
|
|
30
|
+
keyValue("Run", manifest.id);
|
|
31
|
+
keyValue("Findings", String(manifest.before.summary.total));
|
|
32
|
+
keyValue("High-confidence fixes", String(manifest.safeFixes.length));
|
|
33
|
+
keyValue("Review required", String(manifest.findings.filter((item) => item.classification === "review-required").length));
|
|
34
|
+
keyValue("Artifacts", rescueRunDir(manifest.projectRoot, manifest.id));
|
|
35
|
+
newline();
|
|
36
|
+
info(`Review report.html, then run \`buoy rescue apply --run ${manifest.id} --approve\`.`);
|
|
37
|
+
}
|
|
38
|
+
catch (cause) {
|
|
39
|
+
spin.stop();
|
|
40
|
+
failure(cause);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
command
|
|
44
|
+
.command("apply")
|
|
45
|
+
.description("Apply approved high-confidence fixes on a new branch")
|
|
46
|
+
.option("--run <id>", "Rescue run ID (defaults to latest)")
|
|
47
|
+
.requiredOption("--approve", "Confirm that the generated plan has been reviewed")
|
|
48
|
+
.option("--limit <count>", "Maximum fixes to apply", (value) => Number.parseInt(value, 10))
|
|
49
|
+
.action(async (options) => {
|
|
50
|
+
const spin = spinner("Applying approved Rescue fixes...");
|
|
51
|
+
try {
|
|
52
|
+
const manifest = await applyRescuePlan(process.cwd(), options.run, { limit: options.limit }, (message) => {
|
|
53
|
+
spin.text = message;
|
|
54
|
+
});
|
|
55
|
+
spin.stop();
|
|
56
|
+
success(`${manifest.appliedFixIds.length} high-confidence fix(es) applied on ${manifest.rescueBranch}.`);
|
|
57
|
+
if (manifest.verification?.skipped) {
|
|
58
|
+
warning("No test or typecheck scripts were detected. Manual verification is still required.");
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
success("Project verification passed.");
|
|
62
|
+
}
|
|
63
|
+
info(`Review ${rescueRunDir(manifest.projectRoot, manifest.id)}/report.html before committing.`);
|
|
64
|
+
}
|
|
65
|
+
catch (cause) {
|
|
66
|
+
spin.stop();
|
|
67
|
+
failure(cause);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
command
|
|
71
|
+
.command("verify")
|
|
72
|
+
.description("Run project checks and refresh the before/after report")
|
|
73
|
+
.option("--run <id>", "Rescue run ID (defaults to latest)")
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
const spin = spinner("Verifying Rescue changes...");
|
|
76
|
+
try {
|
|
77
|
+
const manifest = await verifyRescueRun(process.cwd(), options.run, (message) => {
|
|
78
|
+
spin.text = message;
|
|
79
|
+
});
|
|
80
|
+
spin.stop();
|
|
81
|
+
if (manifest.verification?.passed)
|
|
82
|
+
success("Rescue verification passed.");
|
|
83
|
+
else if (manifest.verification?.skipped)
|
|
84
|
+
warning("No automated project checks were detected.");
|
|
85
|
+
else
|
|
86
|
+
failure("Rescue verification failed. Review the report before proceeding.");
|
|
87
|
+
}
|
|
88
|
+
catch (cause) {
|
|
89
|
+
spin.stop();
|
|
90
|
+
failure(cause);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
command
|
|
94
|
+
.command("guard")
|
|
95
|
+
.description("Record reviewed legacy drift so checks focus on new violations")
|
|
96
|
+
.option("--run <id>", "Rescue run ID (defaults to latest)")
|
|
97
|
+
.requiredOption("--reason <reason>", "Why the remaining legacy drift is accepted")
|
|
98
|
+
.option("--actor <name>", "Person or team approving the baseline")
|
|
99
|
+
.action(async (options) => {
|
|
100
|
+
const spin = spinner("Recording reviewed legacy drift...");
|
|
101
|
+
try {
|
|
102
|
+
const manifest = await guardRescueRun(process.cwd(), options.run, options.reason, options.actor, (message) => {
|
|
103
|
+
spin.text = message;
|
|
104
|
+
});
|
|
105
|
+
spin.stop();
|
|
106
|
+
success(`${manifest.baseline?.count || 0} legacy finding(s) recorded with stable fingerprints.`);
|
|
107
|
+
info("Future drift checks focus on newly introduced violations.");
|
|
108
|
+
}
|
|
109
|
+
catch (cause) {
|
|
110
|
+
spin.stop();
|
|
111
|
+
failure(cause);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
command
|
|
115
|
+
.command("report")
|
|
116
|
+
.description("Regenerate JSON, Markdown, and HTML Rescue reports")
|
|
117
|
+
.option("--run <id>", "Rescue run ID (defaults to latest)")
|
|
118
|
+
.action(async (options) => {
|
|
119
|
+
try {
|
|
120
|
+
const { paths } = await reportRescueRun(process.cwd(), options.run);
|
|
121
|
+
success("Rescue reports generated.");
|
|
122
|
+
keyValue("HTML", paths.html);
|
|
123
|
+
keyValue("Markdown", paths.markdown);
|
|
124
|
+
keyValue("JSON", paths.json);
|
|
125
|
+
}
|
|
126
|
+
catch (cause) {
|
|
127
|
+
failure(cause);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
command
|
|
131
|
+
.command("rollback")
|
|
132
|
+
.description("Restore files saved before Rescue apply")
|
|
133
|
+
.option("--run <id>", "Rescue run ID (defaults to latest)")
|
|
134
|
+
.option("--force", "Overwrite files changed after Rescue apply")
|
|
135
|
+
.action(async (options) => {
|
|
136
|
+
try {
|
|
137
|
+
const manifest = await rollbackRescueRun(process.cwd(), options.run, options.force);
|
|
138
|
+
success(`Restored ${manifest.backups.length} file(s) from local Rescue backups.`);
|
|
139
|
+
info("The Rescue branch was retained for inspection and can be deleted manually.");
|
|
140
|
+
}
|
|
141
|
+
catch (cause) {
|
|
142
|
+
failure(cause);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return command;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=rescue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rescue.js","sourceRoot":"","sources":["../../src/commands/rescue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,KAAK,EACL,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,GACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,SAAS,OAAO,CAAC,KAAc;IAC7B,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC/C,wDAAwD,CACzD,CAAC;IAEF,OAAO;SACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACpC,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,IAAI;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE;gBACjE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YACD,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;YACV,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,QAAQ,CACN,iBAAiB,EACjB,MAAM,CACJ,QAAQ,CAAC,QAAQ,CAAC,MAAM,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,iBAAiB,CACpD,CAAC,MAAM,CACT,CACF,CAAC;YACF,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,EAAE,CAAC;YACV,IAAI,CACF,0DAA0D,QAAQ,CAAC,EAAE,eAAe,CACrF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC1D,cAAc,CACb,WAAW,EACX,mDAAmD,CACpD;SACA,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,GAAG,EACX,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EACxB,CAAC,OAAO,EAAE,EAAE;gBACV,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,CAAC,CACF,CAAC;YACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CACL,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,uCAAuC,QAAQ,CAAC,YAAY,GAAG,CAChG,CAAC;YACF,IAAI,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;gBACnC,OAAO,CACL,oFAAoF,CACrF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,CACF,UAAU,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,iCAAiC,CAC3F,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,GAAG,EACX,CAAC,OAAO,EAAE,EAAE;gBACV,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,CAAC,CACF,CAAC;YACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,QAAQ,CAAC,YAAY,EAAE,MAAM;gBAC/B,OAAO,CAAC,6BAA6B,CAAC,CAAC;iBACpC,IAAI,QAAQ,CAAC,YAAY,EAAE,OAAO;gBACrC,OAAO,CAAC,4CAA4C,CAAC,CAAC;;gBAEtD,OAAO,CACL,kEAAkE,CACnE,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CACV,gEAAgE,CACjE;SACA,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC1D,cAAc,CACb,mBAAmB,EACnB,4CAA4C,CAC7C;SACA,MAAM,CAAC,gBAAgB,EAAE,uCAAuC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,oCAAoC,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,KAAK,EACb,CAAC,OAAO,EAAE,EAAE;gBACV,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACtB,CAAC,CACF,CAAC;YACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CACL,GAAG,QAAQ,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,uDAAuD,CACxF,CAAC;YACF,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACpE,OAAO,CAAC,2BAA2B,CAAC,CAAC;YACrC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;SAC1D,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,KAAK,CACd,CAAC;YACF,OAAO,CACL,YAAY,QAAQ,CAAC,OAAO,CAAC,MAAM,qCAAqC,CACzE,CAAC;YACF,IAAI,CACF,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buoy ahoy telemetry [on|off|status]
|
|
3
|
+
*
|
|
4
|
+
* Shows and controls opt-in anonymous usage telemetry, including the exact
|
|
5
|
+
* payload shape so people can see what would be sent.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function createTelemetryCommand(): Command;
|
|
9
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,IAAI,OAAO,CAuChD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buoy ahoy telemetry [on|off|status]
|
|
3
|
+
*
|
|
4
|
+
* Shows and controls opt-in anonymous usage telemetry, including the exact
|
|
5
|
+
* payload shape so people can see what would be sent.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import { buildPayload, getTelemetryState, isTelemetryEnabled, setTelemetryEnabled, telemetryBlockedByEnvironment } from '../telemetry/index.js';
|
|
10
|
+
import { getApiEndpoint } from '../cloud/config.js';
|
|
11
|
+
import { info, keyValue, newline, success } from '../output/reporters.js';
|
|
12
|
+
export function createTelemetryCommand() {
|
|
13
|
+
const cmd = new Command('telemetry');
|
|
14
|
+
cmd
|
|
15
|
+
.description('Show or change anonymous usage telemetry (off by default)')
|
|
16
|
+
.argument('[action]', 'on, off, or status', 'status')
|
|
17
|
+
.option('--json', 'Output as JSON')
|
|
18
|
+
.action((action, options) => {
|
|
19
|
+
if (action === 'on' || action === 'off') {
|
|
20
|
+
setTelemetryEnabled(action === 'on');
|
|
21
|
+
}
|
|
22
|
+
else if (action !== 'status') {
|
|
23
|
+
console.error(`Unknown action "${action}". Use on, off, or status.`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const state = getTelemetryState();
|
|
27
|
+
const blocked = telemetryBlockedByEnvironment();
|
|
28
|
+
const effective = isTelemetryEnabled();
|
|
29
|
+
const example = buildPayload('cli_drift_found', { total: 4, critical: 1, warning: 3, info: 0, files: 2 });
|
|
30
|
+
if (options.json) {
|
|
31
|
+
console.log(JSON.stringify({ enabled: state.enabled === true, effective, blockedByEnvironment: blocked, endpoint: `${getApiEndpoint()}/analytics/events/anonymous`, examplePayload: example }, null, 2));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (action === 'on')
|
|
35
|
+
success('Telemetry turned on');
|
|
36
|
+
if (action === 'off')
|
|
37
|
+
success('Telemetry turned off');
|
|
38
|
+
newline();
|
|
39
|
+
keyValue('Setting', state.enabled === true ? 'on' : state.askedAt ? 'off' : 'off (not asked yet)');
|
|
40
|
+
if (blocked)
|
|
41
|
+
keyValue('Environment', chalk.yellow('blocked by BUOY_TELEMETRY=0, DO_NOT_TRACK=1, or CI'));
|
|
42
|
+
keyValue('Effective', effective ? chalk.green('sending') : chalk.dim('not sending'));
|
|
43
|
+
keyValue('Endpoint', `${getApiEndpoint()}/analytics/events/anonymous`);
|
|
44
|
+
newline();
|
|
45
|
+
info('Events: cli_first_run, cli_drift_found, cli_check_clean, cli_hint_shown, cli_login_started');
|
|
46
|
+
info('Payload is only counts, the CLI version, and the OS. Example:');
|
|
47
|
+
console.log(chalk.dim(JSON.stringify(example ?? { note: 'anonymous id is created when you opt in' }, null, 2)));
|
|
48
|
+
});
|
|
49
|
+
return cmd;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,SAAS,IAAI,OAAO,CAkDnC;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import pkg from "../package.json" with { type: "json" };
|
|
3
|
-
import { createShowCommand, createDriftCommand, createDockCommand, createAhoyCommand, createDesignMdCommand, createSystemCommand, } from "./commands/index.js";
|
|
3
|
+
import { createShowCommand, createDriftCommand, createDockCommand, createAhoyCommand, createDesignMdCommand, createSystemCommand, createRescueCommand, } from "./commands/index.js";
|
|
4
4
|
export function createCli() {
|
|
5
5
|
const program = new Command();
|
|
6
6
|
program
|
|
@@ -14,6 +14,7 @@ export function createCli() {
|
|
|
14
14
|
.addHelpText("after", `
|
|
15
15
|
Command Groups:
|
|
16
16
|
View show (components, tokens, drift, health, history, config, skills, agents, context, hooks, commands, graph, plugins, all), system
|
|
17
|
+
Product Journey rescue (plan, apply, verify, guard, report, rollback)
|
|
17
18
|
Drift Actions drift (scan, check, fix, ignore)
|
|
18
19
|
Setup dock (config, skills, agents, context, hooks, commands, plugins, tokens, graph)
|
|
19
20
|
Cloud ahoy (login, logout, status, github, gitlab, billing, plans)
|
|
@@ -22,11 +23,14 @@ Command Groups:
|
|
|
22
23
|
Quick Start:
|
|
23
24
|
$ buoy show all # everything an AI agent needs
|
|
24
25
|
$ buoy show drift # design system violations
|
|
26
|
+
$ buoy rescue plan # baseline and safe repair plan
|
|
25
27
|
$ buoy dock # set up config, skills, agents, hooks
|
|
26
28
|
`);
|
|
27
29
|
// === View (read-only) ===
|
|
28
30
|
program.addCommand(createShowCommand());
|
|
29
31
|
program.addCommand(createSystemCommand());
|
|
32
|
+
// === Complete product journey ===
|
|
33
|
+
program.addCommand(createRescueCommand());
|
|
30
34
|
// === Drift Actions ===
|
|
31
35
|
program.addCommand(createDriftCommand());
|
|
32
36
|
// === Setup ===
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,kDAAkD,CAAC;SAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,aAAa,CAAC;QACb,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;KACpC,CAAC;SACD,WAAW,CACV,OAAO,EACP
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,kDAAkD,CAAC;SAC/D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;SACpB,aAAa,CAAC;QACb,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;KACpC,CAAC;SACD,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;CAcL,CACI,CAAC;IAEJ,2BAA2B;IAC3B,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,mCAAmC;IACnC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,wBAAwB;IACxB,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEzC,gBAAgB;IAChB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,gBAAgB;IAChB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,iBAAiB;IACjB,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mDAAmD;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RescueManifest } from "./types.js";
|
|
2
|
+
export declare function renderRescueMarkdown(manifest: RescueManifest): string;
|
|
3
|
+
export declare function renderRescueHtml(manifest: RescueManifest): string;
|
|
4
|
+
export declare function writeRescueReports(manifest: RescueManifest): Promise<{
|
|
5
|
+
json: string;
|
|
6
|
+
markdown: string;
|
|
7
|
+
html: string;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/rescue/report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAoBhE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAsDrE;AAWD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAsBjE;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAaD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { rescueRunDir } from "./store.js";
|
|
4
|
+
function summaryTable(before, after) {
|
|
5
|
+
const rows = [
|
|
6
|
+
["Total", before.total, after?.total],
|
|
7
|
+
["Critical", before.critical, after?.critical],
|
|
8
|
+
["Warning", before.warning, after?.warning],
|
|
9
|
+
["Info", before.info, after?.info],
|
|
10
|
+
];
|
|
11
|
+
return [
|
|
12
|
+
"| Finding | Before | After | Change |",
|
|
13
|
+
"| --- | ---: | ---: | ---: |",
|
|
14
|
+
...rows.map(([label, start, end]) => {
|
|
15
|
+
const afterValue = typeof end === "number" ? end : "—";
|
|
16
|
+
const delta = typeof end === "number" ? end - Number(start) : "—";
|
|
17
|
+
return `| ${label} | ${start} | ${afterValue} | ${typeof delta === "number" && delta > 0 ? "+" : ""}${delta} |`;
|
|
18
|
+
}),
|
|
19
|
+
].join("\n");
|
|
20
|
+
}
|
|
21
|
+
export function renderRescueMarkdown(manifest) {
|
|
22
|
+
const reviewRequired = manifest.findings.filter((finding) => finding.classification === "review-required").length;
|
|
23
|
+
const acceptedLegacy = manifest.findings.filter((finding) => finding.classification === "accepted-legacy").length;
|
|
24
|
+
const verification = manifest.verification;
|
|
25
|
+
const checks = verification?.commands.length
|
|
26
|
+
? verification.commands
|
|
27
|
+
.map((command) => `- ${command.passed ? "Passed" : "Failed"}: \`${command.command} ${command.args.join(" ")}\``)
|
|
28
|
+
.join("\n")
|
|
29
|
+
: "- No project test or typecheck scripts were detected; manual verification is required.";
|
|
30
|
+
return `# Buoy Rescue report
|
|
31
|
+
|
|
32
|
+
Run: \`${manifest.id}\`
|
|
33
|
+
Status: **${manifest.status}**
|
|
34
|
+
Generated: ${manifest.updatedAt}
|
|
35
|
+
|
|
36
|
+
## Outcome
|
|
37
|
+
|
|
38
|
+
${summaryTable(manifest.before.summary, manifest.after?.summary)}
|
|
39
|
+
|
|
40
|
+
- High-confidence fixes proposed: ${manifest.safeFixes.length}
|
|
41
|
+
- Fixes applied: ${manifest.appliedFixIds.length}
|
|
42
|
+
- Findings requiring review: ${reviewRequired}
|
|
43
|
+
- Findings already accepted as legacy: ${acceptedLegacy}
|
|
44
|
+
|
|
45
|
+
## Verification
|
|
46
|
+
|
|
47
|
+
${checks}
|
|
48
|
+
|
|
49
|
+
${manifest.status === "verification_failed"
|
|
50
|
+
? "Rescue restored every edited source file after the failed check. The branch and evidence remain for inspection."
|
|
51
|
+
: ""}
|
|
52
|
+
|
|
53
|
+
## Guardrail
|
|
54
|
+
|
|
55
|
+
${manifest.baseline
|
|
56
|
+
? `Remaining legacy drift was recorded at \`${manifest.baseline.path}\` with reason: ${manifest.baseline.reason}`
|
|
57
|
+
: 'No legacy baseline was created by this run. Use `buoy rescue guard --reason "…"` after reviewing the remaining findings.'}
|
|
58
|
+
|
|
59
|
+
## Safety and privacy
|
|
60
|
+
|
|
61
|
+
Buoy Rescue runs against local files. This run did not commit, push, merge, or upload source code. Ambiguous findings remain review-required, and backups are retained locally for rollback.
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
64
|
+
function escapeHtml(value) {
|
|
65
|
+
return value
|
|
66
|
+
.replaceAll("&", "&")
|
|
67
|
+
.replaceAll("<", "<")
|
|
68
|
+
.replaceAll(">", ">")
|
|
69
|
+
.replaceAll('"', """)
|
|
70
|
+
.replaceAll("'", "'");
|
|
71
|
+
}
|
|
72
|
+
export function renderRescueHtml(manifest) {
|
|
73
|
+
const markdown = renderRescueMarkdown(manifest);
|
|
74
|
+
const before = manifest.before.summary;
|
|
75
|
+
const after = manifest.after?.summary;
|
|
76
|
+
const cards = [
|
|
77
|
+
["Before", before.total],
|
|
78
|
+
["After", after?.total ?? "—"],
|
|
79
|
+
["Applied", manifest.appliedFixIds.length],
|
|
80
|
+
[
|
|
81
|
+
"Needs review",
|
|
82
|
+
manifest.findings.filter((item) => item.classification === "review-required").length,
|
|
83
|
+
],
|
|
84
|
+
];
|
|
85
|
+
return `<!doctype html>
|
|
86
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
87
|
+
<title>Buoy Rescue · ${escapeHtml(manifest.id)}</title>
|
|
88
|
+
<style>body{margin:0;background:#071827;color:#eaf6f8;font:16px/1.55 ui-sans-serif,system-ui,sans-serif}main{max-width:960px;margin:auto;padding:64px 24px}.eyebrow{color:#53d6df;font-weight:700}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;margin:32px 0}.card,pre{background:#0c2335;border:1px solid #244052;border-radius:14px;padding:20px}.value{font-size:32px;font-weight:800}pre{white-space:pre-wrap;color:#bfd0d8;overflow:auto}a{color:#53d6df}</style></head>
|
|
89
|
+
<body><main><p class="eyebrow">BUOY RESCUE</p><h1>Before-and-after implementation report</h1><p>Run ${escapeHtml(manifest.id)} · ${escapeHtml(manifest.status)}</p>
|
|
90
|
+
<section class="cards">${cards.map(([label, value]) => `<div class="card"><div>${escapeHtml(String(label))}</div><div class="value">${escapeHtml(String(value))}</div></div>`).join("")}</section>
|
|
91
|
+
<pre>${escapeHtml(markdown)}</pre></main></body></html>`;
|
|
92
|
+
}
|
|
93
|
+
export async function writeRescueReports(manifest) {
|
|
94
|
+
const dir = rescueRunDir(manifest.projectRoot, manifest.id);
|
|
95
|
+
const paths = {
|
|
96
|
+
json: join(dir, "report.json"),
|
|
97
|
+
markdown: join(dir, "report.md"),
|
|
98
|
+
html: join(dir, "report.html"),
|
|
99
|
+
};
|
|
100
|
+
await Promise.all([
|
|
101
|
+
writeFile(paths.json, JSON.stringify(manifest, null, 2), "utf8"),
|
|
102
|
+
writeFile(paths.markdown, renderRescueMarkdown(manifest), "utf8"),
|
|
103
|
+
writeFile(paths.html, renderRescueHtml(manifest), "utf8"),
|
|
104
|
+
]);
|
|
105
|
+
return paths;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/rescue/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,SAAS,YAAY,CAAC,MAAqB,EAAE,KAAqB;IAChE,MAAM,IAAI,GAAG;QACX,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACrC,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;QAC9C,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;QAC3C,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;KACnC,CAAC;IACF,OAAO;QACL,uCAAuC;QACvC,8BAA8B;QAC9B,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAClE,OAAO,KAAK,KAAK,MAAM,KAAK,MAAM,UAAU,MAAM,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;QAClH,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAwB;IAC3D,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC7C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,KAAK,iBAAiB,CAC1D,CAAC,MAAM,CAAC;IACT,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC7C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,KAAK,iBAAiB,CAC1D,CAAC,MAAM,CAAC;IACT,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC1C,CAAC,CAAC,YAAY,CAAC,QAAQ;aAClB,GAAG,CACF,CAAC,OAAO,EAAE,EAAE,CACV,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAChG;aACA,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,wFAAwF,CAAC;IAE7F,OAAO;;SAEA,QAAQ,CAAC,EAAE;YACR,QAAQ,CAAC,MAAM;aACd,QAAQ,CAAC,SAAS;;;;EAI7B,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;;oCAE5B,QAAQ,CAAC,SAAS,CAAC,MAAM;mBAC1C,QAAQ,CAAC,aAAa,CAAC,MAAM;+BACjB,cAAc;yCACJ,cAAc;;;;EAIrD,MAAM;;EAGN,QAAQ,CAAC,MAAM,KAAK,qBAAqB;QACvC,CAAC,CAAC,iHAAiH;QACnH,CAAC,CAAC,EACN;;;;EAKE,QAAQ,CAAC,QAAQ;QACf,CAAC,CAAC,4CAA4C,QAAQ,CAAC,QAAQ,CAAC,IAAI,mBAAmB,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE;QACjH,CAAC,CAAC,0HACN;;;;;CAKC,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAwB;IACvD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACtC,MAAM,KAAK,GAAG;QACZ,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;QACxB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC;QAC9B,CAAC,SAAS,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QAC1C;YACE,cAAc;YACd,QAAQ,CAAC,QAAQ,CAAC,MAAM,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,iBAAiB,CACpD,CAAC,MAAM;SACT;KACF,CAAC;IACF,OAAO;;uBAEc,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;;sGAEwD,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;yBACrI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,0BAA0B,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,4BAA4B,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;OAChL,UAAU,CAAC,QAAQ,CAAC,6BAA6B,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAwB;IAK/D,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;QAC9B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;KAC/B,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAChE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QACjE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;KAC1D,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RescueManifest } from "./types.js";
|
|
2
|
+
export declare function rescueRoot(projectRoot: string): string;
|
|
3
|
+
export declare function rescueRunDir(projectRoot: string, runId: string): string;
|
|
4
|
+
export declare function rescueManifestPath(projectRoot: string, runId: string): string;
|
|
5
|
+
export declare function saveRescueManifest(manifest: RescueManifest): Promise<void>;
|
|
6
|
+
export declare function resolveRunId(projectRoot: string, requested?: string): Promise<string>;
|
|
7
|
+
export declare function loadRescueManifest(projectRoot: string, requested?: string): Promise<RescueManifest>;
|
|
8
|
+
export declare function createRunId(now?: Date): string;
|
|
9
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/rescue/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAMD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED,wBAAgB,WAAW,CAAC,GAAG,OAAa,GAAG,MAAM,CAMpD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export function rescueRoot(projectRoot) {
|
|
5
|
+
return join(projectRoot, ".buoy", "rescue");
|
|
6
|
+
}
|
|
7
|
+
export function rescueRunDir(projectRoot, runId) {
|
|
8
|
+
return join(rescueRoot(projectRoot), "runs", runId);
|
|
9
|
+
}
|
|
10
|
+
export function rescueManifestPath(projectRoot, runId) {
|
|
11
|
+
return join(rescueRunDir(projectRoot, runId), "manifest.json");
|
|
12
|
+
}
|
|
13
|
+
function latestPath(projectRoot) {
|
|
14
|
+
return join(rescueRoot(projectRoot), "latest.json");
|
|
15
|
+
}
|
|
16
|
+
export async function saveRescueManifest(manifest) {
|
|
17
|
+
const runDir = rescueRunDir(manifest.projectRoot, manifest.id);
|
|
18
|
+
await mkdir(runDir, { recursive: true });
|
|
19
|
+
manifest.updatedAt = new Date().toISOString();
|
|
20
|
+
await writeFile(rescueManifestPath(manifest.projectRoot, manifest.id), JSON.stringify(manifest, null, 2), "utf8");
|
|
21
|
+
await mkdir(rescueRoot(manifest.projectRoot), { recursive: true });
|
|
22
|
+
await writeFile(latestPath(manifest.projectRoot), JSON.stringify({ runId: manifest.id }, null, 2), "utf8");
|
|
23
|
+
}
|
|
24
|
+
export async function resolveRunId(projectRoot, requested) {
|
|
25
|
+
if (requested)
|
|
26
|
+
return requested;
|
|
27
|
+
const path = latestPath(projectRoot);
|
|
28
|
+
if (!existsSync(path)) {
|
|
29
|
+
throw new Error("No Rescue run found. Start with `buoy rescue plan`.");
|
|
30
|
+
}
|
|
31
|
+
const latest = JSON.parse(await readFile(path, "utf8"));
|
|
32
|
+
if (!latest.runId)
|
|
33
|
+
throw new Error("The latest Rescue run pointer is invalid.");
|
|
34
|
+
return latest.runId;
|
|
35
|
+
}
|
|
36
|
+
export async function loadRescueManifest(projectRoot, requested) {
|
|
37
|
+
const runId = await resolveRunId(projectRoot, requested);
|
|
38
|
+
const path = rescueManifestPath(projectRoot, runId);
|
|
39
|
+
if (!existsSync(path))
|
|
40
|
+
throw new Error(`Rescue run not found: ${runId}`);
|
|
41
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
42
|
+
}
|
|
43
|
+
export function createRunId(now = new Date()) {
|
|
44
|
+
const stamp = now
|
|
45
|
+
.toISOString()
|
|
46
|
+
.replace(/[-:]/g, "")
|
|
47
|
+
.replace(/\.\d{3}Z$/, "Z");
|
|
48
|
+
return `rescue-${stamp}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/rescue/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|