create-issflow 1.8.1 → 1.9.1

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.
Files changed (67) hide show
  1. package/README.md +5 -5
  2. package/bin/cli.js +60 -52
  3. package/package.json +1 -1
  4. package/template/.issflow/README.md +36 -0
  5. package/template/{.claude → .issflow}/commands/change-request.md +3 -2
  6. package/template/{.claude → .issflow}/commands/design.md +2 -2
  7. package/template/{.claude → .issflow}/commands/feature.md +2 -2
  8. package/template/{.claude → .issflow}/commands/propose.md +80 -18
  9. package/template/{.claude → .issflow}/commands/security-audit.md +1 -1
  10. package/template/{.claude → .issflow}/commands/store-wisdom.md +3 -3
  11. package/template/{.claude → .issflow}/commands/ui-audit.md +1 -1
  12. package/template/.issflow/flow-config.json +12 -0
  13. package/template/{.claude → .issflow}/hooks/context-guard.js +2 -2
  14. package/template/{.claude → .issflow}/hooks/lib/ctx.js +1 -1
  15. package/template/{.claude → .issflow}/hooks/plan-gate.js +1 -1
  16. package/template/{.claude → .issflow}/hooks/session-start.js +2 -2
  17. package/template/{.claude → .issflow}/istartsoft-flow/METHODOLOGY.md +40 -37
  18. package/template/{.claude → .issflow}/templates/automation/Dockerfile +1 -1
  19. package/template/{.claude → .issflow}/templates/automation/feature-docker.js +2 -2
  20. package/template/.issflow/templates/proposal.html +204 -0
  21. package/template/.claude/README.md +0 -33
  22. package/template/.claude/templates/proposal.html +0 -113
  23. /package/template/{.claude → .issflow}/agents/debugger.md +0 -0
  24. /package/template/{.claude → .issflow}/agents/e2e-runner.md +0 -0
  25. /package/template/{.claude → .issflow}/agents/implementer.md +0 -0
  26. /package/template/{.claude → .issflow}/agents/planner.md +0 -0
  27. /package/template/{.claude → .issflow}/agents/researcher.md +0 -0
  28. /package/template/{.claude → .issflow}/agents/synthesizer.md +0 -0
  29. /package/template/{.claude → .issflow}/agents/test-author.md +0 -0
  30. /package/template/{.claude → .issflow}/commands/goal.md +0 -0
  31. /package/template/{.claude → .issflow}/commands/log-decision.md +0 -0
  32. /package/template/{.claude → .issflow}/commands/log-issue.md +0 -0
  33. /package/template/{.claude → .issflow}/commands/overview.md +0 -0
  34. /package/template/{.claude → .issflow}/commands/phase.md +0 -0
  35. /package/template/{.claude → .issflow}/commands/qa-audit.md +0 -0
  36. /package/template/{.claude → .issflow}/commands/quick.md +0 -0
  37. /package/template/{.claude → .issflow}/commands/release.md +0 -0
  38. /package/template/{.claude → .issflow}/commands/replan.md +0 -0
  39. /package/template/{.claude → .issflow}/commands/runbook.md +0 -0
  40. /package/template/{.claude → .issflow}/commands/sprint.md +0 -0
  41. /package/template/{.claude → .issflow}/commands/support.md +0 -0
  42. /package/template/{.claude → .issflow}/commands/synthesize.md +0 -0
  43. /package/template/{.claude → .issflow}/commands/uat.md +0 -0
  44. /package/template/{.claude → .issflow}/commands/unstuck.md +0 -0
  45. /package/template/{.claude → .issflow}/hooks/feature-gate.js +0 -0
  46. /package/template/{.claude → .issflow}/hooks/pre-compact.js +0 -0
  47. /package/template/{.claude → .issflow}/hooks/subagent-stop.js +0 -0
  48. /package/template/{.claude → .issflow}/skills/caveman/SKILL.md +0 -0
  49. /package/template/{.claude → .issflow}/skills/code-standards/SKILL.md +0 -0
  50. /package/template/{.claude → .issflow}/skills/code-standards/references/architecture.md +0 -0
  51. /package/template/{.claude → .issflow}/skills/code-standards/references/naming.md +0 -0
  52. /package/template/{.claude → .issflow}/skills/grill-me/SKILL.md +0 -0
  53. /package/template/{.claude → .issflow}/skills/karpathy-guidelines/SKILL.md +0 -0
  54. /package/template/{.claude → .issflow}/skills/security/SKILL.md +0 -0
  55. /package/template/{.claude → .issflow}/skills/security/references/pentest-checklist.md +0 -0
  56. /package/template/{.claude → .issflow}/skills/security/references/secure-coding.md +0 -0
  57. /package/template/{.claude → .issflow}/skills/security/references/standards.md +0 -0
  58. /package/template/{.claude → .issflow}/skills/security/references/threat-modeling.md +0 -0
  59. /package/template/{.claude → .issflow}/skills/support-triage/SKILL.md +0 -0
  60. /package/template/{.claude → .issflow}/skills/ux-design/SKILL.md +0 -0
  61. /package/template/{.claude → .issflow}/skills/ux-design/references/wireframe-template.md +0 -0
  62. /package/template/{.claude → .issflow}/templates/ARCHITECTURE-template.md +0 -0
  63. /package/template/{.claude → .issflow}/templates/CR-template.md +0 -0
  64. /package/template/{.claude → .issflow}/templates/FEATURE-template.md +0 -0
  65. /package/template/{.claude → .issflow}/templates/UX-PACK-template.md +0 -0
  66. /package/template/{.claude → .issflow}/templates/automation/issflow-feature.yml +0 -0
  67. /package/template/{.claude → .issflow}/templates/automation/issflow-goal.yml +0 -0
package/README.md CHANGED
@@ -28,7 +28,7 @@ Flags:
28
28
 
29
29
  ## What it installs
30
30
 
31
- The portable kit (every tool) in `<project>/.claude/`:
31
+ The portable kit (every tool) in `<project>/.issflow/`:
32
32
 
33
33
  - `agents/` — planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer
34
34
  - `commands/` — `/overview` `/feature` `/goal` `/propose` `/phase` `/sprint` `/ui-audit` `/qa-audit` `/security-audit` `/release` `/uat` `/change-request` `/replan` `/quick` `/synthesize` `/runbook` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
