@t4h.framework/cli 0.0.0-experimental-2f9c297 → 0.0.0-experimental-20261009202408

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/bin/bin.js +1 -20
  3. package/dist/bin/bin.js.map +1 -1
  4. package/dist/commands/ai/ai-bootstrap.js +48 -184
  5. package/dist/commands/ai/ai-bootstrap.js.map +1 -1
  6. package/dist/commands/build/build.js +2 -6
  7. package/dist/commands/build/build.js.map +1 -1
  8. package/dist/commands/dev/dev.js +1 -8
  9. package/dist/commands/dev/dev.js.map +1 -1
  10. package/package.json +2 -11
  11. package/LICENSE +0 -21
  12. package/dist/commands/ai/ai-hook.js +0 -84
  13. package/dist/commands/ai/ai-hook.js.map +0 -1
  14. package/dist/commands/ai/tools/agent-instructions.js +0 -75
  15. package/dist/commands/ai/tools/agent-instructions.js.map +0 -1
  16. package/dist/commands/ai/tools/agent-settings.js +0 -61
  17. package/dist/commands/ai/tools/agent-settings.js.map +0 -1
  18. package/dist/commands/ai/tools/assets-lock.js +0 -34
  19. package/dist/commands/ai/tools/assets-lock.js.map +0 -1
  20. package/dist/commands/check/check.js +0 -185
  21. package/dist/commands/check/check.js.map +0 -1
  22. package/dist/commands/mcp/mcp-server.js +0 -235
  23. package/dist/commands/mcp/mcp-server.js.map +0 -1
  24. package/dist/commands/mcp/mcp-tools.js +0 -283
  25. package/dist/commands/mcp/mcp-tools.js.map +0 -1
  26. package/dist/commands/mcp/mcp.js +0 -71
  27. package/dist/commands/mcp/mcp.js.map +0 -1
  28. package/dist/commands/runtime/runtime.js +0 -143
  29. package/dist/commands/runtime/runtime.js.map +0 -1
  30. package/dist/commands/workflows/workflows.js +0 -166
  31. package/dist/commands/workflows/workflows.js.map +0 -1
  32. package/dist/tools/debug-log-option.js +0 -13
  33. package/dist/tools/debug-log-option.js.map +0 -1
  34. package/dist/tools/dev-server-client.js +0 -261
  35. package/dist/tools/dev-server-client.js.map +0 -1
  36. package/dist/tools/load-dev.js +0 -23
  37. package/dist/tools/load-dev.js.map +0 -1
  38. package/dist/tools/project-package.js +0 -67
  39. package/dist/tools/project-package.js.map +0 -1
  40. package/dist/tools/project-scripts.js +0 -53
  41. package/dist/tools/project-scripts.js.map +0 -1
