create-issflow 1.0.0 → 1.0.2
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 +56 -41
- package/bin/cli.js +259 -96
- package/package.json +28 -23
- package/template/.claude/agents/debugger.md +47 -47
- package/template/.claude/agents/e2e-runner.md +66 -56
- package/template/.claude/agents/implementer.md +75 -75
- package/template/.claude/agents/planner.md +71 -65
- package/template/.claude/agents/researcher.md +103 -103
- package/template/.claude/agents/synthesizer.md +72 -72
- package/template/.claude/agents/test-author.md +70 -70
- package/template/.claude/commands/log-decision.md +33 -33
- package/template/.claude/commands/log-issue.md +28 -28
- package/template/.claude/commands/overview.md +99 -98
- package/template/.claude/commands/phase.md +202 -191
- package/template/.claude/commands/quick.md +30 -30
- package/template/.claude/commands/replan.md +63 -63
- package/template/.claude/commands/store-wisdom.md +195 -194
- package/template/.claude/commands/synthesize.md +26 -26
- package/template/.claude/commands/unstuck.md +40 -40
- package/template/.claude/hooks/pre-compact.sh +25 -25
- package/template/.claude/hooks/session-start.sh +120 -120
- package/template/.claude/hooks/subagent-stop.sh +11 -11
- package/template/.claude/istartsoft-flow/METHODOLOGY.md +229 -214
- package/template/.claude/skills/caveman/SKILL.md +39 -39
- package/template/.claude/skills/grill-me/SKILL.md +10 -10
- package/template/.claude/skills/karpathy-guidelines/SKILL.md +34 -34
- package/template/.claude/skills/ux-design/SKILL.md +99 -0
- package/template/.claude/skills/ux-design/wireframe-template.md +95 -0
package/README.md
CHANGED
|
@@ -1,41 +1,56 @@
|
|
|
1
|
-
# create-issflow
|
|
2
|
-
|
|
3
|
-
Scaffold the **iStartSoftFlow** AI-coding workflow into any project
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
## Use
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
cd my-project
|
|
10
|
-
npx create-issflow
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- `--
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
1
|
+
# create-issflow
|
|
2
|
+
|
|
3
|
+
Scaffold the **iStartSoftFlow** AI-coding workflow into any project. Stack-agnostic
|
|
4
|
+
and tool-agnostic. Non-destructive: it never overwrites your files.
|
|
5
|
+
|
|
6
|
+
## Use
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
cd my-project
|
|
10
|
+
npx create-issflow # prompts for your AI tool
|
|
11
|
+
npx create-issflow --tool=claude # or pass it: claude | codex | cursor | gemini | aider | all
|
|
12
|
+
# then open your tool — Claude Code fires the SessionStart hook automatically
|
|
13
|
+
/overview # bootstrap the project
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Flags:
|
|
17
|
+
- `--tool=<name>` — pick the target tool (skips the prompt). `all` writes every adapter.
|
|
18
|
+
- `--dry-run` — print what would happen, write nothing.
|
|
19
|
+
- `--force` — overwrite existing kit files (default keeps yours; conflicts are
|
|
20
|
+
written as `<file>.issflow-new` for you to merge).
|
|
21
|
+
- `-h`, `--help` — usage.
|
|
22
|
+
|
|
23
|
+
## What it installs
|
|
24
|
+
|
|
25
|
+
The portable kit (every tool) in `<project>/.claude/`:
|
|
26
|
+
|
|
27
|
+
- `agents/` — planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer
|
|
28
|
+
- `commands/` — `/overview` `/phase` `/quick` `/replan` `/synthesize` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
|
|
29
|
+
- `skills/` — caveman · grill-me · karpathy-guidelines · ux-design
|
|
30
|
+
- `hooks/` — session-start · pre-compact · subagent-stop
|
|
31
|
+
- `istartsoft-flow/METHODOLOGY.md` — the full methodology (single source of truth)
|
|
32
|
+
|
|
33
|
+
Plus a root `AGENTS.md` (the open standard) and the per-tool adapter:
|
|
34
|
+
|
|
35
|
+
| Tool | Adds |
|
|
36
|
+
|------|------|
|
|
37
|
+
| `claude` | merges hooks into `.claude/settings.json` |
|
|
38
|
+
| `codex` | nothing extra — `AGENTS.md` is read natively |
|
|
39
|
+
| `cursor` | `.cursor/rules/` + `.cursor/commands/` + `.cursor/hooks.json` |
|
|
40
|
+
| `gemini` | `GEMINI.md` pointer |
|
|
41
|
+
| `aider` | `.aider.conf.yml` that loads the methodology |
|
|
42
|
+
| `all` | every adapter above |
|
|
43
|
+
|
|
44
|
+
It also un-ignores the workflow dirs in `.gitignore` if `.claude/*` was ignored.
|
|
45
|
+
|
|
46
|
+
## Loop
|
|
47
|
+
|
|
48
|
+
`design-research → grill → plan → implement → test → deploy`, one vertical slice
|
|
49
|
+
per phase. Stack-agnostic: declare your stack in `docs/OVERVIEW.md`; Phase 0
|
|
50
|
+
(infra) is N/A when infra is managed. Planning source of truth stays in your
|
|
51
|
+
PRD / architecture / stories (e.g. BMAD / iSSM).
|
|
52
|
+
|
|
53
|
+
## Maintainers
|
|
54
|
+
|
|
55
|
+
The kit lives in the repo's `.claude/`. After editing it, run `bash build.sh` to
|
|
56
|
+
refresh `template/`, then bump `version` and publish.
|
package/bin/cli.js
CHANGED
|
@@ -1,96 +1,259 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// create-issflow — scaffold the iStartSoftFlow workflow
|
|
3
|
-
//
|
|
4
|
-
// never overwrites an existing file — on conflict it writes `<file>.issflow-new`.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// create-issflow — scaffold the iStartSoftFlow agentic-dev workflow into the
|
|
3
|
+
// current project. Pure Node, zero deps, cross-platform, NON-DESTRUCTIVE:
|
|
4
|
+
// never overwrites an existing file — on conflict it writes `<file>.issflow-new`.
|
|
5
|
+
//
|
|
6
|
+
// Tool-agnostic: the portable kit lives in `.claude/` and the methodology is the
|
|
7
|
+
// single source of truth. `--tool=<name>` writes the right adapter so the same
|
|
8
|
+
// kit drives Claude Code, Codex, Cursor, Gemini CLI, Aider, or any AGENTS.md tool.
|
|
9
|
+
'use strict';
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
const path = require('path');
|
|
12
|
+
|
|
13
|
+
const TPL = path.join(__dirname, '..', 'template');
|
|
14
|
+
const CWD = process.cwd();
|
|
15
|
+
const argv = process.argv.slice(2);
|
|
16
|
+
const DRY = argv.includes('--dry-run');
|
|
17
|
+
const FORCE = argv.includes('--force');
|
|
18
|
+
const HELP = argv.includes('-h') || argv.includes('--help');
|
|
19
|
+
const toolArg = (argv.find(a => a.startsWith('--tool=')) || '').split('=')[1];
|
|
20
|
+
|
|
21
|
+
const TOOLS = {
|
|
22
|
+
claude: 'Claude Code (Anthropic) — full: subagents, lifecycle hooks, skills',
|
|
23
|
+
codex: 'OpenAI Codex CLI — AGENTS.md native; subagents/skills as readable files',
|
|
24
|
+
cursor: 'Cursor — .cursor/rules + commands + hooks; reads .claude/agents natively',
|
|
25
|
+
gemini: 'Google Gemini CLI — GEMINI.md pointer; commands/skills as readable files',
|
|
26
|
+
aider: 'Aider — .aider.conf.yml loads the methodology as conventions',
|
|
27
|
+
all: 'Write every adapter above (mixed-team repo)',
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
let created = 0, skipped = 0, conflicts = 0;
|
|
31
|
+
const warnings = [];
|
|
32
|
+
const log = (...a) => console.log(...a);
|
|
33
|
+
|
|
34
|
+
// ---- helpers ----------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
function printHelp() {
|
|
37
|
+
log(`create-issflow — scaffold the iStartSoftFlow workflow.
|
|
38
|
+
|
|
39
|
+
Usage: npx create-issflow [--tool=<name>] [--dry-run] [--force]
|
|
40
|
+
|
|
41
|
+
Tools (--tool=, interactive prompt if omitted):`);
|
|
42
|
+
for (const [k, v] of Object.entries(TOOLS)) log(` ${k.padEnd(7)} ${v}`);
|
|
43
|
+
log(`
|
|
44
|
+
Flags:
|
|
45
|
+
--dry-run print what would happen, write nothing
|
|
46
|
+
--force overwrite existing kit files (default keeps yours -> <file>.issflow-new)
|
|
47
|
+
-h, --help this message
|
|
48
|
+
|
|
49
|
+
Every tool installs the portable kit in .claude/ + a root AGENTS.md (the open
|
|
50
|
+
standard). The full methodology lives in .claude/istartsoft-flow/METHODOLOGY.md.`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Resolve the target tool: flag -> interactive (TTY) -> default 'claude'.
|
|
54
|
+
function pickTool() {
|
|
55
|
+
if (toolArg) {
|
|
56
|
+
if (!TOOLS[toolArg]) { console.error(`create-issflow: unknown --tool=${toolArg}. One of: ${Object.keys(TOOLS).join(', ')}`); process.exit(1); }
|
|
57
|
+
return toolArg;
|
|
58
|
+
}
|
|
59
|
+
if (process.stdin.isTTY && process.stdout.isTTY && !DRY) {
|
|
60
|
+
const keys = Object.keys(TOOLS);
|
|
61
|
+
process.stdout.write('\nWhich AI coding tool? (the kit is portable — pick your primary)\n');
|
|
62
|
+
keys.forEach((k, i) => process.stdout.write(` ${i + 1}) ${k} — ${TOOLS[k]}\n`));
|
|
63
|
+
process.stdout.write('> ');
|
|
64
|
+
let line = '';
|
|
65
|
+
try { line = (fs.readFileSync(0, 'utf8').split('\n')[0] || '').trim().toLowerCase(); } catch (_) {}
|
|
66
|
+
const chosen = TOOLS[line] ? line : keys[parseInt(line, 10) - 1];
|
|
67
|
+
if (!chosen) { console.error('create-issflow: no valid choice; defaulting to claude.'); return 'claude'; }
|
|
68
|
+
return chosen;
|
|
69
|
+
}
|
|
70
|
+
return 'claude'; // non-interactive default = back-compatible
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// write a single file, non-destructive (honors DRY/FORCE).
|
|
74
|
+
function writeFile(rel, content, { exec = false } = {}) {
|
|
75
|
+
const dest = path.join(CWD, rel);
|
|
76
|
+
const exists = fs.existsSync(dest);
|
|
77
|
+
if (exists && !FORCE) {
|
|
78
|
+
if (fs.readFileSync(dest, 'utf8') === content) { skipped++; return; }
|
|
79
|
+
const alt = dest + '.issflow-new';
|
|
80
|
+
conflicts++; log(` ~ conflict, wrote ${path.relative(CWD, alt)} (yours kept)`);
|
|
81
|
+
if (!DRY) { fs.mkdirSync(path.dirname(alt), { recursive: true }); fs.writeFileSync(alt, content); }
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
created++; log(` + ${rel}${exists ? ' (overwrote, --force)' : ''}`);
|
|
85
|
+
if (!DRY) {
|
|
86
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
87
|
+
fs.writeFileSync(dest, content);
|
|
88
|
+
if (exec) { try { fs.chmodSync(dest, 0o755); } catch (_) {} }
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function walk(dir) {
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
95
|
+
const p = path.join(dir, e.name);
|
|
96
|
+
if (e.isDirectory()) out.push(...walk(p)); else out.push(p);
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function copyTemplateCommands(destDir) {
|
|
102
|
+
const cmdDir = path.join(TPL, '.claude', 'commands');
|
|
103
|
+
if (!fs.existsSync(cmdDir)) return;
|
|
104
|
+
for (const f of fs.readdirSync(cmdDir)) writeFile(path.join(destDir, f), fs.readFileSync(path.join(cmdDir, f), 'utf8'));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// ---- adapters (keep the methodology single-source — these POINT at it) ------
|
|
108
|
+
|
|
109
|
+
function adapterClaude() {
|
|
110
|
+
const HOOKS = {
|
|
111
|
+
SessionStart: [{ matcher: 'startup|clear|compact', hooks: [{ type: 'command', command: 'bash .claude/hooks/session-start.sh' }] }],
|
|
112
|
+
PreCompact: [{ matcher: 'auto|manual', hooks: [{ type: 'command', command: 'bash .claude/hooks/pre-compact.sh' }] }],
|
|
113
|
+
SubagentStop: [{ hooks: [{ type: 'command', command: 'bash .claude/hooks/subagent-stop.sh' }] }],
|
|
114
|
+
};
|
|
115
|
+
const sp = path.join(CWD, '.claude', 'settings.json');
|
|
116
|
+
let settings = {};
|
|
117
|
+
if (fs.existsSync(sp)) { try { settings = JSON.parse(fs.readFileSync(sp, 'utf8')); } catch (_) { warnings.push('.claude/settings.json is not valid JSON — skipped hook merge'); settings = null; } }
|
|
118
|
+
if (!settings) return;
|
|
119
|
+
settings.hooks = settings.hooks || {};
|
|
120
|
+
const added = [];
|
|
121
|
+
for (const k of Object.keys(HOOKS)) if (!settings.hooks[k]) { settings.hooks[k] = HOOKS[k]; added.push(k); }
|
|
122
|
+
if (added.length) { log(` + .claude/settings.json hooks: ${added.join(', ')}`); if (!DRY) { fs.mkdirSync(path.dirname(sp), { recursive: true }); fs.writeFileSync(sp, JSON.stringify(settings, null, 2) + '\n'); } }
|
|
123
|
+
else log(' = .claude/settings.json hooks already present');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function adapterCodex() {
|
|
127
|
+
warnings.push('codex: AGENTS.md is read natively. Lifecycle hooks unsupported (rituals model-run); subagents in .claude/agents/ are read as reference, not isolated contexts.');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function adapterCursor() {
|
|
131
|
+
writeFile('.cursor/rules/istartsoftflow.mdc', [
|
|
132
|
+
'---', 'description: iStartSoftFlow workflow — always apply', 'alwaysApply: true', '---', '',
|
|
133
|
+
'Run the **iStartSoftFlow** workflow. The full, single-source methodology is',
|
|
134
|
+
'`.claude/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles live in',
|
|
135
|
+
'`.claude/agents/` (Cursor reads them natively); procedures in `.cursor/commands/`',
|
|
136
|
+
'(mirror of `.claude/commands/`). Caveman ULTRA mode; apply the `karpathy-guidelines`',
|
|
137
|
+
'and `ux-design` skills. See `AGENTS.md` for the role/command/skill map.', '',
|
|
138
|
+
].join('\n'));
|
|
139
|
+
copyTemplateCommands('.cursor/commands');
|
|
140
|
+
writeFile('.cursor/hooks.json', JSON.stringify({
|
|
141
|
+
version: 1,
|
|
142
|
+
hooks: {
|
|
143
|
+
sessionStart: [{ command: 'bash .claude/hooks/session-start.sh' }],
|
|
144
|
+
subagentStop: [{ command: 'bash .claude/hooks/subagent-stop.sh' }],
|
|
145
|
+
},
|
|
146
|
+
}, null, 2) + '\n');
|
|
147
|
+
warnings.push('cursor: PreCompact has no Cursor equivalent (snapshot ritual degrades to model-run); verify hooks.json against cursor.com/docs/hooks — the schema evolves.');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function adapterGemini() {
|
|
151
|
+
writeFile('GEMINI.md', [
|
|
152
|
+
'# GEMINI.md — iStartSoftFlow', '',
|
|
153
|
+
'This repo runs the **iStartSoftFlow** agentic dev workflow. The complete,',
|
|
154
|
+
'tool-agnostic methodology (the single source of truth) lives in',
|
|
155
|
+
'`.claude/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles are in',
|
|
156
|
+
'`.claude/agents/`, procedures in `.claude/commands/` (run their bodies as prompts),',
|
|
157
|
+
'skills in `.claude/skills/` (read on demand). See `AGENTS.md` for the full map.', '',
|
|
158
|
+
'Lifecycle hooks do not auto-fire in Gemini CLI — run the SESSION-OPEN ritual',
|
|
159
|
+
'(git state, docs/STATE.md, docs/ISSUES.md) yourself at the start of each session.', '',
|
|
160
|
+
].join('\n'));
|
|
161
|
+
warnings.push('gemini: lifecycle hooks unsupported — SESSION-OPEN / PreCompact rituals are model-run (see GEMINI.md).');
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function adapterAider() {
|
|
165
|
+
writeFile('.aider.conf.yml', [
|
|
166
|
+
'# iStartSoftFlow — load the methodology as conventions.',
|
|
167
|
+
'# Aider has no lifecycle hooks/subagents; the workflow degrades to model-run rituals.',
|
|
168
|
+
'read:',
|
|
169
|
+
' - AGENTS.md',
|
|
170
|
+
' - .claude/istartsoft-flow/METHODOLOGY.md',
|
|
171
|
+
'',
|
|
172
|
+
].join('\n'));
|
|
173
|
+
warnings.push('aider: hooks + named subagents unsupported — the loop runs as a single-agent, model-driven workflow.');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const ADAPTERS = { claude: adapterClaude, codex: adapterCodex, cursor: adapterCursor, gemini: adapterGemini, aider: adapterAider };
|
|
177
|
+
|
|
178
|
+
const NEXT_STEPS = {
|
|
179
|
+
claude: 'Open Claude Code — the SessionStart hook fires automatically. Run /overview to bootstrap.',
|
|
180
|
+
codex: 'Open Codex CLI — it reads AGENTS.md. Start by running the /overview procedure (.claude/commands/overview.md).',
|
|
181
|
+
cursor: 'Open Cursor — the rule applies automatically. Run the /overview command to bootstrap.',
|
|
182
|
+
gemini: 'Open Gemini CLI — it reads GEMINI.md. Run the SESSION-OPEN ritual, then the overview procedure.',
|
|
183
|
+
aider: 'Run aider — it loads AGENTS.md + METHODOLOGY.md. Drive the loop manually (overview -> phase).',
|
|
184
|
+
all: 'Open your tool of choice — AGENTS.md is the shared entry. Run /overview to bootstrap.',
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
function agentsMd() {
|
|
188
|
+
return [
|
|
189
|
+
'# AGENTS.md — iStartSoftFlow', '',
|
|
190
|
+
'This repo runs the **iStartSoftFlow** agentic dev workflow. The complete,',
|
|
191
|
+
'tool-agnostic methodology — the loop, roles, procedures, rituals, and hard',
|
|
192
|
+
'rules — lives in ONE file. Read it before acting:', '',
|
|
193
|
+
'> **`.claude/istartsoft-flow/METHODOLOGY.md`** ← single source of truth.', '',
|
|
194
|
+
'Do not restate its rules elsewhere; this file only indexes it (anti-drift invariant).', '',
|
|
195
|
+
'## The loop', '',
|
|
196
|
+
'design-research → grill ×2 → plan → implement → test → deploy — one VERTICAL',
|
|
197
|
+
'SLICE per phase. Phase 0 (infra) leads only when infra is self-managed.', '',
|
|
198
|
+
'## Roles — `.claude/agents/`', '',
|
|
199
|
+
'planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer', '',
|
|
200
|
+
'## Procedures — `.claude/commands/` (run as `/name`)', '',
|
|
201
|
+
'/overview · /phase · /quick · /replan · /synthesize · /store-wisdom · /log-issue · /log-decision · /unstuck', '',
|
|
202
|
+
'## Skills — `.claude/skills/` (loaded on demand)', '',
|
|
203
|
+
'caveman · grill-me · karpathy-guidelines · ux-design', '',
|
|
204
|
+
'## Hard-rule index (full text in METHODOLOGY.md)', '',
|
|
205
|
+
'1 grep ISSUES + research before debugging · 2 debug cap = 3 · 3 log every fix ·',
|
|
206
|
+
'4 synthesize + context-reset per phase · 5 phase gate = real suite green ·',
|
|
207
|
+
'6 blind tests (RED-first) · 7 programmatic E2E auth · 8 log-decision on arch change ·',
|
|
208
|
+
'9 UI conforms to the `ux-design` cookbook + wireframe frame · 10 no-rationalization.', '',
|
|
209
|
+
'## Your stack', '',
|
|
210
|
+
'Declare your stack (language, framework, infra, auth, test + E2E runner,',
|
|
211
|
+
'planning source) once in `docs/OVERVIEW.md`. Every rule references *your declared',
|
|
212
|
+
'stack* and hardcodes none.', '',
|
|
213
|
+
].join('\n');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ---- main -------------------------------------------------------------------
|
|
217
|
+
|
|
218
|
+
function main() {
|
|
219
|
+
if (HELP) { printHelp(); return; }
|
|
220
|
+
if (!fs.existsSync(path.join(TPL, '.claude'))) {
|
|
221
|
+
console.error('create-issflow: embedded template/ missing. From source run: bash build.sh');
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const TOOL = pickTool();
|
|
226
|
+
const targets = TOOL === 'all' ? Object.keys(TOOLS).filter(t => t !== 'all') : [TOOL];
|
|
227
|
+
|
|
228
|
+
// 1. portable kit tree (.claude/) — every tool gets it.
|
|
229
|
+
for (const src of walk(path.join(TPL, '.claude'))) {
|
|
230
|
+
const rel = path.relative(TPL, src);
|
|
231
|
+
const isHook = rel.includes(`${path.sep}hooks${path.sep}`) && rel.endsWith('.sh');
|
|
232
|
+
writeFile(rel, fs.readFileSync(src, 'utf8'), { exec: isHook });
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// 2. AGENTS.md — the open-standard entry point.
|
|
236
|
+
writeFile('AGENTS.md', agentsMd());
|
|
237
|
+
|
|
238
|
+
// 3. per-tool adapters
|
|
239
|
+
for (const t of targets) ADAPTERS[t]();
|
|
240
|
+
|
|
241
|
+
// 4. .gitignore: track the workflow dirs if .claude/* is ignored
|
|
242
|
+
const gi = path.join(CWD, '.gitignore');
|
|
243
|
+
if (fs.existsSync(gi)) {
|
|
244
|
+
const txt = fs.readFileSync(gi, 'utf8');
|
|
245
|
+
if (/^\.claude\/\*\s*$/m.test(txt) && !txt.includes('!.claude/agents/')) {
|
|
246
|
+
const block = '\n# iStartSoftFlow workflow — track as project config\n!.claude/agents/\n!.claude/commands/\n!.claude/skills/\n!.claude/hooks/\n!.claude/istartsoft-flow/\n';
|
|
247
|
+
log(' + .gitignore: un-ignore .claude workflow dirs');
|
|
248
|
+
if (!DRY) fs.appendFileSync(gi, block);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
log('');
|
|
253
|
+
log(`iStartSoftFlow ${DRY ? '(dry-run) ' : ''}[${TOOL}] done — created ${created}, conflicts ${conflicts}, unchanged ${skipped}.`);
|
|
254
|
+
if (conflicts) log('Review *.issflow-new files and merge manually (your originals were untouched).');
|
|
255
|
+
for (const w of warnings) log(` ! ${w}`);
|
|
256
|
+
log(NEXT_STEPS[TOOL] || NEXT_STEPS.claude);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "create-issflow",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Scaffold the iStartSoftFlow AI-coding workflow
|
|
5
|
-
"bin": {
|
|
6
|
-
"create-issflow": "bin/cli.js"
|
|
7
|
-
},
|
|
8
|
-
"files": [
|
|
9
|
-
"bin/",
|
|
10
|
-
"template/"
|
|
11
|
-
],
|
|
12
|
-
"engines": {
|
|
13
|
-
"node": ">=18"
|
|
14
|
-
},
|
|
15
|
-
"keywords": [
|
|
16
|
-
"claude-code",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "create-issflow",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Scaffold the iStartSoftFlow AI-coding workflow into a project. Stack-agnostic, tool-agnostic (Claude Code, Codex, Cursor, Gemini, Aider), non-destructive.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"create-issflow": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"template/"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"claude-code",
|
|
17
|
+
"codex",
|
|
18
|
+
"cursor",
|
|
19
|
+
"gemini-cli",
|
|
20
|
+
"aider",
|
|
21
|
+
"agents-md",
|
|
22
|
+
"agents",
|
|
23
|
+
"tdd",
|
|
24
|
+
"workflow",
|
|
25
|
+
"istartsoftflow"
|
|
26
|
+
],
|
|
27
|
+
"license": "MIT"
|
|
28
|
+
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: debugger
|
|
3
|
-
description: Diagnoses one specific failing test or bug in an ISOLATED context. Keeps debug noise out of the main session.
|
|
4
|
-
tools: Read, Grep, Glob, Edit, Bash, Write
|
|
5
|
-
model: opus
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
You are the DEBUGGER. Caveman ULTRA mode.
|
|
9
|
-
|
|
10
|
-
Why you exist: debugging generates huge noisy context. Running it isolated +
|
|
11
|
-
writing noise to a file keeps the orchestrator's context clean.
|
|
12
|
-
|
|
13
|
-
START — check what is already known:
|
|
14
|
-
1. grep docs/ISSUES.md for this error. Found -> apply known solution. Done.
|
|
15
|
-
2. grep docs/research/INDEX.md. If a prior debug-*.md exists, READ IT FIRST —
|
|
16
|
-
lists hypotheses already ruled out. Do not repeat them.
|
|
17
|
-
|
|
18
|
-
PROCESS:
|
|
19
|
-
3. Reproduce. Form ONE hypothesis. State it before changing anything.
|
|
20
|
-
4. SERVICE-vs-LOGIC triage: if external service involved, determine
|
|
21
|
-
SERVICE UNAVAILABLE vs LOGIC FAIL first. SERVICE UNAVAILABLE -> stop,
|
|
22
|
-
return that status. Do NOT spend attempt budget on outages.
|
|
23
|
-
5. Fix. Verify the fix runs (lint/typecheck/test). Report the REAL root cause.
|
|
24
|
-
6. If fix attempt fails: form a NEW hypothesis (not a variation). Budget = 3 total.
|
|
25
|
-
WARN at attempt 2: "2 attempts failed, 1 remaining. Hypotheses: <1>, <2>."
|
|
26
|
-
STUCK at attempt 3: stop, return STUCK.
|
|
27
|
-
|
|
28
|
-
WRITE-TO-FILE:
|
|
29
|
-
Write full trace to `docs/research/debug-<slug>.md`. Include:
|
|
30
|
-
- the failing test / symptom
|
|
31
|
-
- every hypothesis tried
|
|
32
|
-
- evidence that ruled each one out
|
|
33
|
-
- current best hypothesis if STUCK
|
|
34
|
-
Append one line to docs/research/INDEX.md.
|
|
35
|
-
|
|
36
|
-
RETURN (terse):
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
DEBUG DONE: <slug>
|
|
40
|
-
|
|
41
|
-
- result: FIXED | STUCK | SERVICE UNAVAILABLE | WARN
|
|
42
|
-
- root cause (if fixed): <real cause>
|
|
43
|
-
- fix applied: <what changed>
|
|
44
|
-
- if STUCK: 3 hypotheses tried = <list>, current best guess = <…>
|
|
45
|
-
- full trace: docs/research/debug-<slug>.md
|
|
46
|
-
|
|
47
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: debugger
|
|
3
|
+
description: Diagnoses one specific failing test or bug in an ISOLATED context. Keeps debug noise out of the main session.
|
|
4
|
+
tools: Read, Grep, Glob, Edit, Bash, Write
|
|
5
|
+
model: opus
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are the DEBUGGER. Caveman ULTRA mode.
|
|
9
|
+
|
|
10
|
+
Why you exist: debugging generates huge noisy context. Running it isolated +
|
|
11
|
+
writing noise to a file keeps the orchestrator's context clean.
|
|
12
|
+
|
|
13
|
+
START — check what is already known:
|
|
14
|
+
1. grep docs/ISSUES.md for this error. Found -> apply known solution. Done.
|
|
15
|
+
2. grep docs/research/INDEX.md. If a prior debug-*.md exists, READ IT FIRST —
|
|
16
|
+
lists hypotheses already ruled out. Do not repeat them.
|
|
17
|
+
|
|
18
|
+
PROCESS:
|
|
19
|
+
3. Reproduce. Form ONE hypothesis. State it before changing anything.
|
|
20
|
+
4. SERVICE-vs-LOGIC triage: if external service involved, determine
|
|
21
|
+
SERVICE UNAVAILABLE vs LOGIC FAIL first. SERVICE UNAVAILABLE -> stop,
|
|
22
|
+
return that status. Do NOT spend attempt budget on outages.
|
|
23
|
+
5. Fix. Verify the fix runs (lint/typecheck/test). Report the REAL root cause.
|
|
24
|
+
6. If fix attempt fails: form a NEW hypothesis (not a variation). Budget = 3 total.
|
|
25
|
+
WARN at attempt 2: "2 attempts failed, 1 remaining. Hypotheses: <1>, <2>."
|
|
26
|
+
STUCK at attempt 3: stop, return STUCK.
|
|
27
|
+
|
|
28
|
+
WRITE-TO-FILE:
|
|
29
|
+
Write full trace to `docs/research/debug-<slug>.md`. Include:
|
|
30
|
+
- the failing test / symptom
|
|
31
|
+
- every hypothesis tried
|
|
32
|
+
- evidence that ruled each one out
|
|
33
|
+
- current best hypothesis if STUCK
|
|
34
|
+
Append one line to docs/research/INDEX.md.
|
|
35
|
+
|
|
36
|
+
RETURN (terse):
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
DEBUG DONE: <slug>
|
|
40
|
+
|
|
41
|
+
- result: FIXED | STUCK | SERVICE UNAVAILABLE | WARN
|
|
42
|
+
- root cause (if fixed): <real cause>
|
|
43
|
+
- fix applied: <what changed>
|
|
44
|
+
- if STUCK: 3 hypotheses tried = <list>, current best guess = <…>
|
|
45
|
+
- full trace: docs/research/debug-<slug>.md
|
|
46
|
+
|
|
47
|
+
```
|