staticforge 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +49 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +18 -0
- package/dist/browser.js.map +1 -0
- package/dist/cloud.d.ts +31 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +102 -0
- package/dist/cloud.js.map +1 -0
- package/dist/command.d.ts +54 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +70 -0
- package/dist/command.js.map +1 -0
- package/dist/commands/build.d.ts +4 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +54 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/check.d.ts +4 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +100 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +27 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +4 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +184 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +4 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +81 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/iac.d.ts +4 -0
- package/dist/commands/iac.d.ts.map +1 -0
- package/dist/commands/iac.js +64 -0
- package/dist/commands/iac.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +55 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +46 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/new.d.ts +4 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +30 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/preview.d.ts +4 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +34 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/provision.d.ts +11 -0
- package/dist/commands/provision.d.ts.map +1 -0
- package/dist/commands/provision.js +133 -0
- package/dist/commands/provision.js.map +1 -0
- package/dist/commands/schema.d.ts +4 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +21 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/version.d.ts +4 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +17 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +19 -0
- package/dist/context.js.map +1 -0
- package/dist/io.d.ts +19 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +34 -0
- package/dist/io.js.map +1 -0
- package/dist/main.d.ts +10 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +81 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/invoke.d.ts +29 -0
- package/dist/mcp/invoke.d.ts.map +1 -0
- package/dist/mcp/invoke.js +82 -0
- package/dist/mcp/invoke.js.map +1 -0
- package/dist/mcp/server.d.ts +25 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +531 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/output.d.ts +17 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +37 -0
- package/dist/output.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +9 -0
- package/dist/paths.js.map +1 -0
- package/dist/project.d.ts +10 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +20 -0
- package/dist/project.js.map +1 -0
- package/dist/schemas.d.ts +16 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +241 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server-options.d.ts +12 -0
- package/dist/server-options.d.ts.map +1 -0
- package/dist/server-options.js +26 -0
- package/dist/server-options.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/dist/workers.d.ts +7 -0
- package/dist/workers.d.ts.map +1 -0
- package/dist/workers.js +20 -0
- package/dist/workers.js.map +1 -0
- package/package.json +64 -3
- package/schema/diagnostics.schema.json +183 -0
- package/schema/output.schema.json +1537 -0
- package/schema/staticforge.schema.json +649 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,eAAe,CAAC;AAKrD,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAQjF;AAgCD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAmHlF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ErrorCode, SforgeError } from '@staticforge/core';
|
|
2
|
+
import { action } from '../command.js';
|
|
3
|
+
import { confirmer, formatPlan, targetContext, truthy } from '../cloud.js';
|
|
4
|
+
import { displayPath } from '../paths.js';
|
|
5
|
+
import { loadProjectConfig } from '../project.js';
|
|
6
|
+
/** --local-state is for experiments: refused in CI unless forced. */
|
|
7
|
+
export function localStateFrom(flags, env) {
|
|
8
|
+
if (flags.localState !== true)
|
|
9
|
+
return false;
|
|
10
|
+
if (truthy(env.CI) && flags.forceLocalState !== true) {
|
|
11
|
+
throw new SforgeError(ErrorCode.Usage, '--local-state is refused in CI', {
|
|
12
|
+
hint: 'Local state is lost with the runner. Use the remote backend, or pass --force-local-state.',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
function describe(result, cwd) {
|
|
18
|
+
const lines = [];
|
|
19
|
+
if (result.bootstrap) {
|
|
20
|
+
lines.push(result.bootstrap.created
|
|
21
|
+
? `Created the state backend ${result.bootstrap.description}`
|
|
22
|
+
: `State backend: ${result.bootstrap.description}`);
|
|
23
|
+
}
|
|
24
|
+
lines.push(formatPlan(result.plan));
|
|
25
|
+
lines.push(...result.notices);
|
|
26
|
+
if (result.pending) {
|
|
27
|
+
lines.push(`Run \`sforge provision ${result.target}\` again once the records resolve.`);
|
|
28
|
+
}
|
|
29
|
+
else if (result.applied) {
|
|
30
|
+
lines.push(`Applied: ${result.apply?.add ?? 0} added, ${result.apply?.change ?? 0} changed, ${result.apply?.remove ?? 0} destroyed.`);
|
|
31
|
+
}
|
|
32
|
+
const outputs = result.outputs ?? {};
|
|
33
|
+
if (typeof outputs.url === 'string')
|
|
34
|
+
lines.push(`URL: ${outputs.url}`);
|
|
35
|
+
const dns = outputs.dns_records;
|
|
36
|
+
if (dns && dns.length > 0 && result.applied) {
|
|
37
|
+
lines.push('Point your DNS at CloudFront (skip if Route 53 manages the zone):');
|
|
38
|
+
lines.push(...dns.map((r) => ` ${r.name} ${r.type} ${r.value}`));
|
|
39
|
+
}
|
|
40
|
+
if (typeof outputs.ci_role_arn === 'string')
|
|
41
|
+
lines.push(`CI deploy role: ${outputs.ci_role_arn}`);
|
|
42
|
+
lines.push(`Workspace: ${displayPath(cwd, result.workspace)}`);
|
|
43
|
+
return lines.join('\n');
|
|
44
|
+
}
|
|
45
|
+
export function registerProvisionCommands(program, runtime) {
|
|
46
|
+
program
|
|
47
|
+
.command('provision')
|
|
48
|
+
.description('Create or update the infrastructure of a target with OpenTofu/Terraform')
|
|
49
|
+
.argument('<target>', 'target name from the config')
|
|
50
|
+
.option('--diff', 'only show what would change (plan), change nothing')
|
|
51
|
+
.option('--bootstrap-state', "create the target's remote state backend first, if missing")
|
|
52
|
+
.option('--local-state', 'keep state in .sforge/iac/<target>/ (experiments only)')
|
|
53
|
+
.option('--force-local-state', 'allow --local-state in CI')
|
|
54
|
+
.option('--no-wait', 'create the certificate, print its DNS records and stop')
|
|
55
|
+
.option('-y, --yes', 'apply without asking')
|
|
56
|
+
.action(action(runtime, async (ctx, { args, options }) => {
|
|
57
|
+
const loaded = await loadProjectConfig(ctx);
|
|
58
|
+
const target = await targetContext(runtime, ctx, loaded, args[0], localStateFrom(options, ctx.io.env));
|
|
59
|
+
const { provision } = await import('@staticforge/iac');
|
|
60
|
+
const result = await provision({
|
|
61
|
+
...target.iac,
|
|
62
|
+
diff: options.diff === true,
|
|
63
|
+
bootstrapState: options.bootstrapState === true,
|
|
64
|
+
noWait: options.wait === false,
|
|
65
|
+
confirm: confirmer(ctx, options.yes === true),
|
|
66
|
+
});
|
|
67
|
+
return { data: result, text: describe(result, ctx.cwd) };
|
|
68
|
+
}));
|
|
69
|
+
program
|
|
70
|
+
.command('status')
|
|
71
|
+
.description("Show a target's current version and URL, and detect infrastructure drift")
|
|
72
|
+
.argument('<target>', 'target name from the config')
|
|
73
|
+
.option('--local-state', 'use the state in .sforge/iac/<target>/')
|
|
74
|
+
.option('--force-local-state', 'allow --local-state in CI')
|
|
75
|
+
.action(action(runtime, async (ctx, { args, options }) => {
|
|
76
|
+
const loaded = await loadProjectConfig(ctx);
|
|
77
|
+
const target = await targetContext(runtime, ctx, loaded, args[0], localStateFrom(options, ctx.io.env));
|
|
78
|
+
const { detectDrift } = await import('@staticforge/iac');
|
|
79
|
+
const drift = await detectDrift(target.iac);
|
|
80
|
+
let versionId = null;
|
|
81
|
+
try {
|
|
82
|
+
const deployer = target.provider.createDeployer({
|
|
83
|
+
rootDir: loaded.rootDir,
|
|
84
|
+
config: loaded.config,
|
|
85
|
+
targetName: target.targetName,
|
|
86
|
+
target: target.target,
|
|
87
|
+
outputs: drift.outputs,
|
|
88
|
+
env: ctx.io.env,
|
|
89
|
+
logger: ctx.logger,
|
|
90
|
+
});
|
|
91
|
+
versionId = (await deployer.current()).versionId;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Not provisioned yet, or not deployable: drift is still useful.
|
|
95
|
+
if (!(error instanceof SforgeError) || error.code !== ErrorCode.NotProvisioned)
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
const url = typeof drift.outputs.url === 'string' ? drift.outputs.url : undefined;
|
|
99
|
+
const lines = [
|
|
100
|
+
`${target.targetName} (${target.target.provider}): ${url ?? 'not provisioned'}`,
|
|
101
|
+
`Active version: ${versionId ?? 'none'}`,
|
|
102
|
+
drift.drifted
|
|
103
|
+
? `Drift detected:\n${drift.drift.map((d) => ` ! ${d.address} (${d.action})`).join('\n') || ' (the plan has changes)'}`
|
|
104
|
+
: 'No drift: the infrastructure matches the last apply.',
|
|
105
|
+
];
|
|
106
|
+
// Drift is a finding: exit 1 so CI can alert on it.
|
|
107
|
+
return { ok: !drift.drifted, data: { ...drift, url, versionId }, text: lines.join('\n') };
|
|
108
|
+
}));
|
|
109
|
+
program
|
|
110
|
+
.command('destroy')
|
|
111
|
+
.description('Delete every resource of a target, including its deployed content')
|
|
112
|
+
.argument('<target>', 'target name from the config')
|
|
113
|
+
.requiredOption('--confirm <target>', 'repeat the target name to confirm')
|
|
114
|
+
.option('--local-state', 'use the state in .sforge/iac/<target>/')
|
|
115
|
+
.option('--force-local-state', 'allow --local-state in CI')
|
|
116
|
+
.action(action(runtime, async (ctx, { args, options }) => {
|
|
117
|
+
const name = args[0];
|
|
118
|
+
if (options.confirm !== name) {
|
|
119
|
+
throw new SforgeError(ErrorCode.ConfirmationRequired, `--confirm must repeat the target name "${name}"`);
|
|
120
|
+
}
|
|
121
|
+
const loaded = await loadProjectConfig(ctx);
|
|
122
|
+
const target = await targetContext(runtime, ctx, loaded, name, localStateFrom(options, ctx.io.env));
|
|
123
|
+
const { destroy } = await import('@staticforge/iac');
|
|
124
|
+
const result = await destroy(target.iac);
|
|
125
|
+
return {
|
|
126
|
+
data: result,
|
|
127
|
+
text: result.destroyed
|
|
128
|
+
? `Destroyed ${result.plan.remove} resources of "${name}". The state backend was kept.`
|
|
129
|
+
: `Nothing to destroy for "${name}".`,
|
|
130
|
+
};
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=provision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.js","sourceRoot":"","sources":["../../src/commands/provision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,eAAe,CAAC;AAWrD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAa9E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Argument } from 'commander';
|
|
2
|
+
import { checkReportJsonSchema } from '@staticforge/checker/report-schema';
|
|
3
|
+
import { configJsonSchema } from '@staticforge/core';
|
|
4
|
+
import { action } from '../command.js';
|
|
5
|
+
import { outputJsonSchema } from '../output.js';
|
|
6
|
+
const schemas = {
|
|
7
|
+
config: configJsonSchema,
|
|
8
|
+
diagnostics: checkReportJsonSchema,
|
|
9
|
+
output: outputJsonSchema,
|
|
10
|
+
};
|
|
11
|
+
export function registerSchemaCommand(program, runtime) {
|
|
12
|
+
program
|
|
13
|
+
.command('schema')
|
|
14
|
+
.description('Print a JSON Schema: the config file, the check report (diagnostics), or the --json envelope')
|
|
15
|
+
.addArgument(new Argument('<name>', 'schema to print').choices(Object.keys(schemas)))
|
|
16
|
+
.action(action(runtime, async (_ctx, { args }) => {
|
|
17
|
+
const schema = schemas[args[0]]();
|
|
18
|
+
return { data: schema, text: JSON.stringify(schema, null, 2) };
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAgB,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,OAAO,GAAG;IACd,MAAM,EAAE,gBAAgB;IACxB,WAAW,EAAE,qBAAqB;IAClC,MAAM,EAAE,gBAAgB;CAChB,CAAC;AAIX,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,OAAgB;IACtE,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,8FAA8F,CAC/F;SACA,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;SACpF,MAAM,CACL,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAe,CAAC,EAAE,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACjE,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,eAAe,CAAC;AAGrD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { action } from '../command.js';
|
|
2
|
+
import { VERSION } from '../version.js';
|
|
3
|
+
export function registerVersionCommand(program, runtime) {
|
|
4
|
+
program
|
|
5
|
+
.command('version')
|
|
6
|
+
.description('Print version information')
|
|
7
|
+
.action(action(runtime, async () => ({
|
|
8
|
+
data: {
|
|
9
|
+
version: VERSION,
|
|
10
|
+
node: process.versions.node,
|
|
11
|
+
platform: process.platform,
|
|
12
|
+
arch: process.arch,
|
|
13
|
+
},
|
|
14
|
+
text: `sforge ${VERSION} (node ${process.versions.node}, ${process.platform}-${process.arch})`,
|
|
15
|
+
})));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAE,OAAgB;IACvE,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CACL,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE;YACJ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB;QACD,IAAI,EAAE,UAAU,OAAO,UAAU,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,GAAG;KAC/F,CAAC,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type Logger } from '@staticforge/core';
|
|
3
|
+
import type { Io } from './io.js';
|
|
4
|
+
/** Options accepted by every command. */
|
|
5
|
+
export interface GlobalOptions {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
quiet?: boolean;
|
|
8
|
+
verbose?: boolean;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
config?: string;
|
|
11
|
+
color?: boolean;
|
|
12
|
+
nonInteractive?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface CommandContext {
|
|
15
|
+
io: Io;
|
|
16
|
+
logger: Logger;
|
|
17
|
+
/** Absolute working directory (from --cwd or the process). */
|
|
18
|
+
cwd: string;
|
|
19
|
+
/** Explicit config path from --config. */
|
|
20
|
+
configPath: string | undefined;
|
|
21
|
+
json: boolean;
|
|
22
|
+
/** False under CI, without a TTY, or with --non-interactive: never prompt. */
|
|
23
|
+
interactive: boolean;
|
|
24
|
+
color: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function createContext(command: Command, io: Io): CommandContext;
|
|
27
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,MAAM,EAAgC,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,8EAA8E;IAC9E,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,cAAc,CAgBtE"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { createLogger, shouldUseColor } from '@staticforge/core';
|
|
3
|
+
export function createContext(command, io) {
|
|
4
|
+
const opts = command.optsWithGlobals();
|
|
5
|
+
const json = opts.json === true;
|
|
6
|
+
const color = opts.color !== false && shouldUseColor(io.stderr, io.env);
|
|
7
|
+
const level = opts.quiet ? 'error' : opts.verbose ? 'debug' : 'info';
|
|
8
|
+
const ci = io.env.CI !== undefined && io.env.CI !== '' && io.env.CI !== 'false';
|
|
9
|
+
return {
|
|
10
|
+
io,
|
|
11
|
+
logger: createLogger({ level, color, stream: io.stderr }),
|
|
12
|
+
cwd: opts.cwd !== undefined ? resolve(io.cwd, opts.cwd) : io.cwd,
|
|
13
|
+
configPath: opts.config,
|
|
14
|
+
json,
|
|
15
|
+
interactive: opts.nonInteractive !== true && !ci && io.stdinIsTTY,
|
|
16
|
+
color,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAe,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2B9E,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,EAAM;IACpD,MAAM,IAAI,GAAG,OAAO,CAAC,eAAe,EAAiB,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC;IAEhF,OAAO;QACL,EAAE;QACF,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QACzD,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG;QAChE,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU;QACjE,KAAK;KACN,CAAC;AACJ,CAAC"}
|
package/dist/io.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Writable } from 'node:stream';
|
|
2
|
+
/** Process boundary, injectable so commands can be tested without spawning. */
|
|
3
|
+
export interface Io {
|
|
4
|
+
stdout: Writable & {
|
|
5
|
+
isTTY?: boolean;
|
|
6
|
+
};
|
|
7
|
+
stderr: Writable & {
|
|
8
|
+
isTTY?: boolean;
|
|
9
|
+
};
|
|
10
|
+
stdinIsTTY: boolean;
|
|
11
|
+
env: NodeJS.ProcessEnv;
|
|
12
|
+
cwd: string;
|
|
13
|
+
/** Run `handler` once on SIGINT/SIGTERM; returns an unsubscribe function. */
|
|
14
|
+
onShutdown(handler: () => void): () => void;
|
|
15
|
+
/** Ask a question on stderr and read one line from stdin (interactive runs only). */
|
|
16
|
+
prompt(question: string): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
export declare function processIo(): Io;
|
|
19
|
+
//# sourceMappingURL=io.d.ts.map
|
package/dist/io.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,WAAW,EAAE;IACjB,MAAM,EAAE,QAAQ,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,MAAM,EAAE,QAAQ,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,6EAA6E;IAC7E,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,qFAAqF;IACrF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,wBAAgB,SAAS,IAAI,EAAE,CA2B9B"}
|
package/dist/io.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
export function processIo() {
|
|
3
|
+
return {
|
|
4
|
+
stdout: process.stdout,
|
|
5
|
+
stderr: process.stderr,
|
|
6
|
+
stdinIsTTY: process.stdin.isTTY === true,
|
|
7
|
+
env: process.env,
|
|
8
|
+
cwd: process.cwd(),
|
|
9
|
+
onShutdown(handler) {
|
|
10
|
+
const signals = ['SIGINT', 'SIGTERM'];
|
|
11
|
+
const once = () => {
|
|
12
|
+
for (const signal of signals)
|
|
13
|
+
process.off(signal, once);
|
|
14
|
+
handler();
|
|
15
|
+
};
|
|
16
|
+
for (const signal of signals)
|
|
17
|
+
process.on(signal, once);
|
|
18
|
+
return () => {
|
|
19
|
+
for (const signal of signals)
|
|
20
|
+
process.off(signal, once);
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
async prompt(question) {
|
|
24
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
25
|
+
try {
|
|
26
|
+
return await rl.question(question);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
rl.close();
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=io.js.map
|
package/dist/io.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgBzD,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;QACxC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,UAAU,CAAC,OAAO;YAChB,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAU,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,EAAE;gBAChB,KAAK,MAAM,MAAM,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,GAAG,EAAE;gBACV,KAAK,MAAM,MAAM,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1D,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,QAAQ;YACnB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ExitCode } from '@staticforge/core';
|
|
3
|
+
import type { Runtime } from './command.js';
|
|
4
|
+
import { type Io } from './io.js';
|
|
5
|
+
export { defineConfig } from '@staticforge/core';
|
|
6
|
+
export type { SforgeConfig, SforgeConfigInput } from '@staticforge/core';
|
|
7
|
+
export declare function createProgram(runtime: Runtime): Command;
|
|
8
|
+
/** Run the CLI and return the process exit code. */
|
|
9
|
+
export declare function run(argv: string[], io?: Io, hooks?: Pick<Runtime, 'providers' | 'onResult'>): Promise<ExitCode>;
|
|
10
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAC;AACpD,OAAO,EAAa,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAc5C,OAAO,EAAE,KAAK,EAAE,EAAa,MAAM,SAAS,CAAC;AAI7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAmCvD;AAED,oDAAoD;AACpD,wBAAsB,GAAG,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,EAAgB,EACpB,KAAK,GAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAAM,GAClD,OAAO,CAAC,QAAQ,CAAC,CAsBnB"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Command, CommanderError } from 'commander';
|
|
2
|
+
import { ErrorCode, ExitCode } from '@staticforge/core';
|
|
3
|
+
import { registerBuildCommand } from './commands/build.js';
|
|
4
|
+
import { registerCheckCommand } from './commands/check.js';
|
|
5
|
+
import { registerConfigCommands } from './commands/config.js';
|
|
6
|
+
import { registerDeployCommands } from './commands/deploy.js';
|
|
7
|
+
import { registerDevCommand } from './commands/dev.js';
|
|
8
|
+
import { registerIacCommand } from './commands/iac.js';
|
|
9
|
+
import { registerInitCommand } from './commands/init.js';
|
|
10
|
+
import { registerMcpCommand } from './commands/mcp.js';
|
|
11
|
+
import { registerNewCommand } from './commands/new.js';
|
|
12
|
+
import { registerPreviewCommand } from './commands/preview.js';
|
|
13
|
+
import { registerProvisionCommands } from './commands/provision.js';
|
|
14
|
+
import { registerSchemaCommand } from './commands/schema.js';
|
|
15
|
+
import { registerVersionCommand } from './commands/version.js';
|
|
16
|
+
import { processIo } from './io.js';
|
|
17
|
+
import { OUTPUT_SCHEMA_VERSION } from './output.js';
|
|
18
|
+
import { VERSION } from './version.js';
|
|
19
|
+
export { defineConfig } from '@staticforge/core';
|
|
20
|
+
export function createProgram(runtime) {
|
|
21
|
+
const { io } = runtime;
|
|
22
|
+
const program = new Command('sforge')
|
|
23
|
+
.description('staticforge: build, check, preview and deploy accessible static sites')
|
|
24
|
+
.version(VERSION, '-V, --version')
|
|
25
|
+
.option('--json', 'write a single JSON document to stdout (logs go to stderr)')
|
|
26
|
+
.option('-q, --quiet', 'only log errors')
|
|
27
|
+
.option('-v, --verbose', 'log debug output')
|
|
28
|
+
.option('--cwd <dir>', 'run as if started in <dir>')
|
|
29
|
+
.option('-c, --config <path>', 'config file, or the project directory containing it')
|
|
30
|
+
.option('--no-color', 'disable colored output')
|
|
31
|
+
.option('--non-interactive', 'never prompt (implied when CI is set or stdin is not a TTY)')
|
|
32
|
+
.showSuggestionAfterError()
|
|
33
|
+
.exitOverride()
|
|
34
|
+
.configureOutput({
|
|
35
|
+
writeOut: (s) => io.stdout.write(s),
|
|
36
|
+
writeErr: (s) => io.stderr.write(s),
|
|
37
|
+
});
|
|
38
|
+
// Subcommands created below inherit exitOverride and output settings.
|
|
39
|
+
registerInitCommand(program, runtime);
|
|
40
|
+
registerNewCommand(program, runtime);
|
|
41
|
+
registerBuildCommand(program, runtime);
|
|
42
|
+
registerCheckCommand(program, runtime);
|
|
43
|
+
registerDevCommand(program, runtime);
|
|
44
|
+
registerPreviewCommand(program, runtime);
|
|
45
|
+
registerProvisionCommands(program, runtime);
|
|
46
|
+
registerIacCommand(program, runtime);
|
|
47
|
+
registerDeployCommands(program, runtime);
|
|
48
|
+
registerConfigCommands(program, runtime);
|
|
49
|
+
registerSchemaCommand(program, runtime);
|
|
50
|
+
registerVersionCommand(program, runtime);
|
|
51
|
+
registerMcpCommand(program, runtime);
|
|
52
|
+
return program;
|
|
53
|
+
}
|
|
54
|
+
/** Run the CLI and return the process exit code. */
|
|
55
|
+
export async function run(argv, io = processIo(), hooks = {}) {
|
|
56
|
+
const runtime = { io, exitCode: ExitCode.Ok, ...hooks };
|
|
57
|
+
const program = createProgram(runtime);
|
|
58
|
+
try {
|
|
59
|
+
await program.parseAsync(argv);
|
|
60
|
+
return runtime.exitCode;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (!(error instanceof CommanderError))
|
|
64
|
+
throw error;
|
|
65
|
+
// --help and --version exit through here with code 0.
|
|
66
|
+
if (error.exitCode === 0)
|
|
67
|
+
return ExitCode.Ok;
|
|
68
|
+
// Commander has already printed the usage error to stderr.
|
|
69
|
+
const envelope = {
|
|
70
|
+
schemaVersion: OUTPUT_SCHEMA_VERSION,
|
|
71
|
+
command: '',
|
|
72
|
+
ok: false,
|
|
73
|
+
error: { code: ErrorCode.Usage, message: error.message.replace(/^error: /, '') },
|
|
74
|
+
};
|
|
75
|
+
runtime.onResult?.({ envelope });
|
|
76
|
+
if (argv.includes('--json'))
|
|
77
|
+
io.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
|
|
78
|
+
return ExitCode.Usage;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ExitCode } from '@staticforge/core';
|
|
2
|
+
import type { Outcome, Runtime } from '../command.js';
|
|
3
|
+
import type { Io } from '../io.js';
|
|
4
|
+
/** The CLI entry point (`run` from main.ts), passed in to avoid an import cycle. */
|
|
5
|
+
export type RunCli = (argv: string[], io: Io, hooks: Pick<Runtime, 'providers' | 'onResult'>) => Promise<ExitCode>;
|
|
6
|
+
export interface InvokeOptions {
|
|
7
|
+
run: RunCli;
|
|
8
|
+
cwd: string;
|
|
9
|
+
/** Global options for every command, e.g. ["--config", "site.yaml", "--quiet"]. */
|
|
10
|
+
globalArgs?: string[];
|
|
11
|
+
env: NodeJS.ProcessEnv;
|
|
12
|
+
providers?: Runtime['providers'];
|
|
13
|
+
/** Receives each line the command logs. */
|
|
14
|
+
onLog?(line: string): void;
|
|
15
|
+
}
|
|
16
|
+
export interface Invocation {
|
|
17
|
+
/** The command's result, as soon as it has one (servers: once they listen). */
|
|
18
|
+
outcome: Promise<Outcome>;
|
|
19
|
+
/** Settles when the command has finished; servers run until {@link stop}. */
|
|
20
|
+
done: Promise<ExitCode>;
|
|
21
|
+
/** Stop a long-running command, as Ctrl+C would. */
|
|
22
|
+
stop(): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run a CLI command in this process, exactly as `sforge <args> --json` would,
|
|
26
|
+
* without prompts. The envelope goes to `outcome`; stdout is discarded.
|
|
27
|
+
*/
|
|
28
|
+
export declare function invoke(args: string[], options: InvokeOptions): Invocation;
|
|
29
|
+
//# sourceMappingURL=invoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/mcp/invoke.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC,oFAAoF;AACpF,MAAM,MAAM,MAAM,GAAG,CACnB,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,CAAC,KAC3C,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,2CAA2C;IAC3C,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,+EAA+E;IAC/E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxB,oDAAoD;IACpD,IAAI,IAAI,IAAI,CAAC;CACd;AAuBD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,UAAU,CAwDzE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
2
|
+
import { ExitCode } from '@staticforge/core';
|
|
3
|
+
/** A stream that hands complete lines to `onLine`. */
|
|
4
|
+
function lineStream(onLine) {
|
|
5
|
+
let pending = '';
|
|
6
|
+
const stream = new Writable({
|
|
7
|
+
write(chunk, _encoding, done) {
|
|
8
|
+
pending += String(chunk);
|
|
9
|
+
for (let i = pending.indexOf('\n'); i !== -1; i = pending.indexOf('\n')) {
|
|
10
|
+
onLine(pending.slice(0, i));
|
|
11
|
+
pending = pending.slice(i + 1);
|
|
12
|
+
}
|
|
13
|
+
done();
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
return Object.assign(stream, {
|
|
17
|
+
flush() {
|
|
18
|
+
if (pending !== '')
|
|
19
|
+
onLine(pending);
|
|
20
|
+
pending = '';
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run a CLI command in this process, exactly as `sforge <args> --json` would,
|
|
26
|
+
* without prompts. The envelope goes to `outcome`; stdout is discarded.
|
|
27
|
+
*/
|
|
28
|
+
export function invoke(args, options) {
|
|
29
|
+
const shutdown = [];
|
|
30
|
+
const stderr = lineStream((line) => options.onLog?.(line));
|
|
31
|
+
const io = {
|
|
32
|
+
stdout: new Writable({ write: (_chunk, _encoding, done) => done() }),
|
|
33
|
+
stderr,
|
|
34
|
+
stdinIsTTY: false,
|
|
35
|
+
env: options.env,
|
|
36
|
+
cwd: options.cwd,
|
|
37
|
+
onShutdown(handler) {
|
|
38
|
+
shutdown.push(handler);
|
|
39
|
+
return () => {
|
|
40
|
+
const i = shutdown.indexOf(handler);
|
|
41
|
+
if (i !== -1)
|
|
42
|
+
shutdown.splice(i, 1);
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
prompt: () => Promise.reject(new Error('Commands run over MCP cannot prompt')),
|
|
46
|
+
};
|
|
47
|
+
let settle;
|
|
48
|
+
let fail;
|
|
49
|
+
let settled = false;
|
|
50
|
+
const outcome = new Promise((resolve, reject) => {
|
|
51
|
+
settle = (value) => {
|
|
52
|
+
settled = true;
|
|
53
|
+
resolve(value);
|
|
54
|
+
};
|
|
55
|
+
fail = reject;
|
|
56
|
+
});
|
|
57
|
+
const argv = ['node', 'sforge', '--json', ...(options.globalArgs ?? []), ...args];
|
|
58
|
+
const done = options
|
|
59
|
+
.run(argv, io, {
|
|
60
|
+
...(options.providers && { providers: options.providers }),
|
|
61
|
+
onResult: (result) => {
|
|
62
|
+
if (!settled)
|
|
63
|
+
settle(result);
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
.then((code) => {
|
|
67
|
+
stderr.flush();
|
|
68
|
+
if (!settled)
|
|
69
|
+
fail(new Error(`sforge ${args[0] ?? ''} ended without a result`));
|
|
70
|
+
return code;
|
|
71
|
+
}, (error) => {
|
|
72
|
+
stderr.flush();
|
|
73
|
+
fail(error);
|
|
74
|
+
return ExitCode.Internal;
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
outcome,
|
|
78
|
+
done,
|
|
79
|
+
stop: () => shutdown.splice(0).forEach((handler) => handler()),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=invoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/mcp/invoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
2
|
+
import type { Runtime } from '../command.js';
|
|
3
|
+
import { type RunCli } from './invoke.js';
|
|
4
|
+
export interface SforgeMcpOptions {
|
|
5
|
+
run: RunCli;
|
|
6
|
+
/** Project directory (or a directory below it). */
|
|
7
|
+
cwd: string;
|
|
8
|
+
/** Global options for every command, e.g. ["--config", "site.yaml"]. */
|
|
9
|
+
globalArgs?: string[];
|
|
10
|
+
env: NodeJS.ProcessEnv;
|
|
11
|
+
/** Also offer provision and destroy. */
|
|
12
|
+
allowInfra?: boolean;
|
|
13
|
+
/** Cloud providers to use instead of the real ones (tests). */
|
|
14
|
+
providers?: Runtime['providers'];
|
|
15
|
+
/** Where command logs go: stderr when serving over stdio. */
|
|
16
|
+
log?(line: string): void;
|
|
17
|
+
}
|
|
18
|
+
export interface SforgeMcp {
|
|
19
|
+
/** A server with every tool and resource. Over stdio, one connection may create two. */
|
|
20
|
+
createServer(): McpServer;
|
|
21
|
+
/** Stop the dev server, if one is running. */
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare function createSforgeMcp(options: SforgeMcpOptions): SforgeMcp;
|
|
25
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,SAAS,EAKV,MAAM,8BAA8B,CAAC;AAItC,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAmB,KAAK,MAAM,EAAU,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,wCAAwC;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,6DAA6D;IAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,wFAAwF;IACxF,YAAY,IAAI,SAAS,CAAC;IAC1B,8CAA8C;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAqID,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA+oBpE"}
|