.claude/skills/browsing-constructs/SKILL.md
# Browsing Constructs Skill ## Purpose Provide a multi-select UI for browsing and installing packs from the Loa Constructs Registry. Enables composable skill installation per-repo. ## Invocation - `/constructs` - Smart default: manage installed packs OR browse to install - `/constructs browse` - Browse available packs with selection UI - `/constructs install <pack>` - Install specific pack directly - `/constructs list` - List installed packs - `/constructs search <query>` - Search packs by n
npx skillsauth add 0xhoneyjar/loa-beauvoir .claude/skills/browsing-constructsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Provide a multi-select UI for browsing and installing packs from the Loa Constructs Registry. Enables composable skill installation per-repo.
/constructs - Smart default: manage installed packs OR browse to install/constructs browse - Browse available packs with selection UI/constructs install <pack> - Install specific pack directly/constructs list - List installed packs/constructs search <query> - Search packs by name/description/constructs update - Check for updates/constructs uninstall <pack> - Remove a pack/constructs auth - Check authentication status/constructs auth setup - Set up API key for premium packsCheck or set up authentication for premium packs.
.claude/scripts/constructs-auth.sh status
Display authentication status:
Guide user through API key setup using AskUserQuestion:
{
"questions": [
{
"question": "Enter your Constructs API key (get from www.constructs.network/account):",
"header": "API Key",
"multiSelect": false,
"options": [
{
"label": "I have my API key ready",
"description": "Paste your sk_... key when prompted"
},
{
"label": "I need to get a key first",
"description": "Opens browser to www.constructs.network/account"
},
{
"label": "Skip for now",
"description": "Free packs will still be available"
}
]
}
]
}
If user has key, prompt for it and run:
.claude/scripts/constructs-auth.sh setup <api_key>
Smart routing based on installed state.
installed=$(.claude/scripts/constructs-loader.sh list 2>/dev/null)
If packs ARE installed (output is non-empty):
If NO packs installed:
Browse and install packs from registry.
Check auth status to determine which packs to show:
auth_status=$(.claude/scripts/constructs-auth.sh status --json)
is_authenticated=$(echo "$auth_status" | jq -r '.authenticated')
If not authenticated, show a note about premium packs requiring auth.
Run the browse script to get available packs:
packs_json=$(.claude/scripts/constructs-browse.sh list --json)
This returns a JSON array of packs with:
slug - Pack identifiername - Display namedescription - One-line descriptionskills_count - Number of skills includedtier - "free" or "pro"icon - Emoji iconCheck which packs are already installed:
installed=$(.claude/scripts/constructs-loader.sh list 2>/dev/null)
Display ALL available packs in a numbered markdown table, then use AskUserQuestion for selection.
Step 3a: Render Pack Table
Generate a markdown table from the packs JSON with full details:
## Available Packs
| # | Pack | Description | Skills | Version | Status |
| --- | ---------------------- | ----------------------------------------------------------------- | ------ | ------- | ----------- |
| 1 | 🎨 Artisan | Brand and UI craftsmanship skills for design systems and motion | 10 | 1.0.2 | Free |
| 2 | 👁️ Observer | User truth capture skills for hypothesis-first research | 6 | 1.0.2 | Free |
| 3 | 🔔 Sigil of the Beacon | Signal readiness to the agent network with AI-retrievable content | 6 | 1.0.2 | Free |
| 4 | 🧪 Crucible | Validation and testing skills for journey verification | 5 | 1.0.2 | ✓ Installed |
| 5 | 🚀 GTM Collective | Go-To-Market skills for product launches and developer relations | 8 | 1.0.0 | Free |
Table columns:
# - Row number (1-indexed)Pack - Icon + nameDescription - One-line description of what the pack doesSkills - Number of skills in packVersion - Current version from registryStatus - Show tier and install state:
Free - Free pack, not installedPro 🔒 - Pro pack, requires subscription✓ Installed - Already installedStep 3b: Selection Prompt
Use AskUserQuestion with 3 options (NOT multiSelect):
{
"questions": [
{
"question": "How would you like to install packs?",
"header": "Install",
"multiSelect": false,
"options": [
{
"label": "Enter pack numbers",
"description": "Type numbers like: 1,3,5"
},
{
"label": "Install all",
"description": "Install all available packs"
},
{
"label": "Cancel",
"description": "Exit without installing"
}
]
}
]
}
Step 3c: Collect User Input
If user selects "Enter pack numbers":
"Enter pack numbers (comma-separated, e.g., 1,3,5):"input ::= "all" | selection | ""
selection ::= number ("," number)*
number ::= [0-9]+
1 <= n <= pack_countStep 3d: Confirmation (Required)
Before installing, echo back the resolved selection:
You selected:
- Observer (#1)
- Artisan (#3)
Proceed with installation? [Y/n]
Retry Limits:
/constructs browse to try again."Edge Cases:
| Input | Behavior |
| ----------- | -------------------------------------------- |
| "1,3,5" | Install packs 1, 3, 5 |
| "all" | Install all non-installed packs |
| "1, 3, 5" | Same as "1,3,5" (whitespace tolerant) |
| "1,99,3" | Warn about 99, install 1 and 3 |
| "" | Re-prompt (counts as invalid attempt) |
| "abc" | Error, re-prompt (counts as invalid attempt) |
| 3 failures | Abort with "Too many invalid attempts" |
For each selected pack, run installation:
.claude/scripts/constructs-install.sh pack <slug>
Capture output and track:
Present installation summary:
╭───────────────────────────────────────────────────────────────╮
│ INSTALLATION COMPLETE │
╰───────────────────────────────────────────────────────────────╯
✅ Observer (6 skills installed)
Commands: /interview, /persona, /journey, /pain-points, /user-story, /empathy-map
✅ Crucible (5 skills installed)
Commands: /test-plan, /quality-gate, /acceptance, /regression, /smoke-test
Total: 2 packs, 11 skills
Direct installation without UI:
.claude/scripts/constructs-install.sh pack <pack>Show installed packs:
.claude/scripts/constructs-loader.sh list
Search packs by name, description, or slug.
.claude/scripts/constructs-browse.sh search "<query>"
Display results as a table:
## Search Results for "validation"
| # | Pack | Description | Skills | Version | Status |
| --- | ----------- | ------------------------------------------------------ | ------ | ------- | ------ |
| 1 | 🧪 Crucible | Validation and testing skills for journey verification | 5 | 1.0.2 | Free |
If no results: Suggest broadening the search or browsing all packs with /constructs browse.
Note: Currently searches at pack level. Skill-level search is tracked in loa-constructs#93.
Check for newer versions:
.claude/scripts/constructs-loader.sh check-updates
Remove installed pack:
.claude/scripts/constructs-install.sh uninstall pack <pack>| Error | Handling |
| ------------------------- | -------------------------------------------------------------------------------- |
| No network | Use cached pack list if available |
| No API key | Show free packs only, note premium requires auth, offer /constructs auth setup |
| Invalid API key | Prompt to re-authenticate with /constructs auth setup |
| Pack not found | Suggest similar packs or list available |
| Premium pack without auth | Explain pack requires subscription, offer auth setup |
| Install fails | Show error, continue with other selections |
When user selects a premium pack without authentication:
/constructs auth setupWhen building AskUserQuestion options:
The table-based approach handles unlimited packs:
Installed packs go to .claude/constructs/packs/ which is gitignored.
Installation metadata tracked in .constructs-meta.json:
{
"installed_packs": {
"observer": {
"version": "1.0.0",
"installed_at": "2026-01-31T12:00:00Z"
}
}
}
.claude/scripts/constructs-auth.sh - Authentication management.claude/scripts/constructs-browse.sh - Pack discovery.claude/scripts/constructs-install.sh - Installation.claude/scripts/constructs-loader.sh - Skill loading.claude/scripts/constructs-lib.sh - Shared utilitiesAPI keys can be configured in three ways (checked in order):
Environment variable (recommended for CI/CD):
export LOA_CONSTRUCTS_API_KEY=sk_live_xxxxxxxxxxxx
Credentials file (recommended for local development):
# Created by /constructs auth setup
~/.loa/credentials.json
Alternative credentials (legacy):
~/.loa-constructs/credentials.json
/constructs auth setup and paste the keytools
Control headless Chrome via Cloudflare Browser Rendering CDP WebSocket. Use for screenshots, page navigation, scraping, and video capture when browser automation is needed in a Cloudflare Workers environment. Requires CDP_SECRET env var and cdpUrl configured in browser.profiles.
testing
# valid-skill Test skill with valid license for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of valid licenses.
testing
# grace-skill Test skill in license grace period for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of licenses in grace period.
testing
# expired-skill Test skill with expired license for unit testing. ## Purpose Used in test_constructs_loader.bats to verify correct handling of expired licenses.