@grimoire-rs/indexer 0.5.2 → 0.5.4

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 (31) hide show
  1. package/CHANGELOG.md +250 -270
  2. package/README.md +26 -0
  3. package/dist/cli/ratings.d.ts.map +1 -1
  4. package/dist/cli/ratings.js +29 -1
  5. package/dist/cli/ratings.js.map +1 -1
  6. package/dist/renderer/astro/components/CardLogo.d.ts +2 -2
  7. package/dist/renderer/astro/components/CardLogo.tsx +2 -2
  8. package/dist/renderer/astro/components/Catalog.d.ts +12 -4
  9. package/dist/renderer/astro/components/Catalog.js +290 -38
  10. package/dist/renderer/astro/components/Catalog.tsx +369 -57
  11. package/dist/renderer/astro/components/PackageCard.d.ts +2 -2
  12. package/dist/renderer/astro/components/PackageCard.tsx +2 -2
  13. package/dist/renderer/astro/components/PackageRow.d.ts +2 -2
  14. package/dist/renderer/astro/components/PackageRow.tsx +2 -2
  15. package/dist/renderer/astro/components/PickerMenu.astro +1 -0
  16. package/dist/renderer/astro/layouts/Base.astro +98 -22
  17. package/dist/renderer/astro/lib/catalog.d.ts +39 -2
  18. package/dist/renderer/astro/lib/catalog.js +42 -1
  19. package/dist/renderer/astro/lib/catalog.ts +82 -1
  20. package/dist/renderer/astro/lib/commands.d.ts +7 -0
  21. package/dist/renderer/astro/lib/commands.js +9 -2
  22. package/dist/renderer/astro/lib/commands.ts +17 -2
  23. package/dist/renderer/astro/lib/search.d.ts +17 -0
  24. package/dist/renderer/astro/lib/search.js +138 -0
  25. package/dist/renderer/astro/lib/search.ts +157 -0
  26. package/dist/renderer/astro/pages/index.astro +51 -3
  27. package/dist/renderer/astro/styles/tokens.css +6 -1
  28. package/dist/renderer/index.d.ts.map +1 -1
  29. package/dist/renderer/index.js +52 -0
  30. package/dist/renderer/index.js.map +1 -1
  31. package/package.json +6 -1
package/CHANGELOG.md CHANGED
@@ -4,303 +4,283 @@ All notable changes to `@grimoire-rs/indexer` are recorded here, in
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. This project
5
5
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- > This file starts at `0.5.0`. Releases up to and including `v0.4.4` shipped
8
- > before it existed and are not reconstructed here — the git tags and
9
- > `git log v0.4.3..v0.4.4` are the record for those. Every release from the
10
- > next one on is written down here.
11
-
12
7
  Component overrides sit in the **Unstable** tier of the
