@nowline/cli 0.0.0-dev.20260601071750.g04bdff9 → 0.0.0-dev.20260603150914.g70caedb

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.
@@ -1,4 +1,4 @@
1
- export type ModeKind = 'render' | 'serve' | 'init' | 'help' | 'version';
1
+ export type ModeKind = 'render' | 'serve' | 'init' | 'mcp' | 'help' | 'version';
2
2
  export interface ParsedArgs {
3
3
  /** Resolved mode after dispatch (mutual-exclusivity already checked). */
4
4
  mode: ModeKind;
@@ -42,6 +42,7 @@ export interface ParsedArgs {
42
42
  open: boolean;
43
43
  diagnosticFormat?: string;
44
44
  template?: string;
45
+ root?: string;
45
46
  }
46
47
  /**
47
48
  * Pure argument parser. Walks `argv` once, identifies mode flags, applies
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,UAAU;IACvB,yEAAyE;IACzE,IAAI,EAAE,QAAQ,CAAC;IACf,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAGzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;8CAI0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IAGd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAsK7D"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,UAAU;IACvB,yEAAyE;IACzE,IAAI,EAAE,QAAQ,CAAC;IACf,uGAAuG;IACvG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAGzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;8CAI0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IAGd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA4K7D"}
package/dist/cli/args.js CHANGED
@@ -33,6 +33,7 @@ export function parseArgv(argv) {
33
33
  'input-format': { type: 'string' },
34
34
  serve: { type: 'boolean' },
35
35
  init: { type: 'boolean' },
36
+ mcp: { type: 'boolean' },
36
37
  'dry-run': { type: 'boolean', short: 'n' },
37
38
  theme: { type: 'string', short: 't' },
38
39
  // `--now <date>` overrides the now-line position; without it, the
@@ -50,6 +51,8 @@ export function parseArgv(argv) {
50
51
  open: { type: 'boolean' },
51
52
  'diagnostic-format': { type: 'string' },
52
53
  template: { type: 'string' },
54
+ // MCP
55
+ root: { type: 'string' },
53
56
  // Format-specific (m2c)
54
57
  'page-size': { type: 'string' },
55
58
  orientation: { type: 'string' },
@@ -102,12 +105,14 @@ export function parseArgv(argv) {
102
105
  modes.push('serve');
103
106
  if (values.init === true)
104
107
  modes.push('init');
108
+ if (values.mcp === true)
109
+ modes.push('mcp');
105
110
  if (modes.length > 1) {
106
111
  throw new CliError(ExitCode.InputError, `nowline: --${modes[0]} and --${modes[1]} are mutually exclusive.`);
107
112
  }
108
113
  const dryRun = values['dry-run'] === true;
109
114
  const mode = modes[0] ?? 'render';
110
- if (dryRun && (mode === 'serve' || mode === 'init')) {
115
+ if (dryRun && (mode === 'serve' || mode === 'init' || mode === 'mcp')) {
111
116
  throw new CliError(ExitCode.InputError, `nowline: --dry-run cannot be combined with --${mode}.`);
112
117
  }
113
118
  if (positionals.length > 1) {
@@ -146,6 +151,7 @@ export function parseArgv(argv) {
146
151
  headless: values.headless === true,
147
152
  start: stringOrUndefined(values.start),
148
153
  locale: stringOrUndefined(values.locale),
154
+ root: stringOrUndefined(values.root),
149
155
  };
150
156
  }
151
157
  function stringOrUndefined(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAqFA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AA+FA,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
package/dist/cli/help.js CHANGED
@@ -30,6 +30,10 @@ MODE FLAGS (mutually exclusive)
30
30
  rendered output to disk on each rebuild.
31
31
  --init [<name>] Scaffold a starter .nowline file in cwd. Positional
32
32
  becomes project name; .nowline appended if missing.
33
+ --mcp Start a Model Context Protocol (MCP) stdio server
34
+ exposing validate, render, export, and file tools.
35
+ Shares the same @nowline/mcp server code as
36
+ \`npx @nowline/mcp\`.
33
37
  -n, --dry-run Run the full pipeline (parse + validate + layout +
34
38
  format) but skip the write step. Subsumes the old
35
39
  'validate' verb. Exit 0 on success, 1 on errors.
@@ -56,6 +60,10 @@ SERVE OPTIONS
56
60
  --host <host> Bind address (default: 127.0.0.1).
57
61
  --open Open the browser on start.
58
62
 
63
+ MCP OPTIONS
64
+ --root <dir> Allowed-root directory for file tools (default: cwd).
65
+ File paths are resolved and restricted to this root.
66
+
59
67
  LOGGING (mutually exclusive)
60
68
  -v, --verbose Print extra diagnostics to stderr.
61
69
  -q, --quiet Suppress non-error stderr.
@@ -74,6 +82,8 @@ EXAMPLES
74
82
  nowline roadmap.nowline --dry-run # validate-only
75
83
  nowline roadmap.nowline --serve -p 8080 # live preview
76
84
  nowline --init my-project # scaffold ./my-project.nowline
85
+ nowline --mcp # start MCP stdio server in cwd
86
+ nowline --mcp --root ./roadmaps # MCP server with custom root
77
87
 
78
88
  EXIT CODES
79
89
  0 Success
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,sEAAsE;AACtE,oEAAoE;AACpE,2DAA2D;AAC3D,MAAM,SAAS,GAAG,WAAW,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8E/C,CAAC;AAEF,MAAM,UAAU,UAAU;IACtB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,GAAG,iBAAiB,EAAE,IAAI,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,sEAAsE;AACtE,oEAAoE;AACpE,2DAA2D;AAC3D,MAAM,SAAS,GAAG,WAAW,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwF/C,CAAC;AAEF,MAAM,UAAU,UAAU;IACtB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,GAAG,iBAAiB,EAAE,IAAI,CAAC;AACtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ParsedArgs } from '../cli/args.js';
2
+ /**
3
+ * `nowline --mcp` handler.
4
+ *
5
+ * Starts a Model Context Protocol stdio server sharing the same @nowline/mcp
6
+ * server factory as `npx @nowline/mcp`. Runs until the process receives
7
+ * SIGINT/SIGTERM or the client closes stdin.
8
+ */
9
+ export declare function mcpHandler({ args }: {
10
+ args: ParsedArgs;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E"}
@@ -0,0 +1,20 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createMcpServer } from '@nowline/mcp/server';
3
+ /**
4
+ * `nowline --mcp` handler.
5
+ *
6
+ * Starts a Model Context Protocol stdio server sharing the same @nowline/mcp
7
+ * server factory as `npx @nowline/mcp`. Runs until the process receives
8
+ * SIGINT/SIGTERM or the client closes stdin.
9
+ */
10
+ export async function mcpHandler({ args }) {
11
+ const root = args.root ?? process.cwd();
12
+ const server = createMcpServer({ allowedRoot: root });
13
+ const transport = new StdioServerTransport();
14
+ await server.connect(transport);
15
+ // Keep alive: the transport closes when stdin closes or the process is signalled.
16
+ await new Promise((resolve) => {
17
+ transport.onclose = resolve;
18
+ });
19
+ }
20
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,EAAwB;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,kFAAkF;IAClF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChC,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type AssetResolver } from '@nowline/renderer';
1
+ import type { AssetResolver } from '@nowline/renderer';
2
2
  import type { ParsedArgs } from '../cli/args.js';
3
3
  export interface RenderHandlerOptions {
4
4
  args: ParsedArgs;
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAwBjD,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,CA4FhF;AA6ZD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAWpE"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAwBjD,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,CA4FhF;AA+XD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAWpE"}
@@ -1,15 +1,14 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import { resolveIncludes } from '@nowline/core';
3
+ import { exportDocument, } from '@nowline/export';
4
4
  import { lengthToPoints, parseLength } from '@nowline/export-core';
5
- import { layoutRoadmap, normalizeThemeName } from '@nowline/layout';
6
- import { renderSvg } from '@nowline/renderer';
5
+ import { normalizeThemeName } from '@nowline/layout';
7
6
  import { FormatResolutionError, isInputFormat, resolveFormat, } from '../cli/formats.js';
8
7
  import { resolveRenderOutputPath } from '../cli/output-path.js';
9
8
  import { parseNowlineJson } from '../convert/parse-json.js';
10
9
  import { printNowlineFile } from '../convert/printer.js';
11
10
  import { serializeToJson } from '../convert/schema.js';
12
- import { getServices, parseSource } from '../core/parse.js';
11
+ import { parseSource } from '../core/parse.js';
13
12
  import { formatDiagnostics } from '../diagnostics/index.js';
14
13
  import { describeContentLocaleSource, operatorLocale, readDirectiveLocale, resolveLocaleOverride, } from '../i18n/locale.js';
15
14
  import { loadConfig } from '../io/config.js';
@@ -125,67 +124,53 @@ function resolveInputFormat(inputArg, override) {
125
124
  return 'json';
126
125
  return 'nowline';
127
126
  }
127
+ const BINARY_FORMATS = new Set(['png', 'pdf', 'xlsx']);
128
+ const FONT_FORMATS = new Set(['png', 'pdf']);
128
129
  async function produce(args) {
129
- if (args.format === 'json') {
130
- return { rendered: await produceJson(args), isBinary: false };
131
- }
130
+ // `nowline` canonical-text format is not part of ExportFormat; handle here.
132
131
  if (args.format === 'nowline') {
133
132
  return { rendered: await produceCanonicalNowline(args), isBinary: false };
134
133
  }
135
- // The remaining formats all start from a positioned model + (sometimes) an
136
- // SVG. Build them once and dispatch to the format-specific exporter via
137
- // dynamic import — keeps each exporter's heavy deps off cold paths and
138
- // leaves room to re-extract a package later if a future build profile
139
- // wants to slim down.
140
- const stage = await stageRoadmap(args);
141
- if (args.format === 'svg') {
142
- return { rendered: stage.svg, isBinary: false };
134
+ // Convert JSON-AST input to DSL text before handing to the kernel.
135
+ const sourceText = args.inputFormat === 'json'
136
+ ? jsonToNowlineText(args.contents, args.displayPath)
137
+ : args.contents;
138
+ // Pre-validate with locale-aware diagnostic formatting so validation
139
+ // errors reach the operator in their locale. The kernel will re-parse
140
+ // the same source below — double work accepted in exchange for faithful
141
+ // stderr output.
142
+ await parseAndValidate(sourceText, args);
143
+ const assetRoot = args.assetRoot
144
+ ? path.resolve(args.assetRoot)
145
+ : path.dirname(args.absInputPath);
146
+ const host = createNodeHostEnv(assetRoot);
147
+ // Resolve fonts lazily — only for formats that rasterize or embed them.
148
+ let fonts;
149
+ if (FONT_FORMATS.has(args.format)) {
150
+ fonts = await resolveNodeFonts(args);
143
151
  }
152
+ const kernelInputs = {
153
+ sourcePath: args.absInputPath,
154
+ today: args.today,
155
+ locale: args.locale ?? 'und',
156
+ theme: args.theme,
157
+ fonts,
158
+ width: args.width,
159
+ noLinks: args.noLinks,
160
+ strict: args.strict,
161
+ pageSize: args.pageSize,
162
+ orientation: parseOrientation(args.orientation),
163
+ marginPt: parseMargin(args.margin),
164
+ pngScale: parseScale(args.scale),
165
+ msprojStart: args.start,
166
+ };
144
167
  try {
145
- if (args.format === 'html') {
146
- const mod = await import('@nowline/export-html');
147
- const html = await mod.exportHtml(stage.exportInputs, stage.svg);
148
- return { rendered: html, isBinary: false };
149
- }
150
- if (args.format === 'mermaid') {
151
- const mod = await import('@nowline/export-mermaid');
152
- const md = mod.exportMermaid(stage.exportInputs);
153
- return { rendered: md, isBinary: false };
154
- }
155
- if (args.format === 'msproj') {
156
- const mod = await import('@nowline/export-msproj');
157
- const xml = mod.exportMsProjXml(stage.exportInputs, {
158
- startDate: args.start,
159
- });
160
- return { rendered: xml, isBinary: false };
161
- }
162
- if (args.format === 'png') {
163
- const fonts = await stage.fontPair();
164
- const mod = await import('@nowline/export-png');
165
- const png = await mod.exportPng(stage.exportInputs, stage.svg, {
166
- scale: parseScale(args.scale),
167
- fonts,
168
- });
169
- return { rendered: png, isBinary: true };
170
- }
171
- if (args.format === 'pdf') {
172
- const fonts = await stage.fontPair();
173
- const mod = await import('@nowline/export-pdf');
174
- const pdf = await mod.exportPdf(stage.exportInputs, stage.svg, {
175
- pageSize: args.pageSize,
176
- orientation: parseOrientation(args.orientation),
177
- marginPt: parseMargin(args.margin),
178
- fonts,
179
- });
180
- return { rendered: pdf, isBinary: true };
181
- }
182
- if (args.format === 'xlsx') {
183
- const mod = await import('@nowline/export-xlsx');
184
- const xlsx = await mod.exportXlsx(stage.exportInputs, {
185
- generated: args.today,
186
- });
187
- return { rendered: xlsx, isBinary: true };
188
- }
168
+ const bytes = await exportDocument(sourceText, args.format, kernelInputs, host);
169
+ const isBinary = BINARY_FORMATS.has(args.format);
170
+ const rendered = isBinary
171
+ ? bytes
172
+ : new TextDecoder('utf-8').decode(bytes);
173
+ return { rendered, isBinary };
189
174
  }
190
175
  catch (err) {
191
176
  if (err instanceof CliError)
@@ -193,19 +178,64 @@ async function produce(args) {
193
178
  const message = err instanceof Error ? err.message : String(err);
194
179
  throw new CliError(ExitCode.OutputError, `nowline: ${args.format} export failed: ${message}`);
195
180
  }
196
- throw new CliError(ExitCode.InputError, `nowline: unsupported format "${args.format}".`);
197
181
  }
198
- async function produceJson(args) {
199
- if (args.inputFormat === 'json') {
200
- // Re-parse JSON → DSL → JSON to canonicalize through @nowline/core.
201
- const { ast } = parseNowlineJson(args.contents, args.displayPath);
202
- const text = printNowlineFile(ast);
203
- const parsed = await parseAndValidate(text, args);
204
- return JSON.stringify(serializeToJson(parsed.document, text), null, 2);
182
+ // ---- Node HostEnv -----------------------------------------------------------
183
+ function createNodeHostEnv(assetRoot) {
184
+ const root = path.resolve(assetRoot);
185
+ return {
186
+ readSource: async (absPath) => {
187
+ return await fs.readFile(absPath, 'utf-8');
188
+ },
189
+ readAsset: async (ref) => {
190
+ const absPath = path.resolve(root, ref);
191
+ if (!absPath.startsWith(root + path.sep) && absPath !== root) {
192
+ throw new Error(`Asset ${ref} escapes asset-root ${assetRoot}`);
193
+ }
194
+ const bytes = await fs.readFile(absPath);
195
+ return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
196
+ },
197
+ loadWasm: async () => {
198
+ // Two code paths:
199
+ //
200
+ // 1. Bun compiled binary: scripts/bun-entry.mjs imports
201
+ // dist/resvg.wasm via `with { type: 'file' }` (the only Bun
202
+ // pattern the bundler embeds) and stashes the VFS path in
203
+ // globalThis.__RESVG_WASM_PATH__. Read it with Bun.file().
204
+ //
205
+ // 2. Plain Node.js (dev, tests, uncompiled dist/index.js run):
206
+ // dist/resvg.wasm is copied by scripts/copy-wasm.mjs (postbuild).
207
+ // Use fs.readFile via a new URL relative to this module.
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ const bunWasmPath = globalThis.__RESVG_WASM_PATH__;
210
+ if (bunWasmPath) {
211
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
212
+ return globalThis.Bun.file(bunWasmPath).arrayBuffer();
213
+ }
214
+ const wasmUrl = new URL('../resvg.wasm', import.meta.url);
215
+ const bytes = await fs.readFile(wasmUrl);
216
+ return bytes.buffer;
217
+ },
218
+ };
219
+ }
220
+ // ---- Font resolution --------------------------------------------------------
221
+ async function resolveNodeFonts(args) {
222
+ const { resolveFonts } = await import('@nowline/export-core');
223
+ const result = await resolveFonts({
224
+ fontSans: args.fontSans,
225
+ fontMono: args.fontMono,
226
+ headless: args.headless,
227
+ });
228
+ if (args.strict) {
229
+ if (result.sansFellBackToBundled) {
230
+ process.stderr.write('warning: sans font fell back to bundled DejaVu (no platform font found)\n');
231
+ }
232
+ if (result.monoFellBackToBundled) {
233
+ process.stderr.write('warning: mono font fell back to bundled DejaVu (no platform font found)\n');
234
+ }
205
235
  }
206
- const parsed = await parseAndValidate(args.contents, args);
207
- return JSON.stringify(serializeToJson(parsed.document, args.contents), null, 2);
236
+ return { sans: result.sans, mono: result.mono };
208
237
  }
238
+ // ---- nowline canonical-text format (not part of ExportFormat) ---------------
209
239
  async function produceCanonicalNowline(args) {
210
240
  if (args.inputFormat === 'json') {
211
241
  const { ast } = parseNowlineJson(args.contents, args.displayPath);
@@ -215,74 +245,7 @@ async function produceCanonicalNowline(args) {
215
245
  const doc = serializeToJson(parsed.document, args.contents);
216
246
  return printNowlineFile(doc.ast);
217
247
  }
218
- async function stageRoadmap(args) {
219
- const parsed = await parseAndValidate(args.inputFormat === 'json'
220
- ? jsonToNowlineText(args.contents, args.displayPath)
221
- : args.contents, args);
222
- const resolved = await resolveIncludes(parsed.ast, args.absInputPath, {
223
- services: getServices().Nowline,
224
- });
225
- for (const diag of resolved.diagnostics) {
226
- if (diag.severity === 'error') {
227
- process.stderr.write(`${diag.sourcePath}: ${diag.message}\n`);
228
- }
229
- }
230
- if (resolved.diagnostics.some((d) => d.severity === 'error')) {
231
- throw new CliError(ExitCode.ValidationError, '');
232
- }
233
- const model = layoutRoadmap(parsed.ast, resolved, {
234
- theme: args.theme,
235
- today: args.today,
236
- width: args.width,
237
- locale: args.locale,
238
- });
239
- const assetRoot = args.assetRoot
240
- ? path.resolve(args.assetRoot)
241
- : path.dirname(args.absInputPath);
242
- const resolver = createAssetResolver(assetRoot);
243
- const warnings = [];
244
- const svg = await renderSvg(model, {
245
- assetResolver: resolver,
246
- noLinks: args.noLinks,
247
- strict: args.strict,
248
- warn: (msg) => warnings.push(msg),
249
- });
250
- for (const w of warnings) {
251
- process.stderr.write(`warning: ${w}\n`);
252
- }
253
- let cachedFonts;
254
- const fontPair = async () => {
255
- if (cachedFonts)
256
- return cachedFonts;
257
- const mod = await import('@nowline/export-core');
258
- const result = await mod.resolveFonts({
259
- fontSans: args.fontSans,
260
- fontMono: args.fontMono,
261
- headless: args.headless,
262
- });
263
- if (args.strict) {
264
- if (result.sansFellBackToBundled) {
265
- process.stderr.write('warning: sans font fell back to bundled DejaVu (no platform font found)\n');
266
- }
267
- if (result.monoFellBackToBundled) {
268
- process.stderr.write('warning: mono font fell back to bundled DejaVu (no platform font found)\n');
269
- }
270
- }
271
- cachedFonts = { sans: result.sans, mono: result.mono };
272
- return cachedFonts;
273
- };
274
- return {
275
- svg,
276
- exportInputs: {
277
- ast: parsed.ast,
278
- resolved,
279
- model,
280
- sourcePath: args.displayPath,
281
- today: args.today,
282
- },
283
- fontPair,
284
- };
285
- }
248
+ // ---- Shared helpers ---------------------------------------------------------
286
249
  function jsonToNowlineText(contents, displayPath) {
287
250
  const { ast } = parseNowlineJson(contents, displayPath);
288
251
  return printNowlineFile(ast);
@@ -409,6 +372,7 @@ function emitDiagnostics(diagnostics, source, displayPath, operatorLocale) {
409
372
  if (rendered)
410
373
  process.stderr.write(`${rendered}\n`);
411
374
  }
375
+ // ---- Asset resolver (still used by serve.ts) --------------------------------
412
376
  export function createAssetResolver(assetRoot) {
413
377
  const root = path.resolve(assetRoot);
414
378
  return async (ref) => {
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/commands/render.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export declare const CLI_VERSION = "0.0.0-dev.20260601071750.g04bdff9";
1
+ export declare const CLI_VERSION = "0.0.0-dev.20260603150914.g70caedb";
2
2
  export interface CliBuild {
3
3
  /** Short git SHA at build time, or empty when not in a git checkout. */
4
4
  readonly sha: string;
@@ -1,7 +1,7 @@
1
1
  // Auto-generated by scripts/bundle-templates.mjs. Do not edit by hand.
2
- export const CLI_VERSION = "0.0.0-dev.20260601071750.g04bdff9";
2
+ export const CLI_VERSION = "0.0.0-dev.20260603150914.g70caedb";
3
3
  export const CLI_BUILD = {
4
- "sha": "04bdff9",
4
+ "sha": "70caedb",
5
5
  "isRelease": false,
6
6
  "isDirty": true
7
7
  };
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { parseArgv } from './cli/args.js';
3
3
  import { renderHelp, renderVersion } from './cli/help.js';
4
4
  import { initHandler } from './commands/init.js';
5
+ import { mcpHandler } from './commands/mcp.js';
5
6
  import { renderHandler } from './commands/render.js';
6
7
  import { serveHandler } from './commands/serve.js';
7
8
  import { CliError, ExitCode } from './io/exit-codes.js';
@@ -29,6 +30,9 @@ async function run() {
29
30
  else if (parsed.mode === 'serve') {
30
31
  await serveHandler({ args: parsed });
31
32
  }
33
+ else if (parsed.mode === 'mcp') {
34
+ await mcpHandler({ args: parsed });
35
+ }
32
36
  else {
33
37
  await renderHandler({ args: parsed });
34
38
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nowline/cli",
3
- "version": "0.0.0-dev.20260601071750.g04bdff9",
3
+ "version": "0.0.0-dev.20260603150914.g70caedb",
4
4
  "description": "Nowline command-line interface — validate, convert, init",
5
5
  "license": "Apache-2.0",
6
6
  "engines": {
@@ -32,24 +32,28 @@
32
32
  "dependencies": {
33
33
  "@babel/code-frame": "^7.29.0",
34
34
  "@clack/prompts": "^1.4.0",
35
+ "@modelcontextprotocol/sdk": "^1.29.0",
35
36
  "chalk": "^5.6.2",
36
37
  "citty": "^0.2.2",
37
38
  "consola": "^3.4.2",
38
39
  "js-yaml": "^4.1.1",
39
40
  "langium": "~4.2.4",
40
- "@nowline/config": "0.0.0-dev.20260601071750.g04bdff9",
41
- "@nowline/core": "0.0.0-dev.20260601071750.g04bdff9",
42
- "@nowline/export-core": "0.0.0-dev.20260601071750.g04bdff9",
43
- "@nowline/export-html": "0.0.0-dev.20260601071750.g04bdff9",
44
- "@nowline/export-mermaid": "0.0.0-dev.20260601071750.g04bdff9",
45
- "@nowline/export-msproj": "0.0.0-dev.20260601071750.g04bdff9",
46
- "@nowline/export-pdf": "0.0.0-dev.20260601071750.g04bdff9",
47
- "@nowline/export-xlsx": "0.0.0-dev.20260601071750.g04bdff9",
48
- "@nowline/export-png": "0.0.0-dev.20260601071750.g04bdff9",
49
- "@nowline/renderer": "0.0.0-dev.20260601071750.g04bdff9",
50
- "@nowline/layout": "0.0.0-dev.20260601071750.g04bdff9"
41
+ "@nowline/config": "0.0.0-dev.20260603150914.g70caedb",
42
+ "@nowline/core": "0.0.0-dev.20260603150914.g70caedb",
43
+ "@nowline/export": "0.0.0-dev.20260603150914.g70caedb",
44
+ "@nowline/mcp": "0.0.0-dev.20260603150914.g70caedb",
45
+ "@nowline/export-html": "0.0.0-dev.20260603150914.g70caedb",
46
+ "@nowline/export-core": "0.0.0-dev.20260603150914.g70caedb",
47
+ "@nowline/export-mermaid": "0.0.0-dev.20260603150914.g70caedb",
48
+ "@nowline/export-msproj": "0.0.0-dev.20260603150914.g70caedb",
49
+ "@nowline/export-pdf": "0.0.0-dev.20260603150914.g70caedb",
50
+ "@nowline/export-png": "0.0.0-dev.20260603150914.g70caedb",
51
+ "@nowline/export-xlsx": "0.0.0-dev.20260603150914.g70caedb",
52
+ "@nowline/layout": "0.0.0-dev.20260603150914.g70caedb",
53
+ "@nowline/renderer": "0.0.0-dev.20260603150914.g70caedb"
51
54
  },
52
55
  "devDependencies": {
56
+ "@resvg/resvg-wasm": "^2.6.2",
53
57
  "@types/babel__code-frame": "^7.27.0",
54
58
  "@types/js-yaml": "^4.0.9",
55
59
  "@types/node": "^25.9.1",
@@ -60,6 +64,7 @@
60
64
  "bundle-templates": "node scripts/bundle-templates.mjs",
61
65
  "prebuild": "node scripts/bundle-templates.mjs",
62
66
  "build": "tsc -b tsconfig.json",
67
+ "postbuild": "node scripts/copy-wasm.mjs",
63
68
  "watch": "tsc -b tsconfig.json --watch",
64
69
  "pretest": "node scripts/bundle-templates.mjs",
65
70
  "test": "vitest run",
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bun
2
+ // Bun-only entry point for `bun build --compile`.
3
+ //
4
+ // `import ... with { type: 'file' }` is the ONLY pattern Bun's static
5
+ // analyzer recognises for embedding binary assets in a standalone binary.
6
+ // `Bun.file(new URL(..., import.meta.url))` is NOT tracked by the bundler
7
+ // and leaves the asset out of the embedded VFS.
8
+ //
9
+ // This shim:
10
+ // 1. Imports resvg.wasm via the recognised pattern, yielding a VFS path.
11
+ // 2. Stashes that path in globalThis so loadWasm() (in dist/index.js) can
12
+ // read it with Bun.file() at runtime.
13
+ // 3. Delegates immediately to dist/index.js (the normal Node entry).
14
+ //
15
+ // compile.mjs passes this file as the bun --compile entry instead of
16
+ // dist/index.js directly.
17
+
18
+ // @ts-expect-error — Bun-specific import assertion; not valid Node.js/TypeScript.
19
+ import resvgWasmPath from '../dist/resvg.wasm' with { type: 'file' };
20
+
21
+ // Make the VFS path available to loadWasm() in dist/commands/render.js.
22
+ globalThis.__RESVG_WASM_PATH__ = resvgWasmPath;
23
+
24
+ // Run the CLI.
25
+ await import('../dist/index.js');
@@ -25,9 +25,9 @@ const packageRoot = path.resolve(__dirname, '..');
25
25
  // Tight by design: a breach should trigger the conversation called out in
26
26
  // `specs/cli-distribution.md` "Size budget", not be silently absorbed.
27
27
  //
28
- // Last measured (bun 1.3.13) using --target on macOS-arm64:
29
- // darwin-arm64=70 darwin-x64=75 linux-arm64=107 linux-x64=107
30
- // windows-arm64=119 windows-x64=122
28
+ // Last measured (bun 1.3.14, @resvg/resvg-wasm, no native .node) on macOS-arm64:
29
+ // darwin-arm64=67 darwin-x64=~72 linux-arm64=~104 linux-x64=~104
30
+ // windows-arm64=~116 windows-x64=~119
31
31
  const ALL_TARGETS = [
32
32
  { id: 'bun-darwin-arm64', suffix: 'macos-arm64', maxMb: 80 },
33
33
  { id: 'bun-darwin-x64', suffix: 'macos-x64', maxMb: 85 },
@@ -80,10 +80,15 @@ function main() {
80
80
  }
81
81
  }
82
82
 
83
- const entry = path.join(packageRoot, 'dist', 'index.js');
84
- if (!safeStat(entry)) {
83
+ // Use the bun-entry shim as the compile entry point so Bun's static
84
+ // analyzer sees the `import ... with { type: 'file' }` declaration that
85
+ // embeds resvg.wasm in the binary. The shim sets __RESVG_WASM_PATH__
86
+ // and then delegates to dist/index.js.
87
+ const entry = path.join(packageRoot, 'scripts', 'bun-entry.mjs');
88
+ const distEntry = path.join(packageRoot, 'dist', 'index.js');
89
+ if (!safeStat(distEntry)) {
85
90
  console.error(
86
- `error: expected ${path.relative(packageRoot, entry)} to exist; run \`pnpm build\` first.`,
91
+ `error: expected ${path.relative(packageRoot, distEntry)} to exist; run \`pnpm build\` first.`,
87
92
  );
88
93
  process.exit(1);
89
94
  }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ // Copy @resvg/resvg-wasm/index_bg.wasm → dist/resvg.wasm so the CLI can
3
+ // locate it at runtime (both uncompiled Node and bun --compile, which embeds
4
+ // files referenced via new URL('./resvg.wasm', import.meta.url)).
5
+ //
6
+ // Runs as the `postbuild` step, after tsc has created dist/.
7
+
8
+ import { copyFile, mkdir } from 'node:fs/promises';
9
+ import { createRequire } from 'node:module';
10
+ import { dirname, resolve } from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ const packageRoot = resolve(__dirname, '..');
15
+
16
+ const req = createRequire(import.meta.url);
17
+ const wasmEntry = req.resolve('@resvg/resvg-wasm');
18
+ const wasmSrc = resolve(dirname(wasmEntry), 'index_bg.wasm');
19
+ const wasmDest = resolve(packageRoot, 'dist', 'resvg.wasm');
20
+
21
+ await mkdir(resolve(packageRoot, 'dist'), { recursive: true });
22
+ await copyFile(wasmSrc, wasmDest);
23
+ console.log(`copied resvg.wasm → dist/resvg.wasm`);
package/src/cli/args.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type ParseArgsConfig, parseArgs } from 'node:util';
2
2
  import { CliError, ExitCode } from '../io/exit-codes.js';
3
3
 
4
- export type ModeKind = 'render' | 'serve' | 'init' | 'help' | 'version';
4
+ export type ModeKind = 'render' | 'serve' | 'init' | 'mcp' | 'help' | 'version';
5
5
 
6
6
  export interface ParsedArgs {
7
7
  /** Resolved mode after dispatch (mutual-exclusivity already checked). */
@@ -59,6 +59,9 @@ export interface ParsedArgs {
59
59
 
60
60
  // Init
61
61
  template?: string;
62
+
63
+ // MCP
64
+ root?: string;
62
65
  }
63
66
 
64
67
  /**
@@ -97,6 +100,7 @@ export function parseArgv(argv: readonly string[]): ParsedArgs {
97
100
 
98
101
  serve: { type: 'boolean' },
99
102
  init: { type: 'boolean' },
103
+ mcp: { type: 'boolean' },
100
104
  'dry-run': { type: 'boolean', short: 'n' },
101
105
 
102
106
  theme: { type: 'string', short: 't' },
@@ -119,6 +123,9 @@ export function parseArgv(argv: readonly string[]): ParsedArgs {
119
123
 
120
124
  template: { type: 'string' },
121
125
 
126
+ // MCP
127
+ root: { type: 'string' },
128
+
122
129
  // Format-specific (m2c)
123
130
  'page-size': { type: 'string' },
124
131
  orientation: { type: 'string' },
@@ -177,6 +184,7 @@ export function parseArgv(argv: readonly string[]): ParsedArgs {
177
184
  const modes: ModeKind[] = [];
178
185
  if (values.serve === true) modes.push('serve');
179
186
  if (values.init === true) modes.push('init');
187
+ if (values.mcp === true) modes.push('mcp');
180
188
  if (modes.length > 1) {
181
189
  throw new CliError(
182
190
  ExitCode.InputError,
@@ -187,7 +195,7 @@ export function parseArgv(argv: readonly string[]): ParsedArgs {
187
195
  const dryRun = values['dry-run'] === true;
188
196
  const mode: ModeKind = modes[0] ?? 'render';
189
197
 
190
- if (dryRun && (mode === 'serve' || mode === 'init')) {
198
+ if (dryRun && (mode === 'serve' || mode === 'init' || mode === 'mcp')) {
191
199
  throw new CliError(
192
200
  ExitCode.InputError,
193
201
  `nowline: --dry-run cannot be combined with --${mode}.`,
@@ -233,6 +241,7 @@ export function parseArgv(argv: readonly string[]): ParsedArgs {
233
241
  headless: values.headless === true,
234
242
  start: stringOrUndefined(values.start),
235
243
  locale: stringOrUndefined(values.locale),
244
+ root: stringOrUndefined(values.root),
236
245
  };
237
246
  }
238
247
 
package/src/cli/help.ts CHANGED
@@ -31,6 +31,10 @@ MODE FLAGS (mutually exclusive)
31
31
  rendered output to disk on each rebuild.
32
32
  --init [<name>] Scaffold a starter .nowline file in cwd. Positional
33
33
  becomes project name; .nowline appended if missing.
34
+ --mcp Start a Model Context Protocol (MCP) stdio server
35
+ exposing validate, render, export, and file tools.
36
+ Shares the same @nowline/mcp server code as
37
+ \`npx @nowline/mcp\`.
34
38
  -n, --dry-run Run the full pipeline (parse + validate + layout +
35
39
  format) but skip the write step. Subsumes the old
36
40
  'validate' verb. Exit 0 on success, 1 on errors.
@@ -57,6 +61,10 @@ SERVE OPTIONS
57
61
  --host <host> Bind address (default: 127.0.0.1).
58
62
  --open Open the browser on start.
59
63
 
64
+ MCP OPTIONS
65
+ --root <dir> Allowed-root directory for file tools (default: cwd).
66
+ File paths are resolved and restricted to this root.
67
+
60
68
  LOGGING (mutually exclusive)
61
69
  -v, --verbose Print extra diagnostics to stderr.
62
70
  -q, --quiet Suppress non-error stderr.
@@ -75,6 +83,8 @@ EXAMPLES
75
83
  nowline roadmap.nowline --dry-run # validate-only
76
84
  nowline roadmap.nowline --serve -p 8080 # live preview
77
85
  nowline --init my-project # scaffold ./my-project.nowline
86
+ nowline --mcp # start MCP stdio server in cwd
87
+ nowline --mcp --root ./roadmaps # MCP server with custom root
78
88
 
79
89
  EXIT CODES
80
90
  0 Success
@@ -0,0 +1,21 @@
1
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
+ import { createMcpServer } from '@nowline/mcp/server';
3
+ import type { ParsedArgs } from '../cli/args.js';
4
+
5
+ /**
6
+ * `nowline --mcp` handler.
7
+ *
8
+ * Starts a Model Context Protocol stdio server sharing the same @nowline/mcp
9
+ * server factory as `npx @nowline/mcp`. Runs until the process receives
10
+ * SIGINT/SIGTERM or the client closes stdin.
11
+ */
12
+ export async function mcpHandler({ args }: { args: ParsedArgs }): Promise<void> {
13
+ const root = args.root ?? process.cwd();
14
+ const server = createMcpServer({ allowedRoot: root });
15
+ const transport = new StdioServerTransport();
16
+ await server.connect(transport);
17
+ // Keep alive: the transport closes when stdin closes or the process is signalled.
18
+ await new Promise<void>((resolve) => {
19
+ transport.onclose = resolve;
20
+ });
21
+ }
@@ -1,9 +1,14 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import { resolveIncludes } from '@nowline/core';
3
+ import {
4
+ type ExportFormat,
5
+ exportDocument,
6
+ type HostEnv,
7
+ type RenderInputs,
8
+ } from '@nowline/export';
4
9
  import { lengthToPoints, parseLength } from '@nowline/export-core';
5
- import { layoutRoadmap, normalizeThemeName, type ThemeName } from '@nowline/layout';
6
- import { type AssetResolver, renderSvg } from '@nowline/renderer';
10
+ import { normalizeThemeName, type ThemeName } from '@nowline/layout';
11
+ import type { AssetResolver } from '@nowline/renderer';
7
12
  import type { ParsedArgs } from '../cli/args.js';
8
13
  import {
9
14
  FormatResolutionError,
@@ -15,7 +20,7 @@ import { resolveRenderOutputPath } from '../cli/output-path.js';
15
20
  import { parseNowlineJson } from '../convert/parse-json.js';
16
21
  import { printNowlineFile } from '../convert/printer.js';
17
22
  import { serializeToJson } from '../convert/schema.js';
18
- import { getServices, parseSource } from '../core/parse.js';
23
+ import { parseSource } from '../core/parse.js';
19
24
  import { type DiagnosticSource, formatDiagnostics } from '../diagnostics/index.js';
20
25
  import {
21
26
  describeContentLocaleSource,
@@ -208,69 +213,67 @@ interface ProduceResult {
208
213
  isBinary: boolean;
209
214
  }
210
215
 
216
+ const BINARY_FORMATS = new Set<OutputFormat>(['png', 'pdf', 'xlsx']);
217
+ const FONT_FORMATS = new Set<OutputFormat>(['png', 'pdf']);
218
+
211
219
  async function produce(args: ProduceArgs): Promise<ProduceResult> {
212
- if (args.format === 'json') {
213
- return { rendered: await produceJson(args), isBinary: false };
214
- }
220
+ // `nowline` canonical-text format is not part of ExportFormat; handle here.
215
221
  if (args.format === 'nowline') {
216
222
  return { rendered: await produceCanonicalNowline(args), isBinary: false };
217
223
  }
218
224
 
219
- // The remaining formats all start from a positioned model + (sometimes) an
220
- // SVG. Build them once and dispatch to the format-specific exporter via
221
- // dynamic import — keeps each exporter's heavy deps off cold paths and
222
- // leaves room to re-extract a package later if a future build profile
223
- // wants to slim down.
224
- const stage = await stageRoadmap(args);
225
+ // Convert JSON-AST input to DSL text before handing to the kernel.
226
+ const sourceText =
227
+ args.inputFormat === 'json'
228
+ ? jsonToNowlineText(args.contents, args.displayPath)
229
+ : args.contents;
230
+
231
+ // Pre-validate with locale-aware diagnostic formatting so validation
232
+ // errors reach the operator in their locale. The kernel will re-parse
233
+ // the same source below — double work accepted in exchange for faithful
234
+ // stderr output.
235
+ await parseAndValidate(sourceText, args);
236
+
237
+ const assetRoot = args.assetRoot
238
+ ? path.resolve(args.assetRoot)
239
+ : path.dirname(args.absInputPath);
240
+
241
+ const host = createNodeHostEnv(assetRoot);
225
242
 
226
- if (args.format === 'svg') {
227
- return { rendered: stage.svg, isBinary: false };
243
+ // Resolve fonts lazily — only for formats that rasterize or embed them.
244
+ let fonts: RenderInputs['fonts'];
245
+ if (FONT_FORMATS.has(args.format)) {
246
+ fonts = await resolveNodeFonts(args);
228
247
  }
248
+
249
+ const kernelInputs: RenderInputs = {
250
+ sourcePath: args.absInputPath,
251
+ today: args.today,
252
+ locale: args.locale ?? 'und',
253
+ theme: args.theme,
254
+ fonts,
255
+ width: args.width,
256
+ noLinks: args.noLinks,
257
+ strict: args.strict,
258
+ pageSize: args.pageSize,
259
+ orientation: parseOrientation(args.orientation),
260
+ marginPt: parseMargin(args.margin),
261
+ pngScale: parseScale(args.scale),
262
+ msprojStart: args.start,
263
+ };
264
+
229
265
  try {
230
- if (args.format === 'html') {
231
- const mod = await import('@nowline/export-html');
232
- const html = await mod.exportHtml(stage.exportInputs, stage.svg);
233
- return { rendered: html, isBinary: false };
234
- }
235
- if (args.format === 'mermaid') {
236
- const mod = await import('@nowline/export-mermaid');
237
- const md = mod.exportMermaid(stage.exportInputs);
238
- return { rendered: md, isBinary: false };
239
- }
240
- if (args.format === 'msproj') {
241
- const mod = await import('@nowline/export-msproj');
242
- const xml = mod.exportMsProjXml(stage.exportInputs, {
243
- startDate: args.start,
244
- });
245
- return { rendered: xml, isBinary: false };
246
- }
247
- if (args.format === 'png') {
248
- const fonts = await stage.fontPair();
249
- const mod = await import('@nowline/export-png');
250
- const png = await mod.exportPng(stage.exportInputs, stage.svg, {
251
- scale: parseScale(args.scale),
252
- fonts,
253
- });
254
- return { rendered: png, isBinary: true };
255
- }
256
- if (args.format === 'pdf') {
257
- const fonts = await stage.fontPair();
258
- const mod = await import('@nowline/export-pdf');
259
- const pdf = await mod.exportPdf(stage.exportInputs, stage.svg, {
260
- pageSize: args.pageSize,
261
- orientation: parseOrientation(args.orientation),
262
- marginPt: parseMargin(args.margin),
263
- fonts,
264
- });
265
- return { rendered: pdf, isBinary: true };
266
- }
267
- if (args.format === 'xlsx') {
268
- const mod = await import('@nowline/export-xlsx');
269
- const xlsx = await mod.exportXlsx(stage.exportInputs, {
270
- generated: args.today,
271
- });
272
- return { rendered: xlsx, isBinary: true };
273
- }
266
+ const bytes = await exportDocument(
267
+ sourceText,
268
+ args.format as ExportFormat,
269
+ kernelInputs,
270
+ host,
271
+ );
272
+ const isBinary = BINARY_FORMATS.has(args.format);
273
+ const rendered: string | Uint8Array = isBinary
274
+ ? bytes
275
+ : new TextDecoder('utf-8').decode(bytes);
276
+ return { rendered, isBinary };
274
277
  } catch (err) {
275
278
  if (err instanceof CliError) throw err;
276
279
  const message = err instanceof Error ? err.message : String(err);
@@ -279,22 +282,78 @@ async function produce(args: ProduceArgs): Promise<ProduceResult> {
279
282
  `nowline: ${args.format} export failed: ${message}`,
280
283
  );
281
284
  }
285
+ }
286
+
287
+ // ---- Node HostEnv -----------------------------------------------------------
282
288
 
283
- throw new CliError(ExitCode.InputError, `nowline: unsupported format "${args.format}".`);
289
+ function createNodeHostEnv(assetRoot: string): HostEnv {
290
+ const root = path.resolve(assetRoot);
291
+ return {
292
+ readSource: async (absPath: string): Promise<string> => {
293
+ return await fs.readFile(absPath, 'utf-8');
294
+ },
295
+ readAsset: async (ref: string): Promise<Uint8Array> => {
296
+ const absPath = path.resolve(root, ref);
297
+ if (!absPath.startsWith(root + path.sep) && absPath !== root) {
298
+ throw new Error(`Asset ${ref} escapes asset-root ${assetRoot}`);
299
+ }
300
+ const bytes = await fs.readFile(absPath);
301
+ return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
302
+ },
303
+ loadWasm: async (): Promise<ArrayBuffer> => {
304
+ // Two code paths:
305
+ //
306
+ // 1. Bun compiled binary: scripts/bun-entry.mjs imports
307
+ // dist/resvg.wasm via `with { type: 'file' }` (the only Bun
308
+ // pattern the bundler embeds) and stashes the VFS path in
309
+ // globalThis.__RESVG_WASM_PATH__. Read it with Bun.file().
310
+ //
311
+ // 2. Plain Node.js (dev, tests, uncompiled dist/index.js run):
312
+ // dist/resvg.wasm is copied by scripts/copy-wasm.mjs (postbuild).
313
+ // Use fs.readFile via a new URL relative to this module.
314
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
315
+ const bunWasmPath = (globalThis as any).__RESVG_WASM_PATH__ as string | undefined;
316
+ if (bunWasmPath) {
317
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
318
+ return (globalThis as any).Bun.file(
319
+ bunWasmPath,
320
+ ).arrayBuffer() as Promise<ArrayBuffer>;
321
+ }
322
+ const wasmUrl = new URL('../resvg.wasm', import.meta.url);
323
+ const bytes = await fs.readFile(wasmUrl);
324
+ return bytes.buffer as ArrayBuffer;
325
+ },
326
+ };
284
327
  }
285
328
 
286
- async function produceJson(args: ProduceArgs): Promise<string> {
287
- if (args.inputFormat === 'json') {
288
- // Re-parse JSON → DSL → JSON to canonicalize through @nowline/core.
289
- const { ast } = parseNowlineJson(args.contents, args.displayPath);
290
- const text = printNowlineFile(ast);
291
- const parsed = await parseAndValidate(text, args);
292
- return JSON.stringify(serializeToJson(parsed.document, text), null, 2);
329
+ // ---- Font resolution --------------------------------------------------------
330
+
331
+ async function resolveNodeFonts(
332
+ args: ProduceArgs,
333
+ ): Promise<import('@nowline/export-core').ResolvedFontPair> {
334
+ const { resolveFonts } = await import('@nowline/export-core');
335
+ const result = await resolveFonts({
336
+ fontSans: args.fontSans,
337
+ fontMono: args.fontMono,
338
+ headless: args.headless,
339
+ });
340
+ if (args.strict) {
341
+ if (result.sansFellBackToBundled) {
342
+ process.stderr.write(
343
+ 'warning: sans font fell back to bundled DejaVu (no platform font found)\n',
344
+ );
345
+ }
346
+ if (result.monoFellBackToBundled) {
347
+ process.stderr.write(
348
+ 'warning: mono font fell back to bundled DejaVu (no platform font found)\n',
349
+ );
350
+ }
293
351
  }
294
- const parsed = await parseAndValidate(args.contents, args);
295
- return JSON.stringify(serializeToJson(parsed.document, args.contents), null, 2);
352
+ return { sans: result.sans, mono: result.mono };
296
353
  }
297
354
 
355
+ // ---- nowline canonical-text format (not part of ExportFormat) ---------------
356
+
298
357
  async function produceCanonicalNowline(args: ProduceArgs): Promise<string> {
299
358
  if (args.inputFormat === 'json') {
300
359
  const { ast } = parseNowlineJson(args.contents, args.displayPath);
@@ -305,93 +364,7 @@ async function produceCanonicalNowline(args: ProduceArgs): Promise<string> {
305
364
  return printNowlineFile(doc.ast);
306
365
  }
307
366
 
308
- interface StagedRoadmap {
309
- svg: string;
310
- exportInputs: import('@nowline/export-core').ExportInputs;
311
- /** Lazy: only loads the resolved font pair when a format actually needs it. */
312
- fontPair: () => Promise<import('@nowline/export-core').ResolvedFontPair>;
313
- }
314
-
315
- async function stageRoadmap(args: ProduceArgs): Promise<StagedRoadmap> {
316
- const parsed = await parseAndValidate(
317
- args.inputFormat === 'json'
318
- ? jsonToNowlineText(args.contents, args.displayPath)
319
- : args.contents,
320
- args,
321
- );
322
- const resolved = await resolveIncludes(parsed.ast, args.absInputPath, {
323
- services: getServices().Nowline,
324
- });
325
- for (const diag of resolved.diagnostics) {
326
- if (diag.severity === 'error') {
327
- process.stderr.write(`${diag.sourcePath}: ${diag.message}\n`);
328
- }
329
- }
330
- if (resolved.diagnostics.some((d) => d.severity === 'error')) {
331
- throw new CliError(ExitCode.ValidationError, '');
332
- }
333
-
334
- const model = layoutRoadmap(parsed.ast, resolved, {
335
- theme: args.theme,
336
- today: args.today,
337
- width: args.width,
338
- locale: args.locale,
339
- });
340
-
341
- const assetRoot = args.assetRoot
342
- ? path.resolve(args.assetRoot)
343
- : path.dirname(args.absInputPath);
344
- const resolver: AssetResolver = createAssetResolver(assetRoot);
345
-
346
- const warnings: string[] = [];
347
- const svg = await renderSvg(model, {
348
- assetResolver: resolver,
349
- noLinks: args.noLinks,
350
- strict: args.strict,
351
- warn: (msg) => warnings.push(msg),
352
- });
353
-
354
- for (const w of warnings) {
355
- process.stderr.write(`warning: ${w}\n`);
356
- }
357
-
358
- let cachedFonts: import('@nowline/export-core').ResolvedFontPair | undefined;
359
- const fontPair = async () => {
360
- if (cachedFonts) return cachedFonts;
361
- const mod = await import('@nowline/export-core');
362
- const result = await mod.resolveFonts({
363
- fontSans: args.fontSans,
364
- fontMono: args.fontMono,
365
- headless: args.headless,
366
- });
367
- if (args.strict) {
368
- if (result.sansFellBackToBundled) {
369
- process.stderr.write(
370
- 'warning: sans font fell back to bundled DejaVu (no platform font found)\n',
371
- );
372
- }
373
- if (result.monoFellBackToBundled) {
374
- process.stderr.write(
375
- 'warning: mono font fell back to bundled DejaVu (no platform font found)\n',
376
- );
377
- }
378
- }
379
- cachedFonts = { sans: result.sans, mono: result.mono };
380
- return cachedFonts;
381
- };
382
-
383
- return {
384
- svg,
385
- exportInputs: {
386
- ast: parsed.ast,
387
- resolved,
388
- model,
389
- sourcePath: args.displayPath,
390
- today: args.today,
391
- },
392
- fontPair,
393
- };
394
- }
367
+ // ---- Shared helpers ---------------------------------------------------------
395
368
 
396
369
  function jsonToNowlineText(contents: string, displayPath: string): string {
397
370
  const { ast } = parseNowlineJson(contents, displayPath);
@@ -544,6 +517,8 @@ function emitDiagnostics(
544
517
  if (rendered) process.stderr.write(`${rendered}\n`);
545
518
  }
546
519
 
520
+ // ---- Asset resolver (still used by serve.ts) --------------------------------
521
+
547
522
  export function createAssetResolver(assetRoot: string): AssetResolver {
548
523
  const root = path.resolve(assetRoot);
549
524
  return async (ref: string) => {
@@ -1,6 +1,6 @@
1
1
  // Auto-generated by scripts/bundle-templates.mjs. Do not edit by hand.
2
2
 
3
- export const CLI_VERSION = "0.0.0-dev.20260601071750.g04bdff9";
3
+ export const CLI_VERSION = "0.0.0-dev.20260603150914.g70caedb";
4
4
 
5
5
  export interface CliBuild {
6
6
  /** Short git SHA at build time, or empty when not in a git checkout. */
@@ -12,7 +12,7 @@ export interface CliBuild {
12
12
  }
13
13
 
14
14
  export const CLI_BUILD: CliBuild = {
15
- "sha": "04bdff9",
15
+ "sha": "70caedb",
16
16
  "isRelease": false,
17
17
  "isDirty": true
18
18
  };
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  import { parseArgv } from './cli/args.js';
3
3
  import { renderHelp, renderVersion } from './cli/help.js';
4
4
  import { initHandler } from './commands/init.js';
5
+ import { mcpHandler } from './commands/mcp.js';
5
6
  import { renderHandler } from './commands/render.js';
6
7
  import { serveHandler } from './commands/serve.js';
7
8
  import { CliError, ExitCode } from './io/exit-codes.js';
@@ -30,6 +31,8 @@ async function run(): Promise<number> {
30
31
  await initHandler({ args: parsed });
31
32
  } else if (parsed.mode === 'serve') {
32
33
  await serveHandler({ args: parsed });
34
+ } else if (parsed.mode === 'mcp') {
35
+ await mcpHandler({ args: parsed });
33
36
  } else {
34
37
  await renderHandler({ args: parsed });
35
38
  }