@@ -44,10 +44,10 @@ Plus a root **`AGENTS.md`** (open standard — primary entry) and the per-tool a
44
44
  | `cursor` | `.cursor/rules/` + `.cursor/commands/` + `.cursor/hooks.json` |
45
45
  | `gemini` | `GEMINI.md` pointer |
46
46
  | `aider` | `.aider.conf.yml` that loads the methodology |
47
- | `claude` | thin `CLAUDE.md` (`@AGENTS.md`) + merges hooks into `.claude/settings.json` |
47
+ | `claude` | thin `CLAUDE.md` (`@AGENTS.md`) + `.claude/` kit mirror + merges hooks into `.claude/settings.json` (hooks run from `.issflow/`) |
48
48
  | `all` | every adapter above |
49
49
 
50
- It also un-ignores the workflow dirs in `.gitignore` if `.claude/*` was ignored.
50
+ It also un-ignores the workflow dirs in `.gitignore` if `.issflow/*` was ignored.
51
51
 
52
52
  ## Loop
53
53
 
@@ -58,10 +58,10 @@ PRD / architecture / stories (e.g. BMAD / iSSM).
58
58
 
59
59
  ## Maintainers
60
60
 
61
- The kit lives in the repo's `.claude/`. After editing it, run `npm run build`
61
+ The kit lives in the repo's `.issflow/`. After editing it, run `npm run build`
62
62
  (pure Node — cmd / PowerShell / sh) to refresh `template/`, then `npm version patch`
63
63
  and `npm publish`. `prepublishOnly` rebuilds `template/` on publish automatically.
64
64
 
65
65
  Everything is cross-platform: the installer and `build.js` are pure Node, and the
66
- lifecycle hooks are Node scripts (`node .claude/hooks/*.js`) — no bash/jq/python,
66
+ lifecycle hooks are Node scripts (`node .issflow/hooks/*.js`) — no bash/jq/python,
67
67
  so the kit runs the same on macOS, Windows, and Linux.
package/bin/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // current project. Pure Node, zero deps, cross-platform, NON-DESTRUCTIVE:
4
4
  // never overwrites an existing file — on conflict it writes `<file>.issflow-new`.
5
5
  //
6
- // Tool-agnostic: the portable kit lives in `.claude/` and the methodology is the
6
+ // Tool-agnostic: the portable kit lives in `.issflow/` and the methodology is the
7
7
  // single source of truth. `--tool=<name>` writes the right adapter so the same
8
8
  // kit drives Claude Code, Codex, Cursor, Gemini CLI, Aider, or any AGENTS.md tool.
9
9
  'use strict';
@@ -23,7 +23,7 @@ const toolArg = (argv.find(a => a.startsWith('--tool=')) || '').split('=')[1];
23
23
  const TOOLS = {
24
24
  claude: 'Claude Code (Anthropic) — full: subagents, lifecycle hooks, skills',
25
25
  codex: 'OpenAI Codex CLI — AGENTS.md native; subagents/skills as readable files',
26
- cursor: 'Cursor — .cursor/rules + commands + hooks; reads .claude/agents natively',
26
+ cursor: 'Cursor — .cursor/rules + commands + hooks; kit stays in .issflow/ (no .claude/)',
27
27
  gemini: 'Google Gemini CLI — GEMINI.md pointer; commands/skills as readable files',
28
28
  aider: 'Aider — .aider.conf.yml loads the methodology as conventions',
29
29
  all: 'Write every adapter above (mixed-team repo)',
@@ -50,10 +50,10 @@ Flags:
50
50
  --force overwrite existing kit files (default keeps yours -> <file>.issflow-new)
51
51
  -h, --help this message
52
52
 
53
- Every tool installs the portable kit in .claude/ + a root AGENTS.md (the open
54
- standard — primary entry for most hosts). The full methodology lives in
55
- .claude/istartsoft-flow/METHODOLOGY.md. Claude Code also gets a thin CLAUDE.md
56
- shim (@AGENTS.md) because that host only auto-loads CLAUDE.md.`);
53
+ Every tool installs the portable kit in .issflow/ + a root AGENTS.md (open
54
+ standard). Methodology: .issflow/istartsoft-flow/METHODOLOGY.md.
55
+ Claude Code ONLY (--tool=claude|all) also gets a .claude/ mirror + CLAUDE.md
56
+ shim — other tools do not create .claude/.`);
57
57
  }
58
58
 
59
59
  // Typo / alias map → canonical TOOLS key
@@ -98,33 +98,38 @@ function walk(dir) {
98
98
  }
99
99
 
100
100
  function copyTemplateCommands(destDir) {
101
- const cmdDir = path.join(TPL, '.claude', 'commands');
101
+ const cmdDir = path.join(TPL, '.issflow', 'commands');
102
102
  if (!fs.existsSync(cmdDir)) return;
103
103
  for (const f of fs.readdirSync(cmdDir)) writeFile(path.join(destDir, f), fs.readFileSync(path.join(cmdDir, f), 'utf8'));
104
104
  }
105
105
 
106
+ /** Claude Code loads commands/agents/skills from `.claude/`. Mirror the
107
+ * portable `.issflow/` kit there (Claude adapter only — Cursor never gets this). */
108
+ function materializeClaudeMirror() {
109
+ const kitTpl = path.join(TPL, '.issflow');
110
+ for (const src of walk(kitTpl)) {
111
+ const rel = path.relative(kitTpl, src);
112
+ writeFile(path.join('.claude', rel), fs.readFileSync(src, 'utf8'));
113
+ }
114
+ }
115
+
106
116
  // ---- adapters (keep the methodology single-source — these POINT at it) ------
107
117
 
