@nanisoft/prism-llms 0.4.0 → 0.5.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 (175) hide show
  1. package/README.md +88 -0
  2. package/THIRD-PARTY-NOTICES.md +48 -0
  3. package/dist/data.json +3996 -387
  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 +269 -153
  8. package/dist/index.d.ts +12 -7
  9. package/dist/index.js +9 -7
  10. package/dist/llms-full.txt +7968 -2013
  11. package/dist/llms.txt +97 -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 +102 -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 +113 -0
  27. package/dist/md/blocks/settings-panel-01.md +148 -0
  28. package/dist/md/blocks/site-footer.md +103 -11
  29. package/dist/md/blocks/site-header.md +111 -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 +206 -0
  34. package/dist/md/changelogs/prism-mcp-server.md +88 -0
  35. package/dist/md/changelogs/prism-tokens.md +126 -0
  36. package/dist/md/changelogs/prism-ui.md +429 -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 +123 -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/marketing-page.md +199 -0
  95. package/dist/md/pages/not-found-page.md +105 -0
  96. package/dist/md/pages/settings-page.md +206 -0
  97. package/dist/prism-skill.md +50 -0
  98. package/dist/store.d.ts +203 -0
  99. package/dist/store.js +317 -0
  100. package/package.json +29 -26
  101. package/dist/demo-graph.d.ts.map +0 -1
  102. package/dist/demo-graph.js.map +0 -1
  103. package/dist/extractor.d.ts.map +0 -1
  104. package/dist/extractor.js.map +0 -1
  105. package/dist/index.d.ts.map +0 -1
  106. package/dist/index.js.map +0 -1
  107. package/dist/markdown.d.ts.map +0 -1
  108. package/dist/markdown.js.map +0 -1
  109. package/dist/md/blocks/component-demo.md +0 -19
  110. package/dist/md/blocks/page-header.md +0 -19
  111. package/dist/md/components/affix.md +0 -14
  112. package/dist/md/components/anchor.md +0 -14
  113. package/dist/md/components/auto-complete.md +0 -14
  114. package/dist/md/components/back-top.md +0 -14
  115. package/dist/md/components/border-beam.md +0 -14
  116. package/dist/md/components/calendar.md +0 -14
  117. package/dist/md/components/carousel.md +0 -14
  118. package/dist/md/components/cascader.md +0 -14
  119. package/dist/md/components/col.md +0 -14
  120. package/dist/md/components/collapse.md +0 -14
  121. package/dist/md/components/color-picker.md +0 -14
  122. package/dist/md/components/date-picker.md +0 -14
  123. package/dist/md/components/descriptions.md +0 -14
  124. package/dist/md/components/display-title.md +0 -20
  125. package/dist/md/components/divider.md +0 -14
  126. package/dist/md/components/drawer.md +0 -14
  127. package/dist/md/components/dropdown.md +0 -14
  128. package/dist/md/components/empty.md +0 -14
  129. package/dist/md/components/flex.md +0 -14
  130. package/dist/md/components/float-button.md +0 -14
  131. package/dist/md/components/form.md +0 -14
  132. package/dist/md/components/grid.md +0 -14
  133. package/dist/md/components/image.md +0 -14
  134. package/dist/md/components/input-number.md +0 -14
  135. package/dist/md/components/layout.md +0 -14
  136. package/dist/md/components/list.md +0 -14
  137. package/dist/md/components/listy.md +0 -14
  138. package/dist/md/components/masonry.md +0 -14
  139. package/dist/md/components/mentions.md +0 -14
  140. package/dist/md/components/menu.md +0 -14
  141. package/dist/md/components/modal.md +0 -14
  142. package/dist/md/components/popconfirm.md +0 -14
  143. package/dist/md/components/qrcode.md +0 -14
  144. package/dist/md/components/radio.md +0 -14
  145. package/dist/md/components/rate.md +0 -14
  146. package/dist/md/components/result.md +0 -14
  147. package/dist/md/components/row.md +0 -14
  148. package/dist/md/components/segmented.md +0 -14
  149. package/dist/md/components/space.md +0 -14
  150. package/dist/md/components/spin.md +0 -14
  151. package/dist/md/components/splitter.md +0 -14
  152. package/dist/md/components/statistic.md +0 -14
  153. package/dist/md/components/steps.md +0 -14
  154. package/dist/md/components/tag.md +0 -14
  155. package/dist/md/components/time-picker.md +0 -14
  156. package/dist/md/components/timeline.md +0 -14
  157. package/dist/md/components/tour.md +0 -14
  158. package/dist/md/components/transfer.md +0 -14
  159. package/dist/md/components/tree-select.md +0 -14
  160. package/dist/md/components/tree.md +0 -14
  161. package/dist/md/components/upload.md +0 -14
  162. package/dist/md/components/watermark.md +0 -14
  163. package/dist/md/docs/brand.md +0 -41
  164. package/dist/md/pages/blog-layout.md +0 -19
  165. package/dist/md/pages/docs-shell.md +0 -23
  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,206 @@
