Context is your project's coding standards and patterns stored as markdown files. It tells agents:
Think of it as a style guide for AI agents.
You: "Create a React component"
Agent: Creates component in its own style
Result: Doesn't match your project
You: "Create a React component"
Agent: Loads your React pattern from context
Agent: Creates component matching your style
Result: Perfectly matches your project
Your Request
↓
Agent receives request
↓
ContextScout discovers relevant context files
↓
Agent loads context files
↓
Agent follows patterns from context
↓
Code matches your standards automatically
Step 1: You ask for a component
"Create a user profile component"
Step 2: ContextScout discovers
core/standards/code-quality.md (modular patterns)ui/web/react-patterns.md (React conventions)project-intelligence/technical-domain.md (YOUR patterns)Step 3: Agent loads context
# From project-intelligence/technical-domain.md
## React Component Pattern
All components should:
- Use TypeScript with strict mode
- Export named component
- Include JSDoc comments
- Use React.FC type
export const UserProfile: React.FC<Props> = ({ user }) => {
return <div>{user.name}</div>;
};
Step 4: Agent creates component
/**
* UserProfile - Displays user information
*/
export const UserProfile: React.FC<UserProfileProps> = ({ user }) => {
return (
<div className="user-profile">
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
);
};
Result: Component matches your patterns automatically!
.opencode/context/
├── core/ # Universal standards
│ ├── standards/
│ │ ├── code-quality.md # Modular, functional patterns
│ │ ├── security-patterns.md # Security best practices
│ │ ├── test-coverage.md # Testing standards
│ │ └── documentation.md # Documentation patterns
│ ├── workflows/
│ │ ├── design-iteration.md # 4-stage UI design
│ │ ├── task-delegation.md # Task delegation patterns
│ │ ├── external-libraries.md # Library integration
│ │ └── code-review.md # Code review process
│ └── task-management/
│ └── standards/
│ └── task-schema.md # Task JSON schema
│
├── ui/ # Design & UX
│ └── web/
│ ├── ui-styling-standards.md # Tailwind + Flowbite
│ ├── animation-patterns.md # Micro-interactions
│ ├── react-patterns.md # React conventions
│ └── design-systems.md # Design system principles
│
├── development/ # Language-specific
│ ├── backend-navigation.md
│ ├── ui-navigation.md
│ └── [language-specific patterns]
│
└── project-intelligence/ # YOUR custom patterns
├── technical-domain.md # Tech stack & code patterns
├── business-domain.md # Business context
└── navigation.md # Quick overview
core/standards/code-quality.md)Teaches agents:
Example:
// ✅ Pure function (from context)
const add = (a, b) => a + b;
// ❌ Impure (agents avoid this)
let total = 0;
const addToTotal = (value) => { total += value; };
core/standards/security-patterns.md)Teaches agents:
core/workflows/design-iteration.md)Teaches agents:
core/workflows/external-libraries.md)Teaches agents:
ui/web/ui-styling-standards.md)Teaches agents:
ui/web/react-patterns.md)Teaches agents:
# Recommended: Use the interactive wizard
/add-context
# Or edit directly (local project install):
nano .opencode/context/project-intelligence/technical-domain.md
# Global install:
# nano ~/.config/opencode/context/project-intelligence/technical-domain.md
# Your Project Patterns
## API Endpoint Pattern
All API endpoints should follow this pattern:
```typescript
export async function POST(request: Request) {
try {
// 1. Parse and validate input
const body = await request.json();
if (!body.email) {
return Response.json({ error: 'Email required' }, { status: 400 });
}
// 2. Check authentication
const user = await auth.verify(request);
if (!user) {
return Response.json({ error: 'Unauthorized' }, { status: 401 });
}
// 3. Process request
const result = await processRequest(body);
// 4. Return response
return Response.json({ success: true, data: result });
} catch (error) {
console.error('POST error:', error);
return Response.json({ error: error.message }, { status: 500 });
}
}
All React components should:
interface UserCardProps {
userId: string;
onSelect?: (id: string) => void;
}
/**
* UserCard - Displays user information in a card
* @param props - Component props
*/
export const UserCard: React.FC<UserCardProps> = ({
userId,
onSelect
}) => {
const [user, setUser] = React.useState(null);
React.useEffect(() => {
fetchUser(userId).then(setUser);
}, [userId]);
return (
<div className="user-card">
<h3>{user?.name}</h3>
<button onClick={() => onSelect?.(userId)}>
Select
</button>
</div>
);
};
All database queries should:
export async function getUserById(id: string) {
try {
const user = await db
.select()
.from(users)
.where(eq(users.id, id))
.limit(1);
if (!user.length) {
throw new Error('User not found');
}
return user[0];
} catch (error) {
console.error('getUserById error:', error);
throw error;
}
}
All endpoints must:
src/
├── components/ # React components
│ ├── common/ # Reusable components
│ ├── features/ # Feature-specific components
│ └── layouts/ # Layout components
├── lib/ # Utilities and helpers
├── api/ # API routes
├── types/ # TypeScript types
├── styles/ # Global styles
└── hooks/ # Custom React hooks
### Step 3: Agents Use Your Patterns
When you ask an agent to create code, it will:
1. Load your project context
2. Follow your patterns
3. Create code matching your style
---
## Real-World Examples
### Example 1: Adding a Component Pattern
**Your project context**:
```markdown
## Button Component Pattern
All buttons should:
- Use Tailwind classes
- Include loading state
- Support disabled state
- Include accessibility attributes
export const Button: React.FC<ButtonProps> = ({
children,
isLoading,
disabled,
...props
}) => (
<button
disabled={disabled || isLoading}
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 disabled:opacity-50"
aria-busy={isLoading}
{...props}
>
{isLoading ? 'Loading...' : children}
</button>
);
You ask:
"Create a submit button for the login form"
Agent creates:
export const SubmitButton: React.FC<SubmitButtonProps> = ({
isLoading,
disabled,
}) => (
<Button
type="submit"
isLoading={isLoading}
disabled={disabled}
>
Sign In
</Button>
);
✅ Automatically follows your button pattern!
Your project context:
## API Response Pattern
All API responses should:
- Return { success, data, error }
- Include proper status codes
- Log all requests
- Validate input
export async function POST(request: Request) {
try {
const body = await request.json();
// Validate
if (!body.email) {
return Response.json(
{ success: false, error: 'Email required' },
{ status: 400 }
);
}
// Process
const result = await process(body);
// Return
return Response.json({ success: true, data: result });
} catch (error) {
return Response.json(
{ success: false, error: error.message },
{ status: 500 }
);
}
}
You ask:
"Create an API endpoint to create a new user"
Agent creates:
export async function POST(request: Request) {
try {
const body = await request.json();
// Validate
if (!body.email || !body.password) {
return Response.json(
{ success: false, error: 'Email and password required' },
{ status: 400 }
);
}
// Process
const user = await createUser(body);
// Return
return Response.json({ success: true, data: user });
} catch (error) {
return Response.json(
{ success: false, error: error.message },
{ status: 500 }
);
}
}
✅ Automatically follows your API pattern!
Your project context:
## Security Requirements
All endpoints must:
- Verify user authentication
- Check user permissions
- Validate all inputs
- Use parameterized queries
- Log security events
Example:
```typescript
export async function POST(request: Request) {
// 1. Verify authentication
const user = await auth.verify(request);
if (!user) {
return Response.json({ error: 'Unauthorized' }, { status: 401 });
}
// 2. Check permissions
if (!user.isAdmin) {
return Response.json({ error: 'Forbidden' }, { status: 403 });
}
// 3. Validate input
const body = await request.json();
if (!validateInput(body)) {
return Response.json({ error: 'Invalid input' }, { status: 400 });
}
// 4. Log security event
console.log(`Admin action by ${user.id}: create-user`);
// 5. Process
const result = await process(body);
return Response.json({ success: true, data: result });
}
**You ask**:
"Create an admin endpoint to delete a user"
**Agent creates**:
```typescript
export async function DELETE(request: Request) {
// 1. Verify authentication
const user = await auth.verify(request);
if (!user) {
return Response.json({ error: 'Unauthorized' }, { status: 401 });
}
// 2. Check permissions
if (!user.isAdmin) {
return Response.json({ error: 'Forbidden' }, { status: 403 });
}
// 3. Validate input
const { userId } = await request.json();
if (!userId) {
return Response.json({ error: 'User ID required' }, { status: 400 });
}
// 4. Log security event
console.log(`Admin action by ${user.id}: delete-user ${userId}`);
// 5. Process
await deleteUser(userId);
return Response.json({ success: true });
}
✅ Automatically includes all security checks!
# Your Project Patterns
## Components
[Component patterns]
## API Endpoints
[API patterns]
## Database
[Database patterns]
## Security
[Security requirements]
## Naming
[Naming conventions]
## Folder Structure
[Folder structure]
## Good ✅
export const Button: React.FC<Props> = ({ ... }) => {
// Real example from your project
};
## Bad ❌
export const Button = (props) => {
// Generic example
};
## Good ✅
All API endpoints must:
- Validate input with Zod
- Return { success, data, error }
- Log with console.error for errors
- Use 400 for validation, 401 for auth, 500 for server
## Bad ❌
All API endpoints should be good
When you change patterns:
/add-context --update or edit project-intelligence/technical-domain.md directlySolution:
project-intelligence/technical-domain.md exists (run /add-context if not)Solution:
/add-context --update or edit project-intelligence/technical-domain.mdSolution:
Solution:
project-intelligence/technical-domain.mdAgents load context in this order:
Core Standards (universal patterns)
core/standards/code-quality.mdcore/standards/security-patterns.mdWorkflows (how to do things)
core/workflows/design-iteration.mdcore/workflows/external-libraries.mdDomain-Specific (language/framework)
development/[language]/patterns.mdui/web/react-patterns.mdProject-Specific (YOUR patterns) ← Most important!
project-intelligence/technical-domain.mdProject context overrides everything else!
Context is your secret weapon for AI-assisted development:
✅ Automatic pattern following - No manual configuration ✅ Consistent code - All code matches your style ✅ Team alignment - Everyone follows same patterns ✅ Easy updates - Change patterns once, agents use everywhere ✅ Living documentation - Patterns stay in sync with code
Get started:
/add-context to create project intelligence interactively.opencode/context/project-intelligence/technical-domain.md directly/add-context to create project intelligence interactively/add-context --updateYour agents will become better and better as your context improves!