108
118
  function adapterClaude() {
109
- // Claude Code auto-loads CLAUDE.md only — NOT AGENTS.md. Without a CLAUDE.md
110
- // the methodology never enters context on its own (the SessionStart hook still
111
- // injects the per-session summary, but the full single-source doc would not
112
- // load). A one-line `@AGENTS.md` import gives Claude Code the full baseline
113
- // while keeping ONE source of truth — no rule is restated here (anti-drift).
119
+ // Claude Code: needs CLAUDE.md auto-load + native `.claude/` tree for
120
+ // commands/agents/skills discovery. Portable SoT remains `.issflow/`;
121
+ // hooks execute from `.issflow/` (single source).
114
122
  const c0 = conflicts;
115
123
  writeFile('CLAUDE.md', claudeMd());
116
124
  if (conflicts > c0) warnings.push('claude: you already keep a CLAUDE.md — ours was written as CLAUDE.md.issflow-new. Add a line `@AGENTS.md` to your CLAUDE.md so the methodology auto-loads.');
117
- // Context-budget watchdog config (consumed by .claude/hooks/context-guard.js).
118
- // Shipped default window:0 = auto-detect; flow-config.json lives at .claude root,
119
- // outside build.js's copied DIRS, so the installer writes it here.
120
- writeFile('.claude/flow-config.json', flowConfig());
125
+ materializeClaudeMirror();
121
126
  const HOOKS = {
122
- SessionStart: [{ matcher: 'startup|clear|compact', hooks: [{ type: 'command', command: 'node .claude/hooks/session-start.js' }] }],
123
- PreToolUse: [{ matcher: '*', hooks: [{ type: 'command', command: 'node .claude/hooks/context-guard.js' }] },
124
- { matcher: 'Edit|Write|MultiEdit|NotebookEdit', hooks: [{ type: 'command', command: 'node .claude/hooks/plan-gate.js' }] }],
125
- PreCompact: [{ matcher: 'auto|manual', hooks: [{ type: 'command', command: 'node .claude/hooks/pre-compact.js' }] }],
126
- SubagentStop: [{ hooks: [{ type: 'command', command: 'node .claude/hooks/subagent-stop.js' }] }],
127
- Stop: [{ hooks: [{ type: 'command', command: 'node .claude/hooks/feature-gate.js' }] }],
127
+ SessionStart: [{ matcher: 'startup|clear|compact', hooks: [{ type: 'command', command: 'node .issflow/hooks/session-start.js' }] }],
128
+ PreToolUse: [{ matcher: '*', hooks: [{ type: 'command', command: 'node .issflow/hooks/context-guard.js' }] },
129
+ { matcher: 'Edit|Write|MultiEdit|NotebookEdit', hooks: [{ type: 'command', command: 'node .issflow/hooks/plan-gate.js' }] }],
130
+ PreCompact: [{ matcher: 'auto|manual', hooks: [{ type: 'command', command: 'node .issflow/hooks/pre-compact.js' }] }],
131
+ SubagentStop: [{ hooks: [{ type: 'command', command: 'node .issflow/hooks/subagent-stop.js' }] }],
132
+ Stop: [{ hooks: [{ type: 'command', command: 'node .issflow/hooks/feature-gate.js' }] }],
128
133
  };
129
134
  const sp = path.join(CWD, '.claude', 'settings.json');
130
135
  let settings = {};
@@ -135,27 +140,28 @@ function adapterClaude() {
135
140
  for (const k of Object.keys(HOOKS)) if (!settings.hooks[k]) { settings.hooks[k] = HOOKS[k]; added.push(k); }
136
141
  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'); } }
137
142
  else log(' = .claude/settings.json hooks already present');
143
+ warnings.push('claude: portable SoT is .issflow/ — .claude/ is a host mirror; refresh with create-issflow --tool=claude after kit edits.');
138
144
  }
139
145
 
140
146
  function adapterCodex() {
141
- 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.');
147
+ warnings.push('codex: AGENTS.md is read natively. Lifecycle hooks unsupported (rituals model-run); subagents in .issflow/agents/ are read as reference, not isolated contexts.');
142
148
  }
143
149
 
144
150
  function adapterCursor() {
145
151
  writeFile('.cursor/rules/istartsoftflow.mdc', [
146
152
  '---', 'description: iStartSoftFlow workflow — always apply', 'alwaysApply: true', '---', '',
147
153
  'Run the **iStartSoftFlow** workflow. The full, single-source methodology is',
148
- '`.claude/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles live in',
149
- '`.claude/agents/` (Cursor reads them natively); procedures in `.cursor/commands/`',
150
- '(mirror of `.claude/commands/`). Caveman ULTRA mode; apply the `karpathy-guidelines`',
154
+ '`.issflow/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles live in',
155
+ '`.issflow/agents/` (Cursor reads them natively); procedures in `.cursor/commands/`',
156
+ '(mirror of `.issflow/commands/`). Caveman ULTRA mode; apply the `karpathy-guidelines`',
151
157
  'and `ux-design` skills. See `AGENTS.md` for the role/command/skill map.', '',
152
158
  ].join('\n'));
153
159
  copyTemplateCommands('.cursor/commands');
154
160
  writeFile('.cursor/hooks.json', JSON.stringify({
155
161
  version: 1,
156
162
  hooks: {
157
- sessionStart: [{ command: 'node .claude/hooks/session-start.js' }],
158
- subagentStop: [{ command: 'node .claude/hooks/subagent-stop.js' }],
163
+ sessionStart: [{ command: 'node .issflow/hooks/session-start.js' }],
164
+ subagentStop: [{ command: 'node .issflow/hooks/subagent-stop.js' }],
159
165
  },
160
166
  }, null, 2) + '\n');
161
167
  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.');
@@ -166,9 +172,9 @@ function adapterGemini() {
166
172
  '# GEMINI.md — iStartSoftFlow', '',
167
173
  'This repo runs the **iStartSoftFlow** agentic dev workflow. The complete,',
168
174
  'tool-agnostic methodology (the single source of truth) lives in',
169
- '`.claude/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles are in',
170
- '`.claude/agents/`, procedures in `.claude/commands/` (run their bodies as prompts),',
171
- 'skills in `.claude/skills/` (read on demand). See `AGENTS.md` for the full map.', '',
175
+ '`.issflow/istartsoft-flow/METHODOLOGY.md` — read it before acting. Roles are in',
176
+ '`.issflow/agents/`, procedures in `.issflow/commands/` (run their bodies as prompts),',
177
+ 'skills in `.issflow/skills/` (read on demand). See `AGENTS.md` for the full map.', '',
172
178
  'Lifecycle hooks do not auto-fire in Gemini CLI — run the SESSION-OPEN ritual',
173
179
  '(git state, docs/STATE.md, docs/ISSUES.md) yourself at the start of each session.', '',
174
180
  ].join('\n'));
@@ -181,7 +187,7 @@ function adapterAider() {
181
187
  '# Aider has no lifecycle hooks/subagents; the workflow degrades to model-run rituals.',
182
188
  'read:',
183
189
  ' - AGENTS.md',
184
- ' - .claude/istartsoft-flow/METHODOLOGY.md',
190
+ ' - .issflow/istartsoft-flow/METHODOLOGY.md',
185
191
  '',
186
192
  ].join('\n'));
