Initial workflow template
- docs/workflow/: INDEX, ISSUE-FORMAT, WORKFLOW, AGENT-PROMPTS - .issues/: INDEX, example issue - .hooks/: issue-linter.js (pre-commit validator) - package.json with setup script - README.md See docs/workflow/INDEX.md to get started.
This commit is contained in:
264
.hooks/issue-linter.js
Normal file
264
.hooks/issue-linter.js
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Issue Linter - Pre-commit hook validator
|
||||||
|
*
|
||||||
|
* Runs before every commit to ensure issue files are valid.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* node .hooks/issue-linter.js
|
||||||
|
*
|
||||||
|
* Exit codes:
|
||||||
|
* 0 - All checks passed
|
||||||
|
* 1 - Validation errors found
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
// Configuration
|
||||||
|
const ISSUES_DIR = '.issues';
|
||||||
|
const REQUIRED_FRONTMATTER = ['id', 'title', 'status', 'priority', 'created'];
|
||||||
|
const VALID_STATUSES = ['open', 'in-progress', 'done', 'blocked'];
|
||||||
|
const VALID_PRIORITIES = ['low', 'medium', 'high', 'critical'];
|
||||||
|
const REQUIRED_SECTIONS = ['What', 'Why', 'Acceptance Criteria', 'Verification'];
|
||||||
|
|
||||||
|
// Colors for output
|
||||||
|
const RED = '\x1b[31m';
|
||||||
|
const GREEN = '\x1b[32m';
|
||||||
|
const YELLOW = '\x1b[33m';
|
||||||
|
const RESET = '\x1b[0m';
|
||||||
|
|
||||||
|
let errors = [];
|
||||||
|
let warnings = [];
|
||||||
|
|
||||||
|
function logError(msg) {
|
||||||
|
errors.push(msg);
|
||||||
|
console.error(`${RED}[issue-linter] ERROR: ${msg}${RESET}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function logWarning(msg) {
|
||||||
|
warnings.push(msg);
|
||||||
|
console.warn(`${YELLOW}[issue-linter] WARNING: ${msg}${RESET}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function logInfo(msg) {
|
||||||
|
console.log(`${GREEN}[issue-linter] ${msg}${RESET}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse YAML frontmatter from markdown content
|
||||||
|
*/
|
||||||
|
function parseFrontmatter(content) {
|
||||||
|
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
||||||
|
if (!match) return {};
|
||||||
|
|
||||||
|
const frontmatter = {};
|
||||||
|
const lines = match[1].split('\n');
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const colonIndex = line.indexOf(':');
|
||||||
|
if (colonIndex === -1) continue;
|
||||||
|
|
||||||
|
const key = line.slice(0, colonIndex).trim();
|
||||||
|
let value = line.slice(colonIndex + 1).trim();
|
||||||
|
|
||||||
|
// Handle arrays (depends-on)
|
||||||
|
if (value.startsWith('[') && value.endsWith(']')) {
|
||||||
|
value = value.slice(1, -1).split(',').map(v => v.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
frontmatter[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return frontmatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a section exists in the content
|
||||||
|
*/
|
||||||
|
function sectionExists(content, sectionName) {
|
||||||
|
// Look for ## Section Name or ### Section Name
|
||||||
|
const regex = new RegExp(`^#{2,3}\\s+${sectionName}\\s*$`, 'm');
|
||||||
|
return regex.test(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all files that were changed in this commit
|
||||||
|
*/
|
||||||
|
function getChangedFiles() {
|
||||||
|
try {
|
||||||
|
const output = execSync('git diff --cached --name-only', { encoding: 'utf8' });
|
||||||
|
return output.trim().split('\n').filter(f => f.length > 0);
|
||||||
|
} catch (e) {
|
||||||
|
// Fallback for when git commands fail
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the staging area (added files)
|
||||||
|
*/
|
||||||
|
function getStagedFiles() {
|
||||||
|
try {
|
||||||
|
const output = execSync('git diff --cached --name-only --diff-filter=ACM', { encoding: 'utf8' });
|
||||||
|
return output.trim().split('\n').filter(f => f.length > 0);
|
||||||
|
} catch (e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all issue files in .issues/
|
||||||
|
*/
|
||||||
|
function getIssueFiles() {
|
||||||
|
const issuesPath = path.join(process.cwd(), ISSUES_DIR);
|
||||||
|
|
||||||
|
if (!fs.existsSync(issuesPath)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = fs.readdirSync(issuesPath, { recursive: true });
|
||||||
|
return files
|
||||||
|
.filter(f => f.endsWith('.md'))
|
||||||
|
.map(f => path.join(ISSUES_DIR, f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate a single issue file
|
||||||
|
*/
|
||||||
|
function validateIssueFile(filePath) {
|
||||||
|
const fullPath = path.join(process.cwd(), filePath);
|
||||||
|
|
||||||
|
if (!fs.existsSync(fullPath)) {
|
||||||
|
logError(`${filePath} does not exist`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = fs.readFileSync(fullPath, 'utf8');
|
||||||
|
const frontmatter = parseFrontmatter(content);
|
||||||
|
let hasErrors = false;
|
||||||
|
|
||||||
|
// Check required frontmatter
|
||||||
|
for (const field of REQUIRED_FRONTMATTER) {
|
||||||
|
if (!(field in frontmatter)) {
|
||||||
|
logError(`${filePath}: Missing frontmatter field "${field}"`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check status is valid
|
||||||
|
if (frontmatter.status && !VALID_STATUSES.includes(frontmatter.status)) {
|
||||||
|
logError(`${filePath}: Invalid status "${frontmatter.status}". Must be one of: ${VALID_STATUSES.join(', ')}`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check priority is valid
|
||||||
|
if (frontmatter.priority && !VALID_PRIORITIES.includes(frontmatter.priority)) {
|
||||||
|
logError(`${filePath}: Invalid priority "${frontmatter.priority}". Must be one of: ${VALID_PRIORITIES.join(', ')}`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check completed date if status is done
|
||||||
|
if (frontmatter.status === 'done' && !frontmatter.completed) {
|
||||||
|
logError(`${filePath}: Has status "done" but no "completed" date in frontmatter`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check required sections
|
||||||
|
for (const section of REQUIRED_SECTIONS) {
|
||||||
|
if (!sectionExists(content, section)) {
|
||||||
|
logError(`${filePath}: Missing section "## ${section}"`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Plan exists if status is in-progress
|
||||||
|
if (frontmatter.status === 'in-progress' && !sectionExists(content, 'Plan')) {
|
||||||
|
logError(`${filePath}: Has status "in-progress" but no Plan section`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check Agent Working Notes is deleted if status is done
|
||||||
|
if (frontmatter.status === 'done' && sectionExists(content, 'Agent Working Notes')) {
|
||||||
|
logError(`${filePath}: Has status "done" but Agent Working Notes section not deleted`);
|
||||||
|
hasErrors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !hasErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if code was changed without a corresponding issue file
|
||||||
|
*/
|
||||||
|
function checkCodeWithoutIssue(stagedFiles) {
|
||||||
|
const codeExtensions = ['.js', '.ts', '.jsx', '.tsx', '.py', '.go', '.rs', '.java', '.c', '.cpp', '.h', '.hpp', '.rb', '.php', '.cs', '.swift', '.kt', '.scala', '.vue', '.svelte'];
|
||||||
|
|
||||||
|
const codeFiles = stagedFiles.filter(f => {
|
||||||
|
const ext = path.extname(f);
|
||||||
|
return codeExtensions.includes(ext) || f.startsWith('src/') || f.startsWith('lib/') || f.startsWith('app/');
|
||||||
|
});
|
||||||
|
|
||||||
|
const issueFiles = getIssueFiles();
|
||||||
|
|
||||||
|
for (const codeFile of codeFiles) {
|
||||||
|
// Check if there's a related issue file
|
||||||
|
// Extract potential issue number from recent commits or check .issues/INDEX.md
|
||||||
|
// For simplicity, we just warn if there are code changes
|
||||||
|
if (issueFiles.length === 0) {
|
||||||
|
logWarning(`${codeFile}: Code changed but no issue files found`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main validation
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
console.log('[issue-linter] Running pre-commit validation...\n');
|
||||||
|
|
||||||
|
const stagedFiles = getStagedFiles();
|
||||||
|
const issueFiles = getIssueFiles();
|
||||||
|
|
||||||
|
// If no issues exist yet (first time setup), skip issue validation
|
||||||
|
if (issueFiles.length === 0) {
|
||||||
|
logInfo('No issue files found. Skipping issue validation.');
|
||||||
|
logInfo('Add issue files to .issues/ directory before committing code.');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate all issue files (not just staged ones)
|
||||||
|
let allValid = true;
|
||||||
|
for (const file of issueFiles) {
|
||||||
|
if (!validateIssueFile(file)) {
|
||||||
|
allValid = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for code changes without issues
|
||||||
|
checkCodeWithoutIssue(stagedFiles);
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
console.log('');
|
||||||
|
if (errors.length > 0) {
|
||||||
|
console.error(`${RED}[issue-linter] FAIL: ${errors.length} error(s) found${RESET}`);
|
||||||
|
if (warnings.length > 0) {
|
||||||
|
console.warn(`${YELLOW}[issue-linter] ${warnings.length} warning(s)${RESET}`);
|
||||||
|
}
|
||||||
|
process.exit(1);
|
||||||
|
} else if (warnings.length > 0) {
|
||||||
|
console.warn(`${YELLOW}[issue-linter] PASS with warnings: ${warnings.length} warning(s)${RESET}`);
|
||||||
|
process.exit(0);
|
||||||
|
} else {
|
||||||
|
logInfo('PASS: All issue files are valid');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run if called directly
|
||||||
|
if (require.main === module) {
|
||||||
|
main();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { validateIssueFile, parseFrontmatter };
|
||||||
35
.issues/INDEX.md
Normal file
35
.issues/INDEX.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Issue Index
|
||||||
|
|
||||||
|
All open and closed issues for this project.
|
||||||
|
|
||||||
|
## Open Issues
|
||||||
|
|
||||||
|
| # | Title | Priority | Depends On | Status |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| — | No open issues | — | — | — |
|
||||||
|
|
||||||
|
## Closed Issues
|
||||||
|
|
||||||
|
| # | Title | Completed |
|
||||||
|
|---|---|---|
|
||||||
|
| — | No closed issues | — |
|
||||||
|
|
||||||
|
## Legend
|
||||||
|
|
||||||
|
- **Priority**: low < medium < high < critical
|
||||||
|
- **Status**: open → in-progress → done (or blocked)
|
||||||
|
- **Depends On**: Blocked until these issues are done
|
||||||
|
|
||||||
|
## Creating a New Issue
|
||||||
|
|
||||||
|
1. Pick the next number (highest + 1)
|
||||||
|
2. Create `/.issues/<number>-<slug>.md`
|
||||||
|
3. Use format from `/docs/workflow/ISSUE-FORMAT.md`
|
||||||
|
4. Add entry to this table
|
||||||
|
5. See `/docs/workflow/AGENT-PROMPTS.md` for creation prompt
|
||||||
|
|
||||||
|
## Workflow Overview
|
||||||
|
|
||||||
|
See `/docs/workflow/INDEX.md` for quick start.
|
||||||
|
|
||||||
|
See `/docs/workflow/WORKFLOW.md` for detailed stages.
|
||||||
56
.issues/example/001-example-issue.md
Normal file
56
.issues/example/001-example-issue.md
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
---
|
||||||
|
id: 001
|
||||||
|
title: Example issue with full format
|
||||||
|
status: open
|
||||||
|
priority: medium
|
||||||
|
created: 2024-04-18
|
||||||
|
---
|
||||||
|
|
||||||
|
## What
|
||||||
|
This is an example issue demonstrating the complete format. Replace this with your actual issue.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
Use this as a template when creating new issues. Delete this issue after reviewing the format.
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
- [ ] This example can be deleted
|
||||||
|
- [ ] Format is clear and usable
|
||||||
|
- [ ] All required sections are present
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
1. Read this file
|
||||||
|
2. Verify all sections are present
|
||||||
|
3. Delete this file when done
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Agent Working Notes
|
||||||
|
|
||||||
|
### Plan
|
||||||
|
<!-- What approach will you take? List steps before coding. -->
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
### Status Log
|
||||||
|
<!-- Timestamped entries: what was done, what was decided, what was found -->
|
||||||
|
|
||||||
|
### Blockers
|
||||||
|
<!-- List any blockers with proposed solutions. If none, write "None." -->
|
||||||
|
|
||||||
|
### Self-Verification
|
||||||
|
<!-- Must be filled before claiming done -->
|
||||||
|
- [ ] Smoke test ran:
|
||||||
|
- [ ] Acceptance criteria checked:
|
||||||
|
- [ ] Screenshot taken (if UI change):
|
||||||
|
- [ ] Dependent issues still work:
|
||||||
|
|
||||||
|
### Human Review Notes
|
||||||
|
<!-- Human fills after agent marks done -->
|
||||||
|
|
||||||
|
Review date:
|
||||||
|
|
||||||
|
Reasoning check:
|
||||||
|
- [ ] Plan makes sense
|
||||||
|
- [ ] Status log shows good decisions
|
||||||
|
- [ ] Self-verification is complete and honest
|
||||||
|
|
||||||
|
Feedback:
|
||||||
79
README.md
79
README.md
@@ -1,3 +1,78 @@
|
|||||||
# workflow
|
# Workflow Template
|
||||||
|
|
||||||
Standard issue-based workflow template for teams. Clone this repo to start a new project with enforced issue tracking.
|
A portable, file-based issue tracking and development workflow for teams.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. **Clone this repo** into your new project
|
||||||
|
2. **Install dependencies**: `pnpm install` (or npm, yarn)
|
||||||
|
3. **Run setup**: `pnpm run setup` (installs pre-commit hook)
|
||||||
|
4. **Read the docs**: See `docs/workflow/INDEX.md`
|
||||||
|
5. **Start working**: See `docs/workflow/WORKFLOW.md`
|
||||||
|
|
||||||
|
## What This Is
|
||||||
|
|
||||||
|
- **Issues are files** in `/.issues/`, not in external trackers
|
||||||
|
- **Issues are tracked by git**, alongside the code they affect
|
||||||
|
- **Agents think out loud** in issue files, making reasoning visible
|
||||||
|
- **Humans approve reasoning**, not code line-by-line
|
||||||
|
- **Pre-commit hooks enforce** issue format before any commit
|
||||||
|
|
||||||
|
## File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/
|
||||||
|
├── docs/workflow/ # Workflow documentation
|
||||||
|
│ ├── INDEX.md ← Start here
|
||||||
|
│ ├── ISSUE-FORMAT.md ← Issue file format
|
||||||
|
│ ├── WORKFLOW.md ← Step-by-step process
|
||||||
|
│ └── AGENT-PROMPTS.md ← Copy-paste agent prompts
|
||||||
|
├── .issues/ # Issue files
|
||||||
|
│ ├── INDEX.md # List of all issues
|
||||||
|
│ └── example/ # Example issues
|
||||||
|
├── .hooks/ # Pre-commit validators
|
||||||
|
│ └── issue-linter.js # Issue format validator
|
||||||
|
└── package.json # Setup scripts
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone this repo into your new project
|
||||||
|
git clone https://git.fbrns.co/shoko/workflow.git my-new-project
|
||||||
|
cd my-new-project
|
||||||
|
|
||||||
|
# Remove git history (optional, for a fresh start)
|
||||||
|
rm -rf .git
|
||||||
|
|
||||||
|
# Initialize git
|
||||||
|
git init
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# Setup pre-commit hook
|
||||||
|
pnpm run setup
|
||||||
|
|
||||||
|
# Remove this README (it's the template's README)
|
||||||
|
rm README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## For Teams
|
||||||
|
|
||||||
|
This template is maintained at: https://git.fbrns.co/shoko/workflow
|
||||||
|
|
||||||
|
To update the template for all projects:
|
||||||
|
1. Pull latest changes from this repo
|
||||||
|
2. Merge into your project
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- [Workflow Overview](docs/workflow/INDEX.md)
|
||||||
|
- [Issue Format](docs/workflow/ISSUE-FORMAT.md)
|
||||||
|
- [Step-by-Step Workflow](docs/workflow/WORKFLOW.md)
|
||||||
|
- [Agent Prompts](docs/workflow/AGENT-PROMPTS.md)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Internal use. See https://git.fbrns.co/shoko/workflow
|
||||||
|
|||||||
255
docs/workflow/AGENT-PROMPTS.md
Normal file
255
docs/workflow/AGENT-PROMPTS.md
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
# Agent Prompts
|
||||||
|
|
||||||
|
Copy-paste ready prompts for each stage of the workflow.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 2: Pick Up — Agent Prompt
|
||||||
|
|
||||||
|
Copy and paste this when starting work on an issue:
|
||||||
|
|
||||||
|
```
|
||||||
|
You're picking up issue #<number>: <title>
|
||||||
|
|
||||||
|
Steps:
|
||||||
|
1. Read /.issues/<number>-<title>.md completely
|
||||||
|
2. Read all depends-on issues:
|
||||||
|
<list issue numbers here>
|
||||||
|
3. Read related code:
|
||||||
|
<list files here>
|
||||||
|
4. Write your Plan in ## Agent Working Notes > Plan:
|
||||||
|
- Approach: how will you solve this?
|
||||||
|
- Files to touch: which files will you change?
|
||||||
|
- Risks: what could go wrong?
|
||||||
|
5. Change status to `in-progress`
|
||||||
|
6. Wait for human acknowledgment before proceeding
|
||||||
|
|
||||||
|
Remember: You must understand the dependencies before starting. Don't assume they work a certain way.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 3: Implementation — Status Log Prompt
|
||||||
|
|
||||||
|
After each significant step, log it:
|
||||||
|
|
||||||
|
```
|
||||||
|
Add to ## Status Log:
|
||||||
|
|
||||||
|
YYYY-MM-DD HH:MM - <What you did>
|
||||||
|
<Why you did it this way>
|
||||||
|
<Any decisions made>
|
||||||
|
```
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
2024-04-18 14:30 - Implemented delete button component
|
||||||
|
Decided to put it in SettingsPage.tsx rather than separate component
|
||||||
|
since it's only used in one place. Button uses danger variant for emphasis.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 3: Implementation — Scope Change Prompt
|
||||||
|
|
||||||
|
If scope needs to change:
|
||||||
|
|
||||||
|
```
|
||||||
|
Stop implementation immediately.
|
||||||
|
|
||||||
|
Add to ## Status Log:
|
||||||
|
---
|
||||||
|
Scope change detected: <description>
|
||||||
|
|
||||||
|
Original scope: <what was scoped>
|
||||||
|
New requirement: <what was found>
|
||||||
|
|
||||||
|
Proposed solution:
|
||||||
|
<your proposed approach>
|
||||||
|
|
||||||
|
Status: Waiting for human approval before proceeding.
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 3: Implementation — Blocker Prompt
|
||||||
|
|
||||||
|
If blocked:
|
||||||
|
|
||||||
|
```
|
||||||
|
Add to ## Blockers:
|
||||||
|
|
||||||
|
Blocker: <description>
|
||||||
|
Proposed solution: <your proposed approach>
|
||||||
|
Status: Waiting for resolution.
|
||||||
|
|
||||||
|
Do not proceed until this is resolved.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 4: Self-Verification Prompt
|
||||||
|
|
||||||
|
Copy and paste this template, then fill in each item:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Self-Verification
|
||||||
|
|
||||||
|
Complete before claiming done:
|
||||||
|
|
||||||
|
- [ ] Smoke test ran:
|
||||||
|
Command: <command>
|
||||||
|
Result: <pass/fail>
|
||||||
|
If fail: <what failed, what you did about it>
|
||||||
|
|
||||||
|
- [ ] Acceptance criteria checked:
|
||||||
|
<List each criterion and result>
|
||||||
|
- [ ] Criterion 1: <pass/fail> — <notes>
|
||||||
|
- [ ] Criterion 2: <pass/fail> — <notes>
|
||||||
|
|
||||||
|
- [ ] Screenshot taken (if UI change):
|
||||||
|
<path to screenshot> or N/A
|
||||||
|
|
||||||
|
- [ ] Dependent issues still work:
|
||||||
|
- Issue #<number>: <what you tested> — <pass/fail>
|
||||||
|
- Issue #<number>: <what you tested> — <pass/fail>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 5: Request Review Prompt
|
||||||
|
|
||||||
|
After completing self-verification:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Agent Working Notes
|
||||||
|
|
||||||
|
[after Self-Verification is complete]
|
||||||
|
|
||||||
|
Add to ### Human Review Notes:
|
||||||
|
|
||||||
|
Agent requests review.
|
||||||
|
|
||||||
|
All self-verification checks passed. Ready for approval to close.
|
||||||
|
|
||||||
|
Files changed: <list>
|
||||||
|
Tests added: <list if any>
|
||||||
|
Screenshots: <path if applicable>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Full Issue Implementation Prompt
|
||||||
|
|
||||||
|
For the agent to use from start to finish:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Your Task
|
||||||
|
|
||||||
|
Implement issue #<number>: <title>
|
||||||
|
|
||||||
|
## Instructions
|
||||||
|
|
||||||
|
1. **Read the issue file**: `/.issues/<number>-<title>.md`
|
||||||
|
2. **Read dependencies**: Issues listed in `depends-on`
|
||||||
|
3. **Read related code**: Files that will be affected
|
||||||
|
4. **Write your Plan** in the issue file's `## Agent Working Notes > Plan`
|
||||||
|
5. **Wait for acknowledgment** ("ok" from human)
|
||||||
|
6. **Implement** the feature or fix
|
||||||
|
7. **Log decisions** in `## Status Log` as you go
|
||||||
|
8. **If scope changes or blocked**: Stop, document, wait
|
||||||
|
9. **Self-verify** using the template in Stage 4
|
||||||
|
10. **Request review** when done
|
||||||
|
|
||||||
|
## Key Rules
|
||||||
|
|
||||||
|
- Think out loud in the issue file
|
||||||
|
- Verify before claiming done
|
||||||
|
- Ask if unsure — don't assume
|
||||||
|
- Dependencies must be verified, not assumed
|
||||||
|
- Pre-commit hook will check your issue file — keep it complete
|
||||||
|
|
||||||
|
## Do NOT
|
||||||
|
|
||||||
|
- Skip the issue file format
|
||||||
|
- Skip self-verification
|
||||||
|
- Proceed without human acknowledgment on plans
|
||||||
|
- Ignore scope changes
|
||||||
|
- Assume dependencies work without checking
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependency Verification Prompt
|
||||||
|
|
||||||
|
When checking if a dependency works:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Dependency Check: Issue #<number>
|
||||||
|
|
||||||
|
Issue: <title>
|
||||||
|
Status: <status>
|
||||||
|
Output: <what this issue produces>
|
||||||
|
|
||||||
|
Verification performed:
|
||||||
|
- Ran tests: <command> — <pass/fail>
|
||||||
|
- Checked integration: <what you tested>
|
||||||
|
- Screenshots (if UI): <path or N/A>
|
||||||
|
|
||||||
|
Result: <dependency works / dependency has issues>
|
||||||
|
|
||||||
|
If dependency has issues:
|
||||||
|
- Document what doesn't work
|
||||||
|
- Write proposed fix in ## Blockers
|
||||||
|
- Do not proceed until resolved
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Issue Creation Prompt
|
||||||
|
|
||||||
|
For creating a new issue:
|
||||||
|
|
||||||
|
```
|
||||||
|
## Create New Issue
|
||||||
|
|
||||||
|
Create a new issue file in /.issues/
|
||||||
|
|
||||||
|
1. Check /.issues/INDEX.md for the next available number
|
||||||
|
2. Create /.issues/<number>-<slug>.md using the format in /docs/workflow/ISSUE-FORMAT.md
|
||||||
|
3. Fill in:
|
||||||
|
- All frontmatter
|
||||||
|
- ## What — what needs to be built or fixed
|
||||||
|
- ## Why — why it matters
|
||||||
|
- ## Acceptance Criteria — testable checklist
|
||||||
|
- ## Verification — how to test it
|
||||||
|
- Leave ## Agent Working Notes empty
|
||||||
|
4. Add to /.issues/INDEX.md
|
||||||
|
5. Set status to `open`
|
||||||
|
|
||||||
|
Issue number: <next number>
|
||||||
|
Issue slug: <descriptive-kebab-case>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pre-commit Hook Failure Response
|
||||||
|
|
||||||
|
If the pre-commit hook fails:
|
||||||
|
|
||||||
|
```
|
||||||
|
The pre-commit hook rejected your commit due to issue file errors.
|
||||||
|
|
||||||
|
Error: <error message from hook>
|
||||||
|
|
||||||
|
Fix the issue file(s) before committing:
|
||||||
|
- Missing frontmatter fields
|
||||||
|
- Missing required sections
|
||||||
|
- Invalid status values
|
||||||
|
- Missing Plan when status is in-progress
|
||||||
|
- Missing completed date when status is done
|
||||||
|
- Agent Working Notes not deleted when status is done
|
||||||
|
|
||||||
|
After fixing, try committing again.
|
||||||
|
```
|
||||||
96
docs/workflow/INDEX.md
Normal file
96
docs/workflow/INDEX.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# Workflow Template
|
||||||
|
|
||||||
|
A portable, file-based issue tracking and development workflow for teams.
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
1. **Clone or fork this repo** into your new project
|
||||||
|
2. **Run setup** (if applicable to your project)
|
||||||
|
3. **Read this entire doc** before starting work
|
||||||
|
4. **Read `/docs/workflow/ISSUE-FORMAT.md`** before creating your first issue
|
||||||
|
5. **Follow `/docs/workflow/WORKFLOW.md`** for the step-by-step process
|
||||||
|
|
||||||
|
## What This Is
|
||||||
|
|
||||||
|
A workflow where:
|
||||||
|
- **Issues are files** in `/.issues/`, not in external trackers
|
||||||
|
- **Issues are tracked by git**, alongside the code they affect
|
||||||
|
- **Agents think out loud** in issue files, making reasoning visible
|
||||||
|
- **Humans approve reasoning**, not code line-by-line
|
||||||
|
- **Pre-commit hooks enforce** issue format before any commit
|
||||||
|
|
||||||
|
## File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
/
|
||||||
|
├── docs/workflow/
|
||||||
|
│ ├── INDEX.md ← You are here
|
||||||
|
│ ├── ISSUE-FORMAT.md ← Required fields for issue files
|
||||||
|
│ ├── WORKFLOW.md ← Step-by-step stages and gates
|
||||||
|
│ └── AGENT-PROMPTS.md ← Copy-paste prompts for agents
|
||||||
|
├── .issues/
|
||||||
|
│ ├── INDEX.md ← List of all open issues
|
||||||
|
│ └── example/
|
||||||
|
│ └── 001-example.md
|
||||||
|
├── .hooks/
|
||||||
|
│ └── issue-linter.js ← Pre-commit validator
|
||||||
|
└── package.json ← (optional) setup scripts
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Principles
|
||||||
|
|
||||||
|
1. **If it's not written down, it doesn't exist.**
|
||||||
|
All context, decisions, and feedback live in the issue file.
|
||||||
|
|
||||||
|
2. **The agent thinks out loud.**
|
||||||
|
Every significant step—plan, decisions, blockers, verification—is written in the issue.
|
||||||
|
|
||||||
|
3. **Verification before handoff.**
|
||||||
|
The agent must prove the work works before declaring it done.
|
||||||
|
|
||||||
|
4. **Humans approve reasoning, not tasks.**
|
||||||
|
Your job is to agree or disagree with the agent's logic, not to catch missing code.
|
||||||
|
|
||||||
|
5. **Integration is a first-class concern.**
|
||||||
|
Issues have dependencies. Dependencies must be checked before claiming done.
|
||||||
|
|
||||||
|
## Before Starting a New Project
|
||||||
|
|
||||||
|
Tell your agent to set up the workflow:
|
||||||
|
|
||||||
|
> "feynman, set up the workflow using the template from https://git.fbrns.co/shoko/workflow"
|
||||||
|
|
||||||
|
The agent will copy the structure and install the pre-commit hook automatically.
|
||||||
|
|
||||||
|
## For New Team Members
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone the project
|
||||||
|
git clone <repo-url>
|
||||||
|
pnpm install # or npm install, yarn, etc.
|
||||||
|
|
||||||
|
# Read the docs
|
||||||
|
cat docs/workflow/INDEX.md
|
||||||
|
cat docs/workflow/ISSUE-FORMAT.md
|
||||||
|
cat docs/workflow/WORKFLOW.md
|
||||||
|
|
||||||
|
# Check what's being worked on
|
||||||
|
cat .issues/INDEX.md
|
||||||
|
|
||||||
|
# Pick an issue, read it, start working
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pre-commit Hook
|
||||||
|
|
||||||
|
The hook at `.hooks/issue-linter.js` runs automatically before every commit. It will reject commits that:
|
||||||
|
- Change code without a corresponding issue file
|
||||||
|
- Have incomplete issue files (missing required fields)
|
||||||
|
- Have invalid status values
|
||||||
|
- Have `done` status without completion date
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
- **Workflow questions** → Read `/docs/workflow/WORKFLOW.md`
|
||||||
|
- **Issue format questions** → Read `/docs/workflow/ISSUE-FORMAT.md`
|
||||||
|
- **Agent instructions** → Copy prompts from `/docs/workflow/AGENT-PROMPTS.md`
|
||||||
|
- **What's open** → Check `/.issues/INDEX.md`
|
||||||
215
docs/workflow/ISSUE-FORMAT.md
Normal file
215
docs/workflow/ISSUE-FORMAT.md
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
# Issue Format
|
||||||
|
|
||||||
|
Every issue is a single Markdown file in `/.issues/`. No exceptions.
|
||||||
|
|
||||||
|
## File Naming
|
||||||
|
|
||||||
|
```
|
||||||
|
<number>-<slug>.md
|
||||||
|
```
|
||||||
|
|
||||||
|
- `<number>`: Sequential, zero-padded to 3 digits (001, 002, 010, 100)
|
||||||
|
- `<slug>`: Short, kebab-case, descriptive (e.g., `user-authentication`, `fix-nav-crash`)
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `001-user-authentication.md`
|
||||||
|
- `042-fix-login-modal.md`
|
||||||
|
- `100-setup-ci-cd.md`
|
||||||
|
|
||||||
|
## Required Frontmatter
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
id: 001
|
||||||
|
title: Add user authentication
|
||||||
|
status: open # open | in-progress | done | blocked
|
||||||
|
priority: high # low | medium | high | critical
|
||||||
|
depends-on: # optional, list issue IDs
|
||||||
|
- 000
|
||||||
|
created: 2024-04-18
|
||||||
|
completed: # fill when status becomes done
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
## Required Sections
|
||||||
|
|
||||||
|
### 1. What
|
||||||
|
One paragraph explaining *what* needs to be built or fixed. Be specific.
|
||||||
|
|
||||||
|
### 2. Why
|
||||||
|
One paragraph explaining *why* this matters. Link to customer feedback, bug reports, or business context if available.
|
||||||
|
|
||||||
|
### 3. Acceptance Criteria
|
||||||
|
A checklist. Each item should be:
|
||||||
|
- Testable (can say "pass" or "fail")
|
||||||
|
- Specific (not vague like "works well")
|
||||||
|
- Independent (not dependent on other criteria)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```markdown
|
||||||
|
## Acceptance Criteria
|
||||||
|
- [ ] Button visible only to authenticated users
|
||||||
|
- [ ] Clicking opens a confirmation modal
|
||||||
|
- [ ] Confirming deletes account and redirects to homepage
|
||||||
|
- [ ] No console errors on the settings page
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Verification
|
||||||
|
How to test this issue. Include:
|
||||||
|
- What commands to run
|
||||||
|
- What to look for
|
||||||
|
- What routes to check
|
||||||
|
- Any manual steps required
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```markdown
|
||||||
|
## Verification
|
||||||
|
1. Run `pnpm test -- --grep "settings"`
|
||||||
|
2. Start dev server: `pnpm dev`
|
||||||
|
3. Navigate to `/settings`
|
||||||
|
4. Log in and verify button appears
|
||||||
|
5. Click button, verify modal opens
|
||||||
|
6. Confirm deletion, verify redirect to homepage
|
||||||
|
```
|
||||||
|
|
||||||
|
## Agent Working Notes (Required for All Issues)
|
||||||
|
|
||||||
|
This section is **for the agent to fill in**. It is deleted before closing.
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
|
||||||
|
## Agent Working Notes
|
||||||
|
|
||||||
|
### Plan
|
||||||
|
<!-- What approach will you take? List steps before coding. -->
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
### Status Log
|
||||||
|
<!-- Timestamped entries: what was done, what was decided, what was found -->
|
||||||
|
<!-- Format: YYYY-MM-DD HH:MM - Entry -->
|
||||||
|
|
||||||
|
### Blockers
|
||||||
|
<!-- List any blockers with proposed solutions. If none, write "None." -->
|
||||||
|
|
||||||
|
### Self-Verification
|
||||||
|
<!-- Must be filled before claiming done -->
|
||||||
|
- [ ] Smoke test ran: <!-- command and result -->
|
||||||
|
- [ ] Acceptance criteria checked: <!-- which ones, results -->
|
||||||
|
- [ ] Screenshot taken (if UI change): <!-- path or "N/A" -->
|
||||||
|
- [ ] Dependent issues still work: <!-- which ones, results -->
|
||||||
|
```
|
||||||
|
|
||||||
|
### Self-Verification Fields
|
||||||
|
|
||||||
|
| Field | When to Fill | What to Write |
|
||||||
|
|---|---|---|
|
||||||
|
| Smoke test | Always | Command run and whether it passed |
|
||||||
|
| Acceptance criteria | Always | Which criteria were checked, results |
|
||||||
|
| Screenshot | UI changes only | Path to screenshot or "N/A" |
|
||||||
|
| Dependent issues | Has depends-on | Which issues were tested, results |
|
||||||
|
|
||||||
|
## Human Review Notes
|
||||||
|
|
||||||
|
Filled by the human reviewer.
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
### Human Review Notes
|
||||||
|
<!-- Human fills after agent marks done -->
|
||||||
|
|
||||||
|
Review date: YYYY-MM-DD
|
||||||
|
|
||||||
|
Reasoning check:
|
||||||
|
- [ ] Plan makes sense
|
||||||
|
- [ ] Status log shows good decisions
|
||||||
|
- [ ] Self-verification is complete and honest
|
||||||
|
|
||||||
|
Feedback: <!-- any changes requested, or "Approved" -->
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example Issue
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
---
|
||||||
|
id: 023
|
||||||
|
title: Add delete account button to settings
|
||||||
|
status: open
|
||||||
|
priority: high
|
||||||
|
depends-on:
|
||||||
|
- 018
|
||||||
|
created: 2024-04-18
|
||||||
|
---
|
||||||
|
|
||||||
|
## What
|
||||||
|
Add a "Delete Account" button to the user settings page. The button should only be visible to authenticated users and require confirmation before deletion.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
Users need a way to permanently delete their account. Currently there's no path to account deletion, leading to support requests.
|
||||||
|
|
||||||
|
## Acceptance Criteria
|
||||||
|
- [ ] Button visible only to authenticated users
|
||||||
|
- [ ] Clicking opens a confirmation modal
|
||||||
|
- [ ] Confirming deletes account and redirects to homepage
|
||||||
|
- [ ] No console errors on the settings page
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
1. Run `pnpm test -- --grep "settings"`
|
||||||
|
2. Start dev server: `pnpm dev`
|
||||||
|
3. Navigate to `/settings`
|
||||||
|
4. Verify button appears after login
|
||||||
|
5. Click button, verify modal opens
|
||||||
|
6. Confirm deletion, verify redirect to homepage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Agent Working Notes
|
||||||
|
|
||||||
|
### Plan
|
||||||
|
- [ ]
|
||||||
|
|
||||||
|
### Status Log
|
||||||
|
|
||||||
|
### Blockers
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Self-Verification
|
||||||
|
- [ ] Smoke test ran:
|
||||||
|
- [ ] Acceptance criteria checked:
|
||||||
|
- [ ] Screenshot taken (if UI change):
|
||||||
|
- [ ] Dependent issues still work:
|
||||||
|
|
||||||
|
### Human Review Notes
|
||||||
|
|
||||||
|
Review date:
|
||||||
|
|
||||||
|
Reasoning check:
|
||||||
|
- [ ] Plan makes sense
|
||||||
|
- [ ] Status log shows good decisions
|
||||||
|
- [ ] Self-verification is complete and honest
|
||||||
|
|
||||||
|
Feedback:
|
||||||
|
```
|
||||||
|
|
||||||
|
## Validation Rules
|
||||||
|
|
||||||
|
The pre-commit hook checks:
|
||||||
|
|
||||||
|
| Rule | Error Message |
|
||||||
|
|---|---|
|
||||||
|
| Code changed without issue file | `Code changed but no issue file found for: <files>` |
|
||||||
|
| Missing frontmatter | `Missing frontmatter in: <file>` |
|
||||||
|
| Missing required sections | `Missing section in <file>: <section>` |
|
||||||
|
| Invalid status | `Invalid status in <file>: <value>` |
|
||||||
|
| Status "done" without completed date | `<file> has status "done" but no completed date` |
|
||||||
|
| Status "in-progress" without Plan | `<file> has status "in-progress" but no Plan` |
|
||||||
|
| Agent Working Notes not deleted on close | `<file> has status "done" but Agent Working Notes not deleted` |
|
||||||
|
|
||||||
|
## Creating a New Issue
|
||||||
|
|
||||||
|
1. Pick the next number: check `/.issues/INDEX.md` for the highest
|
||||||
|
2. Create the file with this exact template
|
||||||
|
3. Add to `/.issues/INDEX.md`
|
||||||
|
4. Move status to `in-progress` when starting work
|
||||||
|
5. Delete Agent Working Notes when closing
|
||||||
|
|
||||||
|
Do not create issues outside of `/.issues/`. Do not use external issue trackers.
|
||||||
345
docs/workflow/WORKFLOW.md
Normal file
345
docs/workflow/WORKFLOW.md
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
# Workflow
|
||||||
|
|
||||||
|
The complete step-by-step process for working through an issue, from creation to close.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 1. ISSUE CREATION Human or agent creates issue file │
|
||||||
|
│ All required fields filled │
|
||||||
|
│ Dependencies identified │
|
||||||
|
└────────────────────────────────┬───────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 2. PICK UP Agent reads issue + dependencies │
|
||||||
|
│ Agent writes Plan │
|
||||||
|
│ Human acknowledges or revises │
|
||||||
|
└────────────────────────────────┬───────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 3. IMPLEMENTATION Agent works and logs decisions │
|
||||||
|
│ New information → pause + ask │
|
||||||
|
│ Blocker → write + wait │
|
||||||
|
└────────────────────────────────┬───────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 4. SELF-VERIFICATION Agent runs smoke test │
|
||||||
|
│ Agent checks acceptance criteria │
|
||||||
|
│ Agent takes screenshot if UI │
|
||||||
|
│ Agent verifies dependencies │
|
||||||
|
└────────────────────────────────┬───────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 5. READY FOR REVIEW Agent marks done in Status Log │
|
||||||
|
│ Agent requests review in file │
|
||||||
|
│ Human reviews reasoning │
|
||||||
|
│ Human approves or requests changes │
|
||||||
|
└────────────────────────────────┬───────────────────────────────────┘
|
||||||
|
↓
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 6. CLOSE Human approves → status: done │
|
||||||
|
│ Agent Working Notes deleted │
|
||||||
|
│ PR created with issue number │
|
||||||
|
└────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Stage 1: Issue Creation
|
||||||
|
|
||||||
|
### Who: Human (or agent with human approval)
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Check `/.issues/INDEX.md` for the current highest issue number
|
||||||
|
2. Create `/.issues/<number>-<slug>.md` using the format in `ISSUE-FORMAT.md`
|
||||||
|
3. Fill in:
|
||||||
|
- All frontmatter (id, title, status, priority, depends-on, created)
|
||||||
|
- `## What` — what needs to be built or fixed
|
||||||
|
- `## Why` — why it matters
|
||||||
|
- `## Acceptance Criteria` — testable checklist
|
||||||
|
- `## Verification` — how to test it
|
||||||
|
- Leave `## Agent Working Notes` empty (for the agent to fill)
|
||||||
|
4. Add the issue to `/.issues/INDEX.md`
|
||||||
|
5. Mark status as `open`
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
Issue file exists with all required fields. Human has reviewed and approved the issue.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 2: Pick Up
|
||||||
|
|
||||||
|
### Who: Agent
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Read this issue file completely
|
||||||
|
2. Read all issues listed in `depends-on`
|
||||||
|
3. Read any related code that will be affected
|
||||||
|
4. Write your Plan in `## Agent Working Notes > Plan`
|
||||||
|
- Approach: how will you solve this?
|
||||||
|
- Files to touch: which files will you change?
|
||||||
|
- Risks: what could go wrong?
|
||||||
|
5. Change status to `in-progress`
|
||||||
|
6. Commit this initial work (optional, but recommended)
|
||||||
|
7. Wait for human acknowledgment
|
||||||
|
|
||||||
|
### Human's Role
|
||||||
|
|
||||||
|
Read the Plan. Ask yourself:
|
||||||
|
- Does the approach make sense?
|
||||||
|
- Are the files to touch correct?
|
||||||
|
- Did the agent read the dependencies?
|
||||||
|
|
||||||
|
React with:
|
||||||
|
- **"ok"** — proceed with implementation
|
||||||
|
- **"revise" + feedback** — explain what needs to change and why
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
Agent has written a Plan. Human has said "ok" (or equivalent).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 3: Implementation
|
||||||
|
|
||||||
|
### Who: Agent
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Work through the Plan
|
||||||
|
2. After each significant step, add an entry to `## Status Log`:
|
||||||
|
```markdown
|
||||||
|
YYYY-MM-DD HH:MM - Did X, decided Y because Z
|
||||||
|
```
|
||||||
|
3. If new information changes scope:
|
||||||
|
- Stop
|
||||||
|
- Write the new information in Status Log
|
||||||
|
- Add a note: "Scope change detected, waiting for approval"
|
||||||
|
- Wait for human approval before continuing
|
||||||
|
4. If you encounter a blocker:
|
||||||
|
- Write it in `## Blockers` with a proposed solution
|
||||||
|
- Wait for resolution before continuing
|
||||||
|
5. Do NOT skip steps or make assumptions about dependencies
|
||||||
|
|
||||||
|
### What Belongs in Status Log
|
||||||
|
|
||||||
|
- Decisions made and why
|
||||||
|
- Code approaches tried and discarded
|
||||||
|
- Findings from reading code
|
||||||
|
- Anything that affects the plan
|
||||||
|
- Any interaction with dependencies
|
||||||
|
|
||||||
|
### What Does NOT Belong in Status Log
|
||||||
|
|
||||||
|
- Trivial actions ("changed variable x to y")
|
||||||
|
- Unnecessary detail
|
||||||
|
- Personal commentary
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
Implementation complete. Self-Verification filled (see Stage 4).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 4: Self-Verification
|
||||||
|
|
||||||
|
### Who: Agent
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Run smoke tests:
|
||||||
|
```bash
|
||||||
|
# Run tests related to this feature
|
||||||
|
pnpm test -- --grep "<relevant-pattern>"
|
||||||
|
|
||||||
|
# Check for console errors
|
||||||
|
# (manually or via test)
|
||||||
|
```
|
||||||
|
2. Check each Acceptance Criterion:
|
||||||
|
- Can you verify it passes? Mark `[x]`
|
||||||
|
- Does it fail? Mark `[ ]` and fix it
|
||||||
|
3. If UI change: take a screenshot
|
||||||
|
- Save to `.issues/screenshots/<issue-id>-<description>.png`
|
||||||
|
- Reference it in Self-Verification
|
||||||
|
4. If depends-on: verify dependent features still work
|
||||||
|
- Run their tests
|
||||||
|
- Do a quick manual check
|
||||||
|
5. Fill `## Agent Working Notes > Self-Verification`
|
||||||
|
|
||||||
|
### Self-Verification Must Be Honest
|
||||||
|
|
||||||
|
If a smoke test fails, fix it before claiming done. If an acceptance criterion can't be met, document why and wait for human guidance.
|
||||||
|
|
||||||
|
Do not claim "verified" if it isn't. The human will find out during review.
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
All Self-Verification items checked. Smoke test passes. Dependencies verified.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 5: Ready for Review
|
||||||
|
|
||||||
|
### Who: Human
|
||||||
|
|
||||||
|
### Agent's Steps
|
||||||
|
|
||||||
|
1. Ensure Status Log is complete
|
||||||
|
2. Ensure Self-Verification is complete
|
||||||
|
3. Add a review request in the file:
|
||||||
|
```markdown
|
||||||
|
### Human Review Notes
|
||||||
|
|
||||||
|
Review date: YYYY-MM-DD
|
||||||
|
|
||||||
|
Agent requests review.
|
||||||
|
```
|
||||||
|
4. The human will fill in the rest
|
||||||
|
|
||||||
|
### Human's Steps
|
||||||
|
|
||||||
|
1. Read the issue file completely
|
||||||
|
2. Read the Status Log
|
||||||
|
3. Read the Self-Verification
|
||||||
|
4. Ask yourself:
|
||||||
|
- Does the reasoning make sense?
|
||||||
|
- Were good decisions made?
|
||||||
|
- Did the agent check the dependencies?
|
||||||
|
- Is the Self-Verification honest?
|
||||||
|
- Are there any edge cases not covered?
|
||||||
|
|
||||||
|
5. Either:
|
||||||
|
- **Approve**: Write "Approved" in Human Review Notes, proceed to Stage 6
|
||||||
|
- **Request changes**: Write specific feedback in Human Review Notes, agent fixes (go back to Stage 3)
|
||||||
|
|
||||||
|
### What You're Approving
|
||||||
|
|
||||||
|
**Reasoning, not tasks.** You're not checking code line-by-line. You're checking:
|
||||||
|
- The agent understood the problem
|
||||||
|
- The agent made sensible decisions
|
||||||
|
- The agent verified the work
|
||||||
|
- Integration with dependencies was checked
|
||||||
|
|
||||||
|
If the reasoning is sound and verification was thorough, approve.
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
Human has written "Approved" in Human Review Notes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Stage 6: Close
|
||||||
|
|
||||||
|
### Who: Agent (with human oversight)
|
||||||
|
|
||||||
|
### Steps
|
||||||
|
|
||||||
|
1. Human changes status to `done`
|
||||||
|
2. Human adds `completed: <date>` to frontmatter
|
||||||
|
3. Agent deletes the `## Agent Working Notes` section
|
||||||
|
4. Agent creates PR with issue number in title: `feat(#023): Add delete account button`
|
||||||
|
5. Agent commits any remaining changes
|
||||||
|
6. Agent notifies human PR is ready
|
||||||
|
7. Human reviews PR and merges (or agent merges if approved)
|
||||||
|
|
||||||
|
### PR Requirements
|
||||||
|
|
||||||
|
- Title includes issue number: `feat(#023): ...`, `fix(#042): ...`
|
||||||
|
- PR description links to the issue file
|
||||||
|
- All checks pass (including pre-commit hook)
|
||||||
|
|
||||||
|
### Exit Gate
|
||||||
|
|
||||||
|
Issue closed. PR merged. Issue file has:
|
||||||
|
- status: done
|
||||||
|
- completed: <date>
|
||||||
|
- Agent Working Notes section deleted
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dependency Handling
|
||||||
|
|
||||||
|
### Creating Dependent Issues
|
||||||
|
|
||||||
|
When creating an issue that depends on another:
|
||||||
|
1. List the dependency in `depends-on` frontmatter
|
||||||
|
2. Read the dependency's issue file
|
||||||
|
3. Understand what the dependency produces
|
||||||
|
4. In your Plan, reference the dependency's output
|
||||||
|
|
||||||
|
### Working on Dependent Issues
|
||||||
|
|
||||||
|
Before starting:
|
||||||
|
1. Read the dependency's issue file
|
||||||
|
2. Read the dependency's code output (PR, files changed)
|
||||||
|
3. Verify the dependency works in context
|
||||||
|
|
||||||
|
During:
|
||||||
|
4. If dependency breaks, document it in Blockers
|
||||||
|
5. Do not assume dependency is correct
|
||||||
|
|
||||||
|
Before claiming done:
|
||||||
|
6. Verify your work with the dependency's output
|
||||||
|
7. If integration breaks, fix or document
|
||||||
|
|
||||||
|
### Blocking Issues
|
||||||
|
|
||||||
|
If an issue is blocked by a dependency:
|
||||||
|
- Set status to `blocked`
|
||||||
|
- Add a note explaining why
|
||||||
|
- Move to the next unblocked issue
|
||||||
|
- Check back when the dependency is closed
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Parallel Work
|
||||||
|
|
||||||
|
Multiple agents can work on multiple issues simultaneously if:
|
||||||
|
1. Issues are not dependent on each other
|
||||||
|
2. Each agent reads the other's issues (to understand integration points)
|
||||||
|
3. Each agent documents integration points checked
|
||||||
|
|
||||||
|
If issues ARE dependent:
|
||||||
|
- Complete the dependency first (or mark it as priority)
|
||||||
|
- Or coordinate with the human on timing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Handling Scope Creep
|
||||||
|
|
||||||
|
If during implementation you discover the issue needs more than originally scoped:
|
||||||
|
|
||||||
|
1. **Stop coding**
|
||||||
|
2. Document what was found in Status Log
|
||||||
|
3. Write a proposed scope change in Status Log
|
||||||
|
4. Mark it: "Scope change: waiting for approval"
|
||||||
|
5. **Wait for human decision**
|
||||||
|
6. Either:
|
||||||
|
- Human approves scope expansion
|
||||||
|
- Human creates a new issue for the expanded scope
|
||||||
|
- Human decides scope stays the same
|
||||||
|
|
||||||
|
Do NOT unilaterally expand scope. Do NOT ignore the scope change.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
| Situation | Action |
|
||||||
|
|---|---|
|
||||||
|
| Blocker encountered | Write in Blockers with proposed solution. Wait. |
|
||||||
|
| Dependency broken | Document in Blockers. Wait for fix or guidance. |
|
||||||
|
| Scope needs to expand | Stop. Document. Wait for approval. |
|
||||||
|
| Can't verify something | Document what couldn't be verified and why. Ask for guidance. |
|
||||||
|
| Human doesn't respond | Send a reminder. Do not proceed without acknowledgment. |
|
||||||
|
| Pre-commit hook fails | Fix the issue file. Do not bypass the hook. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## When in Doubt
|
||||||
|
|
||||||
|
Ask. Write in the issue file. Wait for response. Proceed only when you have acknowledgment.
|
||||||
|
|
||||||
|
It is better to pause and ask than to assume and break things.
|
||||||
14
package.json
Normal file
14
package.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "workflow-template",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Standard issue-based workflow template for teams",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"setup": "node .hooks/issue-linter.js --setup",
|
||||||
|
"validate:issues": "node .hooks/issue-linter.js",
|
||||||
|
"test": "echo \"Add your test commands here\""
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"pre-commit-hook": "^3.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user