@nowline/cli 0.8.6 → 0.10.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.
Files changed (91) hide show
  1. package/README.md +32 -9
  2. package/dist/cli/args.d.ts +20 -4
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +20 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/help.d.ts.map +1 -1
  7. package/dist/cli/help.js +31 -3
  8. package/dist/cli/help.js.map +1 -1
  9. package/dist/cli/options.d.ts +74 -0
  10. package/dist/cli/options.d.ts.map +1 -0
  11. package/dist/cli/options.js +209 -0
  12. package/dist/cli/options.js.map +1 -0
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +2 -3
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/mcp-install.d.ts +18 -0
  17. package/dist/commands/mcp-install.d.ts.map +1 -0
  18. package/dist/commands/mcp-install.js +151 -0
  19. package/dist/commands/mcp-install.js.map +1 -0
  20. package/dist/commands/mcp.d.ts.map +1 -1
  21. package/dist/commands/mcp.js +7 -12
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/commands/render.d.ts +7 -0
  24. package/dist/commands/render.d.ts.map +1 -1
  25. package/dist/commands/render.js +161 -155
  26. package/dist/commands/render.js.map +1 -1
  27. package/dist/commands/serve.d.ts.map +1 -1
  28. package/dist/commands/serve.js +87 -60
  29. package/dist/commands/serve.js.map +1 -1
  30. package/dist/diagnostics/adapt.d.ts +12 -1
  31. package/dist/diagnostics/adapt.d.ts.map +1 -1
  32. package/dist/diagnostics/adapt.js +53 -1
  33. package/dist/diagnostics/adapt.js.map +1 -1
  34. package/dist/diagnostics/model.d.ts +1 -1
  35. package/dist/generated/version.d.ts +1 -1
  36. package/dist/generated/version.d.ts.map +1 -1
  37. package/dist/generated/version.js +2 -2
  38. package/dist/generated/version.js.map +1 -1
  39. package/dist/i18n/locale.d.ts.map +1 -1
  40. package/dist/i18n/locale.js +2 -5
  41. package/dist/i18n/locale.js.map +1 -1
  42. package/dist/index.js +4 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/io/config.d.ts +1 -1
  45. package/dist/io/config.d.ts.map +1 -1
  46. package/dist/io/config.js +1 -1
  47. package/dist/io/config.js.map +1 -1
  48. package/dist/io/log.d.ts +17 -0
  49. package/dist/io/log.d.ts.map +1 -0
  50. package/dist/io/log.js +16 -0
  51. package/dist/io/log.js.map +1 -0
  52. package/dist/mcp-install/clients.d.ts +58 -0
  53. package/dist/mcp-install/clients.d.ts.map +1 -0
  54. package/dist/mcp-install/clients.js +304 -0
  55. package/dist/mcp-install/clients.js.map +1 -0
  56. package/dist/mcp-install/host.d.ts +29 -0
  57. package/dist/mcp-install/host.d.ts.map +1 -0
  58. package/dist/mcp-install/host.js +72 -0
  59. package/dist/mcp-install/host.js.map +1 -0
  60. package/dist/mcp-install/json-config.d.ts +29 -0
  61. package/dist/mcp-install/json-config.d.ts.map +1 -0
  62. package/dist/mcp-install/json-config.js +139 -0
  63. package/dist/mcp-install/json-config.js.map +1 -0
  64. package/dist/mcp-install/server-command.d.ts +26 -0
  65. package/dist/mcp-install/server-command.d.ts.map +1 -0
  66. package/dist/mcp-install/server-command.js +52 -0
  67. package/dist/mcp-install/server-command.js.map +1 -0
  68. package/man/fr/nowline.1 +248 -19
  69. package/man/fr/nowline.5 +819 -45
  70. package/man/nowline.1 +193 -18
  71. package/man/nowline.5 +764 -36
  72. package/package.json +19 -19
  73. package/src/cli/args.ts +55 -5
  74. package/src/cli/help.ts +31 -3
  75. package/src/cli/options.ts +286 -0
  76. package/src/commands/init.ts +2 -3
  77. package/src/commands/mcp-install.ts +211 -0
  78. package/src/commands/mcp.ts +10 -14
  79. package/src/commands/render.ts +198 -195
  80. package/src/commands/serve.ts +102 -74
  81. package/src/diagnostics/adapt.ts +62 -0
  82. package/src/diagnostics/model.ts +1 -1
  83. package/src/generated/version.ts +2 -2
  84. package/src/i18n/locale.ts +2 -6
  85. package/src/index.ts +3 -0
  86. package/src/io/config.ts +0 -1
  87. package/src/io/log.ts +33 -0
  88. package/src/mcp-install/clients.ts +443 -0
  89. package/src/mcp-install/host.ts +106 -0
  90. package/src/mcp-install/json-config.ts +179 -0
  91. package/src/mcp-install/server-command.ts +75 -0
