@nanisoft/prism-llms 0.4.0 → 0.5.1

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 (175) hide show
  1. package/README.md +88 -0
  2. package/THIRD-PARTY-NOTICES.md +48 -0
  3. package/dist/data.json +4037 -386
  4. package/dist/demo-graph.d.ts +21 -12
  5. package/dist/demo-graph.js +37 -21
  6. package/dist/extractor.d.ts +24 -17
  7. package/dist/extractor.js +299 -156
  8. package/dist/index.d.ts +12 -7
  9. package/dist/index.js +9 -7
  10. package/dist/llms-full.txt +8248 -2013
  11. package/dist/llms.txt +98 -93
  12. package/dist/markdown.d.ts +69 -23
  13. package/dist/markdown.js +131 -72
  14. package/dist/md/blocks/app-shell-01.md +135 -0
  15. package/dist/md/blocks/auth-form-01.md +135 -0
  16. package/dist/md/blocks/cta-01.md +88 -0
  17. package/dist/md/blocks/data-table-01.md +196 -0
  18. package/dist/md/blocks/feature-grid-01.md +92 -0
  19. package/dist/md/blocks/hero-01.md +90 -0
  20. package/dist/md/blocks/instrument-panel-01.md +109 -0
  21. package/dist/md/blocks/logo-strip-01.md +97 -0
  22. package/dist/md/blocks/note-grid-01.md +98 -0
  23. package/dist/md/blocks/page-header-01.md +97 -0
  24. package/dist/md/blocks/pricing-01.md +91 -0
  25. package/dist/md/blocks/process-rail-01.md +106 -0
  26. package/dist/md/blocks/product-grid-01.md +107 -0
  27. package/dist/md/blocks/settings-panel-01.md +146 -0
  28. package/dist/md/blocks/site-footer.md +103 -11
  29. package/dist/md/blocks/site-header.md +107 -11
  30. package/dist/md/blocks/stack-grid-01.md +108 -0
  31. package/dist/md/blocks/stats-01.md +89 -0
  32. package/dist/md/blocks/status-ledger-01.md +121 -0
  33. package/dist/md/changelogs/prism-llms.md +244 -0
  34. package/dist/md/changelogs/prism-mcp-server.md +95 -0
  35. package/dist/md/changelogs/prism-tokens.md +126 -0
  36. package/dist/md/changelogs/prism-ui.md +467 -0
  37. package/dist/md/components/accordion.md +108 -0
  38. package/dist/md/components/alert.md +90 -7
  39. package/dist/md/components/avatar.md +89 -7
  40. package/dist/md/components/badge.md +74 -7
  41. package/dist/md/components/breadcrumb.md +84 -7
  42. package/dist/md/components/button.md +90 -7
  43. package/dist/md/components/card.md +90 -7
  44. package/dist/md/components/checkbox.md +101 -7
  45. package/dist/md/components/cta-link.md +98 -0
  46. package/dist/md/components/diagram.md +124 -0
  47. package/dist/md/components/dialog.md +128 -0
  48. package/dist/md/components/dropdown-menu.md +125 -0
  49. package/dist/md/components/fact-list.md +85 -0
  50. package/dist/md/components/field.md +116 -0
  51. package/dist/md/components/input.md +86 -7
  52. package/dist/md/components/kbd.md +77 -0
  53. package/dist/md/components/pagination.md +95 -7
  54. package/dist/md/components/popover.md +95 -7
  55. package/dist/md/components/product-mark.md +114 -0
  56. package/dist/md/components/product-switcher.md +88 -0
  57. package/dist/md/components/progress.md +88 -7
  58. package/dist/md/components/prose.md +91 -0
  59. package/dist/md/components/radio-group.md +111 -0
  60. package/dist/md/components/section.md +91 -0
  61. package/dist/md/components/select.md +143 -7
  62. package/dist/md/components/separator.md +77 -0
  63. package/dist/md/components/skeleton.md +71 -7
  64. package/dist/md/components/slider.md +90 -7
  65. package/dist/md/components/switch.md +104 -7
  66. package/dist/md/components/table.md +104 -7
  67. package/dist/md/components/tabs.md +105 -7
  68. package/dist/md/components/textarea.md +101 -0
  69. package/dist/md/components/tooltip.md +95 -7
  70. package/dist/md/components/typography.md +82 -7
  71. package/dist/md/content/about-content.md +36 -0
  72. package/dist/md/content/audience.md +43 -0
  73. package/dist/md/content/glossary.md +69 -0
  74. package/dist/md/content/product-vocabulary.md +53 -0
  75. package/dist/md/content/voice.md +52 -0
  76. package/dist/md/content/writing-mechanics.md +58 -0
  77. package/dist/md/foundation/colors.md +10 -0
  78. package/dist/md/foundation/iconography.md +14 -0
  79. package/dist/md/foundation/motion.md +10 -0
  80. package/dist/md/foundation/radii.md +9 -0
  81. package/dist/md/foundation/shadows.md +9 -0
  82. package/dist/md/foundation/spacings.md +8 -0
  83. package/dist/md/foundation/typography.md +9 -0
  84. package/dist/md/foundation/variables.md +9 -0
  85. package/dist/md/overview/architecture.md +76 -0
  86. package/dist/md/overview/brand.md +41 -0
  87. package/dist/md/overview/composition.md +77 -0
  88. package/dist/md/overview/quickstart.md +97 -0
  89. package/dist/md/overview/theming.md +89 -0
  90. package/dist/md/overview/using-llms.md +83 -0
  91. package/dist/md/pages/auth-page.md +149 -0
  92. package/dist/md/pages/blog-post-page.md +136 -0
  93. package/dist/md/pages/dashboard-page.md +241 -0
  94. package/dist/md/pages/docs-shell.md +210 -15
  95. package/dist/md/pages/marketing-page.md +199 -0
  96. package/dist/md/pages/not-found-page.md +105 -0
  97. package/dist/md/pages/settings-page.md +206 -0
  98. package/dist/prism-skill.md +50 -0
  99. package/dist/store.d.ts +203 -0
  100. package/dist/store.js +317 -0
  101. package/package.json +29 -26
  102. package/dist/demo-graph.d.ts.map +0 -1
  103. package/dist/demo-graph.js.map +0 -1
  104. package/dist/extractor.d.ts.map +0 -1
  105. package/dist/extractor.js.map +0 -1
  106. package/dist/index.d.ts.map +0 -1
  107. package/dist/index.js.map +0 -1
  108. package/dist/markdown.d.ts.map +0 -1
  109. package/dist/markdown.js.map +0 -1
  110. package/dist/md/blocks/component-demo.md +0 -19
  111. package/dist/md/blocks/page-header.md +0 -19
  112. package/dist/md/components/affix.md +0 -14
  113. package/dist/md/components/anchor.md +0 -14
  114. package/dist/md/components/auto-complete.md +0 -14
  115. package/dist/md/components/back-top.md +0 -14
  116. package/dist/md/components/border-beam.md +0 -14
  117. package/dist/md/components/calendar.md +0 -14
  118. package/dist/md/components/carousel.md +0 -14
  119. package/dist/md/components/cascader.md +0 -14
  120. package/dist/md/components/col.md +0 -14
  121. package/dist/md/components/collapse.md +0 -14
  122. package/dist/md/components/color-picker.md +0 -14
  123. package/dist/md/components/date-picker.md +0 -14
  124. package/dist/md/components/descriptions.md +0 -14
  125. package/dist/md/components/display-title.md +0 -20
  126. package/dist/md/components/divider.md +0 -14
  127. package/dist/md/components/drawer.md +0 -14
  128. package/dist/md/components/dropdown.md +0 -14
  129. package/dist/md/components/empty.md +0 -14
  130. package/dist/md/components/flex.md +0 -14
  131. package/dist/md/components/float-button.md +0 -14
  132. package/dist/md/components/form.md +0 -14
  133. package/dist/md/components/grid.md +0 -14
  134. package/dist/md/components/image.md +0 -14
  135. package/dist/md/components/input-number.md +0 -14
  136. package/dist/md/components/layout.md +0 -14
  137. package/dist/md/components/list.md +0 -14
  138. package/dist/md/components/listy.md +0 -14
  139. package/dist/md/components/masonry.md +0 -14
  140. package/dist/md/components/mentions.md +0 -14
  141. package/dist/md/components/menu.md +0 -14
  142. package/dist/md/components/modal.md +0 -14
  143. package/dist/md/components/popconfirm.md +0 -14
  144. package/dist/md/components/qrcode.md +0 -14
  145. package/dist/md/components/radio.md +0 -14
  146. package/dist/md/components/rate.md +0 -14
  147. package/dist/md/components/result.md +0 -14
  148. package/dist/md/components/row.md +0 -14
  149. package/dist/md/components/segmented.md +0 -14
  150. package/dist/md/components/space.md +0 -14
  151. package/dist/md/components/spin.md +0 -14
  152. package/dist/md/components/splitter.md +0 -14
  153. package/dist/md/components/statistic.md +0 -14
  154. package/dist/md/components/steps.md +0 -14
  155. package/dist/md/components/tag.md +0 -14
  156. package/dist/md/components/time-picker.md +0 -14
  157. package/dist/md/components/timeline.md +0 -14
  158. package/dist/md/components/tour.md +0 -14
  159. package/dist/md/components/transfer.md +0 -14
  160. package/dist/md/components/tree-select.md +0 -14
  161. package/dist/md/components/tree.md +0 -14
  162. package/dist/md/components/upload.md +0 -14
  163. package/dist/md/components/watermark.md +0 -14
  164. package/dist/md/docs/brand.md +0 -41
  165. package/dist/md/pages/blog-layout.md +0 -19
  166. package/dist/md/theme/blue-dark.md +0 -127
  167. package/dist/md/theme/blue-light.md +0 -129
  168. package/dist/md/theme/green-dark.md +0 -127
  169. package/dist/md/theme/green-light.md +0 -129
  170. package/dist/md/theme/lavender-dark.md +0 -127
  171. package/dist/md/theme/lavender-light.md +0 -129
  172. package/dist/md/theme/peach-dark.md +0 -127
  173. package/dist/md/theme/peach-light.md +0 -129
  174. package/dist/md/theme/rose-dark.md +0 -127
  175. package/dist/md/theme/rose-light.md +0 -129
