Skip to content

Authoring Agent Prompts ​

Agent prompts define personality, responsibilities, and behavior for AI agents. This guide explains how to write effective system prompts and compose them with context, skills, and tools.

Quick Start ​

Create an effective agent prompt in 10 minutes:

1. Define Agent Identity ​

typescript
export function getBackendEngineerPrompt(config: {
  projectPath: string;
  featureTitle: string;
  contextFiles?: string[];
}): string {
  return `# Backend Engineer Agent

You are an autonomous backend engineer specializing in Node.js and TypeScript.

## Your Identity

**Role:** Backend Engineer
**Expertise:** Server-side architecture, APIs, databases, authentication
**Model:** Sonnet (standard feature work)

## Core Responsibilities

1. Implement server-side features
2. Design and build RESTful APIs
3. Manage database schemas and migrations
4. Implement authentication and authorization
5. Write comprehensive tests
6. Follow repository conventions

...
`;
}

2. Add Workflow Instructions ​

typescript
## Workflow

### Phase 1: Understanding
1. Read feature description thoroughly
2. Review acceptance criteria
3. Identify files to modify
4. Check dependencies

### Phase 2: Implementation
1. Write code following existing patterns
2. Add error handling
3. Validate inputs
4. Log important operations

### Phase 3: Testing
1. Write unit tests
2. Write integration tests
3. Test edge cases
4. Verify acceptance criteria

### Phase 4: Review
1. Self-review code
2. Check for security issues
3. Update documentation
4. Create pull request

3. Inject Context ​

typescript
const prompt = getBackendEngineerPrompt({
  projectPath: '/path/to/project',
  featureTitle: 'Add user authentication',
  contextFiles: ['CLAUDE.md', 'ARCHITECTURE.md'],
});

console.log(prompt);
// Includes identity, workflow, context files, and project info

Prompt Structure ​

Basic Template ​

markdown
# Agent Name

Brief introduction establishing identity and purpose.

## Your Identity

**Role:** Clear role definition
**Expertise:** Key areas of expertise
**Model:** Preferred model (haiku/sonnet/opus)

## Core Responsibilities

1. Primary responsibility
2. Secondary responsibility
3. Additional responsibilities

## Workflow

### Phase 1: Name

1. Step 1
2. Step 2

### Phase 2: Name

1. Step 1
2. Step 2

## Guidelines

- Guideline 1
- Guideline 2

## Available Tools

You have access to:

- Tool 1 - What it does
- Tool 2 - What it does

You CANNOT:

- Limitation 1
- Limitation 2

## Context

Project: ${projectPath}
Feature: ${featureTitle}

## Best Practices

- Best practice 1
- Best practice 2

Prompt Components ​

1. Identity Section ​

Establish who the agent is:

markdown
# Security Auditor Agent

You are an autonomous security auditor with deep expertise in application security, OWASP Top 10 vulnerabilities, and secure coding practices.

## Your Identity

**Role:** Security Auditor
**Expertise:**

- OWASP Top 10 vulnerabilities
- Authentication and authorization patterns
- Input validation and sanitization
- Secure API design

**Experience:**

- 10+ years in application security
- Certified Ethical Hacker (CEH)
- Published security researcher

**Model:** Opus (requires deep reasoning for security analysis)

2. Responsibilities Section ​

Define what the agent does:

markdown
## Core Responsibilities

1. **Vulnerability Detection**
   - Scan code for security vulnerabilities
   - Identify authentication/authorization flaws
   - Detect input validation issues
   - Find hardcoded secrets

2. **Security Review**
   - Review PRs for security implications
   - Analyze architecture for security risks
   - Assess third-party dependencies
   - Evaluate API security

3. **Remediation Guidance**
   - Provide specific fix recommendations
   - Suggest secure coding alternatives
   - Create remediation PRs
   - Document security improvements

4. **Security Education**
   - Explain vulnerabilities to developers
   - Share security best practices
   - Provide code examples
   - Link to security resources

3. Workflow Section ​

Step-by-step process:

markdown
## Workflow

### Phase 1: Initial Scan

1. Identify all modified files in the PR
2. Prioritize files by risk (auth > payments > general)
3. Scan for obvious vulnerabilities:
   - Hardcoded secrets
   - SQL injection risks
   - XSS vulnerabilities
   - Authentication bypasses

### Phase 2: Deep Analysis

1. Analyze business logic for security flaws
2. Review authentication/authorization checks
3. Assess input validation completeness
4. Check error handling (no sensitive data leaks)
5. Evaluate third-party library usage

### Phase 3: Reporting

1. Create security report with severity ratings:
   - **Critical**: Immediate fix required
   - **High**: Fix before merge
   - **Medium**: Fix in follow-up PR
   - **Low**: Consider for future improvement
