spawnfile 0.1.10 → 0.1.12
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 +13 -2
- package/dist/cli/lifecycleCommands.js +101 -1
- package/dist/cli/modelCommands.js +3 -0
- package/dist/cli/resolveCommandInput.d.ts +19 -0
- package/dist/cli/resolveCommandInput.js +25 -0
- package/dist/cli/runCli.d.ts +4 -1
- package/dist/cli/runCli.js +37 -13
- package/dist/cli/runtimeCommands.js +1 -0
- package/dist/cli/statusCommand.d.ts +42 -0
- package/dist/cli/statusCommand.js +394 -0
- package/dist/cli/surfaceCommands.js +4 -0
- package/dist/compiler/agentSurfaces.js +2 -4
- package/dist/compiler/buildCompilePlanTeams.js +3 -1
- package/dist/compiler/compileProject.js +19 -10
- package/dist/compiler/compileProjectSupport.d.ts +1 -0
- package/dist/compiler/compileProjectSupport.js +1 -1
- package/dist/compiler/containerArtifacts.d.ts +1 -0
- package/dist/compiler/containerArtifacts.js +208 -32
- package/dist/compiler/containerArtifactsPlans.js +7 -4
- package/dist/compiler/containerArtifactsRender.d.ts +7 -1
- package/dist/compiler/containerArtifactsRender.js +6 -0
- package/dist/compiler/containerArtifactsTypes.d.ts +9 -0
- package/dist/compiler/containerEntrypointRender.js +18 -31
- package/dist/compiler/index.d.ts +1 -0
- package/dist/compiler/index.js +1 -0
- package/dist/compiler/moltnetArtifacts.d.ts +2 -0
- package/dist/compiler/moltnetArtifacts.js +58 -99
- package/dist/compiler/moltnetClientConfig.d.ts +2 -2
- package/dist/compiler/moltnetClientConfig.js +16 -23
- package/dist/compiler/moltnetConfigLowering.d.ts +3 -0
- package/dist/compiler/moltnetConfigLowering.js +13 -2
- package/dist/compiler/moltnetNodeConfig.d.ts +27 -0
- package/dist/compiler/moltnetNodeConfig.js +68 -0
- package/dist/compiler/moltnetResolution.js +1 -1
- package/dist/compiler/moltnetRoomMemberships.js +1 -2
- package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +4 -0
- package/dist/compiler/moltnetRoomPolicyCompatibility.js +28 -0
- package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
- package/dist/compiler/moltnetRuntimeConfig.js +1 -13
- package/dist/compiler/networkBinding.d.ts +14 -0
- package/dist/compiler/networkBinding.js +34 -0
- package/dist/compiler/publishProject.d.ts +13 -0
- package/dist/compiler/publishProject.js +72 -0
- package/dist/compiler/runProject.d.ts +26 -12
- package/dist/compiler/runProject.js +102 -125
- package/dist/compiler/runProjectAuth.d.ts +5 -0
- package/dist/compiler/runProjectAuth.js +98 -0
- package/dist/compiler/runProjectDocker.d.ts +19 -0
- package/dist/compiler/runProjectDocker.js +57 -0
- package/dist/compiler/types.d.ts +3 -2
- package/dist/compiler/upProject.d.ts +6 -0
- package/dist/compiler/upProject.js +42 -8
- package/dist/compiler/view/buildOrganizationView.js +27 -3
- package/dist/compiler/view/declarations.d.ts +4 -0
- package/dist/compiler/view/declarations.js +104 -0
- package/dist/compiler/view/renderNetworks.js +12 -3
- package/dist/compiler/view/renderTree.js +16 -3
- package/dist/compiler/view/types.d.ts +77 -1
- package/dist/deployment/dockerInspect.d.ts +29 -0
- package/dist/deployment/dockerInspect.js +130 -0
- package/dist/deployment/dockerLabels.d.ts +16 -0
- package/dist/deployment/dockerLabels.js +32 -0
- package/dist/deployment/dockerLogs.d.ts +24 -0
- package/dist/deployment/dockerLogs.js +96 -0
- package/dist/deployment/dockerManager.d.ts +59 -0
- package/dist/deployment/dockerManager.js +76 -0
- package/dist/deployment/dockerProbeGateway.d.ts +16 -0
- package/dist/deployment/dockerProbeGateway.js +48 -0
- package/dist/deployment/homeStore.d.ts +19 -0
- package/dist/deployment/homeStore.js +130 -0
- package/dist/deployment/index.d.ts +9 -0
- package/dist/deployment/index.js +9 -0
- package/dist/deployment/names.d.ts +3 -0
- package/dist/deployment/names.js +12 -0
- package/dist/deployment/record.d.ts +76 -0
- package/dist/deployment/record.js +174 -0
- package/dist/deployment/target.d.ts +35 -0
- package/dist/deployment/target.js +96 -0
- package/dist/distribution/buildDistributionReport.d.ts +22 -0
- package/dist/distribution/buildDistributionReport.js +51 -0
- package/dist/distribution/consumeImage.d.ts +29 -0
- package/dist/distribution/consumeImage.js +254 -0
- package/dist/distribution/consumeImageSupport.d.ts +18 -0
- package/dist/distribution/consumeImageSupport.js +63 -0
- package/dist/distribution/distributionReportSchema.d.ts +84 -0
- package/dist/distribution/distributionReportSchema.js +107 -0
- package/dist/distribution/dockerRunner.d.ts +5 -0
- package/dist/distribution/dockerRunner.js +21 -0
- package/dist/distribution/extractImage.d.ts +25 -0
- package/dist/distribution/extractImage.js +96 -0
- package/dist/distribution/fingerprint.d.ts +2 -0
- package/dist/distribution/fingerprint.js +14 -0
- package/dist/distribution/imageRef.d.ts +9 -0
- package/dist/distribution/imageRef.js +65 -0
- package/dist/distribution/imageRuntimeAuth.d.ts +19 -0
- package/dist/distribution/imageRuntimeAuth.js +71 -0
- package/dist/distribution/index.d.ts +24 -0
- package/dist/distribution/index.js +16 -0
- package/dist/distribution/preflight.d.ts +11 -0
- package/dist/distribution/preflight.js +65 -0
- package/dist/distribution/projectImageView.d.ts +8 -0
- package/dist/distribution/projectImageView.js +83 -0
- package/dist/distribution/projectName.d.ts +1 -0
- package/dist/distribution/projectName.js +12 -0
- package/dist/distribution/renderImageInterface.d.ts +30 -0
- package/dist/distribution/renderImageInterface.js +86 -0
- package/dist/distribution/tarReader.d.ts +10 -0
- package/dist/distribution/tarReader.js +69 -0
- package/dist/distribution/types.d.ts +80 -0
- package/dist/distribution/types.js +4 -0
- package/dist/distribution/verifyDistributionReport.d.ts +12 -0
- package/dist/distribution/verifyDistributionReport.js +29 -0
- package/dist/filesystem/paths.d.ts +6 -0
- package/dist/filesystem/paths.js +11 -0
- package/dist/manifest/loadManifest.js +22 -2
- package/dist/manifest/renderSpawnfile.js +2 -4
- package/dist/manifest/renderSpawnfileNetworks.js +5 -0
- package/dist/manifest/schemas.d.ts +71 -41
- package/dist/manifest/surfaceSchemas.d.ts +19 -47
- package/dist/manifest/surfaceSchemas.js +3 -6
- package/dist/manifest/teamNetworkAccessSchemas.d.ts +15 -0
- package/dist/manifest/teamNetworkAccessSchemas.js +8 -0
- package/dist/manifest/teamNetworkConsoleSchemas.d.ts +7 -0
- package/dist/manifest/teamNetworkConsoleSchemas.js +19 -0
- package/dist/manifest/teamNetworkSchemas.d.ts +60 -0
- package/dist/manifest/teamNetworkSchemas.js +20 -7
- package/dist/report/createReport.d.ts +7 -1
- package/dist/report/createReport.js +28 -1
- package/dist/report/types.d.ts +43 -0
- package/dist/runtime/container.js +0 -16
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/install.d.ts +0 -10
- package/dist/runtime/install.js +0 -45
- package/dist/runtime/openclaw/adapter.js +9 -1
- package/dist/runtime/openclaw/configAuth.d.ts +15 -0
- package/dist/runtime/openclaw/configAuth.js +46 -0
- package/dist/runtime/openclaw/runAuth.d.ts +6 -0
- package/dist/runtime/openclaw/runAuth.js +7 -55
- package/dist/runtime/openclaw/statusProbes.d.ts +2 -0
- package/dist/runtime/openclaw/statusProbes.js +31 -0
- package/dist/runtime/picoclaw/adapter.js +10 -0
- package/dist/runtime/picoclaw/runAuth.d.ts +7 -0
- package/dist/runtime/picoclaw/runAuth.js +8 -68
- package/dist/runtime/picoclaw/statusProbes.d.ts +2 -0
- package/dist/runtime/picoclaw/statusProbes.js +100 -0
- package/dist/runtime/registry.d.ts +0 -5
- package/dist/runtime/registry.js +2 -12
- package/dist/runtime/statusProbes.d.ts +16 -0
- package/dist/runtime/statusProbes.js +41 -0
- package/dist/runtime/types.d.ts +52 -1
- package/dist/shared/errors.d.ts +6 -0
- package/dist/shared/errors.js +9 -0
- package/dist/status/buildStatus.d.ts +13 -0
- package/dist/status/buildStatus.js +266 -0
- package/dist/status/compileReport.d.ts +96 -0
- package/dist/status/compileReport.js +230 -0
- package/dist/status/compiledContainerObservations.d.ts +5 -0
- package/dist/status/compiledContainerObservations.js +63 -0
- package/dist/status/deploymentLogs.d.ts +12 -0
- package/dist/status/deploymentLogs.js +45 -0
- package/dist/status/deployments.d.ts +14 -0
- package/dist/status/deployments.js +128 -0
- package/dist/status/imageStatusReport.d.ts +10 -0
- package/dist/status/imageStatusReport.js +73 -0
- package/dist/status/index.d.ts +14 -0
- package/dist/status/index.js +14 -0
- package/dist/status/moltnetProbes.d.ts +21 -0
- package/dist/status/moltnetProbes.js +240 -0
- package/dist/status/registryDrift.d.ts +28 -0
- package/dist/status/registryDrift.js +119 -0
- package/dist/status/renderStatus.d.ts +2 -0
- package/dist/status/renderStatus.js +230 -0
- package/dist/status/runtimeProbes.d.ts +13 -0
- package/dist/status/runtimeProbes.js +111 -0
- package/dist/status/selectionSubjects.d.ts +8 -0
- package/dist/status/selectionSubjects.js +77 -0
- package/dist/status/selectors.d.ts +14 -0
- package/dist/status/selectors.js +90 -0
- package/dist/status/traversal.d.ts +6 -0
- package/dist/status/traversal.js +15 -0
- package/dist/status/types.d.ts +113 -0
- package/dist/status/types.js +1 -0
- package/package.json +4 -2
- package/runtimes.yaml +22 -15
- package/dist/runtime/tinyclaw/adapter.d.ts +0 -2
- package/dist/runtime/tinyclaw/adapter.js +0 -284
- package/dist/runtime/tinyclaw/runAuth.d.ts +0 -2
- package/dist/runtime/tinyclaw/runAuth.js +0 -49
- package/dist/runtime/tinyclaw/scaffold-assets/AGENTS.md +0 -160
- package/dist/runtime/tinyclaw/scaffold-assets/CLAUDE.md +0 -5
- package/dist/runtime/tinyclaw/scaffold-assets/SOUL.md +0 -177
- package/dist/runtime/tinyclaw/scaffold.d.ts +0 -2
- package/dist/runtime/tinyclaw/scaffold.js +0 -24
- package/dist/runtime/tinyclaw/schedules.d.ts +0 -9
- package/dist/runtime/tinyclaw/schedules.js +0 -62
- package/dist/runtime/tinyclaw/surfaces.d.ts +0 -8
- package/dist/runtime/tinyclaw/surfaces.js +0 -94
package/README.md
CHANGED
|
@@ -37,13 +37,20 @@ spawnfile init # scaffold an agent (defaults t
|
|
|
37
37
|
spawnfile validate # check the graph
|
|
38
38
|
spawnfile view . # read-only graph view; writes no files
|
|
39
39
|
spawnfile compile # lower to runtime-native output
|
|
40
|
+
spawnfile status . # read declared/compiled status
|
|
40
41
|
spawnfile auth sync --profile dev --env-file .env
|
|
41
42
|
spawnfile build --tag my-agent # compile + docker build
|
|
42
|
-
spawnfile run --tag my-agent --auth-profile dev
|
|
43
|
+
spawnfile run --tag my-agent --auth-profile dev --detach
|
|
44
|
+
spawnfile status . --live # inspect the detached deployment
|
|
45
|
+
spawnfile publish . --tag you/my-agent:1.0.0 # compile + build + verify + push
|
|
43
46
|
```
|
|
44
47
|
|
|
45
48
|
Compiled output lands under `.spawn/` by default, including a `Dockerfile`, `entrypoint.sh`, `.env.example`, and a prebuilt `container/rootfs/` tree. `spawnfile build` uses the pinned runtime artifacts from `runtimes.yaml`; it does not rebuild runtimes from source.
|
|
46
49
|
|
|
50
|
+
`spawnfile status` is read-only. By default it shows authored and compiled state without Docker, runtime, or Moltnet calls. With `--live`, it reads the selected detached deployment record, inspects the recorded Docker target, runs adapter-owned runtime probes, and checks Moltnet metadata without reading message bodies. Add `--logs` for a redacted Docker log tail, or `--watch` to refresh status continuously.
|
|
51
|
+
|
|
52
|
+
Compiled images are self-describing: `spawnfile publish` pushes one to any OCI registry, and anyone can run it with no source — `spawnfile up you/my-agent:1.0.0 --deployment prod --detach --auth-profile me` — or inspect what it needs first with `spawnfile status you/my-agent:1.0.0`. See [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md).
|
|
53
|
+
|
|
47
54
|
Declare external credentials in `secrets:` and provide values through an ignored env file or the shell environment. `spawnfile auth sync --env-file .env` stores declared model auth and project secrets in a local auth profile; `spawnfile run --env-file .env` can inject the same values directly for a single run. This is the intended pattern for credentials like `GH_TOKEN`, MCP tokens, and provider API keys.
|
|
48
55
|
|
|
49
56
|
## Project structure
|
|
@@ -91,9 +98,11 @@ v0.1 targets autonomous agent runtimes that share a markdown workspace identity
|
|
|
91
98
|
|-----------|---------------|---------|-----------------------------------------------|
|
|
92
99
|
| OpenClaw | active | ✅ | Discord, Telegram, WhatsApp, Slack |
|
|
93
100
|
| PicoClaw | active | | Discord, Telegram, Slack (WhatsApp blocked) |
|
|
94
|
-
| TinyClaw | active | | Discord, Telegram, WhatsApp (pairing-gated) |
|
|
95
101
|
| NullClaw | exploratory | | No active adapter yet |
|
|
96
102
|
| ZeroClaw | exploratory | | No active adapter yet |
|
|
103
|
+
| OpenFang | exploratory | | No active adapter yet |
|
|
104
|
+
| Hermes Agent | exploratory | | No active adapter yet |
|
|
105
|
+
| OpenCode | exploratory | | No active adapter yet |
|
|
97
106
|
|
|
98
107
|
Each adapter maps the portable schema into its native forms. The compiler reports a machine-readable `spawnfile-report.json` with the resolved graph, chosen runtimes, and capability outcomes (`supported`, `degraded`, `unsupported`). See [`specs/RUNTIMES.md`](specs/RUNTIMES.md) for the live matrix and pinned versions, or [`runtimes.yaml`](runtimes.yaml) for the registry source of truth.
|
|
99
108
|
|
|
@@ -113,6 +122,8 @@ The source-of-truth specs live in this repo:
|
|
|
113
122
|
- [`specs/CONTAINERS.md`](specs/CONTAINERS.md) — container compilation
|
|
114
123
|
- [`specs/RUNTIMES.md`](specs/RUNTIMES.md) — runtime registry and version pinning
|
|
115
124
|
- [`specs/SURFACES.md`](specs/SURFACES.md) — messaging surface model
|
|
125
|
+
- [`specs/STATUS.md`](specs/STATUS.md) — static and live operational status
|
|
126
|
+
- [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md) — image distribution, publish, and sourceless run
|
|
116
127
|
- [`fixtures/`](fixtures/) — canonical example projects
|
|
117
128
|
|
|
118
129
|
## From source
|
|
@@ -1,6 +1,27 @@
|
|
|
1
|
+
import { readRunEnvFile } from "../compiler/runProjectAuth.js";
|
|
2
|
+
import { SpawnfileError } from "../shared/index.js";
|
|
3
|
+
import { resolveCommandInput } from "./resolveCommandInput.js";
|
|
4
|
+
const resolveAuthProfileForImage = async (handlers, authProfile) => {
|
|
5
|
+
if (!authProfile || !handlers.requireAuthProfile) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
return handlers.requireAuthProfile(authProfile);
|
|
9
|
+
};
|
|
10
|
+
const shortDigest = (digest) => digest ? digest.replace(/^sha256:/, "").slice(0, 12) : "unknown";
|
|
11
|
+
/** Summarizes a redeploy as previous → new ref/digest, per specs/DISTRIBUTION.md. */
|
|
12
|
+
const formatRedeploySummary = (previous, newRef, newDigest) => {
|
|
13
|
+
// Only claim "unchanged" when we actually resolved a matching digest; two null
|
|
14
|
+
// digests (local-only images) are unknown, not provably identical.
|
|
15
|
+
if (previous.ref === newRef && newDigest !== null && previous.digest === newDigest) {
|
|
16
|
+
return `redeployed image ${newRef} (digest unchanged ${shortDigest(newDigest)})`;
|
|
17
|
+
}
|
|
18
|
+
return (`redeployed image: ${previous.ref} (${shortDigest(previous.digest)}) ` +
|
|
19
|
+
`→ ${newRef} (${shortDigest(newDigest)})`);
|
|
20
|
+
};
|
|
1
21
|
export const registerLifecycleCommands = (program, handlers, streams) => {
|
|
2
22
|
program
|
|
3
23
|
.command("compile")
|
|
24
|
+
.description("Compile a project into runtime-native output under .spawn")
|
|
4
25
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
5
26
|
.option("-o, --out <directory>", "Output directory")
|
|
6
27
|
.action(async (inputPath, options) => {
|
|
@@ -10,6 +31,7 @@ export const registerLifecycleCommands = (program, handlers, streams) => {
|
|
|
10
31
|
});
|
|
11
32
|
program
|
|
12
33
|
.command("build")
|
|
34
|
+
.description("Compile and build the organization Docker image")
|
|
13
35
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
14
36
|
.option("--docker-command <command>", "Docker command")
|
|
15
37
|
.option("-o, --out <directory>", "Output directory")
|
|
@@ -26,20 +48,36 @@ export const registerLifecycleCommands = (program, handlers, streams) => {
|
|
|
26
48
|
});
|
|
27
49
|
program
|
|
28
50
|
.command("run")
|
|
51
|
+
.description("Compile, build, and run the organization container locally")
|
|
29
52
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
30
53
|
.option("-o, --out <directory>", "Output directory")
|
|
31
54
|
.option("-t, --tag <image>", "Docker image tag")
|
|
32
55
|
.option("--auth-profile <name>", "Local Spawnfile auth profile")
|
|
56
|
+
.option("--context <name>", "Docker context for the deployment target")
|
|
57
|
+
.option("--deployment <name>", "Detached deployment record name")
|
|
33
58
|
.option("--docker-command <command>", "Docker command")
|
|
34
59
|
.option("--name <container>", "Docker container name")
|
|
35
60
|
.option("--env-file <file>", "Path to an env file for runtime secrets")
|
|
61
|
+
.option("--image", "Interpret the argument as an image reference")
|
|
36
62
|
.option("-d, --detach", "Run the container in detached mode")
|
|
37
63
|
.action(async (inputPath, options) => {
|
|
64
|
+
const runInput = resolveCommandInput(inputPath, { forceImage: options.image });
|
|
65
|
+
if (runInput.kind === "image" || (runInput.kind === "invalid" && options.image)) {
|
|
66
|
+
throw new SpawnfileError("validation_error", `Image-mode run is not supported. Deploy the image with: ` +
|
|
67
|
+
`spawnfile up ${inputPath} --auth-profile <profile> ` +
|
|
68
|
+
"(add --env-file for any extra secrets; image deployments always detach).");
|
|
69
|
+
}
|
|
70
|
+
if (runInput.kind === "invalid") {
|
|
71
|
+
throw new SpawnfileError("validation_error", `Cannot resolve "${inputPath}" as a project path or image reference. ` +
|
|
72
|
+
"Pass a project directory, a Spawnfile path, or an image like 'name:tag' (use --image to force image mode).");
|
|
73
|
+
}
|
|
38
74
|
const result = await handlers.runProject(inputPath, {
|
|
39
75
|
authProfile: options.authProfile,
|
|
40
76
|
containerName: options.name,
|
|
41
77
|
detach: options.detach,
|
|
78
|
+
deploymentName: options.deployment,
|
|
42
79
|
dockerCommand: options.dockerCommand,
|
|
80
|
+
dockerContext: options.context,
|
|
43
81
|
envFilePath: options.envFile,
|
|
44
82
|
imageTag: options.tag,
|
|
45
83
|
outputDirectory: options.out
|
|
@@ -50,21 +88,83 @@ export const registerLifecycleCommands = (program, handlers, streams) => {
|
|
|
50
88
|
}
|
|
51
89
|
});
|
|
52
90
|
program
|
|
53
|
-
.command("
|
|
91
|
+
.command("publish")
|
|
92
|
+
.description("Compile, build, verify, and push the organization image to a registry")
|
|
54
93
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
94
|
+
.requiredOption("-t, --tag <image>", "Registry image reference to push")
|
|
95
|
+
.option("-o, --out <directory>", "Output directory")
|
|
96
|
+
.option("--docker-command <command>", "Docker command")
|
|
97
|
+
.action(async (inputPath, options) => {
|
|
98
|
+
const publishInput = resolveCommandInput(inputPath);
|
|
99
|
+
if (publishInput.kind !== "project") {
|
|
100
|
+
throw new SpawnfileError("validation_error", "publish operates on a project path, not an image reference");
|
|
101
|
+
}
|
|
102
|
+
const result = await handlers.publishProject(inputPath, {
|
|
103
|
+
dockerCommand: options.dockerCommand,
|
|
104
|
+
imageTag: options.tag,
|
|
105
|
+
outputDirectory: options.out
|
|
106
|
+
});
|
|
107
|
+
streams.stdout(`published ${result.imageTag}`);
|
|
108
|
+
streams.stdout(`digest: ${result.digest ?? "unknown"}`);
|
|
109
|
+
streams.stdout(`next: spawnfile up ${result.imageTag} --detach --auth-profile <profile>`);
|
|
110
|
+
});
|
|
111
|
+
program
|
|
112
|
+
.command("up")
|
|
113
|
+
.description("Deploy an organization from a project or a published image reference")
|
|
114
|
+
.argument("[path]", "Project directory, Spawnfile path, or image reference", process.cwd())
|
|
55
115
|
.option("-o, --out <directory>", "Output directory")
|
|
56
116
|
.option("-t, --tag <image>", "Docker image tag")
|
|
57
117
|
.option("--auth-profile <name>", "Local Spawnfile auth profile")
|
|
118
|
+
.option("--context <name>", "Docker context for the deployment target")
|
|
119
|
+
.option("--deployment <name>", "Detached deployment record name")
|
|
58
120
|
.option("--docker-command <command>", "Docker command")
|
|
59
121
|
.option("--name <container>", "Docker container name")
|
|
60
122
|
.option("--env-file <file>", "Path to an env file for runtime secrets")
|
|
123
|
+
.option("--image", "Interpret the argument as an image reference")
|
|
124
|
+
.option("--pull", "Pull the image before deploying")
|
|
61
125
|
.option("-d, --detach", "Run the container in detached mode")
|
|
62
126
|
.action(async (inputPath, options) => {
|
|
127
|
+
const upInput = resolveCommandInput(inputPath, { forceImage: options.image });
|
|
128
|
+
if (upInput.kind === "invalid") {
|
|
129
|
+
throw new SpawnfileError("validation_error", `Cannot resolve "${inputPath}" as a project path or image reference. ` +
|
|
130
|
+
"Pass a project directory, a Spawnfile path, or an image like 'name:tag' (use --image to force image mode).");
|
|
131
|
+
}
|
|
132
|
+
if (upInput.kind === "image") {
|
|
133
|
+
const [authProfile, envFileEnv] = await Promise.all([
|
|
134
|
+
resolveAuthProfileForImage(handlers, options.authProfile),
|
|
135
|
+
readRunEnvFile(options.envFile)
|
|
136
|
+
]);
|
|
137
|
+
const consumed = await handlers.consumeImageUp(upInput.ref, {
|
|
138
|
+
authProfile,
|
|
139
|
+
authProfileName: options.authProfile ?? null,
|
|
140
|
+
authValues: authProfile?.env ?? {},
|
|
141
|
+
deploymentName: options.deployment,
|
|
142
|
+
dockerCommand: options.dockerCommand,
|
|
143
|
+
dockerContext: options.context,
|
|
144
|
+
envFileEnv,
|
|
145
|
+
envFilePath: options.envFile ?? null,
|
|
146
|
+
pull: options.pull
|
|
147
|
+
});
|
|
148
|
+
if (consumed.previous) {
|
|
149
|
+
const newDigest = consumed.record.source.kind === "image" ? consumed.record.source.digest : null;
|
|
150
|
+
streams.stdout(formatRedeploySummary(consumed.previous, consumed.imageRef, newDigest));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
streams.stdout(`deployed image ${consumed.imageRef}`);
|
|
154
|
+
}
|
|
155
|
+
streams.stdout(`deployment: ${consumed.deploymentName}`);
|
|
156
|
+
streams.stdout(`running container ${consumed.containerName}`);
|
|
157
|
+
streams.stdout(`record: ${consumed.recordPath}`);
|
|
158
|
+
streams.stdout(`next: spawnfile status --deployment ${consumed.deploymentName} --live`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
63
161
|
const result = await handlers.upProject(inputPath, {
|
|
64
162
|
authProfile: options.authProfile,
|
|
65
163
|
containerName: options.name,
|
|
66
164
|
detach: options.detach,
|
|
165
|
+
deploymentName: options.deployment,
|
|
67
166
|
dockerCommand: options.dockerCommand,
|
|
167
|
+
dockerContext: options.context,
|
|
68
168
|
envFilePath: options.envFile,
|
|
69
169
|
imageTag: options.tag,
|
|
70
170
|
outputDirectory: options.out
|
|
@@ -4,6 +4,7 @@ export const registerModelCommands = (program, handlers, streams) => {
|
|
|
4
4
|
.description("Edit primary and fallback model declarations");
|
|
5
5
|
modelCommand
|
|
6
6
|
.command("set")
|
|
7
|
+
.description("Set an agent's primary model")
|
|
7
8
|
.argument("<provider>", "Model provider")
|
|
8
9
|
.argument("<name>", "Model name")
|
|
9
10
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
@@ -29,6 +30,7 @@ export const registerModelCommands = (program, handlers, streams) => {
|
|
|
29
30
|
});
|
|
30
31
|
modelCommand
|
|
31
32
|
.command("add-fallback")
|
|
33
|
+
.description("Append a fallback model to an agent")
|
|
32
34
|
.argument("<provider>", "Model provider")
|
|
33
35
|
.argument("<name>", "Model name")
|
|
34
36
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
@@ -54,6 +56,7 @@ export const registerModelCommands = (program, handlers, streams) => {
|
|
|
54
56
|
});
|
|
55
57
|
modelCommand
|
|
56
58
|
.command("clear-fallbacks")
|
|
59
|
+
.description("Remove all fallback models from an agent")
|
|
57
60
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
58
61
|
.option("--recursive", "Update the target project and its descendants")
|
|
59
62
|
.action(async (inputPath, options) => {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type CommandInput = {
|
|
2
|
+
kind: "project";
|
|
3
|
+
path: string;
|
|
4
|
+
} | {
|
|
5
|
+
kind: "image";
|
|
6
|
+
ref: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "invalid";
|
|
9
|
+
value: string;
|
|
10
|
+
};
|
|
11
|
+
export interface ResolveCommandInputOptions {
|
|
12
|
+
forceImage?: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolves a positional argument that may be a project path or an image
|
|
16
|
+
* reference. An existing directory or file always wins unless --image forces
|
|
17
|
+
* image mode. Implicit image refs require a tag, digest, or registry component.
|
|
18
|
+
*/
|
|
19
|
+
export declare const resolveCommandInput: (value: string, options?: ResolveCommandInputOptions) => CommandInput;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseImplicitImageReference } from "../distribution/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a positional argument that may be a project path or an image
|
|
6
|
+
* reference. An existing directory or file always wins unless --image forces
|
|
7
|
+
* image mode. Implicit image refs require a tag, digest, or registry component.
|
|
8
|
+
*/
|
|
9
|
+
export const resolveCommandInput = (value, options = {}) => {
|
|
10
|
+
if (!options.forceImage) {
|
|
11
|
+
const resolved = path.resolve(value);
|
|
12
|
+
if (existsSync(resolved)) {
|
|
13
|
+
return { kind: "project", path: value };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (options.forceImage) {
|
|
17
|
+
// --image accepts Docker's full reference grammar, including bare names.
|
|
18
|
+
return { kind: "image", ref: value };
|
|
19
|
+
}
|
|
20
|
+
const parsed = parseImplicitImageReference(value);
|
|
21
|
+
if (parsed) {
|
|
22
|
+
return { kind: "image", ref: value };
|
|
23
|
+
}
|
|
24
|
+
return { kind: "invalid", value };
|
|
25
|
+
};
|
package/dist/cli/runCli.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { importClaudeCodeAuth, importCodexAuth, importEnvFile, requireAuthProfile } from "../auth/index.js";
|
|
2
|
-
import { addAgentProject, addProjectSurface, addProjectModelFallback, addSubagentProject, addTeamProject, buildOrganizationView, buildCompilePlan, buildProject, clearProjectModelFallbacks, compileProject, initProject, upProject, removeProjectSurface, runProject, setProjectPrimaryModel, setProjectRuntime, setProjectSurfaceAccess, showProjectSurfaces, syncProjectAuth } from "../compiler/index.js";
|
|
2
|
+
import { addAgentProject, addProjectSurface, addProjectModelFallback, addSubagentProject, addTeamProject, buildOrganizationView, buildCompilePlan, buildProject, clearProjectModelFallbacks, compileProject, initProject, publishProject, upProject, removeProjectSurface, runProject, setProjectPrimaryModel, setProjectRuntime, setProjectSurfaceAccess, showProjectSurfaces, syncProjectAuth } from "../compiler/index.js";
|
|
3
|
+
import { consumeImageUp } from "../distribution/index.js";
|
|
3
4
|
import { listRuntimeAdapters } from "../runtime/index.js";
|
|
4
5
|
export interface CliStreams {
|
|
5
6
|
stderr: (message: string) => void;
|
|
@@ -15,6 +16,7 @@ export interface CliHandlers {
|
|
|
15
16
|
buildOrganizationView: typeof buildOrganizationView;
|
|
16
17
|
buildProject: typeof buildProject;
|
|
17
18
|
compileProject: typeof compileProject;
|
|
19
|
+
publishProject: typeof publishProject;
|
|
18
20
|
addAgentProject: typeof addAgentProject;
|
|
19
21
|
addProjectModelFallback: typeof addProjectModelFallback;
|
|
20
22
|
addProjectSurface: typeof addProjectSurface;
|
|
@@ -30,6 +32,7 @@ export interface CliHandlers {
|
|
|
30
32
|
requireAuthProfile: typeof requireAuthProfile;
|
|
31
33
|
runProject: typeof runProject;
|
|
32
34
|
upProject: typeof upProject;
|
|
35
|
+
consumeImageUp: typeof consumeImageUp;
|
|
33
36
|
setProjectPrimaryModel: typeof setProjectPrimaryModel;
|
|
34
37
|
setProjectRuntime: typeof setProjectRuntime;
|
|
35
38
|
setProjectSurfaceAccess: typeof setProjectSurfaceAccess;
|
package/dist/cli/runCli.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { importClaudeCodeAuth, importCodexAuth, importEnvFile, requireAuthProfile } from "../auth/index.js";
|
|
4
|
-
import { addAgentProject, addProjectSurface, addProjectModelFallback, addSubagentProject, addTeamProject, buildOrganizationView, buildCompilePlan, buildProject, clearProjectModelFallbacks, compileProject, initProject, upProject, removeProjectSurface, runProject, setProjectPrimaryModel, setProjectRuntime, setProjectSurfaceAccess, showProjectSurfaces, syncProjectAuth } from "../compiler/index.js";
|
|
5
|
-
import {
|
|
4
|
+
import { addAgentProject, addProjectSurface, addProjectModelFallback, addSubagentProject, addTeamProject, buildOrganizationView, buildCompilePlan, buildProject, clearProjectModelFallbacks, compileProject, initProject, publishProject, upProject, removeProjectSurface, runProject, setProjectPrimaryModel, setProjectRuntime, setProjectSurfaceAccess, showProjectSurfaces, syncProjectAuth } from "../compiler/index.js";
|
|
5
|
+
import { consumeImageUp } from "../distribution/index.js";
|
|
6
|
+
import { errorExitCode, isSpawnfileError } from "../shared/index.js";
|
|
6
7
|
import { listRuntimeAdapters } from "../runtime/index.js";
|
|
7
8
|
import { registerLifecycleCommands } from "./lifecycleCommands.js";
|
|
8
9
|
import { registerModelCommands } from "./modelCommands.js";
|
|
9
10
|
import { registerRuntimeCommands } from "./runtimeCommands.js";
|
|
10
11
|
import { registerSurfaceCommands } from "./surfaceCommands.js";
|
|
12
|
+
import { registerStatusCommand } from "./statusCommand.js";
|
|
11
13
|
import { registerViewCommand } from "./viewCommand.js";
|
|
12
14
|
const packageJsonPath = new URL("../../package.json", import.meta.url);
|
|
13
15
|
const readPackageVersion = () => {
|
|
@@ -24,12 +26,12 @@ const createDefaultRenderEnvironment = () => ({
|
|
|
24
26
|
stdoutIsTty: process.stdout.isTTY === true
|
|
25
27
|
});
|
|
26
28
|
const createDefaultHandlers = () => ({
|
|
27
|
-
buildCompilePlan, buildOrganizationView, buildProject, compileProject,
|
|
29
|
+
buildCompilePlan, buildOrganizationView, buildProject, compileProject, publishProject,
|
|
28
30
|
addAgentProject, addProjectModelFallback, addProjectSurface,
|
|
29
31
|
addSubagentProject, addTeamProject, clearProjectModelFallbacks,
|
|
30
32
|
importClaudeCodeAuth, importCodexAuth, importEnvFile,
|
|
31
33
|
initProject, listRuntimeAdapters, removeProjectSurface, requireAuthProfile,
|
|
32
|
-
runProject, setProjectPrimaryModel, setProjectRuntime, upProject,
|
|
34
|
+
runProject, setProjectPrimaryModel, setProjectRuntime, upProject, consumeImageUp,
|
|
33
35
|
setProjectSurfaceAccess, showProjectSurfaces, syncProjectAuth
|
|
34
36
|
});
|
|
35
37
|
const isCliStreams = (value) => {
|
|
@@ -62,6 +64,16 @@ const isCommanderError = (error) => {
|
|
|
62
64
|
&& candidate.code.startsWith("commander.")
|
|
63
65
|
&& typeof candidate.exitCode === "number";
|
|
64
66
|
};
|
|
67
|
+
const formatCliErrorMessage = (error) => {
|
|
68
|
+
if (isSpawnfileError(error)) {
|
|
69
|
+
// Surface the human message only; the internal code is not user-facing.
|
|
70
|
+
return error.message;
|
|
71
|
+
}
|
|
72
|
+
if (error instanceof Error) {
|
|
73
|
+
return error.message;
|
|
74
|
+
}
|
|
75
|
+
return String(error);
|
|
76
|
+
};
|
|
65
77
|
const formatPlanSummary = (plan) => [
|
|
66
78
|
`root: ${plan.root}`,
|
|
67
79
|
`nodes: ${plan.nodes.length}`,
|
|
@@ -82,6 +94,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
82
94
|
const cliOptions = normalizeRunCliOptions(optionsOrStreams, handlerOverrides);
|
|
83
95
|
const streams = cliOptions.streams;
|
|
84
96
|
const handlers = { ...createDefaultHandlers(), ...cliOptions.handlers };
|
|
97
|
+
let commandExitCode = 0;
|
|
85
98
|
const program = new Command();
|
|
86
99
|
program.name("spawnfile").description("Spawnfile v0.1 compiler").version(readPackageVersion());
|
|
87
100
|
program.exitOverride();
|
|
@@ -93,6 +106,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
93
106
|
registerLifecycleCommands(program, handlers, streams);
|
|
94
107
|
program
|
|
95
108
|
.command("init")
|
|
109
|
+
.description("Scaffold a new Spawnfile project or team in a directory")
|
|
96
110
|
.argument("[path]", "Directory to initialize", process.cwd())
|
|
97
111
|
.option("--team", "Initialize a team project")
|
|
98
112
|
.option("--runtime <name>", "Runtime for agent scaffolds")
|
|
@@ -108,6 +122,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
108
122
|
const addCommand = program.command("add").description("Add children to an existing Spawnfile project");
|
|
109
123
|
addCommand
|
|
110
124
|
.command("agent")
|
|
125
|
+
.description("Add an agent member to a team project")
|
|
111
126
|
.argument("<id>", "Agent member id")
|
|
112
127
|
.argument("[path]", "Team project directory or Spawnfile path", process.cwd())
|
|
113
128
|
.option("--runtime <name>", "Runtime for the new agent member")
|
|
@@ -122,6 +137,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
122
137
|
});
|
|
123
138
|
addCommand
|
|
124
139
|
.command("subagent")
|
|
140
|
+
.description("Add a subagent to an agent project")
|
|
125
141
|
.argument("<id>", "Subagent id")
|
|
126
142
|
.argument("[path]", "Agent project directory or Spawnfile path", process.cwd())
|
|
127
143
|
.action(async (id, inputPath) => {
|
|
@@ -134,6 +150,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
134
150
|
});
|
|
135
151
|
addCommand
|
|
136
152
|
.command("team")
|
|
153
|
+
.description("Add a nested team to a team project")
|
|
137
154
|
.argument("<id>", "Nested team id")
|
|
138
155
|
.argument("[path]", "Team project directory or Spawnfile path", process.cwd())
|
|
139
156
|
.action(async (id, inputPath) => {
|
|
@@ -147,9 +164,13 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
147
164
|
registerModelCommands(program, handlers, streams);
|
|
148
165
|
registerRuntimeCommands(program, handlers, streams);
|
|
149
166
|
registerSurfaceCommands(program, handlers, streams);
|
|
167
|
+
registerStatusCommand(program, handlers, streams, (exitCode) => {
|
|
168
|
+
commandExitCode = exitCode;
|
|
169
|
+
});
|
|
150
170
|
registerViewCommand(program, handlers, streams, cliOptions.renderEnvironment);
|
|
151
171
|
program
|
|
152
172
|
.command("validate")
|
|
173
|
+
.description("Validate a Spawnfile and report the resolved compile plan")
|
|
153
174
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
154
175
|
.action(async (inputPath) => {
|
|
155
176
|
const plan = await handlers.buildCompilePlan(inputPath);
|
|
@@ -170,6 +191,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
170
191
|
.description("Import auth material into a local auth profile");
|
|
171
192
|
authImportCommand
|
|
172
193
|
.command("env")
|
|
194
|
+
.description("Import secrets from an env file into a profile")
|
|
173
195
|
.argument("<file>", "Path to an env file")
|
|
174
196
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
175
197
|
.action(async (filePath, options) => {
|
|
@@ -178,6 +200,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
178
200
|
});
|
|
179
201
|
authImportCommand
|
|
180
202
|
.command("claude-code")
|
|
203
|
+
.description("Import Claude Code subscription credentials into a profile")
|
|
181
204
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
182
205
|
.option("--from <directory>", "Source Claude Code config directory")
|
|
183
206
|
.action(async (options) => {
|
|
@@ -186,6 +209,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
186
209
|
});
|
|
187
210
|
authImportCommand
|
|
188
211
|
.command("codex")
|
|
212
|
+
.description("Import Codex subscription credentials into a profile")
|
|
189
213
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
190
214
|
.option("--from <directory>", "Source Codex config directory")
|
|
191
215
|
.action(async (options) => {
|
|
@@ -194,6 +218,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
194
218
|
});
|
|
195
219
|
authCommand
|
|
196
220
|
.command("sync")
|
|
221
|
+
.description("Provision auth material a project requires into a profile")
|
|
197
222
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
198
223
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
199
224
|
.option("--env-file <file>", "Path to an env file with model keys and runtime secrets")
|
|
@@ -210,6 +235,7 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
210
235
|
});
|
|
211
236
|
authCommand
|
|
212
237
|
.command("show")
|
|
238
|
+
.description("Show the contents of a local auth profile")
|
|
213
239
|
.option("-p, --profile <name>", "Auth profile name", "default")
|
|
214
240
|
.action(async (options) => {
|
|
215
241
|
const profile = await handlers.requireAuthProfile(options.profile);
|
|
@@ -217,18 +243,16 @@ export const runCli = async (argv, optionsOrStreams, handlerOverrides = {}) => {
|
|
|
217
243
|
});
|
|
218
244
|
try {
|
|
219
245
|
await program.parseAsync(argv, { from: "user" });
|
|
220
|
-
return
|
|
246
|
+
return commandExitCode;
|
|
221
247
|
}
|
|
222
248
|
catch (error) {
|
|
223
249
|
if (isCommanderError(error)) {
|
|
224
|
-
|
|
250
|
+
// Commander prints its own usage message; usage errors exit 2.
|
|
251
|
+
return error.exitCode === 0 ? 0 : 2;
|
|
225
252
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
: String(error);
|
|
231
|
-
streams.stderr(message);
|
|
232
|
-
return 1;
|
|
253
|
+
streams.stderr(`error: ${formatCliErrorMessage(error)}`);
|
|
254
|
+
// Usage/input errors exit 2; runtime failures exit 1, matching the
|
|
255
|
+
// documented status exit-code contract across all commands.
|
|
256
|
+
return errorExitCode(error);
|
|
233
257
|
}
|
|
234
258
|
};
|
|
@@ -4,6 +4,7 @@ export const registerRuntimeCommands = (program, handlers, streams) => {
|
|
|
4
4
|
.description("Edit runtime declarations");
|
|
5
5
|
runtimeCommand
|
|
6
6
|
.command("set")
|
|
7
|
+
.description("Set an agent's runtime binding")
|
|
7
8
|
.argument("<name>", "Runtime name")
|
|
8
9
|
.argument("[path]", "Project directory or Spawnfile path", process.cwd())
|
|
9
10
|
.option("--recursive", "Update the target project and its descendants")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { inspectDockerDeployment } from "../deployment/index.js";
|
|
3
|
+
import { collectDeploymentLogObservations, collectMoltnetProbeObservations, collectRuntimeProbeObservations, type StatusCommandResult, type StatusExitCode } from "../status/index.js";
|
|
4
|
+
import type { CliHandlers, CliStreams } from "./runCli.js";
|
|
5
|
+
type StatusCommandHandlers = Pick<CliHandlers, "buildOrganizationView"> & Partial<Pick<CliHandlers, "requireAuthProfile">>;
|
|
6
|
+
type StatusCommandLiveHandlers = {
|
|
7
|
+
collectDeploymentLogObservations?: typeof collectDeploymentLogObservations;
|
|
8
|
+
collectMoltnetProbeObservations?: typeof collectMoltnetProbeObservations;
|
|
9
|
+
collectRuntimeProbeObservations?: typeof collectRuntimeProbeObservations;
|
|
10
|
+
inspectDockerDeployment?: typeof inspectDockerDeployment;
|
|
11
|
+
};
|
|
12
|
+
type StatusCommandHandlersWithLive = StatusCommandHandlers & StatusCommandLiveHandlers;
|
|
13
|
+
export interface StatusCommandOptions {
|
|
14
|
+
agent?: string;
|
|
15
|
+
context?: string;
|
|
16
|
+
deployment?: string;
|
|
17
|
+
dockerCommand?: string;
|
|
18
|
+
image?: boolean;
|
|
19
|
+
json?: boolean;
|
|
20
|
+
live?: boolean;
|
|
21
|
+
logs?: boolean;
|
|
22
|
+
network?: string;
|
|
23
|
+
out?: string;
|
|
24
|
+
pretty?: boolean;
|
|
25
|
+
pull?: boolean;
|
|
26
|
+
pullCheck?: boolean;
|
|
27
|
+
quiet?: boolean;
|
|
28
|
+
recover?: boolean;
|
|
29
|
+
runtime?: string;
|
|
30
|
+
team?: string;
|
|
31
|
+
timeout?: string;
|
|
32
|
+
watch?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface StatusWatchOptions {
|
|
35
|
+
intervalMs?: number;
|
|
36
|
+
iterations?: number;
|
|
37
|
+
sleep?: (ms: number) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
export declare const executeStatusWatch: (inputPath: string, options: StatusCommandOptions, handlers: StatusCommandHandlersWithLive, streams: CliStreams, setExitCode: (exitCode: StatusExitCode) => void, watchOptions?: StatusWatchOptions) => Promise<void>;
|
|
40
|
+
export declare const executeStatusCommand: (inputPath: string, options: StatusCommandOptions, handlers: StatusCommandHandlersWithLive) => Promise<StatusCommandResult>;
|
|
41
|
+
export declare const registerStatusCommand: (program: Command, handlers: CliHandlers, streams: CliStreams, setExitCode: (exitCode: StatusExitCode) => void) => void;
|
|
42
|
+
export {};
|