@nowline/mcp 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/branding.d.ts +20 -0
  2. package/dist/branding.d.ts.map +1 -0
  3. package/dist/branding.js +27 -0
  4. package/dist/branding.js.map +1 -0
  5. package/dist/capabilities.d.ts +9 -0
  6. package/dist/capabilities.d.ts.map +1 -0
  7. package/dist/capabilities.js +17 -0
  8. package/dist/capabilities.js.map +1 -0
  9. package/dist/diagnostics.d.ts +59 -0
  10. package/dist/diagnostics.d.ts.map +1 -0
  11. package/dist/diagnostics.js +117 -0
  12. package/dist/diagnostics.js.map +1 -0
  13. package/dist/generated/resources.d.ts +2 -0
  14. package/dist/generated/resources.d.ts.map +1 -1
  15. package/dist/generated/resources.js +6 -1
  16. package/dist/generated/resources.js.map +1 -1
  17. package/dist/generated/ui-bundle.d.ts +5 -0
  18. package/dist/generated/ui-bundle.d.ts.map +1 -0
  19. package/dist/generated/ui-bundle.js +11 -0
  20. package/dist/generated/ui-bundle.js.map +1 -0
  21. package/dist/index.js +63 -12
  22. package/dist/index.js.map +1 -1
  23. package/dist/prompts.d.ts +3 -0
  24. package/dist/prompts.d.ts.map +1 -0
  25. package/dist/prompts.js +143 -0
  26. package/dist/prompts.js.map +1 -0
  27. package/dist/reference-cheatsheet.d.ts +2 -0
  28. package/dist/reference-cheatsheet.d.ts.map +1 -0
  29. package/dist/reference-cheatsheet.js +47 -0
  30. package/dist/reference-cheatsheet.js.map +1 -0
  31. package/dist/schema-vocab.d.ts +6 -0
  32. package/dist/schema-vocab.d.ts.map +1 -0
  33. package/dist/schema-vocab.js +55 -0
  34. package/dist/schema-vocab.js.map +1 -0
  35. package/dist/schemas.d.ts +148 -0
  36. package/dist/schemas.d.ts.map +1 -0
  37. package/dist/schemas.js +88 -0
  38. package/dist/schemas.js.map +1 -0
  39. package/dist/server.d.ts +2 -0
  40. package/dist/server.d.ts.map +1 -1
  41. package/dist/server.js +531 -121
  42. package/dist/server.js.map +1 -1
  43. package/dist/ui/entry.d.ts +2 -0
  44. package/dist/ui/entry.d.ts.map +1 -0
  45. package/dist/ui/entry.js +187 -0
  46. package/dist/ui/entry.js.map +1 -0
  47. package/dist/ui/payload.d.ts +30 -0
  48. package/dist/ui/payload.d.ts.map +1 -0
  49. package/dist/ui/payload.js +49 -0
  50. package/dist/ui/payload.js.map +1 -0
  51. package/package.json +15 -6
  52. package/src/branding.ts +26 -0
  53. package/src/capabilities.ts +25 -0
  54. package/src/diagnostics.ts +185 -0
  55. package/src/generated/resources.ts +7 -1
  56. package/src/generated/ui-bundle.ts +12 -0
  57. package/src/index.ts +75 -13
  58. package/src/prompts.ts +172 -0
  59. package/src/reference-cheatsheet.ts +47 -0
  60. package/src/schema-vocab.ts +55 -0
  61. package/src/schemas.ts +106 -0
  62. package/src/server.ts +725 -139
  63. package/src/ui/entry.ts +214 -0
  64. package/src/ui/payload.ts +63 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Nowline MCP branding icons (MCP spec icons on Implementation / Tool / Prompt).