@@ -0,0 +1,139 @@
1
+ import { chmodSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync, } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { applyEdits, modify, parse, printParseErrorCode, } from 'jsonc-parser';
4
+ export class JsonConfigError extends Error {
5
+ }
6
+ /**
7
+ * Inserts or replaces the server entry in a JSON / JSONC document, editing
8
+ * the text rather than re-serializing it, so comments, key order, and the
9
+ * file's own indentation survive. `existing` undefined means the file is
10
+ * missing.
11
+ */
12
+ export function upsertEntry(existing, target, entry) {
13
+ const isNew = existing === undefined || existing.trim() === '';
14
+ const text = isNew ? `${JSON.stringify(target.seed ?? {}, null, 2)}\n` : existing;
15
+ const doc = parseDocument(text, target.path);
16
+ const { keyPath, value } = target.place(entry, doc);
17
+ const current = valueAt(doc, keyPath);
18
+ if (!isNew && deepEqual(current, value))
19
+ return { change: 'unchanged', keyPath, value };
20
+ return {
21
+ change: isNew ? 'created' : current === undefined ? 'added' : 'updated',
22
+ text: applyEdits(text, insertionEdits(text, keyPath, value)),
23
+ keyPath,
24
+ value,
25
+ };
26
+ }
27
+ /** Removes the server entry, leaving every other key and comment in place. */
28
+ export function removeEntry(existing, target, entry) {
29
+ if (existing === undefined || existing.trim() === '') {
30
+ return { change: 'absent', keyPath: [] };
31
+ }
32
+ const doc = parseDocument(existing, target.path);
33
+ const { keyPath } = target.place(entry, doc);
34
+ if (valueAt(doc, keyPath) === undefined)
35
+ return { change: 'absent', keyPath };
36
+ // Unformatted: a pure deletion, so neighbouring entries keep their layout.
37
+ const edits = modify(existing, keyPath, undefined, {});
38
+ return { change: 'removed', text: applyEdits(existing, edits), keyPath };
39
+ }
40
+ export function readConfigFile(filePath) {
41
+ try {
42
+ return readFileSync(filePath, 'utf-8');
43
+ }
44
+ catch (err) {
45
+ if (err.code === 'ENOENT')
46
+ return undefined;
47
+ throw err;
48
+ }
49
+ }
50
+ /**
51
+ * Atomic write (temp file + rename) so a crash never leaves a harness with a
52
+ * half-written config. Writes through a symlink (dotfile managers) and keeps
53
+ * the existing file mode.
54
+ */
55
+ export function writeConfigFile(filePath, text) {
56
+ let destination = filePath;
57
+ let mode;
58
+ try {
59
+ destination = realpathSync(filePath);
60
+ mode = statSync(destination).mode & 0o777;
61
+ }
62
+ catch {
63
+ mkdirSync(path.dirname(filePath), { recursive: true });
64
+ }
65
+ const temp = `${destination}.nowline-${process.pid}.tmp`;
66
+ writeFileSync(temp, text, 'utf-8');
67
+ if (mode !== undefined)
68
+ chmodSync(temp, mode);
69
+ renameSync(temp, destination);
70
+ }
71
+ /**
72
+ * jsonc-parser's formatter re-flows the whole line it edits, and appending a
73
+ * key to a non-empty object edits the previous sibling's line, so a user's
74
+ * compact `"other": { "command": "x" }` would come back expanded. For that
75
+ * case, take the unformatted edit and indent the new property ourselves.
76
+ * Every other case (replacing our own entry, creating a missing parent)
77
+ * only touches lines we own, so the library's formatting is fine.
78
+ */
79
+ function insertionEdits(text, keyPath, value) {
80
+ const formatting = detectFormatting(text);
81
+ const raw = modify(text, keyPath, value, {});
82
+ const edit = raw[0];
83
+ if (raw.length !== 1 || edit.length !== 0 || !edit.content.startsWith(',')) {
84
+ return modify(text, keyPath, value, { formattingOptions: formatting });
85
+ }
86
+ const unit = formatting.insertSpaces ? ' '.repeat(formatting.tabSize ?? 2) : '\t';
87
+ const lineStart = text.lastIndexOf('\n', edit.offset - 1) + 1;
88
+ const lineIndent = /^[ \t]*/.exec(text.slice(lineStart))?.[0] ?? '';
89
+ const property = JSON.stringify(JSON.parse(`{${edit.content.slice(1)}}`), null, unit)
90
+ .split('\n')
91
+ .slice(1, -1)
92
+ .map((line) => lineIndent + line.slice(unit.length));
93
+ const eol = formatting.eol ?? '\n';
94
+ return [{ ...edit, content: `,${eol}${property.join(eol)}` }];
95
+ }
96
+ function parseDocument(text, filePath) {
97
+ const errors = [];
98
+ const doc = parse(text, errors, { allowTrailingComma: true, disallowComments: false });
99
+ if (errors.length > 0) {
100
+ const first = errors[0];
101
+ throw new JsonConfigError(`cannot parse ${filePath}: ${printParseErrorCode(first.error)} at offset ${first.offset}; fix or move the file and re-run.`);
102
+ }
103
+ if (!isRecord(doc)) {
104
+ throw new JsonConfigError(`cannot update ${filePath}: the top level is not a JSON object.`);
105
+ }
106
+ return doc;
107
+ }
108
+ function valueAt(doc, keyPath) {
109
+ let node = doc;
110
+ for (const key of keyPath) {
111
+ if (!isRecord(node))
112
+ return undefined;
113
+ node = node[key];
114
+ }
115
+ return node;
116
+ }
117
+ function detectFormatting(text) {
118
+ const eol = text.includes('\r\n') ? '\r\n' : '\n';
119
+ const indent = /^([ \t]+)\S/m.exec(text)?.[1];
120
+ if (indent?.startsWith('\t'))
121
+ return { insertSpaces: false, tabSize: 1, eol };
122
+ return { insertSpaces: true, tabSize: indent?.length ?? 2, eol };
123
+ }
124
+ function isRecord(value) {
125
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
126
+ }
127
+ function deepEqual(a, b) {
128
+ if (a === b)
129
+ return true;
130
+ if (Array.isArray(a) && Array.isArray(b)) {
131
+ return a.length === b.length && a.every((item, i) => deepEqual(item, b[i]));
132
+ }
133
+ if (isRecord(a) && isRecord(b)) {
134
+ const keys = Object.keys(a);
135
+ return (keys.length === Object.keys(b).length && keys.every((key) => deepEqual(a[key], b[key])));
136
+ }
137
+ return false;
138
+ }
139
+ //# sourceMappingURL=json-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config.js","sourceRoot":"","sources":["../../src/mcp-install/json-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { HostEnv } from './host.js';
2
+ export type ServerKind = 'self' | 'npx';
3
+ /** The stdio launch line every harness config stores. */
4
+ export interface ServerEntry {
5
+ command: string;
6
+ args: string[];
7
+ }
8
+ export interface ResolvedServer {
9
+ entry: ServerEntry;
10
+ /** Notices for stderr (dropped under `-q`). */
11
+ warnings: string[];
12
+ }
13
+ /**
14
+ * Decides what `--mcp-install` registers.
15
+ *
16
+ * `self` points at the installed `nowline`. The path is absolute because GUI
17
+ * harnesses (Claude Desktop, Cursor, VS Code launched from the Dock) don't
18
+ * inherit the shell PATH, and it is the stable PATH entry rather than the
19
+ * realpath, so a Homebrew symlink keeps working across `brew upgrade` instead
20
+ * of pinning `Cellar/nowline/<version>/`.
21
+ *
22
+ * `npx` registers `npx -y @nowline/mcp`, which tracks npm independently of
23
+ * the CLI but needs Node visible to the harness.
24
+ */
25
+ export declare function resolveServer(kind: ServerKind, root: string | undefined, host: HostEnv): ResolvedServer;
26
+ //# sourceMappingURL=server-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-command.d.ts","sourceRoot":"","sources":["../../src/mcp-install/server-command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAExC,yDAAyD;AACzD,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,OAAO,GACd,cAAc,CAyChB"}
@@ -0,0 +1,52 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * Decides what `--mcp-install` registers.
4
+ *
5
+ * `self` points at the installed `nowline`. The path is absolute because GUI
6
+ * harnesses (Claude Desktop, Cursor, VS Code launched from the Dock) don't
7
+ * inherit the shell PATH, and it is the stable PATH entry rather than the
8
+ * realpath, so a Homebrew symlink keeps working across `brew upgrade` instead
9
+ * of pinning `Cellar/nowline/<version>/`.
10
+ *
11
+ * `npx` registers `npx -y @nowline/mcp`, which tracks npm independently of
12
+ * the CLI but needs Node visible to the harness.
13
+ */
14
+ export function resolveServer(kind, root, host) {
15
+ const rootArgs = root !== undefined ? ['--root', path.resolve(host.cwd, root)] : [];
16
+ if (kind === 'npx') {
17
+ // Windows GUI apps can't spawn `npx.cmd` without a shell.
18
+ if (host.platform === 'win32') {
19
+ return {
20
+ entry: { command: 'cmd', args: ['/c', 'npx', '-y', '@nowline/mcp', ...rootArgs] },
21
+ warnings: [],
22
+ };
23
+ }
24
+ return {
25
+ entry: { command: 'npx', args: ['-y', '@nowline/mcp', ...rootArgs] },
26
+ warnings: [],
27
+ };
28
+ }
29
+ if (host.isCompiledBinary) {
30
+ const binary = host.realpath(host.execPath);
31
+ const onPath = host
32
+ .findAllOnPath('nowline')
33
+ .find((candidate) => host.realpath(candidate) === binary);
34
+ const command = onPath ?? host.execPath;
35
+ const warnings = [];
36
+ if (onPath === undefined && /[\\/]Cellar[\\/]/.test(command)) {
37
+ warnings.push(`warning: registered ${command}, which changes on \`brew upgrade\`; put Homebrew's bin on PATH and re-run --mcp-install.`);
38
+ }
39
+ return { entry: { command, args: ['--mcp', ...rootArgs] }, warnings };
40
+ }
41
+ // Running under Node (npm install or a checkout): the `nowline` shim is a
42
+ // `#!/usr/bin/env node` script a GUI harness may not be able to run, so
43
+ // register the absolute Node and the script it runs.
44
+ const script = host.realpath(host.argv1 ?? '');
45
+ return {
46
+ entry: { command: host.execPath, args: [script, '--mcp', ...rootArgs] },
47
+ warnings: [
48
+ `warning: registered ${host.execPath}; re-run --mcp-install if you remove or switch this Node version.`,
49
+ ],
50
+ };
51
+ }
52
+ //# sourceMappingURL=server-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-command.js","sourceRoot":"","sources":["../../src/mcp-install/server-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAiBlC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CACzB,IAAgB,EAChB,IAAwB,EACxB,IAAa;IAEb,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACjB,0DAA0D;QAC1D,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC5B,OAAO;gBACH,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,EAAE;gBACjF,QAAQ,EAAE,EAAE;aACf,CAAC;QACN,CAAC;QACD,OAAO;YACH,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,EAAE;YACpE,QAAQ,EAAE,EAAE;SACf,CAAC;IACN,CAAC;IAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI;aACd,aAAa,CAAC,SAAS,CAAC;aACxB,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC;QACxC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,QAAQ,CAAC,IAAI,CACT,uBAAuB,OAAO,2FAA2F,CAC5H,CAAC;QACN,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1E,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,qDAAqD;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO;QACH,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,EAAE;QACvE,QAAQ,EAAE;YACN,uBAAuB,IAAI,CAAC,QAAQ,mEAAmE;SAC1G;KACJ,CAAC;AACN,CAAC"}
package/man/fr/nowline.1 CHANGED
@@ -1,6 +1,11 @@
1
1
  .\" Traduction française neutre. Les divergences régionales (fr-CA, fr-FR)
