Files
gh-alekspetrov-navigator/skills/nav-sop/SKILL.md
2025-11-29 17:51:59 +08:00

550 lines
11 KiB
Markdown

---
name: nav-sop
description: Create Standard Operating Procedures after solving novel issues, establishing patterns, or documenting workflows. Use when user says "document this solution", "save this for next time", "create SOP".
allowed-tools: Read, Write, Bash
version: 1.0.0
---
# Navigator SOP Creator Skill
Create Standard Operating Procedures (SOPs) - reusable documentation for processes, integrations, debugging solutions, and workflows.
## When to Invoke
Invoke this skill when the user:
- Says "document this solution", "save this for next time"
- Says "create SOP", "make this reusable"
- Solves a novel issue and mentions "don't want to hit this again"
- Sets up integration and says "document the setup"
- Establishes pattern and mentions "team should follow this"
**DO NOT invoke** if:
- Creating task documentation (use nav-task skill)
- Updating architecture docs (different purpose)
- Simple bug fix with no reusable pattern
## Execution Steps
### Step 1: Determine SOP Category
Ask user which category (or infer from context):
**Categories**:
1. **integrations** - Third-party service setups
2. **debugging** - Common issues & solutions
3. **development** - Dev workflows, patterns
4. **deployment** - Deploy procedures, CI/CD
**Examples**:
- "How to set up Stripe webhooks" → `integrations/`
- "Fixing CORS errors" → `debugging/`
- "Testing authenticated routes" → `development/`
- "Deploy to production" → `deployment/`
### Step 2: Determine SOP Name
**If user provided name**:
- Use their name (sanitize: lowercase, hyphens)
- Example: "Stripe Payment Setup" → "stripe-payment-setup"
**If no name provided**:
- Generate from context: `{service}-{action}`
- Example: "github-oauth-integration"
- Example: "cors-proxy-errors"
### Step 3: Check if SOP Already Exists
Check existing SOPs in category:
```bash
ls .agent/sops/{category}/*.md 2>/dev/null
```
**If similar SOP exists**:
```
⚠️ Similar SOP found:
.agent/sops/{category}/{similar-name}.md
Options:
1. Read existing SOP (don't duplicate)
2. Update existing SOP (add to it)
3. Create new SOP (different enough)
Your choice [1-3]:
```
### Step 4: Generate SOP Content
Create SOP document from conversation:
```markdown
# {SOP Title}
**Category**: {integrations|debugging|development|deployment}
**Created**: {YYYY-MM-DD}
**Last Updated**: {YYYY-MM-DD}
---
## Context
**When to use this SOP**:
[Describe the scenario where this applies]
**Problem it solves**:
[What issue does this address?]
**Prerequisites**:
- [Requirement 1]
- [Requirement 2]
---
## The Problem
### Symptoms
[What does the issue look like?]
- Error message: `{specific error}`
- Behavior: [Unexpected behavior]
- Impact: [What breaks]
### Root Cause
[Why does this happen? Technical explanation]
---
## The Solution
### Step 1: {Action}
**Do this**:
```bash
# Command or code
npm install stripe
```
**Why**:
[Explanation of what this accomplishes]
**Expected output**:
```
+ stripe@12.0.0
added 1 package
```
### Step 2: {Next Action}
**Do this**:
```typescript
// Code example
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
```
**Why**:
[Explanation]
**Configuration**:
Add to `.env`:
```
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
```
### Step 3: {Continue...}
...
---
## Complete Example
### Full Working Code
**File**: `src/services/stripe.ts`
```typescript
import Stripe from 'stripe';
export class StripeService {
private stripe: Stripe;
constructor() {
this.stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: '2023-10-16',
});
}
async createPaymentIntent(amount: number) {
return await this.stripe.paymentIntents.create({
amount: amount * 100, // Convert to cents
currency: 'usd',
});
}
}
```
**File**: `src/routes/webhook.ts`
```typescript
export async function handleStripeWebhook(req: Request, res: Response) {
const sig = req.headers['stripe-signature'];
try {
const event = stripe.webhooks.constructEvent(
req.body,
sig,
process.env.STRIPE_WEBHOOK_SECRET!
);
// Handle event
switch (event.type) {
case 'payment_intent.succeeded':
// Process successful payment
break;
}
res.json({ received: true });
} catch (err) {
res.status(400).send(`Webhook Error: ${err.message}`);
}
}
```
---
## Testing
### Verify It Works
**Test 1: Create payment intent**
```bash
curl -X POST http://localhost:3000/api/create-payment \
-H "Content-Type: application/json" \
-d '{"amount": 10}'
```
**Expected result**:
```json
{
"clientSecret": "pi_xxx_secret_yyy"
}
```
**Test 2: Webhook delivery**
```bash
stripe listen --forward-to localhost:3000/webhook
```
**Expected result**:
```
Ready! You are using Stripe API Version [2023-10-16]
```
---
## Prevention
**How to avoid this issue in future**:
- [Prevention strategy 1]
- [Prevention strategy 2]
**Red flags to watch for**:
- [Warning sign 1]
- [Warning sign 2]
---
## Troubleshooting
### Issue: Webhook signature verification fails
**Symptoms**:
```
Error: No signatures found matching the expected signature
```
**Cause**: Webhook secret mismatch or body already parsed
**Fix**:
```typescript
// Use raw body for webhook verification
app.post('/webhook', express.raw({type: 'application/json'}), handleStripeWebhook);
```
### Issue: Payment amount incorrect
**Symptoms**: Charged wrong amount
**Cause**: Forgot to convert to cents
**Fix**: Always multiply by 100 for Stripe amounts
---
## Related Documentation
**Stripe Docs**:
- [Payment Intents API](https://stripe.com/docs/api/payment_intents)
- [Webhooks Guide](https://stripe.com/docs/webhooks)
**Our Docs**:
- Task: `.agent/tasks/TASK-04-stripe-integration.md`
- System: `.agent/system/project-architecture.md` (payments section)
**External**:
- [Stripe Testing Cards](https://stripe.com/docs/testing)
---
## Maintenance Notes
**Update when**:
- Stripe API version changes
- Payment flow changes
- New webhook events added
**Owner**: [Team or person responsible]
---
**Last Updated**: {YYYY-MM-DD}
**Tested With**: Stripe API v2023-10-16, Node.js v18+
```
### Step 5: Save SOP File
Write to appropriate category:
```
Write(
file_path: ".agent/sops/{category}/{name}.md",
content: [generated SOP]
)
```
Filename: `.agent/sops/{category}/{name}.md`
### Step 6: Update Navigator Index
Edit `.agent/DEVELOPMENT-README.md` to add SOP to index:
```markdown
## Standard Operating Procedures
### Integrations
- **{Service}**: `.agent/sops/integrations/{name}.md` - {One-line description}
### Debugging
- **{Issue}**: `.agent/sops/debugging/{name}.md` - {Description}
### Development
...
### Deployment
...
```
### Step 7: Link to Related Task (If Applicable)
If SOP came from specific task, add reference:
**In task doc**:
```markdown
## Related SOPs
- `.agent/sops/integrations/stripe-payment-setup.md`
```
**In SOP**:
```markdown
## Related Documentation
- Task: `.agent/tasks/TASK-04-stripe-integration.md`
```
Cross-linking helps discoverability.
### Step 8: Confirm Success
Show completion message:
```
✅ SOP created successfully!
Title: {SOP Title}
Category: {category}
File: .agent/sops/{category}/{name}.md
Size: {X} KB (~{Y} tokens)
📚 SOP includes:
- Problem description & symptoms
- Step-by-step solution
- Complete code examples
- Testing instructions
- Troubleshooting guide
🔗 Navigator index updated
[If linked: Linked to TASK-{XX}]
To reference later:
Read .agent/sops/{category}/{name}.md
```
## SOP Categories Explained
### 1. integrations/
**Purpose**: How to set up third-party services
**Examples**:
- `stripe-payment-setup.md`
- `github-oauth-integration.md`
- `sendgrid-email-config.md`
- `redis-session-store.md`
**Structure**: Setup steps + Configuration + Testing
### 2. debugging/
**Purpose**: How to solve common issues
**Examples**:
- `cors-proxy-errors.md`
- `jwt-token-expiration.md`
- `database-connection-timeout.md`
- `build-errors-typescript.md`
**Structure**: Symptoms + Root cause + Fix + Prevention
### 3. development/
**Purpose**: Development workflows & patterns
**Examples**:
- `testing-authenticated-routes.md`
- `adding-new-api-endpoint.md`
- `database-migration-workflow.md`
- `component-testing-patterns.md`
**Structure**: When to use + Steps + Example + Best practices
### 4. deployment/
**Purpose**: Deploy, CI/CD, infrastructure
**Examples**:
- `deploy-to-production.md`
- `rollback-failed-deploy.md`
- `setup-github-actions.md`
- `environment-variables.md`
**Structure**: Prerequisites + Steps + Verification + Rollback
## Common Use Cases
### After Solving Tricky Bug
```
User: "Finally fixed CORS issue, save this so we don't hit it again"
→ Creates: .agent/sops/debugging/cors-proxy-errors.md
→ Captures: Error, root cause, fix, prevention
→ Team won't repeat mistake
```
### After Integration Setup
```
User: "Stripe webhooks working, document the setup"
→ Creates: .agent/sops/integrations/stripe-webhooks.md
→ Captures: All config steps, code, testing
→ Next integration is copy-paste
```
### Establishing Team Pattern
```
User: "Document how we test protected routes"
→ Creates: .agent/sops/development/testing-auth-routes.md
→ Captures: Pattern, examples, best practices
→ Team follows consistent approach
```
## Error Handling
**Category directory doesn't exist**:
```
Creating category: .agent/sops/{category}/
✅ Directory created
```
**SOPs directory missing entirely**:
```
❌ Navigator not initialized
Run /nav:init to create .agent/ structure.
```
**Duplicate SOP name**:
```
⚠️ SOP already exists: {name}.md
Options:
1. Read existing (don't duplicate)
2. Update existing (add new info)
3. Rename new SOP ({name}-v2.md)
Your choice [1-3]:
```
## Success Criteria
SOP creation is successful when:
- [ ] SOP file created in correct category
- [ ] Contains all required sections
- [ ] Includes working code examples
- [ ] Testing instructions provided
- [ ] Navigator index updated
- [ ] Linked to related task (if applicable)
## Scripts
**generate_sop.py**: Create SOP from conversation
- Input: Conversation, category, name
- Output: Formatted SOP markdown
## Best Practices
**Good SOP names**:
- `stripe-payment-integration` (specific, descriptive)
- `cors-proxy-configuration` (clear purpose)
- `jwt-token-refresh` (explains what)
**Bad SOP names**:
- `fix` (too vague)
- `integration` (not specific)
- `sop1` (meaningless)
**When to create SOPs**:
- ✅ Solved novel issue (will happen again)
- ✅ Set up integration (reusable process)
- ✅ Established pattern (team should follow)
- ✅ Complex workflow (needs documentation)
- ❌ One-off bug (not reusable)
- ❌ Obvious solution (don't over-document)
**SOP quality checklist**:
- [ ] Clear problem description
- [ ] Step-by-step solution
- [ ] Complete code examples (copy-paste ready)
- [ ] Testing instructions
- [ ] Troubleshooting common issues
## Notes
SOPs are **living documents**:
- Created when pattern established
- Updated when solution improves
- Referenced frequently by team
- Prevent repeated mistakes
They transform:
- Individual knowledge → Team knowledge
- One-time solution → Reusable process
- Tribal knowledge → Documented procedure
**Impact**: Zero repeated mistakes over time
This skill provides same functionality as `/nav:doc sop` command but with natural language invocation.