@@ -0,0 +1,108 @@
1
+ # StackGrid01
2
+
3
+ A survey of what a product is assembled from, and a second grid of what it built itself.
4
+
5
+ ```tsx
6
+ import { StackGrid01 } from '@nanisoft/prism-ui/blocks/stack-grid-01'
7
+ ```
8
+
9
+ ## Overview
10
+
11
+ StackGrid01 is a survey of what a product is assembled from, and what it built
12
+ itself. The composed parts sit in one grid, each a name and a role; the in-house
13
+ work sits in a second grid, each a name and a line about it.
14
+
15
+ Three of the four NaniSoft sites publish this section, and each one drew it by
16
+ hand with the same two groups. Three of them also drew the second group
17
+ differently from the first - a dashed border, a different tile, a mark above the
18
+ name - because the visual difference is the claim: *this part is ours*.
19
+
20
+ That is what the `own` group is here. It is a separate prop and a separate grid
21
+ rather than a flag on the part, because the difference is a claim about provenance
22
+ and a claim is not a property of a row: a part that is assembled and a part that is
23
+ built are the same kind of thing with a different answer to "who wrote it".
24
+
25
+ ## Guidelines
26
+
27
+ ### When to use
28
+
29
+ Use StackGrid01 where a reader's question is "what is this made of" and the honest
30
+ answer is mostly other people's work with a few exceptions.
31
+
32
+ Use it when the exceptions are the point. If everything in the grid is composed,
33
+ drop `own` and use `NoteGrid01` instead: a second group with nothing in it is a
34
+ claim you have not made.
35
+
36
+ ### When not to use
37
+
38
+ Do not use it for integrations the reader connects themselves. That is a
39
+ `ProductGrid01` of destinations, and a survey of parts is not a survey of things
40
+ you can turn on.
41
+
42
+ Do not use it where you cannot substantiate the in-house group. The block requires
43
+ `ownLabel` precisely because the group is a claim, and a claim nobody can check
44
+ is marketing.
45
+
46
+ ### Best practices
47
+
48
+ - Pass the words you mean for the claim. Three of the four sites write three
49
+ different ones - "built in-house", "built by Nanisoft", "our own" - and the
50
+ block does not choose between them.
51
+ - Keep a role to a phrase. The grid is a survey of what a product stands on, not a
52
+ feature list, and a role that runs to a sentence turns a survey into prose.
53
+ - Order the composed parts by how much of the product they carry.
54
+
55
+ ### Content guidelines
56
+
57
+ - Use each part's own name, as its authors spell it.
58
+ - Write a role as what the part does *here*, not as what the part is generally
59
+ capable of.
60
+ - Write a blurb as why it is not assembled. That is the question the group raises.
61
+
62
+ **Two groups: the parts it stands on, and the two it built itself.**
63
+
64
+ ```tsx
65
+ import { StackGrid01 } from '@nanisoft/prism-ui/blocks/stack-grid-01'
66
+
67
+ /** Two groups: the parts it stands on, and the two it built itself. */
68
+ export default function StackGrid01Demo() {
69
+ return (
70
+ <StackGrid01
71
+ headingLevel="h3"
72
+ eyebrow="Preview"
73
+ title="How it is built"
74
+ description="Most of it is composition. Two things are not."
75
+ ownLabel="built in-house"
76
+ caption="Everything else in the factory is composition."
77
+ parts={[
78
+ { name: 'Postgres', role: 'Storage' },
79
+ { name: 'NATS', role: 'Queue' },
80
+ { name: 'Docker', role: 'Isolation' },
81
+ { name: 'OpenCode', role: 'The agent' },
82
+ ]}
83
+ own={[
84
+ { name: 'The orchestrator', blurb: 'Decides what runs next, and what waits.' },
85
+ { name: 'The merge pipeline', blurb: 'Three review rounds, then auto-merge.' },
86
+ ]}
87
+ />
88
+ )
89
+ }
90
+ ```
91
+
92
+ ## Props
93
+
94
+ **`eyebrow`** `string` · optional · default: — — Optional label above the section title. See the No-Default-Eyebrow Rule.
95
+ **`title`** `string` · optional · default: — — The section title. Omit it for a grid composed under its own heading.
96
+ **`description`** `string` · optional · default: — — One or two sentences under the title.
97
+ **`parts`** `readonly StackPart[]` · required · default: — — The parts the product is assembled from, in the order a reader should meet them. Order is the caller's because it is a claim about which part matters first.
98
+ **`own`** `readonly StackOwn[]` · optional · default: — — The things the product built itself, in the order a reader should meet them. Omit it for a product that assembled everything, and pass it when the claim is that some of the work is its own.
99
+ **`ownLabel`** `string` · optional · default: — — The label on the in-house group, which is the claim the group makes. Omit it when the group is titled by the section itself, and pass a word you mean: "built in-house", "built by Nanisoft" and "our own" are three different claims and the Block does not choose between them.
100
+ **`caption`** `string` · optional · default: — — The line under the grid, for the sentence that qualifies it: what is not here, or where to read the full list.
101
+ **`headingLevel`** `HeadingLevel` · optional · default: — — Heading level for the section title. See `HeadingLevel`.
102
+ **`className`** `string` · optional · default: — — Layout only, exactly as on every Component. Changing a Prism-owned visual property from here is prohibited.
103
+
104
+ ## Composition
105
+
106
+ **`exports`** `StackGrid01` — the public runtime names this Block promises
107
+ **`source`** `packages/ui/src/blocks/stack-grid-01/index.tsx` — the file this Block is defined in
108
+ **`dependencies`** `Card, Section` — the public Prism exports this item composes
@@ -0,0 +1,89 @@
1
+ # Stats01
2
+
3
+ A KPI row with optional directional deltas.
4
+
5
+ ```tsx
6
+ import { Stats01 } from '@nanisoft/prism-ui/blocks/stats-01'
7
+ ```
8
+
9
+ ## Overview
10
+
11
+ Stats01 is a row of key figures. Each stat carries a label, a value, and
12
+ optionally a delta and a hint. The delta renders a direction and a percentage;
13
+ the hint names the period it compares against.
14
+
15
+ Every number is a prop. The block previously carried invented figures and a
16
+ hardcoded heading, which meant a consumer who installed it shipped fabricated
17
+ metrics into their own dashboard.
18
+
19
+ ## Guidelines
20
+
21
+ ### When to use
22
+
23
+ Use Stats01 to summarise two to four figures that a reader should compare at a
24
+ glance. It works best when the figures share a unit and a period.
25
+
26
+ ### When not to use
27
+
28
+ Do not use it for a single figure. One stat in a four-column grid leaves an
29
+ awkward empty row and overstates the number's importance.
30
+
31
+ Do not use it for figures that need a trend over time. A delta is a comparison
32
+ between two points, not a series; use a chart for a series.
33
+
34
+ Do not use it when the numbers do not share a period. Mixing "this month" with
35
+ "this quarter" in one row invites a false comparison.
36
+
37
+ ### Best practices
38
+
39
+ - Give every delta a hint. A percentage with no period is unreadable, because
40
+ the reader cannot tell what it compares against.
41
+ - Omit `delta` rather than passing `0` when a figure has no meaningful change.
42
+ A zero delta renders a neutral marker, which is correct only when the value
43
+ truly held.
44
+ - Keep the label short and the value exact. The reader is scanning, not reading.
45
+ - Use three or four stats. Two fits, one does not.
46
+
47
+ ### Content guidelines
48
+
49
+ - A label is a noun phrase in sentence case: "Active projects".
50
+ - A hint names the comparison and the period: "vs last month", "vs last
51
+ quarter".
52
+ - Format the value for the reader: thousands separators, one unit, and no more
53
+ precision than the source supports.
54
+
55
+ **The KPI row, with one of each delta direction and one figure with none.**
56
+
57
+ ```tsx
58
+ import { Stats01 } from '@nanisoft/prism-ui/blocks/stats-01'
59
+
60
+ /** The KPI row, with one of each delta direction and one figure with none. */
61
+ export default function Stats01Demo() {
62
+ return (
63
+ <Stats01
64
+ headingLevel="h3"
65
+ eyebrow="Preview"
66
+ title="Section heading"
67
+ stats={[
68
+ { label: 'First metric', value: '1,284', delta: 12, hint: 'vs last month' },
69
+ { label: 'Second metric', value: '47.2%', delta: -3, hint: 'vs last month' },
70
+ { label: 'Third metric', value: '2.4d', delta: 0, hint: 'vs last quarter' },
71
+ { label: 'Fourth metric', value: '138' },
72
+ ]}
73
+ />
74
+ )
75
+ }
76
+ ```
77
+
78
+ ## Props
79
+
80
+ **`eyebrow`** `string` · optional · default: —
81
+ **`title`** `string` · optional · default: —
82
+ **`stats`** `Stat[]` · required · default: —
83
+ **`headingLevel`** `HeadingLevel` · optional · default: — — Heading level for the section title. See `HeadingLevel`.
84
+
85
+ ## Composition
86
+
87
+ **`exports`** `Stats01` — the public runtime names this Block promises
88
+ **`source`** `packages/ui/src/blocks/stats-01/index.tsx` — the file this Block is defined in
89
+ **`dependencies`** `Card, Section` — the public Prism exports this item composes
@@ -0,0 +1,121 @@
1
+ # StatusLedger01
2
+
3
+ A ledger of things and the state each is in: a name, one of four status tiers and the words for that tier.
4
+
5
+ ```tsx
6
+ import { StatusLedger01 } from '@nanisoft/prism-ui/blocks/status-ledger-01'
7
+ ```
8
+
9
+ ## Overview
10
+
11
+ StatusLedger01 is a ledger of things and the state each is in: a hairline row per
12
+ entry, a mark for the tier, and the words for the state beside the name.
13
+
14
+ All four NaniSoft sites publish this section, and three of them publish it as a
15
+ ledger of rows while the fourth publishes the same shape as a list of products;
16
+ the ledger appears twice in the fourth site as well, once for use cases and once
17
+ for research directions. Five ledgers across four sites, each one written by hand,
18
+ each one re-deciding the same four things: which tier words to use, how the tier
19
+ is drawn, whether the tier is announced, and whether the row carries a detail
20
+ line or a bullet list.
21
+
22
+ **The tier is four and the words are the caller's.** The `status` prop takes one
23
+ of four tiers and the `statusLabel` prop takes the words. That split is the whole
24
+ design: the tier is a colour, and colour is not information a reader can act on;
25
+ the words are the information, and the words belong to the product.
26
+
27
+ The four tiers are `live`, `designed`, `planned` and `direction`. Between them the
28
+ four sites use eight different words for those four states - `live`, `available`
29
+ and `complete` all mean the first; `approved`, `specified` and `designed` all mean
30
+ the second - and that vocabulary is what `statusLabel` is for.
31
+
32
+ ## Guidelines
33
+
34
+ ### When to use
35
+
36
+ Use StatusLedger01 when a reader needs to know how far along each of several
37
+ things is, and the difference between the states is the point.
38
+
39
+ Use it when the states are not all the same. A ledger of four rows that are all
40
+ `live` is a list with a column in it, and a plain list says that more plainly.
41
+
42
+ ### When not to use
43
+
44
+ Do not use it for a list of things that are all available. `NoteGrid01` is for
45
+ that, and a ledger of green dots is a decoration.
46
+
47
+ Do not use it for a plan with dates. A tier says where a thing stands, not when it
48
+ will move, and a ledger cannot say when.
49
+
50
+ Do not use it to compare products. A comparison has a row per product and a column
51
+ per fact, and this is the other way round.
52
+
53
+ ### Best practices
54
+
55
+ - Order the rows by state, most available first, when the reader's question is
56
+ "what can I use". Order them by importance when it is not.
57
+ - Write `statusLabel` as the sentence you would say out loud. It is the state a
58
+ screen reader hears, so "Planned" is better than a bare dot and "Available in
59
+ Q3" is better than "Planned" if that is the truth.
60
+ - The dot is `aria-hidden` on purpose. Nothing in a row depends on a reader being
61
+ able to see it, and that is the rule to keep if you fork the design.
62
+ - Prefer a `detail` line to a bullet list unless the row really lists things. A
63
+ row with four bullets and a row with one sentence beside it are hard to scan
64
+ together.
65
+
66
+ ### Content guidelines
67
+
68
+ - Keep a name to one or two words. It is the anchor of the row.
69
+ - Do not put the state in the name as well as in the label. "Live capture" beside
70
+ "Available" says the same thing twice.
71
+ - A row with no detail and no bullets is a valid row, and most rows should be.
72
+
73
+ **Four rows, one per tier, with the caller's own words for each state.**
74
+
75
+ ```tsx
76
+ import { StatusLedger01 } from '@nanisoft/prism-ui/blocks/status-ledger-01'
77
+
78
+ /** Four rows, one per tier, with the caller's own words for each state. */
79
+ export default function StatusLedger01Demo() {
80
+ return (
81
+ <StatusLedger01
82
+ headingLevel="h3"
83
+ eyebrow="Preview"
84
+ title="What it captures"
85
+ description="The tiers are the colour; the words beside them are the information."
86
+ caption="A research direction is named as one. It is not a shipped capability."
87
+ rows={[
88
+ {
89
+ name: 'Access traversal',
90
+ status: 'live',
91
+ statusLabel: 'Flagship - available today',
92
+ detail: 'Every path between a person and a sensitive product.',
93
+ },
94
+ {
95
+ name: 'Containment rehearsal',
96
+ status: 'designed',
97
+ statusLabel: 'Specified, not built',
98
+ bullets: ['Rehearse before you need it.', 'Against the graph you have.'],
99
+ },
100
+ { name: 'Privilege hygiene', status: 'planned', statusLabel: 'Planned' },
101
+ { name: 'Strategy backtesting', status: 'direction', statusLabel: 'Research direction' },
102
+ ]}
103
+ />
104
+ )
105
+ }
106
+ ```
107
+
108
+ ## Props
109
+
110
+ **`eyebrow`** `string` · optional · default: — — Optional label above the section title. See the No-Default-Eyebrow Rule.
111
+ **`title`** `string` · optional · default: — — The section title. Omit it for a ledger composed under its own heading.
112
+ **`description`** `string` · optional · default: — — One or two sentences under the title.
113
+ **`rows`** `readonly StatusRow[]` · required · default: — — The rows, in the order a reader should meet them. Order is the caller's because it is a claim about what matters first, and a ledger that sorted itself would be making that claim on the caller's behalf.
114
+ **`caption`** `string` · optional · default: — — The line under the ledger, for the sentence that qualifies it: what is not here, or where to read more.
115
+ **`headingLevel`** `HeadingLevel` · optional · default: — — Heading level for the section title. See `HeadingLevel`.
116
+
117
+ ## Composition
118
+
119
+ **`exports`** `StatusLedger01` — the public runtime names this Block promises
120
+ **`source`** `packages/ui/src/blocks/status-ledger-01/index.tsx` — the file this Block is defined in
121
+ **`dependencies`** `Section` — the public Prism exports this item composes
@@ -0,0 +1,244 @@
1
+ # @nanisoft/prism-llms
2
+
3
+ ## 0.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 5c43520: Add `DocsShell`, a documentation page that takes a site's navigation as data
8
+
9
+ `DocsShell` is a documentation screen: a navigation rail, the document, a
10
+ contents rail, and a pager to the neighbouring pages. It replaces the unstyled
11
+ `docs-shell` the retired line published, and it is the Page the three NaniSoft
12
+ product sites already import by that name.
13
+
14
+ The navigation is data. A tree of one page and a tree of twenty-seven render the
15
+ same way, at any depth, and the frame is sized by what the caller passed rather
16
+ than by a fixed arrangement, so three sites whose documentation sets differ in
17
+ shape share one Page with no per-site fork.
18
+
19
+ - `nav` and `toc` are closed unions of `page`, `group` and `divider`. Both are
20
+ read in the order given: nothing is sorted or alphabetised, so a site that
21
+ files its rail as a pipeline and its contents as a reference has both in one
22
+ render.
23
+ - The pager is derived from `nav` and `currentHref`. There is no `neighbours`
24
+ prop, so a neighbour that is not in the tree cannot be expressed, and each
25
+ consumer loses one derivation of its own.
26
+ - A group with no `href` renders a `span` rather than an anchor with no
27
+ destination. The three sites spell that case today as an empty string, and two
28
+ of them carry a stylesheet rule that styles the result back into a label; those
29
+ rules are now deletable.
30
+ - A section carries no status, no badge, no count, no collapse and no sort. A
31
+ status written into a title stays in the title as words.
32
+ - Both rails are bounded against the viewport, because one site's tree is half
33
+ again as tall as another's.
34
+
35
+ The corpus fix that shipped with it: the props extractor read each declaration
36
+ body twice with two depth counters that disagreed, so a Page whose `index.tsx`
37
+ re-exported a value and a type from one sibling published every prop twice and
38
+ swept the members of its navigation union into its own prop list. It now reads
39
+ each body once.
40
+
41
+ ## 0.5.0
42
+
43
+ ### Minor Changes
44
+
45
+ - 76c8d96: Fourteen items, four catalogue gates, and a Block that publishes its interface
46
+
47
+ **Fourteen items ship.** Three Components (`Prose`, `FactList`, `ProductSwitcher`),
48
+ nine Blocks (`ProcessRail01`, `StatusLedger01`, `ProductGrid01`, `StackGrid01`,
49
+ `LogoStrip01`, `NoteGrid01`, `InstrumentPanel01`, `SiteHeader`, `SiteFooter`) and two
50
+ Pages (`NotFoundPage`, `BlogPostPage`). Every one of them earns its place by the
51
+ growth rule rather than by taste: a marketing Block when at least three of the four
52
+ sites compose that section today, a Component when it has one job no existing
53
+ Component can express. The evidence is in the ticket and in each item's own
54
+ JSDoc, which names the sites and the line numbers.
55
+
56
+ **The three contested shapes are settled as specified, and the specifications
57
+ held.** A process rail admits four steps and refuses five, in the type: `steps` is
58
+ a tuple union, so a five-element array is a compile error and not a fifth column. A
59
+ status ledger has four tiers rather than five, and the words for a tier are the
60
+ caller's: the four sites between them use eight words for those four states
61
+ (`live`, `available` and `complete` are one; `approved`, `specified` and `designed`
62
+ are one; then `planned`; then `direction`), and the vocabulary is what `statusLabel`
63
+ is for. A product row's mark is two parts because a filled dot fails contrast on a
64
+ light card, so the mark is `ProductMark`: a hairline ring in `brand-ink` around a
65
+ core in the product's own `primary` fill, with the name in the brand ink beside it.
66
+
67
+ **Four gates the catalogue's own rules depend on now exist and are wired into
68
+ `check` and, because they read only `src/`, into `build`.** `check-item-docs`
69
+ holds AGENTS.md's claim that a documentation comment is the only path from an Item
70
+ to its published interface. `check-block-copy` holds DESIGN.md's claim that a
71
+ Block ships no copy and no sample data. `check-item-category` holds CONTEXT.md's
72
+ closed set of seven Categories and the sentence that a Block and a Page have none.
73
+ `check-block-imports` holds the claim that a Block fetches nothing and a Page
74
+ imports no router and no data client. Each resolves its roots from its own
75
+ location, fails a root that resolves to nothing, prints its coverage and every
76
+ exclusion on every run, has no report-only mode, and is proved red by a fixture
77
+ before it is proved green.
78
+
79
+ **Two of those four gates were red on the tree they were written against, and both
80
+ findings were real.** `check-item-docs` found seven exported functions whose
81
+ documentation comment was not attached to the declaration: `CardHeader`,
82
+ `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`, `SectionHeading` and
83
+ `Hero01`. A comment three functions above a declaration does not reach the emitted
84
+ `.d.ts`, so those seven were absent from the corpus. `check-block-copy` found
85
+ `pricing-01` rendering the word "Popular" on a featured plan that passed no badge:
86
+ a hardcoded claim every consumer of the Block inherited, published by the corpus as
87
+ part of the Block's own documentation. The fallback is gone; a featured plan with
88
+ no badge now renders no badge.
89
+
90
+ **Five additive fields on four shipped items**, each with three of the four
91
+ consumers passing a value the item could not take, counted per consumer with a
92
+ file and a line and never per string. `SectionHeading.index`, for the mono ordinal
93
+ all four sites render above every section head (www `Landing.tsx:49`, atlas
94
+ `landing.tsx:48`, nexus `Landing.tsx:38`, alphalens `Landing.tsx:66`).
95
+ `Cta01.secondaryAction`, for the pair of actions all four closing bands render
96
+ (www `Landing.tsx:186`, atlas `landing.tsx:243`, nexus `Landing.tsx:221`,
97
+ alphalens `Landing.tsx:285`). `Cta01.note`, for the footnote three of the four
98
+ render under it (atlas `landing.tsx:250`, nexus `Landing.tsx:228`, alphalens
99
+ `Landing.tsx:292`). `FeatureGrid01.numbered`, for the ordinal all four render on
100
+ every card (www `Landing.tsx:166`, atlas `landing.tsx:116`, nexus `Landing.tsx:132`,
101
+ alphalens `Landing.tsx:142`). `Hero01.align`, for the left-aligned hero three of
102
+ the four compose (atlas `landing.tsx:69`, nexus `Landing.tsx:63`, alphalens
103
+ `Landing.tsx:87`). All five are additive: nothing changed shape and nothing was
104
+ removed.
105
+
106
+ **A Block and a Page publish both an interface section and a composition section.**
107
+ `packages/llms` read the extractor's output for a Block and threw the interface half
108
+ away, so the tool told an agent a Block had no own props. The extractor reads a
109
+ named props type off an emitted declaration whether that declaration belongs to a
110
+ Component or to a Block, so both sections are now built and both are assembled into
111
+ the mirror file, `llms-full.txt` and the Store's `doc`.
112
+
113
+ The Store now carries both fields for every kind, and `get_item_props` prints
114
+ both when it has both. The sentence "a Block has no own props" is gone from the
115
+ tool as well as from the published document. It was the one place the two
116
+ sections were still exclusive, because that tool branched on `item.props` and
117
+ fell back to the composition section, so a Block was answered with its
118
+ composition and a denial of the interface it publishes. The test asserts the
119
+ sentence's absence, so a refactor that restores it fails even if the composition
120
+ is still printed, and a second test covers the one-present case so the
121
+ both-present branch cannot swallow it.
122
+
123
+ **Four accessible names became required props** on `SiteHeader`, `LogoStrip01`,
124
+ `NotFoundPage` and `BlogPostPage`, and a Block that ships no copy ships no
125
+ reader-facing copy either. `navLabel`, `productsLabel`, `label`, `linksLabel` and
126
+ `trailLabel` are words a screen reader reads out, and no Block should be choosing
127
+ them for a consumer whose site calls its own landmarks something else. This is the
128
+ one breaking change in the release, and it is on four new Blocks and two new Pages
129
+ plus one new required prop on `SiteHeader`, all of which are new in the same
130
+ release, so no existing call site changes.
131
+
132
+ **`ProductSwitcher.label` has no default** for the same reason: a consumer whose set
133
+ is not a set of products should pass its own word rather than accept a claim about
134
+ what the set is.
135
+
136
+ ### Patch Changes
137
+
138
+ - 4832359: Build the corpus after the changelog routes are copied, and declare what it reads
139
+
140
+ The corpus asserts that every published package shipping a changelog has a route
141
+ in the site's content tree, and those routes are written by a copy step that
142
+ belongs to the site package. The copy ran after this package was built, so on a
143
+ cold machine the build failed with a message that read like a changelog file had
144
+ been deleted, and a warm machine never saw the failure at all.
145
+
146
+ The copy is now the task `@nanisoft/site#copy-changelogs`, which this build
147
+ depends on in the task graph, and this build declares the content tree, the Item
148
+ documentation tree, the two site script modules the builder imports, the
149
+ workspace globs, the published manifests and the changelogs as its inputs, so a
150
+ change to any of them rebuilds the corpus instead of replaying a cached one.
151
+
152
+ The assertion is unchanged and still fails a published package the site does not
153
+ publish, which is how a changelog path the corpus advertised while the site
154
+ returned 404 for it was found. Its message now says which of the two causes it
155
+ is. No corpus byte changes: the emitted corpus is the same.
156
+
157
+ ## 0.2.0
158
+
159
+ ### Minor Changes
160
+
161
+ - c0cc0a9: Publish seven Sections, and keep every published URL resolving
162
+
163
+ `STORE_SECTIONS` is `overview`, `foundation`, `content`, `changelogs` where it
164
+ was `docs`, `foundations`, `content`, `changelogs`, and `STORE_SECTION_TITLES`
165
+ carries the Section's own name beside its directory. The two are a pair for a
166
+ reason: the directory is the route a page is addressed by and `get_page` matches
167
+ on it, and the name is what `llms.txt` groups pages under and what `list_pages`
168
+ counts. A Section renamed without its label renamed would be advertised under two
169
+ names in two artifacts, and a page whose `section` no longer names a live
170
+ directory is a page no tool can reach.
171
+
172
+ The reading order of the prose Sections is the site's: Overview, then Foundation,
173
+ then Content, then the catalogue, then the Changelogs. The corpus is regenerated
174
+ at build, so `llms.txt`, `llms-full.txt`, `data.json` and every mirror under `md/`
175
+ advertise the new routes, and the site Worker answers each old route with a
176
+ permanent redirect generated from the same manifest. An agent holding a cached
177
+ `llms.txt` from before this release resolves every URL it names and is told
178
+ nothing about the move.
179
+
180
+ Nothing in the item surface moves. The forty-two catalogue routes are the same
181
+ forty-two addresses, their mirrors are byte-identical, and the nine tools keep
182
+ their names and their positions; `list_pages` and `get_page` are unchanged apart
183
+ from the Section names they group and describe, which is a parameter on the
184
+ existing tools and not a rename of any of them.
185
+ - b1125a0: Publish the Changelogs Section, and put the changelogs in the agent surface
186
+
187
+ There was no Changelogs Section, so the only record of a change in a published
188
+ package was a file inside its tarball. A reader now has one route per published
189
+ package and an agent can ask for it. Both halves land together, so a Section never
190
+ exists without being in the Corpus.
191
+
192
+ The per-package pages are byte-for-byte copies of each published package's own
193
+ `CHANGELOG.md`, written by a copy step inside the build the site already runs.
194
+ That is the whole reason for the shape: a hand-maintained copy of a changelog
195
+ drifts from what was published while continuing to look correct, and it is a third
196
+ place to remember alongside the changeset and the JSDoc. The published packages
197
+ are discovered from the workspace, so publishing a package is what adds a route,
198
+ and a package that ships a changelog and no route fails the build in three
199
+ places. The reference design system this is modelled on has reader-facing
200
+ changelog pages and no such gate, which is how every one of them can be deleted
201
+ and leave its continuous integration green.
202
+
203
+ `STORE_SECTIONS` gains `changelogs`, so `llms.txt`, `llms-full.txt` and the
204
+ Markdown mirror carry a Changelogs group, and the content walk reads the second
205
+ extension the Section needs: a copied changelog is plain Markdown, and a walk
206
+ filtered to `.mdx` would have left the whole Section out of the agent surface
207
+ with a green build. The walk already recursed, so a page nested inside a Section
208
+ reaches the Corpus the same way it did before.
209
+
210
+ `PrismDocsStore` gains a required `changelogs` field carrying each package's
211
+ bytes, its route and its version entries, and the MCP server gains one read-only
212
+ tool, `get_changelog(package, version?)`, registered last. The eight existing
213
+ tools keep their names and their positions: a Section joining the Corpus is a
214
+ parameter on `list_pages` and `get_page`, which now read the Sections from the
215
+ Store rather than from a list of the three prose Sections, and not a rename of
216
+ anything. `get_changelog` returns the package's own file, because a generated
217
+ summary would drift the moment a release was published, and a breaking change in
218
+ a published package is exactly what a consuming agent has to be able to find.
219
+
220
+ ### Patch Changes
221
+
222
+ - cbf442f: Make the corpus walk the content tree, and make a missing Section fail
223
+
224
+ The generator read one directory per Section and filtered it to `.mdx`, so a page
225
+ one folder deeper was absent from `llms.txt`, from `llms-full.txt`, from the
226
+ `PrismDocsStore` and from every read-only MCP tool, with a green build. The walk
227
+ now recurses, and a page's route, its `slug` and its Markdown mirror all come
228
+ from where the page sits in the tree, so nesting content publishes a page
229
+ instead of losing it.
230
+
231
+ The same file guarded the Section loop with `if (!existsSync(dir)) continue`, so a
232
+ Section that was declared and not on disk, which is what renaming one does, was
233
+ skipped silently and deleted from every agent surface. It now throws.
234
+
235
+ `llms.txt`, `llms-full.txt`, `data.json` and `md/**` are byte-for-byte unchanged
236
+ for the current flat tree.
237
+
238
+ ## 0.1.0
239
+
240
+ The first versioned line of the rebuilt Prism agent corpus. One build-fresh
241
+ `dist/` carries `llms.txt`, `llms-full.txt`, `prism-skill.md`, the per-item
242
+ Markdown mirror and `data.json`, the `PrismDocsStore` projection.
243
+
244
+ Changesets are appended above this entry for every published change.
@@ -0,0 +1,95 @@
1
+ # @nanisoft/prism-mcp-server
2
+
3
+ ## 0.4.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [5c43520]
8
+ - @nanisoft/prism-llms@0.5.1
9
+
10
+ ## 0.4.0
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [4832359]
15
+ - Updated dependencies [76c8d96]
16
+ - @nanisoft/prism-llms@0.3.0
17
+
18
+ ## 0.2.0
19
+
20
+ ### Minor Changes
21
+
22
+ - c0cc0a9: Publish seven Sections, and keep every published URL resolving
23
+
24
+ `STORE_SECTIONS` is `overview`, `foundation`, `content`, `changelogs` where it
25
+ was `docs`, `foundations`, `content`, `changelogs`, and `STORE_SECTION_TITLES`
26
+ carries the Section's own name beside its directory. The two are a pair for a
27
+ reason: the directory is the route a page is addressed by and `get_page` matches
28
+ on it, and the name is what `llms.txt` groups pages under and what `list_pages`
29
+ counts. A Section renamed without its label renamed would be advertised under two
30
+ names in two artifacts, and a page whose `section` no longer names a live
31
+ directory is a page no tool can reach.
32
+
33
+ The reading order of the prose Sections is the site's: Overview, then Foundation,
34
+ then Content, then the catalogue, then the Changelogs. The corpus is regenerated
35
+ at build, so `llms.txt`, `llms-full.txt`, `data.json` and every mirror under `md/`
36
+ advertise the new routes, and the site Worker answers each old route with a
37
+ permanent redirect generated from the same manifest. An agent holding a cached
38
+ `llms.txt` from before this release resolves every URL it names and is told
39
+ nothing about the move.
40
+
41
+ Nothing in the item surface moves. The forty-two catalogue routes are the same
42
+ forty-two addresses, their mirrors are byte-identical, and the nine tools keep
43
+ their names and their positions; `list_pages` and `get_page` are unchanged apart
44
+ from the Section names they group and describe, which is a parameter on the
45
+ existing tools and not a rename of any of them.
46
+ - b1125a0: Publish the Changelogs Section, and put the changelogs in the agent surface
47
+
48
+ There was no Changelogs Section, so the only record of a change in a published
49
+ package was a file inside its tarball. A reader now has one route per published
50
+ package and an agent can ask for it. Both halves land together, so a Section never
51
+ exists without being in the Corpus.
52
+
53
+ The per-package pages are byte-for-byte copies of each published package's own
54
+ `CHANGELOG.md`, written by a copy step inside the build the site already runs.
55
+ That is the whole reason for the shape: a hand-maintained copy of a changelog
56
+ drifts from what was published while continuing to look correct, and it is a third
57
+ place to remember alongside the changeset and the JSDoc. The published packages
58
+ are discovered from the workspace, so publishing a package is what adds a route,
59
+ and a package that ships a changelog and no route fails the build in three
60
+ places. The reference design system this is modelled on has reader-facing
61
+ changelog pages and no such gate, which is how every one of them can be deleted
62
+ and leave its continuous integration green.
63
+
64
+ `STORE_SECTIONS` gains `changelogs`, so `llms.txt`, `llms-full.txt` and the
65
+ Markdown mirror carry a Changelogs group, and the content walk reads the second
66
+ extension the Section needs: a copied changelog is plain Markdown, and a walk
67
+ filtered to `.mdx` would have left the whole Section out of the agent surface
68
+ with a green build. The walk already recursed, so a page nested inside a Section
69
+ reaches the Corpus the same way it did before.
70
+
71
+ `PrismDocsStore` gains a required `changelogs` field carrying each package's
72
+ bytes, its route and its version entries, and the MCP server gains one read-only
73
+ tool, `get_changelog(package, version?)`, registered last. The eight existing
74
+ tools keep their names and their positions: a Section joining the Corpus is a
75
+ parameter on `list_pages` and `get_page`, which now read the Sections from the
76
+ Store rather than from a list of the three prose Sections, and not a rename of
77
+ anything. `get_changelog` returns the package's own file, because a generated
78
+ summary would drift the moment a release was published, and a breaking change in
79
+ a published package is exactly what a consuming agent has to be able to find.
80
+
81
+ ### Patch Changes
82
+
83
+ - Updated dependencies [cbf442f]
84
+ - Updated dependencies [c0cc0a9]
85
+ - Updated dependencies [b1125a0]
86
+ - @nanisoft/prism-llms@0.2.0
87
+
88
+ ## 0.1.0
89
+
90
+ The first versioned line of the rebuilt Prism MCP surface. The package is
91
+ transport-free: `createPrismMcpServer(store, options)` returns an `McpServer`
92
+ that the site Worker connects to the Agents SDK at `/mcp`. Eight read-only
93
+ retrieval tools answer over the bundled `PrismDocsStore`.
94
+
95
+ Changesets are appended above this entry for every published change.