2
2
  .\" prennent la forme de surcouches dans packages/cli/man/<locale>/nowline.1
3
3
  .\" lorsqu'elles existent. Voir specs/localization.md.
4
+ .\"
5
+ .\" Empreinte de la page anglaise relue pour cette traduction. Après avoir
6
+ .\" reporté une modification de la page anglaise, remplacez-la par la ligne
7
+ .\" qu'affiche packages/cli/test/man/translation-parity.test.ts.
8
+ .\" translated-from: nowline.1 sha256:032668f06f1c5fa404d9e94021ed15b045372a5d155f3eac56cec4daffaf6630
4
9
  .Dd $Mdocdate$
5
10
  .Dt NOWLINE 1
6
11
  .Os
@@ -13,6 +18,7 @@
13
18
  .Op Fl o Ar chemin
14
19
  .Op Fl t Ar thème
15
20
  .Op Fl -now Ar date
21
+ .Op Fl -timezone Ar fuseau
16
22
  .Op Ar options
17
23
  .Ar entrée
18
24
  .Nm
@@ -24,6 +30,17 @@
24
30
  .Fl -init
25
31
  .Op Ar nom
26
32
  .Nm
33
+ .Fl -mcp
34
+ .Op Fl -root Ar rép
35
+ .Nm
36
+ .Fl -mcp-install
37
+ .Op Ar client
38
+ .Op Ar options
39
+ .Nm
40
+ .Fl -mcp-uninstall
41
+ .Op Ar client
42
+ .Op Ar options
43
+ .Nm
27
44
  .Fl -dry-run
