@zigrivers/scaffold 3.29.0 → 3.31.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 (86) hide show
  1. package/content/guides/AUTHORING.md +146 -0
  2. package/content/guides/cli/index.html +1855 -0
  3. package/content/guides/cli/index.md +206 -0
  4. package/content/guides/concepts/index.html +1970 -0
  5. package/content/guides/concepts/index.md +347 -0
  6. package/content/guides/dashboard/index.html +1913 -0
  7. package/content/guides/dashboard/index.md +264 -0
  8. package/content/guides/index.html +368 -15
  9. package/content/guides/install/.diagrams/diagram-0.svg +1 -0
  10. package/content/guides/install/.diagrams/manifest.json +3 -0
  11. package/content/guides/install/index.html +1653 -0
  12. package/content/guides/install/index.md +186 -0
  13. package/content/guides/knowledge/.diagrams/diagram-0.svg +1 -0
  14. package/content/guides/knowledge/.diagrams/manifest.json +3 -0
  15. package/content/guides/knowledge/index.html +1765 -0
  16. package/content/guides/knowledge/index.md +209 -0
  17. package/content/guides/knowledge-freshness/.diagrams/diagram-0.svg +1 -0
  18. package/content/guides/knowledge-freshness/.diagrams/manifest.json +3 -0
  19. package/content/guides/knowledge-freshness/index.html +2795 -0
  20. package/content/guides/knowledge-freshness/index.md +893 -0
  21. package/content/guides/mmr/index.html +407 -36
  22. package/content/guides/mmr/index.md +39 -16
  23. package/content/guides/multi-agent/.diagrams/diagram-0.svg +1 -0
  24. package/content/guides/multi-agent/.diagrams/manifest.json +3 -0
  25. package/content/guides/multi-agent/index.html +1715 -0
  26. package/content/guides/multi-agent/index.md +243 -0
  27. package/content/guides/observability/.diagrams/diagram-0.svg +1 -0
  28. package/content/guides/observability/.diagrams/diagram-1.svg +1 -0
  29. package/content/guides/observability/.diagrams/diagram-2.svg +1 -0
  30. package/content/guides/observability/.diagrams/diagram-3.svg +1 -0
  31. package/content/guides/observability/.diagrams/manifest.json +6 -0
  32. package/content/guides/observability/index.html +3257 -0
  33. package/content/guides/observability/index.md +1097 -0
  34. package/content/guides/pipeline/.diagrams/diagram-0.svg +1 -0
  35. package/content/guides/pipeline/.diagrams/diagram-1.svg +1 -0
  36. package/content/guides/pipeline/.diagrams/manifest.json +4 -0
  37. package/content/guides/pipeline/index.html +1973 -0
  38. package/content/guides/pipeline/index.md +387 -0
  39. package/content/guides/review-workflow/.diagrams/diagram-0.svg +1 -0
  40. package/content/guides/review-workflow/.diagrams/diagram-1.svg +1 -0
  41. package/content/guides/review-workflow/.diagrams/manifest.json +4 -0
  42. package/content/guides/review-workflow/index.html +1790 -0
  43. package/content/guides/review-workflow/index.md +248 -0
  44. package/dist/guides/build.d.ts +1 -1
  45. package/dist/guides/build.d.ts.map +1 -1
  46. package/dist/guides/build.js +21 -9
  47. package/dist/guides/build.js.map +1 -1
  48. package/dist/guides/build.test.js +47 -0
  49. package/dist/guides/build.test.js.map +1 -1
  50. package/dist/guides/chrome.d.ts.map +1 -1
  51. package/dist/guides/chrome.js +83 -12
  52. package/dist/guides/chrome.js.map +1 -1
  53. package/dist/guides/dashboard-theme.css +8 -0
  54. package/dist/guides/directives-cite.test.d.ts +2 -0
  55. package/dist/guides/directives-cite.test.d.ts.map +1 -0
  56. package/dist/guides/directives-cite.test.js +26 -0
  57. package/dist/guides/directives-cite.test.js.map +1 -0
  58. package/dist/guides/directives-tabs.test.js +47 -0
  59. package/dist/guides/directives-tabs.test.js.map +1 -1
  60. package/dist/guides/directives.d.ts +1 -0
  61. package/dist/guides/directives.d.ts.map +1 -1
  62. package/dist/guides/directives.js +38 -0
  63. package/dist/guides/directives.js.map +1 -1
  64. package/dist/guides/guides.css +268 -0
  65. package/dist/guides/index-page.d.ts.map +1 -1
  66. package/dist/guides/index-page.js +41 -8
  67. package/dist/guides/index-page.js.map +1 -1
  68. package/dist/guides/links.d.ts +14 -0
  69. package/dist/guides/links.d.ts.map +1 -0
  70. package/dist/guides/links.js +56 -0
  71. package/dist/guides/links.js.map +1 -0
  72. package/dist/guides/links.test.d.ts +2 -0
  73. package/dist/guides/links.test.d.ts.map +1 -0
  74. package/dist/guides/links.test.js +72 -0
  75. package/dist/guides/links.test.js.map +1 -0
  76. package/dist/guides/render.d.ts +1 -0
  77. package/dist/guides/render.d.ts.map +1 -1
  78. package/dist/guides/render.js +1 -1
  79. package/dist/guides/render.js.map +1 -1
  80. package/dist/guides/sanitize.d.ts.map +1 -1
  81. package/dist/guides/sanitize.js +5 -0
  82. package/dist/guides/sanitize.js.map +1 -1
  83. package/dist/guides/template.d.ts.map +1 -1
  84. package/dist/guides/template.js +7 -2
  85. package/dist/guides/template.js.map +1 -1
  86. package/package.json +2 -2