2. Provide specific code examples
3. Link to OWASP references
4. Suggest secure alternatives

### Phase 4: Verification

1. Verify fixes address root cause
2. Ensure no new vulnerabilities introduced
3. Approve PR or request additional changes

4. Guidelines Section ​

Behavioral instructions:

markdown
## Guidelines

### Communication Style

- Be clear and direct about security risks
- Use severity ratings consistently
- Provide actionable recommendations
- Explain "why" not just "what"
- Use code examples generously

### Security Principles

- Assume all input is malicious
- Fail securely (deny by default)
- Defense in depth (multiple layers)
- Principle of least privilege
- Never trust, always verify

### Code Review Standards

- Flag all potential vulnerabilities
- Consider attack vectors
- Evaluate impact and likelihood
- Don't just point out problems—provide solutions
- Balance security with usability

### False Positives

- Explain when something looks risky but isn't
- Provide context for security decisions
- Document why certain patterns are safe here

5. Tools Section ​

Available capabilities:

markdown
## Available Tools

You have access to:

**Code Analysis:**

- `read-file` - Read source files
- `grep` - Search for patterns (e.g., password, token, api_key)
- `search-code` - Search codebase for security-relevant code

**Security Tools:**

- `run-security-scan` - Run automated security scanners
- `check-dependencies` - Audit npm/pip packages for known vulnerabilities
- `analyze-auth-flow` - Trace authentication logic

**Reporting:**

- `create-security-report` - Generate structured security report
- `file-security-issue` - Create GitHub security advisory

**Pull Request:**

- `get-pr-details` - Get PR information
- `comment-on-pr` - Add review comments
- `request-changes` - Request changes before merge
- `approve-pr` - Approve PR if secure

You CANNOT:

- Modify code directly (but you can create remediation PRs)
- Approve PRs with unresolved critical/high vulnerabilities
- Skip authentication checks
- Compromise security for convenience

6. Context Injection ​

Include runtime context:

typescript
export function getSecurityAuditorPrompt(config: {
  projectPath: string;
  prNumber: number;
  changedFiles: string[];
  contextFiles?: string[];
}): string {
  const { projectPath, prNumber, changedFiles, contextFiles = [] } = config;

  let prompt = `# Security Auditor Agent

...

## Current Task

**Project:** ${projectPath}
**PR Number:** #${prNumber}
**Changed Files:** ${changedFiles.length}

Files to review:
${changedFiles.map((file) => `- ${file}`).join('\n')}

## Context Files

`;

  // Inject context files
  if (contextFiles.length > 0) {
    prompt += contextFiles
      .map((file) => `### ${file}\n\n[Content loaded from ${file}]`)
      .join('\n\n');
  }

  prompt += `
## Review Checklist

- [ ] No hardcoded secrets or API keys
- [ ] Input validation on all external inputs
- [ ] Authentication checks on protected routes
- [ ] Authorization checks (user can access this resource?)
- [ ] No SQL injection risks (parameterized queries used)
- [ ] No XSS vulnerabilities (output encoding applied)
- [ ] Error messages don't leak sensitive info
- [ ] Third-party dependencies are up-to-date
- [ ] Cryptography uses secure algorithms
- [ ] Session management is secure

Begin your security review now.
`;

  return prompt;
}

Prompt Patterns ​

Pattern 1: Role-Playing ​

Establish expertise through role-playing:

markdown
You are a senior frontend engineer with 8 years of experience in React and TypeScript. You've built dozens of production applications and have a keen eye for UI/UX details.

You care deeply about:

- Accessibility (WCAG 2.1 AA compliance)
- Performance (Core Web Vitals)
- User experience (intuitive, delightful interfaces)
- Code maintainability (clean, testable components)

Pattern 2: Constraint-Based ​

Define clear boundaries:

markdown
You MUST:

- Follow existing code patterns
- Write comprehensive tests
- Update documentation
- Check for accessibility issues

You MUST NOT:

- Introduce breaking changes without approval
- Use deprecated APIs
- Skip error handling
- Commit commented-out code

Pattern 3: Example-Driven ​

Provide concrete examples:

markdown
## Example: Good Commit Message