28
45
  .Op Ar options
29
46
  .Ar entrée
@@ -137,6 +154,9 @@ rendu réussi.
137
154
  L'option
138
155
  .Fl o Ar chemin
139
156
  écrit également le résultat sur le disque à chaque reconstruction.
157
+ Il accepte les mêmes options de rendu qu'un rendu simple (thème,
158
+ largeur, liens, mode strict, etc.) et affiche ce qu'afficherait un
159
+ rendu simple du fichier avec les mêmes options.
140
160
  .It Fl -init Op Ar nom
141
161
  Crée un fichier
142
162
  .Pa .nowline
@@ -149,6 +169,37 @@ est ajouté automatiquement s'il manque.
149
169
  Le nom par défaut est
150
170
  .Sy roadmap .
151
171
  Les fichiers existants sont écrasés sans confirmation.
172
+ .It Fl -mcp
173
+ Lance un serveur Model Context Protocol (MCP) sur l'entrée et la sortie
174
+ standard, qui expose à un agent les outils de validation, de rendu,
175
+ d'export et de fichiers.
176
+ Avec
177
+ .Fl -port Ar n ,
178
+ il sert plutôt du Streamable HTTP local.
179
+ C'est le même serveur que
180
+ .Ql npx @nowline/mcp .
181
+ .It Fl -mcp-install Op Ar client
182
+ Enregistre le serveur MCP auprès d'un agent\ :
183
+ .Sy claude-code , claude-desktop , cursor , vscode , codex , gemini ,
184
+ .Sy antigravity , muse , opencode , copilot , windsurf , zed , amp , goose ,
185
+ ou
186
+ .Sy all .
187
+ Sans
188
+ .Ar client ,
189
+ l'installe dans chaque agent trouvé sur cette machine.
190
+ Les configurations JSON sont modifiées sur place, en conservant les
191
+ commentaires et les autres entrées\ ; Claude Code (portée utilisateur) et
192
+ Codex passent par leur propre commande
193
+ .Ql mcp add \ ;
194
+ Goose reçoit un extrait à coller.
195
+ Relancer la commande est sans risque.
196
+ Avec
197
+ .Fl n ,
198
+ affiche la modification sans rien écrire ni exécuter.
199
+ Voir
200
+ .Sx OPTIONS MCP .
201
+ .It Fl -mcp-uninstall Op Ar client
202
+ Retire le serveur des mêmes configurations.
152
203
  .It Fl n , -dry-run
