Astryx CLI Discover Command Component Resolution Algorithm
The Astryx CLI's discover command resolves components by scanning workspace packages via package.json metadata, then routing queries through a dispatcher-leaf architecture to return package lists, component documentation, or search results.
The discover command serves as the entry point for exploring external Astryx packages and their exported components. According to the source code in packages/cli/api/discover/discover.mjs, the component resolution algorithm follows a systematic discovery-and-route pattern that separates package detection from query-specific retrieval logic.
How the Discover Command Works
Phase 1: External Package Discovery
The resolution process begins with discoverPackages()—implemented in packages/cli/api/discover/_adapter.mjs. This function scans the workspace for Astryx-compatible packages by:
- Reading the
package.jsonof each workspace package - Identifying packages that contain an
astryxfield - Recognizing packages that export
@astryxdesign/*entry points - Recording package names and their component source directory locations
If discoverPackages() returns an empty list, the command immediately returns the list leaf with an empty result set and a configured: false flag, maintaining backward compatibility with the legacy flat command behavior.
Phase 2: Query Routing and Component Resolution
The discover dispatcher in packages/cli/api/discover/discover.mjs analyzes the query shape and delegates to specialized leaf modules:
| Query Pattern | Destination Leaf | Resolution Behavior |
|---|---|---|
| No query provided | list |
Returns catalog of all discovered packages |
@scope/name (single slash) |
detail |
Returns package-level metadata |
@scope/name/Component (second slash) |
doc |
Resolves component source directory and returns documentation |
| Free-text string | search |
Performs full-text search across all packages |
Scoped Package + Component Resolution Path
The most complex resolution occurs for component-specific queries. When the dispatcher detects a second slash in a scoped query:
- Package isolation: The segment before the second slash (
@scope/name) is extracted as the package identifier - Component identification: The segment after the second slash (
Component) is treated as the component name - Leaf delegation: The dispatcher calls
doc(packages, pkgName, compName, {lang, zh})inpackages/cli/api/discover/detail/doc/doc.mjs - Source file resolution: The doc leaf locates the component's directory, which must contain:
- Documentation extraction: The leaf returns the parsed documentation object containing component props, examples, and metadata
Error Contract
If the query parameter is not a string, the dispatcher throws an AstryxError with code ERR_INVALID_ARGUMENT. This maintains type safety and provides predictable error handling for programmatic consumers.
File Structure and Implementation Details
The discover command's architecture separates concerns across multiple modules under packages/cli/api/discover/:
discover.mjs– Main dispatcher; implements package discovery call and query routing logic_adapter.mjs– Workspace scanner; implementsdiscoverPackages()for external package detectionlist/list.mjs– Leaf module for package catalog retrievaldetail/detail.mjs– Leaf module for package metadatadetail/doc/doc.mjs– Leaf module for component documentation resolutionsearch/search.mjs– Leaf module for full-text search across packages
Code Examples
List all external Astryx packages in your workspace:
astryx discover
Retrieve metadata for a specific package:
astryx discover @myorg/ui
Resolve and display component documentation (triggers component source file resolution):
astryx discover @myorg/ui/Button
Search for components across all discovered packages:
astryx discover "date picker"
Key Design Characteristics
- Declarative package registration: Packages opt into discovery via the
astryxfield inpackage.json, not filesystem conventions alone - Strict query parsing: The double-slash pattern (
@scope/pkg/Component) provides unambiguous component addressing - Leaf-based extensibility: New query patterns can be supported by adding leaf modules without modifying the core dispatcher
- Workspace-scoped discovery: Resolution is limited to packages visible in the current workspace, not global installations
Summary
- The Astryx CLI discover command uses a two-phase resolution algorithm: first discovering external packages via
package.jsonmetadata, then routing queries to specialized leaf modules - Component resolution for queries like
@scope/pkg/Componentdelegates to the doc leaf, which locates the component's source directory and extracts documentation from{Component}.doc.mjsfiles - Package discovery is implemented in
_adapter.mjsand relies on theastryxfield or@astryxdesign/*entry points for registration - The dispatcher-leaf architecture separates package detection from query handling, enabling modular extensions for list, detail, doc, and search operations
Frequently Asked Questions
How does Astryx CLI know which packages to include in discovery?
The discoverPackages() function in packages/cli/api/discover/_adapter.mjs scans workspace package.json files and selects those containing an astryx configuration field or exporting @astryxdesign/* entry points. This declarative approach ensures only explicitly registered packages appear in discovery results.
What happens if I query a component that doesn't exist?
If the doc leaf cannot locate the component directory or its .doc.mjs file for the requested component name, it returns an appropriate error response. The dispatcher does not perform fuzzy matching for component names—queries must match the exact exported component identifier.
Can I use the discover command without a workspace configuration?
Running astryx discover in a workspace with no Astryx-registered packages returns an empty list via the list leaf with configured: false. The command does not fail—instead, it signals that no external packages were detected, allowing users to verify their workspace setup before adding dependencies.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →