organic-growth 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/bin/cli.mjs +175 -0
- package/package.json +28 -0
- package/templates/.claude/CLAUDE.md +115 -0
- package/templates/.claude/agents/gardener.md +132 -0
- package/templates/.claude/commands/grow.md +11 -0
- package/templates/.claude/commands/next.md +12 -0
- package/templates/.claude/commands/replan.md +10 -0
- package/templates/.claude/commands/review.md +64 -0
- package/templates/.claude/commands/seed.md +44 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 lab71.tech
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# 🌱 Organic Growth
|
|
2
|
+
|
|
3
|
+
[](https://github.com/lab71tech/organic-growth/actions/workflows/test.yml) [](https://github.com/lab71tech/organic-growth/releases)
|
|
4
|
+
|
|
5
|
+
Claude Code setup for incremental software development.
|
|
6
|
+
|
|
7
|
+
Grow features in natural stages, where each stage delivers a complete, working system.
|
|
8
|
+
|
|
9
|
+
Inspired by Alistair Cockburn’s Elephant Carpaccio and the idea that projects grow like plants, rather than being sliced from a finished whole.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# In your project directory:
|
|
15
|
+
bunx organic-growth
|
|
16
|
+
|
|
17
|
+
# Or with npx:
|
|
18
|
+
npx organic-growth
|
|
19
|
+
|
|
20
|
+
# With a product DNA document:
|
|
21
|
+
bunx organic-growth docs/my-product-spec.md
|
|
22
|
+
|
|
23
|
+
# Force overwrite existing files:
|
|
24
|
+
bunx organic-growth --force
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This copies the `.claude/` configuration into your project. No runtime dependencies.
|
|
28
|
+
|
|
29
|
+
## What You Get
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
.claude/
|
|
33
|
+
├── CLAUDE.md # Project context template + growth philosophy
|
|
34
|
+
├── agents/
|
|
35
|
+
│ └── gardener.md # Plans, implements, and validates growth stages
|
|
36
|
+
└── commands/
|
|
37
|
+
├── seed.md # /seed — bootstrap new project
|
|
38
|
+
├── grow.md # /grow — plan a new feature
|
|
39
|
+
├── next.md # /next — implement next stage
|
|
40
|
+
├── replan.md # /replan — adjust when things change
|
|
41
|
+
└── review.md # /review — deep quality review
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Workflow
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# 1. Bootstrap (new project)
|
|
48
|
+
> /seed # interview mode
|
|
49
|
+
> /seed docs/product-dna.md # from existing product document
|
|
50
|
+
|
|
51
|
+
# 2. Grow features
|
|
52
|
+
> /grow Add user authentication
|
|
53
|
+
> /next # stage 1
|
|
54
|
+
> /next # stage 2
|
|
55
|
+
> /next # stage 3
|
|
56
|
+
> /clear # fresh session every 3 stages
|
|
57
|
+
> /review 3 # quality check
|
|
58
|
+
> /next # continue
|
|
59
|
+
|
|
60
|
+
# 3. When reality changes
|
|
61
|
+
> /replan We need to support SSO instead of basic auth
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Philosophy
|
|
65
|
+
|
|
66
|
+
- **One stage = one intent = one test = one commit**
|
|
67
|
+
- **Rolling plan:** 3-5 stages ahead, re-evaluate every 3
|
|
68
|
+
- **Two-layer quality:** deterministic tools after every stage, LLM review on demand
|
|
69
|
+
- **Context hygiene:** fresh session every 3 stages
|
|
70
|
+
- **Product context required:** fill in CLAUDE.md or provide a DNA document
|
|
71
|
+
|
|
72
|
+
## After Install
|
|
73
|
+
|
|
74
|
+
1. Edit `.claude/CLAUDE.md` — fill in the Product section (or run `/seed`)
|
|
75
|
+
2. Fill in Quality Tools section with your project's lint/test commands
|
|
76
|
+
3. Start building with `/grow`
|
|
77
|
+
|
|
78
|
+
## Releases
|
|
79
|
+
|
|
80
|
+
Releases are triggered manually via the [Release](.github/workflows/release.yml) workflow. When triggered, it:
|
|
81
|
+
|
|
82
|
+
1. Checks for meaningful commits since the last `v*` tag
|
|
83
|
+
2. Bumps the version in `package.json`
|
|
84
|
+
3. Commits the version bump and pushes a new `v*` tag
|
|
85
|
+
4. Creates a GitHub Release with auto-generated release notes
|
|
86
|
+
|
|
87
|
+
The [Publish to npm](.github/workflows/publish.yml) workflow triggers on any `v*` tag push and publishes to npm automatically. The full pipeline is: **manual trigger -> version bump -> tag -> GitHub Release -> npm publish**.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Patch release (default — bug fixes, small changes)
|
|
91
|
+
gh workflow run Release
|
|
92
|
+
|
|
93
|
+
# Minor release (new features, backwards-compatible)
|
|
94
|
+
gh workflow run Release -f bump=minor
|
|
95
|
+
|
|
96
|
+
# Major release (breaking changes)
|
|
97
|
+
gh workflow run Release -f bump=major
|
|
98
|
+
|
|
99
|
+
# Dry run — preview what would be released without making changes
|
|
100
|
+
gh workflow run Release -f dry-run=true
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Or use the "Run workflow" button on the Actions tab in GitHub.
|
|
104
|
+
|
|
105
|
+
| Input | Type | Default | Description |
|
|
106
|
+
|-------|------|---------|-------------|
|
|
107
|
+
| `bump` | choice: `patch`, `minor`, `major` | `patch` | Version bump type |
|
|
108
|
+
| `dry-run` | boolean | `false` | When `true`, calculates the version and shows a summary but skips the commit, tag, and release |
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT
|
package/bin/cli.mjs
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { existsSync, mkdirSync, copyFileSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
4
|
+
import { join, dirname, relative } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { createInterface } from 'readline';
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const TEMPLATES_DIR = join(__dirname, '..', 'templates');
|
|
11
|
+
const TARGET_DIR = process.cwd();
|
|
12
|
+
|
|
13
|
+
const RESET = '\x1b[0m';
|
|
14
|
+
const GREEN = '\x1b[32m';
|
|
15
|
+
const YELLOW = '\x1b[33m';
|
|
16
|
+
const CYAN = '\x1b[36m';
|
|
17
|
+
const DIM = '\x1b[2m';
|
|
18
|
+
|
|
19
|
+
function log(msg) { console.log(msg); }
|
|
20
|
+
function success(msg) { log(`${GREEN}✓${RESET} ${msg}`); }
|
|
21
|
+
function warn(msg) { log(`${YELLOW}!${RESET} ${msg}`); }
|
|
22
|
+
function info(msg) { log(`${CYAN}→${RESET} ${msg}`); }
|
|
23
|
+
|
|
24
|
+
async function ask(question) {
|
|
25
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
26
|
+
return new Promise(resolve => {
|
|
27
|
+
rl.question(question, answer => {
|
|
28
|
+
rl.close();
|
|
29
|
+
resolve(answer.trim().toLowerCase());
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function getAllFiles(dir, base = dir) {
|
|
35
|
+
const files = [];
|
|
36
|
+
for (const entry of readdirSync(dir)) {
|
|
37
|
+
const full = join(dir, entry);
|
|
38
|
+
if (statSync(full).isDirectory()) {
|
|
39
|
+
files.push(...getAllFiles(full, base));
|
|
40
|
+
} else {
|
|
41
|
+
files.push(relative(base, full));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return files;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function readVersion() {
|
|
48
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
|
|
49
|
+
return pkg.version;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function printHelp() {
|
|
53
|
+
log('');
|
|
54
|
+
log(`${GREEN}🌱 Organic Growth${RESET} — Claude Code setup for incremental development`);
|
|
55
|
+
log('');
|
|
56
|
+
log(`${CYAN}Usage:${RESET}`);
|
|
57
|
+
log(` npx organic-growth [options] [dna-file.md]`);
|
|
58
|
+
log('');
|
|
59
|
+
log(`${CYAN}Options:${RESET}`);
|
|
60
|
+
log(` -f, --force Overwrite existing files without prompting`);
|
|
61
|
+
log(` -h, --help Show this help message`);
|
|
62
|
+
log(` -v, --version Show version number`);
|
|
63
|
+
log('');
|
|
64
|
+
log(`${CYAN}Arguments:${RESET}`);
|
|
65
|
+
log(` dna-file.md Path to a product DNA document to copy into docs/`);
|
|
66
|
+
log('');
|
|
67
|
+
log(`${CYAN}Examples:${RESET}`);
|
|
68
|
+
log(` npx organic-growth Install templates (prompts on conflicts)`);
|
|
69
|
+
log(` npx organic-growth --force Install templates (overwrite existing)`);
|
|
70
|
+
log(` npx organic-growth spec.md Install templates + copy DNA document`);
|
|
71
|
+
log('');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function install() {
|
|
75
|
+
const args = process.argv.slice(2);
|
|
76
|
+
|
|
77
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
78
|
+
printHelp();
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
83
|
+
log(readVersion());
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const force = args.includes('--force') || args.includes('-f');
|
|
88
|
+
const dna = args.find(a => !a.startsWith('-') && a.endsWith('.md'));
|
|
89
|
+
|
|
90
|
+
log('');
|
|
91
|
+
log(`${GREEN}🌱 Organic Growth${RESET} — Claude Code setup for incremental development`);
|
|
92
|
+
log('');
|
|
93
|
+
|
|
94
|
+
const files = getAllFiles(TEMPLATES_DIR);
|
|
95
|
+
const created = [];
|
|
96
|
+
const skipped = [];
|
|
97
|
+
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
const src = join(TEMPLATES_DIR, file);
|
|
100
|
+
const dest = join(TARGET_DIR, file);
|
|
101
|
+
const destDir = dirname(dest);
|
|
102
|
+
|
|
103
|
+
if (!existsSync(destDir)) {
|
|
104
|
+
mkdirSync(destDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (existsSync(dest) && !force) {
|
|
108
|
+
const answer = await ask(`${YELLOW}!${RESET} ${file} already exists. Overwrite? [y/N] `);
|
|
109
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
110
|
+
skipped.push(file);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
copyFileSync(src, dest);
|
|
116
|
+
created.push(file);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Create docs/growth/ directory
|
|
120
|
+
const growthDir = join(TARGET_DIR, 'docs', 'growth');
|
|
121
|
+
if (!existsSync(growthDir)) {
|
|
122
|
+
mkdirSync(growthDir, { recursive: true });
|
|
123
|
+
created.push('docs/growth/');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Handle DNA document
|
|
127
|
+
if (dna) {
|
|
128
|
+
const dnaSource = join(TARGET_DIR, dna);
|
|
129
|
+
if (existsSync(dnaSource)) {
|
|
130
|
+
const dnaDest = join(TARGET_DIR, 'docs', 'product-dna.md');
|
|
131
|
+
copyFileSync(dnaSource, dnaDest);
|
|
132
|
+
success(`Product DNA copied from ${dna}`);
|
|
133
|
+
} else {
|
|
134
|
+
warn(`DNA file not found: ${dna}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
log('');
|
|
139
|
+
if (created.length > 0) {
|
|
140
|
+
log(`${GREEN}Installed:${RESET}`);
|
|
141
|
+
for (const f of created) {
|
|
142
|
+
log(` ${DIM}${f}${RESET}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (skipped.length > 0) {
|
|
146
|
+
log(`${YELLOW}Skipped (already exist):${RESET}`);
|
|
147
|
+
for (const f of skipped) {
|
|
148
|
+
log(` ${DIM}${f}${RESET}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
log('');
|
|
153
|
+
log(`${GREEN}Done!${RESET} Next steps:`);
|
|
154
|
+
log('');
|
|
155
|
+
if (dna) {
|
|
156
|
+
info(`Run ${CYAN}/seed docs/product-dna.md${RESET} to bootstrap from your DNA document`);
|
|
157
|
+
} else {
|
|
158
|
+
info(`Run ${CYAN}/seed${RESET} to bootstrap a new project (interview mode)`);
|
|
159
|
+
info(`Or: ${CYAN}/seed path/to/product-doc.md${RESET} if you have a product document`);
|
|
160
|
+
}
|
|
161
|
+
info(`Edit ${CYAN}.claude/CLAUDE.md${RESET} to fill in your tech stack and quality tools`);
|
|
162
|
+
log('');
|
|
163
|
+
log(`${DIM}Commands available after setup:${RESET}`);
|
|
164
|
+
log(` ${CYAN}/seed${RESET} — bootstrap project (interview or DNA document)`);
|
|
165
|
+
log(` ${CYAN}/grow${RESET} — plan and start a new feature`);
|
|
166
|
+
log(` ${CYAN}/next${RESET} — implement the next growth stage`);
|
|
167
|
+
log(` ${CYAN}/replan${RESET} — re-evaluate when things change`);
|
|
168
|
+
log(` ${CYAN}/review${RESET} — deep quality review of recent stages`);
|
|
169
|
+
log('');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
install().catch(err => {
|
|
173
|
+
console.error('Error:', err.message);
|
|
174
|
+
process.exit(1);
|
|
175
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "organic-growth",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Claude Code setup for incremental software development — grow features in natural stages",
|
|
5
|
+
"bin": {
|
|
6
|
+
"organic-growth": "bin/cli.mjs"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"templates/"
|
|
11
|
+
],
|
|
12
|
+
"keywords": [
|
|
13
|
+
"claude-code",
|
|
14
|
+
"ai",
|
|
15
|
+
"agents",
|
|
16
|
+
"agile",
|
|
17
|
+
"incremental-development",
|
|
18
|
+
"elephant-carpaccio"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"test": "node --test"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/lab71tech/organic-growth"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Project Context
|
|
2
|
+
|
|
3
|
+
## Product (THE SEED — fill this in)
|
|
4
|
+
|
|
5
|
+
<!-- Without this section, the agent grows weeds. Be brief but specific. -->
|
|
6
|
+
<!-- If you have a full product document, put it in docs/product-dna.md -->
|
|
7
|
+
<!-- This section is the distilled version — what the agent sees always. -->
|
|
8
|
+
<!-- The DNA document is read only during planning (/grow, /replan). -->
|
|
9
|
+
|
|
10
|
+
**What:** [One sentence. What is this product?]
|
|
11
|
+
**For whom:** [Who uses it? What's their context?]
|
|
12
|
+
**Core problem:** [What pain does it solve?]
|
|
13
|
+
**Key domain concepts:** [3-7 terms that someone new needs to understand]
|
|
14
|
+
**Current state:** [Greenfield / MVP exists / Production system]
|
|
15
|
+
**Full DNA:** [docs/product-dna.md if exists, otherwise "N/A"]
|
|
16
|
+
|
|
17
|
+
## Tech Stack (THE SOIL — auto-discovered, but document the non-obvious)
|
|
18
|
+
|
|
19
|
+
<!-- Claude Code reads your build files. Only add what it CAN'T discover. -->
|
|
20
|
+
|
|
21
|
+
- [Any non-standard commands, e.g.: `./gradlew test --profile staging`]
|
|
22
|
+
- [Unusual conventions, e.g.: "endpoint names in Polish"]
|
|
23
|
+
- [Hard constraints, e.g.: "no Lombok", "Flyway not Liquibase"]
|
|
24
|
+
|
|
25
|
+
### Quality tools (fill in for your project)
|
|
26
|
+
|
|
27
|
+
<!-- Gardener runs these after every stage. List the exact commands. -->
|
|
28
|
+
|
|
29
|
+
- **Build:** [e.g.: `./gradlew build` or `npm run build`]
|
|
30
|
+
- **Lint:** [e.g.: `./gradlew ktlintCheck` or `npm run lint`]
|
|
31
|
+
- **Type check:** [e.g.: `tsc --noEmit` or N/A for dynamic languages]
|
|
32
|
+
- **Test:** [e.g.: `./gradlew test` or `npm test`]
|
|
33
|
+
- **Smoke:** [e.g.: `curl http://localhost:8080/health` or `npm run dev` + check]
|
|
34
|
+
|
|
35
|
+
## Priorities (LIGHT & WATER — what matters now)
|
|
36
|
+
|
|
37
|
+
<!-- This changes. Update it when priorities shift. -->
|
|
38
|
+
|
|
39
|
+
- [e.g.: "MVP speed over production polish"]
|
|
40
|
+
- [e.g.: "Must work offline first"]
|
|
41
|
+
- [e.g.: "Security is non-negotiable, even for MVP"]
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# Development Philosophy: Organic Growth
|
|
46
|
+
|
|
47
|
+
Every feature is grown in stages from seed to maturity.
|
|
48
|
+
Each stage produces a complete, working system — not a partial one.
|
|
49
|
+
A seedling is a whole plant, not 10% of a tree.
|
|
50
|
+
|
|
51
|
+
## Growth Rules
|
|
52
|
+
|
|
53
|
+
1. **One stage = one intent = one test = one commit**
|
|
54
|
+
- Each stage has a single purpose
|
|
55
|
+
- Each stage has at least one test proving it works
|
|
56
|
+
- Each stage is committed separately with a clear message
|
|
57
|
+
- The app builds, tests pass, and runs after every stage
|
|
58
|
+
|
|
59
|
+
2. **Rolling plan: 3-5 stages ahead**
|
|
60
|
+
- Never plan more than 5 concrete stages ahead
|
|
61
|
+
- Keep a rough outline of what comes after, but expect it to change
|
|
62
|
+
- Re-evaluate the plan every 3 stages or when something unexpected happens
|
|
63
|
+
- Update `docs/growth/<feature>.md` after every stage
|
|
64
|
+
|
|
65
|
+
3. **Vertical, not horizontal**
|
|
66
|
+
- Each stage touches all layers needed (API + service + DB + test)
|
|
67
|
+
- No "build all the backend first, then the frontend"
|
|
68
|
+
- Early stages can return hardcoded values — that's natural
|
|
69
|
+
- Growth: hardcoded → configurable → dynamic → optimized
|
|
70
|
+
|
|
71
|
+
4. **Context hygiene**
|
|
72
|
+
- Start a fresh session every 3 stages
|
|
73
|
+
- The growth plan in `docs/growth/` is the continuity mechanism
|
|
74
|
+
- After `/clear`, run `/next` — the agent reads the plan and continues
|
|
75
|
+
|
|
76
|
+
5. **Quality gate after every stage**
|
|
77
|
+
- Build must pass
|
|
78
|
+
- Linter must pass (zero new warnings)
|
|
79
|
+
- Type check must pass (if applicable)
|
|
80
|
+
- ALL tests must pass (not just new ones)
|
|
81
|
+
- App must start (health check / smoke test)
|
|
82
|
+
- Fix all failures within the stage — don't carry debt forward
|
|
83
|
+
|
|
84
|
+
6. **Deep review on demand**
|
|
85
|
+
- Run `/review` after every 3-5 stages or before merging
|
|
86
|
+
- Reviews run with fresh context (no implementation bias)
|
|
87
|
+
- Check: correctness, consistency, simplicity, security, test quality
|
|
88
|
+
- Fix 🔴 issues before continuing growth
|
|
89
|
+
|
|
90
|
+
## Growth Stage Patterns
|
|
91
|
+
|
|
92
|
+
For **greenfield** projects, first stages always follow this pattern:
|
|
93
|
+
1. Empty project with passing build
|
|
94
|
+
2. Hello World endpoint/page (proves the stack works end-to-end)
|
|
95
|
+
3. First real domain concept with hardcoded data
|
|
96
|
+
4. Persistence (database, migration, repository)
|
|
97
|
+
5. First real behavior with real data
|
|
98
|
+
|
|
99
|
+
For **existing** projects, first stages are:
|
|
100
|
+
1. The simplest possible version of the new behavior (even hardcoded)
|
|
101
|
+
2. Connect it to existing data/services
|
|
102
|
+
3. Add the real logic incrementally
|
|
103
|
+
|
|
104
|
+
## Commit Convention
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
feat(scope): stage N — <what grew>
|
|
108
|
+
|
|
109
|
+
Growth plan: docs/growth/<feature>.md
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Growth Plan Location
|
|
113
|
+
|
|
114
|
+
All plans live in `docs/growth/<feature-name>.md`.
|
|
115
|
+
Format documented in the gardener agent.
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gardener
|
|
3
|
+
description: Plans and implements features as organic growth stages.
|
|
4
|
+
Automatically invoked for incremental feature development.
|
|
5
|
+
Reads product context from CLAUDE.md, manages rolling growth plans,
|
|
6
|
+
implements one stage at a time, and self-validates.
|
|
7
|
+
tools:
|
|
8
|
+
- Read
|
|
9
|
+
- Write
|
|
10
|
+
- Edit
|
|
11
|
+
- Bash
|
|
12
|
+
- Grep
|
|
13
|
+
- Glob
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
You are a software gardener. You grow features in natural stages —
|
|
17
|
+
each stage produces a complete, living system.
|
|
18
|
+
|
|
19
|
+
# How You Work
|
|
20
|
+
|
|
21
|
+
You have three modes, determined by what you're asked to do:
|
|
22
|
+
|
|
23
|
+
## Mode: PLAN (invoked by /grow)
|
|
24
|
+
|
|
25
|
+
0. Read CLAUDE.md — check if the Product section is filled in.
|
|
26
|
+
If it contains placeholders like "[One sentence..." or is empty:
|
|
27
|
+
STOP. Tell the user: "No product context yet. Run /seed first
|
|
28
|
+
to plant the seed, or tell me about the project and I'll fill
|
|
29
|
+
it in now." If the user describes the project, fill in the
|
|
30
|
+
Product/Tech Stack/Priorities sections before continuing.
|
|
31
|
+
1. Read CLAUDE.md to understand the product (seed), stack (soil),
|
|
32
|
+
and priorities (light & water)
|
|
33
|
+
2. Check if `docs/product-dna.md` exists. If yes, read it —
|
|
34
|
+
it contains the full domain knowledge, business rules, and
|
|
35
|
+
invariants. Use it to make informed planning decisions.
|
|
36
|
+
If no, CLAUDE.md Product section is sufficient.
|
|
37
|
+
3. Explore the codebase to understand current state
|
|
38
|
+
4. Ask the user 2-3 clarifying questions — no more.
|
|
39
|
+
Focus on: acceptance criteria, constraints, riskiest part.
|
|
40
|
+
4. Create a growth plan in `docs/growth/<feature-name>.md`:
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
# Feature: <name>
|
|
44
|
+
Created: <date>
|
|
45
|
+
Status: 🌱 Growing
|
|
46
|
+
|
|
47
|
+
## Seed (what & why)
|
|
48
|
+
<one paragraph: what this feature does and why it matters>
|
|
49
|
+
|
|
50
|
+
## Growth Stages
|
|
51
|
+
|
|
52
|
+
### Concrete (next 3-5 stages, detailed)
|
|
53
|
+
- ⬜ Stage 1: <description>
|
|
54
|
+
- Intent: <what this achieves>
|
|
55
|
+
- Verify: <how to check it works>
|
|
56
|
+
- Touches: <which areas of the code>
|
|
57
|
+
|
|
58
|
+
- ⬜ Stage 2: ...
|
|
59
|
+
|
|
60
|
+
### Horizon (rough outline of what comes after)
|
|
61
|
+
- <rough stage description>
|
|
62
|
+
- <rough stage description>
|
|
63
|
+
- ...
|
|
64
|
+
|
|
65
|
+
## Growth Log
|
|
66
|
+
<!-- Auto-updated after each stage -->
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Planning Principles
|
|
70
|
+
- First stage is always the simplest possible thing that proves
|
|
71
|
+
the idea works end-to-end (even with hardcoded values)
|
|
72
|
+
- Order by: risk reduction first, then user value
|
|
73
|
+
- Each stage must be vertical (touch all necessary layers)
|
|
74
|
+
- If a stage feels bigger than "one intent" — split it
|
|
75
|
+
- For greenfield: follow the greenfield pattern from CLAUDE.md
|
|
76
|
+
|
|
77
|
+
## Mode: GROW (invoked by /next)
|
|
78
|
+
|
|
79
|
+
1. Read the growth plan from `docs/growth/`
|
|
80
|
+
2. Find the next ⬜ stage
|
|
81
|
+
3. Check the stage counter:
|
|
82
|
+
- If this is stage 3, 6, 9... → re-evaluate the plan first
|
|
83
|
+
(are remaining stages still correct? adjust if needed)
|
|
84
|
+
4. Implement ONLY this stage:
|
|
85
|
+
a. Write the code
|
|
86
|
+
b. Write/update at least one test
|
|
87
|
+
c. Quality gate — run ALL checks, fix before proceeding:
|
|
88
|
+
- Build: verify it compiles (`./gradlew build`, `npm run build`, etc.)
|
|
89
|
+
- Lint: run the project linter (`./gradlew ktlintCheck`, `npm run lint`, etc.)
|
|
90
|
+
- Type check: if applicable (`tsc --noEmit`, strict mode, etc.)
|
|
91
|
+
- Tests: ALL tests pass, not just new ones
|
|
92
|
+
- Smoke: app starts, health endpoint responds (or equivalent)
|
|
93
|
+
d. If any check fails — fix it within this stage, don't leave it
|
|
94
|
+
for the next one. Quality debt doesn't carry forward.
|
|
95
|
+
5. Self-review (quick, not a full code review):
|
|
96
|
+
- Is this stage vertical? (touches all needed layers)
|
|
97
|
+
- Did I only implement ONE intent?
|
|
98
|
+
- Did I smuggle in work from future stages?
|
|
99
|
+
- If I failed any check → fix before proceeding
|
|
100
|
+
6. Update the growth plan:
|
|
101
|
+
- Mark stage as ✅ with brief note of what was done
|
|
102
|
+
- Add entry to Growth Log with date
|
|
103
|
+
- If this was a re-evaluation point, update upcoming stages
|
|
104
|
+
7. Commit: `feat(scope): stage N — <what grew>`
|
|
105
|
+
8. Report:
|
|
106
|
+
- What grew
|
|
107
|
+
- What's next
|
|
108
|
+
- Progress: "Stage 4/~12 — 🌱🌱🌱🌱⬜⬜⬜⬜..."
|
|
109
|
+
- If stage counter is multiple of 3: recommend `/clear` + new session
|
|
110
|
+
|
|
111
|
+
## Mode: REPLAN (invoked by /replan)
|
|
112
|
+
|
|
113
|
+
1. Read the current growth plan
|
|
114
|
+
2. Read the user's reason for replanning
|
|
115
|
+
3. If `docs/product-dna.md` exists, consult it — the reason for
|
|
116
|
+
replanning may relate to domain rules or business invariants
|
|
117
|
+
4. Assess current state: what's built, what works, what changed
|
|
118
|
+
5. Rewrite the Concrete stages (next 3-5) from current state
|
|
119
|
+
6. Update the Horizon section
|
|
120
|
+
7. Do NOT undo or modify completed stages
|
|
121
|
+
8. Report what changed and why
|
|
122
|
+
|
|
123
|
+
# Critical Rules
|
|
124
|
+
|
|
125
|
+
- NEVER implement more than one stage per /next invocation
|
|
126
|
+
- NEVER plan more than 5 concrete stages ahead
|
|
127
|
+
- ALWAYS run build + tests + smoke check before committing
|
|
128
|
+
- ALWAYS update the growth plan after each stage
|
|
129
|
+
- If a stage reveals the plan is wrong, STOP and replan before continuing
|
|
130
|
+
- Hardcoded values are natural in early stages — don't optimize prematurely
|
|
131
|
+
- The growth plan file is the source of truth, not your memory
|
|
132
|
+
- If you don't understand the domain, ASK — don't guess
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Plan and start growing a new feature from seed
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Grow a new feature using the Organic Growth approach.
|
|
6
|
+
|
|
7
|
+
1. Use the gardener agent in PLAN mode
|
|
8
|
+
2. Feature to grow: $ARGUMENTS
|
|
9
|
+
3. After the plan is created and approved, ask:
|
|
10
|
+
"Plan ready. Start growing stage 1?"
|
|
11
|
+
4. If yes, immediately proceed with GROW mode for stage 1
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Grow the next stage from the current growth plan
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Continue growing: implement the next stage from the active growth plan.
|
|
6
|
+
|
|
7
|
+
1. Find the active plan in docs/growth/
|
|
8
|
+
2. Use the gardener agent in GROW mode
|
|
9
|
+
3. If no plan exists, tell the user to run /grow first
|
|
10
|
+
4. If all stages are done, congratulate and suggest what might grow next
|
|
11
|
+
|
|
12
|
+
Feature filter (optional): $ARGUMENTS
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Re-evaluate the growth plan when reality changes
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Something changed. Re-evaluate the growth plan from current state.
|
|
6
|
+
|
|
7
|
+
1. Find the active plan in docs/growth/
|
|
8
|
+
2. Use the gardener agent in REPLAN mode
|
|
9
|
+
3. Reason for replanning: $ARGUMENTS
|
|
10
|
+
4. If no reason given, ask: "What changed?"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Deep quality review of recent growth stages (fresh context, no implementation bias)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Review code quality of recent stages. Run this after several stages
|
|
6
|
+
or before merging — it provides a second opinion with zero bias from
|
|
7
|
+
the implementation session.
|
|
8
|
+
|
|
9
|
+
1. Determine scope:
|
|
10
|
+
- If $ARGUMENTS contains a number (e.g., `/review 3`): review last N stages
|
|
11
|
+
- If $ARGUMENTS contains a feature name: review that feature's stages
|
|
12
|
+
- Default: review all stages since last review (or last 5, whichever is smaller)
|
|
13
|
+
|
|
14
|
+
2. Read the growth plan to understand intent of each reviewed stage.
|
|
15
|
+
|
|
16
|
+
3. For each stage in scope, examine the git diff and review for:
|
|
17
|
+
|
|
18
|
+
**Correctness:**
|
|
19
|
+
- Does the code actually do what the stage intended?
|
|
20
|
+
- Are there logic errors, off-by-one, null cases?
|
|
21
|
+
- Do the tests test the right thing? (not just "test exists")
|
|
22
|
+
|
|
23
|
+
**Consistency:**
|
|
24
|
+
- Does new code follow the same patterns as existing code?
|
|
25
|
+
- Naming conventions, error handling style, project structure
|
|
26
|
+
- If `docs/product-dna.md` exists: do domain terms match?
|
|
27
|
+
|
|
28
|
+
**Simplicity:**
|
|
29
|
+
- Is anything over-engineered for the current stage?
|
|
30
|
+
- Code that belongs in future stages?
|
|
31
|
+
- Unnecessary abstractions or premature optimization?
|
|
32
|
+
|
|
33
|
+
**Security basics:**
|
|
34
|
+
- SQL injection, XSS, hardcoded secrets
|
|
35
|
+
- Auth/authz gaps if relevant
|
|
36
|
+
- Input validation
|
|
37
|
+
|
|
38
|
+
**Test quality:**
|
|
39
|
+
- Do tests break if the feature is removed? (vs always-green tests)
|
|
40
|
+
- Are edge cases covered?
|
|
41
|
+
- Test readability — can someone understand intent from the test?
|
|
42
|
+
|
|
43
|
+
4. Output a review report:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
## Review: <feature> — stages N-M
|
|
47
|
+
|
|
48
|
+
### 🟢 Good
|
|
49
|
+
- <what's well done — be specific>
|
|
50
|
+
|
|
51
|
+
### 🟡 Suggestions
|
|
52
|
+
- <improvements, not blockers>
|
|
53
|
+
- <file:line — what to consider>
|
|
54
|
+
|
|
55
|
+
### 🔴 Issues
|
|
56
|
+
- <things that should be fixed before continuing>
|
|
57
|
+
- <file:line — what's wrong and why>
|
|
58
|
+
|
|
59
|
+
### Verdict: ✅ Continue / ⚠️ Fix before next stage / 🔴 Stop and address
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
5. If there are 🔴 Issues, offer to fix them now.
|
|
63
|
+
|
|
64
|
+
Scope: $ARGUMENTS
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Bootstrap a new project — from DNA document or interview
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Plant the seed for a new project.
|
|
6
|
+
|
|
7
|
+
1. Check if a product DNA document was provided (as $ARGUMENTS path or attachment).
|
|
8
|
+
Also check if `docs/product-dna.md` already exists.
|
|
9
|
+
|
|
10
|
+
**Path A — DNA exists:**
|
|
11
|
+
- Read the document
|
|
12
|
+
- Distill it into CLAUDE.md Product section (~10 lines: what, for whom,
|
|
13
|
+
core problem, key domain concepts, current state)
|
|
14
|
+
- Copy/move the full document to `docs/product-dna.md` if not already there
|
|
15
|
+
- Confirm with the user: "Here's what I extracted. Anything to adjust?"
|
|
16
|
+
|
|
17
|
+
**Path B — No DNA:**
|
|
18
|
+
- Interview the user. Ask these questions ONE AT A TIME:
|
|
19
|
+
- What are you building? (one sentence)
|
|
20
|
+
- Who is it for? What's their context?
|
|
21
|
+
- What core problem does it solve?
|
|
22
|
+
- What tech stack do you want? (or: should I suggest one?)
|
|
23
|
+
- Any hard constraints? (hosting, budget, compliance, language)
|
|
24
|
+
- What's the priority: speed to MVP, production quality, or learning?
|
|
25
|
+
- Fill in CLAUDE.md Product section from answers
|
|
26
|
+
|
|
27
|
+
2. In both paths, also fill in:
|
|
28
|
+
- Tech Stack (THE SOIL): from DNA or interview + scan of existing project files
|
|
29
|
+
- Priorities (LIGHT & WATER): from DNA or interview
|
|
30
|
+
|
|
31
|
+
3. Check if CLAUDE.md already has a filled Product section.
|
|
32
|
+
If yes, ask: "Product context already exists. Overwrite or update?"
|
|
33
|
+
|
|
34
|
+
4. Generate `docs/growth/project-bootstrap.md` — the first growth plan:
|
|
35
|
+
- Stage 1: Initialize project (build tool, dependencies, empty build passes)
|
|
36
|
+
- Stage 2: Hello World endpoint/page (proves stack works end-to-end)
|
|
37
|
+
- Stage 3: First domain concept with hardcoded data
|
|
38
|
+
- Stage 4: Persistence (database, migration, first real data)
|
|
39
|
+
- Stage 5: First real behavior with real data
|
|
40
|
+
Adjust these based on the specific stack and domain from DNA/interview.
|
|
41
|
+
|
|
42
|
+
5. Ask: "Seed planted. Start growing stage 1?"
|
|
43
|
+
|
|
44
|
+
Input: $ARGUMENTS
|