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