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.
- package/README.md +5 -5
- package/bin/cli.js +60 -52
- package/package.json +1 -1
- package/template/.issflow/README.md +36 -0
- package/template/{.claude → .issflow}/commands/change-request.md +3 -2
- package/template/{.claude → .issflow}/commands/design.md +2 -2
- package/template/{.claude → .issflow}/commands/feature.md +2 -2
- package/template/{.claude → .issflow}/commands/propose.md +80 -18
- package/template/{.claude → .issflow}/commands/security-audit.md +1 -1
- package/template/{.claude → .issflow}/commands/store-wisdom.md +3 -3
- package/template/{.claude → .issflow}/commands/ui-audit.md +1 -1
- package/template/.issflow/flow-config.json +12 -0
- package/template/{.claude → .issflow}/hooks/context-guard.js +2 -2
- package/template/{.claude → .issflow}/hooks/lib/ctx.js +1 -1
- package/template/{.claude → .issflow}/hooks/plan-gate.js +1 -1
- package/template/{.claude → .issflow}/hooks/session-start.js +2 -2
- package/template/{.claude → .issflow}/istartsoft-flow/METHODOLOGY.md +40 -37
- package/template/{.claude → .issflow}/templates/automation/Dockerfile +1 -1
- package/template/{.claude → .issflow}/templates/automation/feature-docker.js +2 -2
- package/template/.issflow/templates/proposal.html +204 -0
- package/template/.claude/README.md +0 -33
- package/template/.claude/templates/proposal.html +0 -113
- /package/template/{.claude → .issflow}/agents/debugger.md +0 -0
- /package/template/{.claude → .issflow}/agents/e2e-runner.md +0 -0
- /package/template/{.claude → .issflow}/agents/implementer.md +0 -0
- /package/template/{.claude → .issflow}/agents/planner.md +0 -0
- /package/template/{.claude → .issflow}/agents/researcher.md +0 -0
- /package/template/{.claude → .issflow}/agents/synthesizer.md +0 -0
- /package/template/{.claude → .issflow}/agents/test-author.md +0 -0
- /package/template/{.claude → .issflow}/commands/goal.md +0 -0
- /package/template/{.claude → .issflow}/commands/log-decision.md +0 -0
- /package/template/{.claude → .issflow}/commands/log-issue.md +0 -0
- /package/template/{.claude → .issflow}/commands/overview.md +0 -0
- /package/template/{.claude → .issflow}/commands/phase.md +0 -0
- /package/template/{.claude → .issflow}/commands/qa-audit.md +0 -0
- /package/template/{.claude → .issflow}/commands/quick.md +0 -0
- /package/template/{.claude → .issflow}/commands/release.md +0 -0
- /package/template/{.claude → .issflow}/commands/replan.md +0 -0
- /package/template/{.claude → .issflow}/commands/runbook.md +0 -0
- /package/template/{.claude → .issflow}/commands/sprint.md +0 -0
- /package/template/{.claude → .issflow}/commands/support.md +0 -0
- /package/template/{.claude → .issflow}/commands/synthesize.md +0 -0
- /package/template/{.claude → .issflow}/commands/uat.md +0 -0
- /package/template/{.claude → .issflow}/commands/unstuck.md +0 -0
- /package/template/{.claude → .issflow}/hooks/feature-gate.js +0 -0
- /package/template/{.claude → .issflow}/hooks/pre-compact.js +0 -0
- /package/template/{.claude → .issflow}/hooks/subagent-stop.js +0 -0
- /package/template/{.claude → .issflow}/skills/caveman/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/code-standards/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/code-standards/references/architecture.md +0 -0
- /package/template/{.claude → .issflow}/skills/code-standards/references/naming.md +0 -0
- /package/template/{.claude → .issflow}/skills/grill-me/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/karpathy-guidelines/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/security/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/security/references/pentest-checklist.md +0 -0
- /package/template/{.claude → .issflow}/skills/security/references/secure-coding.md +0 -0
- /package/template/{.claude → .issflow}/skills/security/references/standards.md +0 -0
- /package/template/{.claude → .issflow}/skills/security/references/threat-modeling.md +0 -0
- /package/template/{.claude → .issflow}/skills/support-triage/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/ux-design/SKILL.md +0 -0
- /package/template/{.claude → .issflow}/skills/ux-design/references/wireframe-template.md +0 -0
- /package/template/{.claude → .issflow}/templates/ARCHITECTURE-template.md +0 -0
- /package/template/{.claude → .issflow}/templates/CR-template.md +0 -0
- /package/template/{.claude → .issflow}/templates/FEATURE-template.md +0 -0
- /package/template/{.claude → .issflow}/templates/UX-PACK-template.md +0 -0
- /package/template/{.claude → .issflow}/templates/automation/issflow-feature.yml +0 -0
- /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, '.
|
|
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 ใน .
|
|
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 + '/.
|
|
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 = '.
|
|
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 .
|
|
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 `.
|
|
4
|
-
> part of the **portable kit
|
|
5
|
-
>
|
|
6
|
-
>
|
|
7
|
-
>
|
|
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,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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 `.
|
|
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 (`.
|
|
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 (`.
|
|
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 `.
|
|
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 .
|
|
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
|
-
`.
|
|
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 `.
|
|
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 `.
|
|
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
|
-
`.
|
|
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 `.
|
|
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 `.
|
|
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 +
|
|
625
|
-
+ sign-off. Versioned; client-safe commercial
|
|
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
|
-
`.
|
|
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 `.
|
|
630
|
-
- `.
|
|
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
|
-
- `.
|
|
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
|
-
- `.
|
|
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
|
-
- `.
|
|
692
|
+
- `.issflow/skills/ux-design/` — the UX cookbook + wireframe baseline (read on
|
|
690
693
|
demand for any UI work).
|
|
691
|
-
- `.
|
|
694
|
+
- `.issflow/skills/security/` — the Secure SDLC cookbook + threat-modeling /
|
|
692
695
|
secure-coding / pentest / standards references (read on demand for security work).
|
|
693
|
-
- `.
|
|
696
|
+
- `.issflow/skills/code-standards/` — naming-per-language + architecture cookbook
|
|
694
697
|
(read on demand for any coding / scaffolding / structure decision).
|
|
695
|
-
- `.
|
|
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: **`.
|
|
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) | `.
|
|
711
|
-
| **Cursor** | `.cursor/rules/` + `AGENTS.md` | `.cursor/commands/` | reads `.
|
|
712
|
-
| **Gemini CLI** | `GEMINI.md` + `AGENTS.md` | `.
|
|
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 .
|
|
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, '.
|
|
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('.
|
|
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">ชุดงาน & ค่าใช้จ่าย <em>Packages & 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).
|