@nowline/cli 0.8.5 → 0.9.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/README.md +42 -12
- package/dist/cli/args.d.ts +21 -5
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +26 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/formats.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +35 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/options.d.ts +74 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +209 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp-install.d.ts +18 -0
- package/dist/commands/mcp-install.d.ts.map +1 -0
- package/dist/commands/mcp-install.js +151 -0
- package/dist/commands/mcp-install.js.map +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +6 -12
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/render.d.ts +7 -0
- package/dist/commands/render.d.ts.map +1 -1
- package/dist/commands/render.js +176 -152
- package/dist/commands/render.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +87 -60
- package/dist/commands/serve.js.map +1 -1
- package/dist/core/parse.js.map +1 -1
- package/dist/diagnostics/adapt.d.ts +12 -1
- package/dist/diagnostics/adapt.d.ts.map +1 -1
- package/dist/diagnostics/adapt.js +53 -1
- package/dist/diagnostics/adapt.js.map +1 -1
- package/dist/diagnostics/format.js.map +1 -1
- package/dist/diagnostics/model.d.ts +1 -1
- package/dist/diagnostics/text.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +2 -2
- package/dist/i18n/locale.d.ts +1 -1
- package/dist/i18n/locale.d.ts.map +1 -1
- package/dist/i18n/locale.js +2 -5
- package/dist/i18n/locale.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/io/config.d.ts +1 -1
- package/dist/io/config.d.ts.map +1 -1
- package/dist/io/config.js +1 -1
- package/dist/io/config.js.map +1 -1
- package/dist/io/exit-codes.d.ts.map +1 -1
- package/dist/io/exit-codes.js.map +1 -1
- package/dist/io/log.d.ts +17 -0
- package/dist/io/log.d.ts.map +1 -0
- package/dist/io/log.js +16 -0
- package/dist/io/log.js.map +1 -0
- package/dist/io/read.d.ts +3 -0
- package/dist/io/read.d.ts.map +1 -1
- package/dist/io/read.js +32 -5
- package/dist/io/read.js.map +1 -1
- package/dist/io/write.js.map +1 -1
- package/dist/mcp-install/clients.d.ts +58 -0
- package/dist/mcp-install/clients.d.ts.map +1 -0
- package/dist/mcp-install/clients.js +304 -0
- package/dist/mcp-install/clients.js.map +1 -0
- package/dist/mcp-install/host.d.ts +29 -0
- package/dist/mcp-install/host.d.ts.map +1 -0
- package/dist/mcp-install/host.js +72 -0
- package/dist/mcp-install/host.js.map +1 -0
- package/dist/mcp-install/json-config.d.ts +29 -0
- package/dist/mcp-install/json-config.d.ts.map +1 -0
- package/dist/mcp-install/json-config.js +139 -0
- package/dist/mcp-install/json-config.js.map +1 -0
- package/dist/mcp-install/server-command.d.ts +26 -0
- package/dist/mcp-install/server-command.d.ts.map +1 -0
- package/dist/mcp-install/server-command.js +52 -0
- package/dist/mcp-install/server-command.js.map +1 -0
- package/man/fr/nowline.1 +246 -19
- package/man/fr/nowline.5 +819 -45
- package/man/nowline.1 +191 -18
- package/man/nowline.5 +764 -36
- package/package.json +24 -24
- package/src/cli/args.ts +69 -8
- package/src/cli/help.ts +35 -2
- package/src/cli/options.ts +286 -0
- package/src/commands/init.ts +2 -3
- package/src/commands/mcp-install.ts +211 -0
- package/src/commands/mcp.ts +9 -14
- package/src/commands/render.ts +219 -186
- package/src/commands/serve.ts +102 -74
- package/src/diagnostics/adapt.ts +62 -0
- package/src/diagnostics/model.ts +1 -1
- package/src/generated/version.ts +2 -2
- package/src/i18n/locale.ts +2 -6
- package/src/index.ts +3 -0
- package/src/io/config.ts +0 -1
- package/src/io/log.ts +33 -0
- package/src/io/read.ts +39 -5
- package/src/mcp-install/clients.ts +443 -0
- package/src/mcp-install/host.ts +106 -0
- package/src/mcp-install/json-config.ts +179 -0
- package/src/mcp-install/server-command.ts +75 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// How the CLI turns flags and `.nowlinerc` keys into render options. The five
|
|
2
|
+
// shared options (theme, width, now, page size, non-working display) come from
|
|
3
|
+
// `@nowline/config`'s schema; the CLI-only keys are registered here as option
|
|
4
|
+
// specs over the same two layers, so adding an rc key is one entry in
|
|
5
|
+
// `CLI_OPTION_SPECS` rather than a hand-written merge in each command
|
|
6
|
+
// (specs/surface-options.md §3.1).
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { ASSET_ROOT_SPEC, rcLayer, resolveOptions, resolveSurfaceOptions, SURFACE_OPTION_SPECS, } from '@nowline/config';
|
|
9
|
+
import { lengthToPoints, parseLength } from '@nowline/export-core';
|
|
10
|
+
import { normalizeZone, TimezoneError } from '@nowline/layout';
|
|
11
|
+
import { CliError, ExitCode } from '../io/exit-codes.js';
|
|
12
|
+
const ORIENTATIONS = ['portrait', 'landscape', 'auto'];
|
|
13
|
+
/** An rc key the CLI reads as a string; any other type is ignored, as it always was. */
|
|
14
|
+
function lenientString(raw) {
|
|
15
|
+
return { ok: true, value: typeof raw === 'string' ? raw : undefined };
|
|
16
|
+
}
|
|
17
|
+
/** An rc or flag switch: only a literal `true` turns it on. */
|
|
18
|
+
function lenientSwitch(raw) {
|
|
19
|
+
return { ok: true, value: raw === true ? true : undefined };
|
|
20
|
+
}
|
|
21
|
+
function parseOrientation(raw) {
|
|
22
|
+
if (raw === '')
|
|
23
|
+
return { ok: true, value: undefined };
|
|
24
|
+
const lower = typeof raw === 'string' ? raw.toLowerCase() : undefined;
|
|
25
|
+
const found = ORIENTATIONS.find((orientation) => orientation === lower);
|
|
26
|
+
if (found)
|
|
27
|
+
return { ok: true, value: found };
|
|
28
|
+
return { ok: false, detail: 'must be an orientation', expected: ORIENTATIONS };
|
|
29
|
+
}
|
|
30
|
+
function parseMargin(raw) {
|
|
31
|
+
if (raw === '')
|
|
32
|
+
return { ok: true, value: undefined };
|
|
33
|
+
// A bare number is points; YAML and JSON hand the rc one over as a number.
|
|
34
|
+
if (typeof raw === 'number' && Number.isFinite(raw) && raw >= 0) {
|
|
35
|
+
return { ok: true, value: raw };
|
|
36
|
+
}
|
|
37
|
+
const text = String(raw);
|
|
38
|
+
if (/^\d+(?:\.\d+)?$/.test(text))
|
|
39
|
+
return { ok: true, value: Number(text) };
|
|
40
|
+
try {
|
|
41
|
+
return { ok: true, value: lengthToPoints(parseLength(text)) };
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
return { ok: false, detail: err instanceof Error ? err.message : String(err) };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Every option the CLI resolves over its flag and rc layers: the shared five, then its own. */
|
|
48
|
+
export const CLI_OPTION_SPECS = Object.freeze({
|
|
49
|
+
...SURFACE_OPTION_SPECS,
|
|
50
|
+
orientation: { rcKey: 'pdfOrientation', parse: parseOrientation },
|
|
51
|
+
margin: { rcKey: 'pdfMargin', parse: parseMargin },
|
|
52
|
+
defaultFormat: { rcKey: 'defaultFormat', parse: lenientString },
|
|
53
|
+
fontSans: { rcKey: 'fontSans', parse: lenientString },
|
|
54
|
+
fontMono: { rcKey: 'fontMono', parse: lenientString },
|
|
55
|
+
headless: { rcKey: 'headlessFonts', parse: lenientSwitch },
|
|
56
|
+
useSystemFonts: { rcKey: 'useSystemFonts', parse: lenientSwitch },
|
|
57
|
+
locale: { rcKey: 'locale', parse: lenientString },
|
|
58
|
+
assetRoot: ASSET_ROOT_SPEC,
|
|
59
|
+
});
|
|
60
|
+
/** The flag each option is passed as, for an error that names its source. */
|
|
61
|
+
const FLAG_NAMES = {
|
|
62
|
+
theme: '--theme',
|
|
63
|
+
width: '--width',
|
|
64
|
+
now: '--now',
|
|
65
|
+
pageSize: '--page-size',
|
|
66
|
+
nonWorking: '--non-working',
|
|
67
|
+
orientation: '--orientation',
|
|
68
|
+
margin: '--margin',
|
|
69
|
+
fontSans: '--font-sans',
|
|
70
|
+
fontMono: '--font-mono',
|
|
71
|
+
headless: '--headless',
|
|
72
|
+
useSystemFonts: '--use-system-fonts',
|
|
73
|
+
assetRoot: '--asset-root',
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the CLI's options over the flag layer, then the `.nowlinerc` layer.
|
|
77
|
+
* `render` and `--serve` both call this, so they read the same keys the same
|
|
78
|
+
* way. `cwd` is what a relative `--asset-root` resolves against (default: the
|
|
79
|
+
* process's). Nothing throws here: a caller reads `defaultFormat` early and reports bad
|
|
80
|
+
* values at the point it always did, through `assertValid`.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveCliOptions(args, config, context = {}) {
|
|
83
|
+
const { rcPath, cwd, clock } = context;
|
|
84
|
+
const layers = [flagLayer(args), rcLayer(config ?? {}, CLI_OPTION_SPECS)];
|
|
85
|
+
// `--timezone` is validated even when `--now` is explicit, as it always was.
|
|
86
|
+
const zone = readZone(args.timezone);
|
|
87
|
+
const { options, errors: surfaceErrors } = resolveSurfaceOptions(layers, { theme: 'light' }, { zone: zone.zone, clock });
|
|
88
|
+
const { values, errors: cliErrors } = resolveOptions(CLI_OPTION_SPECS, layers);
|
|
89
|
+
const failures = new Map([...surfaceErrors, ...cliErrors].map((error) => [error.key, error]));
|
|
90
|
+
const failure = (key) => {
|
|
91
|
+
const error = failures.get(key);
|
|
92
|
+
return error && new CliError(ExitCode.InputError, formatOptionError(error));
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
surface: options,
|
|
96
|
+
orientation: values.orientation,
|
|
97
|
+
margin: values.margin,
|
|
98
|
+
defaultFormat: values.defaultFormat,
|
|
99
|
+
fontSans: values.fontSans,
|
|
100
|
+
fontMono: values.fontMono,
|
|
101
|
+
headless: values.headless ?? false,
|
|
102
|
+
useSystemFonts: values.useSystemFonts ?? false,
|
|
103
|
+
assetRoot: absoluteAssetRoot(values.assetRoot, args.assetRoot !== undefined, rcPath, cwd),
|
|
104
|
+
rcLocale: values.locale,
|
|
105
|
+
assertValid: () => throwFirst([
|
|
106
|
+
failure('theme'),
|
|
107
|
+
zone.error,
|
|
108
|
+
failure('now'),
|
|
109
|
+
failure('width'),
|
|
110
|
+
failure('nonWorking'),
|
|
111
|
+
failure('assetRoot'),
|
|
112
|
+
]),
|
|
113
|
+
assertPdfSettingsValid: () => throwFirst([failure('pageSize'), failure('orientation'), failure('margin')]),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function throwFirst(candidates) {
|
|
117
|
+
for (const candidate of candidates) {
|
|
118
|
+
if (candidate)
|
|
119
|
+
throw candidate;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function flagLayer(args) {
|
|
123
|
+
return {
|
|
124
|
+
source: (key) => ({ kind: 'flag', name: FLAG_NAMES[key] ?? `--${key}` }),
|
|
125
|
+
values: {
|
|
126
|
+
// An empty `--theme ""` has always meant "not passed", so the rc theme applies.
|
|
127
|
+
theme: args.theme || undefined,
|
|
128
|
+
width: args.width,
|
|
129
|
+
now: args.now,
|
|
130
|
+
pageSize: args.pageSize,
|
|
131
|
+
nonWorking: args.nonWorking,
|
|
132
|
+
orientation: args.orientation,
|
|
133
|
+
margin: args.margin,
|
|
134
|
+
fontSans: args.fontSans,
|
|
135
|
+
fontMono: args.fontMono,
|
|
136
|
+
assetRoot: args.assetRoot,
|
|
137
|
+
// A switch flag is absent or on; absent leaves the rc to decide.
|
|
138
|
+
headless: args.headless || undefined,
|
|
139
|
+
useSystemFonts: args.useSystemFonts || undefined,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function readZone(raw) {
|
|
144
|
+
if (!raw)
|
|
145
|
+
return {};
|
|
146
|
+
try {
|
|
147
|
+
return { zone: normalizeZone(raw) };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
if (err instanceof TimezoneError) {
|
|
151
|
+
return { error: new CliError(ExitCode.InputError, err.message) };
|
|
152
|
+
}
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ---- Asset root -------------------------------------------------------------
|
|
157
|
+
/**
|
|
158
|
+
* The asset root as an absolute path. A flag resolves against `cwd` (the
|
|
159
|
+
* process's, unless a caller passes its own); an rc value against the
|
|
160
|
+
* directory of the `.nowlinerc` it came from, so a checked-in `assetRoot:
|
|
161
|
+
* assets` means the same directory wherever `nowline` is run from.
|
|
162
|
+
*/
|
|
163
|
+
function absoluteAssetRoot(value, fromFlag, rcPath, cwd) {
|
|
164
|
+
if (value === undefined)
|
|
165
|
+
return undefined;
|
|
166
|
+
if (fromFlag || rcPath === undefined)
|
|
167
|
+
return path.resolve(cwd ?? '.', value);
|
|
168
|
+
return path.resolve(path.dirname(rcPath), value);
|
|
169
|
+
}
|
|
170
|
+
// ---- Error text -------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* An {@link OptionError} in the CLI's wording, naming the flag or `.nowlinerc`
|
|
173
|
+
* key the value came from: `nowline: invalid --width "abc". Must be an integer
|
|
174
|
+
* ≥ 320.` The templates are the ones the CLI used before the schema, so
|
|
175
|
+
* scripts that match them keep working.
|
|
176
|
+
*/
|
|
177
|
+
export function formatOptionError(error) {
|
|
178
|
+
const lead = `nowline: invalid ${describeSource(error.source)} "${String(error.raw)}"`;
|
|
179
|
+
if (error.expected)
|
|
180
|
+
return `${lead}. Expected ${formatChoices(error.expected)}.`;
|
|
181
|
+
switch (error.key) {
|
|
182
|
+
// Detail reads "must be YYYY-MM-DD, ...": the CLI says "Expected".
|
|
183
|
+
case 'now':
|
|
184
|
+
return `${lead}. Expected ${error.detail.replace(/^must be /, '')}.`;
|
|
185
|
+
// These two carry the parser's own message after a colon.
|
|
186
|
+
case 'pageSize':
|
|
187
|
+
case 'margin':
|
|
188
|
+
return `${lead}: ${error.detail}`;
|
|
189
|
+
default:
|
|
190
|
+
return `${lead}. ${error.detail.charAt(0).toUpperCase()}${error.detail.slice(1)}.`;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function describeSource(source) {
|
|
194
|
+
switch (source.kind) {
|
|
195
|
+
case 'flag':
|
|
196
|
+
case 'argument':
|
|
197
|
+
case 'setting':
|
|
198
|
+
return source.name;
|
|
199
|
+
case 'rc':
|
|
200
|
+
return `.nowlinerc ${source.key}`;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// `a`, `a or b`, `a, b, or c`.
|
|
204
|
+
export function formatChoices(names) {
|
|
205
|
+
if (names.length <= 2)
|
|
206
|
+
return names.join(' or ');
|
|
207
|
+
return `${names.slice(0, -1).join(', ')}, or ${names[names.length - 1]}`;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,sEAAsE;AACtE,sEAAsE;AACtE,mCAAmC;AAEnC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACH,eAAe,EAMf,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAuB,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAOzD,MAAM,YAAY,GAA8B,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAElF,wFAAwF;AACxF,SAAS,aAAa,CAAC,GAAY;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAC1E,CAAC;AAED,+DAA+D;AAC/D,SAAS,aAAa,CAAC,GAAY;IAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;IACxE,IAAI,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC7B,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACtD,2EAA2E;IAC3E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,IAAI,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACnF,CAAC;AACL,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1C,GAAG,oBAAoB;IACvB,WAAW,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAgC;IAC/F,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAwB;IACxE,aAAa,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAwB;IACrF,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAwB;IAC3E,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAwB;IAC3E,QAAQ,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAyB;IACjF,cAAc,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAyB;IACxF,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAwB;IACvE,SAAS,EAAE,eAAqC;CACnD,CAAC,CAAC;AAKH,6EAA6E;AAC7E,MAAM,UAAU,GAAoD;IAChE,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO;IACZ,QAAQ,EAAE,aAAa;IACvB,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;IAC5B,MAAM,EAAE,UAAU;IAClB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,YAAY;IACtB,cAAc,EAAE,oBAAoB;IACpC,SAAS,EAAE,cAAc;CAC5B,CAAC;AAmCF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC7B,IAAgB,EAChB,MAAwB,EACxB,OAAO,GAA0D,EAAE;IAEnE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE1E,6EAA6E;IAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,qBAAqB,CAC5D,MAAM,EACN,EAAE,KAAK,EAAE,OAAO,EAAE,EAClB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAC7B,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,IAAI,GAAG,CACpB,CAAC,GAAG,aAAa,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CACtE,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,GAAiB,EAAwB,EAAE;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC;IAEF,OAAO;QACH,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;QAC9C,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC;QACzF,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,WAAW,EAAE,GAAG,EAAE,CACd,UAAU,CAAC;YACP,OAAO,CAAC,OAAO,CAAC;YAChB,IAAI,CAAC,KAAK;YACV,OAAO,CAAC,KAAK,CAAC;YACd,OAAO,CAAC,OAAO,CAAC;YAChB,OAAO,CAAC,YAAY,CAAC;YACrB,OAAO,CAAC,WAAW,CAAC;SACvB,CAAC;QACN,sBAAsB,EAAE,GAAG,EAAE,CACzB,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;KACnF,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,UAA6C;IAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,SAAS;YAAE,MAAM,SAAS,CAAC;IACnC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IAC/B,OAAO;QACH,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;QACxE,MAAM,EAAE;YACJ,gFAAgF;YAChF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;YAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iEAAiE;YACjE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS;YACpC,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACnD;KACJ,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,GAAuB;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;YAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,CAAC;QACD,MAAM,GAAG,CAAC;IACd,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,SAAS,iBAAiB,CACtB,KAAyB,EACzB,QAAiB,EACjB,MAA0B,EAC1B,GAAY;IAEZ,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,QAAQ,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA0B;IACxD,MAAM,IAAI,GAAG,oBAAoB,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACvF,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,GAAG,IAAI,cAAc,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;IACjF,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC;QAChB,mEAAmE;QACnE,KAAK,KAAK;YACN,OAAO,GAAG,IAAI,cAAc,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC;QACzE,0DAA0D;QAC1D,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACtC;YACI,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3F,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,MAA6B;IACjD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS;YACV,OAAO,MAAM,CAAC,IAAI,CAAC;QACvB,KAAK,IAAI;YACL,OAAO,cAAc,MAAM,CAAC,GAAG,EAAE,CAAC;IAC1C,CAAC;AACL,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,aAAa,CAAC,KAAwB;IAClD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAOjD,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5E;AA6BD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAU5E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { defaultInitOutputPath, initNameHasIncompatibleExtension } from '../cli/output-path.js';
|
|
2
2
|
import { TEMPLATE_NAMES, TEMPLATES } from '../generated/templates.js';
|
|
3
3
|
import { CliError, ExitCode } from '../io/exit-codes.js';
|
|
4
|
+
import { createLog } from '../io/log.js';
|
|
4
5
|
import { writeOutput } from '../io/write.js';
|
|
5
6
|
/**
|
|
6
7
|
* `--init` mode handler. Scaffolds a starter `.nowline` file in cwd.
|
|
@@ -29,9 +30,7 @@ export async function initHandler(options) {
|
|
|
29
30
|
const rendered = applyName(templateText, titleName);
|
|
30
31
|
const outputPath = args.output ?? defaultInitOutputPath({ name: projectName, cwd });
|
|
31
32
|
await writeOutput(outputPath, rendered, 'text', { cwd });
|
|
32
|
-
|
|
33
|
-
process.stderr.write(`nowline: wrote ${outputPath}\n`);
|
|
34
|
-
}
|
|
33
|
+
createLog(args.logLevel).verbose(`nowline: wrote ${outputPath}`);
|
|
35
34
|
}
|
|
36
35
|
function parseTemplateName(raw) {
|
|
37
36
|
const value = (raw ?? '').toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,SAAS,EAAqB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQ7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IACzD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAEnC,IACI,UAAU,KAAK,SAAS;QACxB,UAAU,KAAK,EAAE;QACjB,gCAAgC,CAAC,UAAU,CAAC,EAC9C,CAAC;QACC,MAAM,IAAI,QAAQ,CACd,QAAQ,CAAC,UAAU,EACnB,uDAAuD,UAAU,IAAI,CACxE,CAAC;IACN,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpF,MAAM,WAAW,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEzD,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ParsedArgs } from '../cli/args.js';
|
|
2
|
+
import { type HostEnv } from '../mcp-install/host.js';
|
|
3
|
+
export interface McpInstallOptions {
|
|
4
|
+
args: ParsedArgs;
|
|
5
|
+
host?: HostEnv;
|
|
6
|
+
stdout?: (chunk: string) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* `nowline --mcp-install [<client>]` / `--mcp-uninstall [<client>]`.
|
|
10
|
+
*
|
|
11
|
+
* Registers (or removes) the `nowline` MCP server in each harness's config.
|
|
12
|
+
* JSON configs are edited in place; Claude Code's user scope and Codex go
|
|
13
|
+
* through their own `mcp add`, since we can't safely edit ~/.claude.json or
|
|
14
|
+
* TOML; YAML and undocumented paths get a paste-ready snippet. One client
|
|
15
|
+
* failing doesn't stop the rest; the run then exits with OutputError.
|
|
16
|
+
*/
|
|
17
|
+
export declare function mcpInstallHandler({ args, host, stdout, }: McpInstallOptions): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=mcp-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-install.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUrE,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAWD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,EACpC,IAAI,EACJ,IAAsB,EACtB,MAEC,GACJ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BnC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../io/exit-codes.js';
|
|
2
|
+
import { createLog } from '../io/log.js';
|
|
3
|
+
import { CLIENT_IDS, CLIENTS, commandLine, findClient, SERVER_NAME, } from '../mcp-install/clients.js';
|
|
4
|
+
import { createHostEnv } from '../mcp-install/host.js';
|
|
5
|
+
import { JsonConfigError, readConfigFile, removeEntry, upsertEntry, writeConfigFile, } from '../mcp-install/json-config.js';
|
|
6
|
+
import { resolveServer } from '../mcp-install/server-command.js';
|
|
7
|
+
/**
|
|
8
|
+
* `nowline --mcp-install [<client>]` / `--mcp-uninstall [<client>]`.
|
|
9
|
+
*
|
|
10
|
+
* Registers (or removes) the `nowline` MCP server in each harness's config.
|
|
11
|
+
* JSON configs are edited in place; Claude Code's user scope and Codex go
|
|
12
|
+
* through their own `mcp add`, since we can't safely edit ~/.claude.json or
|
|
13
|
+
* TOML; YAML and undocumented paths get a paste-ready snippet. One client
|
|
14
|
+
* failing doesn't stop the rest; the run then exits with OutputError.
|
|
15
|
+
*/
|
|
16
|
+
export async function mcpInstallHandler({ args, host = createHostEnv(), stdout = (chunk) => {
|
|
17
|
+
process.stdout.write(chunk);
|
|
18
|
+
}, }) {
|
|
19
|
+
const uninstall = args.mode === 'mcp-uninstall';
|
|
20
|
+
const flag = uninstall ? '--mcp-uninstall' : '--mcp-install';
|
|
21
|
+
const scope = args.scope ?? 'user';
|
|
22
|
+
const log = createLog(args.logLevel);
|
|
23
|
+
const out = (line) => stdout(`${line}\n`);
|
|
24
|
+
const clients = selectClients(args.positional, scope, flag, host, out);
|
|
25
|
+
const server = resolveServer(args.server ?? 'self', args.root, host);
|
|
26
|
+
if (!uninstall)
|
|
27
|
+
for (const warning of server.warnings)
|
|
28
|
+
log.notice(warning);
|
|
29
|
+
const run = { uninstall, dryRun: args.dryRun, scope, entry: server.entry, host, out };
|
|
30
|
+
const failed = [];
|
|
31
|
+
for (const client of clients) {
|
|
32
|
+
try {
|
|
33
|
+
applyTarget(client, run);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (!(err instanceof JsonConfigError || err instanceof ClientFailure))
|
|
37
|
+
throw err;
|
|
38
|
+
failed.push(client.id);
|
|
39
|
+
process.stderr.write(`nowline: ${client.id}: ${err.message}\n`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (failed.length > 0) {
|
|
43
|
+
throw new CliError(ExitCode.OutputError, `nowline: ${flag} failed for ${failed.join(', ')}.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
class ClientFailure extends Error {
|
|
47
|
+
}
|
|
48
|
+
function selectClients(requested, scope, flag, host, out) {
|
|
49
|
+
if (requested !== undefined && requested !== 'all') {
|
|
50
|
+
const client = findClient(requested);
|
|
51
|
+
if (!client) {
|
|
52
|
+
throw new CliError(ExitCode.InputError, `nowline: unknown client "${requested}". Expected one of: ${CLIENT_IDS.join(', ')}, all.`);
|
|
53
|
+
}
|
|
54
|
+
if (!client.scopes.includes(scope)) {
|
|
55
|
+
throw new CliError(ExitCode.InputError, `nowline: ${client.id} has no ${scope} config; use --scope ${client.scopes.join(' or ')}.`);
|
|
56
|
+
}
|
|
57
|
+
return [client];
|
|
58
|
+
}
|
|
59
|
+
const detected = CLIENTS.filter((client) => client.detect(host));
|
|
60
|
+
if (detected.length === 0) {
|
|
61
|
+
throw new CliError(ExitCode.InputError, `nowline: no supported agent found on this machine. Name one: nowline ${flag} <client>, where <client> is one of: ${CLIENT_IDS.join(', ')}.`);
|
|
62
|
+
}
|
|
63
|
+
return detected.filter((client) => {
|
|
64
|
+
if (client.scopes.includes(scope))
|
|
65
|
+
return true;
|
|
66
|
+
out(`${client.id}: skipped, it has no ${scope} config`);
|
|
67
|
+
return false;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function applyTarget(client, run) {
|
|
71
|
+
const target = client.target(run.scope, run.entry, run.host);
|
|
72
|
+
if (target.kind === 'json')
|
|
73
|
+
return applyJson(client, target, run);
|
|
74
|
+
if (target.kind === 'cli') {
|
|
75
|
+
if (run.host.findAllOnPath(target.binary).length === 0) {
|
|
76
|
+
return applyPrint(client, target.fallback, run);
|
|
77
|
+
}
|
|
78
|
+
return applyCli(client, target, run);
|
|
79
|
+
}
|
|
80
|
+
return applyPrint(client, target, run);
|
|
81
|
+
}
|
|
82
|
+
function applyJson(client, target, run) {
|
|
83
|
+
const existing = readConfigFile(target.path);
|
|
84
|
+
const edit = run.uninstall
|
|
85
|
+
? removeEntry(existing, target, run.entry)
|
|
86
|
+
: upsertEntry(existing, target, run.entry);
|
|
87
|
+
const where = target.path;
|
|
88
|
+
if (edit.change === 'unchanged')
|
|
89
|
+
return run.out(`${client.id}: already installed in ${where}`);
|
|
90
|
+
if (edit.change === 'absent')
|
|
91
|
+
return run.out(`${client.id}: not installed in ${where}`);
|
|
92
|
+
const [verb, object] = edit.change === 'created'
|
|
93
|
+
? ['create', where]
|
|
94
|
+
: edit.change === 'removed'
|
|
95
|
+
? ['remove', `${SERVER_NAME} from ${where}`]
|
|
96
|
+
: edit.change === 'added'
|
|
97
|
+
? ['add', `${SERVER_NAME} to ${where}`]
|
|
98
|
+
: ['update', `${SERVER_NAME} in ${where}`];
|
|
99
|
+
if (run.dryRun) {
|
|
100
|
+
run.out(`${client.id}: would ${verb} ${object}`);
|
|
101
|
+
if (edit.value !== undefined) {
|
|
102
|
+
run.out(indent(JSON.stringify({ [edit.keyPath.join('.')]: edit.value }, null, 2)));
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (edit.text !== undefined)
|
|
107
|
+
writeConfigFile(target.path, edit.text);
|
|
108
|
+
const hint = target.hint !== undefined && !run.uninstall ? `; ${target.hint}` : '';
|
|
109
|
+
run.out(`${client.id}: ${verb.endsWith('e') ? `${verb}d` : `${verb}ed`} ${object}${hint}`);
|
|
110
|
+
}
|
|
111
|
+
function applyCli(client, target, run) {
|
|
112
|
+
const remove = [target.binary, ...target.remove];
|
|
113
|
+
const add = [target.binary, ...target.add];
|
|
114
|
+
if (run.dryRun) {
|
|
115
|
+
run.out(`${client.id}: would run:`);
|
|
116
|
+
run.out(indent(commandLine(remove)));
|
|
117
|
+
if (!run.uninstall)
|
|
118
|
+
run.out(indent(commandLine(add)));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Remove first so a re-run replaces a stale entry instead of failing on a duplicate.
|
|
122
|
+
const removed = run.host.spawn(target.binary, target.remove);
|
|
123
|
+
if (run.uninstall) {
|
|
124
|
+
if (removed.status === 0) {
|
|
125
|
+
return run.out(`${client.id}: removed ${SERVER_NAME} (${commandLine(remove)})`);
|
|
126
|
+
}
|
|
127
|
+
return run.out(`${client.id}: nothing removed; ${commandLine(remove)} said: ${firstLine(removed.stderr || removed.stdout || removed.error)}`);
|
|
128
|
+
}
|
|
129
|
+
const added = run.host.spawn(target.binary, target.add);
|
|
130
|
+
if (added.status !== 0) {
|
|
131
|
+
const reason = firstLine(added.stderr || added.stdout || added.error);
|
|
132
|
+
throw new ClientFailure(`${commandLine(add)} failed${added.status !== null ? ` (exit ${added.status})` : ''}: ${reason}`);
|
|
133
|
+
}
|
|
134
|
+
run.out(`${client.id}: registered (${commandLine(add)})`);
|
|
135
|
+
}
|
|
136
|
+
function applyPrint(client, target, run) {
|
|
137
|
+
const step = run.uninstall ? target.uninstall : target.install;
|
|
138
|
+
run.out(`${client.id}: ${step.instructions}`);
|
|
139
|
+
if (step.snippet !== undefined)
|
|
140
|
+
run.out(indent(step.snippet));
|
|
141
|
+
}
|
|
142
|
+
function indent(text) {
|
|
143
|
+
return text
|
|
144
|
+
.split('\n')
|
|
145
|
+
.map((line) => ` ${line}`)
|
|
146
|
+
.join('\n');
|
|
147
|
+
}
|
|
148
|
+
function firstLine(text) {
|
|
149
|
+
return text?.trim().split('\n')[0] ?? 'no output';
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=mcp-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-install.js","sourceRoot":"","sources":["../../src/commands/mcp-install.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACH,UAAU,EACV,OAAO,EAGP,WAAW,EACX,UAAU,EAIV,WAAW,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AACrE,OAAO,EACH,eAAe,EACf,cAAc,EACd,WAAW,EACX,WAAW,EACX,eAAe,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAoB,MAAM,kCAAkC,CAAC;AAiBnF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACpC,IAAI,EACJ,IAAI,GAAG,aAAa,EAAE,EACtB,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC,GACe;IAChB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;IACnC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrE,IAAI,CAAC,SAAS;QAAE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;YAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3E,MAAM,GAAG,GAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,GAAG,YAAY,eAAe,IAAI,GAAG,YAAY,aAAa,CAAC;gBAAE,MAAM,GAAG,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CACd,QAAQ,CAAC,WAAW,EACpB,YAAY,IAAI,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtD,CAAC;IACN,CAAC;AACL,CAAC;AAED,MAAM,aAAc,SAAQ,KAAK;CAAG;AAEpC,SAAS,aAAa,CAClB,SAA6B,EAC7B,KAAY,EACZ,IAAY,EACZ,IAAa,EACb,GAA2B;IAE3B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,QAAQ,CACd,QAAQ,CAAC,UAAU,EACnB,4BAA4B,SAAS,uBAAuB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAC5F,CAAC;QACN,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CACd,QAAQ,CAAC,UAAU,EACnB,YAAY,MAAM,CAAC,EAAE,WAAW,KAAK,wBAAwB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAC7F,CAAC;QACN,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,QAAQ,CACd,QAAQ,CAAC,UAAU,EACnB,wEAAwE,IAAI,wCAAwC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC/I,CAAC;IACN,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,wBAAwB,KAAK,SAAS,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,WAAW,CAAC,MAAwB,EAAE,GAAQ;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,MAAwB,EAAE,MAAkB,EAAE,GAAQ;IACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS;QACtB,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC;QAC1C,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,0BAA0B,KAAK,EAAE,CAAC,CAAC;IAC/F,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAExF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAChB,IAAI,CAAC,MAAM,KAAK,SAAS;QACrB,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,WAAW,SAAS,KAAK,EAAE,CAAC;YAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO;gBACvB,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,WAAW,OAAO,KAAK,EAAE,CAAC;gBACvC,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,WAAW,OAAO,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,WAAW,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,QAAQ,CAAC,MAAwB,EAAE,MAAiB,EAAE,GAAQ;IACnE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO;IACX,CAAC;IACD,qFAAqF;IACrF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,aAAa,WAAW,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CACV,GAAG,MAAM,CAAC,EAAE,sBAAsB,WAAW,CAAC,MAAM,CAAC,UAAU,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAChI,CAAC;IACN,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,aAAa,CACnB,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CACnG,CAAC;IACN,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,iBAAiB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,UAAU,CAAC,MAAwB,EAAE,MAAmB,EAAE,GAAQ;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAC/D,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IACxB,OAAO,IAAI;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5B,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,IAAwB;IACvC,OAAO,IAAI,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD;;;;;;;;;;;GAWG;AACH,wBAAsB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC9E"}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
|
-
import { StdioServerTransport } from '@modelcontextprotocol/
|
|
3
|
-
import {
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
|
|
3
|
+
import { createMcpHttpHandler } from '@nowline/mcp/http';
|
|
4
4
|
import { createMcpServer } from '@nowline/mcp/server';
|
|
5
|
+
import { createLog } from '../io/log.js';
|
|
5
6
|
/**
|
|
6
7
|
* `nowline --mcp` handler.
|
|
7
8
|
*
|
|
@@ -16,23 +17,16 @@ import { createMcpServer } from '@nowline/mcp/server';
|
|
|
16
17
|
*/
|
|
17
18
|
export async function mcpHandler({ args }) {
|
|
18
19
|
const root = args.root ?? process.cwd();
|
|
19
|
-
const server = createMcpServer({ allowedRoot: root });
|
|
20
20
|
const portStr = args.port;
|
|
21
21
|
if (portStr !== undefined) {
|
|
22
22
|
const port = parseInt(portStr, 10);
|
|
23
23
|
if (!Number.isFinite(port) || port < 1 || port > 65535) {
|
|
24
24
|
throw new Error(`nowline: --port must be a number between 1 and 65535 (got ${portStr}).`);
|
|
25
25
|
}
|
|
26
|
-
const
|
|
27
|
-
sessionIdGenerator: undefined,
|
|
28
|
-
});
|
|
29
|
-
await server.connect(transport);
|
|
30
|
-
const httpServer = createServer(async (req, res) => {
|
|
31
|
-
await transport.handleRequest(req, res);
|
|
32
|
-
});
|
|
26
|
+
const httpServer = createServer(createMcpHttpHandler(() => createMcpServer({ allowedRoot: root })));
|
|
33
27
|
await new Promise((resolve) => {
|
|
34
28
|
httpServer.listen(port, '127.0.0.1', () => {
|
|
35
|
-
|
|
29
|
+
createLog(args.logLevel).notice(`nowline: MCP Streamable HTTP listening on http://127.0.0.1:${port}`);
|
|
36
30
|
});
|
|
37
31
|
httpServer.on('close', resolve);
|
|
38
32
|
process.on('SIGINT', () => httpServer.close());
|
|
@@ -41,7 +35,7 @@ export async function mcpHandler({ args }) {
|
|
|
41
35
|
}
|
|
42
36
|
else {
|
|
43
37
|
const transport = new StdioServerTransport();
|
|
44
|
-
await
|
|
38
|
+
await createMcpServer({ allowedRoot: root }).connect(transport);
|
|
45
39
|
await new Promise((resolve) => {
|
|
46
40
|
transport.onclose = resolve;
|
|
47
41
|
});
|
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,EAAwB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CACX,6DAA6D,OAAO,IAAI,CAC3E,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAC3B,oBAAoB,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CACrE,CAAC;QAEF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBACtC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC3B,8DAA8D,IAAI,EAAE,CACvE,CAAC;YACN,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChC,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;QAChC,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { AssetResolver } from '@nowline/renderer';
|
|
2
2
|
import type { ParsedArgs } from '../cli/args.js';
|
|
3
|
+
import { type LoadConfigResult } from '../io/config.js';
|
|
4
|
+
import { type Log } from '../io/log.js';
|
|
3
5
|
export interface RenderHandlerOptions {
|
|
4
6
|
args: ParsedArgs;
|
|
5
7
|
/** Test seam: cwd override. Defaults to `process.cwd()`. */
|
|
@@ -11,5 +13,10 @@ export interface RenderHandlerOptions {
|
|
|
11
13
|
* step), `--input-format`, and `.json` AST input.
|
|
12
14
|
*/
|
|
13
15
|
export declare function renderHandler(options: RenderHandlerOptions): Promise<void>;
|
|
16
|
+
export declare function loadConfigFor(inputArg: string, cwd: string): Promise<LoadConfigResult>;
|
|
17
|
+
/** Under `-q`, text-mode diagnostics keep only errors. Shared with serve. */
|
|
18
|
+
export declare function errorsOnlyWhenQuiet<T extends {
|
|
19
|
+
severity: string;
|
|
20
|
+
}>(diagnostics: T[], log: Log): T[];
|
|
14
21
|
export declare function createAssetResolver(assetRoot: string): AssetResolver;
|
|
15
22
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0BjD,OAAO,EAAE,KAAK,gBAAgB,EAAc,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EAAa,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AAInD,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGhF;AA2XD,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAW5F;AAyCD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC9D,WAAW,EAAE,CAAC,EAAE,EAChB,GAAG,EAAE,GAAG,GACT,CAAC,EAAE,CAEL;AAID,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAWpE"}
|