farmwork 1.0.1 → 1.1.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/README.md +40 -28
- package/package.json +2 -2
- package/src/init.js +415 -238
package/README.md
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
<img src="/init.png" alt="Farmwork - Developer Methodology" width="500" />
|
|
2
2
|
|
|
3
|
-
# FARMWORK
|
|
4
|
-
|
|
5
3
|
> A workflow framework for Claude Code by Wynter Jones
|
|
6
4
|
|
|
7
|
-
...because building software should feel like tending a well-organized farm.
|
|
8
|
-
|
|
9
5
|
## Quick Start
|
|
10
6
|
|
|
11
7
|
```bash
|
|
@@ -34,20 +30,20 @@ npx farmwork init
|
|
|
34
30
|
1. **FARMHOUSE.md** - Central command for tracking framework metrics
|
|
35
31
|
2. **Phrase Commands** - Natural language triggers for workflows
|
|
36
32
|
3. **Agents** - Specialized AI subagents for specific tasks
|
|
37
|
-
4. **
|
|
38
|
-
5. **
|
|
39
|
-
6. **
|
|
33
|
+
4. **Autonomously Issue Tracking** - Using beads (`bd`) for full visibility
|
|
34
|
+
5. **Living Audits** - Documents that track ongoing concerns
|
|
35
|
+
6. **Plan & Implement** - You describe the outcome, the rest is handled, tracked and audited
|
|
36
|
+
7. **Idea Garden & Compost** - Pre-plan creative stage for nurturing ideas or archiving rejected ones
|
|
40
37
|
|
|
41
38
|
### Phrase Commands
|
|
42
39
|
|
|
43
40
|
**Farmwork Phrases** (Development Workflow):
|
|
44
41
|
| Phrase | Action |
|
|
45
42
|
|--------|--------|
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `go to market` | i18n translation check |
|
|
49
|
-
| `
|
|
50
|
-
| `open the farm` | Full audit cycle, then ask to proceed |
|
|
43
|
+
| `open the farm` | Audit systems, update FARMHOUSE.md metrics |
|
|
44
|
+
| `count the herd` | Full inspection and audit |
|
|
45
|
+
| `go to market` | i18n translation check + accessibility audit |
|
|
46
|
+
| `close the farm` | Full push workflow (lint, test, build, commit, push) |
|
|
51
47
|
|
|
52
48
|
**Plan Phrases**:
|
|
53
49
|
| Phrase | Action |
|
|
@@ -55,16 +51,22 @@ npx farmwork init
|
|
|
55
51
|
| `make a plan for...` | Create implementation plan in `_PLANS/` |
|
|
56
52
|
| `let's implement...` | Execute plan with issue tracking |
|
|
57
53
|
|
|
54
|
+
**Idea Phrases** (Pre-Plan Stage):
|
|
55
|
+
| Phrase | Action |
|
|
56
|
+
|--------|--------|
|
|
57
|
+
| `I have an idea for...` | Add new idea to `_AUDIT/GARDEN.md` |
|
|
58
|
+
| `let's plan this idea...` | Graduate idea from GARDEN → create plan |
|
|
59
|
+
| `compost this...` | Move rejected idea to `_AUDIT/COMPOST.md` |
|
|
60
|
+
|
|
58
61
|
### Slash Commands
|
|
59
62
|
|
|
60
63
|
| Command | Description |
|
|
61
64
|
|---------|-------------|
|
|
62
|
-
| `/push` |
|
|
63
|
-
| `/open-the-farm` | Full audit cycle with summary report |
|
|
65
|
+
| `/push` | Clean, stage, lint, test, build, commit, push, update metrics (11 steps) |
|
|
64
66
|
|
|
65
67
|
### Agents
|
|
66
68
|
|
|
67
|
-
|
|
69
|
+
11 specialized agents included:
|
|
68
70
|
|
|
69
71
|
| Agent | Purpose |
|
|
70
72
|
|-------|---------|
|
|
@@ -73,18 +75,22 @@ npx farmwork init
|
|
|
73
75
|
| `security-auditor` | OWASP vulnerability scanning |
|
|
74
76
|
| `performance-auditor` | Memory leaks, re-renders, anti-patterns |
|
|
75
77
|
| `code-smell-auditor` | DRY violations, complexity, naming |
|
|
78
|
+
| `accessibility-auditor` | WCAG 2.1 compliance, alt text, contrast |
|
|
76
79
|
| `unused-code-cleaner` | Detect and remove dead code |
|
|
77
80
|
| `code-cleaner` | Remove comments and console.logs |
|
|
78
81
|
| `i18n-locale-translator` | Translate UI text to locales |
|
|
79
82
|
| `storybook-maintainer` | Create/update Storybook stories |
|
|
83
|
+
| `idea-gardener` | Manage Idea Garden and Compost |
|
|
80
84
|
|
|
81
85
|
### Recommended Workflow
|
|
82
86
|
|
|
83
|
-
1. **Start Session**: Run `
|
|
87
|
+
1. **Start Session**: Run `open the farm` to audit current state
|
|
84
88
|
2. **Plan Work**: Use `make a plan for...` for new features
|
|
85
89
|
3. **Implement**: Use `let's implement...` to execute with tracking
|
|
86
|
-
4. **Quality Check**: Run `
|
|
87
|
-
5. **Ship**: Run `
|
|
90
|
+
4. **Quality Check**: Run `count the herd` for full audit + dry run
|
|
91
|
+
5. **Ship**: Run `close the farm` or `/push` to push changes
|
|
92
|
+
|
|
93
|
+
You can `go to market` when you have a production-ready app with international users.
|
|
88
94
|
|
|
89
95
|
## Directory Structure
|
|
90
96
|
|
|
@@ -92,25 +98,29 @@ npx farmwork init
|
|
|
92
98
|
your-project/
|
|
93
99
|
├── CLAUDE.md # Main instructions & phrase commands
|
|
94
100
|
├── .claude/ # Claude Code configuration
|
|
95
|
-
│ ├── agents/ #
|
|
101
|
+
│ ├── agents/ # 11 specialized subagents
|
|
96
102
|
│ │ ├── the-farmer.md
|
|
97
103
|
│ │ ├── code-reviewer.md
|
|
98
104
|
│ │ ├── security-auditor.md
|
|
99
105
|
│ │ ├── performance-auditor.md
|
|
100
106
|
│ │ ├── code-smell-auditor.md
|
|
107
|
+
│ │ ├── accessibility-auditor.md
|
|
101
108
|
│ │ ├── unused-code-cleaner.md
|
|
102
109
|
│ │ ├── code-cleaner.md
|
|
103
110
|
│ │ ├── i18n-locale-translator.md
|
|
104
|
-
│ │
|
|
111
|
+
│ │ ├── storybook-maintainer.md
|
|
112
|
+
│ │ └── idea-gardener.md
|
|
105
113
|
│ └── commands/ # User-invocable skills
|
|
106
|
-
│
|
|
107
|
-
│ └── open-the-farm.md
|
|
114
|
+
│ └── push.md
|
|
108
115
|
├── _AUDIT/ # Living audit documents
|
|
109
116
|
│ ├── FARMHOUSE.md # Framework command center
|
|
110
117
|
│ ├── SECURITY.md # Security posture
|
|
111
118
|
│ ├── PERFORMANCE.md # Performance metrics
|
|
119
|
+
│ ├── ACCESSIBILITY.md # WCAG 2.1 compliance
|
|
112
120
|
│ ├── CODE_QUALITY.md # Code quality tracking
|
|
113
|
-
│
|
|
121
|
+
│ ├── TESTS.md # Test coverage
|
|
122
|
+
│ ├── GARDEN.md # Idea nursery (pre-plan stage)
|
|
123
|
+
│ └── COMPOST.md # Rejected ideas archive
|
|
114
124
|
├── _PLANS/ # Implementation plans
|
|
115
125
|
│ └── FEATURE_NAME.md
|
|
116
126
|
├── .beads/ # Issue tracking
|
|
@@ -142,15 +152,17 @@ If you enable Storybook (for React/Vue projects), the wizard will also ask for:
|
|
|
142
152
|
**Creates:**
|
|
143
153
|
- `CLAUDE.md` - Main instructions and phrase commands
|
|
144
154
|
- `.claude/` - Claude Code configuration directory
|
|
145
|
-
- `
|
|
146
|
-
- `
|
|
147
|
-
- `commands/` - 2 user-invocable skills
|
|
155
|
+
- `agents/` - 11 specialized subagents
|
|
156
|
+
- `commands/` - 1 user-invocable skill (/push)
|
|
148
157
|
- `_AUDIT/` - Living audit documents
|
|
149
158
|
- `FARMHOUSE.md` - Framework command center
|
|
150
159
|
- `SECURITY.md` - Security posture tracking
|
|
151
160
|
- `PERFORMANCE.md` - Performance metrics
|
|
161
|
+
- `ACCESSIBILITY.md` - WCAG 2.1 compliance
|
|
152
162
|
- `CODE_QUALITY.md` - Code quality tracking
|
|
153
163
|
- `TESTS.md` - Test coverage tracking
|
|
164
|
+
- `GARDEN.md` - Idea nursery (pre-plan stage)
|
|
165
|
+
- `COMPOST.md` - Rejected ideas archive
|
|
154
166
|
- `_PLANS/` - Implementation plans directory
|
|
155
167
|
- `justfile` - Navigation and task commands
|
|
156
168
|
|
|
@@ -204,5 +216,5 @@ MIT
|
|
|
204
216
|
|
|
205
217
|
## Links
|
|
206
218
|
|
|
207
|
-
- [Farmwork
|
|
208
|
-
- [
|
|
219
|
+
- [Farmwork Website](https://farmwork.dev)
|
|
220
|
+
- [Wynter Jones](https://wynter.ai)
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "farmwork",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Farmwork -
|
|
5
|
+
"description": "Farmwork - A workflow framework for Claude Code by Wynter Jones",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"bin": {
|
|
8
8
|
"farmwork": "./bin/farmwork.js"
|
package/src/init.js
CHANGED
|
@@ -126,7 +126,8 @@ export async function init(options) {
|
|
|
126
126
|
const farmworkConfig = path.join(cwd, ".farmwork.json");
|
|
127
127
|
const claudeMd = path.join(cwd, "CLAUDE.md");
|
|
128
128
|
|
|
129
|
-
const isAlreadyInstalled =
|
|
129
|
+
const isAlreadyInstalled =
|
|
130
|
+
fs.existsSync(claudeDir) &&
|
|
130
131
|
(fs.existsSync(farmworkConfig) || fs.existsSync(claudeMd));
|
|
131
132
|
|
|
132
133
|
if (isAlreadyInstalled && !options.force) {
|
|
@@ -146,12 +147,15 @@ export async function init(options) {
|
|
|
146
147
|
name: "continueInit",
|
|
147
148
|
message: "What would you like to do?",
|
|
148
149
|
choices: [
|
|
149
|
-
{
|
|
150
|
+
{
|
|
151
|
+
name: "🐴 Re-initialize (will backup existing files)",
|
|
152
|
+
value: "reinit",
|
|
153
|
+
},
|
|
150
154
|
{ name: "🐮 Run doctor instead (check health)", value: "doctor" },
|
|
151
155
|
{ name: "🌾 Run status instead (view metrics)", value: "status" },
|
|
152
|
-
{ name: "🐔 Exit", value: "exit" }
|
|
153
|
-
]
|
|
154
|
-
}
|
|
156
|
+
{ name: "🐔 Exit", value: "exit" },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
155
159
|
]);
|
|
156
160
|
|
|
157
161
|
if (continueInit === "exit") {
|
|
@@ -179,7 +183,9 @@ export async function init(options) {
|
|
|
179
183
|
}
|
|
180
184
|
|
|
181
185
|
farmTerm.header("FARMWORK INITIALIZATION", "primary");
|
|
182
|
-
farmTerm.info(
|
|
186
|
+
farmTerm.info(
|
|
187
|
+
"Let's set up your farm! Answer a few questions to get started.\n",
|
|
188
|
+
);
|
|
183
189
|
|
|
184
190
|
const answers = await inquirer.prompt(QUESTIONS);
|
|
185
191
|
|
|
@@ -187,8 +193,12 @@ export async function init(options) {
|
|
|
187
193
|
if (answers.includeStorybook) {
|
|
188
194
|
farmTerm.nl();
|
|
189
195
|
farmTerm.section("Storybook Deployment", "🐄");
|
|
190
|
-
farmTerm.gray(
|
|
191
|
-
|
|
196
|
+
farmTerm.gray(
|
|
197
|
+
" We recommend deploying Storybook to Netlify with password protection.\n",
|
|
198
|
+
);
|
|
199
|
+
farmTerm.gray(
|
|
200
|
+
" This keeps your component docs private but accessible to your team.\n\n",
|
|
201
|
+
);
|
|
192
202
|
|
|
193
203
|
const storybookAnswers = await inquirer.prompt(STORYBOOK_QUESTIONS);
|
|
194
204
|
Object.assign(answers, storybookAnswers);
|
|
@@ -203,12 +213,39 @@ export async function init(options) {
|
|
|
203
213
|
// Check for existing files
|
|
204
214
|
const existingFiles = [];
|
|
205
215
|
const filesToCheck = [
|
|
206
|
-
{
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
{
|
|
216
|
+
{
|
|
217
|
+
path: path.join(cwd, "CLAUDE.md"),
|
|
218
|
+
name: "CLAUDE.md",
|
|
219
|
+
backup: "OLD_CLAUDE.md",
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
path: path.join(cwd, "justfile"),
|
|
223
|
+
name: "justfile",
|
|
224
|
+
backup: "OLD_justfile",
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
path: path.join(cwd, ".farmwork.json"),
|
|
228
|
+
name: ".farmwork.json",
|
|
229
|
+
backup: null,
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
path: path.join(cwd, ".claude", "commands"),
|
|
233
|
+
name: ".claude/commands/",
|
|
234
|
+
backup: null,
|
|
235
|
+
isDir: true,
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
path: path.join(cwd, ".claude", "agents"),
|
|
239
|
+
name: ".claude/agents/",
|
|
240
|
+
backup: null,
|
|
241
|
+
isDir: true,
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
path: path.join(cwd, "_AUDIT"),
|
|
245
|
+
name: "_AUDIT/",
|
|
246
|
+
backup: null,
|
|
247
|
+
isDir: true,
|
|
248
|
+
},
|
|
212
249
|
];
|
|
213
250
|
|
|
214
251
|
for (const file of filesToCheck) {
|
|
@@ -244,7 +281,10 @@ export async function init(options) {
|
|
|
244
281
|
name: "overwriteChoice",
|
|
245
282
|
message: "How would you like to proceed?",
|
|
246
283
|
choices: [
|
|
247
|
-
{
|
|
284
|
+
{
|
|
285
|
+
name: "🌱 Continue (backup files, add to existing folders)",
|
|
286
|
+
value: "overwrite",
|
|
287
|
+
},
|
|
248
288
|
{ name: "🐔 Cancel installation", value: "cancel" },
|
|
249
289
|
],
|
|
250
290
|
},
|
|
@@ -279,20 +319,32 @@ export async function init(options) {
|
|
|
279
319
|
try {
|
|
280
320
|
// Create folder structure with animations
|
|
281
321
|
const steps = [
|
|
282
|
-
{
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
322
|
+
{
|
|
323
|
+
name: "Creating directories",
|
|
324
|
+
fn: async () => {
|
|
325
|
+
await fs.ensureDir(path.join(cwd, "_AUDIT"));
|
|
326
|
+
await fs.ensureDir(path.join(cwd, "_PLANS"));
|
|
327
|
+
await fs.ensureDir(path.join(cwd, ".claude", "commands"));
|
|
328
|
+
await fs.ensureDir(path.join(cwd, ".claude", "agents"));
|
|
329
|
+
},
|
|
330
|
+
},
|
|
288
331
|
{ name: "Planting CLAUDE.md", fn: () => createClaudeMd(cwd, answers) },
|
|
289
|
-
{
|
|
290
|
-
|
|
332
|
+
{
|
|
333
|
+
name: "Building FARMHOUSE.md",
|
|
334
|
+
fn: () => createFarmhouseMd(cwd, answers),
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
name: "Creating audit documents",
|
|
338
|
+
fn: () => createAuditDocs(cwd, answers),
|
|
339
|
+
},
|
|
291
340
|
{ name: "Laying out justfile", fn: () => createJustfile(cwd, answers) },
|
|
292
341
|
{ name: "Training agents", fn: () => createAgents(cwd, answers) },
|
|
293
342
|
{ name: "Setting up commands", fn: () => createCommands(cwd, answers) },
|
|
294
343
|
{ name: "Configuring settings", fn: () => createSettings(cwd, answers) },
|
|
295
|
-
{
|
|
344
|
+
{
|
|
345
|
+
name: "Writing .farmwork.json",
|
|
346
|
+
fn: () => createProduceConfig(cwd, answers),
|
|
347
|
+
},
|
|
296
348
|
];
|
|
297
349
|
|
|
298
350
|
for (const step of steps) {
|
|
@@ -376,15 +428,18 @@ export async function init(options) {
|
|
|
376
428
|
|
|
377
429
|
// Show created structure
|
|
378
430
|
farmTerm.section("Created Structure", emojis.corn);
|
|
379
|
-
await farmTerm.planting(
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
431
|
+
await farmTerm.planting(
|
|
432
|
+
[
|
|
433
|
+
"_AUDIT/",
|
|
434
|
+
"_PLANS/",
|
|
435
|
+
".claude/commands/",
|
|
436
|
+
".claude/agents/",
|
|
437
|
+
"CLAUDE.md",
|
|
438
|
+
"justfile",
|
|
439
|
+
".farmwork.json",
|
|
440
|
+
],
|
|
441
|
+
"Files planted",
|
|
442
|
+
);
|
|
388
443
|
|
|
389
444
|
// Next steps
|
|
390
445
|
farmTerm.section("Next Steps", emojis.carrot);
|
|
@@ -393,7 +448,7 @@ export async function init(options) {
|
|
|
393
448
|
farmTerm.yellow("just --list");
|
|
394
449
|
farmTerm.gray(" → See available commands\n");
|
|
395
450
|
farmTerm.white(" 2. ");
|
|
396
|
-
farmTerm.yellow('"
|
|
451
|
+
farmTerm.yellow('"open the farm"');
|
|
397
452
|
farmTerm.gray(" → Audit your setup\n");
|
|
398
453
|
farmTerm.white(" 3. ");
|
|
399
454
|
farmTerm.yellow('"make a plan for <feature>"');
|
|
@@ -404,35 +459,44 @@ export async function init(options) {
|
|
|
404
459
|
farmTerm.section("Get Claude Comfortable", emojis.wheat);
|
|
405
460
|
farmTerm.gray(" Copy and paste this prompt to Claude Code:\n\n");
|
|
406
461
|
|
|
407
|
-
farmTerm.box(
|
|
408
|
-
"
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
462
|
+
farmTerm.box(
|
|
463
|
+
"Prompt for Claude",
|
|
464
|
+
[
|
|
465
|
+
"Hey Claude, I am using the Farmwork framework,",
|
|
466
|
+
"please go through the justfile and create",
|
|
467
|
+
"project-specific commands, and go through my",
|
|
468
|
+
"app and suggest project-specific subagents",
|
|
469
|
+
"that would work well.",
|
|
470
|
+
],
|
|
471
|
+
"secondary",
|
|
472
|
+
);
|
|
414
473
|
|
|
415
474
|
// Show merge prompt if we backed up CLAUDE.md
|
|
416
475
|
if (answers._didBackupClaudeMd) {
|
|
417
476
|
farmTerm.nl();
|
|
418
477
|
farmTerm.section("Merge Your Old Instructions", "🥬");
|
|
419
|
-
farmTerm.gray(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
"
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
478
|
+
farmTerm.gray(
|
|
479
|
+
" Your old CLAUDE.md was backed up. Use this prompt to merge:\n\n",
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
farmTerm.box(
|
|
483
|
+
"Merge Prompt",
|
|
484
|
+
[
|
|
485
|
+
"Hey Claude, look at my CLAUDE.md file and",
|
|
486
|
+
"merge the project-specific instructions from",
|
|
487
|
+
"OLD_CLAUDE.md into it, so I have one file",
|
|
488
|
+
"with all the Farmwork instructions plus my",
|
|
489
|
+
"original project setup. Then delete the OLD",
|
|
490
|
+
"files when done.",
|
|
491
|
+
],
|
|
492
|
+
"accent",
|
|
493
|
+
);
|
|
429
494
|
}
|
|
430
495
|
|
|
431
496
|
// Final tractor drive
|
|
432
497
|
farmTerm.nl();
|
|
433
498
|
await farmTerm.tractorAnimation("Your farm is ready!", 1500);
|
|
434
499
|
farmTerm.nl();
|
|
435
|
-
|
|
436
500
|
} catch (error) {
|
|
437
501
|
farmTerm.error("Failed to initialize Farmwork");
|
|
438
502
|
console.error(error);
|
|
@@ -476,11 +540,10 @@ Run these in order for a complete development cycle:
|
|
|
476
540
|
|
|
477
541
|
| Phrase | Action |
|
|
478
542
|
|--------|--------|
|
|
479
|
-
| **
|
|
480
|
-
| **
|
|
481
|
-
| **go to market** | i18n scan +
|
|
482
|
-
| **
|
|
483
|
-
| **open the farm** | Full audit cycle (everything except push), then ask to proceed |
|
|
543
|
+
| **open the farm** | Audit systems, update \`_AUDIT/FARMHOUSE.md\` with current metrics |
|
|
544
|
+
| **count the herd** | Full inspection + dry run: code review, cleanup, performance, security, code quality, accessibility |
|
|
545
|
+
| **go to market** | i18n scan + accessibility audit for missing translations and a11y issues |
|
|
546
|
+
| **close the farm** | Execute \`/push\` (lint, test, build, commit, push) |
|
|
484
547
|
|
|
485
548
|
---
|
|
486
549
|
|
|
@@ -493,30 +556,68 @@ Run these in order for a complete development cycle:
|
|
|
493
556
|
|
|
494
557
|
---
|
|
495
558
|
|
|
559
|
+
### Idea Phrases (Pre-Plan Stage)
|
|
560
|
+
|
|
561
|
+
| Phrase | Action |
|
|
562
|
+
|--------|--------|
|
|
563
|
+
| **I have an idea for...** | Add new idea to \`_AUDIT/GARDEN.md\` (title, description, bullets) |
|
|
564
|
+
| **let's plan this idea...** | Graduate idea from GARDEN → create plan in \`_PLANS/\` |
|
|
565
|
+
| **I dont want to do this idea...** | Reject idea → move from GARDEN to COMPOST |
|
|
566
|
+
| **remove this feature...** | Archive feature idea to COMPOST |
|
|
567
|
+
| **compost this...** | Move idea from GARDEN to COMPOST |
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
496
571
|
### Farmwork Phrase Details
|
|
497
572
|
|
|
498
|
-
**
|
|
573
|
+
**open the farm**
|
|
499
574
|
1. Launch \`the-farmer\` agent to audit all systems
|
|
500
575
|
2. Run \`bd list --status closed | wc -l\` to get total completed issues
|
|
501
576
|
3. Updates \`_AUDIT/FARMHOUSE.md\` with current metrics
|
|
502
577
|
|
|
503
|
-
**
|
|
504
|
-
Runs all inspection agents in parallel
|
|
578
|
+
**count the herd** (Full Audit Cycle)
|
|
579
|
+
Runs all inspection agents in parallel, then dry run quality gates. No push.
|
|
580
|
+
|
|
505
581
|
1. **Code Review & Cleanup** - \`code-reviewer\` + \`unused-code-cleaner\`
|
|
506
|
-
2. **Performance Audit** -
|
|
582
|
+
2. **Performance Audit** - \`performance-auditor\`, updates \`_AUDIT/PERFORMANCE.md\`
|
|
507
583
|
3. **Security Audit** - \`security-auditor\` for OWASP Top 10, updates \`_AUDIT/SECURITY.md\`
|
|
508
584
|
4. **Code Quality** - \`code-smell-auditor\` for DRY violations, updates \`_AUDIT/CODE_QUALITY.md\`
|
|
509
|
-
5. **
|
|
585
|
+
5. **Accessibility** - \`accessibility-auditor\` for WCAG 2.1, updates \`_AUDIT/ACCESSIBILITY.md\`
|
|
586
|
+
6. **Dry Run** - lint, tests, build (but NOT commit/push)
|
|
587
|
+
7. **Summary Report** - Consolidate findings, ask user next steps
|
|
510
588
|
|
|
511
|
-
**
|
|
589
|
+
**go to market**
|
|
590
|
+
1. Scan for hardcoded text not using i18n
|
|
591
|
+
2. Launch \`i18n-locale-translator\` agent
|
|
592
|
+
3. Launch \`accessibility-auditor\` for WCAG 2.1 compliance
|
|
593
|
+
4. Updates \`_AUDIT/ACCESSIBILITY.md\`
|
|
594
|
+
|
|
595
|
+
**close the farm**
|
|
512
596
|
- Invoke the \`push\` skill immediately
|
|
513
597
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
### Idea Phrase Details
|
|
601
|
+
|
|
602
|
+
**I have an idea for...**
|
|
603
|
+
1. Launch \`idea-gardener\` agent
|
|
604
|
+
2. Parse idea title from user input
|
|
605
|
+
3. Ask for short description and bullet points
|
|
606
|
+
4. Add to \`_AUDIT/GARDEN.md\` under ## Ideas section
|
|
607
|
+
|
|
608
|
+
**let's plan this idea...**
|
|
609
|
+
1. Launch \`idea-gardener\` agent
|
|
610
|
+
2. Find the idea in GARDEN.md
|
|
611
|
+
3. Create plan in \`_PLANS/\` using plan mode
|
|
612
|
+
4. Move to "Graduated to Plans" table
|
|
613
|
+
5. Remove from ## Ideas section
|
|
614
|
+
|
|
615
|
+
**compost this...** / **I dont want to do this idea...**
|
|
616
|
+
1. Launch \`idea-gardener\` agent
|
|
617
|
+
2. Find idea in GARDEN.md (or accept new rejection)
|
|
618
|
+
3. Ask for rejection reason
|
|
619
|
+
4. Add to \`_AUDIT/COMPOST.md\` with reason
|
|
620
|
+
5. Remove from GARDEN.md if it was there
|
|
520
621
|
|
|
521
622
|
---
|
|
522
623
|
|
|
@@ -573,7 +674,7 @@ async function createFarmhouseMd(cwd, answers) {
|
|
|
573
674
|
const content = `# Farmwork Farmhouse
|
|
574
675
|
|
|
575
676
|
> Central command for the Farmwork agentic harness.
|
|
576
|
-
> Updated automatically by \`the-farmer\` agent during \`/push\` or via "
|
|
677
|
+
> Updated automatically by \`the-farmer\` agent during \`/push\` or via "open the farm" phrase.
|
|
577
678
|
|
|
578
679
|
**Last Updated:** ${today}
|
|
579
680
|
**Score:** 5.0/10
|
|
@@ -585,8 +686,8 @@ async function createFarmhouseMd(cwd, answers) {
|
|
|
585
686
|
|
|
586
687
|
| Metric | Count |
|
|
587
688
|
|--------|-------|
|
|
588
|
-
| Commands |
|
|
589
|
-
| Agents |
|
|
689
|
+
| Commands | 1 |
|
|
690
|
+
| Agents | 11 |
|
|
590
691
|
| Justfile Recipes | 10 |
|
|
591
692
|
| Unit Tests | 0 |
|
|
592
693
|
| E2E Tests | 0 |
|
|
@@ -604,8 +705,7 @@ All Claude Code commands and agents are documented, phrase triggers are tested a
|
|
|
604
705
|
|
|
605
706
|
| Command | Description |
|
|
606
707
|
|---------|-------------|
|
|
607
|
-
| \`/push\` | Clean, lint, test, build, commit, push |
|
|
608
|
-
| \`/open-the-farm\` | Full audit cycle, then ask user next steps |
|
|
708
|
+
| \`/push\` | Clean, lint, test, build, commit, push, update metrics |
|
|
609
709
|
|
|
610
710
|
---
|
|
611
711
|
|
|
@@ -618,10 +718,12 @@ All Claude Code commands and agents are documented, phrase triggers are tested a
|
|
|
618
718
|
| \`security-auditor\` | OWASP vulnerability scanning |
|
|
619
719
|
| \`performance-auditor\` | Performance anti-patterns |
|
|
620
720
|
| \`code-smell-auditor\` | DRY violations, complexity, naming |
|
|
721
|
+
| \`accessibility-auditor\` | WCAG 2.1 compliance, alt text, contrast |
|
|
621
722
|
| \`unused-code-cleaner\` | Detect and remove dead code |
|
|
622
723
|
| \`code-cleaner\` | Remove comments and console.logs |
|
|
623
724
|
| \`i18n-locale-translator\` | Translate UI text to locales |
|
|
624
725
|
| \`storybook-maintainer\` | Create/update Storybook stories |
|
|
726
|
+
| \`idea-gardener\` | Manage Idea Garden and Compost |
|
|
625
727
|
|
|
626
728
|
---
|
|
627
729
|
|
|
@@ -631,11 +733,10 @@ All Claude Code commands and agents are documented, phrase triggers are tested a
|
|
|
631
733
|
|
|
632
734
|
| Phrase | Action |
|
|
633
735
|
|--------|--------|
|
|
634
|
-
| \`
|
|
635
|
-
| \`
|
|
636
|
-
| \`go to market\` | i18n scan +
|
|
637
|
-
| \`
|
|
638
|
-
| \`open the farm\` | Full audit cycle |
|
|
736
|
+
| \`open the farm\` | Audit systems, update FARMHOUSE.md |
|
|
737
|
+
| \`count the herd\` | Full inspection + dry run (no push) |
|
|
738
|
+
| \`go to market\` | i18n scan + accessibility audit |
|
|
739
|
+
| \`close the farm\` | Execute /push |
|
|
639
740
|
|
|
640
741
|
### Plan Phrases
|
|
641
742
|
|
|
@@ -644,6 +745,14 @@ All Claude Code commands and agents are documented, phrase triggers are tested a
|
|
|
644
745
|
| \`make a plan for...\` | Create plan in _PLANS/ |
|
|
645
746
|
| \`let's implement...\` | Load plan, create Epic |
|
|
646
747
|
|
|
748
|
+
### Idea Phrases
|
|
749
|
+
|
|
750
|
+
| Phrase | Action |
|
|
751
|
+
|--------|--------|
|
|
752
|
+
| \`I have an idea for...\` | Add idea to GARDEN.md |
|
|
753
|
+
| \`let's plan this idea...\` | Graduate idea to _PLANS/ |
|
|
754
|
+
| \`compost this...\` | Move idea to COMPOST.md |
|
|
755
|
+
|
|
647
756
|
---
|
|
648
757
|
|
|
649
758
|
## Issue Tracking (\`.beads/\`)
|
|
@@ -679,10 +788,31 @@ async function createAuditDocs(cwd, answers) {
|
|
|
679
788
|
const today = new Date().toISOString().split("T")[0];
|
|
680
789
|
|
|
681
790
|
const audits = [
|
|
682
|
-
{
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
791
|
+
{
|
|
792
|
+
name: "SECURITY.md",
|
|
793
|
+
title: "Security Audit",
|
|
794
|
+
description: "Security posture and vulnerability tracking",
|
|
795
|
+
},
|
|
796
|
+
{
|
|
797
|
+
name: "PERFORMANCE.md",
|
|
798
|
+
title: "Performance Audit",
|
|
799
|
+
description: "Performance metrics and optimization tracking",
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
name: "ACCESSIBILITY.md",
|
|
803
|
+
title: "Accessibility Audit",
|
|
804
|
+
description: "WCAG 2.1 Level AA compliance tracking",
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
name: "CODE_QUALITY.md",
|
|
808
|
+
title: "Code Quality Audit",
|
|
809
|
+
description: "Code quality and standards tracking",
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
name: "TESTS.md",
|
|
813
|
+
title: "Test Coverage Audit",
|
|
814
|
+
description: "Test coverage and gaps tracking",
|
|
815
|
+
},
|
|
686
816
|
];
|
|
687
817
|
|
|
688
818
|
for (const audit of audits) {
|
|
@@ -725,6 +855,67 @@ _None currently_
|
|
|
725
855
|
|
|
726
856
|
await fs.writeFile(path.join(cwd, "_AUDIT", audit.name), content);
|
|
727
857
|
}
|
|
858
|
+
|
|
859
|
+
// Create GARDEN.md (Idea nursery - custom format)
|
|
860
|
+
const gardenContent = `# Idea Garden
|
|
861
|
+
|
|
862
|
+
> Nursery for new ideas and concepts. The pre-plan creative thinking stage.
|
|
863
|
+
|
|
864
|
+
**Last Updated:** ${today}
|
|
865
|
+
**Active Ideas:** 0
|
|
866
|
+
|
|
867
|
+
---
|
|
868
|
+
|
|
869
|
+
## How to Use
|
|
870
|
+
|
|
871
|
+
| Phrase | Action |
|
|
872
|
+
|--------|--------|
|
|
873
|
+
| \`I have an idea for...\` | Plant a new idea here |
|
|
874
|
+
| \`let's plan this idea...\` | Graduate idea to _PLANS/ |
|
|
875
|
+
| \`compost this...\` | Reject idea, move to COMPOST |
|
|
876
|
+
|
|
877
|
+
---
|
|
878
|
+
|
|
879
|
+
## Ideas
|
|
880
|
+
|
|
881
|
+
_No ideas planted yet. Start with "I have an idea for..."_
|
|
882
|
+
|
|
883
|
+
---
|
|
884
|
+
|
|
885
|
+
## Graduated to Plans
|
|
886
|
+
|
|
887
|
+
| Idea | Plan | Date |
|
|
888
|
+
|------|------|------|
|
|
889
|
+
`;
|
|
890
|
+
|
|
891
|
+
await fs.writeFile(path.join(cwd, "_AUDIT", "GARDEN.md"), gardenContent);
|
|
892
|
+
|
|
893
|
+
// Create COMPOST.md (Rejected ideas archive - custom format)
|
|
894
|
+
const compostContent = `# Idea Compost
|
|
895
|
+
|
|
896
|
+
> Archive of rejected ideas. Reference to avoid re-proposing and remember why we didn't pursue something.
|
|
897
|
+
|
|
898
|
+
**Last Updated:** ${today}
|
|
899
|
+
**Composted Ideas:** 0
|
|
900
|
+
|
|
901
|
+
---
|
|
902
|
+
|
|
903
|
+
## How to Use
|
|
904
|
+
|
|
905
|
+
| Phrase | Action |
|
|
906
|
+
|--------|--------|
|
|
907
|
+
| \`I dont want to do this idea...\` | Reject an idea |
|
|
908
|
+
| \`remove this feature...\` | Archive a feature idea |
|
|
909
|
+
| \`compost this...\` | Move idea from GARDEN here |
|
|
910
|
+
|
|
911
|
+
---
|
|
912
|
+
|
|
913
|
+
## Composted Ideas
|
|
914
|
+
|
|
915
|
+
_No composted ideas yet._
|
|
916
|
+
`;
|
|
917
|
+
|
|
918
|
+
await fs.writeFile(path.join(cwd, "_AUDIT", "COMPOST.md"), compostContent);
|
|
728
919
|
}
|
|
729
920
|
|
|
730
921
|
async function createJustfile(cwd, answers) {
|
|
@@ -816,7 +1007,7 @@ async function createAgents(cwd, answers) {
|
|
|
816
1007
|
name: the-farmer
|
|
817
1008
|
description: Audit and update FARMHOUSE.md with current project metrics
|
|
818
1009
|
tools: Read, Grep, Glob, Edit, Bash
|
|
819
|
-
model:
|
|
1010
|
+
model: opus
|
|
820
1011
|
---
|
|
821
1012
|
|
|
822
1013
|
# The Farmer Agent
|
|
@@ -850,7 +1041,7 @@ Maintains \`_AUDIT/FARMHOUSE.md\` - the living document tracking all systems and
|
|
|
850
1041
|
name: code-reviewer
|
|
851
1042
|
description: Review code for quality, security, and maintainability
|
|
852
1043
|
tools: Read, Grep, Glob, Bash
|
|
853
|
-
model:
|
|
1044
|
+
model: opus
|
|
854
1045
|
---
|
|
855
1046
|
|
|
856
1047
|
# Code Reviewer Agent
|
|
@@ -867,7 +1058,7 @@ Reports findings with severity (CRITICAL, HIGH, MEDIUM, LOW) and remediation ste
|
|
|
867
1058
|
name: security-auditor
|
|
868
1059
|
description: OWASP security vulnerability scanning
|
|
869
1060
|
tools: Read, Grep, Glob, Edit
|
|
870
|
-
model:
|
|
1061
|
+
model: opus
|
|
871
1062
|
---
|
|
872
1063
|
|
|
873
1064
|
# Security Auditor Agent
|
|
@@ -886,7 +1077,7 @@ Updates \`_AUDIT/SECURITY.md\` with results.
|
|
|
886
1077
|
name: performance-auditor
|
|
887
1078
|
description: Find memory leaks, unnecessary re-renders, and anti-patterns
|
|
888
1079
|
tools: Read, Grep, Glob, Edit
|
|
889
|
-
model:
|
|
1080
|
+
model: opus
|
|
890
1081
|
---
|
|
891
1082
|
|
|
892
1083
|
# Performance Auditor Agent
|
|
@@ -905,7 +1096,7 @@ Updates \`_AUDIT/PERFORMANCE.md\` with results.
|
|
|
905
1096
|
name: code-smell-auditor
|
|
906
1097
|
description: Detect DRY violations, complexity issues, naming problems, and technical debt
|
|
907
1098
|
tools: Read, Grep, Glob, Edit
|
|
908
|
-
model:
|
|
1099
|
+
model: opus
|
|
909
1100
|
---
|
|
910
1101
|
|
|
911
1102
|
# Code Smell Auditor Agent
|
|
@@ -919,12 +1110,32 @@ Scans for code quality issues:
|
|
|
919
1110
|
|
|
920
1111
|
Reports code health as GOOD / FAIR / NEEDS ATTENTION.
|
|
921
1112
|
Updates \`_AUDIT/CODE_QUALITY.md\` with results.
|
|
1113
|
+
`,
|
|
1114
|
+
"accessibility-auditor.md": `---
|
|
1115
|
+
name: accessibility-auditor
|
|
1116
|
+
description: WCAG 2.1 accessibility auditing for React/Next.js applications
|
|
1117
|
+
tools: Read, Grep, Glob, Edit
|
|
1118
|
+
model: opus
|
|
1119
|
+
---
|
|
1120
|
+
|
|
1121
|
+
# Accessibility Auditor Agent
|
|
1122
|
+
|
|
1123
|
+
Scans for WCAG 2.1 Level AA compliance issues:
|
|
1124
|
+
- Missing or inadequate alt text on images
|
|
1125
|
+
- Color contrast issues
|
|
1126
|
+
- Keyboard navigation problems
|
|
1127
|
+
- Missing ARIA labels and roles
|
|
1128
|
+
- Form accessibility (labels, error messages)
|
|
1129
|
+
- Focus management issues
|
|
1130
|
+
|
|
1131
|
+
Reports findings by severity (CRITICAL, HIGH, MEDIUM, LOW).
|
|
1132
|
+
Updates \`_AUDIT/ACCESSIBILITY.md\` with results.
|
|
922
1133
|
`,
|
|
923
1134
|
"unused-code-cleaner.md": `---
|
|
924
1135
|
name: unused-code-cleaner
|
|
925
1136
|
description: Detect and remove unused code (imports, functions, variables)
|
|
926
1137
|
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
927
|
-
model:
|
|
1138
|
+
model: opus
|
|
928
1139
|
---
|
|
929
1140
|
|
|
930
1141
|
# Unused Code Cleaner Agent
|
|
@@ -943,7 +1154,7 @@ Use after refactoring, when removing features, or before production deployment.
|
|
|
943
1154
|
name: code-cleaner
|
|
944
1155
|
description: Fast removal of comments, console.logs, and debug code while preserving JSDoc
|
|
945
1156
|
tools: Read, Edit, Glob, Grep
|
|
946
|
-
model:
|
|
1157
|
+
model: opus
|
|
947
1158
|
---
|
|
948
1159
|
|
|
949
1160
|
# Code Cleaner Agent
|
|
@@ -963,7 +1174,7 @@ Fast cleanup of TypeScript/JavaScript files:
|
|
|
963
1174
|
name: i18n-locale-translator
|
|
964
1175
|
description: Translate UI text content into English (en) and Japanese (jp) using i18n locale system
|
|
965
1176
|
tools: Read, Write, Edit, Glob, Grep
|
|
966
|
-
model:
|
|
1177
|
+
model: opus
|
|
967
1178
|
---
|
|
968
1179
|
|
|
969
1180
|
# i18n Locale Translator Agent
|
|
@@ -980,7 +1191,7 @@ Use when adding new features or internationalizing existing hardcoded text.
|
|
|
980
1191
|
name: storybook-maintainer
|
|
981
1192
|
description: Create and update Storybook stories for UI components
|
|
982
1193
|
tools: Read, Write, Edit, Glob, Grep
|
|
983
|
-
model:
|
|
1194
|
+
model: opus
|
|
984
1195
|
---
|
|
985
1196
|
|
|
986
1197
|
# Storybook Maintainer Agent
|
|
@@ -992,6 +1203,43 @@ Manages Storybook stories for UI components:
|
|
|
992
1203
|
- Add controls for interactive props
|
|
993
1204
|
|
|
994
1205
|
Use when adding new components or when existing components change significantly.
|
|
1206
|
+
`,
|
|
1207
|
+
"idea-gardener.md": `---
|
|
1208
|
+
name: idea-gardener
|
|
1209
|
+
description: Manage the Idea Garden and Compost - add, graduate, or reject ideas
|
|
1210
|
+
tools: Read, Edit, Glob, Grep
|
|
1211
|
+
model: opus
|
|
1212
|
+
---
|
|
1213
|
+
|
|
1214
|
+
# Idea Gardener Agent
|
|
1215
|
+
|
|
1216
|
+
Manages \`_AUDIT/GARDEN.md\` and \`_AUDIT/COMPOST.md\` for idea lifecycle tracking.
|
|
1217
|
+
|
|
1218
|
+
## Commands
|
|
1219
|
+
|
|
1220
|
+
### Plant an Idea (from "I have an idea for...")
|
|
1221
|
+
1. Parse the idea title from user input
|
|
1222
|
+
2. Ask user for short description and key bullet points
|
|
1223
|
+
3. Add to GARDEN.md under ## Ideas section with format:
|
|
1224
|
+
### [Idea Title]
|
|
1225
|
+
[Short description]
|
|
1226
|
+
- Bullet point 1
|
|
1227
|
+
- Bullet point 2
|
|
1228
|
+
|
|
1229
|
+
### Graduate an Idea (from "let's plan this idea...")
|
|
1230
|
+
1. Find idea in GARDEN.md
|
|
1231
|
+
2. Create plan file in _PLANS/ using plan mode
|
|
1232
|
+
3. Move idea to "Graduated to Plans" table with date and plan link
|
|
1233
|
+
4. Remove from ## Ideas section
|
|
1234
|
+
|
|
1235
|
+
### Compost an Idea (from "compost this..." / "I dont want...")
|
|
1236
|
+
1. Find idea in GARDEN.md (or accept new rejection)
|
|
1237
|
+
2. Ask for rejection reason
|
|
1238
|
+
3. Add to COMPOST.md with reason and date
|
|
1239
|
+
4. Remove from GARDEN.md if it was there
|
|
1240
|
+
|
|
1241
|
+
## Output Format
|
|
1242
|
+
Confirm action taken and show updated file section.
|
|
995
1243
|
`,
|
|
996
1244
|
};
|
|
997
1245
|
|
|
@@ -1006,201 +1254,130 @@ async function createCommands(cwd, answers) {
|
|
|
1006
1254
|
const storybookSteps = answers.includeStorybook
|
|
1007
1255
|
? `
|
|
1008
1256
|
|
|
1009
|
-
### Step
|
|
1010
|
-
|
|
1011
|
-
Build Storybook for production:
|
|
1012
|
-
\`\`\`bash
|
|
1013
|
-
${pm} run build-storybook
|
|
1014
|
-
\`\`\`
|
|
1257
|
+
### Step 9: Deploy Storybook to Netlify
|
|
1015
1258
|
|
|
1016
|
-
Deploy
|
|
1259
|
+
Deploy the Storybook documentation site:
|
|
1017
1260
|
\`\`\`bash
|
|
1018
1261
|
npx netlify deploy --dir=storybook-static --site=$NETLIFY_STORYBOOK_SITE_ID --prod
|
|
1019
1262
|
\`\`\`
|
|
1020
1263
|
|
|
1264
|
+
Note: Requires \`NETLIFY_AUTH_TOKEN\` and \`NETLIFY_STORYBOOK_SITE_ID\` in \`.claude/settings.local.json\`.
|
|
1265
|
+
If not configured, skip this step and inform the user to add the env vars.
|
|
1266
|
+
|
|
1021
1267
|
Storybook URL: https://${answers.storybookUrl || "storybook.example.com"}
|
|
1022
1268
|
${answers.passwordProtect ? "**Note:** This Storybook is password protected." : ""}
|
|
1023
1269
|
`
|
|
1024
1270
|
: "";
|
|
1025
1271
|
|
|
1026
|
-
const finalStep = answers.includeStorybook
|
|
1027
|
-
? "### Step 7: Report Success"
|
|
1028
|
-
: "### Step 6: Report Success";
|
|
1029
|
-
const reportContent = answers.includeStorybook
|
|
1030
|
-
? `
|
|
1031
|
-
Show summary:
|
|
1032
|
-
- Files changed
|
|
1033
|
-
- Commit hash
|
|
1034
|
-
- Push status
|
|
1035
|
-
- Storybook deploy status
|
|
1036
|
-
`
|
|
1037
|
-
: `
|
|
1038
|
-
Show summary:
|
|
1039
|
-
- Files changed
|
|
1040
|
-
- Commit hash
|
|
1041
|
-
- Push status
|
|
1042
|
-
`;
|
|
1043
|
-
|
|
1044
1272
|
const pushCommand = `---
|
|
1045
|
-
description: Clean, lint, test, build, commit,
|
|
1046
|
-
|
|
1273
|
+
description: Clean, stage, lint, test, build, commit, push, and update metrics
|
|
1274
|
+
argument-hint: [optional: commit message override]
|
|
1275
|
+
allowed-tools: Bash(find:*), Bash(git:*), Bash(${pm}:*), Bash(npx:*)${answers.includeStorybook ? ", Bash(npx netlify:*)" : ""}, Task
|
|
1047
1276
|
---
|
|
1048
1277
|
|
|
1049
1278
|
# Push Command
|
|
1050
1279
|
|
|
1051
|
-
Run quality gates, commit changes, and push to remote
|
|
1280
|
+
Run code cleanup, all quality gates, commit changes, and push to remote.
|
|
1052
1281
|
|
|
1053
1282
|
## Workflow
|
|
1054
1283
|
|
|
1055
1284
|
Execute these steps in order. **Stop immediately if any step fails.**
|
|
1056
1285
|
|
|
1057
|
-
### Step 1:
|
|
1286
|
+
### Step 1: Clean Up System Files
|
|
1287
|
+
Remove any .DS_Store files from the repository:
|
|
1058
1288
|
\`\`\`bash
|
|
1059
|
-
|
|
1289
|
+
find . -name '.DS_Store' -type f -delete
|
|
1060
1290
|
\`\`\`
|
|
1061
1291
|
|
|
1062
|
-
### Step 2:
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
1. **Lint**: \`${answers.lintCommand}\`
|
|
1068
|
-
2. **Tests**: \`${answers.testCommand}\`
|
|
1069
|
-
3. **Build**: \`${answers.buildCommand}\`
|
|
1070
|
-
|
|
1071
|
-
### Step 4: Generate Commit Message
|
|
1072
|
-
|
|
1073
|
-
Analyze staged changes and generate a concise commit message:
|
|
1074
|
-
- Starts with a type (feat, fix, refactor, docs, style, test, chore)
|
|
1075
|
-
- Summarizes the "why" not the "what"
|
|
1076
|
-
- 1-2 sentences maximum
|
|
1077
|
-
|
|
1078
|
-
### Step 5: Commit and Push
|
|
1079
|
-
|
|
1080
|
-
Create the commit with footer:
|
|
1081
|
-
|
|
1292
|
+
### Step 2: Sync Packages
|
|
1293
|
+
Clean and reinstall node_modules to ensure package-lock.json stays in sync:
|
|
1294
|
+
\`\`\`bash
|
|
1295
|
+
rm -rf node_modules && ${pm} install
|
|
1082
1296
|
\`\`\`
|
|
1083
|
-
|
|
1297
|
+
This prevents \`${pm} ci\` failures in CI/CD due to lock file drift.
|
|
1084
1298
|
|
|
1085
|
-
|
|
1086
|
-
\`\`\`
|
|
1299
|
+
If package-lock.json was modified, it will be staged in the next step.
|
|
1087
1300
|
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
await fs.writeFile(
|
|
1094
|
-
path.join(cwd, ".claude", "commands", "push.md"),
|
|
1095
|
-
pushCommand,
|
|
1096
|
-
);
|
|
1097
|
-
|
|
1098
|
-
// Create open-the-farm command
|
|
1099
|
-
const openTheFarmCommand = `---
|
|
1100
|
-
description: Full audit cycle - till, inspect, dry run harvest, then ask user next steps
|
|
1101
|
-
allowed-tools: Bash(${pm}:*), Bash(just:*), Task
|
|
1102
|
-
---
|
|
1103
|
-
|
|
1104
|
-
# Open the Farm Command
|
|
1105
|
-
|
|
1106
|
-
Complete development audit workflow. Runs all audits and quality checks without committing, then asks the user what to do next.
|
|
1107
|
-
|
|
1108
|
-
Trigger phrase: "open the farm"
|
|
1109
|
-
|
|
1110
|
-
## Workflow
|
|
1111
|
-
|
|
1112
|
-
Execute these steps in order. Track findings from each step for the final summary.
|
|
1113
|
-
|
|
1114
|
-
### Step 1: Till the Land
|
|
1115
|
-
|
|
1116
|
-
Update the harness documentation with current metrics.
|
|
1301
|
+
### Step 3: Stage All Changes
|
|
1302
|
+
\`\`\`bash
|
|
1303
|
+
git add -A
|
|
1304
|
+
\`\`\`
|
|
1117
1305
|
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
- Test counts
|
|
1121
|
-
- Completed issues count
|
|
1306
|
+
### Step 4: Check for Changes
|
|
1307
|
+
Run \`git status\` to verify there are staged changes. If nothing to commit, inform the user and stop.
|
|
1122
1308
|
|
|
1123
|
-
|
|
1309
|
+
### Step 5: Clean Code
|
|
1124
1310
|
|
|
1125
|
-
|
|
1311
|
+
Run the code-cleaner agent on staged TypeScript files to remove comments and console.logs.
|
|
1126
1312
|
|
|
1127
|
-
|
|
1313
|
+
This removes:
|
|
1314
|
+
- Line comments (\`//\`) and block comments (\`/* */\`)
|
|
1315
|
+
- \`console.log\` statements
|
|
1128
1316
|
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
- \`
|
|
1132
|
-
- \`unused-code-cleaner\` to detect dead code, unused imports
|
|
1317
|
+
It preserves:
|
|
1318
|
+
- JSDoc comments (\`/** */\`)
|
|
1319
|
+
- \`console.error\`, \`console.warn\`, \`console.info\`
|
|
1133
1320
|
|
|
1134
|
-
|
|
1135
|
-
|
|
1321
|
+
After cleaning, re-stage the modified files:
|
|
1322
|
+
\`\`\`bash
|
|
1323
|
+
git add -A
|
|
1324
|
+
\`\`\`
|
|
1136
1325
|
|
|
1137
|
-
|
|
1138
|
-
- Launch \`security-auditor\` agent for OWASP Top 10 vulnerabilities
|
|
1139
|
-
- Note findings by severity (CRITICAL, HIGH, MEDIUM, LOW)
|
|
1326
|
+
### Step 6: Run Quality Gates (in order)
|
|
1140
1327
|
|
|
1141
|
-
|
|
1142
|
-
- Launch \`code-smell-auditor\` agent for DRY violations, complexity, naming issues
|
|
1143
|
-
- Note code health rating (GOOD / FAIR / NEEDS ATTENTION)
|
|
1328
|
+
Run each check. If any fails, stop and report which check failed:
|
|
1144
1329
|
|
|
1145
|
-
|
|
1330
|
+
1. **Lint**: \`${answers.lintCommand}\`${answers.includeStorybook ? `\n2. **Storybook**: \`${pm} run build-storybook\`` : ""}
|
|
1331
|
+
${answers.includeStorybook ? "3" : "2"}. **Unit Tests**: \`${answers.testCommand}\`
|
|
1332
|
+
${answers.includeStorybook ? "4" : "3"}. **Build**: \`${answers.buildCommand}\`
|
|
1146
1333
|
|
|
1147
|
-
|
|
1334
|
+
### Step 7: Generate Commit Message
|
|
1148
1335
|
|
|
1149
|
-
|
|
1150
|
-
2. **Tests**: \`${answers.testCommand}\`
|
|
1151
|
-
3. **Build**: \`${answers.buildCommand}\`
|
|
1336
|
+
If \`$ARGUMENTS\` is provided, use it as the commit message.
|
|
1152
1337
|
|
|
1153
|
-
|
|
1338
|
+
Otherwise, analyze the staged changes:
|
|
1339
|
+
1. Run \`git diff --cached --stat\` to see changed files
|
|
1340
|
+
2. Run \`git diff --cached\` to see actual changes
|
|
1341
|
+
3. Run \`git log -5 --oneline\` to match the repository's commit style
|
|
1342
|
+
4. Generate a concise, descriptive commit message that:
|
|
1343
|
+
- Starts with a type (feat, fix, refactor, docs, style, test, chore)
|
|
1344
|
+
- Summarizes the "why" not the "what"
|
|
1345
|
+
- Is 1-2 sentences maximum
|
|
1154
1346
|
|
|
1155
|
-
### Step
|
|
1347
|
+
### Step 8: Commit and Push
|
|
1156
1348
|
|
|
1157
|
-
|
|
1349
|
+
Create the commit with the message, including the standard footer:
|
|
1158
1350
|
|
|
1159
1351
|
\`\`\`
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
### Harness Status
|
|
1163
|
-
- Farmhouse Score: X/10
|
|
1164
|
-
- Commands: X | Agents: X | Tests: X
|
|
1165
|
-
|
|
1166
|
-
### Code Quality
|
|
1167
|
-
- Security: X issues (Y critical, Z high)
|
|
1168
|
-
- Performance: X issues
|
|
1169
|
-
- Code Smells: [GOOD/FAIR/NEEDS ATTENTION]
|
|
1170
|
-
- Unused Code: X items flagged
|
|
1171
|
-
|
|
1172
|
-
### Quality Gates
|
|
1173
|
-
- Lint: ✅/❌
|
|
1174
|
-
- Tests: ✅/❌ (X passed, Y failed)
|
|
1175
|
-
- Build: ✅/❌
|
|
1176
|
-
|
|
1177
|
-
### Open Items
|
|
1178
|
-
[List top 3-5 issues that should be addressed]
|
|
1352
|
+
🌽 Generated with FARMWORK
|
|
1179
1353
|
\`\`\`
|
|
1180
1354
|
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1355
|
+
Then push to remote:
|
|
1356
|
+
\`\`\`bash
|
|
1357
|
+
git push
|
|
1358
|
+
\`\`\`
|
|
1359
|
+
${storybookSteps}
|
|
1360
|
+
### Step 10: Update Farmhouse Metrics
|
|
1184
1361
|
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
> - **review audits** - Show detailed findings from a specific audit
|
|
1190
|
-
> - **fix issues first** - Address the open items before pushing
|
|
1362
|
+
Run the-farmer agent to update \`_AUDIT/FARMHOUSE.md\` with current metrics:
|
|
1363
|
+
- Commands and agents inventory
|
|
1364
|
+
- Test counts (unit, e2e)
|
|
1365
|
+
- Completed issues count
|
|
1191
1366
|
|
|
1192
|
-
|
|
1367
|
+
This keeps the harness documentation in sync with the codebase.
|
|
1193
1368
|
|
|
1194
|
-
|
|
1369
|
+
### Step 11: Report Success
|
|
1195
1370
|
|
|
1196
|
-
|
|
1197
|
-
-
|
|
1198
|
-
-
|
|
1371
|
+
Show a summary:
|
|
1372
|
+
- Files changed
|
|
1373
|
+
- Commit hash
|
|
1374
|
+
- Push status${answers.includeStorybook ? "\n- Storybook deploy status (if deployed)" : ""}
|
|
1375
|
+
- Harness metrics updated
|
|
1199
1376
|
`;
|
|
1200
1377
|
|
|
1201
1378
|
await fs.writeFile(
|
|
1202
|
-
path.join(cwd, ".claude", "commands", "
|
|
1203
|
-
|
|
1379
|
+
path.join(cwd, ".claude", "commands", "push.md"),
|
|
1380
|
+
pushCommand,
|
|
1204
1381
|
);
|
|
1205
1382
|
}
|
|
1206
1383
|
|
|
@@ -1246,7 +1423,7 @@ async function createSettings(cwd, answers) {
|
|
|
1246
1423
|
|
|
1247
1424
|
async function createProduceConfig(cwd, answers) {
|
|
1248
1425
|
const config = {
|
|
1249
|
-
version: "1.
|
|
1426
|
+
version: "1.1.0",
|
|
1250
1427
|
projectName: answers.projectName,
|
|
1251
1428
|
commands: {
|
|
1252
1429
|
test: answers.testCommand,
|
|
@@ -1257,7 +1434,7 @@ async function createProduceConfig(cwd, answers) {
|
|
|
1257
1434
|
storybook: answers.includeStorybook || false,
|
|
1258
1435
|
i18n: answers.includeI18n || false,
|
|
1259
1436
|
},
|
|
1260
|
-
audits: ["FARMHOUSE", "SECURITY", "PERFORMANCE", "CODE_QUALITY", "TESTS"],
|
|
1437
|
+
audits: ["FARMHOUSE", "SECURITY", "PERFORMANCE", "ACCESSIBILITY", "CODE_QUALITY", "TESTS", "GARDEN", "COMPOST"],
|
|
1261
1438
|
};
|
|
1262
1439
|
|
|
1263
1440
|
if (answers.includeStorybook) {
|