@t4h.framework/cli 0.0.0-experimental-20261006120135 → 0.0.0-experimental-20261006133319
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/CHANGELOG.md +31 -3
- package/dist/bin/bin.js +4 -0
- package/dist/bin/bin.js.map +1 -1
- package/dist/commands/dev/dev.js +4 -0
- package/dist/commands/dev/dev.js.map +1 -1
- package/dist/commands/runtime/runtime.js +131 -0
- package/dist/commands/runtime/runtime.js.map +1 -0
- package/dist/commands/workflows/workflows.js +124 -0
- package/dist/commands/workflows/workflows.js.map +1 -0
- package/dist/tools/debug-log-option.js +12 -0
- package/dist/tools/debug-log-option.js.map +1 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,39 @@
|
|
|
1
1
|
# @t4h.framework/cli
|
|
2
2
|
|
|
3
|
-
## 0.0.0-experimental-
|
|
3
|
+
## 0.0.0-experimental-20261006133319
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#208](https://github.com/tech4humans-brasil/framework/pull/208) [`c312bfb`](https://github.com/tech4humans-brasil/framework/commit/c312bfb0f1b1ddbc40d8ac0ede113c5614aa9df8) Thanks [@tony-tsx](https://github.com/tony-tsx)! - `framework workflows` lists, describes and runs the workflows of the app from
|
|
8
|
+
the terminal, without the dev server: `framework workflows <workflow> run
|
|
9
|
+
--input '<json>'` builds the project, runs the workflow, waits for it
|
|
10
|
+
(`--timeout`) and prints the run as JSON — with the activities, logs and child
|
|
11
|
+
runs under `--trace`. It exits with `0` when the run fulfills, `1` when it is
|
|
12
|
+
rejected or the command fails, and `2` on timeout, so scripts and AI agents can
|
|
13
|
+
test workflows headlessly.
|
|
14
|
+
|
|
15
|
+
`@t4h.framework/dev` exports `HeadlessApp`, the API behind it, and the app
|
|
16
|
+
process resolves its bundle root from `file:` URLs.
|
|
17
|
+
|
|
18
|
+
- [#210](https://github.com/tech4humans-brasil/framework/pull/210) [`990c074`](https://github.com/tech4humans-brasil/framework/commit/990c074af498cb7610d310e295ad613dce7a9b52) Thanks [@tony-tsx](https://github.com/tony-tsx)! - The dev runtime publishes what it runs: jobs queued, started and finished
|
|
19
|
+
(with the queue counts), runs created and settled, activities started, waiting
|
|
20
|
+
and settled (with the error of a rejected one), timeouts and lost workers.
|
|
21
|
+
- `--debug` on `framework dev` and `framework workflows <workflow> run` prints
|
|
22
|
+
those events on stderr; `--debug-log <file>` appends them to a file as NDJSON.
|
|
23
|
+
- Every app process registers itself and listens on a local socket (named pipe
|
|
24
|
+
on Windows). `framework runtime ls` lists them, `framework runtime status`
|
|
25
|
+
prints the queue, the jobs running and waiting and the runs in progress, and
|
|
26
|
+
`framework runtime watch` follows the events live (`--json` for NDJSON),
|
|
27
|
+
reconnecting across `dev` rebuilds.
|
|
28
|
+
|
|
29
|
+
`@t4h.framework/dev` exports `listRuntimes`, `requestRuntimeStatus`,
|
|
30
|
+
`watchRuntime` and `formatRuntimeEvent`, and takes `debugLog` on `Server` and
|
|
31
|
+
`HeadlessApp.up`.
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
|
6
34
|
|
|
7
|
-
- Updated dependencies [[`92db468`](https://github.com/tech4humans-brasil/framework/commit/92db468f819d3c7d01884526598acd5fbef9b4ef)]:
|
|
8
|
-
- @t4h.framework/dev@0.0.0-experimental-
|
|
35
|
+
- Updated dependencies [[`c312bfb`](https://github.com/tech4humans-brasil/framework/commit/c312bfb0f1b1ddbc40d8ac0ede113c5614aa9df8), [`92db468`](https://github.com/tech4humans-brasil/framework/commit/92db468f819d3c7d01884526598acd5fbef9b4ef), [`990c074`](https://github.com/tech4humans-brasil/framework/commit/990c074af498cb7610d310e295ad613dce7a9b52)]:
|
|
36
|
+
- @t4h.framework/dev@0.0.0-experimental-20261006133319
|
|
9
37
|
|
|
10
38
|
## 0.16.15
|
|
11
39
|
|
package/dist/bin/bin.js
CHANGED
|
@@ -5,11 +5,15 @@ import { buildCommand } from '../commands/build/build.js';
|
|
|
5
5
|
import { devCommand } from '../commands/dev/dev.js';
|
|
6
6
|
import { harnessCommand } from '../commands/harness/harness.js';
|
|
7
7
|
import { publishCommand } from '../commands/publish/publish.js';
|
|
8
|
+
import { runtimeCommand } from '../commands/runtime/runtime.js';
|
|
9
|
+
import { workflowsCommand } from '../commands/workflows/workflows.js';
|
|
8
10
|
program.addCommand(devCommand);
|
|
9
11
|
program.addCommand(publishCommand);
|
|
10
12
|
program.addCommand(buildCommand);
|
|
11
13
|
program.addCommand(AIBootstrapCommand);
|
|
12
14
|
program.addCommand(harnessCommand);
|
|
15
|
+
program.addCommand(workflowsCommand);
|
|
16
|
+
program.addCommand(runtimeCommand);
|
|
13
17
|
await program.parseAsync(process.argv);
|
|
14
18
|
process.on('uncaughtException', error => {
|
|
15
19
|
const isExitPromptError = error instanceof Error && error.name === 'ExitPromptError';
|
package/dist/bin/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAErE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC9B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACtC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;AACpC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAElC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAE;IACtC,MAAM,iBAAiB,GACrB,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAA;IAE5D,IAAI,iBAAiB;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAE7C,MAAM,KAAK,CAAA;AACb,CAAC,CAAC,CAAA"}
|
package/dist/commands/dev/dev.js
CHANGED
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { parseEnv } from 'node:util';
|
|
4
4
|
import { Server } from '@t4h.framework/dev';
|
|
5
5
|
import { Command, Option } from 'commander';
|
|
6
|
+
import { debugLogOption, debugOption, toDebugLog, } from '../../tools/debug-log-option.js';
|
|
6
7
|
export const devCommand = new Command('dev')
|
|
7
8
|
.description('Start the development server')
|
|
8
9
|
.option('--entrypoint <entrypoint path>', 'The entrypoint package json path', './package.json')
|
|
@@ -25,6 +26,8 @@ export const devCommand = new Command('dev')
|
|
|
25
26
|
.default(3000)
|
|
26
27
|
.argParser(value => Number.parseInt(value, 10)))
|
|
27
28
|
.addOption(new Option('--host <host>', 'The HTTP host').default('localhost'))
|
|
29
|
+
.addOption(debugOption())
|
|
30
|
+
.addOption(debugLogOption())
|
|
28
31
|
.action(async (options) => {
|
|
29
32
|
if (options.envFileIfExists && fs.existsSync(options.envFileIfExists))
|
|
30
33
|
Object.assign(options.env, parseEnv(fs.readFileSync(options.envFileIfExists, 'utf8')));
|
|
@@ -33,6 +36,7 @@ export const devCommand = new Command('dev')
|
|
|
33
36
|
env: options.env,
|
|
34
37
|
port: options.port,
|
|
35
38
|
host: options.host,
|
|
39
|
+
debugLog: toDebugLog(options),
|
|
36
40
|
});
|
|
37
41
|
const shutdown = (code) => {
|
|
38
42
|
server.down().finally(() => process.exit(code));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/dev/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/dev/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
3
|
+
import { formatRuntimeEvent, listRuntimes, requestRuntimeStatus, watchRuntime, } from '@t4h.framework/dev';
|
|
4
|
+
import { Argument, Command, Option } from 'commander';
|
|
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
|
+
async function waitForNextRuntime(previous) {
|
|
67
|
+
while (true) {
|
|
68
|
+
const next = (await listRuntimes()).find(runtime => runtime.pid !== previous.pid &&
|
|
69
|
+
runtime.projectDir === previous.projectDir &&
|
|
70
|
+
runtime.parentPid === previous.parentPid);
|
|
71
|
+
if (next)
|
|
72
|
+
return next;
|
|
73
|
+
await sleep(NEXT_RUNTIME_POLL_IN_MS);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const lsCommand = new Command('ls')
|
|
77
|
+
.description('List the runtimes running on this machine (JSON)')
|
|
78
|
+
.action(async () => {
|
|
79
|
+
print({ runtimes: await listRuntimes() });
|
|
80
|
+
});
|
|
81
|
+
const statusCommand = new Command('status')
|
|
82
|
+
.description('Print the queue, the jobs running and the runs of a runtime (JSON)')
|
|
83
|
+
.addArgument(pidArgument())
|
|
84
|
+
.addOption(projectOption())
|
|
85
|
+
.action(failing(async (pid, options) => {
|
|
86
|
+
const runtime = selectRuntime(await listRuntimes(), {
|
|
87
|
+
pid,
|
|
88
|
+
projectDir: options.project,
|
|
89
|
+
});
|
|
90
|
+
print(await requestRuntimeStatus(runtime));
|
|
91
|
+
}));
|
|
92
|
+
const watchCommand = new Command('watch')
|
|
93
|
+
.description('Follow what a runtime runs: jobs, queue size, runs, activities, timeouts')
|
|
94
|
+
.addArgument(pidArgument())
|
|
95
|
+
.addOption(projectOption())
|
|
96
|
+
.option('--json', 'Print NDJSON instead of readable lines', false)
|
|
97
|
+
.option('--no-follow', 'Stop when the runtime exits instead of waiting for the next one (dev rebuilds)')
|
|
98
|
+
.action(failing(async (pid, options) => {
|
|
99
|
+
let runtime = selectRuntime(await listRuntimes(), {
|
|
100
|
+
pid,
|
|
101
|
+
projectDir: options.project,
|
|
102
|
+
});
|
|
103
|
+
const onStatus = (status) => options.json
|
|
104
|
+
? line(JSON.stringify({ type: 'status', ...status }))
|
|
105
|
+
: line(formatRuntimeStatus(status));
|
|
106
|
+
let watcher = null;
|
|
107
|
+
process.once('SIGINT', () => {
|
|
108
|
+
watcher?.close();
|
|
109
|
+
process.exit(0);
|
|
110
|
+
});
|
|
111
|
+
while (true) {
|
|
112
|
+
watcher = watchRuntime(runtime, {
|
|
113
|
+
onStatus,
|
|
114
|
+
onEvent: event => line(options.json
|
|
115
|
+
? JSON.stringify({ type: 'event', event })
|
|
116
|
+
: formatRuntimeEvent(event)),
|
|
117
|
+
});
|
|
118
|
+
await watcher.closed.catch(() => { });
|
|
119
|
+
if (!options.follow)
|
|
120
|
+
return;
|
|
121
|
+
if (!options.json)
|
|
122
|
+
line(`runtime ${runtime.pid} exited; waiting for the next one…`);
|
|
123
|
+
runtime = await waitForNextRuntime(runtime);
|
|
124
|
+
}
|
|
125
|
+
}));
|
|
126
|
+
export const runtimeCommand = new Command('runtime')
|
|
127
|
+
.description('Inspect the runtimes started by `framework dev` and `framework workflows`')
|
|
128
|
+
.addCommand(lsCommand)
|
|
129
|
+
.addCommand(statusCommand)
|
|
130
|
+
.addCommand(watchCommand);
|
|
131
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/commands/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parseEnv } from 'node:util';
|
|
4
|
+
import { DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS, HeadlessApp, HeadlessAppError, } from '@t4h.framework/dev';
|
|
5
|
+
import { Argument, Command, Option } from 'commander';
|
|
6
|
+
import { debugLogOption, debugOption, toDebugLog, } from '../../tools/debug-log-option.js';
|
|
7
|
+
/** Exit codes of `framework workflows`, for scripts and agents. */
|
|
8
|
+
export const WORKFLOWS_EXIT_CODE = {
|
|
9
|
+
ok: 0,
|
|
10
|
+
rejected: 1,
|
|
11
|
+
error: 1,
|
|
12
|
+
timedOut: 2,
|
|
13
|
+
};
|
|
14
|
+
export function toWorkflowRunExitCode(result) {
|
|
15
|
+
if (result.timedOut)
|
|
16
|
+
return WORKFLOWS_EXIT_CODE.timedOut;
|
|
17
|
+
return result.run.status === 'fulfilled'
|
|
18
|
+
? WORKFLOWS_EXIT_CODE.ok
|
|
19
|
+
: WORKFLOWS_EXIT_CODE.rejected;
|
|
20
|
+
}
|
|
21
|
+
export function readWorkflowInput({ input, inputFile, }) {
|
|
22
|
+
if (input !== undefined && inputFile !== undefined)
|
|
23
|
+
throw new Error('Pass either --input or --input-file, not both');
|
|
24
|
+
const text = inputFile !== undefined ? fs.readFileSync(inputFile, 'utf8') : input;
|
|
25
|
+
if (text === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(text);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`The workflow input is not valid JSON: ${error.message}`, { cause: error });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function toErrorOutput(error) {
|
|
35
|
+
if (error instanceof HeadlessAppError)
|
|
36
|
+
return {
|
|
37
|
+
error: {
|
|
38
|
+
message: error.message,
|
|
39
|
+
status: error.status ?? null,
|
|
40
|
+
details: error.details ?? null,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
error: { message: error instanceof Error ? error.message : String(error) },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const print = (value) => process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
48
|
+
async function execute(app, workflowId, action, options) {
|
|
49
|
+
if (workflowId === undefined) {
|
|
50
|
+
print({ workflows: app.workflows });
|
|
51
|
+
return WORKFLOWS_EXIT_CODE.ok;
|
|
52
|
+
}
|
|
53
|
+
const workflow = app.workflows.find(({ id }) => id === workflowId);
|
|
54
|
+
if (!workflow)
|
|
55
|
+
throw new HeadlessAppError(`Workflow not found: ${workflowId}`, 404, {
|
|
56
|
+
workflows: app.workflows.map(({ id }) => id),
|
|
57
|
+
});
|
|
58
|
+
if (action !== 'run') {
|
|
59
|
+
print({ workflow });
|
|
60
|
+
return WORKFLOWS_EXIT_CODE.ok;
|
|
61
|
+
}
|
|
62
|
+
const result = await app.run(workflowId, readWorkflowInput(options), {
|
|
63
|
+
timeoutInMs: options.timeout,
|
|
64
|
+
trace: options.trace,
|
|
65
|
+
});
|
|
66
|
+
print(result);
|
|
67
|
+
return toWorkflowRunExitCode(result);
|
|
68
|
+
}
|
|
69
|
+
export const workflowsCommand = new Command('workflows')
|
|
70
|
+
.description('List, describe or run the workflows of the app without the dev server; prints JSON')
|
|
71
|
+
.addArgument(new Argument('[workflow]', 'Workflow id; omit it to list the workflows'))
|
|
72
|
+
.addArgument(new Argument('[action]', 'What to do with the workflow')
|
|
73
|
+
.choices(['describe', 'run'])
|
|
74
|
+
.default('describe'))
|
|
75
|
+
.option('--entrypoint <entrypoint path>', 'The entrypoint package json path', './package.json')
|
|
76
|
+
.addOption(new Option('-e, --env <envs..>', 'The env secrets (NAME=value)')
|
|
77
|
+
.argParser((value, previous) => {
|
|
78
|
+
const index = value.indexOf('=');
|
|
79
|
+
if (index < 1)
|
|
80
|
+
throw new Error('Invalid secret format');
|
|
81
|
+
return { ...previous, [value.slice(0, index)]: value.slice(index + 1) };
|
|
82
|
+
})
|
|
83
|
+
.default({}))
|
|
84
|
+
.addOption(new Option('--env-file-if-exists <file-path>', 'Load variables from a .env file if it exists').argParser(value => path.resolve(process.cwd(), value)))
|
|
85
|
+
.option('-i, --input <json>', 'Workflow input as JSON (run)')
|
|
86
|
+
.addOption(new Option('--input-file <file-path>', 'Read the workflow input JSON from a file (run)').argParser(value => path.resolve(process.cwd(), value)))
|
|
87
|
+
.addOption(new Option('-t, --timeout <ms>', 'Stop waiting for the run after this many milliseconds (run)')
|
|
88
|
+
.default(DEFAULT_HEADLESS_RUN_TIMEOUT_IN_MS)
|
|
89
|
+
.argParser(value => {
|
|
90
|
+
const timeout = Number.parseInt(value, 10);
|
|
91
|
+
if (!Number.isInteger(timeout) || timeout < 0)
|
|
92
|
+
throw new Error('Invalid timeout');
|
|
93
|
+
return timeout;
|
|
94
|
+
}))
|
|
95
|
+
.addOption(debugOption())
|
|
96
|
+
.addOption(debugLogOption())
|
|
97
|
+
.option('--trace', 'Include the activities, logs and child runs in the output (run)', false)
|
|
98
|
+
.action(async (workflowId, action, options) => {
|
|
99
|
+
if (options.envFileIfExists && fs.existsSync(options.envFileIfExists))
|
|
100
|
+
Object.assign(options.env, parseEnv(fs.readFileSync(options.envFileIfExists, 'utf8')));
|
|
101
|
+
let app = null;
|
|
102
|
+
let exitCode = WORKFLOWS_EXIT_CODE.error;
|
|
103
|
+
const shutdown = async (code) => {
|
|
104
|
+
await app?.down().catch(() => { });
|
|
105
|
+
process.exit(code);
|
|
106
|
+
};
|
|
107
|
+
process.once('SIGINT', () => void shutdown(130));
|
|
108
|
+
process.once('SIGTERM', () => void shutdown(143));
|
|
109
|
+
try {
|
|
110
|
+
if (action === 'run')
|
|
111
|
+
readWorkflowInput(options);
|
|
112
|
+
app = await HeadlessApp.up({
|
|
113
|
+
entrypoint: options.entrypoint,
|
|
114
|
+
env: options.env,
|
|
115
|
+
debugLog: toDebugLog(options),
|
|
116
|
+
});
|
|
117
|
+
exitCode = await execute(app, workflowId, action, options);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
print(toErrorOutput(error));
|
|
121
|
+
}
|
|
122
|
+
await shutdown(exitCode);
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/commands/workflows/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { DEBUG_LOG_STDERR } from '@t4h.framework/dev';
|
|
3
|
+
import { Option } from 'commander';
|
|
4
|
+
export const debugOption = () => new Option('--debug', 'Log what the runtime runs (jobs, runs, activities, queue) to stderr');
|
|
5
|
+
export const debugLogOption = () => new Option('--debug-log <file-path>', 'Append the runtime events to this file as NDJSON instead of stderr').argParser(value => path.resolve(process.cwd(), value));
|
|
6
|
+
/** The `debugLog` the dev package takes, or undefined when debugging is off. */
|
|
7
|
+
export function toDebugLog({ debug, debugLog, }) {
|
|
8
|
+
if (debugLog)
|
|
9
|
+
return debugLog;
|
|
10
|
+
return debug ? DEBUG_LOG_STDERR : undefined;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=debug-log-option.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-log-option.js","sourceRoot":"","sources":["../../src/tools/debug-log-option.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAOlC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAC9B,IAAI,MAAM,CACR,SAAS,EACT,qEAAqE,CACtE,CAAA;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CACjC,IAAI,MAAM,CACR,yBAAyB,EACzB,oEAAoE,CACrE,CAAC,SAAS,CAAS,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,CAAA;AAElE,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,GACQ;IAChB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAE7B,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t4h.framework/cli",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
3
|
+
"version": "0.0.0-experimental-20261006133319",
|
|
4
4
|
"description": "CLI tools for the T4H Framework",
|
|
5
5
|
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/cli",
|
|
6
6
|
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@inquirer/prompts": "^8.3.0",
|
|
32
|
-
"@t4h.framework/dev": "^0.0.0-experimental-
|
|
32
|
+
"@t4h.framework/dev": "^0.0.0-experimental-20261006133319",
|
|
33
33
|
"@t4h.framework/harness": "^0.3.2",
|
|
34
34
|
"commander": "^14.0.3",
|
|
35
35
|
"form-data": "^4.0.5",
|