* fix: ContextScout falls back to global core/ when local core/ missing Users who install OAC globally have core standards at ~/.config/opencode/context/core/ but no local core/ directory. ContextScout now does a one-time check on startup: if local core/navigation.md doesn't exist, it checks the global path from paths.json. This resolves the ENOENT errors when agents try to read core/standards/ files that only exist globally. - paths.json: enabled global path (~/.config/opencode/context) - contextscout.md: added global_fallback rule with 2-glob cap - Fallback is ONLY for core/ files, never project-intelligence * docs: add context resolution explanation to README Explains how ContextScout resolves context files: local-first, global fallback only for core/ files, project-intelligence always local. Includes flow diagram, key rules, and common setup table. * fix: resolve installer failures and add comprehensive validation ## Summary Fixes critical installer failures where ContextScout and other components couldn't find their configuration files after installation. Adds comprehensive validation system to prevent future issues. ## Problems Fixed ### 1. Missing Critical Files (13 dead registry references) Files were referenced in registry but didn't exist on disk: - workflows-delegation (split into 3 files) - design-iteration (split into 8 files) - animation-patterns (split into 6 files) - adding-agent (split into 2 files) - adding-skill (split into 3 files) - navigation-design (split into 2 files) - external-libraries (split into 3 files) - claude-code-docs/* (directory removed) ### 2. Missing Infrastructure Files ContextScout failed after installation because 2 critical files weren't in registry: - paths.json - Context root configuration - navigation.md - Root navigation for discovery ### 3. Profile Inconsistencies Profiles referenced components that don't exist: - context:adding-skill → context:adding-skill-basics - context:animation-patterns → animation-basics/components/advanced - context:design-assets (removed - doesn't exist) - context:to-be-consumed/* (removed - directory doesn't exist) - skill:context-manager → subagent:context-manager ## Changes Made ### Registry (registry.json) - Removed 13 dead references - Added 27 new split-file entries - Added 2 critical infrastructure entries - Fixed all 5 profile configurations - Updated ContextScout dependencies - Updated agent-metadata.json dependencies ### New Validation Scripts - scripts/registry/check-dependencies.ts - Comprehensive dependency checker - scripts/tests/test-installer-files.sh - Installer simulation test - scripts/registry/fix-registry.py - Automated registry fixer - scripts/hooks/pre-commit - Git pre-commit hook ### Documentation - docs/maintenance/REGISTRY_FIXES_SUMMARY.md - docs/maintenance/CONTEXTSCOUT_FIX.md - docs/maintenance/REGISTRY_VALIDATION.md ## Validation Results Before: - 13 missing files in registry - 78 orphaned files on disk - 3 missing dependencies - Installer would fail After: - 244 total paths, 0 missing - 262 dependency checks, 0 failures - 0 orphaned dependencies - All profiles consistent - Installer works correctly ## Testing ```bash # Registry validation bun run scripts/registry/validate-registry.ts # ✓ All 244 paths valid # Dependency checking bun run scripts/registry/check-dependencies.ts # ✓ All 262 checks passed # Installer test ./scripts/tests/test-installer-files.sh --local --profile=essential # ✓ All files accessible ``` ## Usage ### Run validation before commits: ```bash bun run scripts/registry/check-dependencies.ts ``` ### Install pre-commit hook: ```bash cp scripts/hooks/pre-commit .git/hooks/pre-commit chmod +x .git/hooks/pre-commit ``` ### Test installer: ```bash ./scripts/tests/test-installer-files.sh --local --profile=essential ``` ## Impact This fix ensures: - ✓ Installer downloads all required files - ✓ ContextScout works immediately after install - ✓ No broken dependencies - ✓ No missing profile components - ✓ Future issues caught by validation ## Breaking Changes None - all changes are additive or fix broken references. ## Related - Fixes: ContextScout failing after installation - Prevents: Missing file errors during install - Adds: Comprehensive validation system * fix: resolve shellcheck warnings in test scripts - Remove unused REPO_URL variable from test-installer-files.sh - Add shellcheck disable comments for cleanup functions used via trap - Fixes CI failures in ShellCheck Analysis workflow * fix: resolve shellcheck errors across all scripts Fixed arithmetic expansion issues and code quality warnings: - Changed ((var++)) to POSIX-compliant 1 syntax - Fixed unquoted variables and grep pipe issues (SC2002, SC2143) - Added shellcheck disable comments for intentional patterns - Fixed variable initialization and return statement placement Scripts fixed: - scripts/tests/*.sh (5 files) - scripts/registry/*.sh (4 files) - scripts/validation/*.sh (2 files) - scripts/*.sh (2 files) - evals/framework/scripts/*.sh (2 files) All scripts now pass shellcheck --severity=warning * chore: trigger CI shellcheck validation
8.6 KiB
Registry Validation & Dependency Checking
This document describes the comprehensive validation system to prevent registry inconsistencies and ensure the installer works correctly.
Overview
We have three levels of validation to catch issues before they reach users:
- Registry Validator - Validates that registry paths point to actual files
- Dependency Checker - Validates that all dependencies and profile references exist
- Installer Test - Simulates the installer to ensure files are accessible
Scripts
1. Registry Validator (validate-registry.ts)
Validates that all paths in registry.json point to actual files on disk.
Usage:
# Basic validation
bun run scripts/registry/validate-registry.ts
# With verbose output
bun run scripts/registry/validate-registry.ts --verbose
# With fix suggestions
bun run scripts/registry/validate-registry.ts --fix
Checks:
- All component paths exist
- All dependencies exist in registry
- Registry is valid JSON
Exit codes:
- 0 = All paths valid
- 1 = Missing files found
- 2 = Registry parse error
2. Dependency Checker (check-dependencies.ts)
Comprehensive check for missing dependencies and profile inconsistencies.
Usage:
# Basic check
bun run scripts/registry/check-dependencies.ts
# With verbose output
bun run scripts/registry/check-dependencies.ts --verbose
Checks:
- All profile components exist in registry
- All component dependencies exist in registry
- Critical infrastructure files are included
- No orphaned references
Critical files that must be in registry:
root-navigation(.opencode/context/navigation.md)context-paths-config(.opencode/context/core/config/paths.json)context-system(.opencode/context/core/context-system.md)
Exit codes:
- 0 = All checks passed
- 1 = Missing dependencies found
- 2 = Critical files missing
- 3 = Configuration errors
3. Installer Test (test-installer-files.sh)
Simulates the installer by checking if files are accessible from GitHub.
Usage:
# Test with local registry (faster, for development)
./scripts/tests/test-installer-files.sh --local --profile=essential
# Test with remote registry (simulates actual installation)
./scripts/tests/test-installer-files.sh --profile=essential
# Test all components
./scripts/tests/test-installer-files.sh --local --all
# Test specific profile with verbose output
./scripts/tests/test-installer-files.sh --local --profile=developer --verbose
Supported profiles:
essential- Minimal starter kitdeveloper- Complete dev environmentbusiness- Business automationfull- Everything includedadvanced- With System Builder
Integration with CI/CD
GitHub Actions
Add this to .github/workflows/registry-validation.yml:
name: Registry Validation
on:
push:
paths:
- 'registry.json'
- '.opencode/profiles/**'
- '.opencode/config/**'
- 'scripts/registry/**'
pull_request:
paths:
- 'registry.json'
- '.opencode/profiles/**'
- '.opencode/config/**'
- 'scripts/registry/**'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Bun
uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- name: Install dependencies
run: bun install
- name: Validate registry paths
run: bun run scripts/registry/validate-registry.ts
- name: Check dependencies
run: bun run scripts/registry/check-dependencies.ts
- name: Test installer (Essential profile)
run: |
chmod +x scripts/tests/test-installer-files.sh
./scripts/tests/test-installer-files.sh --local --profile=essential
- name: Test installer (Developer profile)
run: ./scripts/tests/test-installer-files.sh --local --profile=developer
Pre-commit Hook
Install the pre-commit hook to catch issues before committing:
# Copy the hook to .git/hooks
cp scripts/hooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
# Or use with Husky
npx husky add .husky/pre-commit "bun run scripts/registry/check-dependencies.ts"
Common Issues & Solutions
Issue: "Missing critical file: Root navigation"
Cause: navigation.md at .opencode/context/navigation.md is not in registry.
Solution:
{
"id": "root-navigation",
"name": "Root Navigation",
"type": "context",
"path": ".opencode/context/navigation.md",
"category": "essential"
}
Issue: "Profile references missing component: context:adding-skill"
Cause: Profile references a component ID that doesn't exist in registry.
Solution:
- Check if the component was renamed (e.g.,
adding-skill→adding-skill-basics) - Update the profile to use the correct ID
- Run
bun run scripts/registry/check-dependencies.tsto verify
Issue: "Component depends on missing: context:workflows-delegation"
Cause: A component's dependencies array references a non-existent component.
Solution:
- Check if the dependency was renamed or removed
- Update the component's dependencies
- Also check
.opencode/config/agent-metadata.jsonfor agent dependencies
Issue: Split files not in registry
Cause: When a file is split (e.g., design-iteration.md → multiple files), the new files weren't added to registry.
Solution:
- Identify all split files:
ls .opencode/context/core/workflows/design-iteration-*.md - Add each to registry with unique IDs
- Remove the old monolithic entry if it no longer exists
- Update any dependencies that reference the old ID
Best Practices
Before Committing Changes
Always run:
# 1. Validate registry
bun run scripts/registry/validate-registry.ts
# 2. Check dependencies
bun run scripts/registry/check-dependencies.ts
# 3. Test installer
./scripts/tests/test-installer-files.sh --local --profile=essential
When Adding New Components
-
Add to registry.json:
- Ensure unique ID
- Correct path relative to repo root
- Appropriate category (essential, standard, advanced)
-
Add to profiles:
- Update
.opencode/profiles/<name>/profile.json - Also check if profiles section exists in registry.json
- Update
-
Add dependencies:
- If component references other components, add to
dependenciesarray - Verify all dependencies exist
- If component references other components, add to
-
Run validation:
bun run scripts/registry/check-dependencies.ts
When Removing Components
-
Remove from registry.json:
- Delete the component entry
-
Update dependent components:
- Search for references:
grep -r "component:old-id" .opencode/ - Update or remove dependencies
- Search for references:
-
Update profiles:
- Remove from all profile.json files
- Check both
.opencode/profiles/and registry.json profiles section
-
Run validation:
bun run scripts/registry/check-dependencies.ts
When Splitting Files
-
Create new registry entries:
- Add each split file with unique ID
- Example:
design-iteration-overview,design-iteration-plan-file
-
Remove old entry:
- Delete the monolithic file entry from registry
-
Update dependencies:
- Find all references to old ID:
grep -r "context:old-id" .opencode/ registry.json - Update to reference new split files
- Find all references to old ID:
-
Update profiles:
- Replace old reference with new split file references
Troubleshooting
Script fails with "bun not found"
Install Bun:
curl -fsSL https://bun.sh/install | bash
"Registry file not found"
Ensure you're running from repo root:
cd /path/to/OpenAgentsControl
bun run scripts/registry/check-dependencies.ts
Check passes locally but fails in CI
Make sure all files are committed:
git status
# Commit any uncommitted files before pushing
Quick Reference
# Full validation suite
bun run scripts/registry/validate-registry.ts && \
bun run scripts/registry/check-dependencies.ts && \
./scripts/tests/test-installer-files.sh --local --all
# Just check dependencies (fastest)
bun run scripts/registry/check-dependencies.ts
# Test specific profile
./scripts/tests/test-installer-files.sh --local --profile=essential
# Check with verbose output
bun run scripts/registry/check-dependencies.ts --verbose
Related Documentation
- Registry Structure - How registry.json is organized
- Adding Components - Step-by-step guide
- ContextScout Fix - Example of fixing missing dependencies
- Registry Fixes Summary - Previous fixes made