3
+ *
4
+ * Source assets:
5
+ * - PNG: branding/marketplace-publisher-icon.png (128x128)
6
+ * - SVG: branding/favicon.svg
7
+ *
8
+ * Regenerate data URIs after asset changes:
9
+ * base64 -i branding/marketplace-publisher-icon.png | tr -d '\n'
10
+ *
11
+ * Per-tool / per-prompt icons: add icons: NOWLINE_MCP_ICONS to each registerTool /
12
+ * registerPrompt config once @modelcontextprotocol/sdk exposes icons on those config types
13
+ * (SDK 1.29.0 registerTool config does not include icons yet).
14
+ */
15
+ export declare const NOWLINE_MCP_ICONS: {
16
+ src: string;
17
+ mimeType: string;
18
+ sizes: string[];
19
+ }[];
20
+ //# sourceMappingURL=branding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB;;;;GAW7B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Nowline MCP branding icons (MCP spec icons on Implementation / Tool / Prompt).
3
+ *
4
+ * Source assets:
5
+ * - PNG: branding/marketplace-publisher-icon.png (128x128)
6
+ * - SVG: branding/favicon.svg
7
+ *
8
+ * Regenerate data URIs after asset changes:
9
+ * base64 -i branding/marketplace-publisher-icon.png | tr -d '\n'
10
+ *
11
+ * Per-tool / per-prompt icons: add icons: NOWLINE_MCP_ICONS to each registerTool /
12
+ * registerPrompt config once @modelcontextprotocol/sdk exposes icons on those config types
13
+ * (SDK 1.29.0 registerTool config does not include icons yet).
14
+ */
15
+ export const NOWLINE_MCP_ICONS = [
16
+ {
17
+ src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAADkklEQVR4nO3cS0ojQBSF4bJpESEZBKHdQLKALCBz3UFm6i4UM8zAYTYg6iw7cAFxF3EDTtqGhLZB0K4bKBqq0EbNo+4555/k1vh8PkbZeo0FRZsAkCcA5AkAeQJAngCQJwDkCQB5AkCeAJAnAOQJAHkCQJ4AkCcA5AkAeQJAngCQJwDkUQJ4nk7D7OZm8WltdzqheXS0+GSLDsDTZBIeB4N4lbWGw7Db68WLJyoAL7NZeOj3w+t8Hl9lW41G2B+Pw7dmM744ogLw3k9/am80Cjvdbrw4ogIwu7oKs+vr8F7N4+PQPDmJF0cCkCUAwAlAmQBkCQBwAlAmAFkCAJwAlAlAlgAAJwBlApAlAMAJQJkAZAkAcAJQJgBZAgCcAJQJQJYAACcAZQKQJQDA/Tw/D3/u7uL1dt/b7fDj8jJeHNEA+H17G35dXMTr/+0eHobW6Wm88KMA8JHxUywI4AF8ZvwUAwJoAF8ZP4WOABbAMsZPISOABLDM8VOoCOAArGL8FCICKACrHD+FhgAGwDrGTyEhgACwzvFTKAjcA9jE+CkEBK4BbHL8lHcEbgHUMH7KMwKXAGoaP+UVgTsANY6f8ojAFYCax095Q+AGgIfxU54QuADgafyUFwTVA/A4fsoDgqoBeB4/VTuCagEgjJ+qGUGVAJDGT9WKQADW1O7BQWidncWrrqoEYCEhqHV8q1oAFgKCmse3qgZgeUZQ+/hW9QAsjwg8jG+5AGB5QuBlfMsNAMsDAk/jW64AWDUj8Da+5Q6AVSMCj+NbLgFYNSHwOr7lFoBVAwLP41uuAVibROB9fMs9AGsTCBDGtyAAWOtEgDK+BQPAWgcCpPEtKADWKhGgjW/BAbBWgQBxfAsSgLVMBKjjW7AArGUgQB7fggZgfQUB+vgWPADrMwgYxrcoAFgfQcAyvkUDwNKXRZdRAdDXxZcJQJYAACcAZQKQJQDACUCZAGQJAHACUCYAWQIAnACUCUCWAAAnAGUCkCUAwAlAmQBkCQBwAlAmAFkCAJwAlAlAlgAA9zSZhMfBIF5vtzcahZ1uN14cUQF4mc3CQ78fXufz+CrbajTC/ngcvjWb8cURFQDrvd8CreEw7PZ68eKJDoD1PJ0u/hd4vr+PrxC22+3F3/7tTie+uKIEoP4lAOQJAHkCQJ4AkCcA5AkAeQJAngCQJwDkCQB5AkCeAJAnAOQJAHkCQJ4AkCcA5AkAeX8BD/cmvdMOoX4AAAAASUVORK5CYII=',
18
+ mimeType: 'image/png',
19
+ sizes: ['128x128'],
20
+ },
21
+ {
22
+ src: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KICA8IS0tIE5vd2xpbmUgc3RhbmRhbG9uZSBtYXJrOiByZWQgbm93LWxpbmUgKyBkaWFtb25kIC0tPgogIDxyZWN0IHg9IjE0LjUiIHk9IjEiIHdpZHRoPSIzIiBoZWlnaHQ9IjMwIiByeD0iMS41IiBmaWxsPSIjZTUzZTNlIi8+CiAgPHBvbHlnb24gcG9pbnRzPSIxNiw3IDI1LDE2IDE2LDI1IDcsMTYiIGZpbGw9IiNlNTNlM2UiLz4KPC9zdmc+Cg==',
23
+ mimeType: 'image/svg+xml',
24
+ sizes: ['any'],
25
+ },
26
+ ];
27
+ //# sourceMappingURL=branding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B;QACI,GAAG,EAAE,wyCAAwyC;QAC7yC,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,CAAC,SAAS,CAAC;KACrB;IACD;QACI,GAAG,EAAE,oZAAoZ;QACzZ,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,CAAC,KAAK,CAAC;KACjB;CACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ServerCapabilities {
2
+ themes: readonly string[];
3
+ icons: readonly string[];
4
+ locales: readonly string[];
5
+ formats: readonly string[];
6
+ templates: readonly string[];
7
+ }
8
+ export declare const CAPABILITIES: ServerCapabilities;
9
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED,eAAO,MAAM,YAAY,EAAE,kBAO1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ // Aggregated server capabilities. Used by the `capabilities` tool and the
2
+ // individual `list-*` projection tools. Values are hardcoded to their stable
3
+ // registry sources and must be kept in sync with:
4
+ // - themes: @nowline/layout/src/themes/index.ts (ThemeName)
5
+ // - icons: @nowline/renderer/src/svg/icons.ts (CAPACITY_ICON_SVG keys)
6
+ // - locales: @nowline/core/src/i18n (message bundle files)
7
+ // - formats: @nowline/export ExportFormat union
8
+ // - templates: @nowline/core TEMPLATE_NAMES
9
+ export const CAPABILITIES = {
10
+ themes: ['light', 'dark', 'grayscale'],
11
+ // Built-in `capacity-icon:` vocabulary (CAPACITY_ICON_SVG keys).
12
+ icons: ['person', 'people', 'points', 'time'],
13
+ locales: ['en', 'fr', 'fr-CA', 'fr-FR'],
14
+ formats: ['svg', 'png', 'pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'json'],
15
+ templates: ['minimal', 'teams', 'product', 'showcase'],
16
+ };
17
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,kDAAkD;AAClD,8DAA8D;AAC9D,yEAAyE;AACzE,6DAA6D;AAC7D,kDAAkD;AAClD,8CAA8C;AAU9C,MAAM,CAAC,MAAM,YAAY,GAAuB;IAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC;IACtC,iEAAiE;IACjE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC3E,SAAS,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;CACzD,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type NowlineFile } from '@nowline/core';
2
+ import { type LayoutInsight } from '@nowline/layout';
3
+ export interface McpDiagnostic {
4
+ file: string;
5
+ line: number;
6
+ column: number;
7
+ severity: 'error' | 'warning' | 'info';
8
+ code: string;
9
+ message: string;
10
+ suggestion?: string;
11
+ }
12
+ export interface McpInsight {
13
+ severity: 'info' | 'warning';
14
+ code: string;
15
+ message: string;
16
+ entityId?: string;
17
+ }
18
+ export declare function layoutInsightToMcp(insight: LayoutInsight): McpInsight;
19
+ export declare function getMcpServices(): {
20
+ shared: import("langium").LangiumSharedCoreServices;
21
+ Nowline: import("@nowline/core").NowlineServices;
22
+ };
23
+ export declare function buildDocument(source: string): Promise<import("langium").LangiumDocument<NowlineFile>>;
24
+ export declare function collectMcpDiagnostics(doc: Awaited<ReturnType<typeof buildDocument>>, filePath: string): McpDiagnostic[];
25
+ export declare function diagnosticsErrorResponse(filePath: string, diagnostics: McpDiagnostic[]): {
26
+ content: {
27
+ type: "text";
28
+ text: string;
29
+ }[];
30
+ isError: true;
31
+ };
32
+ export declare function diagnosticsErrorBlock(source: string, filePath: string): Promise<{
33
+ ok: true;
34
+ doc: Awaited<ReturnType<typeof buildDocument>>;
35
+ } | {
36
+ ok: false;
37
+ response: ReturnType<typeof diagnosticsErrorResponse>;
38
+ }>;
39
+ export interface LayoutInsightInputs {
40
+ source: string;
41
+ filePath: string;
42
+ today?: Date;
43
+ theme?: 'light' | 'dark' | 'grayscale';
44
+ width?: number;
45
+ locale?: string;
46
+ readFile?: (absPath: string) => Promise<string>;
47
+ /** Pre-built document to reuse instead of re-parsing `source`. The
48
+ * caller is responsible for passing a doc parsed from the same
49
+ * `source` (e.g. the one from `diagnosticsErrorBlock`). */
50
+ doc?: Awaited<ReturnType<typeof buildDocument>>;
51
+ }
52
+ export declare function collectMcpLayoutInsights(inputs: LayoutInsightInputs): Promise<McpInsight[]>;
53
+ export declare const LAYOUT_INSIGHT_HINT: string;
54
+ export declare const REVIEW_MAX_WIDTH = 1024;
55
+ export declare const DEFAULT_RENDER_WIDTH = 1280;
56
+ export declare const DSL_SYNTAX_POINTER = "Source is `.nowline` DSL (not JSON/YAML); call the `reference`/`examples` tools for full syntax.";
57
+ export declare const DSL_SYNTAX_EXAMPLE = "nowline v1\n\nroadmap r \"Title\" start:2026-01-05 scale:2w\n\nswimlane eng \"Engineering\"\n item build \"Build\" duration:3w";
58
+ export declare function toolDescriptionWithSyntax(base: string): string;
59
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EAIH,KAAK,WAAW,EAGnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAyB,KAAK,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAG3F,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,UAAU,CAOrE;AAKD,wBAAgB,cAAc;;;EAG7B;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,2DASjD;AAED,wBAAgB,qBAAqB,CACjC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,EAC9C,QAAQ,EAAE,MAAM,GACjB,aAAa,EAAE,CA8BjB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE;;;;;;EAUtF;AAED,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CACJ;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAA;CAAE,CACzE,CAOA;AAED,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;gEAE4D;IAC5D,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;CACnD;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA4BjG;AAED,eAAO,MAAM,mBAAmB,QAEiC,CAAC;AAElE,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,eAAO,MAAM,kBAAkB,qGACuE,CAAC;AAEvG,eAAO,MAAM,kBAAkB,oIAKE,CAAC;AAElC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,117 @@
1
+ // MCP diagnostic helpers — maps Langium/core diagnostics to the MCP tool shape.
2
+ import { collectDocumentDiagnostics, createNowlineServices, extractSuggestion, resolveDiagnosticCode, resolveIncludes, } from '@nowline/core';
3
+ import { collectLayoutInsights, layoutRoadmap } from '@nowline/layout';
4
+ import { URI } from 'langium';
5
+ export function layoutInsightToMcp(insight) {
6
+ return {
7
+ severity: insight.severity,
8
+ code: insight.code,
9
+ message: insight.message,
10
+ entityId: insight.entityId,
11
+ };
12
+ }
13
+ let cachedServices;
14
+ let docCounter = 0;
15
+ export function getMcpServices() {
16
+ if (!cachedServices)
17
+ cachedServices = createNowlineServices();
18
+ return cachedServices;
19
+ }
20
+ export async function buildDocument(source) {
21
+ const services = getMcpServices();
22
+ const uri = URI.parse(`memory:///mcp-${++docCounter}.nowline`);
23
+ const doc = services.shared.workspace.LangiumDocumentFactory.fromString(source, uri);
24
+ await services.shared.workspace.DocumentBuilder.build([doc], { validation: true });
25
+ return doc;
26
+ }
27
+ export function collectMcpDiagnostics(doc, filePath) {
28
+ const raw = collectDocumentDiagnostics(doc);
29
+ const out = [];
30
+ for (const d of raw) {
31
+ if (d.origin === 'lexer' || d.origin === 'parser') {
32
+ out.push({
33
+ file: filePath,
34
+ line: 1,
35
+ column: 1,
36
+ severity: 'error',
37
+ code: d.origin === 'lexer' ? 'lexing-error' : 'parsing-error',
38
+ message: d.error.message,
39
+ });
40
+ }
41
+ else {
42
+ const diag = d.diagnostic;
43
+ const range = diag.range;
44
+ const severity = diag.severity === 2 ? 'warning' : diag.severity === 3 ? 'info' : 'error';
45
+ out.push({
46
+ file: filePath,
47
+ line: (range?.start.line ?? 0) + 1,
48
+ column: (range?.start.character ?? 0) + 1,
49
+ severity,
50
+ code: resolveDiagnosticCode(diag),
51
+ message: diag.message,
52
+ suggestion: extractSuggestion(diag.message),
53
+ });
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ export function diagnosticsErrorResponse(filePath, diagnostics) {
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify({ ok: false, path: filePath, diagnostics }, null, 2),
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ export async function diagnosticsErrorBlock(source, filePath) {
70
+ const doc = await buildDocument(source);
71
+ const diagnostics = collectMcpDiagnostics(doc, filePath);
72
+ if (diagnostics.some((d) => d.severity === 'error')) {
73
+ return { ok: false, response: diagnosticsErrorResponse(filePath, diagnostics) };
74
+ }
75
+ return { ok: true, doc };
76
+ }
77
+ export async function collectMcpLayoutInsights(inputs) {
78
+ const doc = inputs.doc ?? (await buildDocument(inputs.source));
79
+ const diagnostics = collectMcpDiagnostics(doc, inputs.filePath);
80
+ if (diagnostics.some((d) => d.severity === 'error')) {
81
+ return [];
82
+ }
83
+ const services = getMcpServices();
84
+ const file = doc.parseResult.value;
85
+ const resolved = await resolveIncludes(file, inputs.filePath, {
86
+ services: services.Nowline,
87
+ readFile: inputs.readFile,
88
+ });
89
+ if (resolved.diagnostics.some((d) => d.severity === 'error')) {
90
+ return [];
91
+ }
92
+ const layout = layoutRoadmap(file, resolved, {
93
+ today: inputs.today,
94
+ theme: inputs.theme ?? 'light',
95
+ width: inputs.width,
96
+ locale: inputs.locale ?? 'en-US',
97
+ });
98
+ return collectLayoutInsights(layout, {
99
+ today: inputs.today,
100
+ locale: inputs.locale ?? 'en-US',
101
+ }).map(layoutInsightToMcp);
102
+ }
103
+ export const LAYOUT_INSIGHT_HINT = 'These are layout consequences, not errors — the roadmap rendered. ' +
104
+ 'To see the visual result, call `render` with `review:true`.';
105
+ export const REVIEW_MAX_WIDTH = 1024;
106
+ export const DEFAULT_RENDER_WIDTH = 1280;
107
+ export const DSL_SYNTAX_POINTER = 'Source is `.nowline` DSL (not JSON/YAML); call the `reference`/`examples` tools for full syntax.';
108
+ export const DSL_SYNTAX_EXAMPLE = `nowline v1
109
+
110
+ roadmap r "Title" start:2026-01-05 scale:2w
111
+
112
+ swimlane eng "Engineering"
113
+ item build "Build" duration:3w`;
114
+ export function toolDescriptionWithSyntax(base) {
115
+ return `${base}\n\nExample:\n${DSL_SYNTAX_EXAMPLE}\n\n${DSL_SYNTAX_POINTER}`;
116
+ }
117
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -6,4 +6,6 @@ export interface ExampleFile {
6
6
  }
7
7
  /** Canonical example .nowline files bundled as the `nowline://examples` resource. */
8
8
  export declare const EXAMPLES: ExampleFile[];
9
+ /** LLM-mediated conversion guide. Serves as the `nowline://conversions` resource. */
10
+ export declare const CONVERSIONS_GUIDE: string;
9
11
  //# sourceMappingURL=resources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/generated/resources.ts"],"names":[],"mappings":"AAIA,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,EAAE,MAAow3C,CAAC;AAEty3C,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,eAAO,MAAM,QAAQ,EAAE,WAAW,EA6DjC,CAAC"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/generated/resources.ts"],"names":[],"mappings":"AAOA,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,EAAE,MAAow3C,CAAC;AAEty3C,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,eAAO,MAAM,QAAQ,EAAE,WAAW,EA6DjC,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAE,MAAy4M,CAAC"}
@@ -1,6 +1,9 @@
1
1
  // GENERATED — do not edit. Re-run `pnpm --filter @nowline/mcp build` to regenerate.
2
2
  //
3
- // Source: packages/cli/man/nowline.5 (reference) + examples/*.nowline (examples).
3
+ // Sources:
4
+ // packages/cli/man/nowline.5 → REFERENCE_MAN_PAGE
5
+ // examples/*.nowline → EXAMPLES
6
+ // packages/mcp/resources/conversions.md → CONVERSIONS_GUIDE
4
7
  /** Full text of the nowline.5 DSL man page. Serves as the `nowline://reference` resource. */
5
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";
6
9
  /** Canonical example .nowline files bundled as the `nowline://examples` resource. */
@@ -66,4 +69,6 @@ export const EXAMPLES = [
66
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"
67
70
  }
68
71
  ];
72
+ /** 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.\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";
69
74
  //# 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,kFAAkF;AAElF,6FAA6F;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAW,2v3CAA2v3C,CAAC;AAOty3C,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,o0DAAo0D;KACl1D;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;CACJ,CAAC"}
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,2v3CAA2v3C,CAAC;AAOty3C,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,o0DAAo0D;KACl1D;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;CACJ,CAAC;AAEF,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAW,g4MAAg4M,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Self-contained browser IIFE for the MCP Apps in-chat live preview. */
2
+ export declare const UI_BUNDLE: string;
3
+ /** Static text/html;profile=mcp-app document for the ui:// preview resource. */
4
+ export declare const PREVIEW_HTML: string;
5
+ //# sourceMappingURL=ui-bundle.d.ts.map
@@ -0,0 +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,MAA664lC,CAAC;AAEt84lC,gFAAgF;AAChF,eAAO,MAAM,YAAY,EAAE,MAAmy5lC,CAAC"}