@iamu-dev/iamu 0.3.0-beta.0 → 0.3.0-beta.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/dist/bin.js +424 -44
- package/dist/commands/set-entity.d.ts +32 -5
- package/dist/index.js +424 -44
- package/dist/templates/skills/iamu-findings.md +55 -34
- package/dist/templates/skills/iamu-run.md +70 -50
- package/dist/templates/skills/iamu-setup.md +32 -33
- package/package.json +3 -3
|
@@ -115,16 +115,20 @@ Reply '1' to walk through all [default], select 2-3, or enter a finding number/s
|
|
|
115
115
|
|
|
116
116
|
Read the finding file at `iamu/findings/<slug>.md`. Parse the YAML frontmatter (`severity`, `type`, `title`, `ui_fact`, `consequence`, `persona`, `walkthrough_step_id`, `screen_title`, `page_url`, `run`) and markdown body (description and recommendation).
|
|
117
117
|
|
|
118
|
-
Synthesize a
|
|
118
|
+
Synthesize a scannable triage summary. Do NOT output an undifferentiated wall of bullets or academic schema labels like "UI Fact:". The reviewer must be able to parse **What is broken** and **What to fix** in under 3 seconds.
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
120
|
+
Format the visible finding in chat:
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
### Finding #<N>/<total> [<SEVERITY>] — <title>
|
|
124
|
+
> **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
|
|
125
|
+
> **Evidence:** `iamu/.runs/<run>/screenshots/step-<N>.png` [Dashboard](<url if cloud_linked>)
|
|
126
|
+
|
|
127
|
+
**❌ Problem:**
|
|
128
|
+
<What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
|
|
129
|
+
|
|
130
|
+
**💡 Recommendation:**
|
|
131
|
+
<Concrete fix proposal from finding body>
|
|
128
132
|
```
|
|
129
133
|
|
|
130
134
|
If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
|
|
@@ -135,38 +139,45 @@ Emit this card visibly into the conversation.
|
|
|
135
139
|
|
|
136
140
|
Every finding must land on a decision — never silently skip. Match the user's intent to the closest option.
|
|
137
141
|
|
|
138
|
-
**CRITICAL: Embed
|
|
139
|
-
Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **
|
|
142
|
+
**CRITICAL: Embed Scannable Finding in Interactive Prompt Modals:**
|
|
143
|
+
Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **Embed this exact scannable structure inside the `question` argument** with blank lines separating the sections:
|
|
140
144
|
|
|
141
145
|
- If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
|
|
142
146
|
- **Question:**
|
|
143
147
|
"""
|
|
144
|
-
Finding #<N>/<total
|
|
148
|
+
Finding #<N>/<total> [<SEVERITY>]: <title>
|
|
149
|
+
Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
|
|
150
|
+
|
|
151
|
+
❌ PROBLEM:
|
|
152
|
+
<What is broken or awkward on screen and why it hinders the persona in 1–2 direct sentences>
|
|
145
153
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
• UI Fact: <ui_fact>
|
|
149
|
-
• Consequence: <consequence>
|
|
150
|
-
• Agent Insight: <1–2 sentences explaining why this happens in simple terms>
|
|
151
|
-
• Recommendation: <concrete recommendation>
|
|
152
|
-
• Evidence: <screenshot path, local file link, and cloud dashboard link if linked>
|
|
154
|
+
💡 RECOMMENDATION:
|
|
155
|
+
<Concrete fix proposal from finding body>
|
|
153
156
|
|
|
154
157
|
How should we triage this finding?
|
|
155
158
|
"""
|
|
156
159
|
- **Options:**
|
|
157
|
-
1. "[Recommended] Queue to fix (
|
|
158
|
-
2. "Dismiss /
|
|
159
|
-
3. "
|
|
160
|
-
4. "
|
|
161
|
-
5. "
|
|
160
|
+
1. "[Recommended] Queue to fix (<brief 3-5 word fix summary>)"
|
|
161
|
+
2. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
|
|
162
|
+
3. "Discuss / Explore trade-offs"
|
|
163
|
+
4. "Fix immediately (leave triage now)"
|
|
164
|
+
5. "Next finding (keep open / defer)"
|
|
162
165
|
- Otherwise (in CLI or text-only environments):
|
|
163
166
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
Finding #<N>/<total> [<SEVERITY>]: <title>
|
|
168
|
+
Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
|
|
169
|
+
|
|
170
|
+
❌ PROBLEM:
|
|
171
|
+
<What went wrong and why it hinders the persona in 1–2 direct sentences>
|
|
172
|
+
|
|
173
|
+
💡 RECOMMENDATION:
|
|
174
|
+
<Concrete fix proposal>
|
|
175
|
+
|
|
176
|
+
1. [Recommended] Queue to fix (<brief 3-5 word fix summary>)
|
|
177
|
+
2. Dismiss / Skip (not relevant or walker error)
|
|
178
|
+
3. Discuss / Explore trade-offs
|
|
179
|
+
4. Fix immediately (leave triage now)
|
|
180
|
+
5. Next finding (keep open / defer)
|
|
170
181
|
|
|
171
182
|
Reply '1' to queue fix [default], enter 2-5, or describe your decision:
|
|
172
183
|
|
|
@@ -183,6 +194,9 @@ triage_status: addressed
|
|
|
183
194
|
triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
|
|
184
195
|
```
|
|
185
196
|
|
|
197
|
+
- **Discuss / Explore trade-offs (Conversational Dialogue Mode — NO MODAL LOOPS)** → when the user chooses "Discuss", asks a question, or wants to explore architectural trade-offs:
|
|
198
|
+
**DO NOT invoke `ask_question` or present multiple-choice menus.** Stay in natural conversational chat as a senior pair programmer. Answer follow-up questions, inspect code, benchmark against competitors, and discuss options in plain markdown. Converse naturally back and forth until you reach a conclusion together. Only when a consensus or decision is reached ("let's queue it", "dismiss it", "fix it now"), record the decision and proceed. Do NOT trap the user with modal dialogs after each conversational turn.
|
|
199
|
+
|
|
186
200
|
- **Queue to fix [Recommended in list-mode]** → add to the session's fix queue. Tell the user in 1 line: "✓ Queued for fix. Advancing to next finding..." and loop to the next finding. Complete the triage queue across all findings first.
|
|
187
201
|
|
|
188
202
|
- **Fix immediately (leave triage now)** → the change is small, one-or-two files, and user explicitly chose to leave triage now. Make the edit, verify it loads (if a dev server is running, open the affected screen and check), then record: `iamu triage <slug> --status addressed --note "<one-line change summary>"`. Do not close a finding as addressed before the change lands and is inspected. Tell the user the fix now awaits a re-run: only a later walkthrough of the scenario turns it verified.
|
|
@@ -193,12 +207,19 @@ triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
|
|
|
193
207
|
|
|
194
208
|
- **Won't fix (accepted trade-off)** → the problem is real but the team accepts it. `iamu triage <slug> --status wont_fix --note "<the trade-off>"`. It stays out of future walks' dismissed list only as a known issue — no guidance rule is written.
|
|
195
209
|
|
|
196
|
-
- **Not relevant / walker got it wrong** → the finding should never have been reported.
|
|
197
|
-
|
|
198
|
-
|
|
210
|
+
- **Not relevant / walker got it wrong (Load-Bearing Guidance Learning)** → the finding should never have been reported. **Never infer the reason silently.** Always ask the user:
|
|
211
|
+
> "To teach future walkthroughs what not to report, why should this be dismissed?
|
|
212
|
+
> • **By design / intended behavior:** (Why this pattern is expected)
|
|
213
|
+
> • **Walker error:** (What the walker misread or did wrong)
|
|
214
|
+
> • **Out of scope:** (Non-issue for this product/flow)
|
|
215
|
+
> What specific rule should future walkers follow?"
|
|
216
|
+
|
|
217
|
+
Once the user provides their rationale:
|
|
218
|
+
- *Not relevant* (by design, out of scope): `iamu triage <slug> --status dismissed --reason not_relevant --note "<why it is not a problem>" --rule "<rule string>"`.
|
|
219
|
+
- *Walker error* (the walker misread the screen): `iamu triage <slug> --status dismissed --reason walker_error --note "<what it misread>" --rule "<rule string>"`.
|
|
199
220
|
- *Duplicate* of another finding: `--reason duplicate --note "Duplicate of <slug>"` (no rule is written).
|
|
200
221
|
|
|
201
|
-
Not relevant and walker error write a **tester guidance rule** to `iamu/guidance/<slug>.md` that every later walker reads (and the matcher uses to flag repeats). The rule text defaults to "Don't report: <title>"; pass `--rule "<one sentence the walker can act on>"` when the title is too narrow or too broad. The rule applies to the whole project unless you pass `--scope outline` or `--scope capability` — narrow it when the finding is only irrelevant in this situation. Several findings dismissed for the same reason go in one call and share one rule. **Tell the user: "Dismissed —
|
|
222
|
+
Not relevant and walker error write a **tester guidance rule** to `iamu/guidance/<slug>.md` that every later walker reads (and the matcher uses to flag repeats). The rule text defaults to "Don't report: <title>"; pass `--rule "<one sentence the walker can act on>"` when the title is too narrow or too broad. The rule applies to the whole project unless you pass `--scope outline` or `--scope capability` — narrow it when the finding is only irrelevant in this situation. Several findings dismissed for the same reason go in one call and share one rule. **Tell the user: "✓ Dismissed (<reason>) — Guidance rule taught to future walks in iamu/guidance/<slug>.md: '<rule string>'."** One-word notes ("nope") degrade future runs — capture the user's specific rationale.
|
|
202
223
|
|
|
203
224
|
- **Keep (no decision yet)** → rare. Use only when the reviewer genuinely needs more information. Leave `triage_status: open` and add a `triage_note` noting what you are waiting for: `"Waiting on <thing> before triage."`.
|
|
204
225
|
|
|
@@ -216,7 +216,7 @@ If the product is behind enterprise login where automated dev persona switching
|
|
|
216
216
|
If automated switching exists:
|
|
217
217
|
1. Check the project's own agent docs (`CLAUDE.md`, `AGENTS.md`) for a documented way to switch user or role.
|
|
218
218
|
2. Map the persona to the closest account or role the product actually has. If nothing fits, say so.
|
|
219
|
-
3.
|
|
219
|
+
3. Persist what you learned: the mechanism into `iamu/testability.md` via `iamu set testability --access "<key>"`, and the persona's own key with `iamu set persona <slug> --access <key>`. Passwords and tokens never go in either — name where they live (an env var, a vault entry) instead.
|
|
220
220
|
|
|
221
221
|
Carry the result into the walking prompt as the `## Access` section: the exact steps to become the persona, with the instruction to do them BEFORE the first recorded step.
|
|
222
222
|
|
|
@@ -248,15 +248,15 @@ iamu browse start --run <run-id>
|
|
|
248
248
|
|
|
249
249
|
It sizes the page as the device the persona's tags name (`mobile`/`phone`, `tablet`/`ipad`, `desktop`/`laptop`; `start-run` prints it as `device`) and resizes a browser left at another persona's size.
|
|
250
250
|
|
|
251
|
-
**Get the walker prompt.** The CLI composes the whole thing — persona, situation, brief, access, driving surface, methodology, dismissed findings and the run-directory contract (steps, screenshots, findings, `summary.json`):
|
|
251
|
+
**Get the walker prompt.** The CLI composes the whole thing — persona, situation, brief, access, driving surface, methodology, dismissed findings and the run-directory contract (steps, screenshots, findings, `summary.json`). It also automatically writes `walker_prompt.txt` to the run directory (`iamu/.runs/<run-id>/walker_prompt.txt`):
|
|
252
252
|
|
|
253
253
|
```bash
|
|
254
254
|
iamu instructions walk --scenario <scenario-slug> --run <run-id> --surface browse --json
|
|
255
255
|
```
|
|
256
256
|
|
|
257
|
-
|
|
257
|
+
**Never create prompt generator scripts or temporary files.** The CLI generates and persists the prompt automatically. Never write custom `.cjs`, `.js`, or `.sh` generator scripts into `.cache/`, `iamu/`, or the workspace. Hand-crafting files triggers host IDE file permission prompts.
|
|
258
258
|
|
|
259
|
-
The result's `walker_prompt` is the walker's entire prompt. Pass it verbatim — do not rewrite, summarize or trim it. The prompt already carries the dismissed findings, the active tester guidance rules (`iamu/guidance/`) for this scenario, and — when fixes await a re-run — the places they were seen (places only, never what was wrong; the list is in `revisit`). The rest of the bundle (`persona`, `outline`, `access`, `dismissed_findings`, `tester_guidance`, …) is there for you, not the walker. If `access` is missing a half, fill it in first (step 3) and re-run this command.
|
|
259
|
+
The result's `walker_prompt` is the walker's entire prompt (also persisted at `walker_prompt_path`). Pass it verbatim — do not rewrite, summarize or trim it. The prompt already carries the dismissed findings, the active tester guidance rules (`iamu/guidance/`) for this scenario, and — when fixes await a re-run — the places they were seen (places only, never what was wrong; the list is in `revisit`). The rest of the bundle (`persona`, `outline`, `access`, `dismissed_findings`, `tester_guidance`, …) is there for you, not the walker. If `access` is missing a half, fill it in first (step 3) and re-run this command.
|
|
260
260
|
|
|
261
261
|
**Preflight: Unattended execution check.** A walkthrough executes 15–30 terminal commands sequentially (`iamu browse step`, `iamu new-finding`). If your agent host requires manual confirmation for terminal/shell commands (standard interactive mode in Claude Code, Cursor, Antigravity, Cline, Windsurf, etc.), the walker subagent will stall waiting for approval on every step. Before dispatching, verify that command auto-approval / unattended execution is enabled in your environment, or warn the user once:
|
|
262
262
|
"Autonomous walkthroughs require auto-approving terminal commands so the walker can drive the product unattended. If command approvals are prompted, please enable auto-approval or expect to approve steps manually."
|
|
@@ -357,6 +357,9 @@ iamu summary <run-id> --worked "What worked well 1" --worked "What worked well 2
|
|
|
357
357
|
|
|
358
358
|
After the walker returns, you MUST complete ALL of the following before presenting findings to the user. Do NOT present findings early. Do NOT ask the user anything. Execute steps A→B→C→D→E in order.
|
|
359
359
|
|
|
360
|
+
> **CRITICAL EXECUTION RULE (Zero Host File Tools):**
|
|
361
|
+
> Never invoke host edit or write tools (`write_to_file`, `create_file`, `replace_file_content`, etc.) on any files in `iamu/` (including run artifacts, steps, findings, outlines, personas, scenarios, or guidance). All files in `iamu/` must be generated and modified exclusively via `iamu` CLI commands (`iamu new`, `iamu set`, `iamu step`, `iamu new-finding`, `iamu evaluate-record`, `iamu match-record`, etc.). If an entity needs a field updated (e.g. adding a capability to an outline), run `iamu set <type> <slug> ...` instead of editing files by hand. Record subagent JSON outputs directly through the CLI using `--data '<json>'` (or pipe via stdin).
|
|
362
|
+
|
|
360
363
|
**A. Assemble canonical + report (local).** Use `--no-push` so post-processing stays fast, local, and synchronous:
|
|
361
364
|
|
|
362
365
|
```bash
|
|
@@ -373,11 +376,10 @@ This reads all steps, findings, and entity files, assembles `canonical.json`, ge
|
|
|
373
376
|
iamu match <run-id> --json
|
|
374
377
|
```
|
|
375
378
|
|
|
376
|
-
If `needed` is `false` (no earlier findings for this scenario, or none this run), skip to C. Otherwise, read the prompt from `iamu/.runs/<run-id>/match_prompt.md` directly and dispatch a matcher subagent with it as its only context (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to accurately evaluate semantic equivalence). Record its JSON answer via `--data` (
|
|
379
|
+
If `needed` is `false` (no earlier findings for this scenario, or none this run), skip to C. Otherwise, read the prompt from `iamu/.runs/<run-id>/match_prompt.md` directly and dispatch a matcher subagent with it as its only context (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to accurately evaluate semantic equivalence). Record its JSON answer via `--data` (do NOT create a `matches.json` file yourself; pass the JSON string directly into `--data`):
|
|
377
380
|
|
|
378
381
|
```bash
|
|
379
|
-
iamu match-record <run-id> --data '<
|
|
380
|
-
# or: iamu match-record <run-id> --file <matches.json>
|
|
382
|
+
iamu match-record <run-id> --data '<raw_matches_json>'
|
|
381
383
|
```
|
|
382
384
|
|
|
383
385
|
This links recurrences to their earlier canonical finding, marks earlier findings the run's steps show fixed (only with cited steps), and re-derives the delta and report. If the matcher's output is rejected, show the error to the matcher once and retry; if it fails again, continue without it — the exact-text delta from A stands.
|
|
@@ -388,11 +390,10 @@ This links recurrences to their earlier canonical finding, marks earlier finding
|
|
|
388
390
|
iamu evaluate <run-id> --json
|
|
389
391
|
```
|
|
390
392
|
|
|
391
|
-
Read the evaluation prompt from `iamu/.runs/<run-id>/judge_prompt.md` directly. Dispatch the evaluator as a subagent with that prompt (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to prevent severity inflation). After the evaluator returns verdicts, record them locally with `--no-push` via `--data` (
|
|
393
|
+
Read the evaluation prompt from `iamu/.runs/<run-id>/judge_prompt.md` directly. Dispatch the evaluator as a subagent with that prompt (use the **thorough** model tier, e.g. `Model="pro"` in Antigravity, to prevent severity inflation). After the evaluator returns verdicts, record them locally with `--no-push` via `--data` (do NOT create a `verdicts.json` file yourself; pass the JSON string directly into `--data`):
|
|
392
394
|
|
|
393
395
|
```bash
|
|
394
|
-
iamu evaluate-record <run-id> --data '<
|
|
395
|
-
# or: iamu evaluate-record <run-id> --file <verdicts.json> --no-prompt --no-push
|
|
396
|
+
iamu evaluate-record <run-id> --data '<raw_verdicts_json>' --no-prompt --no-push
|
|
396
397
|
```
|
|
397
398
|
|
|
398
399
|
This links findings to human tests (`human_test_id`) and updates the report with judge verdicts.
|
|
@@ -475,52 +476,63 @@ The conversation is the triage surface. Do NOT eject the user to manual CLI comm
|
|
|
475
476
|
|
|
476
477
|
#### A. Guided One-by-One Review ("walk through them" / "review one by one")
|
|
477
478
|
When the user asks to review findings one by one:
|
|
478
|
-
1. **Present Finding #N in a
|
|
479
|
-
Do NOT
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
479
|
+
1. **Present Finding #N in a scannable format (High Visual Hierarchy):**
|
|
480
|
+
Do NOT output an undifferentiated wall of bullets or academic schema labels like "UI Fact:". The reviewer must be able to parse **What is broken** and **What to fix** in under 3 seconds.
|
|
481
|
+
|
|
482
|
+
Format the visible finding in chat:
|
|
483
|
+
```markdown
|
|
484
|
+
### Finding #<N>/<total> [<SEVERITY>] — <title>
|
|
485
|
+
> **Where:** `<Screen title or URL>` (Step <N>) · **Persona:** <Persona Name> (<Role>)
|
|
486
|
+
> **Evidence:** `iamu/.runs/<run>/screenshots/step-<N>.png` [Dashboard](<url if cloud_linked>)
|
|
487
|
+
|
|
488
|
+
**❌ Problem:**
|
|
489
|
+
<What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
|
|
490
|
+
|
|
491
|
+
**💡 Recommendation:**
|
|
492
|
+
<Concrete fix proposal from finding body>
|
|
488
493
|
```
|
|
489
494
|
If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
|
|
490
495
|
|
|
491
496
|
Followed immediately by the decision prompt:
|
|
492
497
|
|
|
493
|
-
**CRITICAL: Embed
|
|
494
|
-
Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **
|
|
498
|
+
**CRITICAL: Embed Scannable Finding in Interactive Prompt Modals:**
|
|
499
|
+
Host interactive tools (e.g. `ask_question`, `ask_followup_question`) render a modal that obscures the terminal and displays ONLY the tool's `question` argument. **Embed this exact scannable structure inside the `question` argument** with blank lines separating the sections (never a solid block of bullets):
|
|
495
500
|
|
|
496
501
|
- If interactive tool available (e.g. `ask_question`, `ask_followup_question`), invoke it:
|
|
497
502
|
- **Question:**
|
|
498
503
|
"""
|
|
499
|
-
Finding #<N>/<total
|
|
504
|
+
Finding #<N>/<total> [<SEVERITY>]: <title>
|
|
505
|
+
Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
|
|
500
506
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
• Recommendation: <concrete recommendation>
|
|
507
|
-
• Evidence: <screenshot path, local file link, and cloud dashboard link if linked>
|
|
507
|
+
❌ PROBLEM:
|
|
508
|
+
<What is broken or awkward on screen and why it hinders the persona in 1–2 direct sentences>
|
|
509
|
+
|
|
510
|
+
💡 RECOMMENDATION:
|
|
511
|
+
<Concrete fix proposal from finding body>
|
|
508
512
|
|
|
509
513
|
How should we triage this finding?
|
|
510
514
|
"""
|
|
511
515
|
- **Options:**
|
|
512
|
-
1. "[Recommended] Queue to fix (
|
|
513
|
-
2. "Dismiss / Skip (
|
|
516
|
+
1. "[Recommended] Queue to fix (<brief 3-5 word fix summary>)"
|
|
517
|
+
2. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
|
|
514
518
|
3. "Discuss / Explore trade-offs"
|
|
515
519
|
4. "Fix immediately (leave triage now)"
|
|
516
520
|
5. "Next finding (keep open / defer)"
|
|
517
521
|
- Otherwise (CLI / text-only):
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
522
|
+
Finding #<N>/<total> [<SEVERITY>]: <title>
|
|
523
|
+
Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
|
|
524
|
+
|
|
525
|
+
❌ PROBLEM:
|
|
526
|
+
<What went wrong and why it hinders the persona in 1–2 direct sentences>
|
|
527
|
+
|
|
528
|
+
💡 RECOMMENDATION:
|
|
529
|
+
<Concrete fix proposal>
|
|
530
|
+
|
|
531
|
+
1. [Recommended] Queue to fix (<brief 3-5 word fix summary>)
|
|
532
|
+
2. Dismiss / Skip (not relevant or walker error)
|
|
533
|
+
3. Discuss / Explore trade-offs
|
|
534
|
+
4. Fix immediately (leave triage now)
|
|
535
|
+
5. Next finding (keep open / defer)
|
|
524
536
|
Reply '1' to queue fix [default], select 2-5, or describe your decision:
|
|
525
537
|
|
|
526
538
|
2. **Handle the user's decision**:
|
|
@@ -528,21 +540,29 @@ When the user asks to review findings one by one:
|
|
|
528
540
|
Add finding to the session's fix queue.
|
|
529
541
|
Tell the user in 1 line: "✓ Queued for fix. Ready for finding #<N+1>?" and advance immediately.
|
|
530
542
|
Do NOT edit code or leave triage yet — complete triage across all findings first.
|
|
531
|
-
- **Skip / Dismiss**:
|
|
532
|
-
If
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
543
|
+
- **Skip / Dismiss (Load-Bearing Guidance Learning)**:
|
|
544
|
+
**Never infer dismissal rationale silently.** If the user has not yet explained why this finding is dismissed, prompt them directly in conversational chat:
|
|
545
|
+
> "To teach future walkthroughs what not to report, why should this be dismissed?
|
|
546
|
+
> • **By design / intended behavior:** (Why this pattern is expected)
|
|
547
|
+
> • **Walker error:** (What the walker misread or did wrong)
|
|
548
|
+
> • **Out of scope:** (Non-issue for this product/flow)
|
|
549
|
+
> What specific rule should future walkers follow?"
|
|
550
|
+
|
|
551
|
+
Once the user provides their reasoning (or if already clear from discussion):
|
|
552
|
+
Derive a concise, actionable guidance rule string.
|
|
553
|
+
Execute: `iamu triage <slug> --status dismissed --reason <reason> --note "<user rationale>" --rule "<rule string>"`.
|
|
554
|
+
Tell the user in 1 line:
|
|
555
|
+
`✓ Dismissed (<reason>) — Guidance rule taught to future walks in iamu/guidance/<slug>.md: "<rule string>"`
|
|
539
556
|
Then advance to finding #<N+1>.
|
|
540
|
-
- **Discuss /
|
|
541
|
-
|
|
557
|
+
- **Discuss / Explore trade-offs (Conversational Dialogue Mode — NO MODAL LOOPS)**:
|
|
558
|
+
When the user chooses "Discuss", asks a question, or challenges an idea:
|
|
559
|
+
**DO NOT invoke `ask_question` or present multiple-choice menus.** Stay in natural conversational chat as a senior pair programmer:
|
|
542
560
|
• **Root Cause:** 1 sentence on why the UI or workflow behaves this way (and source file if known).
|
|
543
561
|
• **Persona Friction:** 1 sentence on the practical operational consequence.
|
|
544
|
-
• **Recommended Fix & Trade-off:**
|
|
545
|
-
|
|
562
|
+
• **Recommended Fix & Trade-off:** Concrete architectural approach, competitor benchmarks, and trade-offs.
|
|
563
|
+
Converse naturally with the user back and forth in plain markdown text. Answer follow-up questions, inspect code, and discuss options until a conclusion is reached.
|
|
564
|
+
**Only when a consensus is reached** (e.g. user says: "let's do that", "queue it", "dismiss it", "fix it now"):
|
|
565
|
+
Record the agreed decision and advance to finding #<N+1>. Do NOT trap the user with modal dialogs after each conversational turn.
|
|
546
566
|
- **Fix immediately (leave triage now)**:
|
|
547
567
|
If the user explicitly chooses to drop out of triage and fix right now:
|
|
548
568
|
Make the code edit, verify it loads (or check local tests/types), update the finding with `iamu triage <slug> --status addressed --note "<summary of fix>"`.
|
|
@@ -110,18 +110,16 @@ Reply '1' to accept [default], select 2-3, or tell me what to adjust:
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
**Action on confirmation (Option 1):**
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
access
|
|
120
|
-
harnesses
|
|
121
|
-
- <
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
# Project Testability & Environment
|
|
113
|
+
Persist the safety fence using `iamu set testability` (never invoke host file creation or edit tools):
|
|
114
|
+
```bash
|
|
115
|
+
iamu set testability \
|
|
116
|
+
--target "<target_url>" \
|
|
117
|
+
--dev-command "<dev_command>" \
|
|
118
|
+
--auth-strategy "<dev_switcher | interactive | test_accounts | public>" \
|
|
119
|
+
[--access "<access mechanism>"] \
|
|
120
|
+
[--harnesses "<detected harness 1>, <detected harness 2>"] \
|
|
121
|
+
[--untestable-boundaries "<external dependency 1>, <external dependency 2>"] \
|
|
122
|
+
--body "# Project Testability & Environment
|
|
125
123
|
|
|
126
124
|
## Target & Run Instructions
|
|
127
125
|
- Command: <dev command>
|
|
@@ -137,7 +135,8 @@ harnesses:
|
|
|
137
135
|
- <List existing MSW mock files, DB seed scripts, or fixture directories>
|
|
138
136
|
|
|
139
137
|
## Untestable Boundaries (Do Not Walk)
|
|
140
|
-
- <List un-mocked external dependencies and external submission portals>
|
|
138
|
+
- <List un-mocked external dependencies and external submission portals>" \
|
|
139
|
+
--json
|
|
141
140
|
```
|
|
142
141
|
|
|
143
142
|
---
|
|
@@ -182,22 +181,16 @@ Reply '1' to accept [default], select 2-3, or tell me what to adjust:
|
|
|
182
181
|
```
|
|
183
182
|
|
|
184
183
|
**Action on confirmation (Option 1):**
|
|
185
|
-
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
# governed_by: # strictly optional - omit if not regulated
|
|
193
|
-
# - name: <statutory regulation>
|
|
194
|
-
# authority_level: regulation
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
<The substantive 1–2 paragraph project description and core user workflows>
|
|
184
|
+
Persist the domain context using `iamu set context` (never invoke host file creation or edit tools). Put structured fields in frontmatter and the project description in the markdown body below the `---` via `--body`:
|
|
185
|
+
```bash
|
|
186
|
+
iamu set context \
|
|
187
|
+
--domain "<domain>" \
|
|
188
|
+
[--industry "<industry>"] \
|
|
189
|
+
--body "<The substantive 1–2 paragraph project description and core user workflows>" \
|
|
190
|
+
--json
|
|
198
191
|
```
|
|
199
192
|
|
|
200
|
-
*If user chooses Option 2 (Save context only):*
|
|
193
|
+
*If user chooses Option 2 (Save context only):* run `iamu set context ...` as above, and exit cleanly:
|
|
201
194
|
"✓ Project context initialized. When you're ready to create your first test journey, run `/iamu:new`."
|
|
202
195
|
|
|
203
196
|
---
|
|
@@ -213,6 +206,7 @@ Step 3/3: Co-Design Your First Test Journey
|
|
|
213
206
|
Why this matters: Validates whether a real human with specific operational pressures can complete a critical task without getting blocked or frustrated.
|
|
214
207
|
|
|
215
208
|
Baseline Test Proposal (WYSIWGW Spec-Sheet):
|
|
209
|
+
Capability: <Capability Name> (<What staff can do in this area>)
|
|
216
210
|
Persona: <Name> (<Role / Title>)
|
|
217
211
|
• Reality: <Working context, physical habits, tenure, pressures>
|
|
218
212
|
• Friction: <Diagnostic friction, skepticism, bounce trigger>
|
|
@@ -246,19 +240,23 @@ Reply '1' to accept [default], select 2-4, or tell me what to adjust:
|
|
|
246
240
|
```
|
|
247
241
|
|
|
248
242
|
**Action on confirmation (Option 1 or Option 2):**
|
|
249
|
-
1. **Scaffold
|
|
243
|
+
1. **Scaffold Primary Capability** (if not already existing):
|
|
250
244
|
```bash
|
|
251
|
-
iamu new
|
|
245
|
+
iamu new capability --name "<Capability Name>" --description "<What staff can do in this area>" --json
|
|
252
246
|
```
|
|
253
247
|
2. **Scaffold Situation Outline**:
|
|
254
248
|
```bash
|
|
255
|
-
iamu new outline --name "<Outline Title>" --tension "<Core Tension>" --human-test "<Concrete yes/partial/no evaluation question>" --narrative "<2-3 sentence problem-space narrative without UI terms>" --json
|
|
249
|
+
iamu new outline --name "<Outline Title>" --capability "<capability-slug>" --tension "<Core Tension>" --human-test "<Concrete yes/partial/no evaluation question>" --narrative "<2-3 sentence problem-space narrative without UI terms>" --json
|
|
250
|
+
```
|
|
251
|
+
3. **Scaffold Persona**:
|
|
252
|
+
```bash
|
|
253
|
+
iamu new persona --name "<Name>" --role "<Role>" --disposition "<Disposition>" --body "<2-4 sentence narrative detailing technical habits, patience level, and specific friction triggers>" [--access "<account-or-role>"] --json
|
|
256
254
|
```
|
|
257
|
-
|
|
255
|
+
4. **Scaffold Bound Scenario**:
|
|
258
256
|
```bash
|
|
259
257
|
iamu new scenario --name "<persona-slug>--<outline-slug>" --outline "<outline-slug>" --persona "<persona-slug>" --entry "<entry_path>" --body "<Persona's first-person test brief describing what they intend to achieve>" --json
|
|
260
258
|
```
|
|
261
|
-
|
|
259
|
+
5. **Validate all entities**:
|
|
262
260
|
```bash
|
|
263
261
|
iamu validate --all
|
|
264
262
|
```
|
|
@@ -325,6 +323,7 @@ If login times out or fails:
|
|
|
325
323
|
- **Clean terminal formatting.** Do not wrap agent briefings in markdown code fences (` ``` `). Use fixed column alignment for attributes and clean tree diagrams for generated files.
|
|
326
324
|
- **Non-regulated software is the default.** Do not invent or force regulations (`governed_by`) on apps, developer tools, or consumer software. If the codebase has no compliance documentation, omit `governed_by` entirely.
|
|
327
325
|
- **Explore automatically.** Read the codebase before asking the user anything. The user should only need to confirm or correct, not describe their own project from scratch.
|
|
328
|
-
- **Context on disk is load-bearing.** Once
|
|
326
|
+
- **Context on disk is load-bearing.** Once `iamu set context` writes `iamu/context.yml`, every downstream skill (`iamu-new`, `iamu-run`) auto-loads it.
|
|
327
|
+
- **Never invoke host Edit or Write tools.** Always scaffold or modify configuration and entities via `iamu set` and `iamu new` shell commands. Host tool edits trigger modal confirmation tripwires for the user.
|
|
329
328
|
- **Handle re-runs gracefully.** An already-scaffolded project is a no-op on scaffold, a refresh on context/personas/scenarios (if the user opts in), and a re-prompt on cloud link.
|
|
330
329
|
- **Handle errors gracefully.** Unreachable file → note it, move on. Unreachable cloud → report and let the user retry or defer.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iamu-dev/iamu",
|
|
3
|
-
"version": "0.3.0-beta.
|
|
3
|
+
"version": "0.3.0-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Test your product as realistic personas — scenario-driven development CLI",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
"typescript": "^5.8.0",
|
|
60
60
|
"vitest": "^4.1.11",
|
|
61
61
|
"@iamu-dev/local-store": "0.1.0",
|
|
62
|
-
"@iamu/
|
|
63
|
-
"@iamu
|
|
62
|
+
"@iamu-dev/protocol": "0.1.0",
|
|
63
|
+
"@iamu/tsconfig": "0.1.0"
|
|
64
64
|
},
|
|
65
65
|
"scripts": {
|
|
66
66
|
"build": "tsup && tsc -b --force tsconfig.build.json --emitDeclarationOnly && node scripts/copy-assets.mjs",
|