@horizon36596/zenith-cli 0.1.1
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/NOTICE +18 -0
- package/README.md +207 -0
- package/dist/autoLoad.d.ts +54 -0
- package/dist/autoLoad.d.ts.map +1 -0
- package/dist/autoLoad.js +139 -0
- package/dist/autoLoad.js.map +1 -0
- package/dist/calibrateFit.d.ts +38 -0
- package/dist/calibrateFit.d.ts.map +1 -0
- package/dist/calibrateFit.js +69 -0
- package/dist/calibrateFit.js.map +1 -0
- package/dist/commandLibrary.d.ts +19 -0
- package/dist/commandLibrary.d.ts.map +1 -0
- package/dist/commandLibrary.js +27 -0
- package/dist/commandLibrary.js.map +1 -0
- package/dist/commands/calibrate.d.ts +18 -0
- package/dist/commands/calibrate.d.ts.map +1 -0
- package/dist/commands/calibrate.js +116 -0
- package/dist/commands/calibrate.js.map +1 -0
- package/dist/commands/codegen.d.ts +12 -0
- package/dist/commands/codegen.d.ts.map +1 -0
- package/dist/commands/codegen.js +63 -0
- package/dist/commands/codegen.js.map +1 -0
- package/dist/commands/deploy.d.ts +63 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +181 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/diff.d.ts +11 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +68 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/estimate.d.ts +9 -0
- package/dist/commands/estimate.d.ts.map +1 -0
- package/dist/commands/estimate.js +81 -0
- package/dist/commands/estimate.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +67 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/new.d.ts +10 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +28 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/propose.d.ts +15 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +67 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/render.d.ts +16 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +90 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/commands/sim.d.ts +31 -0
- package/dist/commands/sim.d.ts.map +1 -0
- package/dist/commands/sim.js +213 -0
- package/dist/commands/sim.js.map +1 -0
- package/dist/commands/validate.d.ts +19 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +97 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/coreGate.d.ts +19 -0
- package/dist/coreGate.d.ts.map +1 -0
- package/dist/coreGate.js +23 -0
- package/dist/coreGate.js.map +1 -0
- package/dist/fieldImage.d.ts +19 -0
- package/dist/fieldImage.d.ts.map +1 -0
- package/dist/fieldImage.js +63 -0
- package/dist/fieldImage.js.map +1 -0
- package/dist/findings.d.ts +20 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +57 -0
- package/dist/findings.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +194 -0
- package/dist/index.js.map +1 -0
- package/dist/javaCodegen.d.ts +44 -0
- package/dist/javaCodegen.d.ts.map +1 -0
- package/dist/javaCodegen.js +537 -0
- package/dist/javaCodegen.js.map +1 -0
- package/dist/launcher.d.ts +39 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +153 -0
- package/dist/launcher.js.map +1 -0
- package/dist/lib.d.ts +13 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +13 -0
- package/dist/lib.js.map +1 -0
- package/dist/project.d.ts +33 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +104 -0
- package/dist/project.js.map +1 -0
- package/dist/skeletons.d.ts +16 -0
- package/dist/skeletons.d.ts.map +1 -0
- package/dist/skeletons.js +120 -0
- package/dist/skeletons.js.map +1 -0
- package/dist/traceReport.d.ts +75 -0
- package/dist/traceReport.d.ts.map +1 -0
- package/dist/traceReport.js +91 -0
- package/dist/traceReport.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { relative } from "node:path";
|
|
2
|
+
import { estimate as coreEstimate, hasErrors } from "@horizon36596/zenith-core";
|
|
3
|
+
import { loadAutoAndPlan, resolveAutoPath } from "../autoLoad.js";
|
|
4
|
+
import { CORE_NOT_LANDED_EXIT_CODE, tryCore } from "../coreGate.js";
|
|
5
|
+
import { formatFindingsTable } from "../findings.js";
|
|
6
|
+
import { loadProject } from "../project.js";
|
|
7
|
+
const slash = (path) => path.split("\\").join("/");
|
|
8
|
+
const pad = (text, width) => (text.length >= width ? text : text + " ".repeat(width - text.length));
|
|
9
|
+
function range(nominalS, lowS, highS) {
|
|
10
|
+
if (nominalS === null)
|
|
11
|
+
return "unknown";
|
|
12
|
+
if (lowS === null || highS === null)
|
|
13
|
+
return nominalS.toFixed(2);
|
|
14
|
+
return `${nominalS.toFixed(2)} (${lowS.toFixed(2)}–${highS.toFixed(2)})`;
|
|
15
|
+
}
|
|
16
|
+
function formatTable(estimateResult, periodS) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
const idWidth = Math.max(2, ...estimateResult.steps.map((step) => step.stepId.length));
|
|
19
|
+
lines.push(`${pad("step", idWidth)} nominal (low–high) s strafe unknown`);
|
|
20
|
+
for (const step of estimateResult.steps) {
|
|
21
|
+
const unknown = step.nominalS === null ? "yes" : "";
|
|
22
|
+
const strafe = step.strafeFraction === null ? "–" : `${(step.strafeFraction * 100).toFixed(0)} %`;
|
|
23
|
+
lines.push(`${pad(step.stepId, idWidth)} ${pad(range(step.nominalS, step.lowS, step.highS), 22)} ${pad(strafe, 6)} ${unknown}`);
|
|
24
|
+
}
|
|
25
|
+
const total = `${range(estimateResult.nominalS, estimateResult.lowS, estimateResult.highS)}${estimateResult.hasUnknown ? "+" : ""}`;
|
|
26
|
+
lines.push(periodS === undefined ? `total: ${total}` : `total: ${total} of ${String(periodS)} s`);
|
|
27
|
+
return lines.join("\n");
|
|
28
|
+
}
|
|
29
|
+
/** `zenith estimate <auto> [--json] [--explain]`: the per-step time table of `03` section 3. */
|
|
30
|
+
export function runEstimate(autoArg, options) {
|
|
31
|
+
const cwd = options.cwd ?? process.cwd();
|
|
32
|
+
const project = loadProject(cwd, options.project, autoArg);
|
|
33
|
+
const path = resolveAutoPath(cwd, project, autoArg);
|
|
34
|
+
const relPath = slash(relative(project.root, path));
|
|
35
|
+
const result = loadAutoAndPlan(path, project);
|
|
36
|
+
const findings = result.ok ? result.loaded.findings : result.findings;
|
|
37
|
+
if (!result.ok || hasErrors(findings)) {
|
|
38
|
+
const files = [{ path: relPath, findings }];
|
|
39
|
+
if (options.json === true) {
|
|
40
|
+
process.stdout.write(`${JSON.stringify({ project: slash(project.root), files, errors: findings.length }, null, 2)}\n`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
process.stdout.write(`${formatFindingsTable(files)}\n`);
|
|
44
|
+
}
|
|
45
|
+
return 1;
|
|
46
|
+
}
|
|
47
|
+
const outcome = tryCore(() => coreEstimate(result.loaded.plan, result.loaded.robot));
|
|
48
|
+
if (!outcome.ok) {
|
|
49
|
+
if (options.json === true) {
|
|
50
|
+
process.stdout.write(`${JSON.stringify({ error: outcome.message }, null, 2)}\n`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
process.stderr.write(`${outcome.message}\n`);
|
|
54
|
+
}
|
|
55
|
+
return CORE_NOT_LANDED_EXIT_CODE;
|
|
56
|
+
}
|
|
57
|
+
const periodS = result.loaded.field.periods?.autoS;
|
|
58
|
+
const seasonWarnings = result.loaded.seasonWarnings;
|
|
59
|
+
if (options.json === true) {
|
|
60
|
+
process.stdout.write(`${JSON.stringify({
|
|
61
|
+
project: slash(project.root),
|
|
62
|
+
auto: relPath,
|
|
63
|
+
periodS: periodS ?? null,
|
|
64
|
+
estimate: outcome.value,
|
|
65
|
+
assumptions: options.explain === true ? outcome.value.assumptions : undefined,
|
|
66
|
+
seasonWarnings,
|
|
67
|
+
}, null, 2)}\n`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
for (const warning of seasonWarnings)
|
|
71
|
+
process.stderr.write(`warning: ${relPath}: ${warning}\n`);
|
|
72
|
+
process.stdout.write(`${formatTable(outcome.value, periodS)}\n`);
|
|
73
|
+
if (options.explain === true) {
|
|
74
|
+
process.stdout.write("\nassumptions:\n");
|
|
75
|
+
for (const line of outcome.value.assumptions)
|
|
76
|
+
process.stdout.write(` - ${line}\n`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estimate.js","sourceRoot":"","sources":["../../src/commands/estimate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
force?: boolean;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
/** `--command-library`: written to `deploy.commandLibrary`. Left out of the file when not given. */
|
|
6
|
+
commandLibrary?: string;
|
|
7
|
+
}
|
|
8
|
+
/** `zenith init`: writes zenith.json and an autos directory that validates. */
|
|
9
|
+
export declare function runInit(options: InitOptions): number;
|
|
10
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA8BD,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAuCpD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { basename, dirname, join, resolve as resolvePath } from "node:path";
|
|
4
|
+
import { LIBRARIES } from "../commandLibrary.js";
|
|
5
|
+
import { LINK_FILE, ProjectError } from "../project.js";
|
|
6
|
+
import { linkSkeleton, robotSkeleton, waypointsSkeleton } from "../skeletons.js";
|
|
7
|
+
function write(root, relative, contents, force) {
|
|
8
|
+
const full = join(root, relative);
|
|
9
|
+
if (existsSync(full) && !force)
|
|
10
|
+
return { path: relative, status: "kept" };
|
|
11
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
12
|
+
writeFileSync(full, contents, "utf8");
|
|
13
|
+
return { path: relative, status: "written" };
|
|
14
|
+
}
|
|
15
|
+
/** Copies the season's field file out of `@horizon36596/zenith-season-biobuzz` when it can be resolved. */
|
|
16
|
+
function copySeasonField(root, relative, force) {
|
|
17
|
+
const full = join(root, relative);
|
|
18
|
+
if (existsSync(full) && !force)
|
|
19
|
+
return { path: relative, status: "kept" };
|
|
20
|
+
try {
|
|
21
|
+
const require = createRequire(import.meta.url);
|
|
22
|
+
const source = require.resolve("@horizon36596/zenith-season-biobuzz/field/biobuzz.field.json");
|
|
23
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
24
|
+
copyFileSync(source, full);
|
|
25
|
+
return { path: relative, status: "written" };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** `zenith init`: writes zenith.json and an autos directory that validates. */
|
|
32
|
+
export function runInit(options) {
|
|
33
|
+
const root = resolvePath(options.cwd ?? process.cwd());
|
|
34
|
+
const force = options.force === true;
|
|
35
|
+
// Any case is accepted on the command line (`--command-library Ivy`); the file always gets the
|
|
36
|
+
// lowercase name, which is the only form the schema accepts.
|
|
37
|
+
const commandLibrary = options.commandLibrary?.toLowerCase();
|
|
38
|
+
if (commandLibrary !== undefined && !LIBRARIES.includes(commandLibrary)) {
|
|
39
|
+
throw new ProjectError(`--command-library must be "solverslib" or "ivy", not ${JSON.stringify(options.commandLibrary)}.`);
|
|
40
|
+
}
|
|
41
|
+
const library = commandLibrary;
|
|
42
|
+
const written = [
|
|
43
|
+
write(root, LINK_FILE, linkSkeleton(library), force),
|
|
44
|
+
write(root, "autos/robot.json", robotSkeleton(basename(root)), force),
|
|
45
|
+
write(root, "autos/waypoints.json", waypointsSkeleton(), force),
|
|
46
|
+
];
|
|
47
|
+
const season = copySeasonField(root, "autos/field/biobuzz.field.json", force);
|
|
48
|
+
if (season !== null)
|
|
49
|
+
written.push(season);
|
|
50
|
+
if (options.json === true) {
|
|
51
|
+
process.stdout.write(`${JSON.stringify({ root, commandLibrary: library ?? null, written }, null, 2)}\n`);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
for (const file of written)
|
|
55
|
+
process.stdout.write(`${file.status}: ${file.path}\n`);
|
|
56
|
+
if (season === null) {
|
|
57
|
+
process.stdout.write("note: no season field file was copied. Put one at autos/field/biobuzz.field.json.\n");
|
|
58
|
+
}
|
|
59
|
+
if (library === undefined) {
|
|
60
|
+
process.stdout.write('note: zenith.json names no command library yet. Add "commandLibrary": "solverslib" or "commandLibrary": "ivy" ' +
|
|
61
|
+
'to its "deploy" section, or re-run with --command-library, before Zenith writes Java: zenith codegen, ' +
|
|
62
|
+
'or zenith deploy once zenith.json has a "codegen" section.\n');
|
|
63
|
+
}
|
|
64
|
+
process.stdout.write('Next: "zenith new <name>", then "zenith validate autos/<name>.auto.json".\n');
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface NewOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
alliance?: string;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
force?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** `zenith new <name>`: writes a canonical skeleton into the project's autos directory. */
|
|
9
|
+
export declare function runNew(name: string, options: NewOptions): number;
|
|
10
|
+
//# sourceMappingURL=new.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,2FAA2F;AAC3F,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAoBhE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve as resolvePath } from "node:path";
|
|
3
|
+
import { mirrorForField } from "@horizon36596/zenith-core";
|
|
4
|
+
import { findProjectRoot, loadProject, ProjectError } from "../project.js";
|
|
5
|
+
import { autoSkeleton } from "../skeletons.js";
|
|
6
|
+
/** `zenith new <name>`: writes a canonical skeleton into the project's autos directory. */
|
|
7
|
+
export function runNew(name, options) {
|
|
8
|
+
const cwd = options.cwd ?? process.cwd();
|
|
9
|
+
const project = loadProject(cwd, options.project);
|
|
10
|
+
const root = options.project === undefined ? (findProjectRoot(cwd) ?? cwd) : resolvePath(options.project);
|
|
11
|
+
const alliance = (options.alliance ?? "RED").toUpperCase();
|
|
12
|
+
if (alliance !== "RED" && alliance !== "BLUE") {
|
|
13
|
+
throw new ProjectError(`--alliance must be RED or BLUE, not ${JSON.stringify(alliance)}.`);
|
|
14
|
+
}
|
|
15
|
+
const relative = `${project.link.autosDir}/${name}.auto.json`;
|
|
16
|
+
const full = join(root, relative);
|
|
17
|
+
if (existsSync(full) && options.force !== true) {
|
|
18
|
+
throw new ProjectError(`${relative} already exists. Pass --force to overwrite it.`);
|
|
19
|
+
}
|
|
20
|
+
mkdirSync(dirname(full), { recursive: true });
|
|
21
|
+
writeFileSync(full, autoSkeleton(name, alliance, mirrorForField(project.field)), "utf8");
|
|
22
|
+
if (options.json === true)
|
|
23
|
+
process.stdout.write(`${JSON.stringify({ written: relative }, null, 2)}\n`);
|
|
24
|
+
else
|
|
25
|
+
process.stdout.write(`written: ${relative}\n`);
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,2FAA2F;AAC3F,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,OAAmB;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC9C,MAAM,IAAI,YAAY,CAAC,uCAAuC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,YAAY,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC/C,MAAM,IAAI,YAAY,CAAC,GAAG,QAAQ,gDAAgD,CAAC,CAAC;IACtF,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzF,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;;QAClG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ProposeOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
base?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* `zenith propose <auto> [--dry-run]`: the CLI half of site/docs/github.md. The GitHub half (a work
|
|
10
|
+
* branch, a commit, an actual pull request) is another agent's (`packages/github`); today only
|
|
11
|
+
* `--dry-run` is implemented, exactly as section 5 describes for an agent that may not push:
|
|
12
|
+
* validate, render, print the PR body for a human to paste.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runPropose(autoArg: string, options: ProposeOptions): number;
|
|
15
|
+
//# sourceMappingURL=propose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAyD3E"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { estimate as coreEstimate, hasErrors, ledger as coreLedger, prBody, render as coreRender } from "@horizon36596/zenith-core";
|
|
4
|
+
import { resolveSeason } from "@horizon36596/zenith-seasons";
|
|
5
|
+
import { loadAutoAndPlan, resolveAutoPath } from "../autoLoad.js";
|
|
6
|
+
import { tryCore } from "../coreGate.js";
|
|
7
|
+
import { formatFindingsTable } from "../findings.js";
|
|
8
|
+
import { confinePath, loadProject } from "../project.js";
|
|
9
|
+
const slash = (path) => path.split("\\").join("/");
|
|
10
|
+
/**
|
|
11
|
+
* `zenith propose <auto> [--dry-run]`: the CLI half of site/docs/github.md. The GitHub half (a work
|
|
12
|
+
* branch, a commit, an actual pull request) is another agent's (`packages/github`); today only
|
|
13
|
+
* `--dry-run` is implemented, exactly as section 5 describes for an agent that may not push:
|
|
14
|
+
* validate, render, print the PR body for a human to paste.
|
|
15
|
+
*/
|
|
16
|
+
export function runPropose(autoArg, options) {
|
|
17
|
+
if (options.dryRun !== true) {
|
|
18
|
+
process.stderr.write("GitHub mode: use the web app or pass --dry-run.\n");
|
|
19
|
+
return 2;
|
|
20
|
+
}
|
|
21
|
+
const cwd = options.cwd ?? process.cwd();
|
|
22
|
+
const project = loadProject(cwd, options.project, autoArg);
|
|
23
|
+
const path = resolveAutoPath(cwd, project, autoArg);
|
|
24
|
+
const result = loadAutoAndPlan(path, project);
|
|
25
|
+
const findings = result.ok ? result.loaded.findings : result.findings;
|
|
26
|
+
if (!result.ok || hasErrors(findings)) {
|
|
27
|
+
const files = [{ path: autoArg, findings }];
|
|
28
|
+
if (options.json === true)
|
|
29
|
+
process.stdout.write(`${JSON.stringify({ files }, null, 2)}\n`);
|
|
30
|
+
else
|
|
31
|
+
process.stdout.write(`${formatFindingsTable(files)}\n`);
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
const { auto, plan, robot, field, seasonWarnings } = result.loaded;
|
|
35
|
+
const estimateOutcome = tryCore(() => coreEstimate(plan, robot));
|
|
36
|
+
const ledgerOutcome = tryCore(() => coreLedger(plan, field, resolveSeason(field).rules));
|
|
37
|
+
const renderOutcome = tryCore(() => coreRender(plan, estimateOutcome.ok ? estimateOutcome.value : null, findings, ledgerOutcome.ok ? ledgerOutcome.value : [], {}));
|
|
38
|
+
if (!renderOutcome.ok) {
|
|
39
|
+
const message = [renderOutcome.message, !estimateOutcome.ok ? estimateOutcome.message : null, !ledgerOutcome.ok ? ledgerOutcome.message : null]
|
|
40
|
+
.filter((line) => line !== null)
|
|
41
|
+
.join("\n");
|
|
42
|
+
if (options.json === true)
|
|
43
|
+
process.stdout.write(`${JSON.stringify({ error: message }, null, 2)}\n`);
|
|
44
|
+
else
|
|
45
|
+
process.stderr.write(`${message}\n`);
|
|
46
|
+
return 2;
|
|
47
|
+
}
|
|
48
|
+
const renderRelative = `${project.link.autosDir}/.renders/${auto.name}.svg`;
|
|
49
|
+
const renderFull = confinePath(project.root, renderRelative);
|
|
50
|
+
mkdirSync(dirname(renderFull), { recursive: true });
|
|
51
|
+
writeFileSync(renderFull, renderOutcome.value, "utf8");
|
|
52
|
+
// No commit has happened in --dry-run mode, so there is no raw GitHub URL to point at (that is
|
|
53
|
+
// packages/github's propose() once GitHub mode lands); the local render path is the closest
|
|
54
|
+
// useful thing to show a human in the meantime, passed straight in rather than substituted after
|
|
55
|
+
// the fact.
|
|
56
|
+
const body = prBody(auto, estimateOutcome.ok ? estimateOutcome.value : null, findings, ledgerOutcome.ok ? ledgerOutcome.value : [], { periodS: field.periods?.autoS, renderUrl: slash(renderRelative) });
|
|
57
|
+
if (options.json === true) {
|
|
58
|
+
process.stdout.write(`${JSON.stringify({ render: renderRelative, body, seasonWarnings }, null, 2)}\n`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
for (const warning of seasonWarnings)
|
|
62
|
+
process.stderr.write(`warning: ${autoArg}: ${warning}\n`);
|
|
63
|
+
process.stdout.write(`${body}\n`);
|
|
64
|
+
}
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=propose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface RenderCommandOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
svg?: string;
|
|
6
|
+
png?: string;
|
|
7
|
+
alliance?: string;
|
|
8
|
+
base?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* `zenith render <auto> --svg <out> | --png <out> [--alliance BLUE] [--base <otherAuto>]`.
|
|
12
|
+
* `--png` shells out to `@resvg/resvg-js`, a CLI-only dependency (`core` stays DOM-free); it is
|
|
13
|
+
* imported lazily so `--svg` never needs it installed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runRender(autoArg: string, options: RenderCommandOptions): Promise<number>;
|
|
16
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6E/F"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
3
|
+
import { estimate as coreEstimate, ledger as coreLedger, render as coreRender, } from "@horizon36596/zenith-core";
|
|
4
|
+
import { resolveSeason } from "@horizon36596/zenith-seasons";
|
|
5
|
+
import { loadAutoAndPlan, resolveAutoPath } from "../autoLoad.js";
|
|
6
|
+
import { CORE_NOT_LANDED_EXIT_CODE, tryCore } from "../coreGate.js";
|
|
7
|
+
import { fieldImageFor } from "../fieldImage.js";
|
|
8
|
+
import { formatFindingsTable } from "../findings.js";
|
|
9
|
+
import { loadProject, ProjectError } from "../project.js";
|
|
10
|
+
/**
|
|
11
|
+
* `zenith render <auto> --svg <out> | --png <out> [--alliance BLUE] [--base <otherAuto>]`.
|
|
12
|
+
* `--png` shells out to `@resvg/resvg-js`, a CLI-only dependency (`core` stays DOM-free); it is
|
|
13
|
+
* imported lazily so `--svg` never needs it installed.
|
|
14
|
+
*/
|
|
15
|
+
export async function runRender(autoArg, options) {
|
|
16
|
+
if (options.svg === undefined && options.png === undefined) {
|
|
17
|
+
throw new ProjectError("zenith render needs --svg <out> or --png <out>.");
|
|
18
|
+
}
|
|
19
|
+
const cwd = options.cwd ?? process.cwd();
|
|
20
|
+
const project = loadProject(cwd, options.project, autoArg);
|
|
21
|
+
const path = resolveAutoPath(cwd, project, autoArg);
|
|
22
|
+
const result = loadAutoAndPlan(path, project);
|
|
23
|
+
if (!result.ok) {
|
|
24
|
+
const files = [{ path: autoArg, findings: result.findings }];
|
|
25
|
+
process.stdout.write(options.json === true ? `${JSON.stringify({ files }, null, 2)}\n` : `${formatFindingsTable(files)}\n`);
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
const { plan, robot, field, findings, seasonWarnings } = result.loaded;
|
|
29
|
+
let alliance;
|
|
30
|
+
if (options.alliance !== undefined) {
|
|
31
|
+
const upper = options.alliance.toUpperCase();
|
|
32
|
+
if (upper !== "RED" && upper !== "BLUE") {
|
|
33
|
+
throw new ProjectError(`--alliance must be RED or BLUE, not ${JSON.stringify(options.alliance)}.`);
|
|
34
|
+
}
|
|
35
|
+
alliance = upper;
|
|
36
|
+
}
|
|
37
|
+
if (options.base !== undefined) {
|
|
38
|
+
const basePath = resolveAutoPath(cwd, project, options.base);
|
|
39
|
+
const baseResult = loadAutoAndPlan(basePath, project);
|
|
40
|
+
if (!baseResult.ok) {
|
|
41
|
+
process.stderr.write(`--base ${options.base} did not load: ${baseResult.findings[0]?.message ?? "unknown error"}\n`);
|
|
42
|
+
return 2;
|
|
43
|
+
}
|
|
44
|
+
// core.render's current signature (packages/core/src/types.ts RenderOptions) has no field for a
|
|
45
|
+
// second plan to ghost. The auto still has to load cleanly - that much is worth checking now -
|
|
46
|
+
// but the overlay itself waits on that option landing with the rest of M1.
|
|
47
|
+
process.stderr.write("note: --base loaded but core.render does not yet support a base overlay (pending M1).\n");
|
|
48
|
+
}
|
|
49
|
+
const estimateOutcome = tryCore(() => coreEstimate(plan, robot));
|
|
50
|
+
const estimateValue = estimateOutcome.ok ? estimateOutcome.value : null;
|
|
51
|
+
const ledgerOutcome = tryCore(() => coreLedger(plan, field, resolveSeason(field).rules));
|
|
52
|
+
const ledgerValue = ledgerOutcome.ok ? ledgerOutcome.value : [];
|
|
53
|
+
const fieldImage = fieldImageFor(project, field, plan.auto.field ?? project.link.field);
|
|
54
|
+
const renderOptions = {
|
|
55
|
+
...(alliance === undefined ? {} : { alliance }),
|
|
56
|
+
...(fieldImage === undefined ? {} : { fieldImage }),
|
|
57
|
+
};
|
|
58
|
+
const renderOutcome = tryCore(() => coreRender(plan, estimateValue, findings, ledgerValue, renderOptions));
|
|
59
|
+
if (!renderOutcome.ok) {
|
|
60
|
+
if (options.json === true)
|
|
61
|
+
process.stdout.write(`${JSON.stringify({ error: renderOutcome.message }, null, 2)}\n`);
|
|
62
|
+
else
|
|
63
|
+
process.stderr.write(`${renderOutcome.message}\n`);
|
|
64
|
+
return CORE_NOT_LANDED_EXIT_CODE;
|
|
65
|
+
}
|
|
66
|
+
const svgText = renderOutcome.value;
|
|
67
|
+
const written = [];
|
|
68
|
+
const outPath = (relativeOrAbsolute) => isAbsolute(relativeOrAbsolute) ? relativeOrAbsolute : resolvePath(cwd, relativeOrAbsolute);
|
|
69
|
+
if (options.svg !== undefined) {
|
|
70
|
+
writeFileSync(outPath(options.svg), svgText, "utf8");
|
|
71
|
+
written.push({ path: options.svg, kind: "svg" });
|
|
72
|
+
}
|
|
73
|
+
if (options.png !== undefined) {
|
|
74
|
+
const { Resvg } = await import("@resvg/resvg-js");
|
|
75
|
+
const png = new Resvg(svgText, { font: { loadSystemFonts: true } }).render().asPng();
|
|
76
|
+
writeFileSync(outPath(options.png), png);
|
|
77
|
+
written.push({ path: options.png, kind: "png" });
|
|
78
|
+
}
|
|
79
|
+
if (options.json === true) {
|
|
80
|
+
process.stdout.write(`${JSON.stringify({ written, findings, seasonWarnings }, null, 2)}\n`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
for (const warning of seasonWarnings)
|
|
84
|
+
process.stderr.write(`warning: ${autoArg}: ${warning}\n`);
|
|
85
|
+
for (const file of written)
|
|
86
|
+
process.stdout.write(`written: ${file.path}\n`);
|
|
87
|
+
}
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { type Platform } from "../launcher.js";
|
|
3
|
+
/**
|
|
4
|
+
* Splits a command line into argv words the way a POSIX shell would, without ever handing the
|
|
5
|
+
* string to a shell: single quotes are fully literal, double quotes allow `\"`, `\\`, `` \` `` and
|
|
6
|
+
* `\$` to escape, and an unquoted backslash escapes the next character. `sim.command` in
|
|
7
|
+
* `zenith.json` is the team's own string (not attacker input), so this only needs to parse it the
|
|
8
|
+
* way a person reading it would, not defend against a hostile one; the actual security boundary is
|
|
9
|
+
* that `{auto}` is substituted in only after `auto.name` has already been validated against
|
|
10
|
+
* `AUTO_NAME_PATTERN`, so no token it lands in can ever contain a quote, space or shell
|
|
11
|
+
* metacharacter, and the whole argv array is then spawned with `shell: false`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function splitShellWords(command: string): string[];
|
|
14
|
+
export interface SimCommandOptions {
|
|
15
|
+
cwd?: string;
|
|
16
|
+
project?: string;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
open?: boolean;
|
|
19
|
+
/** Seconds. The sim command is killed if it runs longer than this. */
|
|
20
|
+
timeout?: number;
|
|
21
|
+
/** Test seam: replaces `node:child_process.spawn`. */
|
|
22
|
+
spawnFn?: typeof spawn;
|
|
23
|
+
/** Test seam: the host the launcher resolves the command for (`launcher.ts`). */
|
|
24
|
+
host?: Platform;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* `zenith sim <auto> [--open] [--timeout <s>]`: runs `zenith.json.sim.command`, reads the trace it
|
|
28
|
+
* writes, and prints estimate vs actual per step (site/docs/simulation.md).
|
|
29
|
+
*/
|
|
30
|
+
export declare function runSim(autoArg: string, options: SimCommandOptions): Promise<number>;
|
|
31
|
+
//# sourceMappingURL=sim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sim.d.ts","sourceRoot":"","sources":["../../src/commands/sim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAQ9D,OAAO,EAAiC,KAAK,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAI9F;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAuDzD;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,iFAAiF;IACjF,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAqED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8EzF"}
|