@@ -48,5 +48,52 @@ describe('remarkTabs', () => {
48
48
  // First pane is active
49
49
  expect(body).toContain('class="tabpane active"');
50
50
  });
51
+ it('emits a complete ARIA tabs pattern that survives sanitization', async () => {
52
+ const md = [
53
+ '::::tabs',
54
+ '',
55
+ ':::tab{title="A"}',
56
+ 'A body',
57
+ ':::',
58
+ '',
59
+ ':::tab{title="B"}',
60
+ 'B body',
61
+ ':::',
62
+ '',
63
+ '::::',
64
+ ].join('\n') + '\n';
65
+ const { body } = await renderGuideBody(md, { plugins: [remarkTabs] });
66
+ // Buttons: role=tab, controls + selected + roving tabindex
67
+ expect(body).toContain('role="tab"');
68
+ expect(body).toContain('aria-controls="tabpane-0-0"');
69
+ expect(body).toContain('aria-selected="true"');
70
+ expect(body).toContain('aria-selected="false"');
71
+ expect(body).toContain('tabindex="0"');
72
+ expect(body).toContain('tabindex="-1"');
73
+ // Panes: role=tabpanel + back-reference (the casing-sensitive one the
74
+ // sanitize allowlist must match: ariaLabelledBy, not ariaLabelledby)
75
+ expect(body).toContain('role="tabpanel"');
76
+ expect(body).toContain('aria-labelledby="tab-0-0"');
77
+ expect(body).toContain('id="tabpane-0-1"');
78
+ });
79
+ it('renders quoted titles with punctuation without leaking directive text', async () => {
80
+ const md = [
81
+ '::::tabs',
82
+ '',
83
+ ':::tab{title="mvp (depth 1)"}',
84
+ 'A body',
85
+ ':::',
86
+ '',
87
+ ':::tab{title="CLI / library"}',
88
+ 'B body',
89
+ ':::',
90
+ '',
91
+ '::::',
92
+ ].join('\n') + '\n';
93
+ const { body } = await renderGuideBody(md, { plugins: [remarkTabs] });
94
+ expect(body).toContain('mvp (depth 1)');
95
+ expect(body).toContain('CLI / library');
96
+ expect(body).not.toContain(':::tab'); // no leaked raw directive text
97
+ });
51
98
  });
52
99
  //# sourceMappingURL=directives-tabs.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"directives-tabs.test.js","sourceRoot":"","sources":["../../src/guides/directives-tabs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,qBAAqB;YACrB,UAAU;YACV,KAAK;YACL,EAAE;YACF,6BAA6B;YAC7B,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,GAAG;YACT,UAAU;YACV,EAAE;YACF,uBAAuB;YACvB,YAAY;YACZ,KAAK;YACL,EAAE;YACF,wBAAwB;YACxB,aAAa;YACb,KAAK;YACL,EAAE;YACF,MAAM;SACP,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACrE,+BAA+B;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACpC,YAAY;QACZ,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QACtC,0BAA0B;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,gCAAgC;QAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrD,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"directives-tabs.test.js","sourceRoot":"","sources":["../../src/guides/directives-tabs.test.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,6 @@ export declare const remarkCallout: AnyPlugin;
3
3
  export declare const remarkTabs: AnyPlugin;
4
4
  export declare const remarkChart: AnyPlugin;
5
5
  export declare const remarkFilterTable: AnyPlugin;
6
+ export declare const remarkCite: AnyPlugin;
6
7
  export declare const remarkSev: AnyPlugin;
7
8
  //# sourceMappingURL=directives.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,eAAO,MAAM,aAAa,EAAE,SAU3B,CAAA;AAGD,eAAO,MAAM,UAAU,EAAE,SA+CxB,CAAA;AAGD,eAAO,MAAM,WAAW,EAAE,SAqDzB,CAAA;AAGD,eAAO,MAAM,iBAAiB,EAAE,SAmB/B,CAAA;AAKD,eAAO,MAAM,SAAS,EAAE,SAUvB,CAAA"}