1
+ # @nanisoft/prism-llms
2
+
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 76c8d96: Fourteen items, four catalogue gates, and a Block that publishes its interface
8
+
9
+ **Fourteen items ship.** Three Components (`Prose`, `FactList`, `ProductSwitcher`),
10
+ nine Blocks (`ProcessRail01`, `StatusLedger01`, `ProductGrid01`, `StackGrid01`,
11
+ `LogoStrip01`, `NoteGrid01`, `InstrumentPanel01`, `SiteHeader`, `SiteFooter`) and two
12
+ Pages (`NotFoundPage`, `BlogPostPage`). Every one of them earns its place by the
13
+ growth rule rather than by taste: a marketing Block when at least three of the four
14
+ sites compose that section today, a Component when it has one job no existing
15
+ Component can express. The evidence is in the ticket and in each item's own
16
+ JSDoc, which names the sites and the line numbers.
17
+
18
+ **The three contested shapes are settled as specified, and the specifications
19
+ held.** A process rail admits four steps and refuses five, in the type: `steps` is
20
+ a tuple union, so a five-element array is a compile error and not a fifth column. A
21
+ status ledger has four tiers rather than five, and the words for a tier are the
22
+ caller's: the four sites between them use eight words for those four states
23
+ (`live`, `available` and `complete` are one; `approved`, `specified` and `designed`
24
+ are one; then `planned`; then `direction`), and the vocabulary is what `statusLabel`
25
+ is for. A product row's mark is two parts because a filled dot fails contrast on a
26
+ light card, so the mark is `ProductMark`: a hairline ring in `brand-ink` around a
27
+ core in the product's own `primary` fill, with the name in the brand ink beside it.
28
+
29
+ **Four gates the catalogue's own rules depend on now exist and are wired into
30
+ `check` and, because they read only `src/`, into `build`.** `check-item-docs`
31
+ holds AGENTS.md's claim that a documentation comment is the only path from an Item
32
+ to its published interface. `check-block-copy` holds DESIGN.md's claim that a
33
+ Block ships no copy and no sample data. `check-item-category` holds CONTEXT.md's
34
+ closed set of seven Categories and the sentence that a Block and a Page have none.
35
+ `check-block-imports` holds the claim that a Block fetches nothing and a Page
36
+ imports no router and no data client. Each resolves its roots from its own
37
+ location, fails a root that resolves to nothing, prints its coverage and every
38
+ exclusion on every run, has no report-only mode, and is proved red by a fixture
39
+ before it is proved green.
40
+
41
+ **Two of those four gates were red on the tree they were written against, and both
42
+ findings were real.** `check-item-docs` found seven exported functions whose
43
+ documentation comment was not attached to the declaration: `CardHeader`,
44
+ `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`, `SectionHeading` and
45
+ `Hero01`. A comment three functions above a declaration does not reach the emitted
46
+ `.d.ts`, so those seven were absent from the corpus. `check-block-copy` found
47
+ `pricing-01` rendering the word "Popular" on a featured plan that passed no badge:
48
+ a hardcoded claim every consumer of the Block inherited, published by the corpus as
49
+ part of the Block's own documentation. The fallback is gone; a featured plan with
50
+ no badge now renders no badge.
51
+
52
+ **Five additive fields on four shipped items**, each with three of the four
53
+ consumers passing a value the item could not take, counted per consumer with a
54
+ file and a line and never per string. `SectionHeading.index`, for the mono ordinal
55
+ all four sites render above every section head (www `Landing.tsx:49`, atlas
56
+ `landing.tsx:48`, nexus `Landing.tsx:38`, alphalens `Landing.tsx:66`).
57
+ `Cta01.secondaryAction`, for the pair of actions all four closing bands render
58
+ (www `Landing.tsx:186`, atlas `landing.tsx:243`, nexus `Landing.tsx:221`,
59
+ alphalens `Landing.tsx:285`). `Cta01.note`, for the footnote three of the four
60
+ render under it (atlas `landing.tsx:250`, nexus `Landing.tsx:228`, alphalens
61
+ `Landing.tsx:292`). `FeatureGrid01.numbered`, for the ordinal all four render on
62
+ every card (www `Landing.tsx:166`, atlas `landing.tsx:116`, nexus `Landing.tsx:132`,
63
+ alphalens `Landing.tsx:142`). `Hero01.align`, for the left-aligned hero three of
64
+ the four compose (atlas `landing.tsx:69`, nexus `Landing.tsx:63`, alphalens
65
+ `Landing.tsx:87`). All five are additive: nothing changed shape and nothing was
66
+ removed.
67
+
68
+ **A Block and a Page publish both an interface section and a composition section.**
69
+ `packages/llms` read the extractor's output for a Block and threw the interface half
70
+ away, so the tool told an agent a Block had no own props. The extractor reads a
71
+ named props type off an emitted declaration whether that declaration belongs to a
72
+ Component or to a Block, so both sections are now built and both are assembled into
73
+ the mirror file, `llms-full.txt` and the Store's `doc`.
74
+
75
+ The Store now carries both fields for every kind, and `get_item_props` prints
76
+ both when it has both. The sentence "a Block has no own props" is gone from the
77
+ tool as well as from the published document. It was the one place the two
78
+ sections were still exclusive, because that tool branched on `item.props` and
79
+ fell back to the composition section, so a Block was answered with its
80
+ composition and a denial of the interface it publishes. The test asserts the
81
+ sentence's absence, so a refactor that restores it fails even if the composition
82
+ is still printed, and a second test covers the one-present case so the
83
+ both-present branch cannot swallow it.
84
+
85
+ **Four accessible names became required props** on `SiteHeader`, `LogoStrip01`,
86
+ `NotFoundPage` and `BlogPostPage`, and a Block that ships no copy ships no
87
+ reader-facing copy either. `navLabel`, `productsLabel`, `label`, `linksLabel` and
88
+ `trailLabel` are words a screen reader reads out, and no Block should be choosing
89
+ them for a consumer whose site calls its own landmarks something else. This is the
90
+ one breaking change in the release, and it is on four new Blocks and two new Pages
91
+ plus one new required prop on `SiteHeader`, all of which are new in the same
92
+ release, so no existing call site changes.
93
+
94
+ **`ProductSwitcher.label` has no default** for the same reason: a consumer whose set
95
+ is not a set of products should pass its own word rather than accept a claim about
96
+ what the set is.
97
+
98
+ ### Patch Changes
99
+
100
+ - 4832359: Build the corpus after the changelog routes are copied, and declare what it reads
101
+
102
+ The corpus asserts that every published package shipping a changelog has a route
103
+ in the site's content tree, and those routes are written by a copy step that
104
+ belongs to the site package. The copy ran after this package was built, so on a
105
+ cold machine the build failed with a message that read like a changelog file had
106
+ been deleted, and a warm machine never saw the failure at all.
107
+
108
+ The copy is now the task `@nanisoft/site#copy-changelogs`, which this build
109
+ depends on in the task graph, and this build declares the content tree, the Item
110
+ documentation tree, the two site script modules the builder imports, the
111
+ workspace globs, the published manifests and the changelogs as its inputs, so a
112
+ change to any of them rebuilds the corpus instead of replaying a cached one.
113
+
114
+ The assertion is unchanged and still fails a published package the site does not
115
+ publish, which is how a changelog path the corpus advertised while the site
116
+ returned 404 for it was found. Its message now says which of the two causes it
117
+ is. No corpus byte changes: the emitted corpus is the same.
118
+
119
+ ## 0.2.0
120
+
121
+ ### Minor Changes
122
+
123
+ - c0cc0a9: Publish seven Sections, and keep every published URL resolving
124
+
125
+ `STORE_SECTIONS` is `overview`, `foundation`, `content`, `changelogs` where it
126
+ was `docs`, `foundations`, `content`, `changelogs`, and `STORE_SECTION_TITLES`
127
+ carries the Section's own name beside its directory. The two are a pair for a
128
+ reason: the directory is the route a page is addressed by and `get_page` matches
129
+ on it, and the name is what `llms.txt` groups pages under and what `list_pages`
130
+ counts. A Section renamed without its label renamed would be advertised under two
131
+ names in two artifacts, and a page whose `section` no longer names a live
132
+ directory is a page no tool can reach.
133
+
134
+ The reading order of the prose Sections is the site's: Overview, then Foundation,
135
+ then Content, then the catalogue, then the Changelogs. The corpus is regenerated
136
+ at build, so `llms.txt`, `llms-full.txt`, `data.json` and every mirror under `md/`
137
+ advertise the new routes, and the site Worker answers each old route with a
138
+ permanent redirect generated from the same manifest. An agent holding a cached
139
+ `llms.txt` from before this release resolves every URL it names and is told
140
+ nothing about the move.
141
+
142
+ Nothing in the item surface moves. The forty-two catalogue routes are the same
143
+ forty-two addresses, their mirrors are byte-identical, and the nine tools keep
144
+ their names and their positions; `list_pages` and `get_page` are unchanged apart
145
+ from the Section names they group and describe, which is a parameter on the
146
+ existing tools and not a rename of any of them.
147
+ - b1125a0: Publish the Changelogs Section, and put the changelogs in the agent surface
148
+
149
+ There was no Changelogs Section, so the only record of a change in a published
150
+ package was a file inside its tarball. A reader now has one route per published
151
+ package and an agent can ask for it. Both halves land together, so a Section never
152
+ exists without being in the Corpus.
153
+
154
+ The per-package pages are byte-for-byte copies of each published package's own
155
+ `CHANGELOG.md`, written by a copy step inside the build the site already runs.
156
+ That is the whole reason for the shape: a hand-maintained copy of a changelog
157
+ drifts from what was published while continuing to look correct, and it is a third
158
+ place to remember alongside the changeset and the JSDoc. The published packages
159
+ are discovered from the workspace, so publishing a package is what adds a route,
160
+ and a package that ships a changelog and no route fails the build in three
161
+ places. The reference design system this is modelled on has reader-facing
162
+ changelog pages and no such gate, which is how every one of them can be deleted
163
+ and leave its continuous integration green.
164
+
165
+ `STORE_SECTIONS` gains `changelogs`, so `llms.txt`, `llms-full.txt` and the
166
+ Markdown mirror carry a Changelogs group, and the content walk reads the second
167
+ extension the Section needs: a copied changelog is plain Markdown, and a walk
168
+ filtered to `.mdx` would have left the whole Section out of the agent surface
169
+ with a green build. The walk already recursed, so a page nested inside a Section
170
+ reaches the Corpus the same way it did before.
171
+
172
+ `PrismDocsStore` gains a required `changelogs` field carrying each package's
173
+ bytes, its route and its version entries, and the MCP server gains one read-only
174
+ tool, `get_changelog(package, version?)`, registered last. The eight existing
175
+ tools keep their names and their positions: a Section joining the Corpus is a
176
+ parameter on `list_pages` and `get_page`, which now read the Sections from the
177
+ Store rather than from a list of the three prose Sections, and not a rename of
178
+ anything. `get_changelog` returns the package's own file, because a generated
179
+ summary would drift the moment a release was published, and a breaking change in
180
+ a published package is exactly what a consuming agent has to be able to find.
181
+
182
+ ### Patch Changes
183
+
184
+ - cbf442f: Make the corpus walk the content tree, and make a missing Section fail
185
+
186
+ The generator read one directory per Section and filtered it to `.mdx`, so a page
187
+ one folder deeper was absent from `llms.txt`, from `llms-full.txt`, from the
188
+ `PrismDocsStore` and from every read-only MCP tool, with a green build. The walk
189
+ now recurses, and a page's route, its `slug` and its Markdown mirror all come
190
+ from where the page sits in the tree, so nesting content publishes a page
191
+ instead of losing it.
192
+
193
+ The same file guarded the Section loop with `if (!existsSync(dir)) continue`, so a
194
+ Section that was declared and not on disk, which is what renaming one does, was
195
+ skipped silently and deleted from every agent surface. It now throws.
196
+
197
+ `llms.txt`, `llms-full.txt`, `data.json` and `md/**` are byte-for-byte unchanged
198
+ for the current flat tree.
199
+
200
+ ## 0.1.0
201
+
202
+ The first versioned line of the rebuilt Prism agent corpus. One build-fresh
203
+ `dist/` carries `llms.txt`, `llms-full.txt`, `prism-skill.md`, the per-item
204
+ Markdown mirror and `data.json`, the `PrismDocsStore` projection.
205
+
206
+ Changesets are appended above this entry for every published change.
@@ -0,0 +1,88 @@
1
+ # @nanisoft/prism-mcp-server
2
+
3
+ ## 0.4.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [4832359]
8
+ - Updated dependencies [76c8d96]
9
+ - @nanisoft/prism-llms@0.3.0
10
+
11
+ ## 0.2.0
12
+
13
+ ### Minor Changes
14
+
15
+ - c0cc0a9: Publish seven Sections, and keep every published URL resolving
16
+
17
+ `STORE_SECTIONS` is `overview`, `foundation`, `content`, `changelogs` where it
18
+ was `docs`, `foundations`, `content`, `changelogs`, and `STORE_SECTION_TITLES`
19
+ carries the Section's own name beside its directory. The two are a pair for a
20
+ reason: the directory is the route a page is addressed by and `get_page` matches
21
+ on it, and the name is what `llms.txt` groups pages under and what `list_pages`
22
+ counts. A Section renamed without its label renamed would be advertised under two
23
+ names in two artifacts, and a page whose `section` no longer names a live
24
+ directory is a page no tool can reach.
25
+
26
+ The reading order of the prose Sections is the site's: Overview, then Foundation,
27
+ then Content, then the catalogue, then the Changelogs. The corpus is regenerated
28
+ at build, so `llms.txt`, `llms-full.txt`, `data.json` and every mirror under `md/`
29
+ advertise the new routes, and the site Worker answers each old route with a
30
+ permanent redirect generated from the same manifest. An agent holding a cached
31
+ `llms.txt` from before this release resolves every URL it names and is told
32
+ nothing about the move.
33
+
34
+ Nothing in the item surface moves. The forty-two catalogue routes are the same
35
+ forty-two addresses, their mirrors are byte-identical, and the nine tools keep
36
+ their names and their positions; `list_pages` and `get_page` are unchanged apart
37
+ from the Section names they group and describe, which is a parameter on the
38
+ existing tools and not a rename of any of them.
39
+ - b1125a0: Publish the Changelogs Section, and put the changelogs in the agent surface
40
+
41
+ There was no Changelogs Section, so the only record of a change in a published
42
+ package was a file inside its tarball. A reader now has one route per published
43
+ package and an agent can ask for it. Both halves land together, so a Section never
44
+ exists without being in the Corpus.
45
+
46
+ The per-package pages are byte-for-byte copies of each published package's own
47
+ `CHANGELOG.md`, written by a copy step inside the build the site already runs.
48
+ That is the whole reason for the shape: a hand-maintained copy of a changelog
49
+ drifts from what was published while continuing to look correct, and it is a third
50
+ place to remember alongside the changeset and the JSDoc. The published packages
51
+ are discovered from the workspace, so publishing a package is what adds a route,
52
+ and a package that ships a changelog and no route fails the build in three
53
+ places. The reference design system this is modelled on has reader-facing
54
+ changelog pages and no such gate, which is how every one of them can be deleted
55
+ and leave its continuous integration green.
56
+
57
+ `STORE_SECTIONS` gains `changelogs`, so `llms.txt`, `llms-full.txt` and the
58
+ Markdown mirror carry a Changelogs group, and the content walk reads the second
59
+ extension the Section needs: a copied changelog is plain Markdown, and a walk
60
+ filtered to `.mdx` would have left the whole Section out of the agent surface
61
+ with a green build. The walk already recursed, so a page nested inside a Section
62
+ reaches the Corpus the same way it did before.
63
+
64
+ `PrismDocsStore` gains a required `changelogs` field carrying each package's
65
+ bytes, its route and its version entries, and the MCP server gains one read-only
66
+ tool, `get_changelog(package, version?)`, registered last. The eight existing
67
+ tools keep their names and their positions: a Section joining the Corpus is a
68
+ parameter on `list_pages` and `get_page`, which now read the Sections from the
69
+ Store rather than from a list of the three prose Sections, and not a rename of
70
+ anything. `get_changelog` returns the package's own file, because a generated
71
+ summary would drift the moment a release was published, and a breaking change in
72
+ a published package is exactly what a consuming agent has to be able to find.
73
+
74
+ ### Patch Changes
75
+
76
+ - Updated dependencies [cbf442f]
77
+ - Updated dependencies [c0cc0a9]
78
+ - Updated dependencies [b1125a0]
79
+ - @nanisoft/prism-llms@0.2.0
80
+
81
+ ## 0.1.0
82
+
83
+ The first versioned line of the rebuilt Prism MCP surface. The package is
84
+ transport-free: `createPrismMcpServer(store, options)` returns an `McpServer`
85
+ that the site Worker connects to the Agents SDK at `/mcp`. Eight read-only
86
+ retrieval tools answer over the bundled `PrismDocsStore`.
87
+
88
+ Changesets are appended above this entry for every published change.