13
8
  [stability table](docs/reference/theme-overlay.md#stability): their file paths
14
9
  and props may move in a minor release, and this file is where that is
15
- announced. Everything in the Contract tier moves only in a major.
10
+ announced. Everything in the Contract tier moves only in a major — so a commit
11
+ that moves one says which component and where, old → new, in its subject or
12
+ body, because that is all a reader gets here.
13
+
14
+ ## [0.5.4] - 2026-09-01
15
+
16
+ ### Added
16
17
 
17
- An entry for such a move carries both halves or it announces nothing an
18
- overrider can act on: the component's name, and the move itself as old → new —
19
- `PackageRow`: `components/PackageRow.tsx` → `components/list/PackageRow.tsx`,
20
- props `{ pkg }` → `{ pkg, compact }`.
18
+ - Publish the forge host in providers.rating_host *(ratings)*
19
+ - Carry the picked scope into the add-registry link *(renderer)*
21
20
 
22
- ## [Unreleased]
21
+ ## [0.5.3] - 2026-08-31
22
+
23
+ ### Added
24
+
25
+ - --bulk, to look at the catalog at corporate size *(dev)*
26
+ - Fuzzy search across every field, with a relevance order *(renderer)*
27
+ - Give the search field its own clear button *(renderer)*
28
+
29
+ ### Changed
30
+
31
+ - Ship the island only the fields a card renders *(renderer)*
32
+ - Build a viewport of the catalog, not all of it *(renderer)*
33
+
34
+ ### Fixed
35
+
36
+ - Hold the paint for a stored view and a kw deep link *(renderer)*
37
+ - Lift the agent badge to WCAG AA, and ratchet the floors *(renderer)*
38
+ - Verify the pack shape under both npm majors the matrix ships *(ci)*
39
+ - Restore the list view's subgrid columns *(renderer)*
40
+ - Keep the sort ring off a pointer interaction *(renderer)*
23
41
 
24
42
  ## [0.5.2] - 2026-08-31
25
43
 
26
44
  ### Fixed
27
45
 
28
- - **The sort control drew two borders when clicked.** Hover tints a control's
29
- border to the accent and focus drew a 2px accent outline standing 1px clear
30
- of it, so anyone who reached the control with a mouse had both at once — one
31
- state reading as two lines with a gap between them. The ring merges onto the
32
- border now, the way the card's focus state already did, and the offset comes
33
- off every bordered control in the toolbar together rather than off the one
34
- that showed it: the search field, the keyword overflow menu's search, both
35
- sort halves and both view picks. Keyword chips gain the same ring, having
36
- taken the browser's default until now.
37
- - **A long address no longer wraps the card's head onto a second line.** A
38
- namespace breaks at its own slashes and dots, so a wide one took two rows and
39
- left the card taller than its neighbours with the tail of the address against
40
- the padding edge. It stays on one line and the overflow is trimmed from the
41
- *front* — the registry host is on every address in an index and the
42
- repository at the tail is what tells two apart — with the whole of it in the
43
- element's `title`.
44
- - **Keyword chips could stutter, or stop part-way through the rail's slide.**
45
- The rail's FLIP pass inverted each chip with an inline `transition: none` and
46
- a `translate`, then dropped both on the next animation frame; any commit
47
- landing inside that window left the chip carrying the offset with its
48
- transition disabled, and nothing else took those off. It also measured seats
49
- with `getBoundingClientRect`, which reports where a chip is *drawn*, so a
50
- chip caught mid-slide recorded its animated box and the next inversion
51
- compounded the error instead of correcting it. Neither window was rare: the
52
- rail's own fit measurement re-commits whenever a rescore changes how many
53
- chips fit. Seats now come from `offsetLeft`/`offsetTop`, which ignore
54
- transforms and scroll, and the slide is a Web Animation — it starts without a
55
- frame, writes nothing to `style`, and clears itself when it finishes or is
56
- cancelled. `prefers-reduced-motion` is honoured by the effect rather than by
57
- the stylesheet, and `--grim-duration-slow` is still its length.
58
-
59
- ## [0.5.1] - 2026-08-31
46
+ - Merge the focus ring onto the control's own border *(renderer)*
47
+ - Trim a long card address from the front *(renderer)*
48
+ - Run the keyword rail's slide as a Web Animation *(renderer)*
49
+
50
+ ## [0.5.1] - 2026-08-30
60
51
 
61
52
  ### Added
62
53
 
63
- - **`grim-indexer dev --host [addr]`.** Bare, it binds every interface; with a
64
- value, that address. Without it the server binds loopback only Astro's own
65
- default which is unreachable from a dev container, a VM or a WSL guest,
66
- where the port forwards and the connection then hangs against a socket that
67
- is not listening for it. `npm run dev -- --host` takes the same two forms.
68
- Bare `--host` puts the preview on your network; the CLI reference says so.
69
- - **`CodeBlock.astro`**, a reusable code block: the site's own frame, the same
70
- Shiki theme pair every rendered README uses, the same copy button and toast,
71
- and an optional VS Code button. Props
72
- `{ code, lang?, name?, vscodeHref?, vscodeLabel? }`; `vscodeHref` is a plain
73
- URL, so `vscodeUrl`, `vscodeVoteUrl`, `addRegistryUrl` and a hand-written
74
- deep link all work. Worked example in
75
- [Reuse shipped components](docs/how-to/reuse-components.md#code-blocks).
76
- - **`data-slot="code-block"`**, for it. Contract tier, like every other slot.
77
- - **A second argument on `registryAddCommand` and `registryScopeChoices`**,
78
- the registry to build the command for — defaulting to the one in your config,
79
- so nothing existing changes. It is what lets a setup page draw the "add
80
- registry" bar for an index *other* than the site's own: a corporate index in
81
- the hero and the public one further down.
82
- - **A clear button on the keyword filters**, in the catalog toolbar. Rendered
83
- only while a keyword is picked, and it lifts the keywords alone — Escape is
84
- still what clears the search and the kinds with them.
54
+ - Add a --host flag to dev *(cli)*
55
+ - Add CodeBlock, a code block an index's page can use *(renderer)*
56
+ - Let the registry command builders take another index *(renderer)*
57
+ - Add a clear button to the keyword filters *(renderer)*
58
+
59
+ ### Changed
60
+
61
+ - Keep off-screen cards out of layout and paint *(renderer)*
62
+
63
+ ### Documentation
64
+
65
+ - Record the unreleased changes *(changelog)*
85
66
 
86
67
  ### Fixed
87
68
 
88
- - **The keyword overflow menu opened invisibly.** Its panel was an absolutely
89
- positioned child of the toolbar's filter row, which is a scroll container, so
90
- the panel was cropped to the row and stretched the row's scroll extent a
91
- menu nobody could see, with a stray horizontal and vertical scrollbar to show
92
- for it. It is a popover now, which puts it in the top layer, outside every
93
- ancestor's `overflow`, and brings Escape and light dismiss with it. The
94
- trigger is a `<button>` rather than a `<summary>`, so the toolbar's arrow-key
95
- navigation now reaches it.
96
- - **The detail page's logo drifted down under a long description.** The header
97
- centred the tile against the text beside it, so the same package's mark sat
98
- at a different height on every page. It holds against the title now.
99
- - **Dropped the tinted square behind a package logo**, on the cards, the list
100
- rows and the detail header alike. A logo is a designed mark already sitting
101
- on its own ground, so the slot framed it twice — most visibly for the many
102
- logos that are themselves a rounded square, which then sat inside a slightly
103
- larger one. The slot still reserves the same box, so nothing shifts. The
104
- dashed frame the broken-logo state drew goes with it — it read as a fault in
105
- the layout rather than in the image; the slashed glyph is what says the logo
106
- failed, and `role="img"` with a label is what announces it. The
107
- initial-letter tile a package with no logo gets is unchanged: there the
108
- coloured ground is the mark.
109
- - **The dev server's URL is a legal URL when the server binds an IPv6
110
- address.** An unbracketed literal reads its own colons as a port, so
111
- `http://::1:4321/` threw `ERR_INVALID_URL` at the first `new URL` against it
112
- and took `dev:smoke` down with a message naming neither the address nor the
113
- host. Wildcard binds still become `localhost`; anything carrying a colon is
114
- bracketed.
115
- - **The detail page's logo tile is a fixed square.** `aspect-ratio: 1` derived
116
- its width from the height the box had *before* `align-self: stretch` grew it,
117
- so it rendered 56x93 beside a logo and 56x70 beside a letter — portrait,
118
- never square, and narrow enough to read as bounding the image rather than
119
- framing it.
120
- - **The list row's glyphs sit on the row's centre.** `vertical-align: middle`
121
- aligns to half the parent's x-height, about 2px under the line's true middle
122
- at this step, and the upvote arrow's optical nudge added a third pixel the
123
- same way. The kind and rating cells are flex boxes now and centre their
124
- contents as boxes.
125
- - **Keyword chips could freeze part-way through the rail's slide.** The rail
126
- animates a rescore by inverting each chip with an inline `translate` and
127
- dropping it on the next animation frame. A rescore that also changes how many
128
- chips fit commits a second time, and that commit cancelled the frame before
129
- it ran — leaving every moved chip parked at its offset with transitions
130
- disabled. Deselecting the last keyword hit it most often, because that
131
- rescore is the largest. The offsets are now cleared before each measurement
132
- and on cleanup, so an interrupted slide resolves instead of sticking.
133
- - **Switching between the cards and list views repainted the whole catalog.**
134
- Off-screen cards are skipped until they are scrolled to. The two views share
135
- no element types, so a switch still rebuilds every item — past a few hundred
136
- packages the answer is windowing the list, and this is not that.
69
+ - Bracket an IPv6 address in the dev server's URL *(renderer)*
70
+ - Make the detail page's logo tile a fixed square *(renderer)*
71
+ - Centre the list row's glyphs on the row, not the x-height *(renderer)*
72
+ - Open the keyword overflow menu in the top layer *(renderer)*
73
+ - Stop keyword chips freezing part-way through the rail's slide *(renderer)*
74
+ - Hold the detail logo against the title, and stop framing it *(renderer)*
137
75
 
138
76
  ## [0.5.0] - 2026-08-30
139
77
 
140
78
  ### Added
141
79
 
142
- - **Theme overlay.** A `theme/` directory in an index repo is copied over the
143
- renderer's staged sources before every build. A file at a path the renderer
144
- does not ship adds one `theme/pages/setup.astro` becomes `/setup/` — and a
145
- file at a path it does ship replaces it. Structure is customizable now, not
146
- just CSS. Only on the staged-copy path: a caller-supplied `srcDir` is left
147
- alone.
148
- - **Two paths the overlay refuses**, `theme/lib/**` and a root
149
- `theme/content.config.ts`, so the renderer stays free to move its own helpers
150
- and its one content-collection entrypoint. Each prints a line to stderr and
151
- the build still succeeds. The same rule applies to `dev`'s mirror, because a
152
- deny-list only one of the two writers honours lets an author develop against
153
- a file the build then drops in silence. It is a compatibility guard, not a
154
- security boundary: the copy does not follow symlinks either way.
155
- - **`@grim/*` import specifier**, resolving to the renderer's sources so an
156
- added page reaches the layout, components and helpers without a relative
157
- path that encodes how deep it sits under `pages/`. It resolves *after* the
158
- overlay, so an index that replaced a component imports its own.
159
- - **`@grim-original/*`**, the same tree as it was *before* the overlay ran, so
160
- an override can wrap the file it replaced instead of owning it outright.
161
- `@grim/*` cannot serve that purpose once the theme has taken the path, and
162
- the package's `exports` do not publish the Astro sources for a deep import.
163
- - **One stderr line per overlaid path that replaces a shipped file**, naming
164
- the path and the indexer version that shipped it. That is what makes the
165
- Unstable tier below honest without a manifest. A path that only adds a file
166
- is not logged.
167
- - **`dev` mirrors `theme/**` edits** into the staged tree, so a page reloads as
168
- it is saved. It creates `theme/` first if it is absent — a directory added
169
- after the server started now mirrors instead of 404ing forever — and removes
170
- it again on shutdown if you left it empty. Deletes are still not mirrored;
171
- restart for those. A fault in the platform's recursive-watch backend disables
172
- mirroring with a message rather than taking the server down.
173
- - **`nav` config key.** An ordered `{label, href}` list that takes the header
174
- over. Unset, it synthesizes exactly what the header has always shown, so an
175
- index that predates the key renders unchanged; `[]` leaves the theme toggle
176
- standing alone.
177
- - **`notice` config key.** One line above the page content, in the site's own
178
- width, on every page, carrying `data-slot="site-notice"`. Named `notice`
179
- rather than `banner` because `--grim-color-banner-*` is the existing amber
180
- palette for the deprecated-package banner, and a key called `banner` would
181
- invite an index runner to override that token family by mistake.
182
- - **`nav[].external` and `footerLinks[].external`.** Optional per entry, and it
183
- decides only the new-tab affordance — the deployment base prefix is applied
184
- either way. Unset keeps the old inference from the href's shape. `false` is
185
- the case that inference cannot express: an absolute URL that is still your
186
- own site, a staging host or an intranet mirror.
187
- - **A build-time warning for a `nav` or `footerLinks` href that leads nowhere.**
188
- A `/`-rooted href matching no emitted route and no `public/` file prints
189
- `nav[0].href "/setup/": nothing is published at that path — the link will
190
- 404`. It warns and never fails: a path served by something outside the build
191
- is indistinguishable from a typo, and refusing a whole site over a footer
192
- typo is worse than the typo. Checked after the build, which is the one moment
193
- both the emitted routes and every `public/` layer exist at once.
194
- - **A warning for an unrecognised top-level key in `index.config.json`**,
195
- naming the key. Without it a typo — or a config predating the `banner` →
196
- `notice` rename — loaded clean and silently rendered nothing.
197
- - **`init` scaffolds `theme/README.md` and a `tsconfig.json`** mapping
198
- `@grim/*` for editors. The README states where a page goes and which parts of
199
- the overlay are promised, which a `.gitkeep` could not; both reserve `theme/`
200
- for git equally well. `theme/pages/` is no longer created empty. The build
201
- does not read that tsconfig.
202
- - **A documentation site** (MkDocs Material, Diátaxis), built `--strict` as the
203
- docs' pre-merge gate and published to GitHub Pages. `task docs:build`,
204
- `docs:serve`, `docs:clean` — deliberately not part of `task check`, which
205
- must stay runnable with no Python toolchain.
206
- - **Individually replaceable components**: `SiteHeader`, `SiteFooter`,
207
- `CommandBar`, `CopyButton`, `CardLogo`, `PackageCard`, `PackageRow`.
208
- - **This changelog**, which two docs pages already made the sole mitigation for
209
- the Unstable tier. It ships in the npm tarball, so the copy that matches your
210
- pinned version is `node_modules/@grimoire-rs/indexer/CHANGELOG.md`.
211
- - **`npm run typecheck:tests`**, type-checking the `test` tree under its own
212
- `tsconfig.test.json`. Deliberately not wired into `task check` yet: the tree
213
- has 95 real type errors, which is its own piece of work.
80
+ - Carry the rating thread URL into the catalog *(renderer)*
81
+ - Redraw the package card, and keep the view across a visit *(renderer)*
82
+ - Give the detail page its right column back *(renderer)*
83
+ - Pick keyword chips by splitting power *(renderer)*
84
+ - Give the catalog a keyword facet and a list view *(renderer)*
85
+ - Ship square, behind one radius knob *(renderer)* **BREAKING**
86
+ - **Migration:** every corner is square by default. `--grim-radius-base` is the whole decision `0px` now, `4px` restores the rounding of `0.4.x` and earlier in one line. The four measurement steps derive from it and hold their ratios; overriding one step directly still beats the derivation, so a consumer wanting square surfaces and rounded controls sets that step and ignores the knob. Four steps at 4/6/8/10px was a distinction nobody perceived — they were only pickable after their roles were written down, and the package list had already ended up on the wrong one silently. Square reads as the developer tool this is, and `pill` stays off the knob because a chip is a
87
+ - Show the package logo in the list view *(renderer)*
88
+ - Add nav and notice, behind one URL guard for every link value *(config)* **BREAKING**
89
+ - **Migration:** `footerLinks[].href` now accepts a site-root path as well as an absolute URL, and both link keys are validated when the config loads, so a
90
+ - Lay an index repo's theme/ over the shipped sources *(renderer)*
91
+ - Scaffold theme/README.md and an editor tsconfig that loads *(init)* **BREAKING**
92
+ - **Migration:** `init` no longer creates `theme/pages/.gitkeep`. An index scaffolded before this keeps its own copy; nothing removes it.
214
93
 
215
94
  ### Changed
216
95
 
217
- - **`footerLinks[].href` now accepts a site-root path** (`/setup/`) as well as
218
- an absolute `http(s)` URL previously `http(s)` only. `nav` takes the same
219
- rule from one shared validator, and so now do `logo` and `favicon`, which had
220
- three different answers between them and one that validated nothing. Both
221
- link keys are checked when the config *loads*, so a `javascript:` or
222
- protocol-relative href fails the build with the key that carried it, rather
223
- than reaching a rendered anchor. A bare relative path is still refused: it
224
- would resolve against whichever page carries the link, and the detail pages
225
- sit two levels deep.
226
- - **`/\host/x` and userinfo are refused everywhere a config value becomes a
227
- URL.** Browsers read `/\host/x` the way they read `//host/x`, and
228
- `https://good.test@evil.test/` resolves to `evil.test` while reading as
229
- `good.test`. Two of the four validators already rejected userinfo; all four
230
- do now.
231
- - **Footer links go through the deployment base prefix, and honour the same
232
- new-tab rule as the header.** They did neither before. **This changes an
233
- existing site:** an `https://` footer link now opens in a new tab. Set
234
- `"external": false` on the entry to keep it in the same tab.
235
- - **`Base.astro` no longer contains the header and footer markup** — they are
236
- `SiteHeader.astro` and `SiteFooter.astro`. Neither takes props: everything
237
- they draw is build-time config. The head, the centered `main`, the copy toast
238
- and every default style still come from the layout.
239
- - **The platform-preselect loop moved into `Base.astro`**, so a `<CommandBar
240
- detect />` on a page you added under `theme/pages/` preselects the visitor's
241
- own platform. It used to run only on the shipped landing page, so the same
242
- markup elsewhere silently showed the configured first choice instead.
243
- - **`Catalog.tsx` no longer contains the card and row markup** — they are
244
- `PackageCard.tsx` and `PackageRow.tsx`, and they *do* take props, because a
245
- component that hydrates in the browser cannot read the build-time payload.
246
- Those props are the contract the Unstable tier is about.
247
- - **The install/registry/package command boxes are one `CommandBar`**, with
248
- their choices derived in `@grim/lib/commands` — so a page an index adds can
249
- draw the site's real install bar from the site's own config instead of
250
- restating the command in a code block that drifts.
251
- - **The renderer ships square.** `--grim-radius-base` is `0px`; set it to `4px`
252
- to restore the rounding of `0.4.x` and earlier in one line.
253
- - **Radius tokens are named for their role**: `--grim-radius-sm`/`-md`/`-lg`/
254
- `-xl` are now `-code`, `-inset`, `-control` and `-surface`, and they derive
255
- from `--grim-radius-base` rather than carrying their own values. `-pill` is
256
- unchanged and off the knob. An override under an old name is silently
257
- ignored, like any unknown property.
258
- - **The list view leads with the package logo**, then the name, then the kind
259
- mark.
260
- - **The README is a pointer to the docs site.** The theming contract, the stats
261
- sidecar schema and the CLI reference moved into `docs/`.
262
- - **The scaffolded `tsconfig.json` sets `module` and `moduleResolution`**
263
- `esnext`/`bundler`, what actually reads those specifiers and no longer sets
264
- `baseUrl`, which is deprecated on the pinned TypeScript and made the file
265
- fail to load. It stays free of `extends` on purpose.
266
- - **The docs workflow splits `configure-pages` into its own job**, so the job
267
- that resolves and executes unpinned transitive PyPI packages holds
268
- `contents: read` and nothing else — `id-token: write` is a job-wide grant.
269
- lychee now checks the external links `mkdocs --strict` never resolves and,
270
- with `--include-fragments`, the `#anchor` half of the internal ones, which
271
- `--strict` logs at INFO and exits 0 on.
272
- - **eslint and vitest skip `.agents/worktrees/`.** Both tools walk the tree
273
- themselves rather than asking git, and neither knew about a path `.gitignore`
274
- had carried all along: eslint found a `tsconfig.json` per worktree and
275
- reported a parse error on every file in the repo, and vitest collected and
276
- ran each worktree's whole suite. A `.gitignore` entry and a tool's own ignore
277
- list are two independent claims.
96
+ - Name the radius tokens for their role *(renderer)* **BREAKING**
97
+ - **Migration:** `--grim-radius-sm`, `-md`, `-lg` and `-xl` are now `--grim-radius-code`, `-inset`, `-control` and `-surface`. `-pill` is unchanged and no value moved. A `customCss` override under an old name is silently ignored, like any unknown custom property; `README.md` carries the migration note. Every other family in `tokens.css` names the role a value plays rather than its size — that is the rule this sheet states about itself, and the radius scale was the one family breaking it. The cost was not cosmetic: with nothing saying which step a surface should take, the package list ended up on the control step next to cards on the surface step, and the two corners disagreed. That is fixed here too. The contract comment now publishes what each step is for, and warns against picking by eye — the same radius on a shorter box reads as more curve, so two corners that look different are often the same step.
98
+ - Lead the list row with logo, name, then kind *(renderer)*
99
+ - Put the kind mark before the name in the list *(renderer)*
100
+ - Make the header, footer, command bar and cards replaceable *(renderer)* **BREAKING**
101
+ - **Migration:** an `https://` footer link now opens in a new tab. Set
102
+
103
+ ### Documentation
104
+
105
+ - Write down the local loop -- direnv, task, and the dev index
106
+ - Publish a documentation site, and start a changelog
107
+
108
+ ### Fixed
109
+
110
+ - Hang the kind watermark off the corner by a share of its size *(renderer)*
111
+ - Point the dev fixture at the real extension id *(dev)*
112
+
113
+ ## [0.4.4] - 2026-08-29
114
+
115
+ ### Fixed
116
+
117
+ - Upload the tally -- a dotfile artifact was silently dropped *(ratings)*
118
+
119
+ ## [0.4.3] - 2026-08-28
120
+
121
+ ### Fixed
122
+
123
+ - Stop locking threads by default -- a locked one cannot be voted on *(ratings)* **BREAKING**
124
+
125
+ ## [0.4.2] - 2026-08-28
126
+
127
+ ### Added
128
+
129
+ - Publish zero-vote threads so a first vote can be cast *(ratings)* **BREAKING**
130
+
131
+ ## [0.4.1] - 2026-08-28
132
+
133
+ ### Added
134
+
135
+ - Make the whole theming surface a token contract *(renderer)* **BREAKING**
136
+ - **Migration:** every CSS custom property is renamed. The unnamespaced tokens (`--accent`, `--bg`, `--fg`, and the rest) are now `--grim-color-*`, and space, type, radius, border width, motion and elevation become overridable for the first time under `--grim-space-*`, `--grim-text-*`, `--grim-radius-*`, `--grim-border-width`, `--grim-duration-*` and `--grim-shadow-*`. A `theme.css` written against 0.4.0 or earlier stops applying silently rather than erroring.
137
+ - Publish a checkpoint, and seed the sidecars from it *(enrich)*
138
+
139
+ ### Fixed
140
+
141
+ - Stop reading a large page as a transport failure *(ratings)*
142
+ - Stop every run dying on PAGE_SIZE at import *(ratings)*
143
+
144
+ ## [0.4.0] - 2026-08-26
145
+
146
+ ### Added
147
+
148
+ - Publish a stats.json sidecar from the index's own forge (#5) *(ratings)*
149
+ - Carry grim's annotation fields, and date every package *(enrich)*
150
+ - Show provenance and support, and publish the updated signal *(renderer)*
151
+
152
+ ### Documentation
153
+
154
+ - Document the second stat, and release 0.4.0
155
+
156
+ ## [0.3.1] - 2026-07-30
157
+
158
+ ### Documentation
159
+
160
+ - Point at the index template repository
161
+
162
+ ## [0.3.0] - 2026-07-30
163
+
164
+ ### Added
165
+
166
+ - Own the pipeline in the index repo, and harden the gate *(ci)* **BREAKING**
167
+ - **Migration:** the reusable workflows `grimoire-rs/indexer/.github/workflows/index-{pages,validate}.yml` and the GitLab remote include are gone. An index scaffolded on 0.2.x keeps working on its pinned tag; to move, bump the dependency, add a `ci` block to index.config.json, run `npm run ci`, and delete the old thin callers - `ci --check` reports them as stale.
168
+
169
+ ## [0.2.2] - 2026-07-28
278
170
 
279
171
  ### Fixed
280
172
 
281
- - **Scaffold `npm install` build was broken end to end.** An index repo has
282
- its own `node_modules`, and the staged root Astro builds in sits inside it,
283
- so `preact-render-to-string` resolved to a second copy of preact. The first
284
- hook rendered died with `Cannot read properties of undefined (reading
285
- 'context')`, in a stack naming preact and lucide and nothing that leads back
286
- to dependency resolution. Every preact-touching module is pinned to one copy
287
- now, and `preact-render-to-string` is a declared dependency so it resolves
288
- under an isolated install layout too.
289
- - **A replaced header with no theme toggle no longer breaks the rest of the
290
- page.** The `#theme-toggle` lookup in `Base.astro` is null-safe, so the copy
291
- buttons, the picker wiring and the toast still run.
292
- - **A `tsconfig.json` in the index repo that cannot be parsed is now named.**
293
- It made the build fail while rendering a page with an error about preact; the
294
- usual cause is an `extends` pointing into a `node_modules` that has not been
295
- installed yet.
296
- - **`dev` cleans up after itself.** Stopping the server is idempotent, and a
297
- failure part-way through staging removes the scratch directory rather than
298
- leaving it in the index repo. One case is not fixable from inside shutdown
299
- and is written up in the docs: interrupting `dev` within about a second of
300
- boot can leave a `.index-*` holding Vite's `deps_temp_<hash>`, which the
301
- dependency optimizer recreates after the removal has already returned.
302
-
303
- [Unreleased]: https://github.com/grimoire-rs/indexer/compare/v0.5.2...HEAD
173
+ - Stop defaulting the keys that name one specific index *(config)*
174
+
175
+ ## [0.2.1] - 2026-07-28
176
+
177
+ ### Fixed
178
+
179
+ - Stop gitignoring the index's own public/ directory *(init)*
180
+
181
+ ## [0.2.0] - 2026-07-28
182
+
183
+ ### Added
184
+
185
+ - Write a contents sidecar from the artifact payload *(enrich)*
186
+ - Add a header logo, and let an index drop the attribution *(config)*
187
+ - Rebuild the hero and the package page *(renderer)*
188
+
189
+ ## [0.1.9] - 2026-07-28
190
+
191
+ ### Added
192
+
193
+ - Offer the index as a one-click VS Code add-registry link *(renderer)*
194
+
195
+ ## [0.1.8] - 2026-07-28
196
+
197
+ ### Fixed
198
+
199
+ - Hand the gate every changed path, unfiltered *(validate)*
200
+
201
+ ## [0.1.7] - 2026-07-28
202
+
203
+ ### Added
204
+
205
+ - Read package READMEs, logos and versions from the registry (#1) *(enrich)*
206
+
207
+ ## [0.1.6] - 2026-07-28
208
+
209
+ ### Fixed
210
+
211
+ - Give the GitLab gate the git it shells out to *(ci)*
212
+
213
+ ## [0.1.5] - 2026-07-28
214
+
215
+ ### Fixed
216
+
217
+ - Resolve every internal URL against the site's base path *(renderer)*
218
+
219
+ ## [0.1.4] - 2026-07-28
220
+
221
+ ### Documentation
222
+
223
+ - Say the gate does not cover a first-party announce *(init)*
224
+ - Record what the live end-to-end trial settled
225
+
226
+ ### Fixed
227
+
228
+ - Point --with-skills announce at the scaffolded repo *(init)*
229
+ - Name the status check branch protection can require *(init)*
230
+
231
+ ## [0.1.3] - 2026-07-28
232
+
233
+ ### Fixed
234
+
235
+ - Ship the reusable workflows the scaffold points at *(ci)*
236
+
237
+ ## [0.1.2] - 2026-07-28
238
+
239
+ ### Fixed
240
+
241
+ - Declare the repository provenance attests to
242
+
243
+ ## [0.1.1] - 2026-07-28
244
+
245
+ ### Added
246
+
247
+ - Add the grimoire-index renderer, gate and CLI
248
+
249
+ ### Changed
250
+
251
+ - Publish as @grimoire-rs/indexer
252
+ - Name the binary grim-indexer
253
+
254
+ ### Documentation
255
+
256
+ - State the real status and warn off the broken 0.1.0
257
+
258
+ ### Fixed
259
+
260
+ - Declare a bin npm will not silently strip
261
+
262
+ [0.5.4]: https://github.com/grimoire-rs/indexer/compare/v0.5.3...v0.5.4
263
+ [0.5.3]: https://github.com/grimoire-rs/indexer/compare/v0.5.2...v0.5.3
304
264
  [0.5.2]: https://github.com/grimoire-rs/indexer/compare/v0.5.1...v0.5.2
305
265
  [0.5.1]: https://github.com/grimoire-rs/indexer/compare/v0.5.0...v0.5.1
306
266
  [0.5.0]: https://github.com/grimoire-rs/indexer/compare/v0.4.4...v0.5.0
267
+ [0.4.4]: https://github.com/grimoire-rs/indexer/compare/v0.4.3...v0.4.4
268
+ [0.4.3]: https://github.com/grimoire-rs/indexer/compare/v0.4.2...v0.4.3
269
+ [0.4.2]: https://github.com/grimoire-rs/indexer/compare/v0.4.1...v0.4.2
270
+ [0.4.1]: https://github.com/grimoire-rs/indexer/compare/v0.4.0...v0.4.1
271
+ [0.4.0]: https://github.com/grimoire-rs/indexer/compare/v0.3.3...v0.4.0
272
+ [0.3.1]: https://github.com/grimoire-rs/indexer/compare/v0.3.0...v0.3.1
273
+ [0.3.0]: https://github.com/grimoire-rs/indexer/compare/v0.2.2...v0.3.0
274
+ [0.2.2]: https://github.com/grimoire-rs/indexer/compare/v0.2.1...v0.2.2
275
+ [0.2.1]: https://github.com/grimoire-rs/indexer/compare/v0.2.0...v0.2.1
276
+ [0.2.0]: https://github.com/grimoire-rs/indexer/compare/v0.1.9...v0.2.0
277
+ [0.1.9]: https://github.com/grimoire-rs/indexer/compare/v0.1.8...v0.1.9
278
+ [0.1.8]: https://github.com/grimoire-rs/indexer/compare/v0.1.7...v0.1.8
279
+ [0.1.7]: https://github.com/grimoire-rs/indexer/compare/v0.1.6...v0.1.7
280
+ [0.1.6]: https://github.com/grimoire-rs/indexer/compare/v0.1.5...v0.1.6
281
+ [0.1.5]: https://github.com/grimoire-rs/indexer/compare/v0.1.4...v0.1.5
282
+ [0.1.4]: https://github.com/grimoire-rs/indexer/compare/v0.1.3...v0.1.4
283
+ [0.1.3]: https://github.com/grimoire-rs/indexer/compare/v0.1.2...v0.1.3
284
+ [0.1.2]: https://github.com/grimoire-rs/indexer/compare/v0.1.1...v0.1.2
285
+ [0.1.1]: https://github.com/grimoire-rs/indexer/tree/v0.1.1
286
+
package/README.md CHANGED
@@ -95,6 +95,32 @@ task dev -- --help
95
95
 
96
96
  `task --list` has the rest; `task check` is the whole gate CI runs.
97
97
 
98
+ ### Cutting a release
99
+
100
+ `CHANGELOG.md` is generated from git history by git-cliff and rewritten whole
101
+ on every release, so an entry is only ever as good as the commit subject it
102
+ came from — write the subject for the person reading the changelog. Non-`feat`,
103
+ non-`fix` types are grouped or skipped per `cliff.toml`. `task
104
+ release:changelog:preview` shows what the next release would say.
105
+
106
+ ```sh
107
+ task release:prepare # menu: auto | patch | minor | major
108
+ task release:prepare BUMP=minor # or name the level outright
109
+ ```
110
+
111
+ `auto` takes the level from those same subjects (`cliff.toml`'s `[bump]` rules:
112
+ a feat is a minor bump, a breaking change is not yet a major one). It is a
113
+ second opinion — a subject that undersells its change bumps too little, and the
114
+ other three levels are for saying so.
115
+
116
+ The task writes the version into `package.json` and the lockfile, regenerates
117
+ `CHANGELOG.md` under the new tag, and runs `task check`. Nothing is committed:
118
+ review the diff, then run the three commands it prints. Pushing the `v*` tag is
119
+ what publishes — see `.github/workflows/release.yml`.
120
+
121
+ `task release:changelog` regenerates the file without releasing, which is what
122
+ a commit landing between releases needs.
123
+
98
124
  The docs site is a separate toolchain and deliberately not part of `check` —
99
125
  `check` must stay runnable with no Python present. `task docs:serve` previews
100
126
  it, `task docs:build` is the strict build the `pages` workflow gates PRs with.
@@ -1 +1 @@
1
- {"version":3,"file":"ratings.d.ts","sourceRoot":"","sources":["../../src/cli/ratings.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAoF1D,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwE7D"}
1
+ {"version":3,"file":"ratings.d.ts","sourceRoot":"","sources":["../../src/cli/ratings.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAsG1D,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgF7D"}