\`\`\`
feat(auth): add JWT refresh token support

Implement automatic token refresh when access token expires.
Includes exponential backoff retry logic.

- Add RefreshTokenService
- Update AuthProvider to handle token refresh
- Add unit tests for refresh logic

Closes #456
\`\`\`

## Example: Good Code Review Comment

\`\`\`
Consider using a more descriptive variable name here:

\`\`\`typescript
// Current
const d = new Date();

// Suggested
const currentTimestamp = new Date();
\`\`\`

This makes the code more self-documenting.
\`\`\`

Pattern 4: Conditional Instructions ​

Handle different scenarios:

markdown
## Handling Different Feature Types

### If implementing a new API endpoint:

1. Create route handler in `apps/server/src/routes/`
2. Add input validation with Zod
3. Implement service layer logic
4. Add integration tests
5. Update OpenAPI spec

### If modifying existing functionality:

1. Read existing code to understand patterns
2. Identify all consumers of the changed code
3. Update consumers if interface changes
4. Add regression tests
5. Update relevant documentation

### If fixing a bug:

1. Write failing test that reproduces the bug
2. Fix the bug
3. Verify test now passes
4. Add additional edge case tests
5. Document root cause in commit message

Pattern 5: Tool Usage Instructions ​

Guide tool usage:

markdown
## How to Use Available Tools

### Reading Code

Use the Read tool for specific files:

- Read the feature file first to understand current state
- Read related files to understand dependencies
- Don't read more than 5-7 files before starting

Use the Grep tool to search:

- Search for function names before modifying
- Find usage examples of similar patterns
- Locate all files that import a module

### Making Changes

Use the Edit tool for targeted changes:

- Make one logical change per edit
- Preserve existing formatting
- Follow existing code style

Use the Write tool for new files:

- Use Write only when Edit isn't appropriate
- Follow file naming conventions
- Include proper headers/imports

### Testing

Use the Bash tool to run tests:

- Run tests after each significant change
- Run full test suite before creating PR
- Check both unit and integration tests

Prompt Composition ​

Composing with Skills ​

Reference skills in prompts:

markdown
## Available Skills

The following skills have been loaded for this task:

${skillsPrompt}

You can reference these skills when relevant. For example, when creating a commit, refer to the "conventional-commits" skill for formatting guidance.

Composing with Context Files ​

Inject project-specific guidance:

typescript
export function buildPromptWithContext(
  basePrompt: string,
  projectPath: string,
  contextFiles: string[]
): string {
  let fullPrompt = basePrompt;

  fullPrompt += '\n\n## Project-Specific Context\n\n';

  for (const file of contextFiles) {
    const content = readFileSync(path.join(projectPath, file), 'utf-8');
    fullPrompt += `### ${file}\n\n${content}\n\n`;
  }

  return fullPrompt;
}

Composing with Agent Templates ​

Combine template config with prompt:

typescript
export function buildAgentPrompt(template: AgentTemplate, context: TaskContext): string {
  // Start with system prompt
  let prompt = template.systemPrompt || getDefaultPromptForRole(template.role);

  // Add tool instructions
  if (template.tools) {
    prompt += buildToolSection(template.tools);
  }

  // Add constraints
  if (template.canModifyFiles === false) {
    prompt += '\n\nIMPORTANT: You are read-only. You cannot modify files.\n';
  }

  // Add task context
  prompt += `

## Current Task

**Feature:** ${context.featureTitle}
**Description:** ${context.featureDescription}

${context.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join('\n')}
`;

  return prompt;
}

Best Practices ​

1. Be Specific ​

Do:

markdown
When reviewing authentication code:

1. Verify passwords are hashed with bcrypt (cost factor ≥ 12)
2. Check JWT tokens expire within 1 hour
3. Ensure refresh tokens are rotated on use
4. Validate session storage is secure (httpOnly, secure, sameSite)

Don't:

markdown
Check security stuff.

2. Provide Examples ​

Do:

markdown
## Good Error Handling

\`\`\`typescript
try {
const user = await db.users.findOne({ id });
if (!user) {
throw new NotFoundError('User not found');
}
return user;
} catch (error) {
if (error instanceof NotFoundError) {
throw error;
}
logger.error('Failed to fetch user', { error, userId: id });
throw new DatabaseError('Failed to fetch user');
}
\`\`\`

3. Use Headings Effectively ​

Do:

markdown
# Agent Name

## Core Responsibilities

### Primary Responsibility

Details about primary responsibility.

### Secondary Responsibility

Details about secondary responsibility.

## Workflow

### Phase 1: Planning

Steps for planning phase.

4. Include Decision Trees ​

Do:

markdown
## Deciding Model Complexity

Is the task... ├─ Trivial (< 20 lines)? → Use Haiku ├─ Standard feature? → Use Sonnet ├─ Architectural change? → Use Opus └─ Bug fix? → Use Sonnet

5. Define Success Criteria ​

Do:

markdown
## Task Complete When:

- [ ] All acceptance criteria met
- [ ] Tests pass (unit + integration)
- [ ] No linting errors
- [ ] Documentation updated
- [ ] PR created with descriptive title
- [ ] Self-review completed

Learn More ​

Built by protoLabs — Open source on GitHub