@iamu-dev/iamu 0.7.0-beta.0 → 0.8.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 +3170 -990
- package/dist/commands/browse-actions.d.ts +1 -0
- package/dist/commands/browse-driver.d.ts +25 -5
- package/dist/commands/browse.d.ts +39 -1
- package/dist/commands/doctor-design.d.ts +9 -0
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/edit-entity.d.ts +3 -3
- package/dist/commands/finding-stability.d.ts +71 -0
- package/dist/commands/fix-brief.d.ts +6 -2
- package/dist/commands/init.d.ts +4 -4
- package/dist/commands/instructions-walk.d.ts +6 -0
- package/dist/commands/live-run-client.d.ts +1 -0
- package/dist/commands/preflight.d.ts +4 -2
- package/dist/commands/report-data.d.ts +2 -1
- package/dist/commands/set-entity.d.ts +7 -0
- package/dist/commands/step.d.ts +2 -0
- package/dist/commands/timings.d.ts +19 -0
- package/dist/commands/triage.d.ts +6 -0
- package/dist/index.js +3139 -984
- package/dist/templates/prompts/advise.md +1 -0
- package/dist/templates/prompts/complete.md +1 -1
- package/dist/templates/prompts/design-review.md +9 -0
- package/dist/templates/prompts/designer.md +2 -0
- package/dist/templates/prompts/walk.md +8 -5
- package/dist/templates/skills/iamu-design.md +30 -20
- package/dist/templates/skills/iamu-findings.md +24 -27
- package/dist/templates/skills/iamu-run.md +96 -71
- package/dist/templates/skills/iamu-setup.md +154 -75
- package/dist/templates/skills/iamu-stage.md +29 -23
- package/dist/templates/skills/iamu-status.md +2 -0
- package/dist/ui/report-view.d.ts +5 -0
- package/package.json +2 -2
|
@@ -28,6 +28,7 @@ export interface IndexedElement {
|
|
|
28
28
|
name: string;
|
|
29
29
|
type?: string;
|
|
30
30
|
disabled?: boolean;
|
|
31
|
+
checked?: boolean;
|
|
31
32
|
}
|
|
32
33
|
export declare const INDEXED_SELECTOR: string;
|
|
33
34
|
export declare function markAndQueryIndexedElements(page: Page): Promise<IndexedElement[]>;
|
|
@@ -43,7 +43,7 @@ export interface BrowserDriver {
|
|
|
43
43
|
/** The full command line of `pid`, or null when it is gone or cannot be read. */
|
|
44
44
|
commandLine(pid: number): Promise<string | null>;
|
|
45
45
|
/** Send SIGTERM to `pid`. Never throws. */
|
|
46
|
-
kill(pid: number): void;
|
|
46
|
+
kill(pid: number, signal?: NodeJS.Signals | number): void;
|
|
47
47
|
}
|
|
48
48
|
/** How long a CDP liveness probe may take before the port counts as dead. */
|
|
49
49
|
export declare const CDP_PROBE_TIMEOUT_MS = 1000;
|
|
@@ -65,10 +65,9 @@ export declare const CDP_PROBE_TIMEOUT_MS = 1000;
|
|
|
65
65
|
*/
|
|
66
66
|
export declare function probeCdp(port: number, timeoutMs?: number): Promise<boolean>;
|
|
67
67
|
/**
|
|
68
|
-
* The command line of a running process
|
|
69
|
-
* `/proc/<pid>/cmdline` on Linux,
|
|
70
|
-
*
|
|
71
|
-
* callers then leave the process alone.
|
|
68
|
+
* The command line of a running process:
|
|
69
|
+
* `/proc/<pid>/cmdline` on Linux, PowerShell CIM query on Windows,
|
|
70
|
+
* else `ps -ww -o args= -p <pid>`.
|
|
72
71
|
*
|
|
73
72
|
* @param pid - Process ID to inspect.
|
|
74
73
|
* @param platform - Defaults to `process.platform`.
|
|
@@ -82,6 +81,12 @@ export declare function probeCdp(port: number, timeoutMs?: number): Promise<bool
|
|
|
82
81
|
* @public
|
|
83
82
|
*/
|
|
84
83
|
export declare function readProcessCommandLine(pid: number, platform?: NodeJS.Platform): Promise<string | null>;
|
|
84
|
+
/**
|
|
85
|
+
* Supported browser executable names in process command lines.
|
|
86
|
+
*
|
|
87
|
+
* @public
|
|
88
|
+
*/
|
|
89
|
+
export declare const BROWSER_NAME_RE: RegExp;
|
|
85
90
|
/**
|
|
86
91
|
* Was this command line launched with exactly this `--user-data-dir`?
|
|
87
92
|
* The profile directory is ours alone, so a match means the PID is the
|
|
@@ -117,5 +122,20 @@ export declare function isOurBrowser(commandLine: string | null, profileDir: str
|
|
|
117
122
|
* @public
|
|
118
123
|
*/
|
|
119
124
|
export declare function reapBrowser(pid: number, profileDir: string, driver: Pick<BrowserDriver, "commandLine" | "kill">): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Select the target page to act on from all open pages in the context.
|
|
127
|
+
* Filters out devtools and browser internal/extension pages unless only internal pages exist.
|
|
128
|
+
* Respects pageIndex when valid; otherwise prefers the last active non-blank page.
|
|
129
|
+
*
|
|
130
|
+
* @param rawPages - All pages returned by the browser context.
|
|
131
|
+
* @param pageIndex - Optional explicit zero-based index into the filtered pages array.
|
|
132
|
+
* @returns The selected Page and the list of user/available pages.
|
|
133
|
+
*
|
|
134
|
+
* @public
|
|
135
|
+
*/
|
|
136
|
+
export declare function selectTargetPage(rawPages: Page[], pageIndex?: number): {
|
|
137
|
+
page: Page | undefined;
|
|
138
|
+
pages: Page[];
|
|
139
|
+
};
|
|
120
140
|
/** The real driver: spawns Chrome and speaks CDP through playwright-core. */
|
|
121
141
|
export declare const cdpDriver: BrowserDriver;
|
|
@@ -19,9 +19,15 @@ export interface BrowseOptions {
|
|
|
19
19
|
surface?: string;
|
|
20
20
|
maxSteps?: string | number;
|
|
21
21
|
stepFile?: string;
|
|
22
|
+
/** Chained page actions executed sequentially in a single browse step before screenshot. */
|
|
23
|
+
then?: string[];
|
|
24
|
+
/** Include post-action indexed snapshot in browse step output (default: true). */
|
|
25
|
+
snapshot?: boolean;
|
|
22
26
|
json?: boolean;
|
|
23
27
|
/** Annotate snapshot with 1-based index numbers [#N] for click-index / fill-index */
|
|
24
28
|
indexed?: boolean;
|
|
29
|
+
/** `clear-storage`: the origin to clear (default: the run's target URL). */
|
|
30
|
+
origin?: string;
|
|
25
31
|
}
|
|
26
32
|
interface BrowseState {
|
|
27
33
|
port: number;
|
|
@@ -175,7 +181,39 @@ export declare function detectAntiBotChallenge(page: Page, allowEvaluate?: boole
|
|
|
175
181
|
*/
|
|
176
182
|
export declare function withPage(opts: BrowseOptions, driver: BrowserDriver, fn: (page: Page) => Promise<void>,
|
|
177
183
|
/** What the action looks for, named for the error message. */
|
|
178
|
-
target?: string
|
|
184
|
+
target?: string,
|
|
185
|
+
/** Optional post-screenshot hook executed before detaching from CDP. */
|
|
186
|
+
onPostShot?: (page: Page) => Promise<void>): Promise<PageResult | null>;
|
|
187
|
+
/**
|
|
188
|
+
* Obtain an ARIA accessibility snapshot with fallback from body to :root,
|
|
189
|
+
* handling empty or about:blank pages gracefully.
|
|
190
|
+
*
|
|
191
|
+
* @public
|
|
192
|
+
*/
|
|
193
|
+
export declare function resilientAriaSnapshot(page: Page): Promise<string>;
|
|
194
|
+
/** What {@link clearOriginStorage} removed. */
|
|
195
|
+
export interface ClearedStorage {
|
|
196
|
+
origin: string;
|
|
197
|
+
local_storage_keys: string[];
|
|
198
|
+
cookies: string[];
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Leave the page for `about:blank` (so the app cannot write its state
|
|
202
|
+
* back on unload), then clear cookies, localStorage, IndexedDB and
|
|
203
|
+
* caches for `origin`. Returns what was there, or an error message.
|
|
204
|
+
*/
|
|
205
|
+
export declare function clearOriginStorage(origin: string, driver?: BrowserDriver,
|
|
206
|
+
/** Page to open after clearing (the run's start URL); else about:blank. */
|
|
207
|
+
returnTo?: string): Promise<ClearedStorage | {
|
|
208
|
+
error: string;
|
|
209
|
+
}>;
|
|
210
|
+
/**
|
|
211
|
+
* Split a chained action string (e.g. `fill-index 22 "2026-11-20"`) into tokens,
|
|
212
|
+
* respecting single and double quotes.
|
|
213
|
+
*
|
|
214
|
+
* @public
|
|
215
|
+
*/
|
|
216
|
+
export declare function parseActionCommand(raw: string): string[];
|
|
179
217
|
/**
|
|
180
218
|
* `iamu browse <command> [args…]` — dispatch one browse subcommand.
|
|
181
219
|
* Failures print to stderr and set exit code 1.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DoctorCheck } from "./doctor.js";
|
|
2
|
+
/**
|
|
3
|
+
* The design docs the project recorded: files that are gone, references
|
|
4
|
+
* inside them to paths, components and tokens that no longer exist, an
|
|
5
|
+
* unmigrated legacy doc, stale proposals and an outdated agent block.
|
|
6
|
+
* No recorded docs is not a fault: the designer then reviews by general
|
|
7
|
+
* craft, so it is reported as ok with a hint.
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkDesignDocs(projectRoot: string): Promise<DoctorCheck[]>;
|
|
@@ -2,7 +2,7 @@ export interface EditEntityOptions {
|
|
|
2
2
|
json?: boolean;
|
|
3
3
|
}
|
|
4
4
|
/**
|
|
5
|
-
* Open an entity in the user's $EDITOR or $VISUAL,
|
|
6
|
-
* against the
|
|
5
|
+
* Open an entity or project configuration file in the user's $EDITOR or $VISUAL,
|
|
6
|
+
* and validate its frontmatter against the schema on exit.
|
|
7
7
|
*/
|
|
8
|
-
export declare function editEntity(type: string, slug
|
|
8
|
+
export declare function editEntity(type: string, slug?: string, opts?: EditEntityOptions): Promise<void>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spike (fast-critic-loop D6): how stable each finding has been across
|
|
3
|
+
* its scenario's runs, computed on read from local run history. No new
|
|
4
|
+
* stored field; the harden phase moves this into the match stage.
|
|
5
|
+
*
|
|
6
|
+
* A data point per non-blocked completed run of the scenario, oldest
|
|
7
|
+
* first, from the finding's first observation on:
|
|
8
|
+
* - `1` the run recorded it: a finding file of that run carries its
|
|
9
|
+
* `canonical_id`, or the run's verification says it persists;
|
|
10
|
+
* - `0` the run re-checked it and saw it working: `verification.resolved`
|
|
11
|
+
* or the matcher's `rechecked_fixed` (step-backed, not absence);
|
|
12
|
+
* - no point at all when the run said nothing about it (`not_observed`,
|
|
13
|
+
* `uncertain`, or it was not part of the comparison). A walk that took
|
|
14
|
+
* another path is not evidence of a flicker, the same rule as
|
|
15
|
+
* `fix-state.ts` ("never from absence").
|
|
16
|
+
*
|
|
17
|
+
* `unstable` when the points since the last fix (a finding with that
|
|
18
|
+
* canonical id triaged `addressed`/`fixed`) change value two or more
|
|
19
|
+
* times; `first_seen` when it was observed once; otherwise `stable`.
|
|
20
|
+
*/
|
|
21
|
+
import { type RunEvidence } from "@iamu-dev/local-store";
|
|
22
|
+
/** How far a builder can trust a finding to be real and lasting. */
|
|
23
|
+
export type FindingStability = "stable" | "unstable" | "first_seen";
|
|
24
|
+
/** One run's word on a finding: observed (1) or re-checked fixed (0). */
|
|
25
|
+
export interface StabilityPoint {
|
|
26
|
+
observed: boolean;
|
|
27
|
+
/** Run start, epoch ms; null when unknown. */
|
|
28
|
+
at: number | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The D6 rule on one finding's chronological points.
|
|
32
|
+
*
|
|
33
|
+
* @param points - Oldest first; runs with no word on the finding left out.
|
|
34
|
+
* @param fixedAt - Epoch ms of the latest recorded fix, or null.
|
|
35
|
+
* @returns `first_seen`, `unstable` or `stable`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* stabilityOf([{ observed: true, at: 1 }, { observed: false, at: 2 }, { observed: true, at: 3 }], null);
|
|
40
|
+
* // "unstable"
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function stabilityOf(points: readonly StabilityPoint[], fixedAt: number | null): FindingStability;
|
|
44
|
+
interface HistoryFinding {
|
|
45
|
+
run?: string;
|
|
46
|
+
scenario?: string;
|
|
47
|
+
canonical_id?: string;
|
|
48
|
+
triage_status?: string;
|
|
49
|
+
updated_at?: string;
|
|
50
|
+
created_at?: string;
|
|
51
|
+
source?: string;
|
|
52
|
+
lens?: string;
|
|
53
|
+
}
|
|
54
|
+
/** What the stability read needs from disk; load once per report. */
|
|
55
|
+
export interface StabilityHistory {
|
|
56
|
+
runs: RunEvidence[];
|
|
57
|
+
findings: HistoryFinding[];
|
|
58
|
+
}
|
|
59
|
+
/** Read the run evidence and finding files once. Never throws. */
|
|
60
|
+
export declare function loadStabilityHistory(projectRoot: string): Promise<StabilityHistory>;
|
|
61
|
+
/**
|
|
62
|
+
* Stability of every canonical finding of `scenario`, as of `runId`
|
|
63
|
+
* (later runs are not its past).
|
|
64
|
+
*
|
|
65
|
+
* @param history - From {@link loadStabilityHistory}.
|
|
66
|
+
* @param scenario - Scenario slug.
|
|
67
|
+
* @param runId - The run being reported; runs after it are ignored.
|
|
68
|
+
* @returns canonical id → stability.
|
|
69
|
+
*/
|
|
70
|
+
export declare function scenarioStability(history: StabilityHistory, scenario: string, runId: string): Map<string, FindingStability>;
|
|
71
|
+
export {};
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { type DesignerFixBrief, type FixBrief } from "@iamu-dev/local-store";
|
|
2
|
-
export declare function fixBrief(ref: string, opts: {
|
|
2
|
+
export declare function fixBrief(ref: string | undefined, opts: {
|
|
3
|
+
wave?: boolean;
|
|
3
4
|
json?: boolean;
|
|
4
5
|
}): Promise<void>;
|
|
5
6
|
/**
|
|
6
7
|
* A loop step as a person reads it: each backticked field name becomes
|
|
7
8
|
* the section above that holds it, or its value.
|
|
8
9
|
*/
|
|
9
|
-
export declare function readable(step: string, b: Pick<FixBrief | DesignerFixBrief, "
|
|
10
|
+
export declare function readable(step: string, b: Pick<FixBrief | DesignerFixBrief, "closing_check"> & {
|
|
11
|
+
rerun?: string | string[];
|
|
12
|
+
scenarios_to_rerun?: string[];
|
|
13
|
+
}): string;
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -8,18 +8,18 @@ export declare function setupCommand(projectRoot: string, hosts: HostAdapter[]):
|
|
|
8
8
|
* Detect the target port for local dev execution.
|
|
9
9
|
* Checks, in order:
|
|
10
10
|
* 1. process.env.PORT
|
|
11
|
-
* 2. .env files
|
|
12
|
-
* 3.
|
|
13
|
-
* 4. package.json dependencies and framework config files (vite -> 5173, astro -> 4321)
|
|
11
|
+
* 2. Root .env files, vite/astro config `port:`, package.json scripts/deps
|
|
12
|
+
* 3. Monorepo workspace subdirectories (apps/*, packages/*, web, frontend, client)
|
|
14
13
|
*/
|
|
15
14
|
export declare function detectTargetPort(projectRoot: string): number | undefined;
|
|
16
15
|
export declare function detectTargetUrl(projectRoot: string): string;
|
|
17
|
-
export declare function createDraftTestabilityContent(targetUrl?: string): string;
|
|
16
|
+
export declare function createDraftTestabilityContent(targetUrl?: string, status?: "draft" | "verified"): string;
|
|
18
17
|
export interface InitOptions {
|
|
19
18
|
name?: string;
|
|
20
19
|
yes?: boolean;
|
|
21
20
|
json?: boolean;
|
|
22
21
|
cloud?: boolean;
|
|
22
|
+
target?: string;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Scaffold `iamu/` and install skills for the detected hosts.
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { type GuidanceRule, type RevisitPlace } from "@iamu-dev/local-store";
|
|
2
2
|
import { type RunViewport, type ScenarioState } from "@iamu-dev/protocol";
|
|
3
|
+
/**
|
|
4
|
+
* How to invoke this very CLI from a subagent's shell. Aliases and
|
|
5
|
+
* shell functions do not exist there, so name the executable that is
|
|
6
|
+
* running now.
|
|
7
|
+
*/
|
|
8
|
+
export declare function selfCommand(execPath?: string, scriptPath?: string): string;
|
|
3
9
|
/** "The browser is sized as a phone screen, 390×844." */
|
|
4
10
|
export declare function viewportLine(v: RunViewport): string;
|
|
5
11
|
interface WalkerPromptParts {
|
|
@@ -10,14 +10,16 @@ export interface PreflightCheckResult {
|
|
|
10
10
|
reason?: string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
* Detect the fast compile/typecheck
|
|
13
|
+
* Detect the fast compile/typecheck command for a target project.
|
|
14
|
+
* Deliberately excludes lint scripts (`check`, `eslint`, `biome check`) so
|
|
15
|
+
* lint rules never block walkthrough execution.
|
|
14
16
|
*/
|
|
15
17
|
export declare function detectPreflightCommand(targetDir: string): Promise<{
|
|
16
18
|
command: string;
|
|
17
19
|
args: string[];
|
|
18
20
|
} | null>;
|
|
19
21
|
/**
|
|
20
|
-
* Executes a fast preflight
|
|
22
|
+
* Executes a fast preflight typecheck.
|
|
21
23
|
*/
|
|
22
24
|
export declare function runPreflightCheck(targetDir: string): Promise<PreflightCheckResult>;
|
|
23
25
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { CanonicalWalkthrough } from "@iamu-dev/protocol";
|
|
2
2
|
import { type OverviewView, type RunView, type VerdictLabel } from "../ui/report-view.js";
|
|
3
|
+
import { type StabilityHistory } from "./finding-stability.js";
|
|
3
4
|
export interface CompletedRun {
|
|
4
5
|
runId: string;
|
|
5
6
|
manifest: Record<string, unknown>;
|
|
@@ -12,5 +13,5 @@ export declare function readCompletedRuns(projectRoot: string, runIds: string[],
|
|
|
12
13
|
export declare function verdictLabel(c: CanonicalWalkthrough | null): VerdictLabel;
|
|
13
14
|
/** "/request · step 8" from a page URL and a step id. */
|
|
14
15
|
export declare function whereOf(pageUrl: unknown, stepId: unknown): string | null;
|
|
15
|
-
export declare function buildRunView(projectRoot: string, run: CompletedRun): Promise<RunView>;
|
|
16
|
+
export declare function buildRunView(projectRoot: string, run: CompletedRun, history?: StabilityHistory): Promise<RunView>;
|
|
16
17
|
export declare function buildOverview(projectRoot: string, runs: CompletedRun[]): Promise<OverviewView>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ContextFrontmatter } from "@iamu-dev/protocol";
|
|
1
2
|
/**
|
|
2
3
|
* Options for `iamu set`. Every field is staging: where a walk starts,
|
|
3
4
|
* what the world holds, which account a persona uses, which routes an
|
|
@@ -52,6 +53,12 @@ export interface SetEntityOptions {
|
|
|
52
53
|
description?: string | false;
|
|
53
54
|
/** Project name (context). */
|
|
54
55
|
name?: string | false;
|
|
56
|
+
/** Governing documents/standards (context patch). */
|
|
57
|
+
governedBy?: ContextFrontmatter["governed_by"] | false;
|
|
58
|
+
/** Domain actors (context patch). */
|
|
59
|
+
actors?: ContextFrontmatter["actors"] | false;
|
|
60
|
+
/** Domain glossary (context patch). */
|
|
61
|
+
glossary?: ContextFrontmatter["glossary"] | false;
|
|
55
62
|
/** Markdown body narrative (testability, context). */
|
|
56
63
|
body?: string;
|
|
57
64
|
/** JSON patch file (or - for stdin) containing staging fields. */
|
package/dist/commands/step.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export interface RecordStepInput {
|
|
|
25
25
|
note?: string | null;
|
|
26
26
|
/** Path of an existing screenshot to copy in; a missing file is an error. */
|
|
27
27
|
shot?: string | null;
|
|
28
|
+
/** When true, move `shot` into `screenshots/step-N.png` via rename instead of copying. */
|
|
29
|
+
moveShot?: boolean;
|
|
28
30
|
url?: string | null;
|
|
29
31
|
surface?: string | null;
|
|
30
32
|
grounding?: string | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A bracket around a pipeline stage: `start` when a command begins, `end` when it has written its output. */
|
|
2
|
+
export type TimingEvent = "start" | "end";
|
|
3
|
+
/**
|
|
4
|
+
* Spike (fast-critic-loop D0): append one rough timing line to
|
|
5
|
+
* `<runDir>/timings.jsonl`. Never creates the run directory and never
|
|
6
|
+
* throws — a timing that cannot be written is simply lost, so a command
|
|
7
|
+
* never fails because of it. No lock: concurrent appends of one short
|
|
8
|
+
* line are fine for a rough read.
|
|
9
|
+
*
|
|
10
|
+
* @param runDirPath - Absolute path of the run directory (`iamu/.runs/<id>`).
|
|
11
|
+
* @param stage - The command name, e.g. `match-record`.
|
|
12
|
+
* @param event - `start` or `end`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* await logTiming(runDirPath, "match", "end");
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function logTiming(runDirPath: string | null | undefined, stage: string, event: TimingEvent): Promise<void>;
|
|
@@ -10,6 +10,12 @@ export interface TriageOptions {
|
|
|
10
10
|
scope?: string;
|
|
11
11
|
/** `false` (`--no-guidance`): dismiss without writing a guidance rule. */
|
|
12
12
|
guidance?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Project-wide sweep ("we never want X"): dismiss all matching open
|
|
15
|
+
* persona and designer findings across the project and record a
|
|
16
|
+
* project-wide guidance rule.
|
|
17
|
+
*/
|
|
18
|
+
sweep?: boolean | string;
|
|
13
19
|
json?: boolean;
|
|
14
20
|
}
|
|
15
21
|
/**
|