@senpi/runtime 3.0.9-dev.20260710204324 → 3.0.9-dev.feat-strategy-compos.20260716013009
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/dist/cli/composer-commands.d.ts +37 -0
- package/dist/cli/composer-commands.d.ts.map +1 -0
- package/dist/cli/composer-commands.js +287 -0
- package/dist/cli/composer-commands.js.map +1 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +2 -0
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/cli/validate-runtime-config.mjs +124 -0
- package/dist/composer/AUTHORING.md +233 -0
- package/dist/composer/__init__.py +29 -0
- package/dist/composer/authoring/__init__.py +49 -0
- package/dist/composer/authoring/answers.py +226 -0
- package/dist/composer/authoring/archetypes/__init__.py +25 -0
- package/dist/composer/authoring/archetypes/_common.py +218 -0
- package/dist/composer/authoring/archetypes/classifier.py +109 -0
- package/dist/composer/authoring/archetypes/skeleton.py +54 -0
- package/dist/composer/authoring/archetypes/thesis_fund.py +103 -0
- package/dist/composer/authoring/archetypes/trend_momentum.py +104 -0
- package/dist/composer/authoring/builder.py +191 -0
- package/dist/composer/authoring/emit.py +264 -0
- package/dist/composer/authoring/gaps.py +115 -0
- package/dist/composer/authoring/generate.py +131 -0
- package/dist/composer/authoring/presets.py +168 -0
- package/dist/composer/authoring/runtime_emit.py +266 -0
- package/dist/composer/authoring/strategy_manifest.py +94 -0
- package/dist/composer/cli.py +355 -0
- package/dist/composer/compiler/__init__.py +22 -0
- package/dist/composer/compiler/compile.py +550 -0
- package/dist/composer/examples/breakout_swing.graph.yaml +121 -0
- package/dist/composer/examples/conviction_scorer.graph.yaml +216 -0
- package/dist/composer/examples/macro_thesis_basket.graph.yaml +247 -0
- package/dist/composer/examples/pre_listing_classifier.graph.yaml +204 -0
- package/dist/composer/examples/trend_momentum_majors.graph.yaml +133 -0
- package/dist/composer/generated/README.md +22 -0
- package/dist/composer/generated/catalog.md +84 -0
- package/dist/composer/generated/describe.md +703 -0
- package/dist/composer/generated/graph.schema.json +1203 -0
- package/dist/composer/primitives/__init__.py +239 -0
- package/dist/composer/primitives/_candles.py +76 -0
- package/dist/composer/primitives/adapter.py +120 -0
- package/dist/composer/primitives/emitters.py +142 -0
- package/dist/composer/primitives/filters.py +71 -0
- package/dist/composer/primitives/indicators.py +203 -0
- package/dist/composer/primitives/rankers.py +40 -0
- package/dist/composer/primitives/scorers.py +100 -0
- package/dist/composer/primitives/sources.py +405 -0
- package/dist/composer/primitives/stateful.py +52 -0
- package/dist/composer/pure_fn/__init__.py +34 -0
- package/dist/composer/pure_fn/checks.py +39 -0
- package/dist/composer/pure_fn/models.py +177 -0
- package/dist/composer/pure_fn/purity.py +311 -0
- package/dist/composer/pure_fn/runtests.py +155 -0
- package/dist/composer/registry/__init__.py +40 -0
- package/dist/composer/registry/generate.py +422 -0
- package/dist/composer/registry/models.py +331 -0
- package/dist/composer/registry/nodes.py +673 -0
- package/dist/composer/requirements.txt +21 -0
- package/dist/composer/templates/__init__.py +13 -0
- package/dist/composer/templates/scan.py.j2 +31 -0
- package/dist/composer/validator/__init__.py +29 -0
- package/dist/composer/validator/desugar.py +133 -0
- package/dist/composer/validator/errors.py +191 -0
- package/dist/composer/validator/graph_checks.py +348 -0
- package/dist/composer/validator/loader.py +110 -0
- package/dist/composer/validator/schema_checks.py +147 -0
- package/dist/composer/validator/validate.py +86 -0
- package/dist/composer/verbs/__init__.py +33 -0
- package/dist/composer/verbs/check.py +193 -0
- package/dist/composer/verbs/deploy.py +223 -0
- package/dist/composer/verbs/docs.py +30 -0
- package/dist/composer/verbs/runtime_validate.py +262 -0
- package/dist/composer/verbs/smoke.py +115 -0
- package/dist/composer/verbs/status.py +205 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -1
- package/dist/runtime-api/config.d.ts +2 -2
- package/dist/runtime-api/config.js +4 -4
- package/dist/runtime-api/config.js.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.d.ts +3 -5
- package/dist/runtime-api/handlers/ingest-signals.d.ts.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.js +5 -14
- package/dist/runtime-api/handlers/ingest-signals.js.map +1 -1
- package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-mount.js +2 -8
- package/dist/runtime-api/intake/intake-mount.js.map +1 -1
- package/dist/skills-manager/manifest.js +1 -1
- package/dist/skills-manager/manifest.js.map +1 -1
- package/dist/skills-manager/skills-manifest.json +1 -1
- package/package.json +4 -2
- package/dist/runtime-api/intake/ingest-mutex.d.ts +0 -16
- package/dist/runtime-api/intake/ingest-mutex.d.ts.map +0 -1
- package/dist/runtime-api/intake/ingest-mutex.js +0 -18
- package/dist/runtime-api/intake/ingest-mutex.js.map +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw senpi composer — the thin TS rim over the Python Strategy Composer (D8).
|
|
3
|
+
*
|
|
4
|
+
* TS lives ONLY at the rim: this module is a verdict-passthrough wrapper. Every verb spawns
|
|
5
|
+
* the Python `composer` CLI (`python -m composer.cli <verb> ... --json`), parses the JSON
|
|
6
|
+
* verdict it prints, and surfaces GREEN/RED (+ located errors) with a matching process exit
|
|
7
|
+
* code. There is NO composer logic here — validation, compilation, the deploy gate, and the
|
|
8
|
+
* lifecycle derivation all live in Python (the emitted artifact is Python; the golden tests
|
|
9
|
+
* are pytest). Mirrors the existing thin-CLI pattern (src/cli/senpi-config-commands.ts:
|
|
10
|
+
* registerSenpiConfigCommands) and spawns through utils/safe-spawn like senpi-commands.ts.
|
|
11
|
+
*
|
|
12
|
+
* The Python package is located via resolveComposerRoot() — the dir that CONTAINS the
|
|
13
|
+
* `composer/` package — put on the child's PYTHONPATH (never its cwd, so caller-relative
|
|
14
|
+
* graph/answers/out paths keep resolving against the real working dir). Resolution order:
|
|
15
|
+
* COMPOSER_ROOT env (dev-checkout override) → the copy shipped inside the plugin's dist/
|
|
16
|
+
* (mirrors scanner-launcher's scaffoldPackageDir). Python runs via COMPOSER_PYTHON (default:
|
|
17
|
+
* python3). Deploy is HARD-gated on a GREEN check inside Python.
|
|
18
|
+
*/
|
|
19
|
+
interface CommanderCommand {
|
|
20
|
+
command(name: string, desc?: string): CommanderCommand;
|
|
21
|
+
description(desc: string): CommanderCommand;
|
|
22
|
+
option(flags: string, description?: string): CommanderCommand;
|
|
23
|
+
action(fn: (() => void | Promise<void>) | ((opts: Record<string, unknown>) => void | Promise<void>) | ((arg: string, opts: Record<string, unknown>) => void | Promise<void>)): CommanderCommand;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolve the directory that CONTAINS the `composer/` python package.
|
|
27
|
+
*
|
|
28
|
+
* Order: COMPOSER_ROOT env (dev-checkout override — point it at the dir holding `composer/`,
|
|
29
|
+
* i.e. the repo root) → the copy shipped inside the plugin's dist/. This module compiles to
|
|
30
|
+
* dist/cli/composer-commands.js and `copy:composer` lands the package at dist/composer, so
|
|
31
|
+
* the containing dir is one level up (dist/). Mirrors scanner-launcher's scaffoldPackageDir
|
|
32
|
+
* (src/index.ts: `new URL("./scanners/external", import.meta.url)`).
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveComposerRoot(): string;
|
|
35
|
+
export declare function registerComposerCli(senpi: CommanderCommand): void;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=composer-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-commands.d.ts","sourceRoot":"","sources":["../../src/cli/composer-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,MAAM,CACJ,EAAE,EACE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAC5B,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACzD,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACzE,gBAAgB,CAAC;CACrB;AAYD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C;AA6FD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAoKjE"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw senpi composer — the thin TS rim over the Python Strategy Composer (D8).
|
|
3
|
+
*
|
|
4
|
+
* TS lives ONLY at the rim: this module is a verdict-passthrough wrapper. Every verb spawns
|
|
5
|
+
* the Python `composer` CLI (`python -m composer.cli <verb> ... --json`), parses the JSON
|
|
6
|
+
* verdict it prints, and surfaces GREEN/RED (+ located errors) with a matching process exit
|
|
7
|
+
* code. There is NO composer logic here — validation, compilation, the deploy gate, and the
|
|
8
|
+
* lifecycle derivation all live in Python (the emitted artifact is Python; the golden tests
|
|
9
|
+
* are pytest). Mirrors the existing thin-CLI pattern (src/cli/senpi-config-commands.ts:
|
|
10
|
+
* registerSenpiConfigCommands) and spawns through utils/safe-spawn like senpi-commands.ts.
|
|
11
|
+
*
|
|
12
|
+
* The Python package is located via resolveComposerRoot() — the dir that CONTAINS the
|
|
13
|
+
* `composer/` package — put on the child's PYTHONPATH (never its cwd, so caller-relative
|
|
14
|
+
* graph/answers/out paths keep resolving against the real working dir). Resolution order:
|
|
15
|
+
* COMPOSER_ROOT env (dev-checkout override) → the copy shipped inside the plugin's dist/
|
|
16
|
+
* (mirrors scanner-launcher's scaffoldPackageDir). Python runs via COMPOSER_PYTHON (default:
|
|
17
|
+
* python3). Deploy is HARD-gated on a GREEN check inside Python.
|
|
18
|
+
*/
|
|
19
|
+
import { spawnSync } from "../utils/safe-spawn.js";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
21
|
+
import { delimiter as PATH_DELIMITER, join as pathJoin } from "node:path";
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the directory that CONTAINS the `composer/` python package.
|
|
24
|
+
*
|
|
25
|
+
* Order: COMPOSER_ROOT env (dev-checkout override — point it at the dir holding `composer/`,
|
|
26
|
+
* i.e. the repo root) → the copy shipped inside the plugin's dist/. This module compiles to
|
|
27
|
+
* dist/cli/composer-commands.js and `copy:composer` lands the package at dist/composer, so
|
|
28
|
+
* the containing dir is one level up (dist/). Mirrors scanner-launcher's scaffoldPackageDir
|
|
29
|
+
* (src/index.ts: `new URL("./scanners/external", import.meta.url)`).
|
|
30
|
+
*/
|
|
31
|
+
export function resolveComposerRoot() {
|
|
32
|
+
const override = process.env.COMPOSER_ROOT;
|
|
33
|
+
if (override)
|
|
34
|
+
return override;
|
|
35
|
+
return fileURLToPath(new URL("..", import.meta.url));
|
|
36
|
+
}
|
|
37
|
+
/** The exact remediation command for a missing composer Python dep. */
|
|
38
|
+
function requirementsHint(root) {
|
|
39
|
+
return `pip install -r ${pathJoin(root, "composer", "requirements.txt")}`;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Detect a box-side environment failure (missing python, missing deps, or a missing
|
|
43
|
+
* `composer` package) and return an actionable one-line message — never a bare stack trace.
|
|
44
|
+
* Returns null for a normal run (incl. a RED verdict, which exits non-zero but ran fine).
|
|
45
|
+
*/
|
|
46
|
+
function detectEnvError(pythonBin, root, result) {
|
|
47
|
+
const err = result.error;
|
|
48
|
+
if (err && err.code === "ENOENT") {
|
|
49
|
+
return `composer: '${pythonBin}' not found — install Python 3 (or set COMPOSER_PYTHON), then the composer deps: ${requirementsHint(root)}`;
|
|
50
|
+
}
|
|
51
|
+
const stderr = result.stderr ?? "";
|
|
52
|
+
const missing = /No module named ['"]?([\w.]+)/.exec(stderr);
|
|
53
|
+
if (missing) {
|
|
54
|
+
const mod = missing[1];
|
|
55
|
+
if (mod === "composer" || mod.startsWith("composer.")) {
|
|
56
|
+
return `composer: the 'composer' package was not found under ${root} — on a claw run \`npm run build\` (copy:composer) or set COMPOSER_ROOT to your checkout root.`;
|
|
57
|
+
}
|
|
58
|
+
return `composer: Python dependency '${mod}' is missing — install the composer deps: ${requirementsHint(root)}`;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Spawn `python -m composer.cli <args>` and (optionally) parse its --json stdout.
|
|
64
|
+
*
|
|
65
|
+
* The composer package is found via PYTHONPATH (resolveComposerRoot()), leaving the child's
|
|
66
|
+
* cwd as the caller's real working dir so relative graph/answers/-o paths resolve there.
|
|
67
|
+
* On a box-side failure (no python / missing deps) the actionable hint is printed to stderr
|
|
68
|
+
* here and returned as `envError`, so every verb surfaces it identically without a stack trace.
|
|
69
|
+
*/
|
|
70
|
+
function runComposer(args) {
|
|
71
|
+
const pythonBin = process.env.COMPOSER_PYTHON ?? "python3";
|
|
72
|
+
const composerRoot = resolveComposerRoot();
|
|
73
|
+
const pythonPath = process.env.PYTHONPATH
|
|
74
|
+
? `${composerRoot}${PATH_DELIMITER}${process.env.PYTHONPATH}`
|
|
75
|
+
: composerRoot;
|
|
76
|
+
const result = spawnSync(pythonBin, ["-m", "composer.cli", ...args], {
|
|
77
|
+
encoding: "utf8",
|
|
78
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
79
|
+
env: { ...process.env, PYTHONPATH: pythonPath },
|
|
80
|
+
});
|
|
81
|
+
const envError = detectEnvError(pythonBin, composerRoot, result);
|
|
82
|
+
if (envError) {
|
|
83
|
+
console.error(envError);
|
|
84
|
+
return { status: result.status ?? 1, stdout: "", stderr: "", json: null, envError };
|
|
85
|
+
}
|
|
86
|
+
const stdout = result.stdout ?? "";
|
|
87
|
+
const stderr = result.stderr ?? "";
|
|
88
|
+
let json = null;
|
|
89
|
+
if (args.includes("--json")) {
|
|
90
|
+
try {
|
|
91
|
+
json = JSON.parse(stdout);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
json = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { status: result.status ?? 1, stdout, stderr, json, envError: null };
|
|
98
|
+
}
|
|
99
|
+
function renderLocation(loc) {
|
|
100
|
+
if (!loc)
|
|
101
|
+
return "document";
|
|
102
|
+
const parts = [];
|
|
103
|
+
if (loc.node)
|
|
104
|
+
parts.push(`node ${loc.node}`);
|
|
105
|
+
if (loc.port)
|
|
106
|
+
parts.push(`port ${loc.port}`);
|
|
107
|
+
if (loc.line != null)
|
|
108
|
+
parts.push(`line ${loc.line}`);
|
|
109
|
+
return parts.length ? parts.join(", ") : "document";
|
|
110
|
+
}
|
|
111
|
+
function printErrors(errors) {
|
|
112
|
+
for (const e of errors) {
|
|
113
|
+
console.error(` [${e.code ?? "?"}] ${renderLocation(e.location)}: ${e.message ?? ""}`);
|
|
114
|
+
if (e.fix_hint)
|
|
115
|
+
console.error(` fix: ${e.fix_hint}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function registerComposerCli(senpi) {
|
|
119
|
+
const composer = senpi.command("composer");
|
|
120
|
+
composer.description("Strategy Composer: new / validate / compile / check / deploy / status a strategy graph; catalog / describe nodes");
|
|
121
|
+
// new / validate / compile stream Python's own (rich) human render through — teaching
|
|
122
|
+
// errors, gap reports, emitted scan.py — forwarding only the relevant flags. Thin: no
|
|
123
|
+
// TS-side interpretation; the exit code is Python's (0 ok, 2 gap report, 3 clobber-refused).
|
|
124
|
+
composer
|
|
125
|
+
.command("new <id>")
|
|
126
|
+
.description("Generate a COMPLETE, VALID strategy graph from interview answers (D7)")
|
|
127
|
+
.option("--archetype <name>", "Archetype template (trend_momentum | classifier | thesis_fund)")
|
|
128
|
+
.option("--answers <file>", "Path to a YAML/JSON answers-file (flags override it)")
|
|
129
|
+
.option("-o, --out <dir>", "Output directory (default: cwd)")
|
|
130
|
+
.option("--force", "Overwrite an edited graph (default: refuse to clobber edits)")
|
|
131
|
+
.option("--json", "Emit the structured result (path / gap report) as JSON")
|
|
132
|
+
.action(async (id, opts) => {
|
|
133
|
+
const args = ["new", id];
|
|
134
|
+
if (opts.archetype)
|
|
135
|
+
args.push("--archetype", opts.archetype);
|
|
136
|
+
if (opts.answers)
|
|
137
|
+
args.push("--answers", opts.answers);
|
|
138
|
+
if (opts.out)
|
|
139
|
+
args.push("--output", opts.out);
|
|
140
|
+
if (opts.force)
|
|
141
|
+
args.push("--force");
|
|
142
|
+
if (opts.json)
|
|
143
|
+
args.push("--json");
|
|
144
|
+
const { status, stdout, stderr, envError } = runComposer(args);
|
|
145
|
+
if (envError) {
|
|
146
|
+
process.exitCode = 1;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (stdout)
|
|
150
|
+
process.stdout.write(stdout);
|
|
151
|
+
if (stderr)
|
|
152
|
+
process.stderr.write(stderr);
|
|
153
|
+
process.exitCode = status;
|
|
154
|
+
});
|
|
155
|
+
composer
|
|
156
|
+
.command("validate <graph>")
|
|
157
|
+
.description("Validate a strategy graph (schema + graph checks) with teaching errors")
|
|
158
|
+
.option("--json", "Emit the structured result as JSON")
|
|
159
|
+
.action(async (graph, opts) => {
|
|
160
|
+
const args = ["validate", graph];
|
|
161
|
+
if (opts.json)
|
|
162
|
+
args.push("--json");
|
|
163
|
+
const { status, stdout, stderr, envError } = runComposer(args);
|
|
164
|
+
if (envError) {
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (stdout)
|
|
169
|
+
process.stdout.write(stdout);
|
|
170
|
+
if (stderr)
|
|
171
|
+
process.stderr.write(stderr);
|
|
172
|
+
process.exitCode = status;
|
|
173
|
+
});
|
|
174
|
+
composer
|
|
175
|
+
.command("compile <graph>")
|
|
176
|
+
.description("Compile a validated strategy graph into a scan.py on the external_scanner contract")
|
|
177
|
+
.option("-o, --out <file>", "Write the emitted scan.py here (default: stdout)")
|
|
178
|
+
.action(async (graph, opts) => {
|
|
179
|
+
const args = ["compile", graph];
|
|
180
|
+
if (opts.out)
|
|
181
|
+
args.push("--output", opts.out);
|
|
182
|
+
const { status, stdout, stderr, envError } = runComposer(args);
|
|
183
|
+
if (envError) {
|
|
184
|
+
process.exitCode = 1;
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (stdout)
|
|
188
|
+
process.stdout.write(stdout);
|
|
189
|
+
if (stderr)
|
|
190
|
+
process.stderr.write(stderr);
|
|
191
|
+
process.exitCode = status;
|
|
192
|
+
});
|
|
193
|
+
composer
|
|
194
|
+
.command("check <graph>")
|
|
195
|
+
.description("ONE verdict: validate + pure_fn tests + compile + fixture smoke (GREEN/RED)")
|
|
196
|
+
.option("--json", "Print the raw Python verdict JSON")
|
|
197
|
+
.action(async (graph, opts) => {
|
|
198
|
+
const { status, stdout, json } = runComposer(["check", graph, "--json"]);
|
|
199
|
+
if (opts.json) {
|
|
200
|
+
process.stdout.write(stdout);
|
|
201
|
+
process.exitCode = status;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (!json) {
|
|
205
|
+
process.stdout.write(stdout);
|
|
206
|
+
process.exitCode = status;
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const verdict = String(json.verdict);
|
|
210
|
+
const errors = json.errors ?? [];
|
|
211
|
+
if (verdict === "GREEN") {
|
|
212
|
+
console.log(`GREEN: ${graph} — ready to deploy.`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log(`RED: ${graph} — ${errors.length} error(s); deploy is refused until GREEN.`);
|
|
216
|
+
printErrors(errors);
|
|
217
|
+
}
|
|
218
|
+
process.exitCode = status;
|
|
219
|
+
});
|
|
220
|
+
composer
|
|
221
|
+
.command("deploy <graph>")
|
|
222
|
+
.description("Stage the deployable artifact set (idempotent); hard-gated on a GREEN check")
|
|
223
|
+
.option("-o, --out <dir>", "Staging directory (default: dist)")
|
|
224
|
+
.option("--json", "Print the raw Python verdict JSON")
|
|
225
|
+
.action(async (graph, opts) => {
|
|
226
|
+
const args = ["deploy", graph, "--json"];
|
|
227
|
+
if (opts.out)
|
|
228
|
+
args.push("--out", opts.out);
|
|
229
|
+
const { status, stdout, json } = runComposer(args);
|
|
230
|
+
if (opts.json || !json) {
|
|
231
|
+
process.stdout.write(stdout);
|
|
232
|
+
process.exitCode = status;
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const verdict = String(json.verdict);
|
|
236
|
+
if (verdict === "REFUSED") {
|
|
237
|
+
const check = (json.check ?? {});
|
|
238
|
+
console.log(`REFUSED: ${graph} — check is ${check.verdict}; deploy needs a GREEN check.`);
|
|
239
|
+
printErrors(check.errors ?? []);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
const staged = (json.staged ?? {});
|
|
243
|
+
console.log(`${verdict}: ${graph} — staged to ${staged.dir}. (live tick: slice 8)`);
|
|
244
|
+
}
|
|
245
|
+
process.exitCode = status;
|
|
246
|
+
});
|
|
247
|
+
composer
|
|
248
|
+
.command("status <target>")
|
|
249
|
+
.description("Derived lifecycle position + the next verb to run (graph file or staging dir)")
|
|
250
|
+
.option("-o, --out <dir>", "Staging directory to check for a deployed artifact")
|
|
251
|
+
.option("--json", "Print the raw Python status JSON")
|
|
252
|
+
.action(async (target, opts) => {
|
|
253
|
+
const args = ["status", target, "--json"];
|
|
254
|
+
if (opts.out)
|
|
255
|
+
args.push("--out", opts.out);
|
|
256
|
+
const { status, stdout, json } = runComposer(args);
|
|
257
|
+
if (opts.json || !json) {
|
|
258
|
+
process.stdout.write(stdout);
|
|
259
|
+
process.exitCode = status;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
console.log(`position: ${String(json.position)}`);
|
|
263
|
+
console.log(`next: ${String(json.next)}`);
|
|
264
|
+
process.exitCode = status;
|
|
265
|
+
});
|
|
266
|
+
composer
|
|
267
|
+
.command("catalog")
|
|
268
|
+
.description("Print the registry-generated node catalog index")
|
|
269
|
+
.action(async () => {
|
|
270
|
+
const { status, stdout, stderr } = runComposer(["catalog"]);
|
|
271
|
+
process.stdout.write(stdout);
|
|
272
|
+
if (stderr)
|
|
273
|
+
process.stderr.write(stderr);
|
|
274
|
+
process.exitCode = status;
|
|
275
|
+
});
|
|
276
|
+
composer
|
|
277
|
+
.command("describe <node>")
|
|
278
|
+
.description("Print one node's full ports/params/example")
|
|
279
|
+
.action(async (node) => {
|
|
280
|
+
const { status, stdout, stderr } = runComposer(["describe", node]);
|
|
281
|
+
process.stdout.write(stdout);
|
|
282
|
+
if (stderr)
|
|
283
|
+
process.stderr.write(stderr);
|
|
284
|
+
process.exitCode = status;
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=composer-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-commands.js","sourceRoot":"","sources":["../../src/cli/composer-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"senpi-commands.d.ts","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"senpi-commands.d.ts","sourceRoot":"","sources":["../../src/cli/senpi-commands.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI/D;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE;IAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAA;CAAE,GAChF,IAAI,CA4vCN;AA8ID;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAWvE;AAmDD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CASjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAW3E;AA8HD,kEAAkE;AAClE,UAAU,gBAAgB;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACtE,MAAM,CACJ,EAAE,EACE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACzD,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GACzE,gBAAgB,CAAC;CACrB"}
|
|
@@ -11,6 +11,7 @@ import { spawnSync } from "../utils/safe-spawn.js";
|
|
|
11
11
|
import path from "node:path";
|
|
12
12
|
import { registerGuideCommands, CHEATSHEET_TEXT } from "./guide-commands.js";
|
|
13
13
|
import { registerSenpiConfigCommands } from "./senpi-config-commands.js";
|
|
14
|
+
import { registerComposerCli } from "./composer-commands.js";
|
|
14
15
|
import { VERSION } from "../version.js";
|
|
15
16
|
/**
|
|
16
17
|
* Register senpi subcommands on the given Commander program.
|
|
@@ -25,6 +26,7 @@ export function registerSenpiCli(program) {
|
|
|
25
26
|
}
|
|
26
27
|
});
|
|
27
28
|
registerSenpiConfigCommands(senpi);
|
|
29
|
+
registerComposerCli(senpi);
|
|
28
30
|
const runtime = senpi.command("runtime");
|
|
29
31
|
runtime.description("Manage runtimes");
|
|
30
32
|
runtime
|