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
@@ -0,0 +1,12 @@
1
+ {
2
+ "context": {
3
+ "window": 1000000,
4
+ "warnPct": 60,
5
+ "gatePct": 78,
6
+ "_note": "window = this session's real context window. THIS repo runs Opus 4.8 [1m] but the transcript records model id as 'claude-opus-4-8' (no [1m] tag), so auto-detect (window:0) would wrongly assume 200000 and false-gate around 156k. Set it explicitly here. Kit template default stays 200000 — override per your model. warnPct = soft non-blocking nudge. gatePct = hard PreToolUse block on NEW build work (Edit/Write to SOURCE files). Checkpoint paths (docs/**, STATE/ISSUES/snapshots) and all Bash (git) are never blocked; Task delegation is never gated (a subagent isolates noise and shrinks orchestrator context)."
7
+ },
8
+ "sprint": {
9
+ "defaultCapacity": 8,
10
+ "_note": "Sprint layer (/sprint). defaultCapacity = points committed to the FIRST sprint before any velocity history exists; later sprints size to the rolling completed-velocity average. Optional — /sprint falls back to 8 if this block is absent."
11
+ }
12
+ }
@@ -27,7 +27,7 @@ process.stdin.on('end', () => {
27
27
  function run(evt) {
28
28
  const projectDir = process.env.CLAUDE_PROJECT_DIR || evt.cwd || '.';
29
29
  let ctx;
30
- try { ctx = require(path.join(projectDir, '.claude/hooks/lib/ctx.js')); } catch (_) { return silent(); }
30
+ try { ctx = require(path.join(projectDir, '.issflow/hooks/lib/ctx.js')); } catch (_) { return silent(); }
31
31
  const cfg = ctx.loadConfig(projectDir);
32
32
  const warn = cfg.warnPct || 60;
33
33
  const gate = cfg.gatePct || 78;
@@ -89,7 +89,7 @@ function gateReason(u, gate) {
89
89
  ' 2) /synthesize (อัด handoff docs — subagent นี้ไม่ถูก block)',
90
90
  ' 3) /clear (session ใหม่ บางลง)',
91
91
  'build ต่อหลัง clear. กลาง irreversible op? ใช้ Bash ปิดให้จบก่อน clear.',
92
- 'ปลดล็อกชั่วคราว: เพิ่ม gatePct ใน .claude/flow-config.json.',
92
+ 'ปลดล็อกชั่วคราว: เพิ่ม gatePct ใน .issflow/flow-config.json.',
93
93
  ].join('\n');
94
94
  }
95
95
 
@@ -21,7 +21,7 @@ function inferWindow(model) {
21
21
  // Read project flow config; returns the `context` block or {}.
22
22
  function loadConfig(projectDir) {
23
23
  try {
24
- const cfg = JSON.parse(fs.readFileSync(projectDir + '/.claude/flow-config.json', 'utf8'));
24
+ const cfg = JSON.parse(fs.readFileSync(projectDir + '/.issflow/flow-config.json', 'utf8'));
25
25
  return (cfg && cfg.context) || {};
26
26
  } catch (_) { return {}; }
27
27
  }
@@ -50,7 +50,7 @@ function run(evt) {
50
50
 
51
51
  // writable while PENDING: planning + docs + kit + repo meta — never product source.
52
52
  const ALLOW = [
53
- /^docs\//, /^\.claude\//, /^\.cursor\//, /^\.github\//, /^\.aider/, /^\.git/,
53
+ /^docs\//, /^\.issflow\//, /^\.claude\//, /^\.cursor\//, /^\.github\//, /^\.aider/, /^\.git/,
54
54
  /^(README|AGENTS|CLAUDE|GEMINI|CHANGELOG|LICENSE)[^/]*$/i, /^[^/]+\.md$/,
55
55
  ];
56
56
  if (ALLOW.some((re) => re.test(rel))) return silent();
@@ -90,7 +90,7 @@ if (idx !== null) {
90
90
  }
91
91
 
92
92
  // 3d. shared KB — pull latest + load snapshot
93
- const KB_CONFIG = '.claude/kb-config.json';
93
+ const KB_CONFIG = '.issflow/kb-config.json';
94
94
  let kbActive = false;
95
95
  if (exists(KB_CONFIG)) {
96
96
  let cfg = {}; try { cfg = JSON.parse(read(KB_CONFIG) || '{}'); } catch (_) {}
@@ -126,7 +126,7 @@ if (exists(KB_CONFIG)) {
126
126
  kbActive = true;
127
127
  } else {
128
128
  emit('## Shared KB: configured but path not found (' + (cfg.kb_path || '') + ')');
129
- emit('Fix kb_path in .claude/kb-config.json (or re-run: npx create-issflow).');
129
+ emit('Fix kb_path in .issflow/kb-config.json (or re-run: npx create-issflow).');
130
130
  emit('');
131
131
  }
132
132
  }
@@ -1,11 +1,10 @@
1
1
  # iStartSoftFlow — portable agent methodology (single source of truth)
2
2
 
3
- > **The iStartSoft execution loop.** Lives under `.claude/istartsoft-flow/` as
4
- > part of the **portable kit**. The directory name `.claude/` is a **host
5
- > convention** (several agents load commands/hooks from that path) — not
6
- > Claude-only branding. Primary human entry is root **`AGENTS.md`** (open
7
- > standard). `CLAUDE.md` / `GEMINI.md` / … are thin host adapters that point
8
- > here; they do NOT replace this file.
3
+ > **The iStartSoft execution loop.** Lives under `.issflow/istartsoft-flow/` as
4
+ > part of the **portable kit** (tool-agnostic SoT). Primary human entry is root
5
+ > **`AGENTS.md`** (open standard). `CLAUDE.md` / `GEMINI.md` / `.cursor/` / … are
6
+ > thin host adapters that point here; they do NOT replace this file. Claude Code
7
+ > also gets a `.claude/` **mirror** of this kit (host discovery only).
9
8
  >
10
9
  > The kit is **stack-agnostic and tool-agnostic**: it pins a *process*, not a
11
10
  > *stack*. Declare your stack (language, framework, infra, auth, test + E2E
@@ -110,10 +109,12 @@ from idea to closeout:
110
109
  the proposal estimates *these* phases.
111
110
  5. **Proposal & estimate (OPTIONAL — depends on the job)** — for client / quoted
112
111
  work, `/propose` reads OVERVIEW + PLAN → `docs/PROPOSAL.md` + a rendered
113
- `docs/proposal.html`: scope, phase breakdown, effort + cost estimate, timeline,
114
- assumptions, with a **client sign-off gate** before build. **Ask rate +
115
- contingency in chat** when missing — the kit stores **no** default rate (rates
116
- are confidential). Client docs show **totals only** (never rate or contingency %).
112
+ `docs/proposal.html`: scope, **package** rows on the signable A4 page (not every
113
+ PLAN phase), effort + cost estimate, timeline, assumptions, and a screen
114
+ appendix in the **same HTML** after a page-break, with a **client sign-off gate**
115
+ before build. **Ask rate + contingency in chat** when missing — the kit stores
116
+ **no** default rate (rates are confidential). Client docs show **totals only**
117
+ (never rate or contingency %).
117
118
  Internal / personal projects skip straight from plan to build (and may set
118
119
  design/architecture gates to `n/a`).
119
120
  6. **Design + architecture gates (rule 15 — after proposal, before build)** —
@@ -171,7 +172,7 @@ documented feature branch out, near-100% hands-off. Humans remain at exactly thr
171
172
  points: **approve the doc** (entry) · **UAT** (`/uat` against the generated
172
173
  TEST-PLAN) · **merge**. Production deploy is never in this lane (`/release` owns it).
173
174
 
174
- Pipeline (canonical body in `.claude/commands/feature.md`):
175
+ Pipeline (canonical body in `.issflow/commands/feature.md`):
175
176
  spec completion → adversarial doc-review → mini-plan → contract surface probe →
176
177
  build loop (the `/phase` machinery, feature-scoped) → review & harden → manual
177
178
  test plan → docs + token stamp + summary → memory queue → delivery.
@@ -182,13 +183,13 @@ Three layers make "hands-off" real — each uses the mechanism suited to its job
182
183
  through the standard roles under AUTO; the circuit breaker, rules 11/12, and
183
184
  blind TDD apply unchanged.
184
185
  2. **Must-happen-every-time → a lifecycle hook.** `docs/features/<slug>/GATES.md`
185
- is the run's gate checklist; the `Stop` hook (`.claude/hooks/feature-gate.js`)
186
+ is the run's gate checklist; the `Stop` hook (`.issflow/hooks/feature-gate.js`)
186
187
  BLOCKS session end while the feature is `(active)` in STATE with unchecked
187
188
  gates — and it verifies ARTIFACTS, not ticks: a checked `test-plan` /
188
189
  `mini-plan` / `contract-probe` / `token-stamp` / `summary` / `memory-queued`
189
190
  gate whose deliverable is missing on disk blocks too (also re-checked in the
190
191
  `(done)` state). A prompt can be ignored; the hook cannot. Rule 13 gets the
191
- same treatment: the `PreToolUse` plan gate (`.claude/hooks/plan-gate.js`)
192
+ same treatment: the `PreToolUse` plan gate (`.issflow/hooks/plan-gate.js`)
192
193
  denies source Edit/Write while `docs/PLAN.md` reads `> Approval: PENDING`
193
194
  (docs/kit paths stay writable; an active feature lane is exempt — its doc
194
195
  approval is its own scoped gate). Hosts without lifecycle hooks run these as
@@ -196,14 +197,14 @@ Three layers make "hands-off" real — each uses the mechanism suited to its job
196
197
  3. **No-human-at-the-keyboard → a headless runner.** `ISSFLOW_HEADLESS=1` tells the
197
198
  lane no human is present: every hard-stop degrades to a `BLOCKED.md` report +
198
199
  clean exit — never a guess. Two shipped runners (`create-issflow --ci|--docker`,
199
- sources in `.claude/templates/automation/`):
200
+ sources in `.issflow/templates/automation/`):
200
201
  - **GitHub Actions** — label an issue `feature:approved` (or dispatch with a doc
201
202
  path); the workflow runs the lane on an ephemeral runner.
202
203
  - **Docker** — `node scripts/feature-docker.js <FEATURE.md>` builds
203
204
  `Dockerfile.issflow` and runs the lane in an unprivileged container with the
204
205
  repo mounted; the container is the sandbox that makes a skip-permissions run
205
206
  acceptable. Works for any host that ships a headless CLI. The runner image
206
- MUST contain Node ≥ 18 — the lifecycle hooks are `node .claude/hooks/*.js`,
207
+ MUST contain Node ≥ 18 — the lifecycle hooks are `node .issflow/hooks/*.js`,
207
208
  and without node they die silently (no session context, no feature gate).
208
209
  The shipped image is Node-based and the wrapper preflights `node` before
209
210
  every run, including bring-your-own images (`ISSFLOW_IMAGE=<name>`).
@@ -256,7 +257,7 @@ the planning phase when a project needs that rigor, then drive delivery here.
256
257
  ## Roles (fresh-context workers)
257
258
 
258
259
  Each role is a fresh-context worker mapped to a named Claude Code subagent in
259
- `.claude/agents/*.md`. A worker dumps its noise to a file and returns only a
260
+ `.issflow/agents/*.md`. A worker dumps its noise to a file and returns only a
260
261
  terse summary + path. Workers cannot address the user — only the orchestrator
261
262
  can. Escalation is at most two hops.
262
263
 
@@ -284,7 +285,7 @@ can. Escalation is at most two hops.
284
285
 
285
286
  The orchestrator ROUTES. It does not implement or debug.
286
287
 
287
- **Model routing (per-role tiers).** Each role's `.claude/agents/<role>.md` pins a
288
+ **Model routing (per-role tiers).** Each role's `.issflow/agents/<role>.md` pins a
288
289
  `model:` tier suited to its work, so the RIGHT model runs each task by default:
289
290
 
290
291
  | Role | `model:` | Why |
@@ -302,7 +303,7 @@ support run everything on the session model (graceful degrade).
302
303
 
303
304
  ## Procedures (the slash-command set)
304
305
 
305
- Named procedures, each with a canonical body in `.claude/commands/<name>.md`.
306
+ Named procedures, each with a canonical body in `.issflow/commands/<name>.md`.
306
307
 
307
308
  **Lane routing — which entry point for which job:**
308
309
 
@@ -334,7 +335,7 @@ surface or need its own acceptance criteria? -> `/feature`. Otherwise `/quick`.
334
335
  one APPROVED Feature doc → spec completion → adversarial doc-review → mini-plan
335
336
  → contract probe → build loop → review & harden → manual test plan →
336
337
  docs/stamps/memory → delivery. `new` scaffolds the doc from
337
- `.claude/templates/FEATURE-template.md`; `from-story` transforms a BMAD/iSSM
338
+ `.issflow/templates/FEATURE-template.md`; `from-story` transforms a BMAD/iSSM
338
339
  story into a PENDING doc (approval stays human). Gate checklist in
339
340
  `docs/features/<slug>/GATES.md`, enforced by the `Stop` hook with artifact
340
341
  verification. Headless-capable (CI / Docker, `ISSFLOW_HEADLESS=1`). See "Feature lane".
@@ -407,7 +408,7 @@ At the start of every session, before any other work, surface:
407
408
  surface its goal + burndown from `docs/sprints/sprint-<n>.md`.
408
409
  3. open items in `docs/ISSUES.md`.
409
410
  4. `docs/research/INDEX.md` (research map) + infra/auth status.
410
- 5. shared KB: pull latest + load `docs/.kb-snapshot.md` if `.claude/kb-config.json`
411
+ 5. shared KB: pull latest + load `docs/.kb-snapshot.md` if `.issflow/kb-config.json`
411
412
  exists.
412
413
  6. a one-line reminder of the hard rules below.
413
414
 
@@ -611,7 +612,7 @@ fail the other.
611
612
 
612
613
  ## Shared KB (optional)
613
614
 
614
- If `.claude/kb-config.json` exists, the SESSION-OPEN ritual pulls the KB and loads
615
+ If `.issflow/kb-config.json` exists, the SESSION-OPEN ritual pulls the KB and loads
615
616
  a snapshot to `docs/.kb-snapshot.md`. The researcher checks the snapshot (step 0)
616
617
  before any web search. Run `store-wisdom` to promote resolved issues + research to
617
618
  the KB. The kit works normally without a KB.
@@ -621,13 +622,15 @@ the KB. The kit works normally without a KB.
621
622
  ## File contract
622
623
 
623
624
  - `docs/PRD.md` — crystallised product requirements (or your BMAD/iSSM stories).
624
- - `docs/PROPOSAL.md` — scope + phase breakdown + effort/cost totals + assumptions
625
- + sign-off. Versioned; client-safe commercial baseline (no rate / contingency %).
625
+ - `docs/PROPOSAL.md` — scope + package rows + effort/cost totals + assumptions
626
+ + screen-appendix page range + sign-off. Versioned; client-safe commercial
627
+ baseline (no rate / contingency %).
626
628
  - `docs/proposal.html` — the client-facing proposal, rendered from PROPOSAL.md via
627
- `.claude/templates/proposal.html`, in the project language; print-ready (PDF).
629
+ `.issflow/templates/proposal.html`, in the project language; page 1 is the
630
+ signable A4 sheet, then screen frames in the same file (print A4).
628
631
  - `docs/UX-PACK.md` · `docs/ARCHITECTURE.md` — pre-build design/arch frames
629
- (rule 15); templates under `.claude/templates/`.
630
- - `.claude/templates/` — document templates (proposal.html, UX-PACK, ARCHITECTURE,
632
+ (rule 15); templates under `.issflow/templates/`.
633
+ - `.issflow/templates/` — document templates (proposal.html, UX-PACK, ARCHITECTURE,
631
634
  CR, FEATURE, …) the commands render into `docs/`.
632
635
  - `docs/CHANGES.md` — change-order log (append-only): each scope change with its
633
636
  impact, effort/cost delta, new total, and approval status. The commercial audit trail.
@@ -645,14 +648,14 @@ the KB. The kit works normally without a KB.
645
648
  `BLOCKED.md` (headless blocker reports).
646
649
  - `docs/WISDOM-QUEUE.md` — auto-appended wisdom candidates from feature runs;
647
650
  `/store-wisdom` reads it before pushing to the shared KB (push stays human).
648
- - `.claude/templates/automation/` — headless-runner sources (GitHub Actions ·
651
+ - `.issflow/templates/automation/` — headless-runner sources (GitHub Actions ·
649
652
  Dockerfile · docker wrapper), materialized by `create-issflow --ci` /
650
653
  `--docker` as `.github/workflows/issflow-feature.yml` +
651
654
  `.github/workflows/issflow-goal.yml` (cron-ready, disarmed by default) ·
652
655
  `Dockerfile.issflow` · `scripts/feature-docker.js`.
653
656
  - `docs/GOALS.md` — the goal layer's state: one `## G<n>` block per goal
654
657
  (Done-when · Budget · `Approved:` line · progress ticks). Maintained by `/goal`.
655
- - `.claude/templates/FEATURE-template.md` — the Feature-doc form `/feature new`
658
+ - `.issflow/templates/FEATURE-template.md` — the Feature-doc form `/feature new`
656
659
  scaffolds (Approval/Automation headers + spec sections).
657
660
  - `docs/STATE.md` — current position. Small. Rewritten, not appended. Includes
658
661
  `plan:`, `design:`, `architecture:` gate pointers (approved · PENDING · n/a).
@@ -686,20 +689,20 @@ the KB. The kit works normally without a KB.
686
689
  - `tests/phase-<n>/` — phase-local test suites.
687
690
  - `tests/regression/` — cross-phase contract tests (the regression corpus). Run by
688
691
  `scripts/regression.sh` (default mock; `--real` runs the real corpus).
689
- - `.claude/skills/ux-design/` — the UX cookbook + wireframe baseline (read on
692
+ - `.issflow/skills/ux-design/` — the UX cookbook + wireframe baseline (read on
690
693
  demand for any UI work).
691
- - `.claude/skills/security/` — the Secure SDLC cookbook + threat-modeling /
694
+ - `.issflow/skills/security/` — the Secure SDLC cookbook + threat-modeling /
692
695
  secure-coding / pentest / standards references (read on demand for security work).
693
- - `.claude/skills/code-standards/` — naming-per-language + architecture cookbook
696
+ - `.issflow/skills/code-standards/` — naming-per-language + architecture cookbook
694
697
  (read on demand for any coding / scaffolding / structure decision).
695
- - `.claude/kb-config.json` — shared KB path + remote (optional).
698
+ - `.issflow/kb-config.json` — shared KB path + remote (optional).
696
699
  - `docs/.kb-snapshot.md` — KB INDEX loaded this session (auto-generated, gitignored).
697
700
 
698
701
  -----
699
702
 
700
703
  ## Capability matrix (which host gets what)
701
704
 
702
- Single-source kit: **`.claude/` tree** (portable) + **this file** (rules) + root
705
+ Single-source kit: **`.issflow/` tree** (portable) + **this file** (rules) + root
703
706
  **`AGENTS.md`** (open-standard entry). `create-issflow --tool=<host>` (omit =
704
707
  all) writes adapters; unsupported features degrade to model-run rituals, never
705
708
  silently vanish. Assets are the same everywhere — only the *wiring* differs.
@@ -707,11 +710,11 @@ silently vanish. Assets are the same everywhere — only the *wiring* differs.
707
710
  | Host | Entry file | Commands | Subagents | Lifecycle hooks | Shared KB |
708
711
  |------|-----------|----------|-----------|-----------------|-----------|
709
712
  | **Any AGENTS.md host** | `AGENTS.md` | read as reference | model-run | model-run | yes |
710
- | **Codex CLI** | `AGENTS.md` (native) | `.claude/commands/` (read as prompts) | read as reference | model-run | yes |
711
- | **Cursor** | `.cursor/rules/` + `AGENTS.md` | `.cursor/commands/` | reads `.claude/agents/` | `.cursor/hooks.json` (sessionStart · subagentStop) | yes |
712
- | **Gemini CLI** | `GEMINI.md` + `AGENTS.md` | `.claude/commands/` (read as prompts) | read as reference | model-run | yes |
713
+ | **Codex CLI** | `AGENTS.md` (native) | `.issflow/commands/` (read as prompts) | read as reference | model-run | yes |
714
+ | **Cursor** | `.cursor/rules/` + `AGENTS.md` | `.cursor/commands/` | reads `.issflow/agents/` | `.cursor/hooks.json` (sessionStart · subagentStop) | yes |
715
+ | **Gemini CLI** | `GEMINI.md` + `AGENTS.md` | `.issflow/commands/` (read as prompts) | read as reference | model-run | yes |
713
716
  | **Aider** | `.aider.conf.yml` → `AGENTS.md` | read as reference | model-run | model-run | yes |
714
- | **Claude Code** | `CLAUDE.md` (`@AGENTS.md`) + `.claude/` | `.claude/commands/` | native | SessionStart · PreToolUse (context watchdog + plan gate) · PreCompact · SubagentStop · Stop | yes |
717
+ | **Claude Code** | `CLAUDE.md` (`@AGENTS.md`) + `.claude/` mirror | `.claude/commands/` (mirror of `.issflow/`) | native | SessionStart · PreToolUse (context watchdog + plan gate) · PreCompact · SubagentStop · Stop — hooks run from `.issflow/` | yes |
715
718
 
716
719
  "model-run" = the host can't automate the ritual, so the model performs it by hand
717
720
  (SESSION-OPEN at the top of each session; the COMPRESS snapshot before a reset).
@@ -18,7 +18,7 @@ RUN apt-get update \
18
18
  && rm -rf /var/lib/apt/lists/* \
19
19
  && npm install -g @anthropic-ai/claude-code
20
20
 
21
- # sanity: the kit's lifecycle hooks are `node .claude/hooks/*.js` — a runner
21
+ # sanity: the kit's lifecycle hooks are `node .issflow/hooks/*.js` — a runner
22
22
  # image WITHOUT node runs claude fine but every hook silently dies (no
23
23
  # session-start context, no feature gate). Fail the build, not the run.
24
24
  RUN node --version && claude --version
@@ -34,7 +34,7 @@ const run = (cmd, args, opts = {}) => spawnSync(cmd, args, { stdio: 'inherit', .
34
34
  if (!doc) die('usage: node scripts/feature-docker.js <path/to/FEATURE.md> [--rebuild] [--worktree]');
35
35
  const repo = process.cwd();
36
36
  if (!fs.existsSync(path.join(repo, doc))) die(`Feature doc not found: ${doc} (run from the repo root)`);
37
- if (!fs.existsSync(path.join(repo, '.claude', 'commands', 'feature.md'))) die('no .claude/commands/feature.md here — run from a repo with the kit installed');
37
+ if (!fs.existsSync(path.join(repo, '.issflow', 'commands', 'feature.md'))) die('no .issflow/commands/feature.md here — run from a repo with the kit installed');
38
38
  if (!process.env.ANTHROPIC_API_KEY) die('ANTHROPIC_API_KEY is not set');
39
39
 
40
40
  const dockerOk = spawnSync('docker', ['version'], { stdio: 'ignore' });
@@ -44,7 +44,7 @@ const haveImage = spawnSync('docker', ['image', 'inspect', IMAGE], { stdio: 'ign
44
44
  if (!haveImage || rebuild) {
45
45
  const df = fs.existsSync(path.join(repo, 'Dockerfile.issflow'))
46
46
  ? 'Dockerfile.issflow'
47
- : path.join('.claude', 'templates', 'automation', 'Dockerfile');
47
+ : path.join('.issflow', 'templates', 'automation', 'Dockerfile');
48
48
  console.log(`feature-docker: building ${IMAGE} from ${df} …`);
49
49
  if (run('docker', ['build', '-t', IMAGE, '-f', df, '.']).status !== 0) die('image build failed');
50
50
  }
@@ -0,0 +1,204 @@
1
+ <!doctype html>
2
+ <!--
3
+ Client-facing proposal (rendered by /propose from docs/PROPOSAL.md).
4
+
5
+ PAGE 1 = the only signable A4 sheet (packages 3–6 rows, short scope). Trim
6
+ sign-page copy before it overflows. Screen sheets after the first page-break
7
+ may grow extra A4 pages.
8
+
9
+ HOW TO USE (agent): copy to docs/proposal.html, replace every {{PLACEHOLDER}}.
10
+ Localise CONTENT to the project language; section labels are bilingual (TH / EN).
11
+ WHITE-LABEL: fill {{COMPANY}} / {{LOGO}} with the ISSUING company's brand (not
12
+ the kit's). {{LOGO}} optional: an <img src="…">, an SVG, or delete the monogram.
13
+ {{BANK_COL}}: omit unless the human gave bank details (no kit default).
14
+ {{PACKAGE_TABLE}}: default head = ชุดงาน / Packages + Cost; if hours columns
15
+ were requested = ประเมิน / คิดเงิน / ยอด. Never leave sample amounts in the file.
16
+ {{SCREEN_SHEETS}}: one .sheet.screens per appendix page; cover every in-scope
17
+ module from PLAN + OVERVIEW; numbered captions; no emoji icons; not pixel-binding.
18
+ {{PAGE_FOOTER}}: real page count (sign page 1 of N).
19
+ Print: Ctrl/Cmd-P → A4 → "Save as PDF".
20
+
21
+ Example screen frame (fill {{SCREEN_SHEETS}}; placeholders only — no domain copy):
22
+ <div class="sheet screens">
23
+ <div class="head">… {{COMPANY}} · ตัวอย่างจอ — ไม่ผูกพิกเซล / Screens — not pixel-binding</div>
24
+ <div class="modbar"><span class="here">{{MODULE}}</span></div>
25
+ <p class="note">{{SCREEN_NOTE}}</p>
26
+ <div class="figs">
27
+ <figure>
28
+ <div class="desk">
29
+ <div class="top"><span class="mark">{{MARK}}</span><span class="brand">{{APP_NAME}}</span></div>
30
+ <div class="body">
31
+ <div class="nav"><span class="on">{{NAV_ON}}</span></div>
32
+ <div class="main">
33
+ <div class="kpis"><div class="card">{{CARD}}</div></div>
34
+ <table class="ui">{{UI_ROWS}}</table>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <figcaption><b>{{FRAME_N}}. {{FRAME_TITLE}}</b> — {{FRAME_CAPTION}}</figcaption>
39
+ </figure>
40
+ <figure>
41
+ <div class="phone">
42
+ <div class="top"><span class="mark">{{MARK}}</span><span class="brand">{{APP_NAME}}</span></div>
43
+ <div class="screen">{{PHONE_BODY}}</div>
44
+ </div>
45
+ <figcaption><b>{{FRAME_N}}. {{FRAME_TITLE}}</b> — {{FRAME_CAPTION}}</figcaption>
46
+ </figure>
47
+ </div>
48
+ </div>
49
+ -->
50
+ <html lang="{{LANG}}">
51
+ <head>
52
+ <meta charset="utf-8" />
53
+ <title>{{TITLE}} — Proposal {{VERSION}}</title>
54
+ <style>
55
+ @page { size: A4; margin: 0 }
56
+ :root{
57
+ --ink:#162033; --muted:#5d6a7d; --line:#dbe3ee; --soft:#f6f8fb;
58
+ --violet:#635bff; --green:#15803d; --bad:#b42318;
59
+ --sans:"Inter","Noto Sans Thai",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
60
+ --mono:ui-monospace,Menlo,Consolas,monospace;
61
+ }
62
+ *{box-sizing:border-box}
63
+ body{margin:0;background:#e9edf3;color:var(--ink);font-family:var(--sans);font-size:10.5px;line-height:1.4}
64
+ .sheet{width:210mm;min-height:297mm;margin:10mm auto;background:#fff;padding:13mm 15mm;display:flex;flex-direction:column;gap:8px}
65
+ .lbl{color:var(--muted);font-size:8px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;margin:0 0 3px}
66
+ .lbl em{font-style:normal;opacity:.6;font-weight:600}
67
+ h1{font-size:19px;margin:0;letter-spacing:-.3px;line-height:1.15}
68
+ .muted{color:var(--muted)} ul{margin:0;padding-left:15px} li{margin:1px 0}
69
+
70
+ .head{display:flex;justify-content:space-between;align-items:flex-start;border-bottom:2px solid var(--ink);padding-bottom:9px}
71
+ .co{display:flex;align-items:center;gap:10px}
72
+ .logo{width:40px;height:40px;border-radius:9px;background:var(--ink);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px;flex:0 0 auto;overflow:hidden}
73
+ .logo img{width:100%;height:100%;object-fit:contain}
74
+ .co .name{font-weight:800;font-size:15px;line-height:1.15}
75
+ .co .tag{color:var(--muted);font-size:9px}
76
+ .head .meta{text-align:right;font-size:9px;color:var(--muted)}
77
+ .head .meta .big{font:800 12px/1.2 var(--sans);letter-spacing:.12em;color:var(--violet)}
78
+ .pill{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:2px 8px;font:800 8px/1 var(--mono);color:var(--muted);margin-top:4px}
79
+
80
+ .cols{display:flex;gap:16px} .cols>div{flex:1;min-width:0}
81
+ table.quote{width:100%;border-collapse:collapse;font-size:10px}
82
+ .quote th,.quote td{text-align:left;padding:4px 6px;border-bottom:1px solid var(--line)}
83
+ .quote th{background:var(--soft);font-size:8px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
84
+ .quote td.n,.quote th.n{text-align:right;font-family:var(--mono)}
85
+ .quote tfoot td{font-weight:800;border-top:1.5px solid var(--ink);border-bottom:none}
86
+ .total{display:flex;align-items:flex-end;justify-content:space-between;background:var(--soft);border-radius:9px;padding:8px 12px;gap:12px}
87
+ .total .amt{font-size:18px;font-weight:800;text-align:right}
88
+ .total .amt small{display:block;font-size:9px;color:var(--muted);font-weight:600}
89
+
90
+ .sign{display:flex;gap:34px;margin-top:auto;padding-top:10px}
91
+ .sign>div{flex:1} .line{border-bottom:1px solid var(--ink);height:26px} .sign .lbl{margin-top:4px}
92
+ footer{border-top:1px solid var(--line);padding-top:7px;color:var(--muted);font-size:8px;display:flex;justify-content:space-between}
93
+
94
+ /* screen appendix — empty chrome; fill from PLAN + OVERVIEW */
95
+ .sheet.screens{padding:10mm 12mm;gap:6px}
96
+ .screens .head{padding-bottom:6px}
97
+ .screens .note{font-size:9px;margin:0;color:var(--muted)}
98
+ .modbar{display:flex;flex-wrap:wrap;gap:4px}
99
+ .modbar span{border:1px solid var(--line);border-radius:999px;padding:2px 7px;font-size:8px;font-weight:700;color:var(--muted)}
100
+ .modbar .here{background:#ecebff;border-color:#d4d1ff;color:var(--violet)}
101
+ .figs{display:grid;grid-template-columns:1fr 1fr;gap:8px 10px;flex:1}
102
+ figure{margin:0;display:flex;flex-direction:column;min-width:0}
103
+ figcaption{margin-top:3px;font-size:8px;color:var(--muted);line-height:1.35}
104
+ figcaption b{color:var(--ink);font-weight:700}
105
+ .desk,.phone{background:#fff;border:1px solid var(--line);border-radius:10px;overflow:hidden;flex:1;min-height:0}
106
+ .top{display:flex;align-items:center;gap:6px;padding:5px 8px;border-bottom:1px solid var(--line);background:var(--soft)}
107
+ .mark{width:16px;height:16px;border-radius:4px;background:var(--violet);color:#fff;font-size:8px;font-weight:800;display:flex;align-items:center;justify-content:center}
108
+ .brand{font-weight:800;font-size:10px;color:var(--violet)}
109
+ .sub{font-size:8px;color:var(--muted)}
110
+ .body{display:flex;min-height:148px}
111
+ .nav{width:64px;border-right:1px solid var(--line);padding:5px;font-size:8px}
112
+ .nav span{display:block;padding:2px 4px;border-radius:4px;margin-bottom:1px;color:#334155}
113
+ .nav .on{background:#ecebff;color:var(--violet);font-weight:700}
114
+ .nav .tail{margin-top:6px;padding-top:4px;border-top:1px solid var(--line)}
115
+ .main{flex:1;padding:6px;min-width:0}
116
+ .kpis{display:grid;grid-template-columns:1fr 1fr 1fr;gap:4px}
117
+ .kpis.two{grid-template-columns:1fr 1fr}
118
+ .card{border:1px solid var(--line);border-radius:6px;padding:4px 5px;font-size:8px;background:#fff}
119
+ .card .n{font-size:12px;font-weight:800}
120
+ .red{border-color:#f0c4c0;background:#fff7f6}
121
+ .red .n{color:var(--bad)}
122
+ .ok{border-color:#b7d4c2;background:#f4faf6}
123
+ .ok .n{color:var(--green)}
124
+ .warn{border-color:#ead8a4;background:#fffbeb}
125
+ .ui{width:100%;border-collapse:collapse;font-size:8px;margin-top:4px}
126
+ .ui th,.ui td{text-align:left;padding:2px 3px;border-bottom:1px solid var(--line)}
127
+ .ui th{color:var(--muted);font-weight:600}
128
+ .btn{display:inline-block;background:var(--violet);color:#fff;border-radius:4px;padding:3px 7px;font-size:8px;font-weight:700;margin-top:5px}
129
+ .btn.ghost{background:#fff;color:var(--violet);border:1px solid var(--violet)}
130
+ .field{display:flex;justify-content:space-between;gap:8px;border-bottom:1px dashed var(--line);padding:3px 0;font-size:8px}
131
+ .crumbs{font-size:8px;color:var(--muted);margin-bottom:3px}
132
+ .login{padding:12px;min-height:148px;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:6px}
133
+ .login h3{margin:0;font-size:12px}
134
+ .phone{max-width:168px;margin:0 auto;width:100%}
135
+ .screen{padding:7px}
136
+ .tiny{font-size:7px;color:var(--muted)}
137
+
138
+ @media print{
139
+ body{background:#fff}
140
+ .sheet{margin:0;min-height:297mm;page-break-after:always;box-shadow:none}
141
+ .sheet:last-child{page-break-after:auto}
142
+ }
143
+ </style>
144
+ </head>
145
+ <body>
146
+ <div class="sheet">
147
+
148
+ <div class="head">
149
+ <div class="co">
150
+ <span class="logo">{{LOGO}}</span>
151
+ <span><span class="name">{{COMPANY}}</span><br><span class="tag">{{COMPANY_TAGLINE}}</span></span>
152
+ </div>
153
+ <div class="meta">
154
+ <div class="big">PROPOSAL</div>
155
+ {{VERSION}} · {{DATE}}<br><span class="pill">{{STATUS}}</span>
156
+ </div>
157
+ </div>
158
+
159
+ <div>
160
+ <p class="lbl">ใบเสนอราคา <em>Prepared for</em></p>
161
+ <h1>{{TITLE}}</h1>
162
+ <p class="muted" style="margin:3px 0 0">{{CLIENT}} — {{SUMMARY}}</p>
163
+ </div>
164
+
165
+ <div class="cols">
166
+ <div><p class="lbl">ขอบเขตงาน <em>In scope</em></p><ul>{{SCOPE_IN_ITEMS}}</ul></div>
167
+ <div><p class="lbl">นอกขอบเขต <em>Out of scope</em></p><ul>{{SCOPE_OUT_ITEMS}}</ul></div>
168
+ </div>
169
+
170
+ <div>
171
+ <p class="lbl">ชุดงาน &amp; ค่าใช้จ่าย <em>Packages &amp; cost</em></p>
172
+ <table class="quote">{{PACKAGE_TABLE}}</table>
173
+ </div>
174
+
175
+ <div class="total">
176
+ <span><span class="lbl" style="margin:0">ราคารวม <em>Total</em></span><br><span class="muted" style="font-size:9px">{{TIMELINE}}</span></span>
177
+ <!-- CLIENT-SAFE: totals only. Never put rate, rate card, or contingency % in {{TOTAL_NOTE}}. Leave empty or a non-rate label (e.g. currency). -->
178
+ <span class="amt">{{TOTAL_COST}} <small>{{TOTAL_NOTE}}</small></span>
179
+ </div>
180
+
181
+ <div class="cols">
182
+ <div><p class="lbl">สมมุติฐาน <em>Assumptions</em></p><ul>{{ASSUMPTION_ITEMS}}</ul></div>
183
+ <div><p class="lbl">ข้อยกเว้น <em>Exclusions</em></p><ul>{{EXCLUSION_ITEMS}}</ul></div>
184
+ </div>
185
+
186
+ <div class="cols">
187
+ <div>
188
+ <p class="lbl">เงื่อนไขการชำระเงิน <em>Payment</em></p>
189
+ <ul>{{PAYMENT_ITEMS}}</ul>
190
+ </div>
191
+ {{BANK_COL}}
192
+ </div>
193
+
194
+ <div class="sign">
195
+ <div><div class="line"></div><p class="lbl">ลงนามลูกค้า <em>Client sign-off</em></p></div>
196
+ <div><div class="line"></div><p class="lbl">วันที่ <em>Date</em></p></div>
197
+ </div>
198
+
199
+ <footer><span>{{COMPANY}} · {{PAGE_FOOTER}}</span><span>{{VERSION}}</span></footer>
200
+ </div>
201
+
202
+ {{SCREEN_SHEETS}}
203
+ </body>
204
+ </html>
@@ -1,33 +0,0 @@
1
- # `.claude/` — portable iStartSoftFlow kit
2
-
3
- This directory is the **portable workflow kit** installed into every project.
4
- Content is **tool-agnostic**. The folder name `.claude/` is a **host convention**
5
- (Claude Code and several other agents load commands/agents/hooks from this path).
6
- It is **not** “Claude-only product branding.”
7
-
8
- **Human entry points (repo root):**
9
-
10
- | File | Role |
11
- |------|------|
12
- | `AGENTS.md` | Open-standard primary entry — indexes this kit |
13
- | `CLAUDE.md` | Thin shim (`@AGENTS.md`) — only because Claude Code auto-loads that filename |
14
-
15
- **Single source of truth for rules:** [`istartsoft-flow/METHODOLOGY.md`](./istartsoft-flow/METHODOLOGY.md)
16
-
17
- ## Layout
18
-
19
- | Path | What |
20
- |------|------|
21
- | `agents/` | Fresh-context workers (planner, researcher, implementer, …) |
22
- | `commands/` | Procedures — Default: `/overview` `/feature` `/quick`; Advanced: `/propose` `/design` `/support` … |
23
- | `skills/` | On-demand cookbooks (ux-design, security, support-triage, …) |
24
- | `hooks/` | Lifecycle enforcement (context, plan gate, feature gate, …) |
25
- | `istartsoft-flow/` | METHODOLOGY.md — every hard rule lives here once |
26
- | `templates/` | Proposal / UX pack / architecture / CR / FEATURE / automation |
27
- | `settings.json` | Host hook wiring (when using Claude Code adapter) |
28
- | `flow-config.json` | Context watchdog + sprint knobs (optional overrides) |
29
-
30
- Do **not** duplicate METHODOLOGY rules into other files (anti-drift).
31
- Do **not** put personal rate cards or salary numbers in this kit.
32
-
33
- Installer: `npx create-issflow` (omit `--tool` = all adapters).