* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reusable tag groups with `$group:`
A `$group:<group-name>` marker in `tags` is replaced in place with the tags of
`groups/<group-name>.json`: a small set of tags for what a variant suffix
means, such as `-minus` → remove, delete.
- Read groups in `readGroups` and resolve markers next to `$extends:`,
failing on unknown groups and on `$group:` outside `tags`
- Add `group.schema.json` and lint, spell-check and format `groups/*.json`
- `pnpm checkIcons` also fails on literals a group already provides, and
warns about icons that list a group's tags by hand and unused groups
- Add the `minus`, `plus` and `x` groups and use them in
`alarm-clock-minus`, `file-minus`, `file-plus` and `file-x`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix group checker
* Apply batched suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix resolving icon metadata
* feat(metadata): reuse metadata from a base icon with `$extends:`
Icon metadata can reference a base icon with an inline `$extends:<icon-name>`
marker in `tags`, `categories` or `contributors`. The marker is replaced in
place with the base icon's resolved values at build time.
- Resolve markers in `readAllMetadata` and `getIconMetaData`, failing on
unknown icons, self references and circular chains
- Accept markers in `icon.schema.json`
- `pnpm checkIcons` fails on duplicate markers and on literals a marker
already provides, and runs in CI
- Docs read the resolved metadata index instead of the raw icon JSON
- Use `$extends:alarm-clock` in `alarm-clock-minus`
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Fix resolving icon metadata
* Fix comments
* Format code
* Update tools/build-helpers/src/resolveMetadataExtends.ts
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* chore(deps): bump the build-deps group across 1 directory with 2 updates
Bumps the build-deps group with 2 updates in the / directory: [typescript](https://github.com/microsoft/TypeScript) and [rollup](https://github.com/rollup/rollup).
Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/compare/v6.0.3...v7.0.2)
Updates `rollup` from 4.63.1 to 4.65.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.63.1...v4.65.0)
---
updated-dependencies:
- dependency-name: typescript
dependency-version: 7.0.2
dependency-type: direct:development
update-type: version-update:semver-major
dependency-group: build-deps
- dependency-name: rollup
dependency-version: 4.65.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: build-deps
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps): keep typescript on v6 and ignore v7 major updates
TypeScript 7 (the native port) ships without the JS compiler API, which
typescript-eslint, rollup-plugin-dts, svelte-package/svelte-check, astro
check, the Angular compiler, vue-tsc and @vue/compiler-sfc all depend on.
Revert typescript to ^6.0.3, keep the rollup bump, and tell dependabot to
skip typescript major updates until the ecosystem supports v7.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Eric <eric.fennis@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Update deps
* chore(deps): use next for solid-js and @solidjs/web in Solid 2 integration
Keeps the integration on the same Solid release as @lucide/solid, so the
two no longer resolve separate solid-js copies sharing one @solidjs/signals,
which broke the declaration typecheck (TS2717 on ServerObserve.trace).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(icons): align Unicode currency icon cap heights with other typographic icons
Also deprecates badge-, receipt- currency variants
* fix(icons): update riyal to be more in line with specifications
Rightmost lines evenly spaced, leftmost path somewhat lower than the currently matching line
* feat(icons): added letter icons for each uppercase letter of the English alphabet
* feat(icons): extend letter icons with specific use cases instead of generic ones
* feat(icons): replaced letter-z with more grid-aliged version
* feat(icons): add contributors from strikethrough to letter-s
* feat(icons): added square-letter-* & circle-letter-* icons
* feat(icons): manually optimized some icons
* fix(icons): deprecated circle-parking
* Rename import
* fix(icons): fix use case syntax for (circle|square)-letter icons
* fix(icons): added new Letters & digits category
* fix(icons): added numbers to new Letters & digits category
---------
Co-authored-by: Eric <eric.fennis@gmail.com>
* feat(icons): added letter icons for each uppercase letter of the English alphabet
* feat(icons): extend letter icons with specific use cases instead of generic ones
* feat(icons): replaced letter-z with more grid-aliged version
* feat(icons): add contributors from strikethrough to letter-s
* fix(icons): fix use case syntax for letter icons
* feat(icons): added `square-kanban-plus` icon
Adds square-kanban-plus for issue #4416.
Also updates emoji category icon reference after smile rename.
* chore(icons): expand square-kanban-plus metadata from PR suggestions
Apply curated tags, categories, and use-cases from automated
metadata review suggestions.
* Apply design from @jguddas
* Update contributors and use cases in square-kanban-plus.json
Added new contributors and updated use cases to improve clarity.
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
* feat(docs): track homepage, icons page and icon drawer interactions with OpenPanel
Adds track/trackDebounced helpers around the shared OpenPanel instance and
sends events for hero actions, home search, packages, the style customizers,
homepage scroll depth, icon search (start, queries, no results), sort,
Lab library toggle, and the drawer's See in action, copy and studio buttons.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* feat(docs): send homepage scroll depth once on page leave
Instead of one event per milestone, record the deepest scroll position and
send a single home_scroll_depth event (percent + milestone) when the visitor
navigates away, closes the tab, or hides it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* feat(docs): simplify scroll depth tracking to the position on page leave
Drop the max-depth composable and send a single scroll_depth event with the
current scroll percentage before a route change and on visibilitychange,
pagehide and beforeunload, for every page.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* refactor(docs): move scroll depth tracking into the OpenPanel utils
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* refactor(docs): move router and browser tracking setup into the OpenPanel utils
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011GcWdCmSmcDiiAazR5mNUD
* Add privacy-policy
* adjust text
* Remove plausible
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Added icons/earbuds.svg
* Added icons/earbuds.json
* Create earbuds-off.json icon schema
Added a JSON schema for earbuds-off icon with use cases, tags, and categories.
* Add earbuds-off.svg icon file
* Update use-cases and fix typo in earbuds-off.json
* Refine use-cases and correct tag spelling
Updated use-cases and tags for clarity and added communication category.
* Update use cases and categories in earbuds-off.json
* Update categories
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Rewrite non-empty use-cases in icon metadata to follow
.github/instructions/metadata.instructions.md: start with a capitalized
present participle, no trailing periods, roughly 4-12 words, no first
person, and variant-specific wording instead of copied lines.
Claude-Session: https://claude.ai/code/session_011ftUgp98e8VLgymjSb9qbQ
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-27 14:55:29 +01:00
Eric Fennisgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>Karsa
* feat(icons): add laser icon with metadata
* Update icons/laser.json
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Add more use cases and tags
* Update laser icon design
The laser design is according to @karsa-mistmere suggestion.
* Update laser icon design and its metadata
* Remove 'cursors' and 'devices' from categories
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: Karsa <contact@karsa.org>
When the name prop changes while the previous icon is still loading, the earlier import could resolve last and overwrite the newer icon, leaving DynamicIcon showing the wrong icon. The effect now ignores results from a superseded name.
* feat(icons): added dirham icon
* feat(icons): use letter-d geometry from karsa-mistmere for dirham
* Apply suggestion from @github-actions[bot]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat(metadata): add full names to dirham tags as requested by maintainer
* fix(metadata): add required use-cases field to dirham.json
* Apply suggestion from @github-actions[bot]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Update and rename dirham.json to emirati-dirham.json
* Rename dirham.svg to emirati-dirham.svg
---------
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Karsa <contact@karsa.org>
* feat(lucide-react): add package exports for per-icon imports without changing how Node resolves the package
Makes `lucide-react/icons/<name>` and `lucide-react/types` public so a
single icon can be imported with a small shared declaration instead of
the 2.2 MB `dist/lucide-react.d.ts`, and without loading the CJS barrel
on the server.
The root entry only lists `module` and `default`, so bundlers keep the
ESM barrel and Node keeps resolving to `dist/cjs/lucide-react.js` as it
does today through `main`. The map reverted in #2814 sent Node to the
ESM barrel, which is what #2743 hit. `./dist/*` keeps existing deep
imports working.
* Modify getting started guide for icon imports
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix(lucide-react): add node, import and require conditions after module and keep the extension-specific and src subpaths exported
Resolvers that are called with a custom condition list drop `module` and fell through to `default`, the CJS bundle; esbuild with `conditions: ['workerd', 'worker']` bundled 1.3 MB instead of the 58 KB tree-shaken output it gets on main. The root and `./icons` entries now list `node`, `import` and `require` after `module`, with `node` ahead of `import` so Node keeps resolving to `dist/cjs/lucide-react.js` for both `import` and `require`.
`lucide-react/dynamic.mjs`, `lucide-react/dynamic.js` and `lucide-react/dynamicIconImports.mjs` are imported by consumers and threw ERR_PACKAGE_PATH_NOT_EXPORTED; they have explicit entries again. The docs API routes import `lucide-react/src/createLucideIcon` and `lucide-react/src/Icon`, which Nitro left as external imports without a `./src/*` entry, so the entry from the 0.470.0 map is back.
* test(lucide-react): resolve the package entry points with Node itself in the React Router fixture
The browser suite resolves lucide-react through Vite, so nothing checked the `exports` map the way a server runtime does. `tests/exports.node.test.ts` runs under `node --test` from the fixture's `check` script and asserts where `import.meta.resolve` and `require.resolve` land for the root, `./icons`, a single icon, the dynamic entries with and without an extension, the `dist/*` passthrough and `package.json`, that `./types` is declaration-only, and that the resolved modules load. Vitest is told to leave that file to Node.
* docs(lucide-react): note that per-icon imports are ESM only
`require()` of `lucide-react/icons/<name>` needs Node.js 20.19 or 22.12; 20.18 throws ERR_REQUIRE_ESM.
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
* refactor(ci): move icon preview markup into a composite action
Move generateChangedIconsCommentMarkup.mts into .github/actions/icon-preview
as its own pnpm workspace package, following the suggest-metadata action.
svgson and @lucide/helpers are now real dependencies installed with a
filtered pnpm install, replacing the ad-hoc `npm install svgson --force`.
Paths are resolved from the repo root relative to the script, so it also
works through `pnpm --filter @lucide/icon-preview-action start`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ci): skip icon preview comment when no icons changed
When a pull request only deletes icons, CHANGED_FILES has no SVGs and the
script printed "No changed icons found" to stdout, which was then posted as
the preview comment.
The script now logs that to stderr. The action writes no markup file and
sets `has-changes=false`, the workflow skips the artifact upload, and the
comment workflow skips its steps when no artifact exists instead of failing
on the missing artifact.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* ci(icon-preview): post the preview comment from a pull_request_target workflow
Like the PR title workflow, the icon preview now runs on pull_request_target
and posts its comment directly, so comment-icon-preview.yml and the
workflow_run artifact hand-off are removed.
The job checks out the base branch and runs the action from there. The
changed SVGs are read from the pull request head with `git fetch` + `git show`
into a temp directory, so no code from the pull request is checked out or run.
File names are checked against `icons/<kebab-case>.svg` before use.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ci): store metadata suggestions in the review instead of actions/cache
pull_request_target runs can't write to the Actions cache ("cache write
denied: token has no writable scopes"), so the cache was never saved and
the model was asked again on every push. That produced new suggestions
anchored on the same lines as earlier ones.
Store the model's suggestions per icon name as hidden JSON in the review
body and read them back from the bot's earlier reviews, so the API is only
called for icons without stored suggestions. This drops the gh api and
actions/cache steps.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
* fix(ci): handle earlier metadata suggestion comments on older PRs
- Read values from the oldest comment format too, which doesn't start with
"Suggested `field`" and was posted without a closing fence; the field
is taken from the suggestion's `"field": [` line.
- Skip a field while an earlier suggestion for it is still applicable (not
outdated), so two suggestions never replace overlapping lines.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
* fix(ci): read icon metadata at the reviewed commit
The review comments are anchored to the commit that triggered the run,
but the icon JSON was read through the PR files' raw_url, which always
points at the latest head. When a commit was pushed while the action
was running, suggestions were anchored to the wrong lines, e.g. a
use-cases block replacing the "tags": [ line, producing invalid JSON.
Read each file at the reviewed commit instead, default that commit to the
PR's head SHA, and skip files that don't exist at it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(ci): run metadata suggestions on every PR update with cached results
- Run on opened/reopened/synchronize and queue runs per PR.
- Cache the model's suggestions per icon name with actions/cache, so the
OpenAI API is only called again for icons that are added or renamed.
- Skip suggestions that were already posted instead of skipping the whole
PR once it has a review.
- Suggest only the values to append after the last array item instead of
the whole array; empty and inline arrays still get the full block.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
* refactor(ci): key the suggestions cache on the PR's icon names
Replace the separate restore/save steps and the `cache-updated` output
with a single actions/cache step keyed on a hash of the changed icon
files, so the API is only called again when icon names change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
* style(ci): drop trailing blank line in suggest-metadata action
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
* fix(ci): dedupe metadata suggestions by value instead of comment body
The append-style suggestion includes the array's current last item, so
comparing whole comment bodies reposted the same values after a
contributor added a tag or applied part of a suggestion. Read the values
back from the bot's earlier suggestion blocks per file and field, and
exclude them like the current values.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TSdUq9uFpjuQsoobCBqz4j
---------
Co-authored-by: Claude <noreply@anthropic.com>
Track page views (initial load + client-side navigations) with the
@openpanel/web SDK, sending to the self-hosted instance at
insights.lucide.dev. This mirrors what the current Plausible script
tracks; Plausible stays in place for the icon popularity script.
Page views are sent from VitePress' onAfterRouteChange hook (after
nextTick) so the page title is already updated. Tracking only runs in
the browser and only when VITE_OPENPANEL_CLIENT_ID is set at build time.
The SDK is bundled from npm instead of loading op1.js, which EasyPrivacy
blocks; insights.lucide.dev/api/track matches no rule in the current
EasyList/EasyPrivacy, uBlock Origin or Brave lists.
Claude-Session: https://claude.ai/code/session_01AZuxmXLjrs29erwQcePCnX
Co-authored-by: Claude <noreply@anthropic.com>
* fix(scripts): keep contributors out of metadata suggestions
The shared metadata instructions include a Contributors section asking to
add the PR author, but the suggestion schema has no contributors field, so
the model leaked it into use-cases. Strip that section from the prompt and
explicitly restrict suggestions to tags, categories and use-cases.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MThCx7cVXV3XWfo5C327Ci
* refactor(ci): move metadata suggestions into a dedicated composite action
Move scripts/suggestMetaData.mts to .github/actions/suggest-metadata and
wrap it in a composite action with explicit inputs. The workflow now uses
the local action; package.json scripts point to the new location.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MThCx7cVXV3XWfo5C327Ci
* chore(ci): add .env.example for testing the suggest-metadata action locally
Document the env vars the script reads, point the debug/watch scripts at
an action-local .env, and fix the USE_FILE_SYSYEM typo.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MThCx7cVXV3XWfo5C327Ci
* chore(ci): make .github/actions a pnpm workspace
Add .github/actions/* to the pnpm workspace and give the suggest-metadata
action its own package.json with its dependencies (openai, zod, dotenv,
@octokit/rest). openai, zod and dotenv move out of the root package.json;
@octokit/rest stays there for updateContributors. The workflow now only
installs the action's dependencies, and the root suggest:metadata scripts
delegate to the action package.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MThCx7cVXV3XWfo5C327Ci
* Upgrade to gpt-6-luna
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(scripts): generate README sponsor tiers from Open Collective
updateSponsors.mts now fetches active recurring contributions from the
Open Collective GraphQL API, groups them by tier and rewrites the tier
sections in README.md between new markers, then propagates the block to
the package READMEs as before. Use --skip-fetch to only propagate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRsauu8mwJpB9y88vMMQ7n
* Add sponsors
* Remove digital ocean
* Fix capitalization and emoji in TIER_TITLES
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>