✨ Add package categorization to extensions and llms.txt#1136
Merged
Conversation
commit: |
cowboyd
reviewed
Mar 4, 2026
This was referenced Apr 5, 2026
Update Node package adapter to read keywords and description from package.json manifest: - Add keywords and description to PackageJsonSchema - Add keywords and description to PackageManifest interface - Update getManifest() to include both fields - Add getKeywords() method to Package interface - Update getDescription() to prefer manifest over README extraction This enables categorization of packages in the extensions listing and llms.txt output.
Update llms.txt route to organize packages into semantic categories based on their keywords in package.json: - Testing: bdd, vitest, test-adapter, converge - I/O & Network: fetch, websocket, fs, node - Processes: process, tinyexec, watch - Streams: stream-helpers, stream-yaml, jsonl-store - Concurrency: task-buffer, timebox, scope-eval - Reactivity: signals, fx - Interop: effect-ts, chain, context-api - Platform: worker, raf, deno-deploy This helps AI agents quickly find the right package for their use case by browsing semantically grouped categories rather than a flat list.
Reorganize the extensions page with a sidebar navigation showing categories and grouped package sections: - Add sticky sidebar with category links (hidden on mobile) - Group packages into categories based on keywords - Each category section shows related packages - Maintain Frameworks section at the top Categories shown: - Frameworks (StarFX) - Testing - I/O & Network - Processes - Streams - Concurrency - Reactivity - Interop - Platform Packages appear in multiple categories if they have multiple keywords (e.g., converge appears in both Testing and Concurrency).
Revolution JSX requires arrays from .map() to be wrapped in container elements when used directly inside certain parent elements like <nav> or <article>. Added wrapper <div> elements around mapped arrays to fix the 'Expected node, not [object Object]' error from hast-util-to-html.
f880e91 to
c5930d8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
AI agents and developers need better ways to discover the right EffectionX package for their use case. A flat list of 24+ packages makes it hard to find what you need.
This PR adds categorization to both the
/effection/x/page and/llms.txtroute, grouping packages by their primary use case.Approach
Data Layer
Packages are categorized using
keywordsin theirpackage.json(the standard npm field). The taxonomy definition (category labels, descriptions, and display order) lives in the effectionx rootpackage.jsonundereffectionx.categories(thefrontside/effectionx#211, merged).Per-package keyword audit: thefrontside/effectionx#210 (merged)
Website Schema
keywordsanddescriptiontoPackageJsonSchemaandPackageManifestgetKeywords()method to Package interfacegetDescription()to preferpackage.jsondescription over README extractionDynamic Taxonomy Loading
The website reads the category taxonomy from the cloned effectionx repo at runtime via
useTaxonomy():www/lib/package/taxonomy.ts—useTaxonomy()Operation readseffectionx.categoriesfrom the cloned rootpackage.json, validated with ZodDEFAULT_CATEGORIESwhen the field is absent; throws on malformed datawww/lib/package/categories.ts—groupPackagesByCategory()accepts taxonomy as a parameter, shared by both routeswww/lib/clones.ts— Clone helper now refreshes existing clones (fetch + reset --hard) on every access so taxonomy changes appear without server restartllms.txt Route
Groups packages by category for better AI agent retrieval:
Extensions Page
Added a sticky sidebar with category navigation: