@nowline/cli 0.2.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 (139) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +372 -0
  3. package/dist/cli/args.d.ts +54 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +165 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/formats.d.ts +61 -0
  8. package/dist/cli/formats.d.ts.map +1 -0
  9. package/dist/cli/formats.js +153 -0
  10. package/dist/cli/formats.js.map +1 -0
  11. package/dist/cli/help.d.ts +3 -0
  12. package/dist/cli/help.d.ts.map +1 -0
  13. package/dist/cli/help.js +90 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli/output-path.d.ts +57 -0
  16. package/dist/cli/output-path.d.ts.map +1 -0
  17. package/dist/cli/output-path.js +70 -0
  18. package/dist/cli/output-path.js.map +1 -0
  19. package/dist/commands/init.d.ts +20 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +80 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/render.d.ts +15 -0
  24. package/dist/commands/render.d.ts.map +1 -0
  25. package/dist/commands/render.js +435 -0
  26. package/dist/commands/render.js.map +1 -0
  27. package/dist/commands/serve.d.ts +16 -0
  28. package/dist/commands/serve.d.ts.map +1 -0
  29. package/dist/commands/serve.js +287 -0
  30. package/dist/commands/serve.js.map +1 -0
  31. package/dist/convert/parse-json.d.ts +7 -0
  32. package/dist/convert/parse-json.d.ts.map +1 -0
  33. package/dist/convert/parse-json.js +34 -0
  34. package/dist/convert/parse-json.js.map +1 -0
  35. package/dist/convert/printer.d.ts +6 -0
  36. package/dist/convert/printer.d.ts.map +1 -0
  37. package/dist/convert/printer.js +334 -0
  38. package/dist/convert/printer.js.map +1 -0
  39. package/dist/convert/schema.d.ts +33 -0
  40. package/dist/convert/schema.d.ts.map +1 -0
  41. package/dist/convert/schema.js +77 -0
  42. package/dist/convert/schema.js.map +1 -0
  43. package/dist/core/parse.d.ts +24 -0
  44. package/dist/core/parse.d.ts.map +1 -0
  45. package/dist/core/parse.js +58 -0
  46. package/dist/core/parse.js.map +1 -0
  47. package/dist/diagnostics/adapt.d.ts +46 -0
  48. package/dist/diagnostics/adapt.d.ts.map +1 -0
  49. package/dist/diagnostics/adapt.js +109 -0
  50. package/dist/diagnostics/adapt.js.map +1 -0
  51. package/dist/diagnostics/format.d.ts +18 -0
  52. package/dist/diagnostics/format.d.ts.map +1 -0
  53. package/dist/diagnostics/format.js +41 -0
  54. package/dist/diagnostics/format.js.map +1 -0
  55. package/dist/diagnostics/index.d.ts +5 -0
  56. package/dist/diagnostics/index.d.ts.map +1 -0
  57. package/dist/diagnostics/index.js +5 -0
  58. package/dist/diagnostics/index.js.map +1 -0
  59. package/dist/diagnostics/json.d.ts +8 -0
  60. package/dist/diagnostics/json.d.ts.map +1 -0
  61. package/dist/diagnostics/json.js +24 -0
  62. package/dist/diagnostics/json.js.map +1 -0
  63. package/dist/diagnostics/model.d.ts +44 -0
  64. package/dist/diagnostics/model.d.ts.map +1 -0
  65. package/dist/diagnostics/model.js +2 -0
  66. package/dist/diagnostics/model.js.map +1 -0
  67. package/dist/diagnostics/text.d.ts +6 -0
  68. package/dist/diagnostics/text.d.ts.map +1 -0
  69. package/dist/diagnostics/text.js +43 -0
  70. package/dist/diagnostics/text.js.map +1 -0
  71. package/dist/generated/templates.d.ts +4 -0
  72. package/dist/generated/templates.d.ts.map +1 -0
  73. package/dist/generated/templates.js +9 -0
  74. package/dist/generated/templates.js.map +1 -0
  75. package/dist/generated/version.d.ts +11 -0
  76. package/dist/generated/version.d.ts.map +1 -0
  77. package/dist/generated/version.js +8 -0
  78. package/dist/generated/version.js.map +1 -0
  79. package/dist/i18n/locale.d.ts +56 -0
  80. package/dist/i18n/locale.d.ts.map +1 -0
  81. package/dist/i18n/locale.js +107 -0
  82. package/dist/i18n/locale.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +60 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/io/config.d.ts +2 -0
  88. package/dist/io/config.d.ts.map +1 -0
  89. package/dist/io/config.js +5 -0
  90. package/dist/io/config.js.map +1 -0
  91. package/dist/io/exit-codes.d.ts +12 -0
  92. package/dist/io/exit-codes.d.ts.map +1 -0
  93. package/dist/io/exit-codes.js +15 -0
  94. package/dist/io/exit-codes.js.map +1 -0
  95. package/dist/io/read.d.ts +13 -0
  96. package/dist/io/read.d.ts.map +1 -0
  97. package/dist/io/read.js +53 -0
  98. package/dist/io/read.js.map +1 -0
  99. package/dist/io/write.d.ts +32 -0
  100. package/dist/io/write.d.ts.map +1 -0
  101. package/dist/io/write.js +61 -0
  102. package/dist/io/write.js.map +1 -0
  103. package/dist/version.d.ts +13 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +20 -0
  106. package/dist/version.js.map +1 -0
  107. package/man/fr/nowline.1 +424 -0
  108. package/man/fr/nowline.5 +1864 -0
  109. package/man/nowline.1 +517 -0
  110. package/man/nowline.5 +1784 -0
  111. package/package.json +66 -0
  112. package/scripts/bundle-templates.mjs +105 -0
  113. package/scripts/compile.mjs +131 -0
  114. package/src/cli/args.ts +252 -0
  115. package/src/cli/formats.ts +207 -0
  116. package/src/cli/help.ts +92 -0
  117. package/src/cli/output-path.ts +98 -0
  118. package/src/commands/init.ts +99 -0
  119. package/src/commands/render.ts +566 -0
  120. package/src/commands/serve.ts +322 -0
  121. package/src/convert/parse-json.ts +57 -0
  122. package/src/convert/printer.ts +376 -0
  123. package/src/convert/schema.ts +105 -0
  124. package/src/core/parse.ts +93 -0
  125. package/src/diagnostics/adapt.ts +148 -0
  126. package/src/diagnostics/format.ts +70 -0
  127. package/src/diagnostics/index.ts +4 -0
  128. package/src/diagnostics/json.ts +30 -0
  129. package/src/diagnostics/model.ts +48 -0
  130. package/src/diagnostics/text.ts +62 -0
  131. package/src/generated/templates.ts +12 -0
  132. package/src/generated/version.ts +18 -0
  133. package/src/i18n/locale.ts +133 -0
  134. package/src/index.ts +60 -0
  135. package/src/io/config.ts +11 -0
  136. package/src/io/exit-codes.ts +18 -0
  137. package/src/io/read.ts +70 -0
  138. package/src/io/write.ts +94 -0
  139. package/src/version.ts +21 -0
