@iamu-dev/iamu 0.3.0-beta.1 → 0.3.0-beta.3

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 CHANGED
@@ -13040,7 +13040,8 @@ var init_symbols = __esm({
13040
13040
  add: chalk3.cyan("+"),
13041
13041
  info: chalk3.blue(supportsUnicode ? "\u2139" : "i"),
13042
13042
  dot: chalk3.dim(supportsUnicode ? "\u2022" : "*"),
13043
- question: chalk3.yellow("?")
13043
+ question: chalk3.yellow("?"),
13044
+ step: chalk3.blue(supportsUnicode ? "\u25B6" : ">")
13044
13045
  };
13045
13046
  }
13046
13047
  });
@@ -13646,8 +13647,8 @@ import { dirname as dirname3, join as join4, resolve as resolve2 } from "path";
13646
13647
  import { fileURLToPath as fileURLToPath2 } from "url";
13647
13648
  import chalk6 from "chalk";
13648
13649
  function getVersion() {
13649
- if ("0.3.0-beta.1") {
13650
- return "0.3.0-beta.1";
13650
+ if ("0.3.0-beta.3") {
13651
+ return "0.3.0-beta.3";
13651
13652
  }
13652
13653
  try {
13653
13654
  const thisDir = dirname3(fileURLToPath2(import.meta.url));
@@ -16017,9 +16018,16 @@ async function report(scenario, opts) {
16017
16018
  if (viewport) {
16018
16019
  console.log(` ${chalk13.dim("device:")} ${formatViewport(viewport)}`);
16019
16020
  }
16020
- const viewUrl = await pushedRunUrl(projectRoot, run.runId);
16021
- if (viewUrl) {
16022
- console.log(` ${chalk13.dim("view:")} ${chalk13.underline(viewUrl)}`);
16021
+ const config = await readConfig(projectRoot);
16022
+ if (config.cloud_linked && config.cloud_project_id) {
16023
+ const viewUrl = await pushedRunUrl(projectRoot, run.runId);
16024
+ if (viewUrl) {
16025
+ console.log(` ${chalk13.dim("view:")} ${chalk13.underline(viewUrl)}`);
16026
+ } else {
16027
+ console.log(
16028
+ ` ${chalk13.dim("view:")} ${chalk13.dim("not synced yet")} ${chalk13.dim("(run `iamu sync` to view in cloud)")}`
16029
+ );
16030
+ }
16023
16031
  }
16024
16032
  if (c) {
16025
16033
  const v = c.verification;
@@ -18700,23 +18708,38 @@ async function stepCommand(runArg, opts) {
18700
18708
  );
18701
18709
  return;
18702
18710
  }
18703
- console.log();
18704
- console.log(
18705
- ` ${symbols.success} Step ${chalk20.cyan(String(res.step.step_number))} recorded: ${res.step.action}`
18706
- );
18707
- if (res.step.note) {
18708
- console.log(` ${chalk20.dim("note:")} ${res.step.note}`);
18709
- }
18710
- if (res.step.url) {
18711
- console.log(` ${chalk20.dim("url:")} ${res.step.url}`);
18712
- }
18713
- if (res.step.screenshot) {
18714
- console.log(` ${chalk20.dim("shot:")} ${res.step.screenshot}`);
18711
+ const stepNumStr = String(res.step.step_number).padStart(2, "0");
18712
+ if (isVerbose()) {
18713
+ console.log();
18714
+ console.log(
18715
+ ` ${symbols.success} Step ${chalk20.cyan(stepNumStr)} recorded: ${res.step.action}`
18716
+ );
18717
+ if (res.step.note) {
18718
+ console.log(` ${chalk20.dim("note:")} ${res.step.note}`);
18719
+ }
18720
+ if (res.step.url) {
18721
+ console.log(` ${chalk20.dim("url:")} ${res.step.url}`);
18722
+ }
18723
+ if (res.step.screenshot) {
18724
+ console.log(` ${chalk20.dim("shot:")} ${res.step.screenshot}`);
18725
+ }
18726
+ console.log(
18727
+ ` ${chalk20.dim("file:")} ${path25.relative(projectRoot, res.stepPath)}`
18728
+ );
18729
+ console.log();
18730
+ } else {
18731
+ let route = "";
18732
+ if (res.step.url) {
18733
+ try {
18734
+ route = new URL(res.step.url).pathname;
18735
+ } catch {
18736
+ route = res.step.url;
18737
+ }
18738
+ }
18739
+ console.log(
18740
+ ` ${symbols.step} Step ${chalk20.cyan(stepNumStr)} \xB7 ${chalk20.bold(res.step.action)}${route ? chalk20.dim(` \xB7 ${route}`) : ""}`
18741
+ );
18715
18742
  }
18716
- console.log(
18717
- ` ${chalk20.dim("file:")} ${path25.relative(projectRoot, res.stepPath)}`
18718
- );
18719
- console.log();
18720
18743
  } catch (err) {
18721
18744
  commandError(err.message, opts);
18722
18745
  }
@@ -18727,6 +18750,7 @@ var init_step = __esm({
18727
18750
  "use strict";
18728
18751
  init_dist2();
18729
18752
  init_dist();
18753
+ init_logger();
18730
18754
  init_symbols();
18731
18755
  init_context4();
18732
18756
  init_live_run_client();
@@ -19311,16 +19335,34 @@ function printStep(opts, record, projectRoot, stagnationWarning, challengeWarnin
19311
19335
  console.log(JSON.stringify(doc, null, 2));
19312
19336
  return;
19313
19337
  }
19314
- console.log(
19315
- ` ${chalk21.green("\u2713")} Step ${chalk21.cyan(String(step.step_number))} recorded: ${step.action}`
19316
- );
19317
- for (const w of warnings) {
19318
- console.log(` ${chalk21.yellow("\u26A0\uFE0F ")} ${chalk21.yellow(w)}`);
19319
- }
19320
- if (step.note) console.log(` ${chalk21.dim("note:")} ${step.note}`);
19321
- if (step.url) console.log(` ${chalk21.dim("url:")} ${step.url}`);
19322
- if (step.screenshot) {
19323
- console.log(` ${chalk21.dim("screenshot:")} ${step.screenshot}`);
19338
+ const stepNumStr = String(step.step_number).padStart(2, "0");
19339
+ if (isVerbose()) {
19340
+ console.log(
19341
+ ` ${symbols.success} Step ${chalk21.cyan(stepNumStr)} recorded: ${step.action}`
19342
+ );
19343
+ for (const w of warnings) {
19344
+ console.log(` ${symbols.warning} ${chalk21.yellow(w)}`);
19345
+ }
19346
+ if (step.note) console.log(` ${chalk21.dim("note:")} ${step.note}`);
19347
+ if (step.url) console.log(` ${chalk21.dim("url:")} ${step.url}`);
19348
+ if (step.screenshot) {
19349
+ console.log(` ${chalk21.dim("screenshot:")} ${step.screenshot}`);
19350
+ }
19351
+ } else {
19352
+ let route = "";
19353
+ if (step.url) {
19354
+ try {
19355
+ route = new URL(step.url).pathname;
19356
+ } catch {
19357
+ route = step.url;
19358
+ }
19359
+ }
19360
+ console.log(
19361
+ ` ${symbols.step} Step ${chalk21.cyan(stepNumStr)} \xB7 ${chalk21.bold(step.action)}${route ? chalk21.dim(` \xB7 ${route}`) : ""}`
19362
+ );
19363
+ for (const w of warnings) {
19364
+ console.log(` ${symbols.warning} ${chalk21.yellow(w)}`);
19365
+ }
19324
19366
  }
19325
19367
  }
19326
19368
  async function browseStep(args, opts, driver) {
@@ -19627,6 +19669,8 @@ var init_browse = __esm({
19627
19669
  "use strict";
19628
19670
  init_dist2();
19629
19671
  init_dist();
19672
+ init_logger();
19673
+ init_symbols();
19630
19674
  init_browse_actions();
19631
19675
  init_browse_driver();
19632
19676
  init_context4();
package/dist/index.js CHANGED
@@ -12646,7 +12646,8 @@ var init_symbols = __esm({
12646
12646
  add: chalk.cyan("+"),
12647
12647
  info: chalk.blue(supportsUnicode ? "\u2139" : "i"),
12648
12648
  dot: chalk.dim(supportsUnicode ? "\u2022" : "*"),
12649
- question: chalk.yellow("?")
12649
+ question: chalk.yellow("?"),
12650
+ step: chalk.blue(supportsUnicode ? "\u25B6" : ">")
12650
12651
  };
12651
12652
  }
12652
12653
  });
@@ -13591,8 +13592,8 @@ import { dirname as dirname3, join as join4, resolve as resolve2 } from "path";
13591
13592
  import { fileURLToPath as fileURLToPath2 } from "url";
13592
13593
  import chalk6 from "chalk";
13593
13594
  function getVersion() {
13594
- if ("0.3.0-beta.1") {
13595
- return "0.3.0-beta.1";
13595
+ if ("0.3.0-beta.3") {
13596
+ return "0.3.0-beta.3";
13596
13597
  }
13597
13598
  try {
13598
13599
  const thisDir = dirname3(fileURLToPath2(import.meta.url));
@@ -15962,9 +15963,16 @@ async function report(scenario, opts) {
15962
15963
  if (viewport) {
15963
15964
  console.log(` ${chalk13.dim("device:")} ${formatViewport(viewport)}`);
15964
15965
  }
15965
- const viewUrl = await pushedRunUrl(projectRoot, run.runId);
15966
- if (viewUrl) {
15967
- console.log(` ${chalk13.dim("view:")} ${chalk13.underline(viewUrl)}`);
15966
+ const config = await readConfig(projectRoot);
15967
+ if (config.cloud_linked && config.cloud_project_id) {
15968
+ const viewUrl = await pushedRunUrl(projectRoot, run.runId);
15969
+ if (viewUrl) {
15970
+ console.log(` ${chalk13.dim("view:")} ${chalk13.underline(viewUrl)}`);
15971
+ } else {
15972
+ console.log(
15973
+ ` ${chalk13.dim("view:")} ${chalk13.dim("not synced yet")} ${chalk13.dim("(run `iamu sync` to view in cloud)")}`
15974
+ );
15975
+ }
15968
15976
  }
15969
15977
  if (c) {
15970
15978
  const v = c.verification;
@@ -18645,23 +18653,38 @@ async function stepCommand(runArg, opts) {
18645
18653
  );
18646
18654
  return;
18647
18655
  }
18648
- console.log();
18649
- console.log(
18650
- ` ${symbols.success} Step ${chalk20.cyan(String(res.step.step_number))} recorded: ${res.step.action}`
18651
- );
18652
- if (res.step.note) {
18653
- console.log(` ${chalk20.dim("note:")} ${res.step.note}`);
18654
- }
18655
- if (res.step.url) {
18656
- console.log(` ${chalk20.dim("url:")} ${res.step.url}`);
18657
- }
18658
- if (res.step.screenshot) {
18659
- console.log(` ${chalk20.dim("shot:")} ${res.step.screenshot}`);
18656
+ const stepNumStr = String(res.step.step_number).padStart(2, "0");
18657
+ if (isVerbose()) {
18658
+ console.log();
18659
+ console.log(
18660
+ ` ${symbols.success} Step ${chalk20.cyan(stepNumStr)} recorded: ${res.step.action}`
18661
+ );
18662
+ if (res.step.note) {
18663
+ console.log(` ${chalk20.dim("note:")} ${res.step.note}`);
18664
+ }
18665
+ if (res.step.url) {
18666
+ console.log(` ${chalk20.dim("url:")} ${res.step.url}`);
18667
+ }
18668
+ if (res.step.screenshot) {
18669
+ console.log(` ${chalk20.dim("shot:")} ${res.step.screenshot}`);
18670
+ }
18671
+ console.log(
18672
+ ` ${chalk20.dim("file:")} ${path25.relative(projectRoot, res.stepPath)}`
18673
+ );
18674
+ console.log();
18675
+ } else {
18676
+ let route = "";
18677
+ if (res.step.url) {
18678
+ try {
18679
+ route = new URL(res.step.url).pathname;
18680
+ } catch {
18681
+ route = res.step.url;
18682
+ }
18683
+ }
18684
+ console.log(
18685
+ ` ${symbols.step} Step ${chalk20.cyan(stepNumStr)} \xB7 ${chalk20.bold(res.step.action)}${route ? chalk20.dim(` \xB7 ${route}`) : ""}`
18686
+ );
18660
18687
  }
18661
- console.log(
18662
- ` ${chalk20.dim("file:")} ${path25.relative(projectRoot, res.stepPath)}`
18663
- );
18664
- console.log();
18665
18688
  } catch (err) {
18666
18689
  commandError(err.message, opts);
18667
18690
  }
@@ -18672,6 +18695,7 @@ var init_step = __esm({
18672
18695
  "use strict";
18673
18696
  init_dist2();
18674
18697
  init_dist();
18698
+ init_logger();
18675
18699
  init_symbols();
18676
18700
  init_context4();
18677
18701
  init_live_run_client();
@@ -19256,16 +19280,34 @@ function printStep(opts, record, projectRoot, stagnationWarning, challengeWarnin
19256
19280
  console.log(JSON.stringify(doc, null, 2));
19257
19281
  return;
19258
19282
  }
19259
- console.log(
19260
- ` ${chalk21.green("\u2713")} Step ${chalk21.cyan(String(step.step_number))} recorded: ${step.action}`
19261
- );
19262
- for (const w of warnings) {
19263
- console.log(` ${chalk21.yellow("\u26A0\uFE0F ")} ${chalk21.yellow(w)}`);
19264
- }
19265
- if (step.note) console.log(` ${chalk21.dim("note:")} ${step.note}`);
19266
- if (step.url) console.log(` ${chalk21.dim("url:")} ${step.url}`);
19267
- if (step.screenshot) {
19268
- console.log(` ${chalk21.dim("screenshot:")} ${step.screenshot}`);
19283
+ const stepNumStr = String(step.step_number).padStart(2, "0");
19284
+ if (isVerbose()) {
19285
+ console.log(
19286
+ ` ${symbols.success} Step ${chalk21.cyan(stepNumStr)} recorded: ${step.action}`
19287
+ );
19288
+ for (const w of warnings) {
19289
+ console.log(` ${symbols.warning} ${chalk21.yellow(w)}`);
19290
+ }
19291
+ if (step.note) console.log(` ${chalk21.dim("note:")} ${step.note}`);
19292
+ if (step.url) console.log(` ${chalk21.dim("url:")} ${step.url}`);
19293
+ if (step.screenshot) {
19294
+ console.log(` ${chalk21.dim("screenshot:")} ${step.screenshot}`);
19295
+ }
19296
+ } else {
19297
+ let route = "";
19298
+ if (step.url) {
19299
+ try {
19300
+ route = new URL(step.url).pathname;
19301
+ } catch {
19302
+ route = step.url;
19303
+ }
19304
+ }
19305
+ console.log(
19306
+ ` ${symbols.step} Step ${chalk21.cyan(stepNumStr)} \xB7 ${chalk21.bold(step.action)}${route ? chalk21.dim(` \xB7 ${route}`) : ""}`
19307
+ );
19308
+ for (const w of warnings) {
19309
+ console.log(` ${symbols.warning} ${chalk21.yellow(w)}`);
19310
+ }
19269
19311
  }
19270
19312
  }
19271
19313
  async function browseStep(args, opts, driver) {
@@ -19572,6 +19614,8 @@ var init_browse = __esm({
19572
19614
  "use strict";
19573
19615
  init_dist2();
19574
19616
  init_dist();
19617
+ init_logger();
19618
+ init_symbols();
19575
19619
  init_browse_actions();
19576
19620
  init_browse_driver();
19577
19621
  init_context4();
@@ -103,13 +103,8 @@ Ask the user how they would like to triage:
103
103
  2. "Focus only on Critical findings (<C> items)"
104
104
  3. "Review by scenario group: <Top Scenario>"
105
105
  - Otherwise (in CLI or text-only environments):
106
-
107
- How would you like to triage these <N> open findings?
108
- 1. [Recommended] Walk through findings one by one
109
- 2. Focus only on Critical findings (<C> items)
110
- 3. Review by scenario group: <Top Scenario>
111
-
112
- Reply '1' to walk through all [default], select 2-3, or enter a finding number/slug:
106
+ How would you like to triage these <N> open findings? I recommend walking through findings one by one.
107
+ Proceeding with one-by-one triage. (Say "critical only", specify a scenario group, or enter a finding number/slug).
113
108
 
114
109
  ### 3. Direct triage: review one finding
115
110
 
@@ -122,7 +117,7 @@ Format the visible finding in chat:
122
117
  ```markdown
123
118
  ### Finding #<N>/<total> [<SEVERITY>] — <title>
124
119
  > **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>)
120
+ > **Evidence:** [step-<N>.png](iamu/.runs/<run>/screenshots/step-<N>.png) · [View in Cloud Walkthrough](<url from iamu open <run-id> --print>)
126
121
 
127
122
  **❌ Problem:**
128
123
  <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
@@ -130,8 +125,9 @@ Format the visible finding in chat:
130
125
  **💡 Recommendation:**
131
126
  <Concrete fix proposal from finding body>
132
127
  ```
128
+ *(For `type: "helps"` findings, omit `**❌ Problem:**` and `**💡 Recommendation:**`; render `**✓ Strength:** <Observation>`)*.
133
129
 
134
- If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
130
+ If the project is cloud-linked, include the direct link to the walkthrough in Iamu Cloud (from `iamu open <run-id> --print`).
135
131
 
136
132
  Emit this card visibly into the conversation.
137
133
 
@@ -139,47 +135,20 @@ Emit this card visibly into the conversation.
139
135
 
140
136
  Every finding must land on a decision — never silently skip. Match the user's intent to the closest option.
141
137
 
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:
138
+ **Dual-Surface Triage Prompting (Sequencing Rule):**
139
+ You MUST output the rich markdown finding card to the chat stream FIRST. In the SAME turn, invoke `ask_question`:
144
140
 
145
141
  - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
146
- - **Question:**
147
- """
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>
153
-
154
- 💡 RECOMMENDATION:
155
- <Concrete fix proposal from finding body>
156
-
157
- How should we triage this finding?
158
- """
142
+ - **Question:** "Finding #<N>/<total> [<SEVERITY>]: <title> on <Screen title or URL, Step N> — How to triage?"
159
143
  - **Options:**
160
144
  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)"
165
- - Otherwise (in CLI or text-only environments):
166
-
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)
181
-
182
- Reply '1' to queue fix [default], enter 2-5, or describe your decision:
145
+ 2. "Queue all remaining recommended fixes (batch accept)"
146
+ 3. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
147
+ 4. "Discuss / Explore trade-offs"
148
+ 5. "Fix immediately (leave triage now)"
149
+ - Otherwise (CLI / text-only conversational fallback):
150
+ > **Recommended Action:** Queue to fix (<brief 3-5 word fix summary>).
151
+ > Say **"queue"** (or **"queue all"**), **"dismiss"** (to teach a rule), or **"discuss"** to explore trade-offs.
183
152
 
184
153
  Record the decision with `iamu triage` — it sets `triage_status` and `triage_note` in `iamu/findings/<slug>.md`, and for a dismissal it also teaches the next walk:
185
154
 
@@ -195,7 +164,8 @@ triage_note: "Made handoff notes optional on /sv/handoff; verified on screen."
195
164
  ```
196
165
 
197
166
  - **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.
167
+ **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.
168
+ Once the user says "queue it", "dismiss it", "fix it now", or "let's do that", execute `iamu triage`, confirm in 1 line: "✓ Decision recorded. Ready for finding #<N+1>?", and immediately emit Finding #<N+1> to chat with its triage prompt. Do NOT trap the user with modal dialogs after each conversational turn.
199
169
 
200
170
  - **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.
201
171
 
@@ -262,10 +232,8 @@ If `<N> > 0` findings were queued for fix:
262
232
  1. "[Recommended] Apply queued fixes in workspace now"
263
233
  2. "Done for now (keep fixes open in iamu/findings/)"
264
234
  - Otherwise (CLI / text-only):
265
- Apply fixes for the <N> queued findings now?
266
- 1. [Recommended] Apply queued fixes in workspace now
267
- 2. Done for now (keep fixes open in iamu/findings/)
268
- Reply '1' to apply fixes [default], or select 2:
235
+ Triage complete. I recommend: Apply queued fixes in workspace now.
236
+ Proceeding with code edits — say "done" to keep fixes open in iamu/findings/.
269
237
 
270
238
  - **Executing the queued fixes:**
271
239
  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>"`.
@@ -279,10 +247,8 @@ If `<N> > 0` findings were queued for fix:
279
247
  1. "[Recommended] Re-run walkthrough for <scenario-slug> to verify fixes hold"
280
248
  2. "Done for now (leave verification for later)"
281
249
  - Otherwise (CLI / text-only):
282
- Verify fixes now?
283
- 1. [Recommended] Re-run walkthrough for <scenario-slug> to verify fixes hold
284
- 2. Done for now (leave verification for later)
285
- Reply '1' to re-run [default], or select 2:
250
+ Fixes applied and validated. I recommend: Re-run walkthrough for <scenario-slug> to verify fixes hold.
251
+ Proceeding with verification re-run — say "done" to leave verification for later.
286
252
 
287
253
  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.
288
254
 
@@ -298,9 +264,7 @@ Report it in one line: `Synced <N> findings to Iamu Cloud.` If the result has `c
298
264
 
299
265
  Then end with the dashboard link from `iamu open --print` (step replay, screenshots side by side, the team's view of the same findings):
300
266
 
301
- ```
302
- Team view: <url>
303
- ```
267
+ > ☁️ **Cloud Walkthrough:** [Open in Iamu Cloud](<url from iamu open --print>)
304
268
 
305
269
  In linked-no-credentials mode, end with `Decisions are local only — iamu auth login, then iamu sync, to share them.` Skip this section entirely in local-only mode. The terminal surface is complete.
306
270
 
@@ -85,26 +85,20 @@ Present 2–3 scannable scenario proposals. Each proposal MUST bundle the situat
85
85
  3. "Select alternative: '<Bundle 2 Title>' as <Persona 2 Name>"
86
86
  4. "Customize situation, checkpoint, or brief"
87
87
  - Otherwise (in CLI or text-only environments):
88
-
89
- Scaffold this scenario for walkthrough?
90
- 1. [Recommended] Scaffold '<Bundle 1 Title>' as <Persona 1 Name>
91
- 2. Switch persona: Walk as <Alternative Persona Name> (<Role>)
92
- 3. Select alternative: '<Bundle 2 Title>' as <Persona 2 Name>
93
- 4. Customize situation, checkpoint, or brief
94
-
95
- Reply '1' to scaffold [default], select 2-3, or type adjustments:
88
+ I recommend scaffolding '<Bundle 1 Title>' as <Persona 1 Name>.
89
+ Proceeding to scaffold scenario — say "switch persona", "select alternative", or describe adjustments to customize.
96
90
 
97
91
  *Execution Flow:*
98
- - **Selecting Option 1 (or hitting Enter):** Proceed IMMEDIATELY to Step 6 (Persist everything). Zero intermediate question modals.
92
+ - **Selecting Option 1 (or conversational confirmation):** Proceed IMMEDIATELY to Step 6 (Persist everything). Zero intermediate question modals.
99
93
  - **Selecting Option 2:** Present the persona switcher (Step 4) then persist.
100
94
  - **Selecting Option 3:** Swap primary bundle and prompt to persist.
101
95
  - **Selecting Option 4 / typing adjustments:** Expand into Step 3 to refine details before persisting.
102
96
 
103
97
  ### 3. Develop the situation (Scenario Spec-Sheet)
104
98
 
105
- In Fast-Path mode or when customizing, present the complete scenario as a structured, scannable Spec-Sheet before creating anything. Every field shown here is written verbatim to disk on confirmation:
99
+ In Fast-Path mode or when customizing, present the complete scenario as a structured, scannable Spec-Sheet before creating anything. Every field shown here is written verbatim to disk on confirmation.
106
100
 
107
- Do NOT output markdown header hashes (`#`, `##`, `###`) or markdown blockquote syntax (`>`), which render as stray hashes or `|` pipe characters in terminal frontends. Keep the narrative capped at 2–3 punchy sentences (problem-space only, zero UI terms).
101
+ Keep the narrative capped at 2–3 punchy sentences (problem-space only, zero UI terms). (Note: When passing text to modal prompt tools like `ask_question`, use plain text without header hashes or blockquotes; in normal chat output, format clearly with standard markdown).
108
102
 
109
103
  ```
110
104
  Scenario Spec-Sheet: <Outline Title>
@@ -133,15 +127,10 @@ Persona & Brief:
133
127
  2. "Switch persona: Walk as <Alternative Persona> (<Role>)"
134
128
  3. "Adjust situation, checkpoint, or brief"
135
129
  - Otherwise (in CLI or text-only environments):
130
+ I recommend scaffolding scenario '<Outline Title>' and preparing the walkthrough.
131
+ Proceeding to scaffold scenario — say "switch persona" or describe adjustments.
136
132
 
137
- Scaffold scenario '<Outline Title>'?
138
- 1. [Recommended] Scaffold scenario and prepare walkthrough
139
- 2. Switch persona: Walk as <Alternative Persona> (<Role>)
140
- 3. Adjust situation, checkpoint, or brief
141
-
142
- Reply '1' to scaffold [default], select 2, or type adjustments:
143
-
144
- *Selecting Option 1 or hitting Enter proceeds IMMEDIATELY to Step 6 (Persist everything).*
133
+ *Selecting Option 1 proceeds IMMEDIATELY to Step 6 (Persist everything).*
145
134
 
146
135
  ### 4. Pick or swap personas (on demand)
147
136
 
@@ -170,7 +159,8 @@ If no existing persona fits, or if testing an uncovered perspective is needed, p
170
159
  1. "[Recommended] Bind existing persona: <slug> (<role>)" (if one fits)
171
160
  2. "Create candidate: <Name> (<Role>)"
172
161
  3. "Leave as draft (no persona bound yet)"
173
- - Otherwise, prompt: "Pick a persona (1–N), 'new' to propose candidates, or 'skip' to save as draft without a persona."
162
+ - Otherwise, state the recommended persona and conversational default:
163
+ "I recommend binding <slug> (<role>). Proceeding with this persona — name a candidate or say 'skip' to save as draft."
174
164
 
175
165
  ### 5. Classify into capabilities
176
166
 
@@ -96,7 +96,8 @@ Existing coverage: <N> scenarios ([<slug1>](iamu/scenarios/<slug1>.md), ...). Un
96
96
  2. "Scaffold '<Candidate 2 Title>' (<Actor>)"
97
97
  3. "Scaffold '<Candidate 3 Title>' (<Actor>)"
98
98
  - Otherwise (in CLI or text-only environments):
99
- Reply '1' to scaffold [default], select 2-3, or describe adjustments:
99
+ I recommend scaffolding Candidate 1: '<Candidate 1 Title>' (<Actor>).
100
+ Proceeding to scaffold scenario — name another candidate or describe adjustments.
100
101
 
101
102
  #### B. When proposing Personas:
102
103
 
@@ -126,7 +127,8 @@ Existing personas: [<slug1>](iamu/personas/<slug1>.md), ... Uncovered roles from
126
127
  2. "Add <Name 2> (<Actor role>)"
127
128
  3. "Add <Name 3> (<Actor role>)"
128
129
  - Otherwise (in CLI or text-only environments):
129
- Reply '1' to add [default], select 2-3, or describe adjustments:
130
+ I recommend adding Candidate 1: <Name 1> (<Actor role>).
131
+ Proceeding to add persona — name another candidate or describe adjustments.
130
132
 
131
133
  Ground rules for generation:
132
134
 
@@ -57,8 +57,8 @@ When `$ARGUMENTS` is empty and no active scenario exists in context, check `iamu
57
57
  1. "[Recommended] Ignore and continue with new run"
58
58
  2. "Finish run `<run-id>`: Run post-walk assembly on existing steps"
59
59
  3. "Discard empty unfinished runs"
60
- - Otherwise (in text-only/conversational environments), state that you are proceeding with Option 1 by default:
61
- "Note: Found <N> unfinished walkthrough run(s). Proceeding with a new run [1]. (Reply 2 to finish run `<run-id>` or 3 to discard empty runs)."
60
+ - Otherwise (in text-only/conversational environments), state the recommended action and default:
61
+ "Found <N> unfinished walkthrough run(s). Proceeding with a new run. (Say 'finish <run-id>' or 'discard empty' to adjust)."
62
62
 
63
63
  Do not block the new run on this, and do not ask again in the same session.
64
64
 
@@ -110,7 +110,8 @@ Omit the first group when `rerun` is empty. If `requests.open` in the status out
110
110
  1. "[Recommended] <Slug or Title>" (e.g. top rerun needing proof, or primary ready scenario)
111
111
  2. "<Alternative Scenario Slug or Title>"
112
112
  3. "Draft a new scenario..."
113
- - Otherwise, prompt: "Pick a scenario number (1–N), enter a slug, or type an intent to draft a new one."
113
+ - Otherwise, state the recommended scenario and conversational default:
114
+ "Recommended scenario: `<Slug or Title>`. Proceeding with this scenario — say '<Alternative Slug>' or describe a new intent to change course."
114
115
 
115
116
  Drafts get a bind prompt before execution (step 2); ready-to-run scenarios skip to step 3.
116
117
 
@@ -125,7 +126,8 @@ If the resolved scenario has `persona: null`, prompt to bind before executing:
125
126
  1. "[Recommended] <Existing Persona 1> (<Role>)"
126
127
  2. "<Existing Persona 2> (<Role>)"
127
128
  3. "Draft a new persona candidate"
128
- - Otherwise, ask: "This scenario is a draft — no persona bound. Pick an existing persona (1–N), or type 'new' to propose candidates."
129
+ - Otherwise, state the recommended persona and conversational default:
130
+ "This scenario is a draft with no persona bound. I recommend binding `<Existing Persona 1>` (<Role>). Proceeding with this persona — name another persona or type 'new' to propose candidates."
129
131
 
130
132
  1. Read `iamu/personas/` directory or run `iamu list personas`; present as pickable list + "new" option.
131
133
  2. Picked existing → bind that persona by updating the scenario file's `persona` field.
@@ -162,11 +164,8 @@ If the target is a local URL (e.g. `http://localhost:*`, `http://127.0.0.1:*`) a
162
164
  2. "I will start the dev server manually (wait for port)"
163
165
  3. "Specify a different target URL"
164
166
  - Otherwise (CLI / text-only):
165
- Target URL <url> is unreachable. Boot dev server now?
166
- 1. [Recommended] Boot dev server in background (`<dev_command>`) and proceed
167
- 2. I will start the dev server manually (wait for port)
168
- 3. Specify a different target URL
169
- Reply '1' to boot dev server [default], select 2-3, or provide target URL:
167
+ Target URL <url> is unreachable. I recommend Option 1: Boot dev server in background (`<dev_command>`) and proceed.
168
+ Proceeding with dev server boot — say "wait" to start manually or provide a different target URL.
170
169
  3. If Option 1 is chosen:
171
170
  - Launch `<dev_command>` in the background as a managed daemon process.
172
171
  - Poll `<url>` with HTTP requests until it responds (timeout: 30s).
@@ -432,23 +431,23 @@ Render results **inline** as a concise executive scorecard.
432
431
 
433
432
  **ANTI-BLOAT DIRECTIVE:** Terminal viewports are small. Never output multi-screen walls of markdown text. The overview exists only to present the top-line score and orient the user for triage. Do NOT dump long quotes, recommendations, full descriptions, or "What Worked" essays here — those belong in the interactive triage step below.
434
433
 
435
- Keep the presentation under 15 lines total:
434
+ Keep the presentation under 15 lines total. Output as rich Markdown (do NOT wrap the entire summary in a triple-backtick code block so links render as clickable):
436
435
 
437
- ```
438
- Walkthrough: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
439
- Verdict: <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (Steps: <N>)
440
- Focus Checkpoint: "<human_tests[0].question>" → <No / Partial / Yes>: <1-sentence direct answer>
436
+ ### Walkthrough Complete: [<scenario-slug>](iamu/scenarios/<scenario-slug>.md) ([<persona>](iamu/personas/<persona>.md))
437
+ **Verdict:** <FAIL / PARTIAL / PASS> · <N> Blockers (Critical) · <M> Friction points (Major/Minor) · <K> Helpers (<StepCount> steps)
438
+ **Checkpoint:** "<human_tests[0].question>" → <No / Partial / Yes>: <1-sentence direct answer>
441
439
 
442
- Findings:
443
- 1. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
444
- 2. [<CRITICAL|MAJOR|MINOR> · <type>] <Short title> (Step <N> at <short_url_path>)
440
+ #### Findings:
441
+ 1. **[CRITICAL]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
442
+ 2. **[MAJOR]** · *<type>* · <Short title> (Step <N> at `<short_url_path>`)
445
443
  ...
446
444
  (Helps: • [helps] <short title> (Step <N>))
447
445
 
448
- Cloud: <Shareable report: <url> | Local only>
449
- ```
450
-
451
446
  (If canonical.json contains a `verification` section, include a 1-line delta: `Since last run: ✓ <N> fixed · ✗ <M> persist · + <K> new`.)
447
+
448
+ > ☁️ **Cloud Walkthrough:** [Open in Iamu Cloud](<url from iamu open <run-id> --print>)
449
+ *(If local-only, render instead: `> **Artifact:** [iamu/.runs/<run-id>/report.md](iamu/.runs/<run-id>/report.md) (Local only)`)*
450
+
452
451
  Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the entire summary under 15 lines, then immediately present the triage prompt below.
453
452
 
454
453
  7. **Next actions (Interactive Triage Selection)**:
@@ -460,15 +459,9 @@ Do NOT output `### What Worked` paragraphs or lengthy bullet essays. Keep the en
460
459
  2. "Apply fixes for all clear findings (batch fix)"
461
460
  3. "Discuss findings and persona friction points"
462
461
  4. "Re-run walkthrough to test changes"
463
- - Otherwise (in CLI or text-only environments):
464
-
465
- Walkthrough complete: <F> findings reported.
466
- 1. [Recommended] Walk through findings one by one
467
- 2. Apply fixes for all clear findings (batch fix)
468
- 3. Discuss findings and persona friction points
469
- 4. Re-run walkthrough to test changes
470
-
471
- Reply '1' to review findings [default], enter 2-4, or tell me how to proceed:
462
+ - Otherwise (in CLI or text-only environments):
463
+ Walkthrough complete: <F> findings reported. I recommend walking through findings one by one.
464
+ Proceeding with one-by-one triage. (Say "batch fix", "discuss", or "re-run" to change course).
472
465
 
473
466
  ### 6. Conversational Triage & Guided Review
474
467
 
@@ -483,7 +476,7 @@ When the user asks to review findings one by one:
483
476
  ```markdown
484
477
  ### Finding #<N>/<total> [<SEVERITY>] — <title>
485
478
  > **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>)
479
+ > **Evidence:** [step-<N>.png](iamu/.runs/<run>/screenshots/step-<N>.png) · [View in Cloud Walkthrough](<url from iamu open <run-id> --print>)
487
480
 
488
481
  **❌ Problem:**
489
482
  <What went wrong on screen and why it hinders the persona (synthesizing ui_fact and consequence in 1–2 clear, direct sentences)>
@@ -491,49 +484,26 @@ When the user asks to review findings one by one:
491
484
  **💡 Recommendation:**
492
485
  <Concrete fix proposal from finding body>
493
486
  ```
494
- If the project is cloud-linked, include the link to the finding in Iamu Cloud (from `iamu open --print`).
487
+ *(For `type: "helps"` findings, omit `**❌ Problem:**` and `**💡 Recommendation:**`; render `**✓ Strength:** <Observation>`)*.
488
+
489
+ If the project is cloud-linked, include the direct link to the walkthrough in Iamu Cloud (from `iamu open <run-id> --print`).
495
490
 
496
491
  Followed immediately by the decision prompt:
497
492
 
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):
493
+ **Dual-Surface Triage Prompting (Sequencing Rule):**
494
+ You MUST output the rich markdown finding card to the chat stream FIRST. In the SAME turn, invoke `ask_question`:
500
495
 
501
496
  - If interactive tool available (e.g. `ask_question`, `ask_followup_question`), invoke it:
502
- - **Question:**
503
- """
504
- Finding #<N>/<total> [<SEVERITY>]: <title>
505
- Where: <Screen title or URL, Step N> · Persona: <Persona Name> (<Role>)
506
-
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>
512
-
513
- How should we triage this finding?
514
- """
497
+ - **Question:** "Finding #<N>/<total> [<SEVERITY>]: <title> on <Screen title or URL, Step N> — How to triage?"
515
498
  - **Options:**
516
499
  1. "[Recommended] Queue to fix (<brief 3-5 word fix summary>)"
517
- 2. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
518
- 3. "Discuss / Explore trade-offs"
519
- 4. "Fix immediately (leave triage now)"
520
- 5. "Next finding (keep open / defer)"
521
- - Otherwise (CLI / text-only):
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)
536
- Reply '1' to queue fix [default], select 2-5, or describe your decision:
500
+ 2. "Queue all remaining recommended fixes (batch accept)"
501
+ 3. "Dismiss / Skip (<brief reason if obvious, e.g. keep current design>)"
502
+ 4. "Discuss / Explore trade-offs"
503
+ 5. "Fix immediately (leave triage now)"
504
+ - Otherwise (CLI / text-only conversational fallback):
505
+ > **Recommended Action:** Queue to fix (<brief 3-5 word fix summary>).
506
+ > Say **"queue"** (or **"queue all"**), **"dismiss"** (to teach a rule), or **"discuss"** to explore trade-offs.
537
507
 
538
508
  2. **Handle the user's decision**:
539
509
  - **Queue to fix [Recommended]**:
@@ -584,11 +554,8 @@ When the user asks to review findings one by one:
584
554
  2. "Re-run walkthrough to verify dismissed items first"
585
555
  3. "Done for now (keep fixes open in iamu/findings/)"
586
556
  - Otherwise (CLI / text-only):
587
- Apply fixes for the <K> queued findings now?
588
- 1. [Recommended] Apply fixes for queued findings in workspace now
589
- 2. Re-run walkthrough to verify dismissed items first
590
- 3. Done for now (keep fixes open in iamu/findings/)
591
- Reply '1' to apply fixes [default], or select 2-3:
557
+ Triage complete. I recommend: Apply fixes for queued findings in workspace now.
558
+ Proceeding with code fixes — say "re-run first" or "done for now" to adjust.
592
559
 
593
560
  - **Executing the queued fixes:**
594
561
  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>"`.
@@ -604,10 +571,8 @@ When the user asks to review findings one by one:
604
571
  1. "[Recommended] Re-run walkthrough to verify fixes hold"
605
572
  2. "Done for now (leave verification for later)"
606
573
  - Otherwise (CLI / text-only):
607
- Verify fixes now?
608
- 1. [Recommended] Re-run walkthrough to verify fixes hold
609
- 2. Done for now (leave verification for later)
610
- Reply '1' to re-run [default], or select 2:
574
+ Fixes applied and validated. I recommend: Re-run walkthrough to verify fixes hold.
575
+ Proceeding with verification re-run — say "done" to leave verification for later.
611
576
 
612
577
  When Option 1 is chosen:
613
578
  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`.
@@ -99,15 +99,8 @@ Prompt the user to verify the safety boundary:
99
99
  2. "Adjust boundaries (add forbidden external URLs, change dev command or port)"
100
100
  3. "Skip safety fence for now"
101
101
  - Otherwise (text-only/CLI):
102
-
103
- ```text
104
- Confirm safety fence and dev environment?
105
- 1. [Recommended] Safety boundaries look safe — save fence and proceed
106
- 2. Adjust boundaries (add forbidden external URLs, change dev command or port)
107
- 3. Skip safety fence for now
108
-
109
- Reply '1' to accept [default], select 2-3, or tell me what to adjust:
110
- ```
102
+ Safety boundaries look safe. I recommend saving fence and proceeding.
103
+ Proceeding to save safety fence — say "adjust" to change boundaries or "skip" to defer.
111
104
 
112
105
  **Action on confirmation (Option 1):**
113
106
  Persist the safety fence using `iamu set testability` (never invoke host file creation or edit tools):
@@ -170,15 +163,8 @@ Prompt the user to verify the project description:
170
163
  2. "Save project description only (skip scenario creation for now)"
171
164
  3. "Adjust domain or description"
172
165
  - Otherwise (text-only/CLI):
173
-
174
- ```text
175
- Confirm project domain & description?
176
- 1. [Recommended] Project description is accurate — proceed to design first test
177
- 2. Save project description only (skip scenario creation for now)
178
- 3. Adjust domain or description
179
-
180
- Reply '1' to accept [default], select 2-3, or tell me what to adjust:
181
- ```
166
+ Project description is accurate. I recommend proceeding to design your first test.
167
+ Proceeding to first test design — say "save only" or describe adjustments to change course.
182
168
 
183
169
  **Action on confirmation (Option 1):**
184
170
  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`:
@@ -228,16 +214,8 @@ Prompt the user to verify the scenario and its auth precondition:
228
214
  3. "Switch role / design a different scenario (write-in)"
229
215
  4. "Skip scenario for now"
230
216
  - Otherwise (text-only/CLI):
231
-
232
- ```text
233
- Scaffold this baseline journey?
234
- 1. [Recommended] Scaffold journey with <detected auth mechanism>
235
- 2. Use interactive human login handshake (pause browser for live login)
236
- 3. Switch role / design a different scenario
237
- 4. Skip scenario for now
238
-
239
- Reply '1' to accept [default], select 2-4, or tell me what to adjust:
240
- ```
217
+ I recommend Option 1: Scaffold journey with <detected auth mechanism>.
218
+ Proceeding to scaffold baseline journey — say "interactive login", "switch role", or "skip" to adjust.
241
219
 
242
220
  **Action on confirmation (Option 1 or Option 2):**
243
221
  1. **Scaffold Primary Capability** (if not already existing):
@@ -105,6 +105,17 @@ Now present the **Strategic Fork** to the user. Do not be an unyielding bureaucr
105
105
  - State: "This situation reads a public page and requires no pre-existing world state."
106
106
  - Mark `--state-description "No particular data needed"`.
107
107
 
108
+ **Interactive Decision Gate:**
109
+ - If your environment provides an interactive user-prompt tool (e.g. `ask_question`, `ask_followup_question`), invoke it:
110
+ - Question: "How should we stage '<scenario-slug>' for walkthrough?"
111
+ - Options:
112
+ 1. "[Recommended] Option A: Build Testability (<brief seed proposal>)"
113
+ 2. "Option B: Semantic Squinting (test immediately against current dev database)"
114
+ 3. "Option C: Zero Setup Needed (public or self-contained flow)"
115
+ - Otherwise (in CLI or text-only environments):
116
+ I recommend Option A: Build Testability (<brief seed proposal>).
117
+ Proceeding with testability setup — say "squint" for Option B, or "zero setup" for Option C to change course.
118
+
108
119
  ### 4. Apply & Persist Staging
109
120
 
110
121
  Once the user chooses (or confirms):
@@ -57,7 +57,7 @@ The directory `iamu/.prompts/` contains internal prompt templates (`persona.md`,
57
57
 
58
58
  For a project-status question, add one line on the cloud from `iamu status --json` (`mode`, `sync`, `requests`) and `iamu auth status --json` (`authenticated`):
59
59
 
60
- - **Linked** → `Cloud: linked — <url from iamu open --print>`, then only what needs action: unpushed changes (`sync.pending_new` + `sync.pending_updates` + `walkthroughs.pending`, and `sync.local_deletions.count`) → `iamu sync`; `requests.open` above zero → `<N> team requests — iamu-findings`.
60
+ - **Linked** → `Cloud: linked — [Open Project in Iamu Cloud](<url from iamu open --print>)`, then only what needs action: unpushed changes (`sync.pending_new` + `sync.pending_updates` + `walkthroughs.pending`, and `sync.local_deletions.count`) → `iamu sync`; `requests.open` above zero → `<N> team requests — iamu-findings`.
61
61
  - **Linked, no credentials** → `Cloud: linked, but this machine has no credentials — iamu auth login.`
62
62
  - **Local-only** → `Cloud: local-only.` Nothing more; no upgrade pitch.
63
63
 
@@ -8,4 +8,5 @@ export declare const symbols: {
8
8
  info: string;
9
9
  dot: string;
10
10
  question: string;
11
+ step: string;
11
12
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamu-dev/iamu",
3
- "version": "0.3.0-beta.1",
3
+ "version": "0.3.0-beta.3",
4
4
  "type": "module",
5
5
  "description": "Test your product as realistic personas — scenario-driven development CLI",
6
6
  "license": "UNLICENSED",