create-issflow 1.4.0 → 1.5.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/bin/cli.js +9 -3
- package/package.json +1 -1
- package/template/.claude/agents/e2e-runner.md +1 -1
- package/template/.claude/commands/change-request.md +6 -1
- package/template/.claude/commands/log-issue.md +3 -1
- package/template/.claude/commands/phase.md +11 -1
- package/template/.claude/commands/propose.md +5 -1
- package/template/.claude/commands/quick.md +5 -1
- package/template/.claude/commands/release.md +5 -1
- package/template/.claude/commands/replan.md +4 -3
- package/template/.claude/commands/sprint.md +6 -1
- package/template/.claude/commands/unstuck.md +1 -1
- package/template/.claude/hooks/context-guard.js +11 -10
- package/template/.claude/hooks/session-start.js +1 -1
- package/template/.claude/istartsoft-flow/METHODOLOGY.md +15 -3
package/bin/cli.js
CHANGED
|
@@ -266,9 +266,15 @@ function flowConfig() {
|
|
|
266
266
|
+ 'Some 1M-context models report their id WITHOUT a [1m] tag, so auto-detect '
|
|
267
267
|
+ 'assumes 200000 and may false-gate around 156k — if you run a 1M model, set '
|
|
268
268
|
+ 'window:1000000 here by hand. warnPct = soft non-blocking nudge; gatePct = hard '
|
|
269
|
-
+ 'block on NEW build work (Edit/Write
|
|
270
|
-
+ '(docs/**, STATE/ISSUES/snapshots)
|
|
271
|
-
+ 'never
|
|
269
|
+
+ 'block on NEW build work (Edit/Write to SOURCE files). Checkpoint paths '
|
|
270
|
+
+ '(docs/**, STATE/ISSUES/snapshots) and all Bash are never blocked; Task '
|
|
271
|
+
+ 'delegation is never gated (a subagent isolates noise and shrinks context).',
|
|
272
|
+
},
|
|
273
|
+
sprint: {
|
|
274
|
+
defaultCapacity: 8,
|
|
275
|
+
_note: 'Sprint layer (/sprint). defaultCapacity = points committed to the FIRST '
|
|
276
|
+
+ 'sprint before any velocity history exists; later sprints size to the rolling '
|
|
277
|
+
+ 'completed-velocity average. Optional — /sprint falls back to 8 if absent.',
|
|
272
278
|
},
|
|
273
279
|
}, null, 2) + '\n';
|
|
274
280
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-issflow",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: e2e-runner
|
|
3
|
-
description: Writes and runs functional browser E2E (your declared E2E runner, e.g. Playwright) BLIND — reads
|
|
3
|
+
description: Writes and runs functional browser E2E (your declared E2E runner, e.g. Playwright) BLIND — reads the acceptance spec, OVERVIEW (stack), docs/ENDPOINTS.md, and the E2E runner config, never the implementation. Writes a trace to docs/research/e2e-<phase-slug>.md; returns a terse summary.
|
|
4
4
|
tools: Read, Grep, Glob, Write, Bash
|
|
5
5
|
model: opus
|
|
6
6
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Handle a mid-project requirement change — assess impact, re-estimate effort + cost, log the change order, then update the plan + proposal. Run whenever scope changes after the proposal is approved.
|
|
3
|
-
argument-hint: [the requested change]
|
|
3
|
+
argument-hint: [the requested change · "dry-run" to preview impact without logging]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Caveman ULTRA mode. You are the ORCHESTRATOR.
|
|
@@ -8,6 +8,11 @@ Caveman ULTRA mode. You are the ORCHESTRATOR.
|
|
|
8
8
|
A change request is a COMMERCIAL event, not just a re-plan: changing scope changes
|
|
9
9
|
cost and timeline. Handle it transparently and fairly. Change: $ARGUMENTS
|
|
10
10
|
|
|
11
|
+
DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, do the impact analysis +
|
|
12
|
+
re-estimate but EXECUTE NOTHING — print the ACTION PLAN (cost/scope/timeline delta,
|
|
13
|
+
files you'd touch) and STOP. No change order is logged, no plan/proposal is edited.
|
|
14
|
+
(METHODOLOGY → Dry-run.)
|
|
15
|
+
|
|
11
16
|
## PRE-FLIGHT
|
|
12
17
|
Read `docs/PROPOSAL.md` (the approved baseline), `docs/PLAN.md`, `docs/STATE.md`,
|
|
13
18
|
and `docs/CHANGES.md` (create if missing). No approved proposal yet -> you're still
|
|
@@ -12,7 +12,7 @@ Canonical format:
|
|
|
12
12
|
|
|
13
13
|
### <short error title — searchable, literal error keywords>
|
|
14
14
|
|
|
15
|
-
- [
|
|
15
|
+
- [ ] open (or “- [x] resolved” once fixed)
|
|
16
16
|
- symptom: <what was observed>
|
|
17
17
|
- root cause: <the REAL underlying cause>
|
|
18
18
|
- solution: <exact fix, or “pending”>
|
|
@@ -23,6 +23,8 @@ Rules:
|
|
|
23
23
|
- title must contain literal error keywords -> grep finds it.
|
|
24
24
|
- root cause is the real cause, not "the line threw an error".
|
|
25
25
|
- always fill "failed attempts" — stops repeated dead ends.
|
|
26
|
+
- open issues use the empty box `- [ ]`; resolved are checked `- [x] resolved`
|
|
27
|
+
(the SessionStart hook surfaces every `- [ ]` as open — keep the box empty until fixed).
|
|
26
28
|
- open issues go at the TOP; resolved below; archived oldest at bottom.
|
|
27
29
|
|
|
28
30
|
Confirm the entry back in 2 lines.
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run one phase end-to-end. TDD phases run SCAFFOLD -> RED -> GREEN; non-TDD phases run IMPLEMENT -> TEST. Both with the debug circuit breaker and the regression guard at CLOSE.
|
|
3
|
-
argument-hint: [phase number]
|
|
3
|
+
argument-hint: [phase number · "dry-run" to preview what the phase would do]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
Caveman ULTRA mode. You are the ORCHESTRATOR. Route work to subagents —
|
|
7
8
|
you do NOT implement or debug yourself.
|
|
8
9
|
|
|
@@ -12,6 +13,15 @@ Target phase: $ARGUMENTS (default: the phase marked pending in docs/PLAN.md)
|
|
|
12
13
|
|
|
13
14
|
---
|
|
14
15
|
|
|
16
|
+
## DRY-RUN CHECK (first — before PRE-FLIGHT)
|
|
17
|
+
|
|
18
|
+
If `$ARGUMENTS` contains `dry-run` or `--dry-run`: do the full analysis but EXECUTE
|
|
19
|
+
NOTHING. Print the ACTION PLAN — files you'd create/change · agents you'd dispatch ·
|
|
20
|
+
tests/gates you'd run · deploy target · cost/scope/risk impact — then STOP. Write,
|
|
21
|
+
run, commit, deploy nothing. (METHODOLOGY → Dry-run.)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
15
25
|
## 0. PRE-FLIGHT
|
|
16
26
|
|
|
17
27
|
a. PLAN-APPROVAL CHECK (hard rule 13): Read the docs/PLAN.md `> Approval:` header.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
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.
|
|
3
|
-
argument-hint: [optional: rate / budget / constraints]
|
|
3
|
+
argument-hint: [optional: rate / budget / constraints · "dry-run" to preview]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Caveman ULTRA mode. You are the ORCHESTRATOR.
|
|
@@ -9,6 +9,10 @@ Purpose: produce `docs/PROPOSAL.md` — WHAT we build, in what phases, how long,
|
|
|
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
|
+
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.)
|
|
15
|
+
|
|
12
16
|
## PRE-FLIGHT
|
|
13
17
|
Read `docs/OVERVIEW.md` (scope, stack, success criteria) and `docs/PRD.md` if
|
|
14
18
|
present (else the PRD in your BMAD/iSSM). No OVERVIEW -> run `/overview` first.
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Make a small, obvious change directly — no agent chain, no phase overhead.
|
|
3
|
-
argument-hint: [what to change]
|
|
3
|
+
argument-hint: [what to change · "dry-run" to preview the edit]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Caveman ULTRA mode. Apply `karpathy-guidelines` skill.
|
|
7
7
|
|
|
8
8
|
Purpose: skip the orchestration tax for a 5-line fix.
|
|
9
9
|
|
|
10
|
+
DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, describe the exact edit
|
|
11
|
+
you'd make (file · lines · the change) and the regression you'd run, then STOP —
|
|
12
|
+
change nothing. (METHODOLOGY → Dry-run.)
|
|
13
|
+
|
|
10
14
|
Use `/quick` when ALL hold:
|
|
11
15
|
- change is small (under 30 lines) and obvious
|
|
12
16
|
- no new vertical slice
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Pre-production release pipeline — after all build phases, run the full automated gauntlet (full regression: functional / integration / e2e · all audits: UI / QA / security / code · smoke test), then hand off to manual UAT, drive the defect loop to green, produce a sign-off document, and promote to production. The automated SDLC backbone; production deploy is a human-signed hard-stop.
|
|
3
|
-
argument-hint: [optional: target env]
|
|
3
|
+
argument-hint: [optional: target env · "dry-run" to preview the pipeline without running it]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Caveman ULTRA mode. You are the ORCHESTRATOR.
|
|
@@ -10,6 +10,10 @@ AUTO runs all AUTOMATED stages without stopping; it STOPS only at the human gate
|
|
|
10
10
|
UAT execution, sign-off, and the production promote (security/irreversible hard-stops).
|
|
11
11
|
Record progress in STATE.md so a resumed session continues mid-pipeline.
|
|
12
12
|
|
|
13
|
+
DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, do the full analysis but
|
|
14
|
+
EXECUTE NOTHING — print the ACTION PLAN (stages, audits, deploy target, risk impact)
|
|
15
|
+
and STOP. Nothing is run, signed, or promoted. (METHODOLOGY → Dry-run.)
|
|
16
|
+
|
|
13
17
|
## STAGE 1 — FULL REGRESSION (auto)
|
|
14
18
|
Run the whole REAL corpus end-to-end: **functional + integration + e2e**
|
|
15
19
|
(`scripts/regression.sh --real`, then the declared E2E runner via `e2e-runner`).
|
|
@@ -54,9 +54,10 @@ commercial impact (split/merge/reorder, a discovered technical re-slice).
|
|
|
54
54
|
- A MERGE -> consolidate the merged phases' regression tests.
|
|
55
55
|
- A REORDER -> keep the tests as-is (contracts are phase-independent).
|
|
56
56
|
Do NOT touch phase-local `tests/phase-<n>/` here beyond renumbering dirs.
|
|
57
|
-
After reconciling, run
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
After reconciling, re-run the regression corpus to confirm it still passes:
|
|
58
|
+
`--real` ONLY if at least one phase is done (live services exist); on a pre-build
|
|
59
|
+
replan (no done phase, managed infra not yet wired) run the mock corpus instead,
|
|
60
|
+
or skip with a noted reason. A failure -> surface it and stop before approval.
|
|
60
61
|
|
|
61
62
|
6. PLAN-APPROVAL gate (hard rule 13). A re-plan reshapes UNBUILT scope, so it reverts
|
|
62
63
|
the plan to unapproved: set the PLAN.md `> Approval:` header back to `PENDING`, SHOW
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: The Scrum sprint layer — group PLAN phases into time-/scope-boxed sprints and run the full ceremony set (planning → standups → review/demo → retrospective → close) with burndown + velocity. AUTO-facilitated: the orchestrator runs every ceremony itself and drives the sprint end-to-end without stopping, pausing only at the real hard-stops. The layer between PLAN (backlog) and PHASE (build loop).
|
|
3
|
-
argument-hint: [run|plan|standup|review|retro|close|status] [sprint number]
|
|
3
|
+
argument-hint: [run|plan|standup|review|retro|close|status] [sprint number · "dry-run"]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Caveman ULTRA mode. You are the ORCHESTRATOR / SCRUM MASTER. You FACILITATE the
|
|
@@ -8,6 +8,11 @@ ceremonies and ROUTE build work to subagents — you do NOT implement or debug y
|
|
|
8
8
|
|
|
9
9
|
Subcommand: $ARGUMENTS (default: `status`)
|
|
10
10
|
|
|
11
|
+
DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, do the full analysis but
|
|
12
|
+
EXECUTE NOTHING — print the ACTION PLAN (which phases the sprint would commit,
|
|
13
|
+
ceremonies it would run, points/capacity) and STOP. No sprint file is written, no
|
|
14
|
+
phase runs. (METHODOLOGY → Dry-run.)
|
|
15
|
+
|
|
11
16
|
Hierarchy: **PLAN (product backlog) → SPRINT (committed slice of phases) → PHASE
|
|
12
17
|
(the build loop)**. A sprint groups consecutive PLAN phases behind ONE sprint goal
|
|
13
18
|
and ships ONE deployable increment. Phases still run via `/phase` exactly as before
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
// PreToolUse context watchdog (iStartSoftFlow). Two tiers, one hook:
|
|
4
4
|
// warnPct -> non-blocking nudge (additionalContext) once per climb into the band
|
|
5
|
-
// gatePct -> HARD block of NEW build work (Edit/Write
|
|
5
|
+
// gatePct -> HARD block of NEW build work (Edit/Write to SOURCE files)
|
|
6
|
+
// Delegation (Task) is the prescribed escape — a subagent runs in its OWN context
|
|
7
|
+
// and returns a terse summary, so it SHRINKS orchestrator context, never grows it.
|
|
8
|
+
// Blocking it would force the orchestrator to build inline (worse). So Task is
|
|
9
|
+
// never gated; only direct source mutations by the orchestrator are.
|
|
6
10
|
// Reads REAL token usage from the transcript. Fail-OPEN: any error -> allow,
|
|
7
11
|
// never wedge the tool loop on a hook bug.
|
|
8
12
|
const path = require('path');
|
|
@@ -34,7 +38,7 @@ function run(evt) {
|
|
|
34
38
|
const tool = evt.tool_name || '';
|
|
35
39
|
const ti = evt.tool_input || {};
|
|
36
40
|
const band = u.pct >= gate ? 'gate' : u.pct >= warn ? 'warn' : 'ok';
|
|
37
|
-
const BLOCKABLE = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit'
|
|
41
|
+
const BLOCKABLE = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
|
|
38
42
|
|
|
39
43
|
// HARD GATE — block new build mutations; reason is fed to the model.
|
|
40
44
|
if (band === 'gate' && BLOCKABLE.has(tool) && !isEscape(tool, ti)) {
|
|
@@ -67,15 +71,12 @@ function run(evt) {
|
|
|
67
71
|
return silent();
|
|
68
72
|
}
|
|
69
73
|
|
|
70
|
-
// Checkpoint/logging writes
|
|
71
|
-
// model always has an escape path out of the gate.
|
|
74
|
+
// Checkpoint/logging writes (docs/**, STATE/ISSUES/snapshots) are never blocked,
|
|
75
|
+
// so the model always has an escape path out of the gate. (Task delegation is not
|
|
76
|
+
// in BLOCKABLE at all — see the header note — so it needs no escape carve-out.)
|
|
72
77
|
function isEscape(tool, ti) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return /(^|\/)docs\//.test(fp) || /STATE\.md|ISSUES\.md|\.snapshots\//.test(fp);
|
|
76
|
-
}
|
|
77
|
-
if (tool === 'Task') return (ti.subagent_type || '').toLowerCase() === 'synthesizer';
|
|
78
|
-
return false;
|
|
78
|
+
const fp = ti.file_path || ti.path || ti.notebook_path || '';
|
|
79
|
+
return /(^|\/)docs\//.test(fp) || /STATE\.md|ISSUES\.md|\.snapshots\//.test(fp);
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
const fmt = (n) => (n >= 1000 ? Math.round(n / 1000) + 'k' : String(n));
|
|
@@ -80,7 +80,7 @@ if (issues !== null) {
|
|
|
80
80
|
// 3b. research index
|
|
81
81
|
const idx = read('docs/research/INDEX.md');
|
|
82
82
|
if (idx !== null) {
|
|
83
|
-
const rows = idx.split('\n').filter((l) =>
|
|
83
|
+
const rows = idx.split('\n').filter((l) => /^\|\s*\d{4}-\d{2}-\d{2}/.test(l));
|
|
84
84
|
emit(`## research/INDEX.md (${rows.length} prior investigations)`);
|
|
85
85
|
emit('grep this before any new research or debugging.');
|
|
86
86
|
for (const l of rows.slice(-15)) emit(' ' + l);
|
|
@@ -191,9 +191,9 @@ can. Escalation is at most two hops.
|
|
|
191
191
|
phases it is dispatched BEFORE logic exists (RED-first), so blindness is
|
|
192
192
|
structural, not honor-system. Writes a MOCK suite + a REAL API suite.
|
|
193
193
|
- **e2e-runner** — writes/runs functional browser E2E (your declared E2E runner,
|
|
194
|
-
e.g. Playwright) BLIND. Reads
|
|
195
|
-
never the implementation. Writes
|
|
196
|
-
returns a terse summary.
|
|
194
|
+
e.g. Playwright) BLIND. Reads the acceptance spec, `docs/OVERVIEW.md` (stack),
|
|
195
|
+
`docs/ENDPOINTS.md`, and the E2E runner config — never the implementation. Writes
|
|
196
|
+
a trace to `docs/research/e2e-<phase-slug>.md`; returns a terse summary.
|
|
197
197
|
- **debugger** — debugs in an ISOLATED context. Writes a trace to
|
|
198
198
|
`docs/research/debug-<slug>.md`; returns a summary.
|
|
199
199
|
- **synthesizer** — compresses `docs/STATE.md` / `docs/ISSUES.md`, prunes
|
|
@@ -351,6 +351,18 @@ development run that follows the spec and logs every problem so it never recurs.
|
|
|
351
351
|
|
|
352
352
|
-----
|
|
353
353
|
|
|
354
|
+
## Dry-run (preview — change nothing)
|
|
355
|
+
|
|
356
|
+
Pass `dry-run` (or `--dry-run`) to ANY command and it does the full analysis but
|
|
357
|
+
EXECUTES NOTHING: it prints the ACTION PLAN — files it would create/change · agents
|
|
358
|
+
it would dispatch · tests/gates it would run · the deploy target · cost / scope /
|
|
359
|
+
risk impact — then STOPS. Nothing is written, run, committed, or deployed. A safe
|
|
360
|
+
preview to see the blast radius first. Most useful before side-effecting commands:
|
|
361
|
+
`/phase` · `/release` · `/change-request` · `/sprint` · `/propose` · `/quick`.
|
|
362
|
+
Mirrors the installer's `--dry-run`. (In a dry-run, even AUTO never acts — it only reports.)
|
|
363
|
+
|
|
364
|
+
-----
|
|
365
|
+
|
|
354
366
|
## Hard rules (1–13)
|
|
355
367
|
|
|
356
368
|
1. Before debugging ANY error: grep `docs/ISSUES.md` AND `docs/research/INDEX.md`.
|