1
+ {"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAI5C,eAAO,MAAM,aAAa,EAAE,SAU3B,CAAA;AAGD,eAAO,MAAM,UAAU,EAAE,SA6DxB,CAAA;AAGD,eAAO,MAAM,WAAW,EAAE,SAqDzB,CAAA;AAGD,eAAO,MAAM,iBAAiB,EAAE,SAmB/B,CAAA;AAQD,eAAO,MAAM,UAAU,EAAE,SAgBxB,CAAA;AAKD,eAAO,MAAM,SAAS,EAAE,SAUvB,CAAA"}
@@ -15,6 +15,7 @@ export const remarkCallout = () => (tree) => {
15
15
  };
16
16
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
17
  export const remarkTabs = () => (tree) => {
18
+ let group = 0; // unique id base per tabs group (document order → deterministic)
18
19
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
20
  visit(tree, (node) => {
20
21
  if (node.type !== 'containerDirective' || node.name !== 'tabs')
@@ -22,20 +23,29 @@ export const remarkTabs = () => (tree) => {
22
23
  // With a 4-colon outer fence (::::tabs) wrapping 3-colon (:::tab) children,
23
24
  // remark-directive nests tab nodes directly inside node.children — no sibling
24
25
  // collection needed, no stray ::: paragraph produced.
26
+ const g = group++;
27
+ const tabId = (i) => `tab-${g}-${i}`;
28
+ const paneId = (i) => `tabpane-${g}-${i}`;
25
29
  const tabs = (node.children ?? []).filter(
26
30
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
31
  (c) => c.type === 'containerDirective' && c.name === 'tab');
28
32
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
33
  const others = (node.children ?? []).filter((c) => !(c.type === 'containerDirective' && c.name === 'tab'));
34
+ // Full ARIA tabs pattern: each button controls its pane; roving tabindex +
35
+ // aria-selected track the active tab (chrome.ts updates them on click/arrow).
30
36
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
37
  const buttons = tabs.map((t, i) => ({
32
38
  type: 'paragraph',
33
39
  data: {
34
40
  hName: 'button',
35
41
  hProperties: {
42
+ id: tabId(i),
36
43
  className: 'tab-btn' + (i === 0 ? ' active' : ''),
37
44
  role: 'tab',
38
45
  'data-tab': String(i),
46
+ 'aria-controls': paneId(i),
47
+ 'aria-selected': i === 0 ? 'true' : 'false',
48
+ tabindex: i === 0 ? '0' : '-1',
39
49
  },
40
50
  },
41
51
  children: [{ type: 'text', value: String(t.attributes?.title ?? `Tab ${i + 1}`) }],
@@ -51,8 +61,12 @@ export const remarkTabs = () => (tree) => {
51
61
  t.data = t.data ?? {};
52
62
  t.data.hName = 'div';
53
63
  t.data.hProperties = {
64
+ id: paneId(i),
54
65
  className: 'tabpane' + (i === 0 ? ' active' : ''),
66
+ role: 'tabpanel',
55
67
  'data-tab': String(i),
68
+ 'aria-labelledby': tabId(i),
69
+ tabindex: '0',
56
70
  };
57
71
  });
58
72
  node.data = node.data ?? {};
@@ -141,6 +155,30 @@ export const remarkFilterTable = () => (tree) => {
141
155
  node.children = [input, ...(node.children ?? [])];
142
156
  });
143
157
  };
158
+ // `:cite[path:line]` (blocking) / `:cite[path:line]{mode=advisory}` (warns).
159
+ // Blocking citations render as `<span class="fp" data-path="…">` so the existing
160
+ // citation-drift checker (scripts/check-reference-citations.mjs FP_RE) verifies
161
+ // the file:line still exists. Advisory citations use a non-`fp` class so the
162
+ // checker's `\bfp\b` match ignores them (the gate never blocks on them).
163
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
164
+ export const remarkCite = () => (tree) => {
165
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
166
+ visit(tree, (node) => {
167
+ if (node.type !== 'textDirective' || node.name !== 'cite')
168
+ return;
169
+ const path = mdToString(node).trim();
170
+ const advisory = String(node.attributes?.mode ?? '').toLowerCase() === 'advisory';
171
+ node.data = node.data ?? {};
172
+ node.data.hName = 'span';
173
+ // camelCase `dataPath` matches the hast property convention and the
174
+ // sanitize allowlist (sanitize.ts) — serializes to the data-path attribute.
175
+ node.data.hProperties = {
176
+ className: advisory ? 'cite-advisory' : 'fp',
177
+ dataPath: path,
178
+ };
179
+ node.children = [{ type: 'text', value: path }];
180
+ });
181
+ };
144
182
  const SEV_LEVELS = new Set(['p0', 'p1', 'p2', 'p3', 'pass']);
145
183
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
184
  export const remarkSev = () => (tree) => {
@@ -1 +1 @@
1
- {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/guides/directives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ /* ============================================================================
2
+ * guides.css — component + layout styles for `scaffold guides` reference pages.
3
+ *
4
+ * Pairs with lib/dashboard-theme.css (the token source) and src/guides/chrome.ts
5
+ * (the behavior). Styles the guide CHROME (.topbar, .layout, .rail, nav.toc,
6
+ * .content) and the markdown DIRECTIVES (callouts, sev chips, filter-tables,
7
+ * charts, tabs, citations) plus base prose typography.
8
+ *
9
+ * DESIGN SYSTEM: all COLORS come from dashboard-theme.css tokens, and spacing
10
+ * uses the --sp-* scale wherever it maps. The few structural layout constants
11
+ * (topbar height, rail/drawer width, chart label column, card min) are declared
12
+ * as local custom properties below; a handful of sub-scale UI values (chip/bar
13
+ * sizing, em-based inline-code padding) and the responsive breakpoint are
14
+ * literal because no token expresses them. Both themes are covered because every
15
+ * color is a token.
16
+ * ==========================================================================*/
17
+
18
+ :root {
19
+ --topbar-h: 52px; /* sticky topbar height; rail sticky offset keys off it */
20
+ --rail-w: 260px; /* desktop TOC sidebar column */
21
+ --drawer-w: 280px; /* mobile off-canvas TOC drawer */
22
+ --card-min: 260px; /* index card min track width */
23
+ --chart-label-w: 90px; /* chart row label column min */
24
+ }
25
+
26
+ /* ── Base / reset on top of the token base in dashboard-theme.css ─────────── */
27
+ .content a { color: var(--accent); text-decoration: none; }
28
+ .content a:hover { text-decoration: underline; }
29
+ .content strong { font-weight: var(--fw-semi); }
30
+ .content hr { border: 0; border-top: 1px solid var(--border-light); margin: var(--sp-6) 0; }
31
+
32
+ /* Consistent keyboard focus for every interactive control (a11y). */
33
+ .topbar button:focus-visible,
34
+ .copy-btn:focus-visible,
35
+ .tab-btn:focus-visible,
36
+ .filter-input:focus-visible,
37
+ nav.toc a:focus-visible,
38
+ .guide-card:focus-visible,
39
+ .content a:focus-visible {
40
+ outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--radius-sm);
41
+ }
42
+
43
+ /* ── Topbar ────────────────────────────────────────────────────────────────*/
44
+ .topbar {
45
+ position: sticky; top: 0; z-index: 60; height: var(--topbar-h);
46
+ display: flex; align-items: center; gap: var(--sp-3);
47
+ padding: 0 var(--page-pad);
48
+ background: var(--bg-card); border-bottom: 1px solid var(--border);
49
+ }
50
+ .topbar h1 {
51
+ flex: 1; min-width: 0; margin: 0;
52
+ font-size: var(--text-lg); font-weight: var(--fw-bold);
53
+ letter-spacing: var(--ls-tight);
54
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
55
+ }
56
+ .topbar button {
57
+ background: var(--bg-card); border: 1px solid var(--border); color: var(--text);
58
+ border-radius: var(--radius-sm); padding: var(--sp-1) var(--sp-3); font-size: var(--text-base);
59
+ line-height: 1; cursor: pointer; font-family: inherit;
60
+ }
61
+ .topbar button:hover { background: var(--bg-hover); border-color: var(--accent); }
62
+ .nav-toggle { display: none; }
63
+
64
+ /* ── Layout: sticky sidebar TOC + reading-width content ──────────────────── */
65
+ .layout {
66
+ max-width: var(--max-w); margin: 0 auto;
67
+ display: grid; grid-template-columns: var(--rail-w) minmax(0, 1fr);
68
+ gap: var(--sp-8); padding: 0 var(--page-pad);
69
+ }
70
+ .rail {
71
+ position: sticky; top: var(--topbar-h); align-self: start;
72
+ height: calc(100vh - var(--topbar-h)); overflow-y: auto;
73
+ padding: var(--sp-5) 0; border-right: 1px solid var(--border-light);
74
+ }
75
+ .content { min-width: 0; padding: var(--sp-6) 0 var(--sp-10); }
76
+
77
+ /* Backdrop behind the mobile drawer (toggled with the rail via chrome.ts). */
78
+ .rail-backdrop { display: none; }
79
+ /* In-drawer close button — hidden on desktop (the rail is a static sidebar). */
80
+ .rail-close { display: none; }
81
+
82
+ /* ── Table of contents (scrollspy marks a.active) ────────────────────────── */
83
+ nav.toc ul { list-style: none; margin: 0; padding: 0; }
84
+ nav.toc li { margin: 0; }
85
+ nav.toc a {
86
+ display: block; padding: var(--sp-1) var(--sp-3); line-height: 1.35;
87
+ color: var(--text-muted); font-size: var(--text-sm);
88
+ text-decoration: none; border-left: 2px solid transparent;
89
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
90
+ }
91
+ nav.toc a:hover { color: var(--text); background: var(--bg-hover); }
92
+ nav.toc a.active {
93
+ color: var(--accent); border-left-color: var(--accent);
94
+ background: var(--accent-glow); font-weight: var(--fw-medium);
95
+ }
96
+ nav.toc li.toc-3 a { padding-left: var(--sp-6); font-size: var(--text-xs); }
97
+
98
+ /* ── Prose typography ──────────────────────────────────────────────────────*/
99
+ .content h2 {
100
+ font-size: var(--text-xl); letter-spacing: var(--ls-tight);
101
+ margin: var(--sp-8) 0 var(--sp-3); padding-bottom: var(--sp-2);
102
+ border-bottom: 1px solid var(--border-light); scroll-margin-top: calc(var(--topbar-h) + var(--sp-3));
103
+ }
104
+ .content h3 {
105
+ font-size: var(--text-lg); margin: var(--sp-5) 0 var(--sp-2);
106
+ scroll-margin-top: calc(var(--topbar-h) + var(--sp-3));
107
+ }
108
+ .content p { margin: var(--sp-3) 0; line-height: var(--lh-relaxed); }
109
+ .content ul, .content ol { margin: var(--sp-3) 0; padding-left: var(--sp-6); }
110
+ .content li { margin: var(--sp-1) 0; line-height: var(--lh-relaxed); }
111
+ .content blockquote {
112
+ margin: var(--sp-3) 0; padding: var(--sp-1) var(--sp-4);
113
+ border-left: 3px solid var(--border); color: var(--text-muted);
114
+ }
115
+
116
+ /* ── Inline code + code blocks (chrome.ts wraps <pre> in .code + .copy-btn) ──*/
117
+ .content code {
118
+ font-family: var(--font-mono); font-size: 0.85em;
119
+ background: var(--bg-inset); padding: 0.12em 0.4em; border-radius: var(--radius-sm);
120
+ }
121
+ .content .code { position: relative; margin: var(--sp-3) 0; }
122
+ .content .code pre {
123
+ margin: 0; padding: var(--sp-3) var(--sp-4); overflow-x: auto;
124
+ background: var(--bg-inset); border: 1px solid var(--border-light);
125
+ border-radius: var(--radius-sm); font-family: var(--font-mono);
126
+ font-size: var(--text-sm); line-height: var(--lh-relaxed);
127
+ }
128
+ .content .code pre code { background: none; padding: 0; font-size: inherit; }
129
+ .copy-btn {
130
+ position: absolute; top: var(--sp-1); right: var(--sp-1);
131
+ background: var(--bg-card); border: 1px solid var(--border); color: var(--text-muted);
132
+ border-radius: var(--radius-sm); font-size: var(--text-xs); padding: var(--sp-1) var(--sp-2);
133
+ cursor: pointer; opacity: 0.85; font-family: inherit;
134
+ }
135
+ .copy-btn:hover { color: var(--accent); border-color: var(--accent); opacity: 1; }
136
+
137
+ /* ── Callouts ─ (border-color BEFORE border-left-color so the accent wins) ── */
138
+ .callout {
139
+ margin: var(--sp-4) 0; padding: var(--sp-3) var(--sp-4);
140
+ border: 1px solid var(--border); border-left-width: 3px;
141
+ border-radius: var(--radius-sm); background: var(--bg-card);
142
+ }
143
+ .callout > :first-child { margin-top: 0; }
144
+ .callout > :last-child { margin-bottom: 0; }
145
+ .callout-note, .callout-info { background: var(--blue-bg); border-color: var(--blue-border); border-left-color: var(--blue); }
146
+ .callout-tip { background: var(--green-bg); border-color: var(--green-border); border-left-color: var(--green); }
147
+ .callout-warning { background: var(--yellow-bg); border-color: var(--yellow-border); border-left-color: var(--yellow); }
148
+ .callout-danger { background: var(--red-bg); border-color: var(--red-border); border-left-color: var(--red); }
149
+
150
+ /* ── Severity chips (:sev) — tight pill, sub-scale vertical padding ───────── */
151
+ .sev {
152
+ display: inline-block; font-size: var(--text-xs); font-weight: var(--fw-semi);
153
+ padding: 1px var(--sp-2); border-radius: 999px; line-height: 1.5;
154
+ border: 1px solid var(--border); background: var(--bg-inset); color: var(--text-muted);
155
+ white-space: nowrap;
156
+ }
157
+ .sev-p0 { color: var(--sev-p0); border-color: var(--sev-p0); }
158
+ .sev-p1 { color: var(--sev-p1); border-color: var(--sev-p1); }
159
+ .sev-p2 { color: var(--sev-p2); border-color: var(--sev-p2); }
160
+ .sev-p3 { color: var(--sev-p3); border-color: var(--sev-p3); }
161
+ .sev-pass { color: var(--sev-pass); border-color: var(--sev-pass); }
162
+
163
+ /* ── Citations (:cite) — inline provenance refs ──────────────────────────── */
164
+ .fp, .cite-advisory {
165
+ font-family: var(--font-mono); font-size: 0.82em;
166
+ padding: 0.05em 0.35em; border-radius: var(--radius-sm);
167
+ background: var(--bg-inset); border: 1px solid var(--border-light);
168
+ }
169
+ .fp { color: var(--accent); }
170
+ .cite-advisory { color: var(--text-faint); border-style: dashed; }
171
+
172
+ /* ── Tables + filter-tables ──────────────────────────────────────────────── */
173
+ .content table { width: 100%; border-collapse: collapse; margin: var(--sp-3) 0; font-size: var(--text-sm); }
174
+ .content th, .content td { text-align: left; padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--border-light); vertical-align: top; }
175
+ .content th {
176
+ color: var(--text-muted); font-weight: var(--fw-semi); font-size: var(--text-xs);
177
+ text-transform: uppercase; letter-spacing: var(--ls-wide); border-bottom-color: var(--border);
178
+ }
179
+ .content tbody tr:hover { background: var(--bg-hover); }
180
+ .content td code { white-space: nowrap; }
181
+ .filter-table { margin: var(--sp-4) 0; }
182
+ .filter-input {
183
+ width: 100%; max-width: 320px; margin-bottom: var(--sp-2);
184
+ padding: var(--sp-2) var(--sp-3); font-family: inherit; font-size: var(--text-sm);
185
+ color: var(--text); background: var(--bg-card);
186
+ border: 1px solid var(--border); border-radius: var(--radius-sm);
187
+ }
188
+ .filter-input:focus { border-color: var(--accent); }
189
+
190
+ /* ── Charts (:::chart) — label + proportional bar (fill carries inline width%) */
191
+ .chart-block { margin: var(--sp-4) 0; }
192
+ .chart-row {
193
+ display: grid; grid-template-columns: minmax(var(--chart-label-w), 24%) 1fr;
194
+ align-items: center; gap: var(--sp-3); margin: var(--sp-1) 0;
195
+ }
196
+ .chart-label {
197
+ font-size: var(--text-sm); color: var(--text-muted); text-align: right;
198
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
199
+ }
200
+ .chart-row .chart-bar {
201
+ height: 0.9em; min-width: 2px; background: var(--accent);
202
+ border-radius: var(--radius-sm);
203
+ }
204
+
205
+ /* ── Tabs (::::tabs / :::tab) ─────────────────────────────────────────────── */
206
+ .tabs { margin: var(--sp-4) 0; }
207
+ .tablist { display: flex; flex-wrap: wrap; gap: var(--sp-1); border-bottom: 1px solid var(--border); margin-bottom: var(--sp-3); }
208
+ .tab-btn {
209
+ background: none; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px;
210
+ padding: var(--sp-2) var(--sp-3); color: var(--text-muted);
211
+ font-family: inherit; font-size: var(--text-sm); font-weight: var(--fw-medium); cursor: pointer;
212
+ }
213
+ .tab-btn:hover { color: var(--text); }
214
+ .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }
215
+ .tabpane { display: none; }
216
+ .tabpane.active { display: block; }
217
+
218
+ /* ── Mermaid diagrams ────────────────────────────────────────────────────── */
219
+ .content figure { margin: var(--sp-4) 0; text-align: center; }
220
+ .content figure svg, .content > svg, .content .mermaid svg { max-width: 100%; height: auto; }
221
+
222
+ /* ── Index page: category card grid ──────────────────────────────────────── */
223
+ .content .lead { color: var(--text-muted); font-size: var(--text-base); max-width: 60ch; margin-top: var(--sp-2); }
224
+ .guide-cards {
225
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(min(var(--card-min), 100%), 1fr));
226
+ gap: var(--sp-4); margin: var(--sp-4) 0 var(--sp-6);
227
+ }
228
+ .guide-card {
229
+ display: flex; flex-direction: column; gap: var(--sp-2);
230
+ padding: var(--sp-4); background: var(--bg-card);
231
+ border: 1px solid var(--border); border-radius: var(--radius);
232
+ color: inherit; text-decoration: none;
233
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
234
+ }
235
+ .guide-card:hover { border-color: var(--accent); box-shadow: var(--shadow-md); text-decoration: none; }
236
+ .guide-card-title { font-weight: var(--fw-semi); color: var(--accent); font-size: var(--text-base); }
237
+ .guide-card-desc { color: var(--text-muted); font-size: var(--text-sm); line-height: var(--lh-normal); }
238
+
239
+ /* ── Responsive: TOC becomes an off-canvas drawer (chrome.ts toggles .open) ──*/
240
+ /* 860px is literal — media queries cannot read custom properties. Revisit it if
241
+ --topbar-h / --rail-w / --drawer-w change (the drawer sticky offsets key off them). */
242
+ @media (max-width: 860px) {
243
+ .nav-toggle { display: inline-flex; align-items: center; }
244
+ .layout { grid-template-columns: 1fr; gap: 0; }
245
+ .rail {
246
+ position: fixed; top: var(--topbar-h); left: 0; bottom: 0; width: var(--drawer-w); z-index: 50;
247
+ height: auto; background: var(--bg-card); border-right: 1px solid var(--border);
248
+ padding: var(--sp-4); box-shadow: var(--shadow-lg);
249
+ transform: translateX(-100%); transition: transform 0.2s ease, visibility 0.2s ease;
250
+ /* Closed drawer is off-screen AND removed from tab order / pointer events. */
251
+ visibility: hidden; pointer-events: none;
252
+ }
253
+ .rail.open { transform: translateX(0); visibility: visible; pointer-events: auto; }
254
+ .rail-close {
255
+ display: block; margin-left: auto; margin-bottom: var(--sp-2);
256
+ background: var(--bg-card); border: 1px solid var(--border); color: var(--text);
257
+ border-radius: var(--radius-sm); padding: var(--sp-1) var(--sp-3); font-size: var(--text-base);
258
+ line-height: 1; cursor: pointer; font-family: inherit;
259
+ }
260
+ .rail-close:hover { background: var(--bg-hover); border-color: var(--accent); }
261
+ .rail-close:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
262
+ .rail-backdrop {
263
+ display: block; position: fixed; inset: var(--topbar-h) 0 0 0;
264
+ background: var(--scrim); z-index: 49;
265
+ opacity: 0; pointer-events: none; transition: opacity 0.2s ease;
266
+ }
267
+ .rail.open ~ .rail-backdrop { opacity: 1; pointer-events: auto; }
268
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAG5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAa1E"}
1
+ {"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAkB5C,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAsC1E"}
@@ -1,14 +1,47 @@
1
1
  import { wrapInChrome, esc } from './template.js';
2
+ const CATEGORY_ORDER = ['concepts', 'reference', 'workflows', 'tools'];
3
+ const CATEGORY_LABEL = {
4
+ concepts: 'Concepts',
5
+ reference: 'Reference',
6
+ workflows: 'Workflows',
7
+ tools: 'Tools',
8
+ };
9
+ function catLabel(c) {
10
+ return CATEGORY_LABEL[c] ?? c.charAt(0).toUpperCase() + c.slice(1);
11
+ }
12
+ function catId(c) {
13
+ return 'cat-' + c.toLowerCase().replace(/[^a-z0-9]+/g, '-');
14
+ }
2
15
  export function renderIndexPage(entries, css) {
3
16
  const sorted = [...entries].sort((a, b) => a.frontmatter.order - b.frontmatter.order);
4
- const items = sorted.map((e) => `<li><a href="${e.topic}/index.html"><strong>${esc(e.frontmatter.title)}</strong></a>` +
5
- `<span class="cat">${esc(e.frontmatter.category)}</span>` +
6
- `<p>${esc(e.frontmatter.description)}</p></li>`).join('');
7
- return wrapInChrome({
8
- title: 'Scaffold Guides',
9
- body: `<h2 id="guides">Guides</h2><ul class="guide-index">${items}</ul>`,
10
- headings: [{ depth: 2, text: 'Guides', id: 'guides' }],
11
- css,
17
+ // Group by category, preserving order within each group.
18
+ const byCat = new Map();
19
+ for (const e of sorted) {
20
+ const c = e.frontmatter.category;
21
+ if (!byCat.has(c))
22
+ byCat.set(c, []);
23
+ byCat.get(c).push(e);
24
+ }
25
+ const cats = [...byCat.keys()].sort((a, b) => {
26
+ const ia = CATEGORY_ORDER.indexOf(a);
27
+ const ib = CATEGORY_ORDER.indexOf(b);
28
+ return (ia < 0 ? 99 : ia) - (ib < 0 ? 99 : ib);
12
29
  });
30
+ const headings = cats.map((c) => ({ depth: 2, text: catLabel(c), id: catId(c) }));
31
+ const sections = cats
32
+ .map((c) => {
33
+ const cards = byCat
34
+ .get(c)
35
+ .map((e) => `<a class="guide-card" href="${e.topic}/index.html">` +
36
+ `<span class="guide-card-title">${esc(e.frontmatter.title)}</span>` +
37
+ `<span class="guide-card-desc">${esc(e.frontmatter.description)}</span></a>`)
38
+ .join('');
39
+ return `<h2 id="${catId(c)}">${esc(catLabel(c))}</h2><div class="guide-cards">${cards}</div>`;
40
+ })
41
+ .join('');
42
+ const intro = '<p class="lead">Reference guides for Scaffold — human- and agent-readable. ' +
43
+ 'Open a guide to read it in your browser; agents read the markdown source with ' +
44
+ '<code>scaffold guides &lt;topic&gt; --markdown</code>.</p>';
45
+ return wrapInChrome({ title: 'Scaffold Guides', body: intro + sections, headings, css });
13
46
  }
14
47
  //# sourceMappingURL=index-page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAEjD,MAAM,UAAU,eAAe,CAAC,OAAqB,EAAE,GAAW;IAChE,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACrF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,gBAAgB,CAAC,CAAC,KAAK,wBAAwB,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe;QACtF,qBAAqB,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS;QACzD,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAChD,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACV,OAAO,YAAY,CAAC;QAClB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,sDAAsD,KAAK,OAAO;QACxE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QACtD,GAAG;KACJ,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/guides/index-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Return the targets of relative links/images/reference-definitions in
3
+ * `markdown` that do not resolve on disk relative to `guideDir`.
4
+ *
5
+ * Parses the markdown body (frontmatter stripped) to an mdast and inspects only
6
+ * `link`, `image`, and `definition` nodes, so link-like text in code blocks,
7
+ * inline code, or frontmatter is never flagged, and reference-style links are
8
+ * covered. External URLs (`http:`, `mailto:`, …), protocol-relative (`//`), and
9
+ * pure anchors (`#…`) are ignored. A trailing `#anchor` is stripped and the
10
+ * target is percent-decoded before resolving. A `…/index.html` link is accepted
11
+ * when the `index.md` source exists (the HTML may not be built yet, e.g. a stub).
12
+ */
13
+ export declare function findBrokenRelativeLinks(markdown: string, guideDir: string): string[];
14
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/guides/links.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAgCpF"}
@@ -0,0 +1,56 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { unified } from 'unified';
4
+ import remarkParse from 'remark-parse';
5
+ import remarkGfm from 'remark-gfm';
6
+ import { visit } from 'unist-util-visit';
7
+ import { stripFrontmatter } from './render.js';
8
+ /**
9
+ * Return the targets of relative links/images/reference-definitions in
10
+ * `markdown` that do not resolve on disk relative to `guideDir`.
11
+ *
12
+ * Parses the markdown body (frontmatter stripped) to an mdast and inspects only
13
+ * `link`, `image`, and `definition` nodes, so link-like text in code blocks,
14
+ * inline code, or frontmatter is never flagged, and reference-style links are
15
+ * covered. External URLs (`http:`, `mailto:`, …), protocol-relative (`//`), and
16
+ * pure anchors (`#…`) are ignored. A trailing `#anchor` is stripped and the
17
+ * target is percent-decoded before resolving. A `…/index.html` link is accepted
18
+ * when the `index.md` source exists (the HTML may not be built yet, e.g. a stub).
19
+ */
20
+ export function findBrokenRelativeLinks(markdown, guideDir) {
21
+ const tree = unified().use(remarkParse).use(remarkGfm).parse(stripFrontmatter(markdown));
22
+ const urls = [];
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ visit(tree, (node) => {
25
+ if ((node.type === 'link' || node.type === 'image' || node.type === 'definition') &&
26
+ typeof node.url === 'string') {
27
+ urls.push(node.url);
28
+ }
29
+ });
30
+ const broken = [];
31
+ for (const raw of urls) {
32
+ const trimmed = raw.trim();
33
+ if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed))
34
+ continue; // http:, https:, mailto:, …
35
+ if (trimmed.startsWith('#') || trimmed.startsWith('//'))
36
+ continue;
37
+ const target = trimmed.split('#')[0];
38
+ if (!target)
39
+ continue;
40
+ let decoded;
41
+ try {
42
+ decoded = decodeURIComponent(target);
43
+ }
44
+ catch {
45
+ decoded = target;
46
+ }
47
+ const abs = path.resolve(guideDir, decoded);
48
+ if (fs.existsSync(abs))
49
+ continue;
50
+ if (decoded.endsWith('index.html') && fs.existsSync(abs.replace(/index\.html$/, 'index.md')))
51
+ continue;
52
+ broken.push(raw);
53
+ }
54
+ return broken;
55
+ }
56
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/guides/links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IACxE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,8DAA8D;IAC9D,KAAK,CAAC,IAAI,EAAE,CAAC,IAAS,EAAE,EAAE;QACxB,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;YAC7E,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAC5B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;QAC1B,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAQ,CAAC,4BAA4B;QAC/E,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAQ;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM;YAAE,SAAQ;QACrB,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,MAAM,CAAA;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAAE,SAAQ;QACtG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=links.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.test.d.ts","sourceRoot":"","sources":["../../src/guides/links.test.ts"],"names":[],"mappings":""}