@nowline/mcp 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/branding.d.ts +3 -3
- package/dist/branding.js +3 -3
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +2 -9
- package/dist/capabilities.js.map +1 -1
- package/dist/diagnostics.d.ts +46 -18
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +77 -25
- package/dist/diagnostics.js.map +1 -1
- package/dist/generated/resources.d.ts.map +1 -1
- package/dist/generated/resources.js +15 -3
- package/dist/generated/resources.js.map +1 -1
- package/dist/generated/ui-bundle.d.ts.map +1 -1
- package/dist/generated/ui-bundle.js +2 -2
- package/dist/generated/ui-bundle.js.map +1 -1
- package/dist/http.d.ts +4 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +23 -0
- package/dist/http.js.map +1 -0
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/options.d.ts +26 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +55 -0
- package/dist/options.js.map +1 -0
- package/dist/prompts.d.ts +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +6 -6
- package/dist/prompts.js.map +1 -1
- package/dist/reference-cheatsheet.d.ts +1 -1
- package/dist/reference-cheatsheet.d.ts.map +1 -1
- package/dist/reference-cheatsheet.js +27 -2
- package/dist/reference-cheatsheet.js.map +1 -1
- package/dist/schema-vocab.d.ts +5 -3
- package/dist/schema-vocab.d.ts.map +1 -1
- package/dist/schema-vocab.js +9 -0
- package/dist/schema-vocab.js.map +1 -1
- package/dist/schemas.d.ts +9 -7
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +2 -0
- package/dist/schemas.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +151 -59
- package/dist/server.js.map +1 -1
- package/dist/ui/entry.js +5 -12
- package/dist/ui/entry.js.map +1 -1
- package/dist/ui/payload.d.ts +14 -0
- package/dist/ui/payload.d.ts.map +1 -1
- package/dist/ui/payload.js +23 -0
- package/dist/ui/payload.js.map +1 -1
- package/package.json +24 -17
- package/src/branding.ts +3 -3
- package/src/capabilities.ts +4 -2
- package/src/diagnostics.ts +99 -39
- package/src/generated/resources.ts +15 -3
- package/src/generated/ui-bundle.ts +2 -2
- package/src/http.ts +28 -0
- package/src/index.ts +7 -14
- package/src/options.ts +79 -0
- package/src/prompts.ts +7 -7
- package/src/reference-cheatsheet.ts +27 -2
- package/src/schema-vocab.ts +9 -0
- package/src/schemas.ts +2 -0
- package/src/server.ts +200 -60
- package/src/ui/entry.ts +6 -11
- package/src/ui/payload.ts +26 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// examples/*.nowline → EXAMPLES
|
|
6
6
|
// packages/mcp/resources/conversions.md → CONVERSIONS_GUIDE
|
|
7
7
|
/** Full text of the nowline.5 DSL man page. Serves as the `nowline://reference` resource. */
|
|
8
|
-
export const REFERENCE_MAN_PAGE = ".Dd $Mdocdate$\n.Dt NOWLINE 5\n.Os\n.Sh NAME\n.Nm nowline\n.Nd Nowline DSL roadmap file format\n.Sh DESCRIPTION\nA\n.Pa .nowline\nfile is an indentation-significant outline that defines a roadmap, not\na Gantt chart.\nThe file itself is the product; every other artifact (SVG, PNG, PDF,\nHTML, Markdown+Mermaid, XLSX, MS Project XML) is a view of it produced\nby\n.Xr nowline 1 .\n.Pp\nThis page documents the file format.\nFor the rendering pipeline and visual contracts, see\n.Pa specs/rendering.md\nin the source repository.\nFor the CLI surface, see\n.Xr nowline 1 .\n.Pp\nThe canonical, prose source for everything below is\n.Pa specs/dsl.md\nin the source repository; this page is a hand-authored reference\ndistilled from it.\n.Sh FILE STRUCTURE\nA\n.Pa .nowline\nfile has up to four sections in strict order:\n.Bl -enum -offset indent\n.It\n.Sy nowline\ndirective (optional, recommended). Must be the first non-comment,\nnon-blank line if present.\n.It\n.Sy include\ndeclarations (optional). Pull in other\n.Pa .nowline\nfiles.\n.It\n.Sy config\nsection (optional). Rendering configuration: styles, defaults,\nscale, calendar, symbols.\n.It\n.Sy roadmap\nsection (required). Content: persons, teams, anchors, labels, sizes,\nstatuses, swimlanes, items, milestones, footnotes.\n.El\n.Pp\n.Sy config\nand\n.Sy roadmap\nare section markers, not indent-containers.\nKeywords inside each section appear at the top level (not indented\nunder the marker).\nIndentation is used where nesting is real: style properties under a\n.Sy style\nblock, items under a\n.Sy swimlane ,\nteam members under a\n.Sy team .\n.Pp\nIndentation is significant.\nTwo-space indent is canonical; one tab is also accepted.\nSpaces and tabs must not be mixed inside a single file \\(em the\nparser rejects mixed indentation with an error identifying the first\noffending line.\n.Pp\nStrings are double-quoted\n.Pq Qq Auth refactor ,\nnot bare or single-quoted.\nProperties are\n.Sy key:value\npairs on the same line as the entity; values containing spaces must\nbe double-quoted.\nProperty keys never use\n.Sq = .\n.Pp\nBuilt-in keywords and property names are kebab-case\n.Pq Sy capacity-icon , Sy days-per-week , Sy in-progress .\nAuthor-chosen identifiers may use any combination of letters,\ndigits, underscores, and dashes\n.Pq Sy auth-refactor , Sy authRefactor , Sy auth_refactor ;\nthey must start with a letter or underscore.\n.Pp\nComments use\n.Sq //\nfor single-line and\n.Sq /* */\nfor multi-line.\nA trailing\n.Sq \\e\ncontinues a line; indentation on the continuation line is cosmetic.\nUse\n.Sq \\e\\e\nfor a literal backslash.\n.Sh DIRECTIVE\nThe\n.Sy nowline\ndirective declares which DSL major version a file targets:\n.Bd -literal -offset indent\nnowline v1\n.Ed\n.Pp\nThe version is integer-only\n.Pq Sy v1 , Sy v2 , Sy v3 , ...\nand is independent of the npm package version.\nWithin a DSL major, the parser must accept every valid file written\nfor that major; new syntax may be added between package minor/patch\nreleases, but no breaking change to an existing valid\n.Sy nowline v1\nfile ships without bumping the directive to\n.Sy v2 .\nWhen the parser encounters a version newer than it supports, it\nemits an error identifying the required version.\nWhen the directive is omitted, the parser assumes the latest\nversion it supports.\n.Pp\nThe directive line accepts optional file-level properties after the\nversion.\nThe only directive property today is\n.Sy locale: ,\na BCP-47 tag controlling localized rendering and validator\nmessages:\n.Bd -literal -offset indent\nnowline v1 locale:fr-CA\n.Ed\n.Pp\nUnknown directive keys are an error so typos surface immediately.\nSee\n.Pa specs/localization.md\nfor the locale model and precedence chain.\n.Pp\nThe\n.Sy nowline\ndirective is the only construct that does not follow the universal\ndeclaration pattern\n.Pq see Sx GRAMMAR :\nno identifier, no title, just the keyword and version.\n.Sh INCLUDES\n.Sy include\npulls another\n.Pa .nowline\nfile into the current file:\n.Bd -literal -offset indent\ninclude \"shared/teams.nowline\"\ninclude \"brand-styles.nowline\" roadmap:ignore\ninclude \"partner.nowline\" config:isolate roadmap:isolate\n.Ed\n.Pp\nTwo optional properties \\(em\n.Sy config:\nand\n.Sy roadmap:\n\\(em control how the included file's content is handled.\nThey operate on two independent categories:\n.Bl -tag -width \"Roadmap (content)\"\n.It Sy Config\nThe included file's\n.Sy scale ,\n.Sy style ,\n.Sy symbol ,\n.Sy default ,\nand\n.Sy calendar\ndeclarations.\n.It Sy Roadmap\nThe included file's\n.Sy roadmap\ndeclaration plus all its content (persons, teams, anchors, labels,\nsizes, statuses, swimlanes, items, milestones, footnotes).\n.El\n.Pp\n.Sy config:\nmodes:\n.Bl -tag -width \"isolate\"\n.It Sy merge Pq default\nChild config items are merged into the parent.\nOn collision, the\n.Em parent wins\nand the parser emits a warning identifying the shadowed definition\nand source file.\n.It Sy ignore\nChild config is dropped entirely.\nIf child roadmap content is merged, it resolves styles from the\nparent's post-merge config.\n.It Sy isolate\nChild config is only available within the child file; parent config\nis only available in the parent.\nNeither side bleeds into the other.\n.El\n.Pp\n.Sy roadmap:\nmodes:\n.Bl -tag -width \"isolate\"\n.It Sy merge Pq default\nChild content entities are merged into the parent.\nOn collision,\n.Em parent wins\nand a warning is emitted.\nA swimlane collision drops the swimlane's contained items as well.\nMerged content resolves styles from the post-merge config.\n.It Sy ignore\nChild content is dropped.\nUse for shared style libraries\n.Pq Sy include \"brand.nowline\" roadmap:ignore .\nShared label, status, and size vocabulary uses\n.Sy roadmap:merge ,\nnot\n.Sy roadmap:ignore .\n.It Sy isolate\nChild content stays scoped to the child file and uses only the\nchild's config.\nThe child must contain a\n.Sy roadmap\ndeclaration (needed for the region label).\nThe isolated content renders as a visually distinct region with its\nown border.\n.El\n.Pp\nIncludes are processed depth-first, in file order.\nWhen the processor encounters an\n.Sy include ,\nit processes that child (and its includes recursively) before\ncontinuing with the next declaration.\nConfig is merged before roadmap content at each level.\n.Pp\nDiamond includes (A includes B and C, both include D) are valid;\nD is processed once on first encounter.\nDuplicate includes of the same file in a single file are an error.\nCircular includes are an error.\n.Pp\nIncludes are resolved relative to the including file's directory.\nPaths use forward slashes on all platforms.\nIncludes must appear before\n.Sy config\nand\n.Sy roadmap\n\\(em they are the first declarations in a file (after the optional\n.Sy nowline\ndirective).\n.Pp\nFor any include whose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\nif the child file declares a\n.Sy roadmap ,\nthe parent and child must agree on\n.Sy start: \\(em\nboth absent, or both present with identical values.\nA mismatch is an error reported on the parent's\n.Sy include\nline; this is an explicit exception to the\n.Qq parent wins\nmerge behaviour because\n.Sy start:\ndefines the shared timeline baseline.\n.Sh CONFIG SECTION\nThe optional\n.Sy config\nsection marker appears before\n.Sy roadmap .\nConfig keywords sit at the top level (not indented under the\nmarker) and define rendering vocabulary, defaults, axis settings,\nday arithmetic, and custom symbols.\n.Pp\nFive config keywords:\n.Sy scale ,\n.Sy style ,\n.Sy symbol ,\n.Sy default ,\n.Sy calendar .\nEvery config entry is optional; if\n.Sy config\nis omitted, all built-in defaults apply.\n.Ss style \\(em named visual definition\nA\n.Sy style\ndeclares a named visual treatment.\nProperties are indented beneath:\n.Bd -literal -offset indent\nstyle enterprise \"Enterprise readiness\"\n bg: blue\n fg: navy\n text: white\n border: solid\n icon: shield\n\nstyle risky\n border: dashed\n fg: orange\n.Ed\n.Pp\nStyles follow the universal\n.Sy [id] [\"title\"]\npattern.\nProperties are listed under\n.Sx STYLE PROPERTIES\nbelow.\n.Ss symbol \\(em custom named symbol\nA\n.Sy symbol\ndeclares a custom symbol for use by\n.Sy icon:\nand\n.Sy capacity-icon:\nstyle properties.\nAuthors use the inline Unicode-literal form\n.Pq Sy capacity-icon:\"\\(rs\"\nfor one-off symbols; named\n.Sy symbol\ndeclarations are for reusable ones.\n.Bd -literal -offset indent\nsymbol budget \"Budget\" unicode:\"\\(em\" ascii:\"$\"\nsymbol fte unicode:\"\\eu{1F464}\" ascii:\"@\"\nsymbol star unicode:\"\\(em\"\n.Ed\n.Pp\nRequired:\n.Sy unicode:\"<string>\"\n\\(em the Unicode character (literal or\n.Sy \\eu{...}\nescape, may be a multi-codepoint grapheme cluster).\n.Pp\nOptional:\n.Sy ascii:\"<string>\"\n\\(em short ASCII fallback for terminals lacking the glyph,\n\\(<= 3 ASCII characters; defaults to\n.Sq \\&?\nwhen omitted.\n.Pp\nA\n.Sy symbol\nid must not shadow a built-in icon name\n.Pq Sy none , Sy multiplier , Sy person , Sy people , Sy points , Sy time , Sy shield , Sy warning , Sy lock .\n.Ss default \\(em default property values per entity type\n.Sy default <entity> <properties>\nsets default property values for a given entity type.\nOne declaration per entity type per file:\n.Bd -literal -offset indent\ndefault item status:planned shadow:subtle\ndefault label style:subtle corner-radius:full\ndefault swimlane padding:sm spacing:none\ndefault roadmap padding:md header-height:md font:sans\ndefault milestone weight:bold\ndefault footnote style:subtle shadow:subtle\ndefault anchor style:subtle\ndefault parallel bracket:none\ndefault group padding:xs spacing:xs\n.Ed\n.Pp\nSupported entity types:\n.Sy item , label , swimlane , roadmap , parallel , group , milestone , footnote , anchor .\nWhen an entity omits a property, the matching default applies;\nexplicit values on the entity always override defaults.\n.Pp\nIdentity-defining, sizing, sequencing, reference, and prose\nproperties cannot be defaulted because they must be explicit per\nentity.\nBanned, by entity type:\n.Bl -tag -width \"default footnote\"\n.It Sy default item\n.Sy size , duration , after , before , remaining , link , description , owner .\n.It Sy default milestone\n.Sy date , after , link , description .\n.It Sy default anchor\n.Sy date , link , description .\n.It Sy default footnote\n.Sy on , link , description .\n.El\n.Pp\nRaw style properties\n.Pq Sy bg , Sy fg , Sy text , Sy border , Sy shadow , ...\nare allowed on\n.Sy default\nbecause\n.Sy default\nlives in\n.Sy config ,\nthe presentation section.\nThe ban on raw style properties applies to roadmap-section\nentities, not to\n.Sy default\nlines.\n.Pp\n.Sy capacity\nis allowed on\n.Sy default item\nbut\n.Em not\non\n.Sy default swimlane\n\\(em each lane's budget is intentionally explicit at its declaration\nsite.\n.Sy utilization-warn-at: ,\n.Sy utilization-over-at: ,\nand\n.Sy capacity-icon:\nare allowed on both\n.Sy default swimlane\nand\n.Sy default item\nper the usual presentation-property rule.\n.Ss scale \\(em axis display\n.Sy scale\nconfigures the timeline axis.\nColumn width is set by\n.Sy scale:<duration>\non the\n.Sy roadmap\ndeclaration; this block configures display:\n.Bd -literal -offset indent\nscale\n name: sprints\n label-every: 2\n label: \"Sprint {n}\"\n.Ed\n.Bl -tag -width \"label-every\"\n.It Sy name\nDisplay label for the scale unit (e.g.\n.Qq sprint ) .\nDefaults to an auto-generated name based on the roadmap's\n.Sy scale:\nduration.\n.It Sy label-every\nShow an axis label every Nth column.\nDefaults to the renderer's choice.\n.It Sy label\nAxis label format.\n.Sq {n}\nis the column index.\n.El\n.Pp\nThe\n.Sy scale\nconfig block is optional.\nA file can declare\n.Sy scale:2w\non its\n.Sy roadmap\nwith no\n.Sy scale\nblock and the renderer picks all display defaults.\n.Ss calendar \\(em day arithmetic\nThe\n.Sy calendar:\nproperty on\n.Sy roadmap\nselects day-arithmetic mode:\n.Bl -tag -width \"calendar:business\"\n.It Sy calendar:business Pq default\nEngineering working-day arithmetic.\n.Sy days-per-week:5 ,\n.Sy days-per-month:22 ,\n.Sy days-per-quarter:65 ,\n.Sy days-per-year:260 .\n.It Sy calendar:full\nCalendar-day arithmetic with weekends.\n.Sy days-per-week:7 ,\n.Sy days-per-month:30 ,\n.Sy days-per-quarter:90 ,\n.Sy days-per-year:365 .\n.It Sy calendar:custom\nAuthor-supplied values via the\n.Sy calendar\nconfig block.\n.El\n.Pp\nA\n.Sy calendar\nconfig block is only meaningful when\n.Sy roadmap\ndeclares\n.Sy calendar:custom .\nWhen custom, all four\n.Sy days-per-*\nfields are required:\n.Bd -literal -offset indent\nconfig\n\ncalendar\n days-per-week: 6\n days-per-month: 26\n days-per-quarter: 78\n days-per-year: 312\n\nroadmap rotating-shift \"Rotating Shift\" calendar:custom\n.Ed\n.Pp\nAll four entries must be positive integers.\nThere is no partial form.\n.Pp\nEach\n.Sy days-per-*\nfield is independently defined: a duration like\n.Sy 1y\nresolves to\n.Sy days-per-year\ndirectly, not by multiplying through months or weeks.\nThis is why business mode's\n.Sy 1y\nis\n.Sy 260d ,\nnot\n.Sy 12 \\(mu 22d = 264d .\n.Sh ROADMAP SECTION\nThe\n.Sy roadmap\nsection marker is required and appears exactly once per file.\nRoadmap keywords sit at the top level (not indented under the\nmarker) and form the content of the file.\n.Pp\nThe\n.Sy roadmap\ndeclaration line itself accepts:\n.Bd -literal -offset indent\nroadmap platform-2026 \"Platform 2026\" \\e\n author:\"Acme\" \\e\n start:2026-01-06 \\e\n scale:2w \\e\n calendar:business \\e\n logo:\"./brand/acme.svg\" \\e\n logo-size:md\n.Ed\n.Bl -tag -width \"calendar:\"\n.It Sy author:\nFree-form string.\n.It Sy start:\nISO date\n.Pq Pa YYYY-MM-DD ,\nthe timeline baseline.\nRequired if any\n.Sy anchor\nor any dated\n.Sy milestone\nexists.\nEvery anchor date and dated milestone date must be on or after\n.Sy start: .\n.It Sy scale:\nRaw duration literal for column width\n.Pq Sy 2w , Sy 1q ;\ndefaults to\n.Sy 1w .\n.It Sy calendar:\n.Sy business | full | custom .\nDefaults to\n.Sy business .\n.It Sy logo:\nPath to a logo file\n.Pq Sy .svg , Sy .png , Sy .jpg / Sy .jpeg , Sy .webp ,\nresolved relative to the\n.Pa .nowline\nfile's directory.\nForward slashes on all platforms; only local paths are accepted.\nAsset resolution happens at render time, not parse time \\(em a file\nreferencing a missing logo is still a valid document.\n.It Sy logo-size:\nSize preset\n.Pq Sy xs | sm | md | lg | xl ,\ndefault\n.Sy md .\n.El\n.Pp\nTwelve roadmap-section keywords:\n.Sy swimlane , item , parallel , group ,\n.Sy person , team , anchor , label , size , status , milestone ,\n.Sy footnote .\nEach follows the universal\n.Sy [id] [\"title\"] [key:value...]\npattern.\n.Ss swimlane \\(em group items by team / area / stream\n.Bd -literal -offset indent\nswimlane platform owner:platform capacity:5\n item auth-refactor \"Auth refactor\" size:l after:kickoff\n item platform-qa \"Platform QA\" size:s capacity:2\n.Ed\n.Pp\nItems, parallels, and groups are indented beneath.\nProperties:\n.Bl -tag -width \"utilization-over-at\"\n.It Sy owner:\nPerson or team id.\n.It Sy capacity:\nPer-timestep budget.\nInteger or decimal only; no percent form.\n.It Sy utilization-warn-at: , Sy utilization-over-at:\nThresholds for the lane utilization underline.\nEach accepts a percent literal\n.Pq Sy 80% ,\na positive decimal interpreted as a fraction\n.Pq Sy 0.8 ,\nor the bareword\n.Sy none\nto opt out of that color band.\nDefaults\n.Sy 80%\nand\n.Sy 100% .\nWhen both numeric thresholds are set,\n.Sy warn-at \\(<= over-at .\n.El\n.Ss item \\(em work item\nItems live inside swimlanes (or\n.Sy parallel /\n.Sy group\nblocks) and must declare at least one of\n.Sy size:\nor\n.Sy duration: .\nSee\n.Sx ITEM PROPERTIES\nbelow.\n.Bd -literal -offset indent\nswimlane platform\n item auth-refactor \"Auth refactor\" size:l status:done\n item \"Quick cleanup\" size:s\n item sso size:m\n.Ed\n.Ss parallel \\(em parallel execution block\n.Sy parallel\nruns its children in parallel.\nChildren can be bare items or groups.\n.Bd -literal -offset indent\nswimlane platform\n item auth \"Auth refactor\" size:l\n parallel\n item api-v2 \"API v2\" size:m\n item sdk-update \"SDK update\" size:s\n item integration \"Integration\" size:s\n.Ed\n.Pp\n.Sy api-v2\nand\n.Sy sdk-update\nstart at the same time (after\n.Sy auth\nfinishes).\nWhen the\n.Sy parallel\nblock ends, the next sibling\n.Pq Sy integration\nwaits for all parallel children to complete (implicit join on\ndedent).\nA\n.Sy parallel\nblock must contain at least 2 children; a single-child parallel\nemits a warning.\n.Ss group \\(em sequential item bundle\n.Sy group\nbundles items into a named sequential track.\nInside a swimlane (outside a parallel block), the group is\nsequential with respect to its siblings.\n.Bd -literal -offset indent\nswimlane platform\n group api-work \"API Work\" labels:enterprise\n item api-v2 \"API v2\" size:m\n item api-docs \"API docs\" size:s\n item deploy \"Deploy\" size:s\n.Ed\n.Pp\nA\n.Sy group\nwith\n.Sy style: ,\n.Sy labels: ,\nor other visual properties renders with a visible bounding box\nplus a small title chiclet.\nA\n.Sy group\nwith no styling is purely structural \\(em it only governs\nsequencing and inner row growth, with no visible artifact.\n.Ss anchor \\(em named date on the timeline\n.Bd -literal -offset indent\nanchor kickoff date:2026-01-06\nanchor code-freeze \"Code Freeze\" date:2026-05-01\n.Ed\n.Pp\n.Sy date:\nis required.\nAnchors are referenced by\n.Sy after:\nand\n.Sy before:\non items, parallels, groups, and milestones to pin their position.\n.Ss label \\(em semantic tag / chip vocabulary\nLabels live in the roadmap section so content and vocabulary live\ntogether; visual defaults live in\n.Sy config\nvia\n.Sy default label\nand referenced\n.Sy style\nblocks.\n.Bd -literal -offset indent\nlabel enterprise \"Enterprise readiness\" style:enterprise\nlabel security \"Security hardening\" style:enterprise-red\nlabel low-confidence style:risky-dotted\n.Ed\n.Pp\nA\n.Sy label\nline accepts\n.Sy style:id\nplus universal properties\n.Pq Sy labels: , Sy link: , description .\nRaw style properties are\n.Em not\nallowed on a\n.Sy label\nline.\nLabels used on items without a matching\n.Sy label\ndeclaration are valid; they render with chip defaults from\n.Sy default label\nor system defaults.\n.Ss size \\(em named effort budget\nA\n.Sy size\nmaps a named t-shirt size to a single-engineer effort budget.\n.Bd -literal -offset indent\nsize xs \"Extra Small\" effort:0.5d\nsize s \"Small\" effort:3d\nsize m \"Medium\" effort:1w\nsize l \"Large\" effort:2w\nsize xl \"Extra Large\" effort:1m\n.Ed\n.Pp\n.Sy effort:\nis required and must be a positive raw duration literal\n.Pq decimal-aware: Sy 0.5d , Sy 1.5w .\nThe id must not match the raw duration pattern\n.Sy \\&\\ed+(\\e.\\ed+)?[dwmqy]\nor be a bare\n.Sy d , w , m , q , y\n\\(em this avoids ambiguity at the call site.\n.Pp\nOn items, the on-bar size chip renders the size's optional\n.Sy title\nwhen provided, falling back to the id verbatim.\n.Sy size m \"M\" effort:1w\nrenders\n.Qq M ;\n.Sy size m effort:1w\nrenders\n.Qq m .\n.Pp\n.Sy size\ndeclarations must precede any item that references them.\n.Ss status \\(em custom status value\n.Bd -literal -offset indent\nstatus awaiting-review \"Awaiting Review\"\nstatus in-review \"In Review\"\nstatus deferred \"Deferred\"\n.Ed\n.Pp\nExtends the built-in set\n.Po\n.Sy planned ,\n.Sy in-progress\n.Pq alias Sy active ,\n.Sy done\n.Pq alias Sy completed ,\n.Sy at-risk ,\n.Sy blocked\n.Pc .\nThe aliases canonicalize at the layout boundary; both spellings\nare valid input.\n.Pp\nCustom statuses have no inherent semantics beyond what renderers\nassign; the DSL only guarantees the value resolves and can carry\na display title.\nRenderers may map custom statuses to visual treatments via\n.Sy default item style:...\nor entity-level\n.Sy style:\noverrides.\n.Pp\n.Sy status\ndeclarations must precede any entity that references them.\n.Ss milestone \\(em achievement marker\n.Bd -literal -offset indent\nmilestone v1-ga \"v1 GA\" date:2026-06-30\nmilestone beta \"Beta\" after:auth-refactor\nmilestone v1-ga \"v1 GA\" after:[core-api, audit-log]\nmilestone v1-ga \"v1 GA\" date:2026-06-30 after:[core-api, audit-log]\n.Ed\n.Pp\nAt least one of\n.Sy date:\nor\n.Sy after:\nis required.\nWith both, the\n.Sy date:\nis an intended target, not a hard cap; slippage (dependencies not\nconverging by the target date) is a rendering concern, not a\nvalidation error.\n.Ss footnote \\(em attachable annotation\n.Bd -literal -offset indent\nfootnote \"Vendor dependency\" on:audit-log\n description \"Blocked until vendor contract is signed.\"\n\nfootnote capacity-risk \"Team capacity risk\" on:[mobile, platform]\n description \"Both teams are understaffed through Q2.\"\n.Ed\n.Pp\n.Sy on:\nis required and references one or more identifiers (item,\nswimlane, anchor, milestone, person, team).\nUse bracket notation for multiples:\n.Sy on:[id1, id2] .\nFootnotes are numbered sequentially by document order; a\nsuperscript number appears on every entity the footnote attaches\nto.\n.Ss person and team \\(em organisational vocabulary\n.Bd -literal -offset indent\nperson sam \"Sam Chen\" link:https://github.com/samchen\nperson jen \"Jennifer Wu\"\n\nteam engineering \"Engineering\"\n team platform \"Platform Team\"\n person sam\n person jen\n team mobile \"Mobile Team\"\n.Ed\n.Pp\nA\n.Sy person\nmay be declared at the roadmap top level or nested inside a\n.Sy team .\n.Bl -tag -width \"person <id>\"\n.It Sy person <id>\nBare reference.\nInside a\n.Sy team\nit denotes membership.\nAt the roadmap top level it is a no-op (parser may emit a\nwarning).\n.It Sy person <id> [\"title\"] [properties]\nDeclaration.\nCreates the person.\nIf nested inside a\n.Sy team ,\nthe declaration also establishes membership.\n.El\n.Pp\nPerson identifiers are global within the merged file scope\nregardless of where they are declared.\nA person may be declared at most once in the merged scope;\nduplicate declarations are an error.\n.Pp\n.Sy team\nnesting inside another\n.Sy team\nis always a declaration.\nTeams cannot be referenced with a bare\n.Sy team <id>\nline.\n.Pp\nBoth\n.Sy person\nand\n.Sy team\nsupport\n.Sy link:\nand the\n.Sy description\nsub-directive.\n.Sh UNIVERSAL PROPERTIES\nThese properties are valid on every entity type: items, swimlanes,\nparallel blocks, groups, milestones, anchors, persons, teams,\nlabels, sizes, statuses, footnotes.\n.Bl -tag -width \"description\"\n.It Sy labels:\nList.\nTags for filtering and display.\n.Sy labels:enterprise\nor\n.Sy labels:[enterprise, security] .\nOn an item, each label renders as an atomic chiclet inside the\nbar.\n.It Sy link:\nBare URL (no quotes).\nOne link per entity.\n.It Sy style:\nIdentifier.\nSingle reference to a named style declared in\n.Sy config .\nThis is the only visual property allowed on a roadmap-section\nentity.\n.It Sy description\nSub-directive.\nIndented under the entity.\nLonger explanatory text:\n.Sy description \"Details here\" .\n.El\n.Pp\n.Sy Content vs. rendering separation .\nEntities in the roadmap section carry only semantic information\nplus an optional single\n.Sy style:id\nreference.\nRaw style properties\n.Po\n.Sy bg , Sy fg , Sy text , Sy border , Sy icon , Sy shadow ,\n.Sy font , Sy weight , Sy italic , Sy text-size , Sy padding ,\n.Sy spacing , Sy header-height , Sy corner-radius , Sy bracket ,\n.Sy capacity-icon , Sy timeline-position , Sy minor-grid\n.Pc\nmay only appear in\n.Sy style\nblocks and\n.Sy default <entity>\nlines \\(em both of which live in\n.Sy config .\n.Sh ITEM PROPERTIES\n.Sy status , owner , after ,\nand\n.Sy before\nare also valid on swimlanes, parallel blocks, and groups.\nThe rest are item-only.\n.Bl -tag -width \"remaining\"\n.It Sy status:\nBuilt-in:\n.Sy planned ,\n.Sy in-progress\n.Pq alias Sy active ,\n.Sy done\n.Pq alias Sy completed ,\n.Sy at-risk ,\n.Sy blocked .\nCustom:\n.Sy status:awaiting-review\nmatching a\n.Sy status\ndeclaration.\n.It Sy owner:\nPerson or team id.\nSingular \\(em one accountable owner.\n.It Sy after:\nIdentifier or bracketed list.\nThe entity starts after the referenced entity finishes.\n.Sy after:[a, b]\nstarts after the latest finisher.\nAccepts item, milestone, anchor, parallel, or group ids.\n.It Sy before:\nIdentifier or bracketed list.\nThe entity must finish before the referenced entity starts.\n.Sy before:[a, b]\nfinishes before the earliest starter.\n.It Sy size:\nSize alias.\n.Sy size:l\nreferences a\n.Sy size\ndeclaration; the item's calendar duration is\n.Sy effort \\(di item_capacity\n.Pq Sy capacity:\ndefaults to\n.Sy 1\nwhen absent.\nItems only \\(em not valid on\n.Sy parallel\nor\n.Sy group .\n.It Sy duration:\nRaw duration literal only\n.Pq Sy 2w , Sy 3m , Sy 0.5d ;\nno alias names.\n.Sy size:\nis the alias mechanism.\nWhen set alongside\n.Sy size: ,\n.Sy duration:\nwins for bar width and meta-line driver (size chip omitted).\nItems only.\n.It Sy remaining:\nWork remaining.\nTwo equivalent forms: percent\n.Pq Sy remaining:30%\nor single-eng effort literal\n.Pq Sy remaining:1w , Sy remaining:0.5d .\nA literal is normalized to a percent during layout.\nBoth forms render identically.\n.Sy status:done\ntakes priority.\nItems only.\n.It Sy capacity:\nConcurrent capacity consumed by this item while it runs.\nPositive integer\n.Pq Sy capacity:2 ,\ndecimal\n.Pq Sy capacity:0.5 ,\nor percent literal\n.Pq Sy capacity:50%\nwhich parses to a decimal.\nItems only.\n.El\n.Pp\n.Sy Required properties .\n.Sy item\ndeclarations must include at least one of\n.Sy size:\nor\n.Sy duration: .\n.Sy anchor\ndeclarations require\n.Sy date: .\n.Sy milestone\ndeclarations require at least one of\n.Sy date:\nor\n.Sy after: .\n.Sy footnote\ndeclarations require\n.Sy on: .\nOmitting a required property is a validation error that names the\nentity by id or title.\n.Sh CAPACITY\n.Sy capacity:\nis an optional annotation that models per-timestep throughput.\nBoth swimlanes and items may declare it, and the two annotations\nare fully independent \\(em neither requires the other.\n.Bd -literal -offset indent\nswimlane platform capacity:5\n item auth size:l capacity:2\n parallel\n item api size:m capacity:2\n item sdk size:m capacity:1\n item qa size:s capacity:50%\n.Ed\n.Pp\nThe unit is opaque to the DSL: authors decide whether\n.Sy 5\nmeans engineers, story points, FTE, hours, or any other measure\n.Pq same opacity contract as Sy size:l until a Sy size declaration gives it meaning .\n.Pp\nWhere it can appear:\n.Bl -tag -width \"swimlane\"\n.It Sy swimlane\nInteger or decimal only (no percent form).\nThe lane's per-timestep budget.\n.It Sy item\nInteger, decimal, or percent literal.\nThe item's concurrent consumption.\n.It Sy parallel , Sy group\nNot valid \\(em derived from children (sum at each timestep across\nparallel; pass-through for group).\nSame exclusion family as\n.Sy size , duration , remaining .\n.El\n.Pp\nDefault capacity:\n.Bl -tag -width \"Duration-literal items\"\n.It Sy Sized items\n.Sy size:\ndeclared, no explicit\n.Sy capacity: \\(em\ncapacity defaults to\n.Sy 1\nin both duration derivation\n.Pq Sy duration = effort \\(di 1 = effort\nand overload accounting.\n.It Sy Duration-literal items\n.Sy duration:\ndeclared, no\n.Sy size: ,\nno explicit\n.Sy capacity: \\(em\ncapacity stays unset and the item contributes\n.Sy 0\nto overload (uncounted).\nThe literal duration is the bar width regardless.\n.It Sy Explicit Sy capacity:N\nAlways wins for both purposes.\n.El\n.Pp\nLifetime: capacity is constant for the item's full duration.\nNo ramps in\n.Sy v1 .\n.Pp\n.Sy Utilization thresholds .\nSwimlanes that declare\n.Sy capacity:\npaint a tri-state utilization underline (green / yellow / red)\nalong the bottom of the band based on the per-timestep load\nfunction\n.Sy f(x) = \\(*S items[i].capacity for items active at x .\n.Bl -tag -width \"utilization-over-at\"\n.It Sy utilization-warn-at:N% Pq default Sy 80%\nAt or above this fraction of\n.Sy capacity: ,\nthe segment paints\n.Sy yellow .\n.It Sy utilization-over-at:N% Pq default Sy 100%\nAt or above this fraction of\n.Sy capacity: ,\nthe segment paints\n.Sy red .\n.El\n.Pp\nBelow\n.Sy warn-at\nthe segment paints\n.Sy green .\nBoth thresholds accept the literal value\n.Sy none\nto opt out of that color band:\n.Sy utilization-warn-at:none\ncollapses to a binary green/red indicator;\n.Sy utilization-over-at:none\nremoves red entirely; setting both to\n.Sy none\nsuppresses the underline outright.\n.Sh SIZING PRECEDENCE\nWhen an item declares both\n.Sy size:\nand\n.Sy duration: ,\nthe explicit\n.Sy duration:\nliteral wins for bar width and the meta line: the size chip is\nnot shown (only the literal appears as the driver token).\n.Bl -column -offset indent \"size:\" \"duration:\" \"capacity:\" \"Resulting duration\"\n.It Sy size: Ta Sy duration: Ta Sy capacity: Ta Resulting duration\n.It l Ta \\(em Ta \\(em Ta size.l.effort \\(di 1 (e.g. 2w)\n.It l Ta \\(em Ta 2 Ta size.l.effort \\(di 2 (e.g. 1w)\n.It l Ta 2w Ta 2 Ta 2w (literal wins; no chip)\n.It \\(em Ta 2w Ta 2 Ta 2w (capacity does not divide a literal)\n.It \\(em Ta \\(em Ta \\(em Ta validation error\n.El\n.Sh STYLE PROPERTIES\nProperties valid inside a\n.Sy style\nblock (and on\n.Sy default <entity>\nlines):\n.Bl -tag -width \"timeline-position\"\n.It Sy bg\nBackground/fill color or\n.Sy none .\nNamed\n.Po\n.Sy red , blue , yellow , green , orange ,\n.Sy purple\n.Pq alias Sy violet ,\n.Sy gray\n.Pq alias Sy grey ,\n.Sy navy , white\n.Pc ,\nhex\n.Pq Sy #2563eb ,\nor\n.Sy none\n(transparent).\n.It Sy fg\nBorder/outline color.\nNamed, hex, or\n.Sy none\n(no border).\n.It Sy text\nText color.\nNamed, hex, or\n.Sy none\n(hides text).\n.It Sy border\n.Sy solid | dashed | dotted .\n.It Sy icon\nIdentifier or string.\nBuilt-in identifiers\n.Po\n.Sy shield , warning , lock , plus the capacity-icon vocabulary\n.Pc ;\ncustom: any identifier declared by a\n.Sy symbol\ndeclaration; inline: a double-quoted Unicode literal\n.Pq Sy \"\\(rs\"\n\\(em font-dependent.\n.It Sy shadow\n.Sy none Pq default | subtle | soft | hard .\n.It Sy font\n.Sy sans Pq default | serif | mono .\n.It Sy weight\n.Sy thin | light | normal Pq default | bold .\n.It Sy italic\n.Sy true | false Pq default .\n.It Sy text-size\n.Sy xs | sm | md Pq default | lg | xl .\n.It Sy padding\n.Sy none | xs | sm | md Pq default | lg | xl .\n.It Sy spacing\n.Sy none | xs | sm | md | lg | xl .\nDefault varies by entity.\n.It Sy header-height\n.Sy none | xs | sm | md Pq default | lg | xl .\nRoadmap-only.\n.It Sy corner-radius\n.Sy none | xs | sm | md | lg | xl | full .\n.It Sy bracket\n.Sy none Pq default | solid | dashed .\nParallel-only.\n.It Sy capacity-icon\nGlyph used as the suffix to capacity numbers.\nBuilt-in identifiers:\n.Sy none ,\n.Sy multiplier\n.Pq default \\(em \"\\(mu\" ,\n.Sy person ,\n.Sy people ,\n.Sy points\n.Pq \"\\(em\" ,\n.Sy time\n.Pq \"\\(em\" .\nCustom: any\n.Sy symbol\nid; inline: a double-quoted Unicode literal.\n.It Sy timeline-position\n.Sy top Pq default | bottom | both .\nRoadmap-only.\n.Sy both\nmirrors the date strip at the chart bottom.\n.It Sy minor-grid\n.Sy true | false Pq default .\nRoadmap-only.\nWhen\n.Sy true ,\ndraws faint dotted grid lines at every tick boundary.\n.El\n.Pp\nBuilt-in icon names are rendered from a curated SVG library\nshipped with the renderer, not from Unicode emoji codepoints.\nThis guarantees consistent visual output across every platform\n(web, CLI, exports).\nAuthors who want platform-default emoji rendering use an inline\nUnicode literal instead of the named identifier.\n.Sh GRAMMAR\n.Ss Universal declaration pattern\nEvery entity declaration follows the same shape:\n.Bd -literal -offset indent\nkeyword [id] [\"title\"] [key:value ...]\n.Ed\n.Bl -tag -width \"Identifier\"\n.It Sy Identifier\nUnquoted, matches\n.Sy [a-zA-Z_][a-zA-Z0-9_-]* .\nUsed for referencing.\nOptional \\(em auto-generated from the title (kebab-cased) if\nomitted.\n.It Sy Title\nDouble-quoted string.\nHuman-readable display name.\nOptional.\nAlways double-quoted, even single-word titles \\(em the quote is\nhow the parser distinguishes id from title.\n.El\n.Pp\nAt least one of\n.Sy id\nor\n.Sy \"title\"\nmust be present.\nEvery other input is a keyed property using\n.Sy key:value .\n.Pp\nThe\n.Sy nowline\ndirective is the only construct without an id or title; every\nother declaration follows this pattern.\n.Ss Identifiers\nIdentifiers match\n.Sy [a-zA-Z_][a-zA-Z0-9_-]* \\(em\nletters, digits, underscores, and dashes, starting with a letter\nor underscore.\nThey must be unique across the merged result (the file and all\nits includes); items, parallel blocks, groups, anchors, persons,\nteams, milestones, footnotes share one namespace.\n.Pp\nIdiomatic Nowline uses kebab-case but\n.Sy authRefactor ,\n.Sy auth_refactor ,\nand\n.Sy MED\nare equally valid.\n.Pp\nWhen omitted, the parser generates one by slugifying the title to\nkebab-case:\n.Qq Audit log v2\nbecomes\n.Sy audit-log-v2 .\n.Ss Lists\nAny list-typed property accepts a single value without brackets or\nmultiple values with bracket notation:\n.Bd -literal -offset indent\nlabels:enterprise\nlabels:[enterprise, security]\n.Ed\n.Pp\nNo quotes around identifiers in lists.\nComma-separated, optional spaces.\n.Ss Dependencies\n.Sy after:\nand\n.Sy before:\neach accept a single identifier or a bracketed list.\nReferences may target items, milestones, anchors, parallel\nblocks, or groups.\n.Bl -bullet -offset indent -compact\n.It\n.Sy after:id\n\\(em this entity starts after the referenced entity finishes (or\nafter the referenced anchor date).\n.It\n.Sy after:[id1, id2, ...]\n\\(em starts after\n.Em all\nreferenced entities finish (i.e. after the latest of them).\n.It\n.Sy before:id\n\\(em this entity must finish before the referenced entity starts\n(or before the referenced anchor date).\n.It\n.Sy before:[id1, id2, ...]\n\\(em finishes before the\n.Em earliest\nof the referenced entities starts.\n.El\n.Pp\nCircular dependencies across the full graph (including every\nelement of list-form references) are a validation error.\n.Ss Line continuation\nA trailing\n.Sq \\e\nmeans the next line continues the same declaration.\nIndentation on the continuation line is cosmetic.\nOnly valid at the end of a property line \\(em not inside strings\nor comments.\nUse\n.Sq \\e\\e\nfor a literal backslash.\n.Bd -literal -offset indent\nitem auth \"Auth refactor\" duration:2w status:in-progress \\e\n owner:sam labels:[security,enterprise] \\e\n link:https://github.com/acme/auth/issues/123 \\e\n style:flagged\n.Ed\n.Ss Comments\n.Bd -literal -offset indent\n// This is a single-line comment\n\n/* This is a\n multi-line comment */\n.Ed\n.Sh VALIDATION\nThe parser produces clear error messages with file position and\nsuggestions (fuzzy-match\n.Qq did you mean X?\nhints).\nRules group as follows; full prose lives in\n.Pa specs/dsl.md .\n.Ss Structural\n.Bl -bullet -offset indent -compact\n.It\nExactly one\n.Sy roadmap\ndeclaration per file (subject to\n.Sy include\n.Sy roadmap:\nmode).\n.It\nAll identifiers are unique across the merged result.\nParent wins on collision, with a warning.\n.It\nEvery entity must have at least an identifier or a title (or\nboth).\n.It\nFile structure must follow the section order:\n.Sy nowline\ndirective (optional, first non-comment line),\n.Sy include ,\n.Sy config ,\n.Sy roadmap .\n.It\nThe\n.Sy nowline\ndirective version must match\n.Sy v\\&\\ed+ .\nA version newer than the parser supports is an error identifying\nthe required version.\n.It\nAt least one swimlane is required in the merged result.\n.It\nIndentation must be consistent within a file: spaces\n.Em or\ntabs, not both.\nMixed indentation is a parse error identifying the first offending\nline.\n.It\n.Sy label ,\n.Sy size ,\nand\n.Sy status\ndeclarations must appear in the roadmap section.\nPlacing them before\n.Sy roadmap\nis an error.\n.El\n.Ss References\n.Bl -bullet -offset indent -compact\n.It\nAll elements of\n.Sy after: ,\n.Sy before: ,\nand\n.Sy on:\nmust resolve to declared identifiers within the merged scope.\n.It\nA\n.Sy size:\nor\n.Sy status:\nreference must resolve to a declaration that appears\n.Em earlier in the file\n(or in an earlier include).\nForward references are an error.\n.It\nNo circular dependencies in\n.Sy after / before\nchains.\n.El\n.Ss Values\n.Bl -bullet -offset indent -compact\n.It\n.Sy anchor date:\nand dated\n.Sy milestone date:\nvalues are valid ISO 8601 dates\n.Pq Pa YYYY-MM-DD , calendar-valid .\n.It\n.Sy duration:\nand\n.Sy scale:\nvalues match the raw duration pattern\n.Sy \\&\\ed+(\\e.\\ed+)?[dwmqy] .\n.It\nA\n.Sy size\ndeclaration's id must not match the raw duration pattern and must\nnot be a bare\n.Sy d , w , m , q , y .\n.It\nEvery\n.Sy size\ndeclaration must specify\n.Sy effort: ;\nthe value must be a positive raw duration literal.\n.It\n.Sy capacity:\non a\n.Sy swimlane\nmust be a positive integer or decimal (no percent form).\n.Sy capacity:\non an\n.Sy item\nmust be a positive integer, decimal, or percent literal.\n.Sy capacity:\nis not valid on\n.Sy parallel\nor\n.Sy group .\n.It\n.Sy utilization-warn-at:\nand\n.Sy utilization-over-at:\nmust each be a positive percent literal, a positive decimal\nfraction, or\n.Sy none .\nWhen both numeric thresholds are set,\n.Sy warn-at \\(<= over-at .\n.It\n.Sy capacity-icon:\nvalue must be a built-in identifier\n.Po\n.Sy none , Sy multiplier , Sy person , Sy people , Sy points , Sy time\n.Pc ,\nan identifier matching a\n.Sy symbol\ndeclaration in scope, or a double-quoted Unicode literal.\nSame contract for\n.Sy icon: .\n.It\n.Sy remaining:\nis either a percentage\n.Pq Sy 0% \\(en Sy 100%\nor a single-eng effort literal.\nWhen the literal exceeds total effort (computed percent\n.Sy > 100% ) ,\nthe layout step emits a soft warning and clamps the painted bar\nto 100% remaining; rendering is never blocked.\n.El\n.Ss Calendar\n.Bl -bullet -offset indent -compact\n.It\n.Sy calendar:\non\n.Sy roadmap\nmust be one of\n.Sy business , full , custom .\n.It\nA\n.Sy calendar\nconfig block is only valid when the roadmap declares\n.Sy calendar:custom .\n.It\nWhen\n.Sy calendar:custom ,\nall four\n.Sy days-per-*\nentries are required and must be positive integers.\n.El\n.Ss Roadmap start property\n.Bl -bullet -offset indent -compact\n.It\n.Sy roadmap start:\nmust be a valid ISO 8601 date.\n.It\nIf a file contains any\n.Sy anchor\nor any dated\n.Sy milestone ,\n.Sy start:\nis required.\n.It\nEvery anchor date and every dated milestone date must be on or\nafter\n.Sy start: .\n.El\n.Ss Persons and teams\n.Bl -bullet -offset indent -compact\n.It\nA\n.Sy person\nmay be declared at most once in the merged file scope.\nA declaration is identified by the presence of a title or any\nkeyed property on the line.\n.It\nA bare\n.Sy person <id>\ninside a\n.Sy team\ndenotes membership and is valid with or without a separate\ndeclaration.\n.It\nA bare\n.Sy person <id>\nat roadmap top level with no matching declaration anywhere is a\nno-op (parser may emit a warning).\n.El\n.Ss Includes\n.Bl -bullet -offset indent -compact\n.It\n.Sy include\npaths must resolve to an existing\n.Pa .nowline\nfile relative to the including file's directory.\n.It\nNo circular includes.\n.It\n.Sy include\ndeclarations appear before\n.Sy config\nand\n.Sy roadmap\n(after the\n.Sy nowline\ndirective if present).\n.It\nDuplicate\n.Sy include\nof the same file in a single file is an error.\n.It\n.Sy config:\nmust be\n.Sy merge , ignore , or isolate .\n.Sy roadmap:\nmust be\n.Sy merge , ignore , or isolate .\n.It\nOn\n.Sy config:isolate ,\n.Sy style:\nreferences within the isolated file must resolve within that\nfile's own config.\n.It\nOn\n.Sy roadmap:isolate ,\nthe included file must contain a\n.Sy roadmap\ndeclaration.\n.It\nFor any\n.Sy include\nwhose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\nparent and child must agree on\n.Sy start: \\(em\nboth absent or both present with identical values.\nA mismatch is an error reported on the parent's\n.Sy include\nline.\n.El\n.Ss Parallel and group\n.Bl -bullet -offset indent -compact\n.It\n.Sy parallel\nmust contain at least 2 children.\nA single-child parallel emits a warning.\n.It\n.Sy group\nmust contain at least 1 child.\n.It\n.Sy size , duration , remaining , capacity\nare not valid on\n.Sy parallel\nor\n.Sy group\n(computed from children).\n.It\n.Sy parallel\nis valid inside swimlane or group.\n.Pp\n.Sy group\nis valid inside swimlane, parallel, or group.\n.El\n.Ss Defaults\n.Bl -bullet -offset indent -compact\n.It\nThe first positional argument after\n.Sy default\nmust be one of:\n.Sy item , label , swimlane , roadmap , parallel , group ,\n.Sy milestone , footnote , anchor .\n.It\nDuplicate\n.Sy default <entity>\ndeclarations for the same entity type within a single file are\nan error.\n.It\nA\n.Sy default <entity>\nthat sets a banned property\n.Pq see Sx CONFIG SECTION\nis an error.\n.El\n.Ss Symbols\n.Bl -bullet -offset indent -compact\n.It\nEvery\n.Sy symbol\ndeclaration must specify a non-empty\n.Sy unicode:\"<string>\" .\n.It\n.Sy ascii: ,\nif present, must be a quoted string of length \\(<= 3 ASCII\ncharacters.\n.It\nA\n.Sy symbol\nid must not shadow a built-in icon name.\n.It\nA\n.Sy symbol\nreference\n.Pq Sy icon:NAME or Sy capacity-icon:NAME\nmust resolve to a built-in or an earlier\n.Sy symbol\ndeclaration.\nForward references are an error.\n.El\n.Sh EXAMPLES\nA complete\n.Pa .nowline\nfile exercising the major language features:\n.Bd -literal -offset indent\nnowline v1\n\ninclude \"shared/teams.nowline\"\n\nconfig\n\nstyle enterprise \"Enterprise readiness\"\n bg: blue\n fg: navy\n text: white\n border: solid\n icon: shield\n\nstyle risky\n border: dashed\n fg: orange\n\ndefault item status:planned shadow:subtle\ndefault label style:subtle corner-radius:full\ndefault swimlane padding:sm spacing:none\n\nroadmap platform-2026 \"Platform 2026\" \\e\n author:\"Acme Engineering\" \\e\n logo:\"./brand/acme.svg\" \\e\n start:2026-01-06 scale:2w calendar:business\n\nperson sam \"Sam Chen\" link:https://github.com/samchen\nperson jen \"Jennifer Wu\"\n\nteam engineering \"Engineering\"\n team platform \"Platform Team\"\n person sam\n person jen\n team mobile \"Mobile Team\"\n\nanchor kickoff date:2026-01-06\nanchor code-freeze \"Code Freeze\" date:2026-05-01\nanchor ga-date \"GA Date\" date:2026-06-01\n\nsize xs \"Extra Small\" effort:1d\nsize s \"Small\" effort:3d\nsize m \"Medium\" effort:1w\nsize l \"Large\" effort:2w\nsize xl \"Extra Large\" effort:1m\n\nstatus awaiting-review \"Awaiting Review\"\n\nlabel enterprise \"Enterprise readiness\" style:enterprise\nlabel security \"Security hardening\" style:enterprise\nlabel low-confidence style:risky\n\nswimlane platform owner:platform capacity:5\n item auth-refactor \"Auth refactor\" size:l after:kickoff \\e\n status:done owner:sam labels:enterprise capacity:3 \\e\n link:https://github.com/acme/auth/issues/123\n parallel after:auth-refactor\n group audit-track \"Audit Track\" labels:security\n item audit-log \"Audit log v2\" size:xl before:code-freeze \\e\n remaining:30% labels:[enterprise, security] capacity:2\n description \"Comprehensive audit trail for admin actions\"\n item audit-ui \"Audit UI\" size:m capacity:1\n item sso \"SSO plugins\" size:m \\e\n labels:[enterprise, low-confidence] capacity:50%\n item platform-qa \"Platform QA\" size:s capacity:2\n\nswimlane mobile owner:mobile capacity:2\n item offline \"Offline mode\" size:l after:kickoff owner:jen \\e\n status:at-risk remaining:60% capacity:3\n item push-v2 \"Push notifications v2\" size:m owner:mobile capacity:1\n\nmilestone beta \"Beta\" after:auth-refactor\nmilestone v1-ga \"v1 GA\" after:[auth-refactor, audit-log]\nmilestone ga-launch \"GA launch\" date:2026-06-01 \\e\n after:[auth-refactor, audit-log]\n\nfootnote \"Vendor dependency\" on:audit-log\n description \"Blocked until vendor contract is signed.\"\nfootnote capacity-risk \"Team capacity risk\" on:[mobile, platform]\n description \"Mobile team is down to 2 engineers through Q2.\"\n.Ed\n.Sh SEE ALSO\n.Xr nowline 1\n.Pq Sy man 1 nowline\n.Pp\nThe\n.Sy specs/\ndirectory in the source repository documents the DSL grammar in\nprose\n.Pq Pa specs/dsl.md ,\nthe layout / rendering pipeline\n.Pq Pa specs/rendering.md ,\nthe localization model\n.Pq Pa specs/localization.md ,\nand OSS milestones\n.Pq Pa specs/milestones.md .\n.Sh AUTHORS\n.An The Nowline Authors Aq Mt maintainers@nowline.io\n";
|
|
8
|
+
export const REFERENCE_MAN_PAGE = ".Dd $Mdocdate$\n.Dt NOWLINE 5\n.Os\n.Sh NAME\n.Nm nowline\n.Nd Nowline DSL roadmap file format\n.Sh DESCRIPTION\nA\n.Pa .nowline\nfile is an indentation-significant outline that defines a roadmap, not\na Gantt chart.\nThe file itself is the product; every other artifact (SVG, PNG, PDF,\nHTML, Markdown+Mermaid, XLSX, MS Project XML) is a view of it produced\nby\n.Xr nowline 1 .\n.Pp\nThis page documents the file format.\nFor the rendering pipeline and visual contracts, see\n.Pa specs/rendering.md\nin the source repository.\nFor the CLI surface, see\n.Xr nowline 1 .\n.Pp\nThe canonical, prose source for everything below is\n.Pa specs/dsl.md\nin the source repository; this page is a hand-authored reference\ndistilled from it.\n.Sh FILE STRUCTURE\nA\n.Pa .nowline\nfile has up to four sections in strict order:\n.Bl -enum -offset indent\n.It\n.Sy nowline\ndirective (optional, recommended). Must be the first non-comment,\nnon-blank line if present.\n.It\n.Sy include\ndeclarations (optional). Pull in other\n.Pa .nowline\nfiles.\n.It\n.Sy config\nsection (optional). Rendering configuration: styles, defaults,\nscale, calendar, symbols, non-working and working days.\n.It\n.Sy roadmap\nsection (required). Content: persons, teams, anchors, labels, sizes,\nstatuses, waves, swimlanes, items, milestones, footnotes.\n.El\n.Pp\n.Sy config\nand\n.Sy roadmap\nare section markers, not indent-containers.\nKeywords inside each section appear at the top level (not indented\nunder the marker).\nIndentation is used where nesting is real: style properties under a\n.Sy style\nblock, items under a\n.Sy swimlane ,\nteam members under a\n.Sy team .\n.Pp\nIndentation is significant.\nTwo-space indent is canonical; one tab is also accepted.\nSpaces and tabs must not be mixed inside a single file \\(em the\nparser rejects mixed indentation with an error identifying the first\noffending line.\n.Pp\nStrings are double-quoted\n.Pq Qq Auth refactor ,\nnot bare or single-quoted.\nProperties are\n.Sy key:value\npairs on the same line as the entity; values containing spaces must\nbe double-quoted.\nProperty keys never use\n.Sq = .\n.Pp\nBuilt-in keywords and property names are kebab-case\n.Pq Sy capacity-icon , Sy days-per-week , Sy in-progress .\nAuthor-chosen identifiers may use any combination of letters,\ndigits, underscores, and dashes\n.Pq Sy auth-refactor , Sy authRefactor , Sy auth_refactor ;\nthey must start with a letter or underscore.\n.Pp\nComments use\n.Sq //\nfor single-line and\n.Sq /* */\nfor multi-line.\nA trailing\n.Sq \\e\ncontinues a line; indentation on the continuation line is cosmetic.\nUse\n.Sq \\e\\e\nfor a literal backslash.\n.Sh DIRECTIVE\nThe\n.Sy nowline\ndirective declares which DSL major version a file targets:\n.Bd -literal -offset indent\nnowline v1\n.Ed\n.Pp\nThe version is integer-only\n.Pq Sy v1 , Sy v2 , Sy v3 , ...\nand is independent of the npm package version.\nWithin a DSL major, the parser must accept every valid file written\nfor that major; new syntax may be added between package minor/patch\nreleases, but no breaking change to an existing valid\n.Sy nowline v1\nfile ships without bumping the directive to\n.Sy v2 .\nWhen the parser encounters a version newer than it supports, it\nemits an error identifying the required version.\nWhen the directive is omitted, the parser assumes the latest\nversion it supports.\n.Pp\nThe directive line accepts optional file-level properties after the\nversion.\nThe only directive property today is\n.Sy locale: ,\na BCP-47 tag controlling localized rendering and validator\nmessages:\n.Bd -literal -offset indent\nnowline v1 locale:fr-CA\n.Ed\n.Pp\nUnknown directive keys are an error so typos surface immediately.\nSee\n.Pa specs/localization.md\nfor the locale model and precedence chain.\n.Pp\nThe\n.Sy nowline\ndirective is the only construct that does not follow the universal\ndeclaration pattern\n.Pq see Sx GRAMMAR :\nno identifier, no title, just the keyword and version.\n.Sh INCLUDES\n.Sy include\npulls another\n.Pa .nowline\nfile into the current file:\n.Bd -literal -offset indent\ninclude \"shared/teams.nowline\"\ninclude \"brand-styles.nowline\" roadmap:ignore\ninclude \"partner.nowline\" config:isolate roadmap:isolate\n.Ed\n.Pp\nTwo optional properties \\(em\n.Sy config:\nand\n.Sy roadmap:\n\\(em control how the included file's content is handled.\nThey operate on two independent categories:\n.Bl -tag -width \"Roadmap (content)\"\n.It Sy Config\nThe included file's\n.Sy scale ,\n.Sy style ,\n.Sy symbol ,\n.Sy default ,\n.Sy calendar ,\n.Sy non-working ,\nand\n.Sy working\ndeclarations.\n.It Sy Roadmap\nThe included file's\n.Sy roadmap\ndeclaration plus all its content (persons, teams, anchors, labels,\nsizes, statuses, waves, swimlanes, items, milestones, footnotes).\n.El\n.Pp\n.Sy config:\nmodes:\n.Bl -tag -width \"isolate\"\n.It Sy merge Pq default\nChild config items are merged into the parent.\nOn collision, the\n.Em parent wins\nand the parser emits a warning identifying the shadowed definition\nand source file.\nA\n.Sy non-working\nor\n.Sy working\ndeclaration collides only with a parent declaration of the same keyword\nand name; an unnamed one never collides and always merges.\n.It Sy ignore\nChild config is dropped entirely.\nIf child roadmap content is merged, it resolves styles from the\nparent's post-merge config.\n.It Sy isolate\nChild config is only available within the child file; parent config\nis only available in the parent.\nNeither side bleeds into the other.\n.El\n.Pp\n.Sy roadmap:\nmodes:\n.Bl -tag -width \"isolate\"\n.It Sy merge Pq default\nChild content entities are merged into the parent.\nOn collision,\n.Em parent wins\nand a warning is emitted.\nA swimlane collision drops the swimlane's contained items as well.\nMerged content resolves styles from the post-merge config.\n.It Sy ignore\nChild content is dropped.\nUse for shared style libraries\n.Pq Sy include \"brand.nowline\" roadmap:ignore .\nShared label, status, and size vocabulary uses\n.Sy roadmap:merge ,\nnot\n.Sy roadmap:ignore .\n.It Sy isolate\nChild content stays scoped to the child file and uses only the\nchild's config.\nThe child must contain a\n.Sy roadmap\ndeclaration (needed for the region label).\nThe isolated content renders as a visually distinct region with its\nown border.\n.El\n.Pp\nIncludes are processed depth-first, in file order.\nWhen the processor encounters an\n.Sy include ,\nit processes that child (and its includes recursively) before\ncontinuing with the next declaration.\nConfig is merged before roadmap content at each level.\n.Pp\nDiamond includes (A includes B and C, both include D) are valid;\nD is processed once on first encounter.\nDuplicate includes of the same file in a single file are an error.\nCircular includes are an error.\n.Pp\nIncludes are resolved relative to the including file's directory.\nPaths use forward slashes on all platforms.\nIncludes must appear before\n.Sy config\nand\n.Sy roadmap\n\\(em they are the first declarations in a file (after the optional\n.Sy nowline\ndirective).\n.Pp\nFor any include whose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\nif the child file declares a\n.Sy roadmap ,\nthe parent and child must agree on\n.Sy start: \\(em\nboth absent, or both present with identical values.\nA mismatch is an error reported on the parent's\n.Sy include\nline; this is an explicit exception to the\n.Qq parent wins\nmerge behaviour because\n.Sy start:\ndefines the shared timeline baseline.\n.Pp\nWaves never merge.\nFor any include whose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\nif the child declares a\n.Sy roadmap ,\nhas swimlanes, or declares waves, the parent and child must declare\nthe same waves: the same ids, in the same order, with the same\nresolved start floors.\nFloors are compared by the date they resolve to, so\n.Sy after:fy-budget\nand\n.Sy after:2026-02-02\nagree when the anchor is on that date.\nA mismatch in either direction is the error\n.Sy NL.E0202 ,\nreported on the parent's\n.Sy include\nline; two files with no waves pass.\nWaves are barriers across the whole canvas, so a silently shadowed\nwave list would move every lane's columns.\nWhen ids, order and floors agree, a differing title,\n.Sy style: ,\n.Sy labels: ,\n.Sy link: ,\nor description is the warning\n.Sy NL.W0701\nand the parent's definition is used.\nA vocabulary-only child (persons, teams, labels, sizes, statuses,\nanchors; no roadmap, no swimlanes, no waves) does not take part.\n.Sh CONFIG SECTION\nThe optional\n.Sy config\nsection marker appears before\n.Sy roadmap .\nConfig keywords sit at the top level (not indented under the\nmarker) and define rendering vocabulary, defaults, axis settings,\nday arithmetic, non-working days, and custom symbols.\n.Pp\nSeven config keywords:\n.Sy scale ,\n.Sy style ,\n.Sy symbol ,\n.Sy default ,\n.Sy calendar ,\n.Sy non-working ,\n.Sy working .\nEvery config entry is optional; if\n.Sy config\nis omitted, all built-in defaults apply.\n.Ss style \\(em named visual definition\nA\n.Sy style\ndeclares a named visual treatment.\nProperties are indented beneath:\n.Bd -literal -offset indent\nstyle enterprise \"Enterprise readiness\"\n bg: blue\n fg: navy\n text: white\n border: solid\n icon: shield\n\nstyle risky\n border: dashed\n fg: orange\n.Ed\n.Pp\nStyles follow the universal\n.Sy [id] [\"title\"]\npattern.\nProperties are listed under\n.Sx STYLE PROPERTIES\nbelow.\n.Ss symbol \\(em custom named symbol\nA\n.Sy symbol\ndeclares a custom symbol for use by\n.Sy icon:\nand\n.Sy capacity-icon:\nstyle properties.\nAuthors use the inline Unicode-literal form\n.Pq Sy capacity-icon:\"\\(rs\"\nfor one-off symbols; named\n.Sy symbol\ndeclarations are for reusable ones.\n.Bd -literal -offset indent\nsymbol budget \"Budget\" unicode:\"\\(em\" ascii:\"$\"\nsymbol fte unicode:\"\\eu{1F464}\" ascii:\"@\"\nsymbol star unicode:\"\\(em\"\n.Ed\n.Pp\nRequired:\n.Sy unicode:\"<string>\"\n\\(em the Unicode character (literal or\n.Sy \\eu{...}\nescape, may be a multi-codepoint grapheme cluster).\n.Pp\nOptional:\n.Sy ascii:\"<string>\"\n\\(em short ASCII fallback for terminals lacking the glyph,\n\\(<= 3 ASCII characters; defaults to\n.Sq \\&?\nwhen omitted.\n.Pp\nA\n.Sy symbol\nid must not shadow a built-in icon name\n.Pq Sy none , Sy multiplier , Sy person , Sy people , Sy points , Sy time , Sy shield , Sy warning , Sy lock .\n.Ss default \\(em default property values per entity type\n.Sy default <entity> <properties>\nsets default property values for a given entity type.\nOne declaration per entity type per file:\n.Bd -literal -offset indent\ndefault item status:planned shadow:subtle\ndefault label style:subtle corner-radius:full\ndefault swimlane padding:sm spacing:none\ndefault roadmap padding:md header-height:md font:sans\ndefault milestone weight:bold\ndefault footnote style:subtle shadow:subtle\ndefault anchor style:subtle\ndefault parallel bracket:none\ndefault group padding:xs spacing:xs\n.Ed\n.Pp\nSupported entity types:\n.Sy item , label , swimlane , roadmap , parallel , group , milestone , footnote , anchor .\nWhen an entity omits a property, the matching default applies;\nexplicit values on the entity always override defaults.\n.Pp\nIdentity-defining, sizing, sequencing, reference, and prose\nproperties cannot be defaulted because they must be explicit per\nentity.\nBanned, by entity type:\n.Bl -tag -width \"default footnote\"\n.It Sy default item\n.Sy size , duration , after , before , remaining , link , description , owner .\n.It Sy default milestone\n.Sy date , after , link , description .\n.It Sy default anchor\n.Sy date , link , description .\n.It Sy default footnote\n.Sy on , link , description .\n.It Sy every default line\n.Sy wave\n\\(em sequencing creates invisible dependencies, and there is no\n.Sy default wave .\nIn a roadmap with waves it is an error; in a roadmap without waves\nit is ignored with the warning\n.Sy NL.W0702 .\n.El\n.Pp\nRaw style properties\n.Pq Sy bg , Sy fg , Sy text , Sy border , Sy shadow , ...\nare allowed on\n.Sy default\nbecause\n.Sy default\nlives in\n.Sy config ,\nthe presentation section.\nThe ban on raw style properties applies to roadmap-section\nentities, not to\n.Sy default\nlines.\n.Pp\n.Sy capacity\nis allowed on\n.Sy default item\nbut\n.Em not\non\n.Sy default swimlane\n\\(em each lane's budget is intentionally explicit at its declaration\nsite.\n.Sy utilization-warn-at: ,\n.Sy utilization-over-at: ,\nand\n.Sy capacity-icon:\nare allowed on both\n.Sy default swimlane\nand\n.Sy default item\nper the usual presentation-property rule.\n.Ss scale \\(em axis display\n.Sy scale\nconfigures the timeline axis.\nColumn width is set by\n.Sy scale:<duration>\non the\n.Sy roadmap\ndeclaration; this block configures display:\n.Bd -literal -offset indent\nscale\n name: sprints\n label-every: 2\n label: \"Sprint {n}\"\n.Ed\n.Bl -tag -width \"label-every\"\n.It Sy name\nDisplay label for the scale unit (e.g.\n.Qq sprint ) .\nDefaults to an auto-generated name based on the roadmap's\n.Sy scale:\nduration.\n.It Sy label-every\nShow an axis label every Nth column.\nDefaults to the renderer's choice.\n.It Sy label\nAxis label format.\n.Sq {n}\nis the column index.\n.El\n.Pp\nThe\n.Sy scale\nconfig block is optional.\nA file can declare\n.Sy scale:2w\non its\n.Sy roadmap\nwith no\n.Sy scale\nblock and the renderer picks all display defaults.\n.Ss calendar \\(em day arithmetic\nThe\n.Sy calendar:\nproperty on\n.Sy roadmap\nselects day-arithmetic mode:\n.Bl -tag -width \"calendar:business\"\n.It Sy calendar:business Pq default\nEngineering working-day arithmetic.\n.Sy days-per-week:5 ,\n.Sy days-per-month:22 ,\n.Sy days-per-quarter:65 ,\n.Sy days-per-year:260 .\n.It Sy calendar:full\nCalendar-day arithmetic with weekends.\n.Sy days-per-week:7 ,\n.Sy days-per-month:30 ,\n.Sy days-per-quarter:91 ,\n.Sy days-per-year:365 .\n.It Sy calendar:custom\nAuthor-supplied values via the\n.Sy calendar\nconfig block.\n.El\n.Pp\nA\n.Sy calendar\nconfig block is only meaningful when\n.Sy roadmap\ndeclares\n.Sy calendar:custom .\nWhen custom, all four\n.Sy days-per-*\nfields are required:\n.Bd -literal -offset indent\nconfig\n\ncalendar\n days-per-week: 6\n days-per-month: 26\n days-per-quarter: 78\n days-per-year: 312\n\nroadmap rotating-shift \"Rotating Shift\" calendar:custom\n.Ed\n.Pp\nAll four entries must be positive integers.\nThere is no partial form.\n.Pp\nEach\n.Sy days-per-*\nfield is independently defined: a duration like\n.Sy 1y\nresolves to\n.Sy days-per-year\ndirectly, not by multiplying through months or weeks.\nThis is why business mode's\n.Sy 1y\nis\n.Sy 260d ,\nnot\n.Sy 12 \\(mu 22d = 264d .\n.Ss non-working and working \\(em declarations\nA\n.Sy non-working\ndeclaration takes days out of the schedule: weekends, holidays,\nclosures.\nA\n.Sy working\ndeclaration puts days back, for a crunch Saturday or a make-up day.\nBoth are config keywords and share one shape:\n.Bd -literal -offset indent\nconfig\n\nnon-working weekend \"Weekend\" every:[fri, sat]\nnon-working new-year \"New Year's Day\" date:2027-01-01\nnon-working summit \"Company summit\" start:2026-09-14 end:2026-09-16\nnon-working fridays every:fri start:2026-07-01 end:2026-08-31\nworking crunch \"Crunch Saturday\" date:2026-01-10\n.Ed\n.Pp\nThe id and the title are both optional.\nDurations count working days only, so an item that spans a non-working\nday ends later, and an item that spans a working exception ends\nsooner.\nThe chart labels a dated declaration that has a title\n.Po\n.Sy date:\nor\n.Sy start:\nwith\n.Sy end:\nand no\n.Sy every:\n.Pc\nwith its title and the number of working days it removes, for example\n.Dq Thanksgiving \\[u00B7] 2d .\nUnder\n.Sy hide\nthe label sits on a cut line at the seam, and under\n.Sy show\nat the left edge of the shaded band.\nA dated\n.Sy working\ndeclaration with a title is labelled at the days it turns from\nnon-working to working, with its title and the number of days it adds,\nfor example\n.Dq Crunch Saturday \\[u00B7] +1d ,\nand with no cut line in either view; a weekday make-up day inside a\ndated closure counts.\nA title on a recurrence is not drawn.\nA declaration takes these properties:\n.Bl -tag -width \"every:\"\n.It Sy date:\nOne ISO date or a list of dates.\n.It Sy start:\nOne ISO date, inclusive: the first day of a range, or the day a\nrecurrence begins.\n.It Sy end:\nOne ISO date, inclusive: the last day of a range, or the day a\nrecurrence stops.\nIt must not be before\n.Sy start: .\n.It Sy every:\nOne weekday or a list of\n.Sy sun , mon , tue , wed , thu , fri , sat .\nA weekly recurrence.\n.El\n.Pp\nA declaration is exactly one of three shapes:\n.Sy date:\nalone; a range of\n.Sy start:\nand\n.Sy end:\nwithout\n.Sy every: ;\nor\n.Sy every:\nwith optional\n.Sy start:\nand\n.Sy end:\nbounds.\nWith neither bound a recurrence is open-ended and holds in every week.\n.Pp\nOn a given day the most specific declaration decides, and\n.Sy working\nwins a tie:\n.Bl -enum -offset indent -compact\n.It\na dated declaration, a\n.Sy date:\nlist or a range;\n.It\na bounded recurrence;\n.It\nthe open-ended week.\n.El\n.Pp\nOrder never matters: the same declarations in any order, in the file\nor in includes, give the same schedule.\n.Sy calendar:business\nsupplies a\n.Sy non-working weekend\ndeclaration for Saturday and Sunday.\nA\n.Sy non-working\ndeclaration named\n.Sy weekend\nreplaces it, for any preset, so a Friday and Saturday week needs no\ncustom calendar; any other name adds to the preset.\n.Pp\nThe open-ended week must keep a working day, and\n.Sy days-per-week\nshould agree with the weekdays it leaves working\n.Pq see Sx VALIDATION .\nA declaration whose value or shape is malformed is skipped when the\ncalendar is built.\nUnder\n.Sy config:isolate\nthe child's declarations stay in its region and have no effect on the\nchart yet: the region is laid out on the host's calendar.\nThe validator reads only its own file, so a declaration in an include\nis not counted by the open-ended week checks.\n.Ss non-working: \\(em day display\nUnder\n.Sy calendar:business\nthe weekend is non-working: durations count working days only, and the\nchart either hides those days or draws them.\nThe display is a roadmap-only style key, set on the\n.Sy default roadmap\nline (raw style keys are not allowed on the\n.Sy roadmap\nline itself):\n.Bd -literal -offset indent\nconfig\n\ndefault roadmap non-working:show\n.Ed\n.Bl -tag -width \"show\"\n.It Sy hide Pq default\nNon-working days take no width; each run collapses to a seam.\n.It Sy show\nNon-working days are drawn at full width and shaded.\nA bar paints across a weekend but ends at the end of its last working day,\nso the gap between chained bars shows.\n.El\n.Pp\nThe display never changes the schedule, so Mermaid, MS Project, and XLSX\noutput is the same in both views.\nIt can also be chosen at render time; the first of these wins: the\n.Fl -non-working\noption (or the equivalent option on another surface), the file's\n.Sy default roadmap non-working:\nkey, then\n.Sy hide .\nUnder\n.Sy calendar:full\nand\n.Sy calendar:custom\nthere are no non-working days and the key has no effect.\n.Sh ROADMAP SECTION\nThe\n.Sy roadmap\nsection marker is required and appears exactly once per file.\nRoadmap keywords sit at the top level (not indented under the\nmarker) and form the content of the file.\n.Pp\nThe\n.Sy roadmap\ndeclaration line itself accepts:\n.Bd -literal -offset indent\nroadmap platform-2026 \"Platform 2026\" \\e\n author:\"Acme\" \\e\n start:2026-01-06 \\e\n scale:2w \\e\n calendar:business \\e\n logo:\"./brand/acme.svg\" \\e\n logo-size:md\n.Ed\n.Bl -tag -width \"calendar:\"\n.It Sy author:\nFree-form string.\n.It Sy start:\nISO date\n.Pq Pa YYYY-MM-DD ,\nthe timeline baseline.\nRequired if any\n.Sy anchor\nor any dated\n.Sy milestone\nexists.\nEvery anchor date and dated milestone date must be on or after\n.Sy start: .\n.It Sy scale:\nRaw duration literal for column width\n.Pq Sy 2w , Sy 1q ;\ndefaults to\n.Sy 1w .\n.It Sy calendar:\n.Sy business | full | custom .\nDefaults to\n.Sy business .\n.It Sy logo:\nPath to a logo file\n.Pq Sy .svg , Sy .png , Sy .jpg / Sy .jpeg , Sy .webp ,\nresolved relative to the\n.Pa .nowline\nfile's directory.\nForward slashes on all platforms; only local paths are accepted.\nThe logo draws left of the title inside the header card, vertically\ncentered, and is embedded in the output (SVG inline, raster as a\nbase64 data URI).\nAsset resolution happens at render time, not parse time \\(em a file\nreferencing a missing logo is still a valid document.\nA missing, unsupported or unreadable logo is a warning and the chart\nrenders as if no logo were declared; under\n.Fl -strict\nit is an error.\n.It Sy logo-size:\nSize preset\n.Pq Sy xs | sm | md | lg | xl ,\ndefault\n.Sy md .\nSets the drawn logo height (18, 24, 36, 48 or 72 px); the width follows\nthe logo's own aspect ratio, so a larger or smaller source is scaled to\nfill the same slot.\nA logo wider than 160 px at that height scales down to fit.\nA logo taller than the title and author grows the header card;\n.Sy xl\nalso grows the 72 px band of\n.Sy header-position:above .\n.El\n.Pp\nThirteen roadmap-section keywords:\n.Sy swimlane , item , parallel , group ,\n.Sy person , team , anchor , label , size , status , wave , milestone ,\n.Sy footnote .\nEach follows the universal\n.Sy [id] [\"title\"] [key:value...]\npattern.\n.Ss swimlane \\(em group items by team / area / stream\n.Bd -literal -offset indent\nswimlane platform owner:platform capacity:5\n item auth-refactor \"Auth refactor\" size:l after:kickoff\n item platform-qa \"Platform QA\" size:s capacity:2\n.Ed\n.Pp\nItems, parallels, and groups are indented beneath.\nProperties:\n.Bl -tag -width \"utilization-over-at\"\n.It Sy owner:\nPerson or team id.\n.It Sy capacity:\nPer-timestep budget.\nInteger or decimal only; no percent form.\n.It Sy utilization-warn-at: , Sy utilization-over-at:\nThresholds for the lane utilization underline.\nEach accepts a percent literal\n.Pq Sy 80% ,\na positive decimal interpreted as a fraction\n.Pq Sy 0.8 ,\nor the bareword\n.Sy none\nto opt out of that color band.\nDefaults\n.Sy 80%\nand\n.Sy 100% .\nWhen both numeric thresholds are set,\n.Sy warn-at \\(<= over-at .\n.El\n.Ss item \\(em work item\nItems live inside swimlanes (or\n.Sy parallel /\n.Sy group\nblocks) and must declare at least one of\n.Sy size:\nor\n.Sy duration: .\nSee\n.Sx ITEM PROPERTIES\nbelow.\n.Bd -literal -offset indent\nswimlane platform\n item auth-refactor \"Auth refactor\" size:l status:done\n item \"Quick cleanup\" size:s\n item sso size:m\n.Ed\n.Ss parallel \\(em parallel execution block\n.Sy parallel\nruns its children in parallel.\nChildren can be bare items or groups.\n.Bd -literal -offset indent\nswimlane platform\n item auth \"Auth refactor\" size:l\n parallel\n item api-v2 \"API v2\" size:m\n item sdk-update \"SDK update\" size:s\n item integration \"Integration\" size:s\n.Ed\n.Pp\n.Sy api-v2\nand\n.Sy sdk-update\nstart at the same time (after\n.Sy auth\nfinishes).\nWhen the\n.Sy parallel\nblock ends, the next sibling\n.Pq Sy integration\nwaits for all parallel children to complete (implicit join on\ndedent).\nA\n.Sy parallel\nblock must contain at least 2 children; a single-child parallel\nemits a warning.\n.Ss group \\(em sequential item bundle\n.Sy group\nbundles items into a named sequential track.\nInside a swimlane (outside a parallel block), the group is\nsequential with respect to its siblings.\n.Bd -literal -offset indent\nswimlane platform\n group api-work \"API Work\" labels:enterprise\n item api-v2 \"API v2\" size:m\n item api-docs \"API docs\" size:s\n item deploy \"Deploy\" size:s\n.Ed\n.Pp\nA\n.Sy group\nis drawn above and around its items, never beside them: a header\n(its title over a bracket spanning exactly its dates) over a body\nshaded with its\n.Sy bg ,\npadded above and below.\n.Sy style:\nchanges only the colours.\nA\n.Sy parallel\nis drawn the same way, its tracks stacked in its body.\nIn a roadmap with waves, a\n.Sy group\nwith no title, no\n.Sy style: ,\nand no\n.Sy labels:\nthat carries\n.Sy wave:\ndraws nothing; it only assigns membership.\n.Ss anchor \\(em named date on the timeline\n.Bd -literal -offset indent\nanchor kickoff date:2026-01-06\nanchor code-freeze \"Code Freeze\" date:2026-05-01\n.Ed\n.Pp\n.Sy date:\nis required.\nAnchors are referenced by\n.Sy after:\nand\n.Sy before:\non items, parallels, groups, and milestones to pin their position.\n.Ss label \\(em semantic tag / chip vocabulary\nLabels live in the roadmap section so content and vocabulary live\ntogether; visual defaults live in\n.Sy config\nvia\n.Sy default label\nand referenced\n.Sy style\nblocks.\n.Bd -literal -offset indent\nlabel enterprise \"Enterprise readiness\" style:enterprise\nlabel security \"Security hardening\" style:enterprise-red\nlabel low-confidence style:risky-dotted\n.Ed\n.Pp\nA\n.Sy label\nline accepts\n.Sy style:id\nplus universal properties\n.Pq Sy labels: , Sy link: , description .\nRaw style properties are\n.Em not\nallowed on a\n.Sy label\nline.\nLabels used on items without a matching\n.Sy label\ndeclaration are valid; they render with chip defaults from\n.Sy default label\nor system defaults.\n.Ss size \\(em named effort budget\nA\n.Sy size\nmaps a named t-shirt size to a single-engineer effort budget.\n.Bd -literal -offset indent\nsize xs \"Extra Small\" effort:0.5d\nsize s \"Small\" effort:3d\nsize m \"Medium\" effort:1w\nsize l \"Large\" effort:2w\nsize xl \"Extra Large\" effort:1m\n.Ed\n.Pp\n.Sy effort:\nis required and must be a positive raw duration literal\n.Pq decimal-aware: Sy 0.5d , Sy 1.5w .\nThe id must not match the raw duration pattern\n.Sy \\&\\ed+(\\e.\\ed+)?[dwmqy]\nor be a bare\n.Sy d , w , m , q , y\n\\(em this avoids ambiguity at the call site.\n.Pp\nOn items, the on-bar size chip renders the size's optional\n.Sy title\nwhen provided, falling back to the id verbatim.\n.Sy size m \"M\" effort:1w\nrenders\n.Qq M ;\n.Sy size m effort:1w\nrenders\n.Qq m .\n.Pp\n.Sy size\ndeclarations must precede any item that references them.\n.Ss status \\(em custom status value\n.Bd -literal -offset indent\nstatus awaiting-review \"Awaiting Review\"\nstatus in-review \"In Review\"\nstatus deferred \"Deferred\"\n.Ed\n.Pp\nExtends the built-in set\n.Po\n.Sy planned ,\n.Sy in-progress\n.Pq alias Sy active ,\n.Sy done\n.Pq alias Sy completed ,\n.Sy at-risk ,\n.Sy blocked\n.Pc .\nThe aliases canonicalize at the layout boundary; both spellings\nare valid input.\n.Pp\nCustom statuses have no inherent semantics beyond what renderers\nassign; the DSL only guarantees the value resolves and can carry\na display title.\nRenderers may map custom statuses to visual treatments via\n.Sy default item style:...\nor entity-level\n.Sy style:\noverrides.\n.Pp\n.Sy status\ndeclarations must precede any entity that references them.\n.Ss wave \\(em barrier across every swimlane\n.Bd -literal -offset indent\nwave id [\"title\"] [after:anchor|milestone|date] \\e\n [style:...] [labels:...] [link:...]\n.Ed\n.Pp\nA\n.Sy wave\nis a strict, sequential barrier that spans every swimlane:\n.Em no item in wave k+1 starts before every item in wave k has ended .\nA wave opens for every lane at the instant the previous wave's\nslowest member ends, so lanes that finish early wait at the boundary.\nWaves are declared once, in order, in the roadmap section, and\ndeclaration order is time order.\nWork joins a wave with the\n.Sy wave:\nproperty on an\n.Sy item ,\n.Sy group ,\nor\n.Sy parallel .\n.Bd -literal -offset indent\nwave discover \"Discover\"\nwave build \"Build\"\nwave launch \"Launch\" after:fy-budget\n\nswimlane web \"Web\"\n item research \"UX research\" duration:2w wave:discover\n group wave:build\n item checkout \"Checkout v2\" duration:3w\n item a11y \"Accessibility pass\" duration:1w\n item launch-page \"Launch page\" duration:1w wave:launch\nswimlane ops \"Ops\"\n item on-call \"On-call and KTLO\" duration:10w\n\nmilestone beta \"Beta\" after:build\n.Ed\n.Pp\nA\n.Sy wave\nline accepts:\n.Bl -tag -width \"style:\"\n.It Sy id\nRequired\n.Pq Sy NL.E1100 .\nJoins the single shared identifier namespace.\n.It Sy title\nOptional.\nThe strip label; falls back to the id.\n.It Sy after:\nOptional start floor.\nThe wave cannot open before the latest of its elements.\nEach element must be an anchor id, the id of a milestone that has\n.Sy date: ,\nor an ISO date (at most one date); any other kind of entity is\n.Sy NL.E1106 .\nA gap between one wave's end and the next wave's floor is allowed.\n.It Sy style:\nWave colours: the style's\n.Sy bg\nopts the wave into a column tint,\n.Sy fg\ncolours its boundary line,\n.Sy text\nits strip label, and\n.Sy border\nsets the boundary dash.\n.It Sy labels: , link: , description\nCarried in the model, JSON and XLSX export, and LSP hover; not painted.\n.El\n.Pp\nKeys not allowed on a\n.Sy wave :\n.Sy before: , date: , start: , length: , duration: , size: ,\n.Sy capacity: , remaining: , wave:\n.Pq Sy NL.E1105 .\nA wave's span comes from its items.\nTo give a wave a deadline, add a dated milestone\n.Sy after:<wave> ;\nit turns red when the wave runs late.\n.Pp\nItems without an effective wave are\n.Em background work :\non-call, support, ongoing maintenance.\nA barrier never holds background work back and its own end never\nextends a wave, but it still follows lane order and its own\n.Sy after: .\nBackground work is drawn hatched.\n.Pp\nA wave id is a valid\n.Sy after: ,\n.Sy before: ,\nand\n.Sy on:\ntarget.\n.Sy after:<wave>\nstarts no earlier than the end of that wave, and a floating\n.Sy milestone after:<wave>\nsits on the wave's closing boundary.\n.Sy before:<wave>\nshould finish before the wave's start (soft, like every\n.Sy before: ) .\n.Sy on:<wave>\nattaches a footnote to the wave.\nWave references draw no dependency arrow.\n.Pp\nA roadmap\n.Qq has waves\nwhen it declares at least one wave with a valid id.\nIn a roadmap without waves every\n.Sy wave:\nkey is ignored with the warning\n.Sy NL.W0702 .\n.Ss milestone \\(em achievement marker\n.Bd -literal -offset indent\nmilestone v1-ga \"v1 GA\" date:2026-06-30\nmilestone beta \"Beta\" after:auth-refactor\nmilestone v1-ga \"v1 GA\" after:[core-api, audit-log]\nmilestone v1-ga \"v1 GA\" date:2026-06-30 after:[core-api, audit-log]\n.Ed\n.Pp\nAt least one of\n.Sy date:\nor\n.Sy after:\nis required.\nWith both, the\n.Sy date:\nis an intended target, not a hard cap; slippage (dependencies not\nconverging by the target date) is a rendering concern, not a\nvalidation error.\n.Ss footnote \\(em attachable annotation\n.Bd -literal -offset indent\nfootnote \"Vendor dependency\" on:audit-log\n description \"Blocked until vendor contract is signed.\"\n\nfootnote capacity-risk \"Team capacity risk\" on:[mobile, platform]\n description \"Both teams are understaffed through Q2.\"\n.Ed\n.Pp\n.Sy on:\nis required and references one or more identifiers (item,\nswimlane, anchor, milestone, wave, person, team).\nUse bracket notation for multiples:\n.Sy on:[id1, id2] .\nFootnotes are numbered sequentially by document order; a\nsuperscript number appears on every entity the footnote attaches\nto.\n.Ss person and team \\(em organisational vocabulary\n.Bd -literal -offset indent\nperson sam \"Sam Chen\" link:https://github.com/samchen\nperson jen \"Jennifer Wu\"\n\nteam engineering \"Engineering\"\n team platform \"Platform Team\"\n person sam\n person jen\n team mobile \"Mobile Team\"\n.Ed\n.Pp\nA\n.Sy person\nmay be declared at the roadmap top level or nested inside a\n.Sy team .\n.Bl -tag -width \"person <id>\"\n.It Sy person <id>\nBare reference.\nInside a\n.Sy team\nit denotes membership.\nAt the roadmap top level it is a no-op (parser may emit a\nwarning).\n.It Sy person <id> [\"title\"] [properties]\nDeclaration.\nCreates the person.\nIf nested inside a\n.Sy team ,\nthe declaration also establishes membership.\n.El\n.Pp\nPerson identifiers are global within the merged file scope\nregardless of where they are declared.\nA person may be declared at most once in the merged scope;\nduplicate declarations are an error.\n.Pp\n.Sy team\nnesting inside another\n.Sy team\nis always a declaration.\nTeams cannot be referenced with a bare\n.Sy team <id>\nline.\n.Pp\nBoth\n.Sy person\nand\n.Sy team\nsupport\n.Sy link:\nand the\n.Sy description\nsub-directive.\n.Sh UNIVERSAL PROPERTIES\nThese properties are valid on every entity type: items, swimlanes,\nparallel blocks, groups, milestones, anchors, waves, persons, teams,\nlabels, sizes, statuses, footnotes.\n.Bl -tag -width \"description\"\n.It Sy labels:\nList.\nTags for filtering and display.\n.Sy labels:enterprise\nor\n.Sy labels:[enterprise, security] .\nOn an item, each label renders as an atomic chiclet inside the\nbar.\n.It Sy link:\nBare URL (no quotes).\nOne link per entity.\n.It Sy style:\nIdentifier.\nSingle reference to a named style declared in\n.Sy config .\nThis is the only visual property allowed on a roadmap-section\nentity.\n.It Sy description\nSub-directive.\nIndented under the entity.\nLonger explanatory text:\n.Sy description \"Details here\" .\n.El\n.Pp\n.Sy Content vs. rendering separation .\nEntities in the roadmap section carry only semantic information\nplus an optional single\n.Sy style:id\nreference.\nRaw style properties\n.Po\n.Sy bg , Sy fg , Sy text , Sy border , Sy icon , Sy shadow ,\n.Sy font , Sy weight , Sy italic , Sy text-size , Sy padding ,\n.Sy spacing , Sy header-height , Sy corner-radius , Sy bracket ,\n.Sy header-position , Sy capacity-icon , Sy timeline-position ,\n.Sy minor-grid , Sy non-working\n.Pc\nmay only appear in\n.Sy style\nblocks and\n.Sy default <entity>\nlines \\(em both of which live in\n.Sy config .\n.Sh ITEM PROPERTIES\n.Sy status , owner , after ,\nand\n.Sy before\nare also valid on swimlanes, parallel blocks, and groups.\n.Sy wave\nis also valid on parallel blocks and groups, but not on swimlanes.\nThe rest are item-only.\n.Bl -tag -width \"remaining\"\n.It Sy status:\nBuilt-in:\n.Sy planned ,\n.Sy in-progress\n.Pq alias Sy active ,\n.Sy done\n.Pq alias Sy completed ,\n.Sy at-risk ,\n.Sy blocked .\nCustom:\n.Sy status:awaiting-review\nmatching a\n.Sy status\ndeclaration.\n.It Sy owner:\nPerson or team id.\nSingular \\(em one accountable owner.\n.It Sy after:\nIdentifier or bracketed list.\nThe entity starts after the referenced entity finishes.\n.Sy after:[a, b]\nstarts after the latest finisher.\nAccepts item, milestone, anchor, parallel, group, or wave ids.\n.It Sy before:\nIdentifier or bracketed list.\nThe entity must finish before the referenced entity starts.\n.Sy before:[a, b]\nfinishes before the earliest starter.\n.It Sy wave:\nWave id.\nExactly one declared\n.Sy wave\n.Pq Sy wave:build ;\nan item belongs to at most one wave.\nThe effective wave of an item is its own value, else that of its\nnearest enclosing\n.Sy group\nor\n.Sy parallel\nthat carries one; a swimlane never contributes.\nA descendant may repeat its container's value but not differ from it\n.Pq Sy NL.E1102 .\nA block without\n.Sy wave:\nmay hold children in different waves.\nOnly meaningful in a roadmap with waves.\n.It Sy size:\nSize alias.\n.Sy size:l\nreferences a\n.Sy size\ndeclaration; the item's calendar duration is\n.Sy effort \\(di item_capacity\n.Pq Sy capacity:\ndefaults to\n.Sy 1\nwhen absent.\nItems only \\(em not valid on\n.Sy parallel\nor\n.Sy group .\n.It Sy duration:\nRaw duration literal only\n.Pq Sy 2w , Sy 3m , Sy 0.5d ;\nno alias names.\n.Sy size:\nis the alias mechanism.\nWhen set alongside\n.Sy size: ,\n.Sy duration:\nwins for bar width and meta-line driver (size chip omitted).\nItems only.\n.It Sy remaining:\nWork remaining.\nTwo equivalent forms: percent\n.Pq Sy remaining:30%\nor single-eng effort literal\n.Pq Sy remaining:1w , Sy remaining:0.5d .\nA literal is normalized to a percent during layout.\nBoth forms render identically.\n.Sy status:done\ntakes priority.\nItems only.\n.It Sy capacity:\nConcurrent capacity consumed by this item while it runs.\nPositive integer\n.Pq Sy capacity:2 ,\ndecimal\n.Pq Sy capacity:0.5 ,\nor percent literal\n.Pq Sy capacity:50%\nwhich parses to a decimal.\nItems only.\n.El\n.Pp\n.Sy Required properties .\n.Sy item\ndeclarations must include at least one of\n.Sy size:\nor\n.Sy duration: .\n.Sy anchor\ndeclarations require\n.Sy date: .\n.Sy milestone\ndeclarations require at least one of\n.Sy date:\nor\n.Sy after: .\n.Sy footnote\ndeclarations require\n.Sy on: .\nOmitting a required property is a validation error that names the\nentity by id or title.\n.Sh CAPACITY\n.Sy capacity:\nis an optional annotation that models per-timestep throughput.\nBoth swimlanes and items may declare it, and the two annotations\nare fully independent \\(em neither requires the other.\n.Bd -literal -offset indent\nswimlane platform capacity:5\n item auth size:l capacity:2\n parallel\n item api size:m capacity:2\n item sdk size:m capacity:1\n item qa size:s capacity:50%\n.Ed\n.Pp\nThe unit is opaque to the DSL: authors decide whether\n.Sy 5\nmeans engineers, story points, FTE, hours, or any other measure\n.Pq same opacity contract as Sy size:l until a Sy size declaration gives it meaning .\n.Pp\nWhere it can appear:\n.Bl -tag -width \"swimlane\"\n.It Sy swimlane\nInteger or decimal only (no percent form).\nThe lane's per-timestep budget.\n.It Sy item\nInteger, decimal, or percent literal.\nThe item's concurrent consumption.\n.It Sy parallel , Sy group\nNot valid \\(em derived from children (sum at each timestep across\nparallel; pass-through for group).\nSame exclusion family as\n.Sy size , duration , remaining .\n.El\n.Pp\nDefault capacity:\n.Bl -tag -width \"Duration-literal items\"\n.It Sy Sized items\n.Sy size:\ndeclared, no explicit\n.Sy capacity: \\(em\ncapacity defaults to\n.Sy 1\nin both duration derivation\n.Pq Sy duration = effort \\(di 1 = effort\nand overload accounting.\n.It Sy Duration-literal items\n.Sy duration:\ndeclared, no\n.Sy size: ,\nno explicit\n.Sy capacity: \\(em\ncapacity stays unset and the item contributes\n.Sy 0\nto overload (uncounted).\nThe literal duration is the bar width regardless.\n.It Sy Explicit Sy capacity:N\nAlways wins for both purposes.\n.El\n.Pp\nLifetime: capacity is constant for the item's full duration.\nNo ramps in\n.Sy v1 .\n.Pp\n.Sy Utilization thresholds .\nSwimlanes that declare\n.Sy capacity:\npaint a tri-state utilization underline (green / yellow / red)\nalong the bottom of the band based on the per-timestep load\nfunction\n.Sy f(x) = \\(*S items[i].capacity for items active at x .\n.Bl -tag -width \"utilization-over-at\"\n.It Sy utilization-warn-at:N% Pq default Sy 80%\nAt or above this fraction of\n.Sy capacity: ,\nthe segment paints\n.Sy yellow .\n.It Sy utilization-over-at:N% Pq default Sy 100%\nAt or above this fraction of\n.Sy capacity: ,\nthe segment paints\n.Sy red .\n.El\n.Pp\nBelow\n.Sy warn-at\nthe segment paints\n.Sy green .\nBoth thresholds accept the literal value\n.Sy none\nto opt out of that color band:\n.Sy utilization-warn-at:none\ncollapses to a binary green/red indicator;\n.Sy utilization-over-at:none\nremoves red entirely; setting both to\n.Sy none\nsuppresses the underline outright.\n.Sh SIZING PRECEDENCE\nWhen an item declares both\n.Sy size:\nand\n.Sy duration: ,\nthe explicit\n.Sy duration:\nliteral wins for bar width and the meta line: the size chip is\nnot shown (only the literal appears as the driver token).\n.Bl -column -offset indent \"size:\" \"duration:\" \"capacity:\" \"Resulting duration\"\n.It Sy size: Ta Sy duration: Ta Sy capacity: Ta Resulting duration\n.It l Ta \\(em Ta \\(em Ta size.l.effort \\(di 1 (e.g. 2w)\n.It l Ta \\(em Ta 2 Ta size.l.effort \\(di 2 (e.g. 1w)\n.It l Ta 2w Ta 2 Ta 2w (literal wins; no chip)\n.It \\(em Ta 2w Ta 2 Ta 2w (capacity does not divide a literal)\n.It \\(em Ta \\(em Ta \\(em Ta validation error\n.El\n.Sh STYLE PROPERTIES\nProperties valid inside a\n.Sy style\nblock (and on\n.Sy default <entity>\nlines):\n.Bl -tag -width \"timeline-position\"\n.It Sy bg\nBackground/fill color or\n.Sy none .\nNamed\n.Po\n.Sy red , blue , yellow , green , orange ,\n.Sy purple\n.Pq alias Sy violet ,\n.Sy gray\n.Pq alias Sy grey ,\n.Sy navy , white\n.Pc ,\nhex\n.Pq Sy #2563eb ,\nor\n.Sy none\n(transparent).\n.It Sy fg\nBorder/outline color.\nNamed, hex, or\n.Sy none\n(no border).\n.It Sy text\nText color.\nNamed, hex, or\n.Sy none\n(hides text).\n.It Sy border\n.Sy solid | dashed | dotted .\n.It Sy icon\nIdentifier or string.\nBuilt-in identifiers\n.Po\n.Sy shield , warning , lock , plus the capacity-icon vocabulary\n.Pc ;\ncustom: any identifier declared by a\n.Sy symbol\ndeclaration; inline: a double-quoted Unicode literal\n.Pq Sy \"\\(rs\"\n\\(em font-dependent.\n.It Sy shadow\n.Sy none Pq default | subtle | soft | hard .\n.It Sy font\n.Sy sans Pq default | serif | mono .\n.It Sy weight\n.Sy thin | light | normal Pq default | bold .\n.It Sy italic\n.Sy true | false Pq default .\n.It Sy text-size\n.Sy xs | sm | md Pq default | lg | xl .\n.It Sy padding\n.Sy none | xs | sm | md Pq default | lg | xl .\n.It Sy spacing\n.Sy none | xs | sm | md | lg | xl .\nDefault varies by entity.\n.It Sy header-height\n.Sy none | xs | sm | md Pq default | lg | xl .\nRoadmap-only.\nHeight of the timeline date strip: 16, 20, 24, 32 or 40 px from\n.Sy xs\nto\n.Sy xl ,\nwith the date labels kept vertically centred.\nIt sizes the top strip and the mirrored bottom strip alike.\n.Sy none\nremoves every date strip, including the ones\n.Sy timeline-position\nasks for; with\n.Sy bottom\nor\n.Sy both\nthat draws the warning\n.Sy NL.W0704 .\n.It Sy corner-radius\n.Sy none | xs | sm | md | lg | xl | full .\n.It Sy bracket\n.Sy none | solid | dashed .\nThe header bracket over a group's or parallel's dates:\n.Sy solid\nby default on a group,\n.Sy dashed\non a parallel;\n.Sy none\nhides it.\nContainers only.\n.It Sy capacity-icon\nGlyph used as the suffix to capacity numbers.\nBuilt-in identifiers:\n.Sy none ,\n.Sy multiplier\n.Pq default \\(em \"\\(mu\" ,\n.Sy person ,\n.Sy people ,\n.Sy points\n.Pq \"\\(em\" ,\n.Sy time\n.Pq \"\\(em\" .\nCustom: any\n.Sy symbol\nid; inline: a double-quoted Unicode literal.\n.It Sy header-position\n.Sy beside Pq default | above .\nRoadmap-only.\nWhere the roadmap header card (title and author) sits:\n.Sy beside\nputs it in a column left of the chart, 120 to 240 px wide, with the\ntitle wrapping to fit;\n.Sy above\nputs it in a full-width 72 px band above the chart, which then spans\nthe whole canvas width.\n.It Sy timeline-position\n.Sy top Pq default | bottom | both .\nRoadmap-only.\n.Sy both\nmirrors the date strip at the chart bottom.\n.It Sy minor-grid\n.Sy true | false Pq default .\nRoadmap-only.\nWhen\n.Sy true ,\ndraws faint dotted grid lines at every tick boundary.\n.It Sy non-working\n.Sy hide Pq default | show .\nRoadmap-only; set it on\n.Sy default roadmap .\nUnder a calendar that has non-working days\n.Pq Sy calendar:business ,\n.Sy hide\ncollapses them to a seam and\n.Sy show\ndraws each run at full width as a shaded band that bars paint across.\nThe\n.Fl -non-working\noption of\n.Xr nowline 1\nand its equivalent on every other surface override it.\n.El\n.Pp\nBuilt-in icon names are rendered from a curated SVG library\nshipped with the renderer, not from Unicode emoji codepoints.\nThis guarantees consistent visual output across every platform\n(web, CLI, exports).\nAuthors who want platform-default emoji rendering use an inline\nUnicode literal instead of the named identifier.\n.Sh GRAMMAR\n.Ss Universal declaration pattern\nEvery entity declaration follows the same shape:\n.Bd -literal -offset indent\nkeyword [id] [\"title\"] [key:value ...]\n.Ed\n.Bl -tag -width \"Identifier\"\n.It Sy Identifier\nUnquoted, matches\n.Sy [a-zA-Z_][a-zA-Z0-9_-]* .\nUsed for referencing.\nOptional \\(em auto-generated from the title (kebab-cased) if\nomitted.\n.It Sy Title\nDouble-quoted string.\nHuman-readable display name.\nOptional.\nAlways double-quoted, even single-word titles \\(em the quote is\nhow the parser distinguishes id from title.\n.El\n.Pp\nAt least one of\n.Sy id\nor\n.Sy \"title\"\nmust be present.\nEvery other input is a keyed property using\n.Sy key:value .\n.Pp\nThe\n.Sy nowline\ndirective is the only construct without an id or title; every\nother declaration follows this pattern.\n.Ss Identifiers\nIdentifiers match\n.Sy [a-zA-Z_][a-zA-Z0-9_-]* \\(em\nletters, digits, underscores, and dashes, starting with a letter\nor underscore.\nThey must be unique across the merged result (the file and all\nits includes); items, parallel blocks, groups, anchors, waves, persons,\nteams, milestones, footnotes share one namespace.\n.Pp\nIdiomatic Nowline uses kebab-case but\n.Sy authRefactor ,\n.Sy auth_refactor ,\nand\n.Sy MED\nare equally valid.\n.Pp\nWhen omitted, the parser generates one by slugifying the title to\nkebab-case:\n.Qq Audit log v2\nbecomes\n.Sy audit-log-v2 .\n.Ss Lists\nAny list-typed property accepts a single value without brackets or\nmultiple values with bracket notation:\n.Bd -literal -offset indent\nlabels:enterprise\nlabels:[enterprise, security]\n.Ed\n.Pp\nNo quotes around identifiers in lists.\nComma-separated, optional spaces.\n.Ss Dependencies\n.Sy after:\nand\n.Sy before:\neach accept a single identifier or a bracketed list.\nReferences may target items, milestones, anchors, parallel\nblocks, groups, or waves.\n.Bl -bullet -offset indent -compact\n.It\n.Sy after:id\n\\(em this entity starts after the referenced entity finishes (or\nafter the referenced anchor date).\n.It\n.Sy after:[id1, id2, ...]\n\\(em starts after\n.Em all\nreferenced entities finish (i.e. after the latest of them).\n.It\n.Sy before:id\n\\(em this entity must finish before the referenced entity starts\n(or before the referenced anchor date).\n.It\n.Sy before:[id1, id2, ...]\n\\(em finishes before the\n.Em earliest\nof the referenced entities starts.\n.It\n.Sy after:wave\n\\(em starts no earlier than the\n.Em end\nof the wave.\n.Sy before:wave\n\\(em should finish before the\n.Em start\nof the wave.\n.Sy on:wave\n\\(em attaches a footnote to the wave.\n.El\n.Pp\nCircular dependencies across the full graph (including every\nelement of list-form references) are a validation error.\n.Ss Line continuation\nA trailing\n.Sq \\e\nmeans the next line continues the same declaration.\nIndentation on the continuation line is cosmetic.\nOnly valid at the end of a property line \\(em not inside strings\nor comments.\nUse\n.Sq \\e\\e\nfor a literal backslash.\n.Bd -literal -offset indent\nitem auth \"Auth refactor\" duration:2w status:in-progress \\e\n owner:sam labels:[security,enterprise] \\e\n link:https://github.com/acme/auth/issues/123 \\e\n style:flagged\n.Ed\n.Ss Comments\n.Bd -literal -offset indent\n// This is a single-line comment\n\n/* This is a\n multi-line comment */\n.Ed\n.Sh VALIDATION\nThe parser produces clear error messages with file position and\nsuggestions (fuzzy-match\n.Qq did you mean X?\nhints).\nRules group as follows; full prose lives in\n.Pa specs/dsl.md .\n.Ss Structural\n.Bl -bullet -offset indent -compact\n.It\nExactly one\n.Sy roadmap\ndeclaration per file (subject to\n.Sy include\n.Sy roadmap:\nmode).\n.It\nAll identifiers are unique across the merged result.\nParent wins on collision, with a warning (waves excepted; see\n.Sx INCLUDES ) .\n.It\nEvery entity must have at least an identifier or a title (or\nboth).\n.It\nFile structure must follow the section order:\n.Sy nowline\ndirective (optional, first non-comment line),\n.Sy include ,\n.Sy config ,\n.Sy roadmap .\n.It\nThe\n.Sy nowline\ndirective version must match\n.Sy v\\&\\ed+ .\nA version newer than the parser supports is an error identifying\nthe required version.\n.It\nAt least one swimlane is required in the merged result.\n.It\nIndentation must be consistent within a file: spaces\n.Em or\ntabs, not both.\nMixed indentation is a parse error identifying the first offending\nline.\n.It\n.Sy label ,\n.Sy size ,\n.Sy status ,\nand\n.Sy wave\ndeclarations must appear in the roadmap section.\nPlacing them before\n.Sy roadmap\nis an error.\n.El\n.Ss References\n.Bl -bullet -offset indent -compact\n.It\nAll elements of\n.Sy after: ,\n.Sy before: ,\nand\n.Sy on:\nmust resolve to declared identifiers within the merged scope.\n.It\nA\n.Sy size: ,\n.Sy status: ,\nor\n.Sy wave:\nreference must resolve to a declaration that appears\n.Em earlier in the file\n(or in an earlier include; waves are never contributed by includes).\nForward references are an error.\n.It\nNo circular dependencies in\n.Sy after / before\nchains.\n.El\n.Ss Values\n.Bl -bullet -offset indent -compact\n.It\n.Sy anchor date:\nand dated\n.Sy milestone date:\nvalues are valid ISO 8601 dates\n.Pq Pa YYYY-MM-DD , calendar-valid .\n.It\n.Sy duration:\nand\n.Sy scale:\nvalues match the raw duration pattern\n.Sy \\&\\ed+(\\e.\\ed+)?[dwmqy] .\n.It\nA\n.Sy size\ndeclaration's id must not match the raw duration pattern and must\nnot be a bare\n.Sy d , w , m , q , y .\n.It\nEvery\n.Sy size\ndeclaration must specify\n.Sy effort: ;\nthe value must be a positive raw duration literal.\n.It\n.Sy capacity:\non a\n.Sy swimlane\nmust be a positive integer or decimal (no percent form).\n.Sy capacity:\non an\n.Sy item\nmust be a positive integer, decimal, or percent literal.\n.Sy capacity:\nis not valid on\n.Sy parallel\nor\n.Sy group .\n.It\n.Sy utilization-warn-at:\nand\n.Sy utilization-over-at:\nmust each be a positive percent literal, a positive decimal\nfraction, or\n.Sy none .\nWhen both numeric thresholds are set,\n.Sy warn-at \\(<= over-at .\n.It\nStyle values, in a\n.Sy style\nblock or on a\n.Sy default\nline:\n.Sy bg: , fg: ,\nand\n.Sy text:\ntake a named color, a hex value, or\n.Sy none\n.Pq Sy NL.E0801 ;\na key with a fixed set of values, such as\n.Sy border: , shadow: ,\nor\n.Sy font: ,\ntakes one of them\n.Pq Sy NL.E0802 .\nA key in a\n.Sy style\nblock that is not a style property is\n.Sy NL.E0803 .\n.It\nA raw style property\n.Pq Sy bg: , Sy icon: , Sy capacity-icon: , No ...\non an entity in the roadmap section is\n.Sy NL.E0804 ;\ndeclare a named\n.Sy style\nin\n.Sy config\nand reference it with\n.Sy style:id .\n.It\n.Sy capacity-icon:\nvalue must be a built-in identifier\n.Po\n.Sy none , Sy multiplier , Sy person , Sy people , Sy points , Sy time\n.Pc ,\nan identifier matching a\n.Sy symbol\ndeclaration in scope, or a double-quoted Unicode literal.\nSame contract for\n.Sy icon: .\n.It\n.Sy non-working:\nvalue must be\n.Sy hide\nor\n.Sy show ,\non\n.Sy default roadmap\nand in a\n.Sy style\nblock.\nAny other value is\n.Sy NL.E0800\n(one error per value).\n.It\nThe roadmap-only style keys\n.Sy header-height , header-position , timeline-position ,\n.Sy minor-grid ,\nand\n.Sy non-working\ntake effect only on\n.Sy default roadmap\n(or in a\n.Sy style\nblock the roadmap references).\nOn any other\n.Sy default\nline they are ignored with the warning\n.Sy NL.W0703 .\n.Sy style\nblocks are not checked.\n.It\nWhen the roadmap's style sets\n.Sy header-height:none\ntogether with\n.Sy timeline-position:bottom\nor\n.Sy both ,\nno date strip is drawn at all, which draws the warning\n.Sy NL.W0704 .\nThe style resolves from\n.Sy default roadmap ,\nthen the style of each label on the\n.Sy roadmap\nline (the first label winning), then its own\n.Sy style: ,\na later key winning.\nOnly styles and labels declared in the same file are read; a\n.Sy style:\nor label from an include leaves the check silent.\n.It\n.Sy remaining:\nis either a percentage\n.Pq Sy 0% \\(en Sy 100%\nor a single-eng effort literal.\nWhen the literal exceeds total effort (computed percent\n.Sy > 100% ) ,\nthe layout step emits a soft warning and clamps the painted bar\nto 100% remaining; rendering is never blocked.\n.El\n.Ss Calendar\n.Bl -bullet -offset indent -compact\n.It\n.Sy calendar:\non\n.Sy roadmap\nmust be one of\n.Sy business , full , custom .\n.It\nA\n.Sy calendar\nconfig block is only valid when the roadmap declares\n.Sy calendar:custom .\n.It\nWhen\n.Sy calendar:custom ,\nall four\n.Sy days-per-*\nentries are required and must be positive integers.\n.It\nA\n.Sy non-working\nor\n.Sy working\ndeclaration is one of three shapes: a lone\n.Sy date: ;\n.Sy start:\nand\n.Sy end:\nwithout\n.Sy every: ;\nor\n.Sy every:\nwith optional bounds\n.Pq Sy NL.E0900 .\nIts only keys are\n.Sy date: , start: , end: ,\nand\n.Sy every:\n.Pq Sy NL.E0901 ,\nand\n.Sy start:\nand\n.Sy end:\ntake one date each\n.Pq Sy NL.E0902 .\n.It\nEvery date on a calendar declaration is a real calendar day\n.Pq Sy NL.E0405 ,\nand\n.Sy end:\nis not before\n.Sy start:\n.Pq Sy NL.E0903 .\n.It\n.Sy every:\nvalues are weekday names\n.Pq Sy NL.E0904\nand each appears at most once\n.Pq Sy NL.E0905 .\n.It\nThe open-ended week keeps at least one working weekday\n.Pq Sy NL.E0906 .\n.Sy days-per-week\nagrees with the weekdays it leaves working; a mismatch is the warning\n.Sy NL.W0705 .\n.It\nA declaration id is unique within its keyword in one file\n.Pq Sy NL.E0907 .\n.Sy non-working\nand\n.Sy working\ndo not share a namespace.\n.El\n.Ss Roadmap start property\n.Bl -bullet -offset indent -compact\n.It\n.Sy roadmap start:\nmust be a valid ISO 8601 date.\n.It\nIf a file contains any\n.Sy anchor\nor any dated\n.Sy milestone ,\n.Sy start:\nis required.\n.It\nEvery anchor date and every dated milestone date must be on or\nafter\n.Sy start: .\n.El\n.Ss Persons and teams\n.Bl -bullet -offset indent -compact\n.It\nA\n.Sy person\nmay be declared at most once in the merged file scope.\nA declaration is identified by the presence of a title or any\nkeyed property on the line.\n.It\nA bare\n.Sy person <id>\ninside a\n.Sy team\ndenotes membership and is valid with or without a separate\ndeclaration.\n.It\nA bare\n.Sy person <id>\nat roadmap top level with no matching declaration anywhere is a\nno-op (parser may emit a warning).\n.El\n.Ss Includes\n.Bl -bullet -offset indent -compact\n.It\n.Sy include\npaths must resolve to an existing\n.Pa .nowline\nfile relative to the including file's directory.\n.It\nNo circular includes.\n.It\n.Sy include\ndeclarations appear before\n.Sy config\nand\n.Sy roadmap\n(after the\n.Sy nowline\ndirective if present).\n.It\nDuplicate\n.Sy include\nof the same file in a single file is an error.\n.It\n.Sy config:\nmust be\n.Sy merge , ignore , or isolate .\n.Sy roadmap:\nmust be\n.Sy merge , ignore , or isolate .\n.It\nOn\n.Sy config:isolate ,\n.Sy style:\nreferences within the isolated file must resolve within that\nfile's own config.\n.It\nOn\n.Sy roadmap:isolate ,\nthe included file must contain a\n.Sy roadmap\ndeclaration.\n.It\nFor any\n.Sy include\nwhose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\nparent and child must agree on\n.Sy start: \\(em\nboth absent or both present with identical values.\nA mismatch is an error reported on the parent's\n.Sy include\nline.\n.It\nFor any\n.Sy include\nwhose\n.Sy roadmap:\nmode is not\n.Sy ignore ,\na participating child (one that declares a roadmap, swimlanes, or\nwaves) must declare the same waves, in the same order, with the same\nresolved start floors, as the parent\n.Pq Sy NL.E0202 .\nA differing title or other presentation is the warning\n.Sy NL.W0701 .\n.It\nOn\n.Sy config:merge ,\na\n.Sy non-working\nor\n.Sy working\ndeclaration collides only with a parent declaration of the same keyword\nand name, and the parent wins with a warning; unnamed declarations\nnever collide.\n.El\n.Ss Waves\nThese rules apply to files that use\n.Sy wave\nor\n.Sy wave: .\nEach has a stable diagnostic code.\n.Bl -tag -width \"NL.E1100\" -offset indent -compact\n.It Sy NL.E1100\nA\n.Sy wave\ndeclaration has no identifier.\n.It Sy NL.E1101\nA\n.Sy wave:\nvalue is not exactly one wave declared earlier: a list of two or\nmore, an undeclared id, a forward reference, or an id of another\nkind.\n.It Sy NL.E1102\nA descendant's\n.Sy wave:\ndiffers from its container's.\n.It Sy NL.E1103\nThe wave order cannot be realized: some work would have to start at\nor after the end of its own wave, because of lane order, a\n.Sy parallel\njoin, or an\n.Sy after:\nthat names the item's own wave, a later wave, or work in a later wave\n(directly or through a chain of other work).\n.It Sy NL.E1104\n.Sy wave:\non a swimlane, a milestone, or any entity other than item, group,\nor parallel.\n.It Sy NL.E1105\nA key that is not allowed on a wave\n.Po\n.Sy before: , date: , start: , length: , duration: , size: ,\n.Sy capacity: , remaining: , wave:\n.Pc .\n.It Sy NL.E1106\nA wave's\n.Sy after:\nnames something other than an anchor, a dated milestone, or one ISO\ndate.\n.It Sy NL.W1100\nA\n.Sy before:\nthat the wave structure guarantees can never be met.\n.It Sy NL.W1101\nAn\n.Sy after:\nor\n.Sy before:\nthat layout ignores in a roadmap with waves: a forward reference, a\nreference to the enclosing group or parallel, or a reference to a\nfloating milestone.\n.It Sy NL.W0702\n.Sy wave:\n(including on a\n.Sy default\nline) in a roadmap that declares no waves; the key is ignored.\n.El\n.Pp\nInclude agreement is\n.Sy NL.E0202\nand\n.Sy NL.W0701\n(see\n.Sx INCLUDES ) .\nLayout adds four insights:\n.Sy NL.W1002\n(the barrier solver did not settle),\n.Sy NL.I1006\n(waves with no items),\n.Sy NL.I1007\n(a wave overruns a dated milestone whose\n.Sy after:\nnames it), and\n.Sy NL.I1008\n(an item whose\n.Sy after:\ndate falls on a non-working day starts on the next working day).\n.Ss Parallel and group\n.Bl -bullet -offset indent -compact\n.It\n.Sy parallel\nmust contain at least 2 children.\nA single-child parallel emits a warning.\n.It\n.Sy group\nmust contain at least 1 child.\n.It\n.Sy size , duration , remaining , capacity\nare not valid on\n.Sy parallel\nor\n.Sy group\n(computed from children).\n.It\n.Sy parallel\nis valid inside swimlane or group.\n.Pp\n.Sy group\nis valid inside swimlane, parallel, or group.\n.El\n.Ss Defaults\n.Bl -bullet -offset indent -compact\n.It\nThe first positional argument after\n.Sy default\nmust be one of:\n.Sy item , label , swimlane , roadmap , parallel , group ,\n.Sy milestone , footnote , anchor .\n.It\nDuplicate\n.Sy default <entity>\ndeclarations for the same entity type within a single file are\nan error.\n.It\nA\n.Sy default <entity>\nthat sets a banned property\n.Pq see Sx CONFIG SECTION\nis an error.\n.It\n.Sy wave\nis banned on every\n.Sy default <entity>\nline: an error when the roadmap has waves, the warning\n.Sy NL.W0702\nwhen it has none.\n.El\n.Ss Symbols\n.Bl -bullet -offset indent -compact\n.It\nEvery\n.Sy symbol\ndeclaration must specify\n.Sy unicode:\"<string>\"\n.Pq Sy NL.E0806 ,\nand it must be non-empty\n.Pq Sy NL.E0807 .\n.It\n.Sy ascii: ,\nif present, must be a quoted string of length \\(<= 3 ASCII\ncharacters\n.Pq Sy NL.E0808 .\n.It\nA\n.Sy symbol\ntakes only\n.Sy unicode: , ascii: , link: ,\nand\n.Sy description: ;\nany other property is\n.Sy NL.E0809 .\n.It\nA\n.Sy symbol\nid must not shadow a built-in icon name\n.Pq Sy NL.E0805\nand must be unique in the file\n.Pq Sy NL.E0810 .\n.It\nA\n.Sy symbol\nreference\n.Pq Sy icon:NAME or Sy capacity-icon:NAME\nmust resolve to a built-in or an earlier\n.Sy symbol\ndeclaration\n.Pq Sy NL.E0811 .\nForward references are an error\n.Pq Sy NL.E0812 .\n.El\n.Sh EXAMPLES\nA complete\n.Pa .nowline\nfile exercising the major language features:\n.Bd -literal -offset indent\nnowline v1\n\ninclude \"shared/teams.nowline\"\n\nconfig\n\nstyle enterprise \"Enterprise readiness\"\n bg: blue\n fg: navy\n text: white\n border: solid\n icon: shield\n\nstyle risky\n border: dashed\n fg: orange\n\ndefault item status:planned shadow:subtle\ndefault label style:subtle corner-radius:full\ndefault swimlane padding:sm spacing:none\n\nroadmap platform-2026 \"Platform 2026\" \\e\n author:\"Acme Engineering\" \\e\n logo:\"./brand/acme.svg\" \\e\n start:2026-01-06 scale:2w calendar:business\n\nperson sam \"Sam Chen\" link:https://github.com/samchen\nperson jen \"Jennifer Wu\"\n\nteam engineering \"Engineering\"\n team platform \"Platform Team\"\n person sam\n person jen\n team mobile \"Mobile Team\"\n\nanchor kickoff date:2026-01-06\nanchor code-freeze \"Code Freeze\" date:2026-05-01\nanchor ga-date \"GA Date\" date:2026-06-01\n\nsize xs \"Extra Small\" effort:1d\nsize s \"Small\" effort:3d\nsize m \"Medium\" effort:1w\nsize l \"Large\" effort:2w\nsize xl \"Extra Large\" effort:1m\n\nstatus awaiting-review \"Awaiting Review\"\n\nlabel enterprise \"Enterprise readiness\" style:enterprise\nlabel security \"Security hardening\" style:enterprise\nlabel low-confidence style:risky\n\nswimlane platform owner:platform capacity:5\n item auth-refactor \"Auth refactor\" size:l after:kickoff \\e\n status:done owner:sam labels:enterprise capacity:3 \\e\n link:https://github.com/acme/auth/issues/123\n parallel after:auth-refactor\n group audit-track \"Audit Track\" labels:security\n item audit-log \"Audit log v2\" size:xl before:code-freeze \\e\n remaining:30% labels:[enterprise, security] capacity:2\n description \"Comprehensive audit trail for admin actions\"\n item audit-ui \"Audit UI\" size:m capacity:1\n item sso \"SSO plugins\" size:m \\e\n labels:[enterprise, low-confidence] capacity:50%\n item platform-qa \"Platform QA\" size:s capacity:2\n\nswimlane mobile owner:mobile capacity:2\n item offline \"Offline mode\" size:l after:kickoff owner:jen \\e\n status:at-risk remaining:60% capacity:3\n item push-v2 \"Push notifications v2\" size:m owner:mobile capacity:1\n\nmilestone beta \"Beta\" after:auth-refactor\nmilestone v1-ga \"v1 GA\" after:[auth-refactor, audit-log]\nmilestone ga-launch \"GA launch\" date:2026-06-01 \\e\n after:[auth-refactor, audit-log]\n\nfootnote \"Vendor dependency\" on:audit-log\n description \"Blocked until vendor contract is signed.\"\nfootnote capacity-risk \"Team capacity risk\" on:[mobile, platform]\n description \"Mobile team is down to 2 engineers through Q2.\"\n.Ed\n.Pp\nA compact roadmap with waves:\n.Bd -literal -offset indent\nnowline v1\n\nroadmap checkout-relaunch \"Checkout relaunch\" \\e\n start:2026-01-05 scale:1w calendar:full\n\nwave foundations \"Foundations\"\nwave build \"Build\"\nwave launch \"Launch\"\n\nswimlane platform \"Platform\"\n item auth \"Auth service split\" duration:4w wave:foundations\n item payments-api \"Payments API v2\" duration:8w wave:build\n item rate-limits \"Rate limits\" duration:2w wave:launch\n\nswimlane web \"Web\"\n item ux-research \"Checkout UX research\" duration:2w \\e\n wave:foundations\n group wave:build\n item checkout-v2 \"Checkout v2\" duration:4w\n item a11y \"Accessibility pass\" duration:2w\n item launch-page \"Launch page\" duration:2w wave:launch\n\n// No wave: background work, never held by a barrier.\nswimlane ops \"Ops\"\n item on-call \"On-call and KTLO\" duration:18w\n\nmilestone beta \"Beta\" after:build\nmilestone ga \"GA\" after:launch\n.Ed\n.Sh SEE ALSO\n.Xr nowline 1\n.Pq Sy man 1 nowline\n.Pp\nThe\n.Sy specs/\ndirectory in the source repository documents the DSL grammar in\nprose\n.Pq Pa specs/dsl.md ,\nthe layout / rendering pipeline\n.Pq Pa specs/rendering.md ,\nthe localization model\n.Pq Pa specs/localization.md ,\nand OSS milestones\n.Pq Pa specs/milestones.md .\n.Sh AUTHORS\n.An The Nowline Authors Aq Mt maintainers@nowline.io\n";
|
|
9
9
|
/** Canonical example .nowline files bundled as the `nowline://examples` resource. */
|
|
10
10
|
export const EXAMPLES = [
|
|
11
11
|
{
|
|
@@ -22,7 +22,7 @@ export const EXAMPLES = [
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"name": "inline-date-pins.nowline",
|
|
25
|
-
"content": "nowline v1\n\n// Inline date pins on `after:` / `before:` — pin an item, group, or\n// parallel to a specific calendar date without declaring a named\n// `anchor`. The renderer paints a small `calendar` glyph
|
|
25
|
+
"content": "nowline v1\n\n// Inline date pins on `after:` / `before:` — pin an item, group, or\n// parallel to a specific calendar date without declaring a named\n// `anchor`. The renderer paints a small `calendar` glyph on the\n// entity's left (`after`) or right (`before`): in an item bar's top\n// corner, or in a group's or parallel's title row. See\n// `specs/dsl.md` \"Inline date pins\" and `specs/rendering.md`\n// \"Inline-date glyph\".\n\nconfig\n\nstyle flagged\n border: dashed\n fg: orange\n\nroadmap inline-pins \"Inline date pins\" start:2026-01-05 scale:1w\n\nswimlane platform \"Platform\"\n\n // Single inline date pin on `after:` — the item starts on\n // 2026-02-09 even though the lane cursor would have placed it\n // earlier.\n item kickoff-prep \"Kickoff prep\" duration:1w\n item launch \"Launch readiness\" duration:2w after:2026-02-09\n\n // Single inline date pin on `before:` — the item must finish by\n // 2026-04-13. Caps the natural end via the existing red-overflow\n // rule when the item runs long.\n item docs \"Docs handoff\" duration:2w before:2026-04-13\n\n // Mixed list — one ISO date plus one entity id. Starts after the\n // LATEST of the two: the launch item's end OR 2026-03-15\n // (whichever is later).\n item integration \"Integration window\" duration:2w after:[launch, 2026-03-15]\n\nswimlane releases \"Releases\"\n\n // Group with an inline-date `after:` — the whole group starts\n // on 2026-02-23. The glyph sits in the group's title row, ahead of\n // the title, above the first item.\n group api-track \"API track\" style:flagged after:2026-02-23\n item api-design \"API design\" duration:1w\n item api-build \"API build\" duration:2w\n\n // Parallel with an inline-date `before:` — the whole parallel\n // must finish by 2026-05-25. The glyph sits at the right end of\n // the title row the parallel reserves above its first track (here\n // just past the title, which is wider than the parallel).\n parallel rollouts \"Region rollouts\" before:2026-05-25\n item us-rollout \"US rollout\" duration:2w\n item eu-rollout \"EU rollout\" duration:2w\n"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"name": "isolate-include.nowline",
|
|
@@ -67,8 +67,20 @@ export const EXAMPLES = [
|
|
|
67
67
|
{
|
|
68
68
|
"name": "teams.nowline",
|
|
69
69
|
"content": "nowline v1\n\nroadmap teams-2026 \"Teams Roadmap 2026\" start:2026-01-05\n\nperson sam \"Sam Chen\" link:https://github.com/samchen\nperson jen \"Jennifer Wu\"\nperson alex \"Alex Rivera\"\n\nteam engineering \"Engineering\"\n team platform-team \"Platform Team\"\n person sam\n person jen\n team mobile-team \"Mobile Team\"\n person alex\n\nanchor kickoff date:2026-01-06\nanchor mid-year date:2026-07-01\nanchor eoy \"End of Year\" date:2026-12-15\n\nswimlane platform owner:platform-team\n item auth \"Auth refactor\" duration:1m after:kickoff owner:sam status:done\n item api-v2 \"API v2\" duration:2w owner:jen status:in-progress remaining:40%\n\nswimlane mobile owner:mobile-team\n item offline \"Offline mode\" duration:1m after:kickoff owner:alex status:at-risk remaining:60%\n item push \"Push notifications\" duration:2w owner:alex\n\nmilestone beta \"Beta\" after:[auth, api-v2]\nmilestone ga \"GA\" date:2026-12-01 after:[offline, push]\n\nfootnote eng-capacity \"Mobile team capacity risk\" on:mobile-team\n description \"Mobile team is understaffed through Q2.\"\n\nfootnote vendor-dep \"Vendor dependency\" on:[auth, api-v2]\n description \"Blocked until vendor contract is signed.\"\n"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "waves-program.nowline",
|
|
73
|
+
"content": "nowline v1\n\n// Multi-team waves: every file declares the same waves, floor included, so\n// each team file renders alone and the program file merges them behind one barrier.\n\ninclude \"./waves-program/web.nowline\"\ninclude \"./waves-program/api.nowline\"\n\nroadmap program \"Program\" start:2026-01-05 scale:1w calendar:full\n\nwave plan \"Plan\"\nwave execute \"Execute\" after:2026-02-02\n\nswimlane pmo \"PMO\"\n item kickoff \"Kickoff\" duration:1w wave:plan\n item comms \"Launch comms\" duration:2w after:execute\n\nmilestone done \"Execute complete\" after:execute\n"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "waves.nowline",
|
|
77
|
+
"content": "nowline v1\n\n// Lean example: three waves (Foundations, Build, Launch) as barriers across\n// three lanes, plus unwaved background ops work. Details live in specs/waves.md.\n\nroadmap checkout-relaunch \"Checkout relaunch\" author:\"Product Engineering\" start:2026-01-05 scale:1w calendar:full\n\nwave foundations \"Foundations\"\nwave build \"Build\"\nwave launch \"Launch\"\n\nswimlane platform \"Platform\"\n item auth \"Auth service split\" duration:4w wave:foundations status:done\n item payments-api \"Payments API v2\" duration:8w wave:build status:in-progress remaining:60%\n item rate-limits \"Rate limits\" duration:2w wave:launch\n\nswimlane web \"Web\"\n item ux-research \"Checkout UX research\" duration:2w wave:foundations status:done\n group wave:build\n item checkout-v2 \"Checkout v2\" duration:4w status:in-progress remaining:30%\n item a11y \"Accessibility pass\" duration:2w\n item launch-page \"Launch page\" duration:2w wave:launch\n\nswimlane mobile \"Mobile\"\n item wallet-spike \"Wallet SDK spike\" duration:6w wave:foundations status:done\n item wallet \"Wallet integration\" duration:4w wave:build status:in-progress remaining:25%\n item store-release \"App store release\" duration:4w wave:launch\n\n// No wave: background work. Never held by a barrier, drawn hatched.\nswimlane ops \"Ops\"\n item on-call \"On-call and KTLO\" duration:18w\n\nmilestone beta \"Beta\" after:build\nmilestone ga \"GA\" after:launch\n"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "working-calendar.nowline",
|
|
81
|
+
"content": "nowline v1\n\n// Holiday quarter (m2p phase 5b, specs/working-calendar.md §4, §10): a\n// Nov to Jan plan for a team on a business calendar that names the days it is\n// closed and the one Saturday it works.\n//\n// - Thanksgiving, a two-day holiday inside a bar.\n// - Winter break, Dec 24 to Jan 1: seven working days, so a bar that\n// crosses it ends seven working days later than it would without it.\n// - Company summit, Wed Jan 13 to Fri Jan 15.\n// - Launch prep Saturday, a working exception. The chart labels it\n// \"Launch prep Saturday · +1d\", with no cut line since it removes no time;\n// MS Project writes it as a working exception and Mermaid counts it in its\n// lossy summary.\n//\n// Hidden by default: each closure is a labelled seam in the marker row.\n// Export it with `nowline examples/working-calendar.nowline -f msproj` to see\n// the closures as base-calendar <Exceptions>, or `-f mermaid` for the dated\n// `excludes` line.\n\nconfig\n\nnon-working thanksgiving \"Thanksgiving\" start:2026-11-26 end:2026-11-27\n\nnon-working winter-break \"Winter break\" start:2026-12-24 end:2027-01-01\n\nnon-working summit \"Company summit\" start:2027-01-13 end:2027-01-15\n\nworking launch-prep \"Launch prep Saturday\" date:2027-01-23\n\nroadmap working-calendar \"Holiday quarter\" start:2026-11-02 scale:1w calendar:business\n\nanchor kickoff \"Kickoff\" date:2026-11-02\nmilestone launch \"Launch\" date:2027-01-29\nswimlane platform \"Platform\"\n item api-v2 \"API v2\" duration:3w\n item data-migration \"Data migration\" duration:2w\n item hardening \"Hardening\" duration:2w\nswimlane web \"Web\"\n item design-refresh \"Design refresh\" duration:2w\n item build \"Build\" duration:4w\n item beta \"Beta\" duration:1w\n"
|
|
70
82
|
}
|
|
71
83
|
];
|
|
72
84
|
/** LLM-mediated conversion guide. Serves as the `nowline://conversions` resource. */
|
|
73
|
-
export const CONVERSIONS_GUIDE = "# Nowline Conversion Guide\n\nThis guide helps an LLM convert common gantt/timeline formats into Nowline DSL source text. No native format parsers are built into this server — the LLM mediates the conversion using these rules.\n\n## General principles\n\n1. Every Nowline file starts with `roadmap <id> \"<Title>\"` optionally followed by `start:<YYYY-MM-DD>`.\n2. Lanes map to `swimlane <id> \"<Label>\"` blocks.\n3. Tasks map to `item <id> \"<Label>\"` with `duration:`, `status:`, and `after:` properties.\n4. Milestones use the `milestone <id> \"<Label>\" date:<YYYY-MM-DD>` or `milestone <id> \"<Label>\" after:[<ids>]` syntax.\n5. Persons and teams are declared at the top level: `person <id> \"<Name>\"`, `team <id> \"<Label>\"`.\n6. IDs must be `[a-zA-Z_][a-zA-Z0-9_-]*` — derive them from labels by lowercasing and replacing spaces with `-`.\n\n## Nowline DSL quick reference\n\n```\nroadmap <id> \"<Title>\" start:<YYYY-MM-DD> scale:<N><unit>\n\n# Declarations (top level)\nperson <id> \"<Name>\" [link:<url>]\nteam <id> \"<Label>\"\n person <ref-id>\nanchor <id> \"<Label>\" date:<YYYY-MM-DD>\nsize <id> effort:<duration>\nstatus <id>\nlabel <id> \"<Label>\" [style:<style-id>]\n\n# Swimlanes (main content)\nswimlane <id> \"<Label>\" [owner:<team-id>]\n item <id> \"<Label>\" [duration:<N><unit>] [status:<id>] [after:<id>|[<ids>]] [owner:<id>]\n parallel [after:<id>]\n group <id> \"<Label>\"\n item ...\n milestone <id> \"<Label>\" [date:<YYYY-MM-DD>|after:[<ids>]]\n\n# Durations: 1d, 2w, 1m, 1q, 1y (fractional allowed: 1.5w)\n# Status values: done | in-progress | at-risk | planned (or custom status declarations)\n```\n\n---\n\n## Mermaid `gantt` → Nowline\n\nMermaid gantt structure:\n```\ngantt\n title My Roadmap\n dateFormat YYYY-MM-DD\n section Engineering\n Task A :done, t-a, 2026-01-05, 14d\n Task B :active, t-b, after t-a, 7d\n section Marketing\n Launch :milestone, 2026-03-01\n```\n\nConversion rules:\n- `title` → `roadmap` `\"<title>\"`; extract `dateFormat` for the `start:` date of the first task.\n- Each `section` → one `swimlane`.\n- Each task line `<label> :<status>, <id>, <start/after>, <duration>` → one `item`. Map Mermaid statuses: `done→done`, `active→in-progress`, `crit→at-risk`, no tag→`planned`.\n- `<duration>` in `Nd` → `<N>d`; `Nw` → `<N>w`. If only dates given, compute the duration as the day difference
|
|
85
|
+
export const CONVERSIONS_GUIDE = "# Nowline Conversion Guide\n\nThis guide helps an LLM convert common gantt/timeline formats into Nowline DSL source text. No native format parsers are built into this server — the LLM mediates the conversion using these rules.\n\n## General principles\n\n1. Every Nowline file starts with `roadmap <id> \"<Title>\"` optionally followed by `start:<YYYY-MM-DD>`.\n2. Lanes map to `swimlane <id> \"<Label>\"` blocks.\n3. Tasks map to `item <id> \"<Label>\"` with `duration:`, `status:`, and `after:` properties.\n4. Milestones use the `milestone <id> \"<Label>\" date:<YYYY-MM-DD>` or `milestone <id> \"<Label>\" after:[<ids>]` syntax.\n5. Persons and teams are declared at the top level: `person <id> \"<Name>\"`, `team <id> \"<Label>\"`.\n6. IDs must be `[a-zA-Z_][a-zA-Z0-9_-]*` — derive them from labels by lowercasing and replacing spaces with `-`.\n\n## Nowline DSL quick reference\n\n```\nroadmap <id> \"<Title>\" start:<YYYY-MM-DD> scale:<N><unit>\n\n# Declarations (top level)\nperson <id> \"<Name>\" [link:<url>]\nteam <id> \"<Label>\"\n person <ref-id>\nanchor <id> \"<Label>\" date:<YYYY-MM-DD>\nsize <id> effort:<duration>\nstatus <id>\nlabel <id> \"<Label>\" [style:<style-id>]\n\n# Swimlanes (main content)\nswimlane <id> \"<Label>\" [owner:<team-id>]\n item <id> \"<Label>\" [duration:<N><unit>] [status:<id>] [after:<id>|[<ids>]] [owner:<id>]\n parallel [after:<id>]\n group <id> \"<Label>\"\n item ...\n milestone <id> \"<Label>\" [date:<YYYY-MM-DD>|after:[<ids>]]\n\n# Durations: 1d, 2w, 1m, 1q, 1y (fractional allowed: 1.5w)\n# Status values: done | in-progress | at-risk | planned (or custom status declarations)\n```\n\n---\n\n## Mermaid `gantt` → Nowline\n\nMermaid gantt structure:\n```\ngantt\n title My Roadmap\n dateFormat YYYY-MM-DD\n section Engineering\n Task A :done, t-a, 2026-01-05, 14d\n Task B :active, t-b, after t-a, 7d\n section Marketing\n Launch :milestone, 2026-03-01\n```\n\nConversion rules:\n- `title` → `roadmap` `\"<title>\"`; extract `dateFormat` for the `start:` date of the first task.\n- Each `section` → one `swimlane`.\n- Each task line `<label> :<status>, <id>, <start/after>, <duration>` → one `item`. Map Mermaid statuses: `done→done`, `active→in-progress`, `crit→at-risk`, no tag→`planned`.\n- `<duration>` in `Nd` → `<N>d`; `Nw` → `<N>w`. If only dates given, compute the duration as the day difference. A gantt with `excludes weekends` (or `excludes saturday, sunday`) counts `Nd` in working days, so it maps to the business calendar's days (`calendar:business`, the default: `10d` is `2w`); without `excludes`, `Nd` counts every calendar day, so use `calendar:full`.\n- `:milestone` → `milestone` keyword; date from the explicit date field.\n- `after <id>` dependencies → `after:<id>` on the target item.\n\nExample output for the snippet above:\n```nowline\nroadmap my-roadmap \"My Roadmap\" start:2026-01-05\n\nswimlane engineering \"Engineering\"\n item t-a \"Task A\" duration:2w status:done\n item t-b \"Task B\" duration:1w status:in-progress after:t-a\n\nswimlane marketing \"Marketing\"\n milestone launch date:2026-03-01\n```\n\n---\n\n## MS Project XML / CSV → Nowline\n\nMS Project exports tasks with columns: `ID`, `Name`, `Duration`, `Start`, `Finish`, `Predecessors`, `Outline Level`, `% Complete`, `Resource Names`.\n\nConversion rules:\n- Outline Level 1 tasks with children → `swimlane` (use the task name as label).\n- Outline Level 2+ tasks → `item` within the parent swimlane.\n- `Duration` in days → `<N>d` or in weeks → `<N>w`.\n- `Predecessors` (e.g., `3FS`) → `after:<id-of-task-3>`.\n- `% Complete`: 0→`planned`, 1–99→`in-progress` (add `remaining:<N>%`), 100→`done`.\n- `Resource Names` → `owner:<person-id>` (declare persons at top level).\n- Summary tasks (outline level 0 or spanning rows) → use as swimlane labels.\n\n---\n\n## Excel / XLSX Gantt → Nowline\n\nCommon Excel gantt patterns:\n\n**Pattern A — row per task with date columns:**\n\n| Task | Owner | Start | End | Status |\n|------|-------|-------|-----|--------|\n| Design | Alice | 2026-01-05 | 2026-01-16 | Done |\n| Build | Bob | 2026-01-19 | 2026-02-06 | In Progress |\n\nConversion rules:\n- If there is a grouping column (e.g., `Phase` or `Stream`), use it as `swimlane` label.\n- Compute duration from Start/End: count weekdays or use calendar days.\n- Map status strings case-insensitively: `done/complete/finished→done`, `in progress/active→in-progress`, `at risk/blocked→at-risk`, blank/planned/not started→`planned`.\n- Owner column → `owner:<person-id>`; declare persons at the top.\n- Derive IDs from task names: lowercase, replace spaces with `-`, strip punctuation.\n\n**Pattern B — bar chart with weeks/months as columns:**\n\nEach row is a task; shaded cells indicate the task span. Extract:\n1. The first shaded column → start date.\n2. The last shaded column + column width → end date.\n3. Compute duration from start to end.\n\n---\n\n## Google Sheets Timeline View → Nowline\n\nGoogle Sheets Timeline view exports metadata (via File → Download or script) as rows with:\n`Title`, `Start date`, `End date`, `Group` (swimlane), `Owner`, `Color` (optional status hint).\n\nConversion rules:\n- `Group` column → `swimlane`.\n- Each row → `item`; compute `duration` from start/end dates.\n- `Owner` → `owner:<id>` (declare persons).\n- No explicit status → use color hints if present: red→`at-risk`, green→`done`, yellow→`in-progress`, blue/default→`planned`.\n\n---\n\n## Generic CSV → Nowline\n\nMinimum viable columns (flexible header matching):\n- Task name / title / description → item label\n- Start date / begin → start anchor\n- End date / finish / due → compute duration\n- Lane / group / stream / phase → swimlane\n- Status / state / progress → item status\n- Owner / assignee / responsible → item owner\n\nSteps:\n1. Identify column roles by header name (case-insensitive substring match).\n2. Group rows by lane column to form swimlanes.\n3. Sort items within each lane by start date.\n4. Build `after:` dependencies from overlapping windows or an explicit predecessor column if present.\n5. Emit persons/teams declarations first, then swimlanes.\n\n---\n\n## Tips for the LLM\n\n- When input is ambiguous, prefer `planned` as the default status.\n- Omit `after:` when tasks appear sequential within a lane and have no explicit predecessor — the renderer lays them out by date automatically.\n- Keep IDs short (`auth-refactor`, `beta-launch`) — they appear in `after:` references.\n- Round fractional durations to the nearest half-week (0.5w) for readability.\n- If a task spans multiple phases/swimlanes, duplicate it with `-pt1` / `-pt2` suffixes or split at the phase boundary.\n- Use `anchor` declarations for important dates (kickoff, code freeze, GA) that multiple items reference.\n";
|
|
74
86
|
//# sourceMappingURL=resources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/generated/resources.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,WAAW;AACX,6DAA6D;AAC7D,mDAAmD;AACnD,8DAA8D;AAE9D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAW,
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/generated/resources.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,WAAW;AACX,6DAA6D;AAC7D,mDAAmD;AACnD,8DAA8D;AAE9D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAW,6j8DAA6j8D,CAAC;AAOxm8D,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GAAkB;IACnC;QACI,MAAM,EAAE,kBAAkB;QAC1B,SAAS,EAAE,slBAAslB;KACpmB;IACD;QACI,MAAM,EAAE,sBAAsB;QAC9B,SAAS,EAAE,4XAA4X;KAC1Y;IACD;QACI,MAAM,EAAE,sBAAsB;QAC9B,SAAS,EAAE,gyBAAgyB;KAC9yB;IACD;QACI,MAAM,EAAE,0BAA0B;QAClC,SAAS,EAAE,mlEAAmlE;KACjmE;IACD;QACI,MAAM,EAAE,yBAAyB;QACjC,SAAS,EAAE,ggBAAggB;KAC9gB;IACD;QACI,MAAM,EAAE,cAAc;QACtB,SAAS,EAAE,2vVAA2vV;KACzwV;IACD;QACI,MAAM,EAAE,oBAAoB;QAC5B,SAAS,EAAE,uVAAuV;KACrW;IACD;QACI,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,ikBAAikB;KAC/kB;IACD;QACI,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,i4DAAi4D;KAC/4D;IACD;QACI,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,kSAAkS;KAChT;IACD;QACI,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,qqEAAqqE;KACnrE;IACD;QACI,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,iqEAAiqE;KAC/qE;IACD;QACI,MAAM,EAAE,kBAAkB;QAC1B,SAAS,EAAE,szBAAszB;KACp0B;IACD;QACI,MAAM,EAAE,gBAAgB;QACxB,SAAS,EAAE,4nBAA4nB;KAC1oB;IACD;QACI,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,msCAAmsC;KACjtC;IACD;QACI,MAAM,EAAE,uBAAuB;QAC/B,SAAS,EAAE,ukBAAukB;KACrlB;IACD;QACI,MAAM,EAAE,eAAe;QACvB,SAAS,EAAE,w7CAAw7C;KACt8C;IACD;QACI,MAAM,EAAE,0BAA0B;QAClC,SAAS,EAAE,ovDAAovD;KAClwD;CACJ,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAW,yoNAAyoN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-bundle.d.ts","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAOA,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"ui-bundle.d.ts","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAOA,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,MAAu3+gD,CAAC;AAEh5+gD,gFAAgF;AAChF,eAAO,MAAM,YAAY,EAAE,MAA6u/gD,CAAC"}
|