package/man/nowline.1 ADDED
@@ -0,0 +1,517 @@
1
+ .Dd $Mdocdate$
2
+ .Dt NOWLINE 1
3
+ .Os
4
+ .Sh NAME
5
+ .Nm nowline
6
+ .Nd render, validate, and serve .nowline roadmap files
7
+ .Sh SYNOPSIS
8
+ .Nm
9
+ .Op Fl f Ar format
10
+ .Op Fl o Ar path
11
+ .Op Fl t Ar theme
12
+ .Op Fl -now Ar date
13
+ .Op Ar options
14
+ .Ar input
15
+ .Nm
16
+ .Fl -serve
17
+ .Op Fl p Ar port
18
+ .Op Ar options
19
+ .Ar input
20
+ .Nm
21
+ .Fl -init
22
+ .Op Ar name
23
+ .Nm
24
+ .Fl -dry-run
25
+ .Op Ar options
26
+ .Ar input
27
+ .Nm
28
+ .Op Fl V | Fl -version
29
+ .Nm
30
+ .Op Fl h | Fl -help
31
+ .Sh DESCRIPTION
32
+ .Nm
33
+ parses a
34
+ .Pa .nowline
35
+ roadmap file (or its JSON AST form) and writes the rendered output to a
36
+ file or to standard output.
37
+ Rendering is the default; other modes are selected by mutually-exclusive
38
+ mode flags rather than subcommands
39
+ .Pq verbless, matching mmdc, dot, d2, prettier, and tsc .
40
+ .Pp
41
+ The render pipeline is
42
+ .Sy parse
43
+ \(->
44
+ .Sy validate
45
+ \(->
46
+ .Sy layout
47
+ \(->
48
+ .Sy format-specific exporter .
49
+ Output is byte-for-byte deterministic for a given input,
50
+ .Fl -theme ,
51
+ and
52
+ .Fl -now .
53
+ .Pp
54
+ A single
55
+ .Nm
56
+ binary ships every export format: SVG, PNG, PDF, HTML,
57
+ Markdown+Mermaid, XLSX, MS Project XML, plus AST round-trip
58
+ .Pq json , nowline .
59
+ .Pp
60
+ .Ar input
61
+ is required for the default render mode,
62
+ .Fl -serve ,
63
+ and
64
+ .Fl -dry-run .
65
+ Pass
66
+ .Sq -
67
+ to read from standard input.
68
+ With zero arguments,
69
+ .Nm
70
+ prints help and exits 0.
71
+ .Sh INPUT
72
+ The input format is detected from the file extension:
73
+ .Pa .nowline
74
+ \(-> DSL,
75
+ .Pa .json
76
+ \(-> AST.
77
+ Standard-input input defaults to
78
+ .Pa .nowline .
79
+ Use
80
+ .Fl -input-format
81
+ to override for unusual filenames.
82
+ .Sh LANGUAGE
83
+ A
84
+ .Pa .nowline
85
+ file is an indentation-significant outline.
86
+ Two-space indent is canonical; tabs are accepted but must not be
87
+ mixed with spaces in a single file.
88
+ Strings are double-quoted; properties are
89
+ .Sy key:value
90
+ pairs.
91
+ Comments use
92
+ .Sq //
93
+ or
94
+ .Sq /* */ .
95
+ .Pp
96
+ File structure has up to four sections in strict order:
97
+ .Bl -enum -offset indent -compact
98
+ .It
99
+ .Sy nowline v1
100
+ directive (optional, must be the first non-comment line; accepts
101
+ .Sy locale:<bcp47> ) .
102
+ .It
103
+ .Sy include
104
+ declarations (optional).
105
+ .It
106
+ .Sy config
107
+ section (optional): styles, defaults, scale, calendar, symbols.
108
+ .It
109
+ .Sy roadmap
110
+ section (required): the content.
111
+ .El
112
+ .Pp
113
+ Keyword summary:
114
+ .Bl -tag -width "person/team" -compact
115
+ .It Sy nowline
116
+ DSL version directive (currently
117
+ .Sy v1 ) .
118
+ .It Sy include
119
+ Pull in another
120
+ .Pa .nowline
121
+ file;
122
+ .Sy config:
123
+ and
124
+ .Sy roadmap:
125
+ modes
126
+ .Pq Sy merge | ignore | isolate
127
+ control merge behavior.
128
+ .It Sy config , roadmap
129
+ Section markers; one
130
+ .Sy roadmap
131
+ per file.
132
+ .It Sy style , symbol , default , scale , calendar
133
+ Config keywords (presentation, defaults, axis, day arithmetic).
134
+ .It Sy person , team
135
+ Org vocabulary referenced by
136
+ .Sy owner: .
137
+ .It Sy anchor , milestone
138
+ Named dates and achievement markers on the timeline.
139
+ .It Sy label , size , status
140
+ Reusable vocabulary referenced by
141
+ .Sy labels: , size: , status: .
142
+ .It Sy swimlane
143
+ Groups items by team / area / stream.
144
+ .It Sy item
145
+ Work item, indented under a swimlane (or parallel / group).
146
+ .It Sy parallel , group
147
+ Parallel block and sequential bundle; nestable.
148
+ .It Sy footnote
149
+ Annotation attached to one or more entities via
150
+ .Sy on: .
151
+ .El
152
+ .Pp
153
+ Every entity follows a universal shape:
154
+ .Bd -literal -offset indent
155
+ keyword [id] ["title"] [key:value ...]
156
+ .Ed
157
+ .Pp
158
+ At least one of
159
+ .Ar id
160
+ or
161
+ .Qq Ar title
162
+ is required \(em the parser distinguishes them by quoting.
163
+ Lists use bracket notation
164
+ .Pq Sy labels:[a, b] ;
165
+ a trailing
166
+ .Sq \e
167
+ continues a line.
168
+ .Pp
169
+ Minimal example:
170
+ .Bd -literal -offset indent
171
+ nowline v1
172
+
173
+ roadmap r "Demo" start:2026-01-06
174
+
175
+ size m effort:1w
176
+
177
+ swimlane platform
178
+ item auth "Auth refactor" size:m
179
+ .Ed
180
+ .Pp
181
+ See
182
+ .Xr nowline 5
183
+ .Pq Sy man 5 nowline
184
+ for the full grammar, every property, validation rules, and the
185
+ .Sy include
186
+ collision model.
187
+ .Sh MODE FLAGS
188
+ The mode flags below are mutually exclusive.
189
+ .Bl -tag -width Fl
190
+ .It Fl -serve
191
+ Run a local live-reload preview server.
192
+ Re-parses, re-validates, re-lays-out, and re-renders on every file
193
+ change; connected browsers refresh via Server-Sent Events.
194
+ Validation errors are shown as an overlay on top of the most recent
195
+ successful render.
196
+ Opt-in
197
+ .Fl o Ar path
198
+ also writes the rendered output to disk on each rebuild.
199
+ .It Fl -init Op Ar name
200
+ Scaffold a starter
201
+ .Pa .nowline
202
+ file in the current directory.
203
+ The positional argument is the project
204
+ .Em name ,
205
+ not a file path;
206
+ .Pa .nowline
207
+ is auto-appended if missing.
208
+ Default name is
209
+ .Sy roadmap .
210
+ Existing files are silently overwritten.
211
+ .It Fl n , -dry-run
212
+ Run the full pipeline (parse + validate + layout + format) but skip the
213
+ write step.
214
+ Replaces the deprecated
215
+ .Sy validate
216
+ verb.
217
+ Exits 0 on success, 1 on validation error.
218
+ Works with any output format \(em
219
+ .Nm Ar roadmap.nowline Fl f Ar pdf Fl -dry-run
220
+ exercises the entire PDF pipeline without producing a file.
221
+ .El
222
+ .Sh I/O OPTIONS
223
+ .Bl -tag -width Fl
224
+ .It Fl f , -format Ar fmt
225
+ Output format:
226
+ .Sy svg , png , pdf , html , mermaid , xlsx , msproj , json , nowline .
227
+ Default: inferred from
228
+ .Fl o
229
+ extension, else
230
+ .Pa .nowlinerc
231
+ .Sy defaultFormat ,
232
+ else
233
+ .Sy svg .
234
+ .It Fl o , -output Ar path
235
+ Output file path.
236
+ Use
237
+ .Sq -
238
+ for standard output (Unix dash convention).
239
+ Default:
240
+ .Pa <cwd>/<input-base>.<format> .
241
+ Existing files are silently overwritten.
242
+ .It Fl -input-format Ar fmt
243
+ Force input format:
244
+ .Sy nowline | json .
245
+ Default: inferred from extension; standard input defaults to
246
+ .Sy nowline .
247
+ .El
248
+ .Sh RENDER OPTIONS
249
+ .Bl -tag -width Fl
250
+ .It Fl t , -theme Ar name
251
+ .Sy light | dark .
252
+ .It Fl -now Ar date
253
+ .Sq Now
254
+ anchor for the now-line and date math, in
255
+ .Pa YYYY-MM-DD
256
+ form.
257
+ Default: today (the OS calendar date in UTC).
258
+ Pass
259
+ .Fl -now Sq -
260
+ to suppress the now-line entirely.
261
+ .It Fl -locale Ar bcp47
262
+ BCP-47 language tag for the operator's CLI message output (validator
263
+ diagnostics on standard error,
264
+ .Fl -help ,
265
+ parse errors, verbose logs).
266
+ Examples:
267
+ .Sy en-US , fr , fr-CA , fr-FR .
268
+ .Pp
269
+ Nowline keeps two independent locale chains so a French operator
270
+ can read errors in French while still rendering an English roadmap
271
+ authored by an American teammate (and vice-versa):
272
+ .Bl -tag -width Ds
273
+ .It Em Content locale Pq baked into the rendered SVG / PDF / etc.
274
+ File's
275
+ .Sy nowline v1 locale:
276
+ directive
277
+ \(->
278
+ .Fl -locale
279
+ \(->
280
+ .Ev LC_ALL Ns / Ns Ev LC_MESSAGES Ns / Ns Ev LANG
281
+ \(->
282
+ .Sy en-US .
283
+ The file always wins; the operator's locale only acts as a fallback
284
+ when the file declines to declare its own.
285
+ .It Em Operator locale Pq stderr / stdout messages
286
+ .Fl -locale
287
+ \(->
288
+ .Ev LC_ALL Ns / Ns Ev LC_MESSAGES Ns / Ns Ev LANG
289
+ \(->
290
+ .Sy en-US .
291
+ Independent of the file directive: a French
292
+ .Ev LANG
293
+ keeps validator errors in French even when the file says
294
+ .Sy locale:en-US .
295
+ .El
296
+ .Pp
297
+ Bundles fall back along the BCP-47 chain
298
+ .Pq Sy fr-CA No \(-> Sy fr No \(-> Sy en-US ,
299
+ so missing entries are silently filled in.
300
+ See
301
+ .Pa specs/localization.md
302
+ for the resolution matrix.
303
+ .It Fl -no-links
304
+ Omit link icons from rendered items.
305
+ .It Fl s , -scale Ar n
306
+ Raster scale factor (PNG only; default 1).
307
+ .It Fl -strict
308
+ Promote asset / sanitizer warnings to errors.
309
+ .It Fl w , -width Ar px
310
+ Canvas width in pixels (default 1280).
311
+ .It Fl -asset-root Ar dir
312
+ Directory from which logo / image assets may be loaded
313
+ (default: input file's directory).
314
+ .El
315
+ .Sh FORMAT-SPECIFIC OPTIONS
316
+ .Bl -tag -width Fl
317
+ .It Fl -page-size Ar size
318
+ PDF page size: preset
319
+ .Pq Sy letter , legal , tabloid , ledger , a1 No \(en Sy a5 , b3 No \(en Sy b5 ,
320
+ .Sy content
321
+ for auto-fit, or
322
+ .Sy WxH Ns Em unit
323
+ for custom (e.g.
324
+ .Sy 8.5x11in , 210x297mm ) .
325
+ Default:
326
+ .Sy letter .
327
+ .It Fl -orientation Ar name
328
+ PDF orientation:
329
+ .Sy portrait | landscape | auto .
330
+ Default:
331
+ .Sy auto .
332
+ .It Fl -margin Ar length
333
+ PDF page margin.
334
+ Bare numbers are points; length suffixes
335
+ .Pq Sy in , mm , cm
336
+ are accepted.
337
+ Default:
338
+ .Sy 36pt
339
+ (1/2 inch).
340
+ .It Fl -font-sans Ar ref
341
+ Sans font for PNG/PDF: TTF/OTF path, or alias
342
+ .Pq Sy sf , helvetica , dejavu , ... .
343
+ Default: platform probe \(-> bundled DejaVu fallback.
344
+ .It Fl -font-mono Ar ref
345
+ Monospace font for PNG/PDF; same resolution chain as
346
+ .Fl -font-sans .
347
+ .It Fl -headless
348
+ Skip the platform font probe and force the bundled DejaVu pair.
349
+ Output is byte-stable across machines.
350
+ .It Fl -start Ar date
351
+ MS Project: anchor date
352
+ .Pq Pa YYYY-MM-DD
353
+ for relative-only roadmaps.
354
+ Default:
355
+ .Fl -now ,
356
+ then deterministic fallback.
357
+ .El
358
+ .Sh SERVE OPTIONS
359
+ .Bl -tag -width Fl
360
+ .It Fl p , -port Ar n
361
+ Port to bind (default 4318).
362
+ .It Fl -host Ar host
363
+ Bind address (default
364
+ .Sy 127.0.0.1 ;
365
+ use
366
+ .Sy 0.0.0.0
367
+ to expose on the LAN).
368
+ .It Fl -open
369
+ Open the browser on start.
370
+ .El
371
+ .Sh LOGGING OPTIONS
372
+ The logging flags are mutually exclusive.
373
+ .Bl -tag -width Fl
374
+ .It Fl v , -verbose
375
+ Print extra diagnostics to standard error (config path, pipeline
376
+ timings, font resolution, fallback decisions).
377
+ .It Fl q , -quiet
378
+ Suppress non-error standard error.
379
+ .El
380
+ .Sh STANDARD OPTIONS
381
+ .Bl -tag -width Fl
382
+ .It Fl h , -help
383
+ Print help to standard output and exit 0.
384
+ .It Fl V , -version
385
+ Print version to standard output and exit 0.
386
+ .El
387
+ .Pp
388
+ .Fl V
389
+ (uppercase) is
390
+ .Fl -version ;
391
+ lowercase
392
+ .Fl v
393
+ is
394
+ .Fl -verbose ,
395
+ matching
396
+ .Xr curl 1
397
+ and
398
+ .Xr ssh 1 .
399
+ .Sh ENVIRONMENT
400
+ .Bl -tag -width Ev
401
+ .It Ev LC_ALL , LC_MESSAGES , LANG
402
+ Operator locale fallback when
403
+ .Fl -locale
404
+ is absent.
405
+ First non-empty value wins, in the order listed.
406
+ POSIX-style suffixes
407
+ .Pq Sq .UTF-8 , Sq @euro
408
+ are stripped and the result is normalized to BCP-47.
409
+ .Pp
410
+ Affects the operator chain
411
+ .Pq stderr / stdout, validator diagnostics, --help, errors, verbose logs
412
+ unconditionally.
413
+ Affects the content chain
414
+ .Pq rendered axis labels, now-pill, quarter prefix
415
+ only when the file does not declare its own
416
+ .Sy nowline v1 locale:
417
+ directive — the file directive always wins for the rendered
418
+ artifact.
419
+ See
420
+ .Pa specs/localization.md
421
+ for the resolution matrix.
422
+ .El
423
+ .Sh FILES
424
+ .Bl -tag -width Pa
425
+ .It Pa .nowlinerc
426
+ Optional JSON or YAML configuration file.
427
+ Walked up from the input file's directory; nearest one wins.
428
+ CLI flags override config values.
429
+ Recognized keys:
430
+ .Sy theme , defaultFormat , width , pdfPageSize , pdfOrientation ,
431
+ .Sy pdfMargin , fontSans , fontMono , headlessFonts , locale .
432
+ Unknown keys are ignored.
433
+ .El
434
+ .Sh EXIT STATUS
435
+ .Bl -tag -width Ds
436
+ .It 0
437
+ Success.
438
+ .It 1
439
+ Validation error (parse failure, invalid reference, etc.).
440
+ .It 2
441
+ Usage error (missing input, bad flags, mutually-exclusive flags,
442
+ unsupported format, file not found, binary output to TTY, unreadable
443
+ input).
444
+ .It 3
445
+ Output error (cannot write to destination, exporter pipeline failure).
446
+ .El
447
+ .Sh EXAMPLES
448
+ Render the default SVG to the current directory:
449
+ .Bd -literal -offset indent
450
+ nowline roadmap.nowline
451
+ .Ed
452
+ .Pp
453
+ Render to a different format; format inferred from
454
+ .Fl o
455
+ extension:
456
+ .Bd -literal -offset indent
457
+ nowline roadmap.nowline -f pdf
458
+ nowline roadmap.nowline -o roadmap.pdf
459
+ nowline roadmap.nowline -f png --scale 3
460
+ .Ed
461
+ .Pp
462
+ Stream SVG to standard output, validate, and live-preview:
463
+ .Bd -literal -offset indent
464
+ nowline roadmap.nowline -o -
465
+ nowline roadmap.nowline --dry-run
466
+ nowline roadmap.nowline --serve -p 8080
467
+ .Ed
468
+ .Pp
469
+ Read from standard input; convert text \(<-\(-> JSON AST:
470
+ .Bd -literal -offset indent
471
+ cat roadmap.nowline | nowline -
472
+ nowline roadmap.nowline -f json -o roadmap.json
473
+ nowline roadmap.json -f nowline -o roadmap.nowline
474
+ .Ed
475
+ .Pp
476
+ Scaffold a new file:
477
+ .Bd -literal -offset indent
478
+ nowline --init
479
+ nowline --init my-project
480
+ .Ed
481
+ .Pp
482
+ PDF with explicit page geometry, byte-stable across machines:
483
+ .Bd -literal -offset indent
484
+ nowline roadmap.nowline -f pdf --page-size a4 \\
485
+ --orientation landscape --margin 0.5in --headless
486
+ .Ed
487
+ .Pp
488
+ Read errors and diagnostics in French while rendering whatever
489
+ locale the file declares:
490
+ .Bd -literal -offset indent
491
+ nowline roadmap.nowline --locale fr-CA
492
+ .Ed
493
+ .Pp
494
+ Set the rendered artifact's locale at the file level so it stays
495
+ French no matter who runs
496
+ .Nm :
497
+ .Bd -literal -offset indent
498
+ nowline v1 locale:fr-CA
499
+ .Ed
500
+ .Sh SEE ALSO
501
+ .Xr nowline 5
502
+ .Pq Sy man 5 nowline
503
+ .Pp
504
+ .Lk https://github.com/lolay/nowline "Source code, issues, and full DSL reference"
505
+ .Pp
506
+ The
507
+ .Sy specs/
508
+ directory in the source repository documents the DSL grammar
509
+ .Pq Pa specs/dsl.md ,
510
+ the layout / rendering pipeline
511
+ .Pq Pa specs/rendering.md ,
512
+ the CLI surface
513
+ .Pq Pa specs/cli.md ,
514
+ and OSS milestones
515
+ .Pq Pa specs/milestones.md .
516
+ .Sh AUTHORS
517
+ .An Lolay Aq Mt packages@lolay.com