187
193
  warnings.push('aider: hooks + named subagents unsupported — the loop runs as a single-agent, model-driven workflow.');
@@ -191,7 +197,7 @@ const ADAPTERS = { claude: adapterClaude, codex: adapterCodex, cursor: adapterCu
191
197
 
192
198
  const NEXT_STEPS = {
193
199
  claude: 'Open Claude Code — CLAUDE.md (@AGENTS.md) loads the methodology and the SessionStart hook fires automatically. Run /overview to bootstrap.',
194
- codex: 'Open Codex CLI — it reads AGENTS.md. Start by running the /overview procedure (.claude/commands/overview.md).',
200
+ codex: 'Open Codex CLI — it reads AGENTS.md. Start by running the /overview procedure (.issflow/commands/overview.md).',
195
201
  cursor: 'Open Cursor — the rule applies automatically. Run the /overview command to bootstrap.',
196
202
  gemini: 'Open Gemini CLI — it reads GEMINI.md. Run the SESSION-OPEN ritual, then the overview procedure.',
197
203
  aider: 'Run aider — it loads AGENTS.md + METHODOLOGY.md. Drive the loop manually (overview -> phase).',
@@ -204,23 +210,23 @@ function agentsMd() {
204
210
  'This repo runs the **iStartSoftFlow** agentic dev workflow.', '',
205
211
  '**Primary entry (this file).** The complete, tool-agnostic methodology — loop,',
206
212
  'roles, procedures, rituals, hard rules — lives in ONE place. Read before acting:', '',
207
- '> **`.claude/istartsoft-flow/METHODOLOGY.md`** ← single source of truth.', '',
208
- 'The portable kit lives in **`.claude/`** (folder name = host convention for',
209
- 'commands/agents/hooks — content is tool-agnostic; see `.claude/README.md`).',
210
- 'Do not restate METHODOLOGY rules elsewhere (anti-drift).', '',
213
+ '> **`.issflow/istartsoft-flow/METHODOLOGY.md`** ← single source of truth.', '',
214
+ 'The portable kit lives in **`.issflow/`** (commands, agents, hooks, skills,',
215
+ 'methodology — see `.issflow/README.md`). Host adapters (`.cursor/`, `CLAUDE.md`,',
216
+ '…) point at it. Do not restate METHODOLOGY rules elsewhere (anti-drift).', '',
211
217
  '## The loop', '',
212
218
  'design-research → grill ×2 → plan → (propose/design if quoted) → implement →',
213
219
  'test → deploy — one VERTICAL SLICE per phase. Phase 0 (infra) only when',
214
220
  'infra is self-managed.', '',
215
- '## Roles — `.claude/agents/`', '',
221
+ '## Roles — `.issflow/agents/`', '',
216
222
  'planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer', '',
217
- '## Procedures — `.claude/commands/` (run as `/name`)', '',
223
+ '## Procedures — `.issflow/commands/` (run as `/name`)', '',
218
224
  '**Default:** `/overview` · `/feature` · `/quick`', '',
219
225
  '**Advanced:** `/propose` · `/design` · `/support` · `/phase` · `/sprint` · `/goal` ·',
220
226
  '`/ui-audit` · `/qa-audit` · `/security-audit` · `/release` · `/uat` ·',
221
227
  '`/change-request` · `/replan` · `/synthesize` · `/runbook` · `/store-wisdom` ·',
222
228
  '`/log-issue` · `/log-decision` · `/unstuck`', '',
223
- '## Skills — `.claude/skills/` (loaded on demand)', '',
229
+ '## Skills — `.issflow/skills/` (loaded on demand)', '',
224
230
  'caveman · grill-me · karpathy-guidelines · ux-design · security · code-standards ·',
225
231
  'support-triage', '',
226
232
  '## Autonomy', '',
@@ -246,10 +252,12 @@ function claudeMd() {
246
252
  '@AGENTS.md', '',
247
253
  'Claude Code auto-loads **this filename only**. The import above is the real',
248
254
  'entry (`AGENTS.md` → METHODOLOGY). Do NOT restate rules here.', '',
249
- '## Host wiring (automatic — see `.claude/settings.json`)', '',
255
+ '## Host wiring', '',
256
+ '- **`.claude/`** is a mirror of `.issflow/` for command/agent/skill discovery.',
257
+ '- **Hooks** run from `.issflow/hooks/` (see `.claude/settings.json`).',
250
258
  '- **SessionStart** injects git state + `docs/STATE.md` + open `docs/ISSUES.md`.',
251
259
  '- **PreCompact** + **SubagentStop** rituals run automatically.',
252
- '- Commands in `.claude/commands/` → `/name`; agents in `.claude/agents/` → native subagents.', '',
260
+ '- Edit the kit in `.issflow/`, then re-run `create-issflow --tool=claude` to refresh the mirror.', '',
253
261
  ].join('\n');
254
262
  }
255
263
 
@@ -259,7 +267,7 @@ function flowConfig() {
259
267
  window: 0,
260
268
  warnPct: 60,
261
269
  gatePct: 78,
262
- _note: 'Context-budget watchdog (.claude/hooks/context-guard.js, PreToolUse hook). '
270
+ _note: 'Context-budget watchdog (.issflow/hooks/context-guard.js, PreToolUse hook). '
263
271
  + 'window 0 = auto-detect from the model id (200000 for standard models). '
264
272
  + 'Some 1M-context models report their id WITHOUT a [1m] tag, so auto-detect '
265
273
  + 'assumes 200000 and may false-gate around 156k — if you run a 1M model, set '
@@ -281,7 +289,7 @@ function flowConfig() {
281
289
 
282
290
  function main() {
283
291
  if (HELP) { printHelp(); return; }
284
- if (!fs.existsSync(path.join(TPL, '.claude'))) {
292
+ if (!fs.existsSync(path.join(TPL, '.issflow'))) {
285
293
  console.error('create-issflow: embedded template/ missing. From source run: npm run build');
286
294
  process.exit(1);
287
295
  }
@@ -289,14 +297,14 @@ function main() {
289
297
  const TOOL = pickTool();
290
298
  const targets = TOOL === 'all' ? Object.keys(TOOLS).filter(t => t !== 'all') : [TOOL];
291
299
 
292
- // 1. portable kit tree (.claude/) — every tool gets it.
293
- for (const src of walk(path.join(TPL, '.claude'))) {
300
+ // 1. portable kit tree (.issflow/) — every tool gets it.
301
+ for (const src of walk(path.join(TPL, '.issflow'))) {
294
302
  const rel = path.relative(TPL, src);
295
303
  writeFile(rel, fs.readFileSync(src, 'utf8'));
296
304
  }
297
305
 
298
306
  // 1b. integrity: confirm the methodology resolved on disk (load-bearing sentinel).
299
- const methPath = path.join(CWD, '.claude', 'istartsoft-flow', 'METHODOLOGY.md');
307
+ const methPath = path.join(CWD, '.issflow', 'istartsoft-flow', 'METHODOLOGY.md');
300
308
  const SENTINEL = 'ISTARTSOFTFLOW-AGENTS-SENTINEL-v2.0';
301
309
  if (!DRY && (!fs.existsSync(methPath) || !fs.readFileSync(methPath, 'utf8').includes(SENTINEL))) {
302
310
  warnings.push(`integrity: ${SENTINEL} not found in installed METHODOLOGY.md — the kit may be incomplete; re-run create-issflow (or npm run build from source).`);
@@ -309,7 +317,7 @@ function main() {
309
317
  for (const t of targets) ADAPTERS[t]();
310
318
 
311
319
  // 3b. headless feature lane (opt-in): materialize the automation templates.
312
- const autoDir = path.join(TPL, '.claude', 'templates', 'automation');
320
+ const autoDir = path.join(TPL, '.issflow', 'templates', 'automation');
313
321
  if (CI) {
314
322
  writeFile(path.join('.github', 'workflows', 'issflow-feature.yml'), fs.readFileSync(path.join(autoDir, 'issflow-feature.yml'), 'utf8'));
315
323
  writeFile(path.join('.github', 'workflows', 'issflow-goal.yml'), fs.readFileSync(path.join(autoDir, 'issflow-goal.yml'), 'utf8'));
@@ -319,13 +327,13 @@ function main() {
319
327
  writeFile(path.join('scripts', 'feature-docker.js'), fs.readFileSync(path.join(autoDir, 'feature-docker.js'), 'utf8'), { exec: true });
320
328
  }
321
329
 
322
- // 4. .gitignore: track the workflow dirs if .claude/* is ignored
330
+ // 4. .gitignore: track the workflow dirs if .issflow/* is ignored
323
331
  const gi = path.join(CWD, '.gitignore');
324
332
  if (fs.existsSync(gi)) {
325
333
  const txt = fs.readFileSync(gi, 'utf8');
326
- if (/^\.claude\/\*\s*$/m.test(txt) && !txt.includes('!.claude/agents/')) {
327
- 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';
328
- log(' + .gitignore: un-ignore .claude workflow dirs');
334
+ if (/^\.issflow\/\*\s*$/m.test(txt) && !txt.includes('!.issflow/agents/')) {
335
+ const block = '\n# iStartSoftFlow workflow — track as project config\n!.issflow/agents/\n!.issflow/commands/\n!.issflow/skills/\n!.issflow/hooks/\n!.issflow/istartsoft-flow/\n';
336
+ log(' + .gitignore: un-ignore .issflow workflow dirs');
329
337
  if (!DRY) fs.appendFileSync(gi, block);
330
338
  }
331
339
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-issflow",
3
- "version": "1.8.1",
3
+ "version": "1.9.1",
4
4
  "description": "Scaffold the iStartSoftFlow AI-coding workflow into a project. Stack-agnostic, tool-agnostic (Claude Code, Codex, Cursor, Gemini, Aider), non-destructive.",
5
5
  "bin": {
6
6
  "create-issflow": "bin/cli.js"
@@ -0,0 +1,36 @@
1
+ # `.issflow/` — portable iStartSoftFlow kit
2
+
3
+ This directory is the **portable workflow kit** (tool-agnostic). Every
4
+ `--tool=` install gets this tree. Host-specific adapters live **outside** it
5
+ (`.cursor/`, `CLAUDE.md` + `.claude/` mirror, `GEMINI.md`, …).
6
+
7
+ **Human entry (repo root):** `AGENTS.md` → indexes this kit.
8
+
9
+ **Rules SoT:** [`istartsoft-flow/METHODOLOGY.md`](./istartsoft-flow/METHODOLOGY.md)
10
+
11
+ ## Layout
12
+
13
+ | Path | What |
14
+ |------|------|
15
+ | `agents/` | Fresh-context workers (planner, researcher, implementer, …) |
16
+ | `commands/` | Procedures — Default: `/overview` `/feature` `/quick`; Advanced: `/propose` `/design` `/support` … |
17
+ | `skills/` | On-demand cookbooks (ux-design, security, support-triage, …) |
18
+ | `hooks/` | Lifecycle enforcement scripts |
19
+ | `istartsoft-flow/` | METHODOLOGY.md — every hard rule lives here once |
20
+ | `templates/` | Proposal / UX pack / architecture / CR / FEATURE / automation |
21
+
22
+ ## Claude Code only
23
+
24
+ Anthropic’s Claude Code loads commands/agents/skills from **`.claude/`**. When you
25
+ install `--tool=claude` (or `all`), the installer also **mirrors** this kit into
26
+ `.claude/` plus a root `CLAUDE.md` shim (`@AGENTS.md`). Cursor / Codex / Gemini /
27
+ Aider installs do **not** create `.claude/`.
28
+
29
+ Edit the kit in **`.issflow/`**, then re-run `create-issflow --tool=claude` (with
30
+ `--force` if needed) to refresh the Claude mirror. Hooks run from `.issflow/`
31
+ (single source); Claude settings point there.
32
+
33
+ Do **not** duplicate METHODOLOGY rules into other files (anti-drift).
34
+ Do **not** put personal rate cards in this kit.
35
+
36
+ Installer: `npx create-issflow` (omit `--tool` = all adapters).
@@ -68,7 +68,7 @@ contingency %.
68
68
  CR-<n> | <date> | <change> | impact: <phases> | effort Δ: <±days> |
69
69
  cost Δ: <±amount> | new total: <amount> | status: proposed
70
70
  ```
71
- 2. Fill `.claude/templates/CR-template.md` → `docs/changes/CR-<n>.md` (detail:
71
+ 2. Fill `.issflow/templates/CR-template.md` → `docs/changes/CR-<n>.md` (detail:
72
72
  classification, impact, Δ cost, warranty vs billable, status). Keep the detail
73
73
  file client-safe on money fields (totals only).
74
74
 
@@ -77,7 +77,8 @@ Show me CR-<n> (impact + price delta + new total — no rate). **STOP for approv
77
77
  (commercial gate — always interactive).
78
78
  - **Approved** -> set CR status `approved`; bump PROPOSAL.md to a new version (vN+1)
79
79
  with the delta folded in (**totals only**); re-render `docs/proposal.html` from it
80
- (same template + language; no contingency note / rate); then dispatch `/replan` to
80
+ (same `/propose` package rows + screen appendix — do not dump every PLAN phase
81
+ onto the sign table; same template + language; no contingency note / rate); then dispatch `/replan` to
81
82
  apply the phase changes to PLAN.md (done phases stay frozen). Update STATE.md.
82
83
  NOTE: `/replan` reverts PLAN.md to `> Approval: PENDING` and re-runs the
83
84
  PLAN-APPROVAL gate (hard rule 13) — the commercial CR sign-off is SEPARATE from
@@ -25,7 +25,7 @@ Target: `$ARGUMENTS` → `ux` | `arch` | `both` (default **both**).
25
25
 
26
26
  ## STEP 1 — UX PACK (if ux|both)
27
27
  1. Apply `ux-design` skill (authoring mode): wireframe baseline + cookbook direction.
28
- 2. Scaffold or update `docs/UX-PACK.md` from `.claude/templates/UX-PACK-template.md`.
28
+ 2. Scaffold or update `docs/UX-PACK.md` from `.issflow/templates/UX-PACK-template.md`.
29
29
  3. Fill flows, screen inventory, tokens/frame, a11y notes from OVERVIEW + PLAN.
30
30
  4. SHOW me UX-PACK.md. **STOP for approval.**
31
31
  5. On approve: stamp `> Approval: approved <date> v<n>`; set `design: approved <date>`
@@ -35,7 +35,7 @@ Target: `$ARGUMENTS` → `ux` | `arch` | `both` (default **both**).
35
35
  ## STEP 2 — ARCHITECTURE (if arch|both)
36
36
  1. Dispatch `researcher` (DESIGN) only if open unknowns remain; else use OVERVIEW.
37
37
  2. Scaffold or update `docs/ARCHITECTURE.md` from
38
- `.claude/templates/ARCHITECTURE-template.md`.
38
+ `.issflow/templates/ARCHITECTURE-template.md`.
39
39
  3. Apply `code-standards` architecture guidance; security trust boundaries via
40
40
  `security` skill when relevant.
41
41
  4. SHOW me ARCHITECTURE.md. **STOP for approval.**
@@ -14,7 +14,7 @@ Target doc: $ARGUMENTS (default: the single `docs/features/*/FEATURE.md` whose
14
14
  ## ENTRY MODES (before the pipeline)
15
15
 
16
16
  - **`/feature new <name>`** — scaffold only. Copy
17
- `.claude/templates/FEATURE-template.md` to `docs/features/<kebab-name>/FEATURE.md`,
17
+ `.issflow/templates/FEATURE-template.md` to `docs/features/<kebab-name>/FEATURE.md`,
18
18
  fill `<feature name>`, then STOP: the human writes the spec and flips
19
19
  `> Approval:` to APPROVED. Never auto-approve; never continue into the pipeline.
20
20
  - **`/feature from-story <key>`** — planning-stack bridge. If a story MCP is
@@ -50,7 +50,7 @@ b. APPROVAL GATE (the ONE human gate at entry): the Feature doc must carry a hea
50
50
  > Automation: <none | push | push+pr>
51
51
  ```
52
52
  Missing/PENDING -> HARD-STOP: a human approves the DOC, not the run (need a doc?
53
- `/feature new <name>` scaffolds `.claude/templates/FEATURE-template.md`). Doc approval
53
+ `/feature new <name>` scaffolds `.issflow/templates/FEATURE-template.md`). Doc approval
54
54
  is the rule-13 sign-off *scoped to this doc only* — the mini-plan it produces
55
55
  inherits approval as long as it stays inside the doc's stated scope.
56
56
 
@@ -1,17 +1,18 @@
1
1
  ---
2
- description: Turn approved requirements + tech stack into a client proposal — scope, phase breakdown, effort + cost estimate, timeline, assumptions, and a sign-off gate. Run after /overview, before building.
2
+ description: Turn approved requirements + tech stack into a client proposal — scope, packages, effort + cost estimate, timeline, assumptions, screen appendix, and a sign-off gate. Run after /overview, before building.
3
3
  argument-hint: [optional: rate / budget / constraints · "dry-run" to preview]
4
4
  ---
5
5
 
6
6
  Caveman ULTRA mode. You are the ORCHESTRATOR.
7
7
 
8
- Purpose: produce `docs/PROPOSAL.md` — WHAT we build, in what phases, how long, how
8
+ Purpose: produce `docs/PROPOSAL.md` — WHAT we build, in what packages, how long, how
9
9
  much, and on what assumptions — for the client to approve BEFORE any build starts.
10
10
  A proposal is a commercial gate: always interactive (both AUTO and GUIDED).
11
11
 
12
12
  DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, do the full analysis but
13
- EXECUTE NOTHING — print the ACTION PLAN (scope, phase breakdown, rough estimate)
14
- and STOP. No PROPOSAL.md / proposal.html is written. (METHODOLOGY → Dry-run.)
13
+ EXECUTE NOTHING — print the ACTION PLAN (scope, phase breakdown, package collapse,
14
+ rough estimate) and STOP. No PROPOSAL.md / proposal.html is written.
15
+ (METHODOLOGY → Dry-run.)
15
16
 
16
17
  ## PRE-FLIGHT
17
18
  Read `docs/OVERVIEW.md` (scope, stack, success criteria) and `docs/PRD.md` if
@@ -28,12 +29,15 @@ List the deliverables (features / epics) from OVERVIEW / PRD. Mark each
28
29
  **in-scope** or **out-of-scope** explicitly — naming out-of-scope items now is what
29
30
  prevents silent scope creep (and grounds change-order re-pricing later).
30
31
 
31
- ## STEP 2 — PHASE BREAKDOWN
32
+ ## STEP 2 — PHASE BREAKDOWN (internal)
32
33
  Derive the vertical-slice phases (or read `docs/PLAN.md` if it exists). Size each:
33
34
  - complexity: **S | M | L | XL**
34
35
  - effort: an ideal-days RANGE (e.g. 2–3d), + story points if your team uses them
35
36
  - risk / unknowns: what could move the estimate
36
37
 
38
+ Keep this sizing for the **chat math**. Do **not** dump every PLAN phase onto the
39
+ client table — collapse into packages in STEP 5.
40
+
37
41
  ## STEP 3 — ESTIMATE (ask rate · never invent a kit default)
38
42
  Estimation config is **project-private**. The public kit ships **no** default rate
39
43
  card and **no** sample salary/rate numbers — rates are confidential.
@@ -46,22 +50,35 @@ card and **no** sample salary/rate numbers — rates are confidential.
46
50
  3. Optional: store the answered rate/contingency in a **project-local** file the
47
51
  team keeps private (e.g. `docs/ESTIMATE.local.md` gitignored, or OVERVIEW fields
48
52
  that never get published). Never commit personal rate/salary into a public kit
49
- or template.
53
+ or template. If you create `docs/ESTIMATE.local.md`, add it to the project's
54
+ `.gitignore` when it is not already listed.
50
55
  4. Configurable fields (ask or read — no invented kit defaults for money):
51
56
  - **unit:** ideal-days | hours | story-points | both
52
57
  - **rate card:** blended OR per-role (senior / mid / junior…)
53
58
  - **currency:** as declared (ask if unset; THB is common for Thai clients)
54
59
  - **contingency:** % buffer for unknowns (ask if unset)
55
- - **payment milestones:** by-phase, split (e.g. 30/40/30), or none
60
+ - **payment split:** e.g. 30/40/30 — **ASK once; do not guess** a ratio
56
61
  - **language:** rendered doc language (default = project language)
57
62
 
63
+ Ask these **once each** if unset (commercial input — do not invent kit defaults):
64
+
65
+ - **Hours columns:** does the client table show estimated hours next to billed
66
+ hours? If yes → columns ประเมิน / คิดเงิน / ยอด. If no / unset → ชุดงาน + ยอด
67
+ only. Hours are effort, not a rate — still never print the rate.
68
+ - **Managed hosting / database:** is platform hosting+database **in** the quoted
69
+ total? If **not included**, write clearly on page 1 (out of scope + exclusions)
70
+ that the client pays the provider directly. A one-line exclusion is enough —
71
+ do **not** paste vendor SKU/price tables into the kit or invent list prices.
72
+ - **Bank:** include a bank block **only if the human provides** account details
73
+ in this project. No kit default. If none given, omit the column.
74
+
58
75
  Compute cost per phase, then a **Total as a RANGE (low–high)** that already folds
59
76
  in contingency. Show the math **in chat to the human** (rate × effort + contingency).
60
77
  **Timeline:** phases in dependency order → calendar estimate (note parallelism).
61
78
 
62
79
  ### CLIENT-DOC RULE (hard — commercial privacy)
63
80
  Client-facing artifacts (`docs/PROPOSAL.md` client sections, `docs/proposal.html`,
64
- and any PDF/print) MUST show **totals and phase costs only**.
81
+ and any PDF/print) MUST show **totals and package costs only**.
65
82
  **Never** print: hourly/day rates, rate cards, contingency %, “incl. X% buffer”,
66
83
  salary, or the estimate math. Contingency is already inside the numbers — do not
67
84
  label it on the client page.
@@ -71,38 +88,83 @@ List every assumption the estimate rests on (infra provided, third-party/licence
71
88
  costs excluded, content/design provided, etc.). These are the baseline that
72
89
  change-orders re-price against.
73
90
 
91
+ If hosting/database is not in the quote, the exclusion **must** say the client
92
+ pays the provider directly.
93
+
74
94
  ## STEP 5 — WRITE + RENDER
95
+ Collapse the internal PLAN phases into **3–6 client packages / sprints** that a
96
+ non-engineer can read. PLAN may have any number of phases; the sign page does not
97
+ list them all.
98
+
99
+ Payment copy = short **software delivery events** tied to those packages, e.g.
100
+ deposit on sign-off then work starts · when the main package is usable · when
101
+ production is up within the scope on this quote. **Never** construction wording
102
+ (% structure, house handover, site prep / equipment staging).
103
+
75
104
  1. Write `docs/PROPOSAL.md` — the SOURCE OF TRUTH (versioned v1 + date). This is
76
105
  what `CHANGES.md` re-prices against. **Client-safe** body (no rate / no
77
106
  contingency %):
78
107
  ```
79
108
  # Proposal — <project> (v1, <date>)
80
109
  ## Scope — in-scope: … | out-of-scope: …
81
- ## Phases — table: phase | complexity | effort (range) | cost
110
+ ## Packages — table: package | cost
111
+ — or package | estimated | billed | cost (only if hours columns requested)
82
112
  ## Total — <low>–<high> ← totals only; no “incl. X% contingency”
83
113
  ## Timeline — <estimate>, dependency order
84
114
  ## Assumptions — …
85
- ## Exclusions — …
86
- ## Payment — milestones (if any)
115
+ ## Exclusions — … (hosting/database: client pays provider, if that was the answer)
116
+ ## Payment — software delivery events + the asked split (if any)
117
+ ## Screens — docs/proposal.html pages 2–N (or “none — no UI in scope”)
118
+ — not pixel-binding; sign page 1 only; page count must match the HTML
87
119
  ## Sign-off — approved by: ___ date: ___ version: v1
88
120
  ```
121
+ Point the Screens section at the **real** HTML page range after render
122
+ (page 1 = sign · remaining sheets = screen appendix). Keep PROPOSAL.md and
123
+ `docs/proposal.html` in sync.
89
124
  If you keep an internal rate memo, put it in a **separate private** file (not
90
125
  the client PROPOSAL.md / HTML). PROPOSAL.md itself stays client-safe so it can
91
126
  be shared.
92
127
 
93
- 2. RENDER a client-facing `docs/proposal.html` from `.claude/templates/proposal.html`:
94
- copy it, replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared
95
- language (the section labels are already bilingual TH / EN). It must fit ONE A4
96
- page — be terse (≈ 3–6 phase rows, ≈ 4 assumptions, short scope items); trim before
97
- it spills to a second page. Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}`
98
- from the ISSUING company's brand declared in OVERVIEW (or ask once) — white-label,
99
- never hardcode the kit's name. Leave `{{TOTAL_NOTE}}` empty or a non-rate line
128
+ 2. RENDER a client-facing `docs/proposal.html` from `.issflow/templates/proposal.html`
129
+ (Claude Code also mirrors this under `.claude/templates/` — same file). Copy it,
130
+ replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared language
131
+ (the section labels are already bilingual TH / EN).
132
+
133
+ **Page 1 = the only signable A4 sheet.** Be terse (≈ 3–6 package rows, ≈ 4
134
+ assumptions, short scope items). If page 1 overflows A4, **trim the sign-page
135
+ copy first** — never spill the sign block onto page 2. The screen appendix may
136
+ grow extra `.sheet` pages.
137
+
138
+ Fill `{{PACKAGE_TABLE}}` with the matching header:
139
+ - default: ชุดงาน / Packages + Cost
140
+ - if hours columns requested: ประเมิน / คิดเงิน / ยอด (and EN equivalents)
141
+ Fill `{{BANK_COL}}` only when the human gave bank details; otherwise leave
142
+ empty so payment takes the full width.
143
+ Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}` from the ISSUING
144
+ company's brand declared in OVERVIEW (or ask once) — white-label, never
145
+ hardcode the kit's name. Leave `{{TOTAL_NOTE}}` empty or a non-rate line
100
146
  (e.g. currency / “ราคารวมทั้งโครงการ”) — **never** a contingency % or rate.
147
+ Set `{{PAGE_FOOTER}}` to the real page count (e.g. sign page 1 of N).
148
+
149
+ **Screen appendix (required when UI is in scope)** — same `docs/proposal.html`,
150
+ not a second signable file. After page 1's page-break, emit `.sheet.screens`
151
+ into `{{SCREEN_SHEETS}}`:
152
+ - Build frames from **PLAN + OVERVIEW** modules/capabilities (empty chrome is
153
+ fine). Do **not** wait for UX-PACK (that gate is after sign-off).
154
+ - Cover **every** in-scope module and capability — not a 4–8 frame sampler.
155
+ - Group sheets by package; module bar on each sheet; numbered short captions
156
+ under frames.
157
+ - Label: not pixel-binding. Sign on page 1 only. **No emoji as icons.**
158
+ - Use the template's desk/phone/sidebar/card/table CSS. Do not invent a
159
+ parallel stylesheet.
160
+
101
161
  Print-ready (Ctrl/Cmd-P → A4 → Save as PDF). Keep PROPOSAL.md and proposal.html
102
162
  in sync.
103
163
 
104
164
  ## STEP 6 — SIGN-OFF GATE
105
165
  Show me the proposal. **STOP for approval** (commercial gate — always interactive).
166
+ Do **not** run `/design` or `/phase` yourself.
167
+
106
168
  On approval: record the approved version + date in PROPOSAL.md and STATE.md, and
107
169
  append a HISTORY line `proposal v<n> approved (<total>)`.
108
170
 
@@ -15,7 +15,7 @@ Security = "is it SAFE?" — a different axis from QA ("does it work?") and UI
15
15
  ("does it look right?"). Passing those never implies this.
16
16
 
17
17
  ## PRE-FLIGHT
18
- Read the rubric: `.claude/skills/security/SKILL.md` (the Secure SDLC cookbook) and
18
+ Read the rubric: `.issflow/skills/security/SKILL.md` (the Secure SDLC cookbook) and
19
19
  its `references/` (OWASP Top 10 / ASVS / WSTG / ISO 27001 / SLSA). The cookbook IS the
20
20
  checklist — audit against it; don't invent criteria.
21
21
 
@@ -11,15 +11,15 @@ Only resolved issues and completed research qualify. Open issues do NOT.
11
11
 
12
12
  ## PRE-FLIGHT
13
13
 
14
- 1. Read `.claude/kb-config.json`.
15
- - Not found -> STOP. Tell me: "KB not configured. Create `.claude/kb-config.json`
14
+ 1. Read `.issflow/kb-config.json`.
15
+ - Not found -> STOP. Tell me: "KB not configured. Create `.issflow/kb-config.json`
16
16
  with `kb_path` + `kb_remote` pointing at the shared KB repo, then retry /store-wisdom."
17
17
  - Found -> extract `kb_path` and `kb_remote`.
18
18
 
19
19
  2. Expand `kb_path` (resolve `~` to home directory).
20
20
  Verify the path exists and is a git repo (`git -C <path> status`).
21
21
  - Fails -> STOP. Tell me the path is broken and to fix `kb_path` in
22
- `.claude/kb-config.json`.
22
+ `.issflow/kb-config.json`.
23
23
 
24
24
  ---
25
25
 
@@ -11,7 +11,7 @@ scores the product, and surfaces drift that accumulated across changes. Run befo
11
11
  release, after big UI work, or on request.
12
12
 
13
13
  ## PRE-FLIGHT
14
- Read the rubric: `.claude/skills/ux-design/SKILL.md` (the cookbook) and
14
+ Read the rubric: `.issflow/skills/ux-design/SKILL.md` (the cookbook) and
15
15
  `references/wireframe-template.md` (the frame). The cookbook IS the checklist —
16
16
  do not invent new criteria; audit against it.
17
17