Context Hub (chub)
CLI tool for searching and fetching LLM-optimized documentation and skills. Install: npm install @aisuite/chub
Content Types
- doc: API/SDK reference documentation. Versioned, language-specific. Entry file: DOC.md
- skill: Task recipes, automation patterns, coding playbooks. Standalone. Entry file: SKILL.md
Commands
chub search [query]
Search docs and skills. No query lists all entries.
Flags:
--tags
--json JSON output with { total, results[] }
Examples:
chub search # list everything
chub search "stripe" # fuzzy search by name/description
chub search stripe/payments # exact id returns full detail
chub search --tags automation # filter by tag
chub get
Fetch one or more docs or skills by ID. Auto-detects type (doc vs skill). Auto-infers language when only one is available.
Flags:
--lang
--version
--full Fetch all files, not just the entry point
--file Fetch specific file(s) by path (comma-separated)
-o, --output Write to file or directory
--json JSON output with { id, type, content, path, additionalFiles?, annotation? }
Examples:
chub get stripe/api # single doc (auto-infers lang if only one)
chub get openai/chat-api --lang py # specific language
chub get pw-community/login-flows # fetch a skill
chub get stripe/api openai/chat-api # multiple entries
chub get acme/widgets --file references/advanced.md # specific reference file
chub get acme/widgets --full # all files
chub get stripe/api -o .context/stripe.md # save to file
Behavior:
- When additional reference files exist beyond the entry point, output includes a footer listing them
- Use --file to fetch specific reference files without fetching everything
- If an annotation exists for the entry, it is appended after the content
chub annotate [id] [note]
Attach persistent notes to a doc or skill. Notes appear on future chub get calls.
Flags:
--clear Remove annotation for this entry
--list List all annotations
--json JSON output
Examples:
chub annotate stripe/api "Use idempotency keys for POST requests" # set note
chub annotate stripe/api # view current note
chub annotate stripe/api "Updated note" # replaces previous note
chub annotate stripe/api --clear # remove note
chub annotate --list # list all annotations
Storage: ~/.chub/annotations/ (local, per-machine)
chub feedback [id] [rating] [comment]
Rate a doc or skill (up/down). Sent to the registry for maintainers.
Flags:
--label
Examples:
chub feedback stripe/api up "Clear examples"
chub feedback openai/chat down --label outdated --label wrong-examples
chub update
Download or refresh the cached registry.
chub cache status|clear
Manage the local cache. status shows cache info, clear removes cached content.
chub build
Build a registry from a local content directory.
Flags:
-o, --output Output directory (default:
--base-url Base URL for remote serving
--validate-only Validate without building
--json JSON output
Agent Workflow
Recommended pattern for AI agents using Context Hub:
SEARCH: Find relevant documentation
chub search "stripe payments" --json | jq -r '.results[0].id'FETCH: Get the documentation
chub get stripe/api --lang jsUSE: Read the content, write code based on it
ANNOTATE: Record what you learned for future sessions
chub annotate stripe/api "Webhook verification requires raw body, not parsed JSON"NEXT SESSION: Fetch again โ your annotation appears automatically
chub get stripe/api --lang jsContent is followed by your previous annotation
This loop means agents improve over time. Annotations persist across sessions.
Annotation Best Practices
After using a doc to complete a task, annotate what you learned that wasn't obvious from the doc itself:
- Environment-specific gotchas ("requires raw body for webhook verification")
- Version-specific notes ("v3 API requires different auth header format")
- Project-specific context ("we use the batch endpoint, not individual calls")
- Error resolutions ("rate limit errors need exponential backoff with jitter")
Do NOT annotate information that's already clearly stated in the doc.
Piping Patterns
Search, pick first result, fetch
ID=$(chub search "stripe" --json | jq -r '.results[0].id')
chub get "$ID" --lang js -o .context/stripe.md
Fetch multiple docs at once
chub get openai/chat stripe/api -o .context/
Check what additional files are available
chub get acme/widgets --json | jq '.additionalFiles'
Fetch a specific reference file
chub get acme/widgets --file references/advanced.md
List all your annotations
chub annotate --list --json
Key Behaviors
- Auto-detect type:
chub getworks for both docs and skills. No need to specify type. - Auto-infer language: If a doc has only one language variant, --lang is not required.
- Multi-language prompt: If a doc has multiple languages and --lang is not specified, the CLI lists available languages.
- Incremental fetch: Default fetch returns only the entry file. A footer lists additional reference files. Use --file for selective fetch, --full for everything.
- Annotations on fetch: If an annotation exists for an entry, it appears at the end of
chub getoutput in both human and JSON modes. - Multi-source: Config supports multiple sources (URLs and local paths). On ID collision, prefix with source name:
chub get internal:openai/chat. - JSON everywhere: All commands support --json for structured output.
Configuration
File: ~/.chub/config.yaml
sources:
- name: community
url: https://cdn.aichub.org/v1 - name: internal
path: /path/to/local/docs
source: "official,maintainer,community" # trust policy
refresh_interval: 86400 # cache TTL in seconds
telemetry: true # anonymous analytics (opt out: false or CHUB_TELEMETRY=0)