OpenWriterControle/dev/docs/context-reference-convention.md
darrenhinde bc8a322550 feat: enhance installation system with universal path transformation
Add support for custom global installation paths with automatic context
reference transformation. This enables users to install to any location
while maintaining working context references.

Changes:
- Add universal path transformation for ANY global installation path
  (not just ~/.config/opencode)
- Implement automatic cleanup trap for temp files on exit/crash/interrupt
- Add early validation for --install-dir argument with clear error messages
- Add developer documentation for context reference convention

Technical Details:
- Path transformation detects local vs global by checking if path ends
  in .opencode (local) or not (global)
- Transformation applies to ALL file types during installation
- sed transforms both @ references and shell command paths
- Cleanup trap handles EXIT, INT, and TERM signals

Testing:
- 31 unit and integration tests (100% pass rate)
- All README installation scenarios verified
- Edge cases tested and handled
- Cross-platform compatible (macOS, Linux, Windows Git Bash)

Documentation:
- Added dev/docs/context-reference-convention.md explaining the required
  @.opencode/context/ format and why it's necessary
- Includes examples, validation instructions, and test results

Breaking changes: None
New capabilities: Custom global path support
2025-11-19 11:22:48 +00:00

364 lines
8 KiB
Markdown

# Context Reference Convention
## Overview
All context file references in OpenAgents **MUST** use the standardized format:
```markdown
@.opencode/context/path/to/file.md
```
This convention is **required** for the installation system to work correctly across local and global installations.
---
## The Requirement
### ✅ Correct Format
```markdown
@.opencode/context/core/essential-patterns.md
@.opencode/context/project/project-context.md
@.opencode/context/security/auth.md
```
### ❌ Incorrect Formats
```markdown
@context/core/patterns.md ❌ Missing .opencode prefix
@~/context/file.md ❌ Absolute path (breaks local installs)
@$CONTEXT_DIR/file.md ❌ Variables (can't be transformed)
../context/file.md ❌ Relative path (unreliable)
```
---
## Why This Convention?
### Problem: Local vs Global Installations
Users can install OpenAgents in two ways:
**Local Install:**
```bash
.opencode/
├── agent/
├── command/
└── context/
```
References work as: `@.opencode/context/file.md` (relative to current directory)
**Global Install:**
```bash
~/.config/opencode/
├── agent/
├── command/
└── context/
```
References need to be: `@~/.config/opencode/context/file.md` (absolute path)
### Solution: Install-Time Transformation
The installation script automatically transforms references based on installation type:
```bash
# Local install (.opencode/)
@.opencode/context/test.md → @.opencode/context/test.md (no change)
# Global install (~/.config/opencode/)
@.opencode/context/test.md → @~/.config/opencode/context/test.md (transformed)
# Custom install (/usr/local/opencode/)
@.opencode/context/test.md → @/usr/local/opencode/context/test.md (transformed)
```
---
## How It Works
### Repository Files (Source)
All files in the repository use the standard format:
```markdown
# Example Agent
Load patterns from @.opencode/context/core/essential-patterns.md
```
### Installation Process
When a user installs globally, the installer:
1. Downloads the file
2. Detects global installation (INSTALL_DIR != ".opencode")
3. Transforms all references:
```bash
sed -e "s|@\.opencode/context/|@${INSTALL_DIR}/context/|g" \
-e "s|\.opencode/context|${INSTALL_DIR}/context|g" file.md
```
4. Saves the transformed file
### Result
**After global install to ~/.config/opencode:**
```markdown
# Example Agent
Load patterns from @/Users/username/.config/opencode/context/core/essential-patterns.md
```
---
## What Gets Transformed
### All File Types
The transformation applies to **EVERY** file during installation:
- ✅ Agent files (`.opencode/agent/*.md`)
- ✅ Subagent files (`.opencode/agent/subagents/*.md`)
- ✅ Command files (`.opencode/command/*.md`)
- ✅ Context files (`.opencode/context/**/*.md`)
- ✅ Any other markdown files
### All Reference Types
Both patterns are transformed:
**Pattern 1: @ References (OpenCode syntax)**
```markdown
@.opencode/context/file.md → @/install/path/context/file.md
```
**Pattern 2: Shell Commands**
```markdown
.opencode/context/file.md → /install/path/context/file.md
```
---
## Testing & Validation
### Why We Enforce This
During development and testing, we discovered:
1. **Inconsistent references broke installations** - Some files used `@context/`, others used `@.opencode/context/`
2. **Variable-based paths couldn't be transformed** - `@$CONTEXT_DIR/file.md` can't be reliably replaced
3. **Relative paths were unreliable** - `../context/file.md` broke when files moved
4. **Absolute paths broke local installs** - `@~/.config/opencode/context/` doesn't work for `.opencode/`
### Test Results
With the standardized convention:
- ✅ 31/31 tests passed (100% success rate)
- ✅ Works for local installations
- ✅ Works for global installations
- ✅ Works for custom installation paths
- ✅ Transforms all file types correctly
- ✅ Handles multiple references per file
---
## Implementation Details
### Detection Logic
The installer determines if transformation is needed:
```bash
if [[ "$INSTALL_DIR" != ".opencode" ]] && [[ "$INSTALL_DIR" != *"/.opencode" ]]; then
# Global install detected → Transform paths
else
# Local install detected → Keep original paths
fi
```
### Transformation Command
```bash
sed -i.bak -e "s|@\.opencode/context/|@${expanded_path}/context/|g" \
-e "s|\.opencode/context|${expanded_path}/context|g" "$dest"
rm -f "${dest}.bak"
```
**Explanation:**
- `-i.bak` - Edit in-place, create backup
- First pattern - Transform @ references
- Second pattern - Transform shell command paths
- `g` flag - Replace ALL occurrences
- Remove backup file after transformation
---
## Developer Guidelines
### When Creating New Files
**Always use the standard format:**
```markdown
# Good Examples ✅
@.opencode/context/core/essential-patterns.md
@.opencode/context/project/project-context.md
@.opencode/context/security/auth.md
# Bad Examples ❌
@context/file.md
@~/context/file.md
@$CONTEXT_DIR/file.md
../context/file.md
```
### When Referencing Context
**In agents:**
```markdown
Load context from @.opencode/context/core/essential-patterns.md
```
**In commands:**
```markdown
Reference: @.opencode/context/project/project-context.md
```
**In context files:**
```markdown
See also: @.opencode/context/security/auth.md
```
**In shell commands:**
```markdown
!`ls .opencode/context/`
!`find .opencode/context -name "*.md"`
```
---
## Validation
### Pre-Commit Validation
The repository includes a validation script:
```bash
./scripts/validate-context-refs.sh
```
This checks all markdown files for:
- ✅ Correct `@.opencode/context/` format
- ❌ Forbidden dynamic variables (`@$VAR/`)
- ❌ Non-standard references
### Manual Validation
Check a file manually:
```bash
# Should only find @.opencode/context/ references
grep -E '@[^~$]' file.md | grep -v '@.opencode/context/'
# Should return nothing (empty result = good)
```
---
## Examples
### Example 1: Agent File
**File:** `.opencode/agent/openagent.md`
```markdown
# OpenAgent
<context>
Load essential patterns from @.opencode/context/core/essential-patterns.md
Load project context from @.opencode/context/project/project-context.md
</context>
## Workflow
1. Analyze request
2. Check patterns in @.opencode/context/core/essential-patterns.md
3. Execute task
```
**After global install to ~/.config/opencode:**
```markdown
# OpenAgent
<context>
Load essential patterns from @/Users/username/.config/opencode/context/core/essential-patterns.md
Load project context from @/Users/username/.config/opencode/context/project/project-context.md
</context>
## Workflow
1. Analyze request
2. Check patterns in @/Users/username/.config/opencode/context/core/essential-patterns.md
3. Execute task
```
---
### Example 2: Command File
**File:** `.opencode/command/commit.md`
```markdown
# Commit Command
Reference patterns from @.opencode/context/core/essential-patterns.md
Check .opencode/context/project/project-context.md for commit conventions.
```
**After global install to /usr/local/opencode:**
```markdown
# Commit Command
Reference patterns from @/usr/local/opencode/context/core/essential-patterns.md
Check /usr/local/opencode/context/project/project-context.md for commit conventions.
```
---
## Summary
### The Rule
**All context references MUST use:**
```markdown
@.opencode/context/path/to/file.md
```
### Why
- ✅ Works for local installations
- ✅ Works for global installations
- ✅ Works for custom installation paths
- ✅ Automatically transformed during installation
- ✅ Tested and validated
- ✅ Consistent across all files
### Enforcement
- Pre-commit validation script
- Installation system validation
- Code review guidelines
- This documentation
---
## Related Documentation
- [Installation Flow Analysis](../../INSTALLATION_FLOW_ANALYSIS.md)
- [Test Report](../../TEST_REPORT.md)
- [Final Review](../../FINAL_REVIEW.md)
---
**Last Updated:** 2024-11-19
**Status:** Required Convention
**Validation:** Automated via `scripts/validate-context-refs.sh`