153
204
  Exécute la totalité du pipeline (analyse + validation + mise en page +
154
205
  format) sans écrire de fichier.
@@ -189,16 +240,63 @@ comme
189
240
  .Sh OPTIONS DE PRODUCTION
190
241
  .Bl -tag -width Fl
191
242
  .It Fl t , -theme Ar nom
192
- .Sy light | dark .
243
+ .Sy light | dark | grayscale ;
244
+ .Sy greyscale
245
+ est accepté comme alias.
246
+ Par défaut\ :
247
+ .Pa .nowlinerc
248
+ .Sy theme ,
249
+ sinon
250
+ .Sy light .
193
251
  .It Fl -now Ar date
194
252
  Ancrage
195
253
  .Sq Maintenant
196
- pour la ligne de temps présent et le calcul des dates, au format
197
- .Pa AAAA-MM-JJ .
198
- Par défaut\ : aujourd'hui (date civile UTC du système).
254
+ pour la ligne de temps présent et le calcul des dates.
255
+ Accepte une date nue
256
+ .Pa AAAA-MM-JJ
257
+ (flottante\ ; indépendante du fuseau) ou un instant ISO\~8601 complet tel que
258
+ .Pa 2026-06-04T23:00:00Z
259
+ ou
260
+ .Pa 2026-06-05T06:00:00+07:00
261
+ (un Z ou un décalage \(+-HH:MM intégré l'emporte sur
262
+ .Fl -timezone ) .
263
+ Une date nue ou un instant sans décalage est flottant\ : la partie date
264
+ écrite est utilisée et
265
+ .Fl -timezone
266
+ est ignoré.
267
+ La partie date doit désigner un jour réel du calendrier\ :
268
+ .Pa 2026-02-30
269
+ est une erreur de saisie, et non le 2\~mars.
270
+ Par défaut\ : la date civile du jour dans le fuseau de l'hôte (ou celui de
271
+ .Fl -timezone
272
+ s'il est indiqué).
199
273
  Indiquez
200
274
  .Fl -now Sq -
201
275
  pour supprimer entièrement la ligne de temps présent.
276
+ .It Fl -timezone Ar fuseau
277
+ Fuseau horaire utilisé pour la valeur par défaut «\ aujourd'hui\ »
278
+ fondée sur l'horloge\ ; consulté uniquement lorsque
279
+ .Fl -now
280
+ est omis.
281
+ Formes acceptées\ :
282
+ .Bl -tag -width "America/Los_Angeles" -compact
283
+ .It Sy local
284
+ Fuseau de l'hôte ou du lecteur (par défaut si l'option est absente).
285
+ .It Sy UTC
286
+ UTC.
287
+ .It Sy Z , +00:00
288
+ Raccourci pour un décalage nul (équivaut à
289
+ .Sy UTC ) .
290
+ .It Sy \(+-HH , \(+-HH:MM , \(+-HHMM
291
+ Décalage fixe (ignore l'heure d'été\ ; limitation documentée).
292
+ .It Sy America/Los_Angeles
293
+ Tout nom de fuseau IANA valide.
294
+ .El
295
+ Les abréviations ambiguës telles que
296
+ .Sy PST
297
+ et
298
+ .Sy IST
299
+ sont rejetées avec un message d'erreur explicite.
202
300
  .It Fl -locale Ar bcp47
203
301
  Étiquette de langue BCP-47 pour les messages CLI de l'opérateur
204
302
  (diagnostics de validation sur la sortie d'erreur,
@@ -250,10 +348,35 @@ Facteur d'échelle pour le rendu raster (PNG uniquement\ ; 1 par défaut).
250
348
  .It Fl -strict
251
349
  Promeut les avertissements (assets, sanitiseur) en erreurs.
252
350
  .It Fl w , -width Ar px
253
- Largeur du canevas en pixels (1280 par défaut).
351
+ Largeur maximale du canevas en pixels.
352
+ Par défaut\ :
353
+ .Pa .nowlinerc
354
+ .Sy width ,
355
+ sinon aucune, et le canevas s'ajuste au contenu.
356
+ Une feuille de route plus large resserre sa frise pour tenir, jusqu'à un pixel
357
+ par jour\ ; les légendes qui débordent de leurs barres peuvent encore élargir le
358
+ canevas.
359
+ .It Fl -non-working Ar mode
360
+ Façon dont un calendrier ouvré affiche ses jours non travaillés sur le
361
+ graphique\ :
362
+ .Sy hide
363
+ les replie (par défaut),
364
+ .Sy show
365
+ les dessine en bandes grisées.
366
+ Prévaut sur la clé
367
+ .Sy default roadmap non-working:
368
+ du fichier\ ; sans option, la clé s'applique, puis
369
+ .Sy hide .
370
+ Toute autre valeur se termine avec le code 2.
371
+ L'ordonnancement est identique dans les deux vues\ : les sorties Mermaid,
372
+ MS Project et XLSX ne changent pas.
254
373
  .It Fl -asset-root Ar dossier
255
374
  Dossier à partir duquel les ressources logo / image peuvent être
256
- chargées (par défaut\ : dossier du fichier d'entrée).
375
+ chargées (par défaut\ : la clé
376
+ .Sy assetRoot
377
+ de
378
+ .Pa .nowlinerc ,
379
+ puis le dossier du fichier d'entrée).
257
380
  .El
258
381
  .Sh OPTIONS SPÉCIFIQUES AU FORMAT
259
382
  .Bl -tag -width Fl
@@ -292,12 +415,13 @@ Saute le sondage de polices de la plateforme et force la paire DejaVu
292
415
  intégrée.
293
416
  La sortie est stable octet par octet entre machines.
294
417
  .It Fl -start Ar date
295
- MS Project\ : date d'ancrage
296
- .Pq Pa AAAA-MM-JJ
297
- pour les feuilles de route uniquement relatives.
298
- Par défaut\ :
299
- .Fl -now ,
300
- puis repli déterministe.
418
+ MS Project\ : date de début du projet
419
+ .Pq Pa AAAA-MM-JJ .
420
+ Par défaut\ : le
421
+ .Cm start:
422
+ de la feuille de route, sinon
423
+ .Fl -now
424
+ (aujourd'hui).
301
425
  .El
302
426
  .Sh OPTIONS DE SERVEUR
303
427
  .Bl -tag -width Fl
@@ -312,6 +436,38 @@ pour exposer sur le réseau local).
312
436
  .It Fl -open
313
437
  Ouvre le navigateur au démarrage.
314
438
  .El
439
+ .Sh OPTIONS MCP
440
+ .Bl -tag -width Fl
441
+ .It Fl -root Ar rép
442
+ Répertoire que les outils de fichiers MCP peuvent lire et écrire.
443
+ Sans cette option, le serveur utilise les racines que le client annonce
444
+ via MCP (les chemins relatifs sont résolus par rapport à la première), ou
445
+ le répertoire courant si le client n'en annonce aucune.
446
+ Avec
447
+ .Fl -mcp-install ,
448
+ il est inscrit dans la commande enregistrée sous forme de chemin absolu.
449
+ .It Fl -scope Ar portée
450
+ Où
451
+ .Fl -mcp-install
452
+ écrit\ :
453
+ .Sy user
454
+ (par défaut\ ; la configuration propre à l'utilisateur de l'agent) ou
455
+ .Sy project
456
+ (le fichier de configuration du répertoire courant, à versionner).
457
+ .It Fl -server Ar type
458
+ Ce que
459
+ .Fl -mcp-install
460
+ enregistre\ :
461
+ .Sy self
462
+ (par défaut\ ; ce binaire
463
+ .Nm
464
+ avec
465
+ .Fl -mcp ,
466
+ si bien qu'une installation Homebrew n'exige pas Node.js) ou
467
+ .Sy npx
468
+ .Pq Ql npx -y @nowline/mcp ,
469
+ qui suit npm indépendamment de la CLI.
470
+ .El
315
471
  .Sh OPTIONS DE JOURNALISATION
316
472
  Les indicateurs de journalisation sont mutuellement exclusifs.
317
473
  .Bl -tag -width Fl
@@ -321,7 +477,10 @@ Affiche des diagnostics supplémentaires sur la sortie d'erreur standard
321
477
  décisions de repli).
322
478
  .It Fl q , -quiet
323
479
  Supprime les messages non liés aux erreurs sur la sortie d'erreur
324
- standard.
480
+ standard : avertissements, notices et avertissements du rapport de
481
+ diagnostics d'une exécution en échec.
482
+ Les erreurs et les diagnostics JSON restent affichés, et le code de
483
+ sortie ne change pas.
325
484
  .El
326
485
  .Sh OPTIONS STANDARD
327
486
  .Bl -tag -width Fl
@@ -370,25 +529,84 @@ pour la matrice de résolution.
370
529
  Fichier de configuration JSON ou YAML facultatif.
371
530
  Recherché en remontant depuis le dossier du fichier d'entrée\ ; le plus
372
531
  proche l'emporte.
373
- Les indicateurs CLI surclassent les valeurs de configuration.
374
- Clés reconnues\ :
375
- .Sy theme , defaultFormat , width , pdfPageSize , pdfOrientation ,
376
- .Sy pdfMargin , fontSans , fontMono , headlessFonts , locale .
532
+ Chaque clé reconnue sert de valeur par défaut à un indicateur\ :
533
+ l'indicateur l'emporte s'il est fourni, puis la clé, puis la valeur
534
+ par défaut intégrée.
535
+ .Sy theme
536
+ .Pq Fl t ,
537
+ .Sy defaultFormat
538
+ .Pq Fl f ,
539
+ .Sy width
540
+ .Pq Fl w ,
541
+ .Sy pdfPageSize
542
+ .Pq Fl -page-size ,
543
+ .Sy pdfOrientation
544
+ .Pq Fl -orientation ,
545
+ .Sy pdfMargin
546
+ .Pq Fl -margin ,
547
+ .Sy fontSans
548
+ .Pq Fl -font-sans ,
549
+ .Sy fontMono
550
+ .Pq Fl -font-mono ,
551
+ .Sy headlessFonts
552
+ .Pq Fl -headless ,
553
+ .Sy useSystemFonts
554
+ .Pq Fl -use-system-fonts ,
555
+ .Sy assetRoot
556
+ .Pq Fl -asset-root ,
557
+ .Sy locale
558
+ .Pq Fl -locale .
559
+ .Sy defaultFormat
560
+ ne s'applique que si l'extension de
561
+ .Fl o
562
+ n'est pas reconnue\ ;
563
+ .Sy locale
564
+ passe après les variables d'environnement de langue.
565
+ Une clé
566
+ .Sy assetRoot
567
+ relative est résolue par rapport au dossier du
568
+ .Pa .nowlinerc
569
+ qui la contient, alors qu'une valeur relative de
570
+ .Fl -asset-root
571
+ est résolue par rapport au dossier de travail.
572
+ .Fl -serve
573
+ lit
574
+ .Sy theme ,
575
+ .Sy width ,
576
+ .Sy assetRoot
577
+ et
578
+ .Sy locale .
579
+ Une valeur invalide est une erreur d'utilisation qui nomme la clé.
377
580
  Les clés inconnues sont ignorées.
581
+ Il n'y a pas de clé de journalisation\ :
582
+ .Sy quiet
583
+ est ignorée, et
584
+ .Fl q
585
+ et
586
+ .Fl v
587
+ ne s'appliquent qu'en ligne de commande.
378
588
  .El
379
589
  .Sh CODES DE SORTIE
380
590
  .Bl -tag -width Ds
381
591
  .It 0
382
592
  Succès.
383
593
  .It 1
384
- Erreur de validation (analyse en échec, référence invalide, etc.).
594
+ Erreur de validation (analyse en échec, référence invalide, etc.), y
595
+ compris les règles de vagues vérifiées à travers les fichiers inclus,
596
+ comme
597
+ .Sy NL.E0202 .
598
+ Elles sont signalées comme les diagnostics du validateur, au fichier et
599
+ à la ligne qu'elles désignent.
385
600
  .It 2
386
601
  Erreur d'utilisation (entrée manquante, indicateurs incorrects ou
387
602
  mutuellement exclusifs, format non pris en charge, fichier introuvable,
388
603
  sortie binaire vers un terminal, entrée illisible).
389
604
  .It 3
390
605
  Erreur de sortie (impossible d'écrire à la destination, échec du
391
- pipeline d'export).
606
+ pipeline d'export), y compris une inclusion impossible à résoudre
607
+ (inclusion illisible, circulaire ou en double,
608
+ .Cm start:
609
+ différent).
392
610
  .El
393
611
  .Sh EXEMPLES
394
612
  Produire le SVG par défaut dans le dossier courant\ :
@@ -425,6 +643,14 @@ nowline --init
425
643
  nowline --init mon-projet
426
644
  .Ed
427
645
  .Pp
646
+ Servir les outils MCP, ou les enregistrer auprès de chaque agent
647
+ trouvé\ :
648
+ .Bd -literal -offset indent
649
+ nowline --mcp
650
+ nowline --mcp-install
651
+ nowline --mcp-install cursor --scope project -n
652
+ .Ed
653
+ .Pp
428
654
  PDF avec géométrie de page explicite, stable octet pour octet entre
429
655
  machines\ :
430
656
  .Bd -literal -offset indent
@@ -445,6 +671,9 @@ qu'elle reste française quel que soit l'opérateur qui exécute
445
671
  nowline v1 locale:fr-CA
446
672
  .Ed
447
673
  .Sh VOIR AUSSI
674
+ .Xr nowline 5
675
+ .Pq Sy man 5 nowline
676
+ .Pp
448
677
  .Lk https://github.com/lolay/nowline "Code source, suivi des incidents et référence DSL complète"
449
678
  .Pp
450
679
  Le dossier