@@ -1,283 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { DEV_SERVER_PAGE_LIMIT, findDevServer, isWaitingActivity, readDevRun, runOnDevServer, traceDevRun, } from '../../tools/dev-server-client.js';
4
- import { loadDev } from '../../tools/load-dev.js';
5
- import { DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS, WorkflowsError, } from '../workflows/workflows.js';
6
- const NO_DEV_SERVER_MESSAGE = 'No dev server is running for this project; start it with `framework dev` (in another terminal or in the background) and retry';
7
- const DEFAULT_LIST_LIMIT = 20;
8
- const limitSchema = (what) => ({
9
- type: 'integer',
10
- minimum: 1,
11
- maximum: DEV_SERVER_PAGE_LIMIT,
12
- description: `How many ${what} to return, newest first (default ${DEFAULT_LIST_LIMIT}, max ${DEV_SERVER_PAGE_LIMIT})`,
13
- });
14
- const toRealPath = (dir) => {
15
- try {
16
- return fs.realpathSync(dir);
17
- }
18
- catch {
19
- return path.resolve(dir);
20
- }
21
- };
22
- /** Builds and runs one headless app at a time: they share the build dir. */
23
- function createHeadlessRunner({ projectDir, entrypoint, readEnv, }) {
24
- let queue = Promise.resolve();
25
- return (use) => {
26
- const next = queue.then(async () => {
27
- const { HeadlessApp } = await loadDev(projectDir, ['HeadlessApp']);
28
- const app = await HeadlessApp.up({ entrypoint, env: readEnv() });
29
- try {
30
- return await use(app);
31
- }
32
- finally {
33
- await app.down().catch(() => { });
34
- }
35
- });
36
- queue = next.catch(() => { });
37
- return next;
38
- };
39
- }
40
- export function createMcpTools(context) {
41
- const { projectDir } = context;
42
- const lookUpDevServer = context.findDevServer ?? findDevServer;
43
- const withHeadlessApp = createHeadlessRunner(context);
44
- const requireDevServer = async () => {
45
- const server = await lookUpDevServer(projectDir);
46
- if (!server)
47
- throw new WorkflowsError(NO_DEV_SERVER_MESSAGE, undefined, null);
48
- return server;
49
- };
50
- /** The manifest workflows, from the dev server when it runs. */
51
- const readWorkflows = async () => {
52
- const server = await lookUpDevServer(projectDir);
53
- if (server)
54
- return {
55
- source: 'dev',
56
- workflows: (await server.client.manifest()).workflows,
57
- };
58
- return withHeadlessApp(async (app) => ({
59
- source: 'headless',
60
- workflows: app.workflows,
61
- }));
62
- };
63
- return [
64
- {
65
- name: 'list_workflows',
66
- description: 'List the workflows of the app (id and description). Reads the running dev server, else builds the project headless (slower).',
67
- inputSchema: { type: 'object', properties: {} },
68
- async call() {
69
- const { source, workflows } = await readWorkflows();
70
- return {
71
- source,
72
- workflows: workflows.map(({ id, description }) => ({
73
- id,
74
- description,
75
- })),
76
- };
77
- },
78
- },
79
- {
80
- name: 'describe_workflow',
81
- description: 'Describe one workflow: its description and the JSON Schema its input must match. Call it before run_workflow to build a valid input.',
82
- inputSchema: {
83
- type: 'object',
84
- properties: {
85
- workflow: { type: 'string', description: 'Workflow id' },
86
- },
87
- required: ['workflow'],
88
- },
89
- async call({ workflow: workflowId }) {
90
- const { source, workflows } = await readWorkflows();
91
- const workflow = workflows.find(({ id }) => id === workflowId);
92
- if (!workflow)
93
- throw new WorkflowsError(`Workflow not found: ${workflowId}`, 404, {
94
- workflows: workflows.map(({ id }) => id),
95
- });
96
- return { source, workflow };
97
- },
98
- },
99
- {
100
- name: 'run_workflow',
101
- description: [
102
- 'Start a workflow run and (by default) wait until it settles or timeoutMs elapses.',
103
- 'mode "dev" runs on the running `framework dev`: the run, its sleeping activities and child runs survive the call, so you can follow it with get_run, list_waiting_activities and advance_activity.',
104
- 'mode "headless" builds the project and runs it in a throwaway runtime that stops when the call returns (sleeping children are killed).',
105
- 'Default: dev if a dev server is running, else headless.',
106
- 'Returns { mode, run: { id, status: running|fulfilled|rejected, input, output }, timedOut, waiting: async activities still pending, trace? }.',
107
- ].join(' '),
108
- inputSchema: {
109
- type: 'object',
110
- properties: {
111
- workflow: { type: 'string', description: 'Workflow id' },
112
- input: {
113
- description: 'Workflow input (any JSON), validated against the workflow schema (see describe_workflow)',
114
- },
115
- mode: {
116
- type: 'string',
117
- enum: ['dev', 'headless'],
118
- description: 'Where to run (default: dev if running, else headless)',
119
- },
120
- wait: {
121
- type: 'boolean',
122
- description: 'Wait for the run to settle (default true). false returns right after the start; dev mode only',
123
- },
124
- timeoutMs: {
125
- type: 'integer',
126
- minimum: 0,
127
- description: `Stop waiting after this many ms (default ${DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS}); in dev mode the run keeps going`,
128
- },
129
- trace: {
130
- type: 'boolean',
131
- description: 'Add the activities (input/output), logs and child runs to the result',
132
- },
133
- },
134
- required: ['workflow'],
135
- },
136
- async call({ workflow, input, mode, wait = true, timeoutMs, trace }) {
137
- const workflowId = workflow;
138
- const server = await lookUpDevServer(projectDir);
139
- const runMode = mode ??
140
- (server ? 'dev' : 'headless');
141
- const options = {
142
- timeoutInMs: timeoutMs ??
143
- DEFAULT_WORKFLOW_RUN_TIMEOUT_IN_MS,
144
- trace: trace === true,
145
- };
146
- if (runMode === 'headless') {
147
- if (wait === false)
148
- throw new WorkflowsError('wait: false needs mode "dev": a headless runtime stops when the call returns', 400, null);
149
- return {
150
- mode: runMode,
151
- ...(await withHeadlessApp(app => app.run(workflowId, input, options))),
152
- };
153
- }
154
- if (!server)
155
- throw new WorkflowsError(NO_DEV_SERVER_MESSAGE, undefined, null);
156
- if (wait === false) {
157
- const { id } = await server.client.startRun(workflowId, input);
158
- const { run, waiting, trace: runTrace, } = await readDevRun(server.client, id, { trace: options.trace });
159
- return { mode: runMode, run, waiting, trace: runTrace };
160
- }
161
- return {
162
- mode: runMode,
163
- ...(await runOnDevServer(server.client, workflowId, input, options)),
164
- };
165
- },
166
- },
167
- {
168
- name: 'get_run',
169
- description: 'Read a run of the dev server: status, input, output, the activities in the order they ran, the async activities still waiting, and the logs. trace adds each activity input/output and the child runs.',
170
- inputSchema: {
171
- type: 'object',
172
- properties: {
173
- runId: { type: 'string', description: 'Run id' },
174
- trace: {
175
- type: 'boolean',
176
- description: 'Add each activity input/output and the child runs (larger result)',
177
- },
178
- },
179
- required: ['runId'],
180
- },
181
- async call({ runId, trace }) {
182
- const { client } = await requireDevServer();
183
- const id = runId;
184
- const run = await client.findRun(id);
185
- const activities = await client.findAllActivities(id);
186
- if (trace === true)
187
- return {
188
- run,
189
- waiting: activities.filter(isWaitingActivity),
190
- ...(await traceDevRun(client, id, activities)),
191
- };
192
- return {
193
- run,
194
- activities,
195
- waiting: activities.filter(isWaitingActivity),
196
- logs: await client.findAllLogs(id),
197
- };
198
- },
199
- },
200
- {
201
- name: 'list_runs',
202
- description: 'List the runs of the dev server, newest first (id, workflow, status, dates). Filter by workflow id.',
203
- inputSchema: {
204
- type: 'object',
205
- properties: {
206
- workflow: {
207
- type: 'string',
208
- description: 'Only runs of this workflow id',
209
- },
210
- limit: limitSchema('runs'),
211
- },
212
- },
213
- async call({ workflow, limit }) {
214
- const { client } = await requireDevServer();
215
- return client.findRuns({
216
- workflow: workflow,
217
- limit: limit ?? DEFAULT_LIST_LIMIT,
218
- });
219
- },
220
- },
221
- {
222
- name: 'list_waiting_activities',
223
- description: 'List the async activities of the dev server still waiting (SleepActivity, webhook/callback, external event), newest run first: activity id, run id, workflow, type, the schema of the output it expects and timeoutAt (when a sleep would wake). Pass an id to advance_activity to fast-forward it.',
224
- inputSchema: {
225
- type: 'object',
226
- properties: { limit: limitSchema('activities') },
227
- },
228
- async call({ limit }) {
229
- const { client } = await requireDevServer();
230
- return client.findWaitingActivities({
231
- limit: limit ?? DEFAULT_LIST_LIMIT,
232
- });
233
- },
234
- },
235
- {
236
- name: 'advance_activity',
237
- description: 'Time travel on the dev server: resolve a waiting async activity now instead of waiting for its timer, callback or event. Advancing a SleepActivity wakes the run at the date it was waiting for, by the run own clock, so a cadence jumps to its next step. For callback/event activities, output is the payload they would have received (match the schema from list_waiting_activities). The run then continues asynchronously: follow it with get_run.',
238
- inputSchema: {
239
- type: 'object',
240
- properties: {
241
- activityId: {
242
- type: 'string',
243
- description: 'Activity id, from list_waiting_activities or get_run',
244
- },
245
- output: {
246
- description: 'Payload the activity resolves with (omit for SleepActivity)',
247
- },
248
- },
249
- required: ['activityId'],
250
- },
251
- async call({ activityId, output }) {
252
- const { client } = await requireDevServer();
253
- return client.advanceActivity(activityId, output);
254
- },
255
- },
256
- {
257
- name: 'runtime_status',
258
- description: 'Show the runtimes of this project running on the machine (dev server and headless) with their queue (workers, jobs queued/in flight) and the number of runs running, plus the dev server URL. Use it to check whether `framework dev` is up or a runtime is stuck.',
259
- inputSchema: { type: 'object', properties: {} },
260
- async call() {
261
- const { listRuntimes, requestRuntimeStatus } = await loadDev(projectDir, ['listRuntimes', 'requestRuntimeStatus']);
262
- const target = toRealPath(projectDir);
263
- const runtimes = (await listRuntimes()).filter((runtime) => runtime.projectDir !== null &&
264
- toRealPath(runtime.projectDir) === target);
265
- const server = await lookUpDevServer(projectDir);
266
- return {
267
- projectDir,
268
- devServer: server
269
- ? { url: server.url, pid: server.runtime.pid }
270
- : null,
271
- runtimes: await Promise.all(runtimes.map(runtime => requestRuntimeStatus(runtime).catch((error) => ({
272
- runtime,
273
- error: error instanceof Error ? error.message : String(error),
274
- })))),
275
- ...(server
276
- ? {}
277
- : { hint: 'Start the dev server with `framework dev`' }),
278
- };
279
- },
280
- },
281
- ];
282
- }
283
- //# sourceMappingURL=mcp-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../../src/commands/mcp/mcp-tools.ts"],"names":[],"mappings":"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"}
@@ -1,71 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { parseEnv } from 'node:util';
4
- import { Command, Option } from 'commander';
5
- import { McpServer } from './mcp-server.js';
6
- import { createMcpTools } from './mcp-tools.js';
7
- export const MCP_SERVER_INSTRUCTIONS = [
8
- 'Runs and inspects the workflows of a T4H Framework project.',
9
- 'Start with list_workflows, then describe_workflow for the input schema, then run_workflow.',
10
- 'With `framework dev` running, runs live on the dev server: follow them with get_run / list_runs, and fast-forward sleeps with list_waiting_activities + advance_activity.',
11
- 'Without it, run_workflow builds and runs the project headless, and the dev-only tools ask you to start `framework dev`.',
12
- ].join(' ');
13
- function readCliVersion() {
14
- try {
15
- return JSON.parse(fs.readFileSync(new URL('../../../package.json', import.meta.url), 'utf8')).version;
16
- }
17
- catch {
18
- return '0.0.0';
19
- }
20
- }
21
- /**
22
- * stdout carries the protocol only: anything else written there (the app,
23
- * a build, a stray `console.log`) goes to stderr instead.
24
- */
25
- function takeStdout() {
26
- const write = process.stdout.write.bind(process.stdout);
27
- process.stdout.write = process.stderr.write.bind(process.stderr);
28
- return chunk => write(chunk);
29
- }
30
- export const mcpCommand = new Command('mcp')
31
- .description('Serve the workflows of the project to AI agents over MCP (stdio): list, describe and run workflows, read runs, fast-forward sleeps')
32
- .addOption(new Option('--project <dir>', 'The project directory')
33
- .default(process.cwd(), 'the current directory')
34
- .argParser(value => path.resolve(process.cwd(), value)))
35
- .addOption(new Option('--entrypoint <entrypoint path>', 'The entrypoint package json path (default: <project>/package.json)').argParser(value => path.resolve(process.cwd(), value)))
36
- .addOption(new Option('-e, --env <envs..>', 'The env secrets of headless runs (NAME=value)')
37
- .argParser((value, previous) => {
38
- const index = value.indexOf('=');
39
- if (index < 1)
40
- throw new Error('Invalid secret format');
41
- return { ...previous, [value.slice(0, index)]: value.slice(index + 1) };
42
- })
43
- .default({}))
44
- .addOption(new Option('--env-file-if-exists <file-path>', 'Load the variables of headless runs from a .env file if it exists').argParser(value => path.resolve(process.cwd(), value)))
45
- .action(async (options) => {
46
- const write = takeStdout();
47
- const entrypoint = options.entrypoint ?? path.join(options.project, 'package.json');
48
- const server = new McpServer({
49
- name: 'framework',
50
- version: readCliVersion(),
51
- instructions: MCP_SERVER_INSTRUCTIONS,
52
- tools: createMcpTools({
53
- projectDir: path.dirname(entrypoint),
54
- entrypoint,
55
- readEnv: () => ({
56
- ...(options.envFileIfExists &&
57
- fs.existsSync(options.envFileIfExists)
58
- ? parseEnv(fs.readFileSync(options.envFileIfExists, 'utf8'))
59
- : {}),
60
- ...options.env,
61
- }),
62
- }),
63
- log: message => process.stderr.write(`${message}\n`),
64
- });
65
- process.once('SIGINT', () => process.exit(130));
66
- process.once('SIGTERM', () => process.exit(143));
67
- await server.serve(process.stdin, { write });
68
- // The client closed stdin: the session is over.
69
- process.exit(0);
70
- });
71
- //# sourceMappingURL=mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp/mcp.ts"],"names":[],"mappings":"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"}
@@ -1,143 +0,0 @@
1
- import path from 'node:path';
2
- import { setTimeout as sleep } from 'node:timers/promises';
3
- import { Argument, Command, Option } from 'commander';
4
- import { loadDev } from '../../tools/load-dev.js';
5
- const NEXT_RUNTIME_POLL_IN_MS = 500;
6
- /** Prints the message of an expected failure instead of a stack trace. */
7
- const failing = (action) => async (...args) => {
8
- exitWhenStdoutCloses();
9
- try {
10
- await action(...args);
11
- }
12
- catch (error) {
13
- process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
14
- process.exit(1);
15
- }
16
- };
17
- const print = (value) => process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
18
- const line = (value) => process.stdout.write(`${value}\n`);
19
- /** `framework runtime watch | head` closes stdout: stop quietly. */
20
- function exitWhenStdoutCloses() {
21
- process.stdout.on('error', error => {
22
- if (error.code === 'EPIPE')
23
- process.exit(0);
24
- throw error;
25
- });
26
- }
27
- /**
28
- * Picks the runtime of `pid`, else the one serving `projectDir`, else the only
29
- * one running. Throws with the candidates when that is ambiguous.
30
- */
31
- export function selectRuntime(runtimes, { pid, projectDir }) {
32
- if (pid !== undefined) {
33
- const runtime = runtimes.find(candidate => candidate.pid === pid);
34
- if (!runtime)
35
- throw new Error(`No runtime is running with pid ${pid}`);
36
- return runtime;
37
- }
38
- const ofProject = runtimes.filter(candidate => candidate.projectDir === projectDir);
39
- const candidates = ofProject.length ? ofProject : runtimes;
40
- if (candidates.length === 0)
41
- throw new Error('No runtime is running; start one with `framework dev` or `framework workflows <workflow> run`');
42
- if (candidates.length > 1)
43
- throw new Error(`${candidates.length} runtimes are running; pass a pid: ${candidates
44
- .map(({ pid, kind, projectDir }) => `${pid} (${kind}, ${projectDir})`)
45
- .join(', ')}`);
46
- return candidates[0];
47
- }
48
- export function formatRuntimeStatus({ runtime, queue, runs, }) {
49
- return [
50
- `runtime ${runtime.pid} (${runtime.kind}) ${runtime.projectDir ?? runtime.entrypoint}`,
51
- `workers=${queue.workers} concurrency=${queue.concurrency}`,
52
- `queue=${queue.queued} (urgent ${queue.urgent})`,
53
- `running=${queue.inFlight}/${queue.capacity}`,
54
- `runs running=${runs.running}`,
55
- ].join(' | ');
56
- }
57
- const pidArgument = () => new Argument('[pid]', 'Runtime pid (see `framework runtime ls`)').argParser(value => {
58
- const pid = Number.parseInt(value, 10);
59
- if (!Number.isInteger(pid))
60
- throw new Error('Invalid pid');
61
- return pid;
62
- });
63
- const projectOption = () => new Option('--project <dir>', 'Pick the runtime of this project when no pid is given')
64
- .default(process.cwd(), 'the current directory')
65
- .argParser(value => path.resolve(process.cwd(), value));
66
- const RUNTIME_EXPORTS = [
67
- 'formatRuntimeEvent',
68
- 'listRuntimes',
69
- 'requestRuntimeStatus',
70
- 'watchRuntime',
71
- ];
72
- /** The runtime commands talk to runtimes through the project's dev package. */
73
- const loadRuntimeDev = (projectDir) => loadDev(projectDir, RUNTIME_EXPORTS);
74
- async function waitForNextRuntime({ listRuntimes }, previous) {
75
- while (true) {
76
- const next = (await listRuntimes()).find(runtime => runtime.pid !== previous.pid &&
77
- runtime.projectDir === previous.projectDir &&
78
- runtime.parentPid === previous.parentPid);
79
- if (next)
80
- return next;
81
- await sleep(NEXT_RUNTIME_POLL_IN_MS);
82
- }
83
- }
84
- const lsCommand = new Command('ls')
85
- .description('List the runtimes running on this machine (JSON)')
86
- .action(async () => {
87
- const { listRuntimes } = await loadRuntimeDev(process.cwd());
88
- print({ runtimes: await listRuntimes() });
89
- });
90
- const statusCommand = new Command('status')
91
- .description('Print the queue, the jobs running and the runs of a runtime (JSON)')
92
- .addArgument(pidArgument())
93
- .addOption(projectOption())
94
- .action(failing(async (pid, options) => {
95
- const { listRuntimes, requestRuntimeStatus } = await loadRuntimeDev(options.project);
96
- const runtime = selectRuntime(await listRuntimes(), {
97
- pid,
98
- projectDir: options.project,
99
- });
100
- print(await requestRuntimeStatus(runtime));
101
- }));
102
- const watchCommand = new Command('watch')
103
- .description('Follow what a runtime runs: jobs, queue size, runs, activities, timeouts')
104
- .addArgument(pidArgument())
105
- .addOption(projectOption())
106
- .option('--json', 'Print NDJSON instead of readable lines', false)
107
- .option('--no-follow', 'Stop when the runtime exits instead of waiting for the next one (dev rebuilds)')
108
- .action(failing(async (pid, options) => {
109
- const dev = await loadRuntimeDev(options.project);
110
- const { formatRuntimeEvent, listRuntimes, watchRuntime } = dev;
111
- let runtime = selectRuntime(await listRuntimes(), {
112
- pid,
113
- projectDir: options.project,
114
- });
115
- const onStatus = (status) => options.json
116
- ? line(JSON.stringify({ type: 'status', ...status }))
117
- : line(formatRuntimeStatus(status));
118
- let watcher = null;
119
- process.once('SIGINT', () => {
120
- watcher?.close();
121
- process.exit(0);
122
- });
123
- while (true) {
124
- watcher = watchRuntime(runtime, {
125
- onStatus,
126
- onEvent: event => line(options.json
127
- ? JSON.stringify({ type: 'event', event })
128
- : formatRuntimeEvent(event)),
129
- });
130
- await watcher.closed.catch(() => { });
131
- if (!options.follow)
132
- return;
133
- if (!options.json)
134
- line(`runtime ${runtime.pid} exited; waiting for the next one…`);
135
- runtime = await waitForNextRuntime(dev, runtime);
136
- }
137
- }));
138
- export const runtimeCommand = new Command('runtime')
139
- .description('Inspect the runtimes started by `framework dev` and `framework workflows`')
140
- .addCommand(lsCommand)
141
- .addCommand(statusCommand)
142
- .addCommand(watchCommand);
143
- //# sourceMappingURL=runtime.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/runtime/runtime.ts"],"names":[],"mappings":"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"}