@iamu-dev/iamu 0.2.0-beta.15 → 0.2.0-beta.17
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/dist/bin.js +1237 -727
- package/dist/commands/explore.d.ts +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/new-entity.d.ts +6 -0
- package/dist/index.js +1227 -711
- package/dist/templates/skills/iamu-findings.md +15 -2
- package/dist/templates/skills/iamu-new.md +7 -2
- package/dist/templates/skills/iamu-propose.md +19 -3
- package/dist/templates/skills/iamu-run.md +49 -3
- package/dist/templates/skills/iamu-status.md +9 -0
- package/package.json +18 -18
|
@@ -226,9 +226,22 @@ If `<N> > 0` findings were queued for fix:
|
|
|
226
226
|
|
|
227
227
|
- **Executing the queued fixes:**
|
|
228
228
|
When Option 1 is chosen, apply code edits for each queued finding sequentially in the workspace. Verify the changes once (run test/typecheck suite). Update each finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
|
|
229
|
-
|
|
229
|
+
Run `iamu validate --all` to verify all entities before reporting done.
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
- **Closed-Loop Regression Verification (1-Click):**
|
|
232
|
+
If the addressed findings belong to a known scenario:
|
|
233
|
+
- If interactive tool available:
|
|
234
|
+
- Question: "Fixes applied and validated. Verify them now with a walkthrough re-run?"
|
|
235
|
+
- Options:
|
|
236
|
+
1. "[Recommended] Re-run walkthrough for <scenario-slug> to verify fixes hold"
|
|
237
|
+
2. "Done for now (leave verification for later)"
|
|
238
|
+
- Otherwise (CLI / text-only):
|
|
239
|
+
Verify fixes now?
|
|
240
|
+
1. [Recommended] Re-run walkthrough for <scenario-slug> to verify fixes hold
|
|
241
|
+
2. Done for now (leave verification for later)
|
|
242
|
+
Press Enter to re-run [1], select 2:
|
|
243
|
+
|
|
244
|
+
When Option 1 is chosen, hand off to `iamu-run <scenario-slug>` to re-run the walkthrough, visit the revisit places, verify resolutions in `canonical.json`, and report the verified delta.
|
|
232
245
|
|
|
233
246
|
### 6. Publish and link (linked mode only)
|
|
234
247
|
|
|
@@ -200,19 +200,24 @@ Use CLI commands to scaffold entities with valid frontmatter. The CLI generates
|
|
|
200
200
|
|
|
201
201
|
**1. Capability** (only if new):
|
|
202
202
|
```bash
|
|
203
|
-
iamu new capability --name "Incident Reporting"
|
|
203
|
+
iamu new capability --name "Incident Reporting" \
|
|
204
|
+
--description "What staff can do when something goes wrong on shift" \
|
|
205
|
+
--paths "/incidents" \
|
|
206
|
+
--area "Operations" \
|
|
207
|
+
--json
|
|
204
208
|
```
|
|
205
209
|
|
|
206
210
|
**2. Outline** (the situation — problem-space, no UI references):
|
|
207
211
|
```bash
|
|
208
212
|
iamu new outline --name "Busy shift handoff" \
|
|
209
213
|
--capability incident-reporting \
|
|
214
|
+
--additional-capabilities team-access \
|
|
210
215
|
--tension "Incident details are fragmented across multiple logs while shift time expires" \
|
|
211
216
|
--narrative "A shift leader needs to hand off a set of open incidents to the incoming supervisor." \
|
|
212
217
|
--human-test "Could the incoming leader act immediately without asking clarifying questions?" \
|
|
213
218
|
--json
|
|
214
219
|
```
|
|
215
|
-
The `--capability`, `--tension`, `--narrative`, and repeatable `--human-test` flags populate outline frontmatter directly. The outline body stays empty. If specialized fields like `situation_roles` are needed, edit the generated frontmatter.
|
|
220
|
+
The `--capability`, `--additional-capabilities`, `--tension`, `--narrative`, and repeatable `--human-test` flags populate outline frontmatter directly. The outline body stays empty. If specialized fields like `situation_roles` are needed, edit the generated frontmatter.
|
|
216
221
|
|
|
217
222
|
**3. Persona** (if user picked a new persona to scaffold):
|
|
218
223
|
```bash
|
|
@@ -52,7 +52,16 @@ Read existing entities to understand what's already been tested:
|
|
|
52
52
|
- `iamu/scenarios/` — what's already bound to personas?
|
|
53
53
|
- `iamu/personas/` — who do we already have in our casting panel?
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
**Check Live Product Map Coverage:**
|
|
56
|
+
Inspect live surface coverage by checking `iamu status --json` (`explore`) or running `iamu explore coverage --json`:
|
|
57
|
+
- **When an explore map exists:**
|
|
58
|
+
Extract unreached surfaces (`unreached` array) and `run_only_places`.
|
|
59
|
+
- **Grounding proposals in unreached topology:** Prioritize proposing scenarios that enter through or traverse these unreached surfaces, pairing them with actors from `context.yml` who have domain tension in those areas.
|
|
60
|
+
- Set each proposed scenario's `Reachable Surface` and entry route to the unreached surface path.
|
|
61
|
+
- **When no explore map exists:**
|
|
62
|
+
Proceed with domain context grounding. Note: `Tip: run iamu explore <target_url> to map live surfaces so proposals target real unreached routes.`
|
|
63
|
+
|
|
64
|
+
Build a coverage picture: which capabilities have scenarios? Which actors from `context.yml` lack personas? Which discovered surfaces have 0 walkthrough coverage? Where are the gaps?
|
|
56
65
|
|
|
57
66
|
### 3. Determine focus
|
|
58
67
|
|
|
@@ -60,7 +69,7 @@ Four entry paths based on `$ARGUMENTS`:
|
|
|
60
69
|
|
|
61
70
|
- **Persona / Tester panel** (e.g. `iamu-propose "personas"`, `"who else should we test with?"`, `"propose new personas"`) — analyze which actors from `context.yml` lack personas in `iamu/personas/`. Focus proposals on creating durable, diagnostically biased personas for uncovered roles.
|
|
62
71
|
- **Area or capability** (e.g. `iamu-propose "employee provisioning"`) — focus proposals on this area. Match against capabilities and context actors/workflows.
|
|
63
|
-
- **Open-ended** (e.g. `iamu-propose`, `iamu-propose "what's missing?"`) — analyze coverage gaps across
|
|
72
|
+
- **Open-ended** (e.g. `iamu-propose`, `iamu-propose "what's missing?"`) — analyze coverage gaps across scenarios, persona diversity, and unreached surfaces from `iamu explore coverage`. Prioritize uncovered capabilities, actors without personas, and unreached live surfaces.
|
|
64
73
|
- **Specific tension** (e.g. `iamu-propose "what happens when the safety coordinator disagrees with HR?"`) — use as seed but ground in context. Verify the tension is real (do these actors and dynamics exist in the domain?).
|
|
65
74
|
|
|
66
75
|
### 4. Present candidates (Numbered Cards)
|
|
@@ -73,16 +82,23 @@ Lead with existing coverage using clickable links, then render the candidates:
|
|
|
73
82
|
|
|
74
83
|
```
|
|
75
84
|
Existing coverage: <N> scenarios ([<slug1>](iamu/scenarios/<slug1>.md), ...). Uncovered areas: <gaps>.
|
|
85
|
+
Product map: <R>/<T> surfaces reached · <U> unreached ([view](iamu explore coverage)).
|
|
76
86
|
|
|
77
87
|
1. <Short situation name> (<Actor from context>)
|
|
88
|
+
• Capability: <Capability slug, e.g. billing-invoicing>
|
|
89
|
+
• Entry route: <Unreached route from map, e.g. /billing/invoices/new>
|
|
78
90
|
• Tension: <1-line human/domain tension>
|
|
79
91
|
• Stress-tests: <What this reveals about the product>
|
|
80
92
|
|
|
81
93
|
2. <Short situation name> (<Actor from context>)
|
|
94
|
+
• Capability: <Capability slug, e.g. team-access>
|
|
95
|
+
• Entry route: <Unreached route from map, e.g. /team/roles/custom>
|
|
82
96
|
• Tension: <1-line human/domain tension>
|
|
83
97
|
• Stress-tests: <What this reveals about the product>
|
|
84
98
|
|
|
85
99
|
3. <Short situation name> (<Actor from context>)
|
|
100
|
+
• Capability: <Capability slug, e.g. incident-response>
|
|
101
|
+
• Entry route: <Unreached route from map, e.g. /incidents/export>
|
|
86
102
|
• Tension: <1-line human/domain tension>
|
|
87
103
|
• Stress-tests: <What this reveals about the product>
|
|
88
104
|
|
|
@@ -141,7 +157,7 @@ Ground rules for generation:
|
|
|
141
157
|
|
|
142
158
|
### 5. Selection and Handoff
|
|
143
159
|
|
|
144
|
-
- **User picks a scenario candidate (e.g. "1" or Enter)** → Immediately invoke `iamu-new` in **Fast-Path Scenario Mode** passing the selected candidate title, actor, tension, and evaluation checkpoint as structured arguments. Do NOT allow `iamu-new` to restart seed brainstorming. It must present the single Scenario Spec-Sheet directly for instant 1-click persistence.
|
|
160
|
+
- **User picks a scenario candidate (e.g. "1" or Enter)** → Immediately invoke `iamu-new` in **Fast-Path Scenario Mode** passing the selected candidate title, actor, primary capability slug (`--capability`), entry path (`--entry`), tension, and evaluation checkpoint as structured arguments. Do NOT allow `iamu-new` to restart seed brainstorming. It must present the single Scenario Spec-Sheet directly for instant 1-click persistence.
|
|
145
161
|
- **User picks a persona candidate** → Immediately invoke `iamu-new` in **Standalone Persona Mode** with the candidate's name, role, disposition, and friction triggers to scaffold directly into `iamu/personas/<slug>.md`.
|
|
146
162
|
- **User refines** → regenerate candidates applying the requested adjustments.
|
|
147
163
|
- **User rejects all** → ask what domain area or actor they want to explore. Loop back to step 4.
|
|
@@ -144,7 +144,27 @@ After bind + brief, the scenario is ready to execute. Continue to step 3.
|
|
|
144
144
|
1. If the user passed an explicit target or the scenario has `target_url`, use that.
|
|
145
145
|
2. Otherwise, check `iamu/testability.md` for `target_url`.
|
|
146
146
|
3. If still unconfigured, prompt the user for the target URL (live product, staging, or localhost).
|
|
147
|
-
|
|
147
|
+
**Dev Server Preflight Check:**
|
|
148
|
+
Verify target reachability before launching the walker with `iamu doctor --target <url>` (or a fast HTTP probe).
|
|
149
|
+
If the target is a local URL (e.g. `http://localhost:*`, `http://127.0.0.1:*`) and is unreachable:
|
|
150
|
+
1. Inspect `iamu/testability.md` for `Command:` under `## Target & Run Instructions` (or check `package.json` for a `dev` or `start` script).
|
|
151
|
+
2. Prompt the user:
|
|
152
|
+
- If interactive tool available:
|
|
153
|
+
- Question: "Target URL <url> is unreachable. Boot dev server now?"
|
|
154
|
+
- Options:
|
|
155
|
+
1. "[Recommended] Boot dev server in background (`<dev_command>`) and proceed"
|
|
156
|
+
2. "I will start the dev server manually (wait for port)"
|
|
157
|
+
3. "Specify a different target URL"
|
|
158
|
+
- Otherwise (CLI / text-only):
|
|
159
|
+
Target URL <url> is unreachable. Boot dev server now?
|
|
160
|
+
1. [Recommended] Boot dev server in background (`<dev_command>`) and proceed
|
|
161
|
+
2. I will start the dev server manually (wait for port)
|
|
162
|
+
3. Specify a different target URL
|
|
163
|
+
Press Enter to boot dev server [1], select 2-3:
|
|
164
|
+
3. If Option 1 is chosen:
|
|
165
|
+
- Launch `<dev_command>` in the background as a managed daemon process.
|
|
166
|
+
- Poll `<url>` with HTTP requests until it responds (timeout: 30s).
|
|
167
|
+
- Once reachable, proceed immediately to the walkthrough.
|
|
148
168
|
|
|
149
169
|
Where the walk *starts* is part of the situation, not of the environment: a persona arriving from a video, an email or a search result lands on a specific page, not the home page. If the scenario has `entry_path`, `iamu start-run` resolves it against the target — pass the product's base URL as `--target`. If it has none but the situation clearly begins on a particular page, set `entry_path` in the scenario frontmatter first (a path like `/en/episodes/1`, never a full URL), so this run and every later one start there. A walk started on the wrong page reports the detour as a finding.
|
|
150
170
|
|
|
@@ -512,8 +532,34 @@ When the user asks to review findings one by one:
|
|
|
512
532
|
Tell the user: "✓ Applied fixes for <K> findings. All marked addressed."
|
|
513
533
|
|
|
514
534
|
- Run `iamu validate --all`.
|
|
515
|
-
|
|
516
|
-
-
|
|
535
|
+
|
|
536
|
+
- **Closed-Loop Regression Verification (1-Click):**
|
|
537
|
+
Immediately prompt the user to verify the fixes hold in practice:
|
|
538
|
+
- If interactive tool available:
|
|
539
|
+
- Question: "Fixes applied and validated. Verify them now with a walkthrough re-run?"
|
|
540
|
+
- Options:
|
|
541
|
+
1. "[Recommended] Re-run walkthrough to verify fixes hold"
|
|
542
|
+
2. "Done for now (leave verification for later)"
|
|
543
|
+
- Otherwise (CLI / text-only):
|
|
544
|
+
Verify fixes now?
|
|
545
|
+
1. [Recommended] Re-run walkthrough to verify fixes hold
|
|
546
|
+
2. Done for now (leave verification for later)
|
|
547
|
+
Press Enter to re-run [1], select 2:
|
|
548
|
+
|
|
549
|
+
When Option 1 is chosen:
|
|
550
|
+
1. Start the verification run: `iamu start-run <scenario-slug> --target <target> --json`. Note: `start-run` automatically pulls all awaiting findings into `revisit` places in `walkthrough.json`.
|
|
551
|
+
2. Walk through the scenario, ensuring the persona visits the revisit places.
|
|
552
|
+
3. Assemble the run with `iamu complete <run-id> --json`. The canonical assembly compares against the baseline run and outputs `verification` (`resolved`, `persists`, `new_findings`).
|
|
553
|
+
4. Report the verification verdict:
|
|
554
|
+
```text
|
|
555
|
+
Verification Complete:
|
|
556
|
+
Scenario: <scenario-slug>
|
|
557
|
+
Baseline run: <baseline_run_id>
|
|
558
|
+
Verified fixes: ✓ <N> resolved
|
|
559
|
+
Regressions: 0 new findings
|
|
560
|
+
```
|
|
561
|
+
5. If any finding persists or a regression occurred, present only the remaining items for follow-up triage.
|
|
562
|
+
6. In linked mode, run `iamu sync --json` once so teammates see the verified decisions.
|
|
517
563
|
|
|
518
564
|
#### B. Direct Batch Actions ("fix 1 and 2", "fix all critical")
|
|
519
565
|
Read the finding details from the canonical JSON (already in context), inspect the code, make the edits, and update frontmatter to `triage_status: addressed` with `triage_note`.
|
|
@@ -29,6 +29,7 @@ When the user asks for project status, lead with an executive tally banner, foll
|
|
|
29
29
|
|
|
30
30
|
```
|
|
31
31
|
Project Status: <P> Personas · <S> Scenarios (<R> Tested, <U> Untested) · <F> Open Findings · <C> Capabilities
|
|
32
|
+
Product Map: <T> Surfaces (<R> Reached · <U> Unreached) [if explore map exists]
|
|
32
33
|
```
|
|
33
34
|
|
|
34
35
|
**Personas:**
|
|
@@ -40,6 +41,14 @@ Project Status: <P> Personas · <S> Scenarios (<R> Tested, <U> Untested) · <F>
|
|
|
40
41
|
**Findings:**
|
|
41
42
|
• `1` [CRITICAL · hinders] Submit fails opaquely on empty field — [`view`](iamu/findings/<slug>.md)
|
|
42
43
|
|
|
44
|
+
**Awaiting Verification (Needs a Re-run):**
|
|
45
|
+
If `iamu status` reports fixes awaiting a re-run:
|
|
46
|
+
• [`<scenario-slug>`](iamu/scenarios/<scenario-slug>.md) — <N> fixes awaiting verification from a re-run (`iamu-run <scenario-slug>`)
|
|
47
|
+
|
|
48
|
+
**Product Map & Unreached Surfaces:**
|
|
49
|
+
If `iamu status --json` has `explore` data:
|
|
50
|
+
• <T> surfaces mapped (<R> reached, <U> unreached) — run `iamu explore coverage` to inspect blind spots or `/iamu:propose` to target unreached surfaces.
|
|
51
|
+
|
|
43
52
|
### 3. Ignore internal templates
|
|
44
53
|
|
|
45
54
|
The directory `iamu/.prompts/` contains internal prompt templates (`persona.md`, `outline.md`, etc.). These are NOT project entities. Never list them or explain them to the user.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iamu-dev/iamu",
|
|
3
|
-
"version": "0.2.0-beta.
|
|
3
|
+
"version": "0.2.0-beta.17",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Test your product as realistic personas — scenario-driven development CLI",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"homepage": "https://iamu.dev",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/iamu-dev/iamu.git",
|
|
11
|
+
"url": "git+https://github.com/iamu-dev/iamu.git",
|
|
12
12
|
"directory": "apps/cli"
|
|
13
13
|
},
|
|
14
14
|
"bugs": "https://github.com/iamu-dev/iamu/issues",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"claude-code"
|
|
23
23
|
],
|
|
24
24
|
"bin": {
|
|
25
|
-
"iamu": "
|
|
25
|
+
"iamu": "dist/bin.js"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": true,
|
|
28
28
|
"files": [
|
|
@@ -43,16 +43,6 @@
|
|
|
43
43
|
"engines": {
|
|
44
44
|
"node": ">=22"
|
|
45
45
|
},
|
|
46
|
-
"scripts": {
|
|
47
|
-
"build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",
|
|
48
|
-
"clean": "node -e \"fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('tsconfig.tsbuildinfo', { force: true }); fs.rmSync('tsconfig.build.tsbuildinfo', { force: true })\"",
|
|
49
|
-
"typecheck": "tsc --noEmit",
|
|
50
|
-
"test": "vitest run",
|
|
51
|
-
"test:coverage": "vitest run --coverage",
|
|
52
|
-
"eval:walkthroughs": "vitest run --config vitest.benchmark.config.ts",
|
|
53
|
-
"eval:gemini": "node dist/eval/gemini-eval-cli.js",
|
|
54
|
-
"pack:dry-run": "npm pack --dry-run"
|
|
55
|
-
},
|
|
56
46
|
"dependencies": {
|
|
57
47
|
"@clack/prompts": "^1.8.1",
|
|
58
48
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
@@ -62,14 +52,24 @@
|
|
|
62
52
|
"zod": "^3.25.0"
|
|
63
53
|
},
|
|
64
54
|
"devDependencies": {
|
|
65
|
-
"@iamu-dev/local-store": "workspace:*",
|
|
66
|
-
"@iamu-dev/protocol": "workspace:*",
|
|
67
|
-
"@iamu/tsconfig": "workspace:*",
|
|
68
55
|
"@types/node": "^22.0.0",
|
|
69
56
|
"@vitest/coverage-v8": "^4.1.11",
|
|
70
57
|
"google-auth-library": "^11.1.0",
|
|
71
58
|
"tsup": "^8.5.1",
|
|
72
59
|
"typescript": "^5.8.0",
|
|
73
|
-
"vitest": "^4.1.11"
|
|
60
|
+
"vitest": "^4.1.11",
|
|
61
|
+
"@iamu-dev/local-store": "0.1.0",
|
|
62
|
+
"@iamu-dev/protocol": "0.1.0",
|
|
63
|
+
"@iamu/tsconfig": "0.1.0"
|
|
64
|
+
},
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",
|
|
67
|
+
"clean": "node -e \"fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('tsconfig.tsbuildinfo', { force: true }); fs.rmSync('tsconfig.build.tsbuildinfo', { force: true })\"",
|
|
68
|
+
"typecheck": "tsc --noEmit",
|
|
69
|
+
"test": "vitest run",
|
|
70
|
+
"test:coverage": "vitest run --coverage",
|
|
71
|
+
"eval:walkthroughs": "vitest run --config vitest.benchmark.config.ts",
|
|
72
|
+
"eval:gemini": "node dist/eval/gemini-eval-cli.js",
|
|
73
|
+
"pack:dry-run": "npm pack --dry-run"
|
|
74
74
|
}
|
|
75
|
-
}
|
|
75
|
+
}
|