jourilo 1.1.0 → 1.2.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.
@@ -23,7 +23,7 @@ node "${CLAUDE_PLUGIN_ROOT}/dist/jourilo.mjs" <command> [options] --json
23
23
  ```
24
24
 
25
25
  (Written below as `jourilo`.) Do not wrap it in shell variables, `cd`, `&&` chains or pipes: the plugin
26
- pre-approves exactly that form. Output is JSON with `--json`; errors are JSON on stderr with a stable `code`.
26
+ pre-approves exactly that form. Output is JSON with `--json`; with `--json`, stderr is a stream of JSON lines (progress, then any error with a stable `code`).
27
27
  Command reference: `${CLAUDE_PLUGIN_ROOT}/skills/jourilo/references/cli.md` — read it once per session.
28
28
  Run data lives in `.jourilo/` in the current project (git-ignored automatically).
29
29
 
@@ -69,7 +69,9 @@ Tell the user which stage you are in. If they asked for one thing (e.g. "just ac
69
69
  match the real goals (explicit success criteria), then `jourilo journeys run --base <url>`.
70
70
  5. **Judge** — Look at the fold and full-page screenshots of key pages. Record design/usability judgments that
71
71
  the rules cannot measure (hierarchy, clarity of the value proposition, confusing copy) with `finding add`,
72
- each tied to a screenshot, labelled as yours.
72
+ each tied to a screenshot, labelled as yours. When a finding is a confirmed false positive, record it with
73
+ `jourilo finding dismiss <id> --run <run> --reason "<why>" --by agent`: the reason is required, a dismissed
74
+ finding is never counted as "fixed", and you dismiss only when the user agrees or the evidence is clear.
73
75
  6. **Prioritize** — Group by root cause, not by symptom. Order: blocked journeys and critical/serious defects on key
74
76
  journeys → serious accessibility defects → performance on key pages → conversion hypotheses.
75
77
  7. **Fix (repository mode, with permission)** — `jourilo optimize <run> --repo <path>` previews deterministic fixes
@@ -4,9 +4,11 @@
4
4
 
5
5
  Every command prints human-readable text, or JSON with `--json`. Errors go to stderr; with `--json` they are
6
6
  `{"error":{"code","message","hint"}}` with a stable `code`. Exit codes: 0 ok, 1 failed gate or error, 2 usage,
7
- 3 blocked by a safety rule (unsafe URL/path, robots.txt, policy), 4 browser unavailable.
7
+ 3 blocked by a safety rule (unsafe URL/path, robots.txt, policy), 4 browser unavailable, 5 no page could be loaded,
8
+ 6 stopped early by SIGINT/SIGTERM or `--max-duration` (a partial run is still written; a second signal exits 130).
8
9
 
9
- Global options: `--json`, `--workspace DIR` (default `.jourilo`, or `JOURILO_WORKSPACE`), `--quiet`.
10
+ Global options: `--json`, `--workspace DIR` (default `.jourilo`, or `JOURILO_WORKSPACE`), `--quiet`. With `--json`,
11
+ progress lines on stderr are JSON too: `{"type":"progress","message":"…","at":"<ISO time>"}`.
10
12
 
11
13
  ## Understand
12
14
 
@@ -15,7 +17,16 @@ Global options: `--json`, `--workspace DIR` (default `.jourilo`, or `JOURILO_WOR
15
17
  Product intelligence: map a repository (frameworks, routes, design system, i18n, auth, analytics) or a website (pages, conversion points, services).
16
18
 
17
19
  ```
18
- jourilo discover <path|url> [--pages 10]
20
+ jourilo discover <path|url> [--pages 10] [--ignore-robots] [--allow-private] [--deny-local]
21
+ ```
22
+
23
+ ```
24
+ Options:
25
+ --pages N Pages to read when mapping a website (default 10)
26
+ --ignore-robots Ignore robots.txt (only for sites you own or are authorized to test)
27
+ --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
28
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
29
+ JOURILO_DENY_LOCAL=1 does the same
19
30
  ```
20
31
 
21
32
  ## Audit
@@ -30,28 +41,44 @@ jourilo audit <url|dir> [--pages 6] [--viewports desktop,mobile] [--url /path ..
30
41
 
31
42
  ```
32
43
  Options:
33
- --pages N Pages to audit after discovery (default 6; 1 = only the target)
44
+ --pages N Pages to audit after discovery (default 6; 1 = only the target; 0 is a usage error)
34
45
  --depth N Link depth for discovery (default 3)
35
46
  --url PATH Audit exactly these paths/URLs on the target origin (repeatable; skips discovery)
36
47
  --include PATH Add pages to discovery (repeatable)
37
48
  --viewports LIST desktop, laptop, tablet, mobile, reflow (320px) or WIDTHxHEIGHT (default desktop,mobile)
38
49
  --browser NAME chromium (default), firefox, webkit, chrome, msedge
50
+ --headed Show the browser window instead of running headless
51
+ --locale TAG Browser locale for every page (e.g. tr-TR); sets Accept-Language and navigator.language
52
+ --timeout SECS Per-page navigation timeout in seconds (default 30)
39
53
  --throttle Simulate a mid-range phone network and 4x CPU slowdown (Chromium)
40
54
  --runs N Visits per page and viewport for lab metrics; reports the median and range (default 1, max 9)
41
55
  --no-keyboard Skip the keyboard-only walk
42
56
  --auth FILE Playwright storage state for authenticated pages (see docs/PRIVACY.md)
57
+ --timezone ZONE IANA time zone for every page (e.g. Europe/Istanbul)
58
+ --clock ISO Freeze the page's Date at this date-time (e.g. 2026-11-03T22:30:00+03:00); timers keep running
59
+ --setup-journey REF Run this journey first (an id or a .json file) and audit the state it leaves, e.g. a chosen theme or
60
+ a dismissed banner; it follows the journeys safety policy and starts from --auth
43
61
  --mask SELECTOR Extra elements to black out in screenshots (repeatable)
44
62
  --repo PATH Map findings to likely source files in this repository (and read its brand/search context)
45
63
  --brand SLUG Markilo brand to check design consistency against (default: master brand)
46
64
  --ignore-robots Ignore robots.txt (only for sites you own or are authorized to test)
47
65
  --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
66
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
67
+ JOURILO_DENY_LOCAL=1 does the same. Not available with --browser webkit (exit 3). For hosted integrations; a directory target is still served
48
68
  --no-forms Skip the form validation probe
49
69
  (by default, on local hosts, an empty submission is simulated: nothing that sends data
50
70
  leaves the browser, so no database is written; server-side feedback is reported as untested)
51
71
  --allow-submit Really send empty submissions to test server-side validation, on local or other hosts
52
- (disposable/test environments you are authorized to use only; never to delete/payment URLs)
72
+ (disposable/test environments you are authorized to use only; never to delete/payment URLs);
73
+ also lets a --setup-journey submit forms
53
74
  --sarif Also write report.sarif for code scanning
54
75
  --fail-on SEVERITY Exit 1 if a defect at or above this severity exists (CI gate)
76
+ --evidence MODE full (default) or minimal: keep first screens and only the full-page screenshots findings need; JPEG quality 55
77
+ --run-id ID Use this run id instead of a generated one (1-64 of A-Z a-z 0-9 _ -); refused (exit 2) if its
78
+ directory exists, even without a run.json (left by a crashed run)
79
+ --max-duration SECS Stop after this many seconds (1 to 86400) and write a partial run (exit 6), as SIGINT/SIGTERM do;
80
+ the page in progress gets up to 3 s to finish, then it is left out; a second signal quits at
81
+ once (exit 130) after one line on stderr (STOPPED_TWICE with --json)
55
82
  ```
56
83
 
57
84
  ### `jourilo accessibility`
@@ -64,28 +91,44 @@ jourilo accessibility <url|dir> [audit options]
64
91
 
65
92
  ```
66
93
  Options:
67
- --pages N Pages to audit after discovery (default 6; 1 = only the target)
94
+ --pages N Pages to audit after discovery (default 6; 1 = only the target; 0 is a usage error)
68
95
  --depth N Link depth for discovery (default 3)
69
96
  --url PATH Audit exactly these paths/URLs on the target origin (repeatable; skips discovery)
70
97
  --include PATH Add pages to discovery (repeatable)
71
98
  --viewports LIST desktop, laptop, tablet, mobile, reflow (320px) or WIDTHxHEIGHT (default desktop,mobile)
72
99
  --browser NAME chromium (default), firefox, webkit, chrome, msedge
100
+ --headed Show the browser window instead of running headless
101
+ --locale TAG Browser locale for every page (e.g. tr-TR); sets Accept-Language and navigator.language
102
+ --timeout SECS Per-page navigation timeout in seconds (default 30)
73
103
  --throttle Simulate a mid-range phone network and 4x CPU slowdown (Chromium)
74
104
  --runs N Visits per page and viewport for lab metrics; reports the median and range (default 1, max 9)
75
105
  --no-keyboard Skip the keyboard-only walk
76
106
  --auth FILE Playwright storage state for authenticated pages (see docs/PRIVACY.md)
107
+ --timezone ZONE IANA time zone for every page (e.g. Europe/Istanbul)
108
+ --clock ISO Freeze the page's Date at this date-time (e.g. 2026-11-03T22:30:00+03:00); timers keep running
109
+ --setup-journey REF Run this journey first (an id or a .json file) and audit the state it leaves, e.g. a chosen theme or
110
+ a dismissed banner; it follows the journeys safety policy and starts from --auth
77
111
  --mask SELECTOR Extra elements to black out in screenshots (repeatable)
78
112
  --repo PATH Map findings to likely source files in this repository (and read its brand/search context)
79
113
  --brand SLUG Markilo brand to check design consistency against (default: master brand)
80
114
  --ignore-robots Ignore robots.txt (only for sites you own or are authorized to test)
81
115
  --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
116
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
117
+ JOURILO_DENY_LOCAL=1 does the same. Not available with --browser webkit (exit 3). For hosted integrations; a directory target is still served
82
118
  --no-forms Skip the form validation probe
83
119
  (by default, on local hosts, an empty submission is simulated: nothing that sends data
84
120
  leaves the browser, so no database is written; server-side feedback is reported as untested)
85
121
  --allow-submit Really send empty submissions to test server-side validation, on local or other hosts
86
- (disposable/test environments you are authorized to use only; never to delete/payment URLs)
122
+ (disposable/test environments you are authorized to use only; never to delete/payment URLs);
123
+ also lets a --setup-journey submit forms
87
124
  --sarif Also write report.sarif for code scanning
88
125
  --fail-on SEVERITY Exit 1 if a defect at or above this severity exists (CI gate)
126
+ --evidence MODE full (default) or minimal: keep first screens and only the full-page screenshots findings need; JPEG quality 55
127
+ --run-id ID Use this run id instead of a generated one (1-64 of A-Z a-z 0-9 _ -); refused (exit 2) if its
128
+ directory exists, even without a run.json (left by a crashed run)
129
+ --max-duration SECS Stop after this many seconds (1 to 86400) and write a partial run (exit 6), as SIGINT/SIGTERM do;
130
+ the page in progress gets up to 3 s to finish, then it is left out; a second signal quits at
131
+ once (exit 130) after one line on stderr (STOPPED_TWICE with --json)
89
132
  ```
90
133
 
91
134
  ### `jourilo conversion`
@@ -98,28 +141,44 @@ jourilo conversion <url|dir> [audit options]
98
141
 
99
142
  ```
100
143
  Options:
101
- --pages N Pages to audit after discovery (default 6; 1 = only the target)
144
+ --pages N Pages to audit after discovery (default 6; 1 = only the target; 0 is a usage error)
102
145
  --depth N Link depth for discovery (default 3)
103
146
  --url PATH Audit exactly these paths/URLs on the target origin (repeatable; skips discovery)
104
147
  --include PATH Add pages to discovery (repeatable)
105
148
  --viewports LIST desktop, laptop, tablet, mobile, reflow (320px) or WIDTHxHEIGHT (default desktop,mobile)
106
149
  --browser NAME chromium (default), firefox, webkit, chrome, msedge
150
+ --headed Show the browser window instead of running headless
151
+ --locale TAG Browser locale for every page (e.g. tr-TR); sets Accept-Language and navigator.language
152
+ --timeout SECS Per-page navigation timeout in seconds (default 30)
107
153
  --throttle Simulate a mid-range phone network and 4x CPU slowdown (Chromium)
108
154
  --runs N Visits per page and viewport for lab metrics; reports the median and range (default 1, max 9)
109
155
  --no-keyboard Skip the keyboard-only walk
110
156
  --auth FILE Playwright storage state for authenticated pages (see docs/PRIVACY.md)
157
+ --timezone ZONE IANA time zone for every page (e.g. Europe/Istanbul)
158
+ --clock ISO Freeze the page's Date at this date-time (e.g. 2026-11-03T22:30:00+03:00); timers keep running
159
+ --setup-journey REF Run this journey first (an id or a .json file) and audit the state it leaves, e.g. a chosen theme or
160
+ a dismissed banner; it follows the journeys safety policy and starts from --auth
111
161
  --mask SELECTOR Extra elements to black out in screenshots (repeatable)
112
162
  --repo PATH Map findings to likely source files in this repository (and read its brand/search context)
113
163
  --brand SLUG Markilo brand to check design consistency against (default: master brand)
114
164
  --ignore-robots Ignore robots.txt (only for sites you own or are authorized to test)
115
165
  --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
166
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
167
+ JOURILO_DENY_LOCAL=1 does the same. Not available with --browser webkit (exit 3). For hosted integrations; a directory target is still served
116
168
  --no-forms Skip the form validation probe
117
169
  (by default, on local hosts, an empty submission is simulated: nothing that sends data
118
170
  leaves the browser, so no database is written; server-side feedback is reported as untested)
119
171
  --allow-submit Really send empty submissions to test server-side validation, on local or other hosts
120
- (disposable/test environments you are authorized to use only; never to delete/payment URLs)
172
+ (disposable/test environments you are authorized to use only; never to delete/payment URLs);
173
+ also lets a --setup-journey submit forms
121
174
  --sarif Also write report.sarif for code scanning
122
175
  --fail-on SEVERITY Exit 1 if a defect at or above this severity exists (CI gate)
176
+ --evidence MODE full (default) or minimal: keep first screens and only the full-page screenshots findings need; JPEG quality 55
177
+ --run-id ID Use this run id instead of a generated one (1-64 of A-Z a-z 0-9 _ -); refused (exit 2) if its
178
+ directory exists, even without a run.json (left by a crashed run)
179
+ --max-duration SECS Stop after this many seconds (1 to 86400) and write a partial run (exit 6), as SIGINT/SIGTERM do;
180
+ the page in progress gets up to 3 s to finish, then it is left out; a second signal quits at
181
+ once (exit 130) after one line on stderr (STOPPED_TWICE with --json)
123
182
  ```
124
183
 
125
184
  ## Journeys
@@ -139,7 +198,19 @@ Subcommands:
139
198
  validate [files] Check journey files against the schema
140
199
  run [ids|files] Run journeys against --base <url|dir>
141
200
 
201
+ Suggest options:
202
+ --pages N Pages to read when deriving journeys from a site (default 8)
203
+ --force Overwrite journey files that already exist (by default existing files are kept)
204
+ --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
205
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
206
+ JOURILO_DENY_LOCAL=1 does the same
207
+
142
208
  Run options:
209
+ --base URL|DIR The site or static build to run against (required)
210
+ --browser NAME chromium (default), firefox, webkit, chrome, msedge
211
+ --headed Show the browser window instead of running headless
212
+ --timeout SECS Per-step timeout in seconds (default 10)
213
+ --repo PATH Map failed steps to likely source files in this repository (a directory --base implies it)
143
214
  --viewport LIST desktop, mobile, … (default: the journey's own viewport or desktop)
144
215
  --var key=value Test data for {{key}} placeholders (also JOURILO_VAR_KEY env vars)
145
216
  --allow-submit Allow form submission on non-local hosts (authorized test environments only)
@@ -148,7 +219,13 @@ Run options:
148
219
  --trace Record a Playwright trace per journey (contains typed values; keep private)
149
220
  --auth FILE Playwright storage state for signed-in journeys
150
221
  --save-auth FILE After a passing sign-in journey (exactly one), save its session for --auth (test accounts only)
222
+ --timezone ZONE IANA time zone for the page (e.g. Europe/Istanbul)
223
+ --clock ISO Freeze the page's Date at this date-time (e.g. 2026-11-03T22:30:00+03:00); timers keep running
224
+ --evidence MODE full (default) or minimal: keep only the screenshots of the failed step, the step before it and the last step
151
225
  --repeat N Run each journey N times (max 10); mixed outcomes are reported as flaky
226
+ --allow-private Allow private-network hosts (10.x, 192.168.x, ...)
227
+ --deny-local Refuse local targets (localhost, 127.0.0.1, [::1], *.localhost, *.test) (exit 3); a redirect or request to one is blocked by the network guard and listed in the limitations;
228
+ JOURILO_DENY_LOCAL=1 does the same. Not available with --browser webkit (exit 3)
152
229
  --fail-on-failure Exit 1 when a journey fails
153
230
 
154
231
  Safety: payment, purchase, delete and cancel actions are never performed on non-local hosts; form submission
@@ -191,6 +268,11 @@ jourilo optimize [run=latest] --repo <path> [--rule id ...] [--apply]
191
268
  Deterministic fixers (others are reported with source candidates for a person or agent to fix):
192
269
  axe/html-has-lang, jourilo/missing-viewport-meta, jourilo/input-purpose, jourilo/focus-visible, jourilo/paste-blocked,
193
270
  jourilo/unsized-images, jourilo/placeholder-label
271
+ Options:
272
+ --repo PATH Repository to fix (default: the run's repo, else the current directory)
273
+ --rule ID Only fix findings of this rule (repeatable)
274
+ --finding ID Only fix this finding, by fingerprint (repeatable)
275
+ --apply Write the changes
194
276
  Without --apply nothing is written. With --apply, all files are written as one change: each file must be unchanged
195
277
  since the plan, writes are atomic, an interrupted apply is undone, and `jourilo rollback <id>` restores the files
196
278
  (git is not required).
@@ -205,6 +287,15 @@ Repeat a run with the same scope (pages, viewports) after a change and compare:
205
287
  jourilo verify <baseline-run> [--target url|dir] [--fail-on-regression]
206
288
  ```
207
289
 
290
+ ```
291
+ Options:
292
+ --target URL|DIR Where to repeat the audit (default: the baseline run's target)
293
+ --repo PATH Repository for source mapping (default: the baseline run's repo)
294
+ --deny-local Refuse a local target (localhost, 127.0.0.1, [::1], *.localhost, *.test) with exit 3; a redirect to one is blocked by the network guard and listed in the limitations;
295
+ JOURILO_DENY_LOCAL=1 does the same. Not available with --browser webkit (exit 3)
296
+ --fail-on-regression Exit 1 when new serious or critical defects appear
297
+ ```
298
+
208
299
  ### `jourilo checkpoint`
209
300
 
210
301
  Record a git checkpoint of the working tree (no commits, branches or stash entries are created).
@@ -240,6 +331,13 @@ Re-render the report for a run (html, markdown, sarif or json) — default: late
240
331
  jourilo report [run-id|latest|path] [--format html|md|sarif|json] [--baseline run-id]
241
332
  ```
242
333
 
334
+ ```
335
+ Options:
336
+ --format FMT html (default), md, sarif or json; sarif and json print to stdout
337
+ --baseline RUN Include a comparison with this earlier run
338
+ --stdout With --format md, print the Markdown instead of only writing the file
339
+ ```
340
+
243
341
  ### `jourilo compare`
244
342
 
245
343
  Compare two runs (before/after): fixed, new and persisting findings plus lab metric deltas.
@@ -261,7 +359,37 @@ jourilo runs
261
359
  Add a judgment (AI inference or user input) to a run, tied to evidence in that run; never mixed with measurements.
262
360
 
263
361
  ```
264
- jourilo finding add --run <id> --title … --category usability --description … --evidence screenshots/x.jpg [--by agent|user]
362
+ jourilo finding add --run <id> --title … --category usability --description … --evidence screenshots/x.jpg [--by agent|user] | finding dismiss <id> --run <run> --reason "<text>" [--by user|agent] | finding undismiss <id> [--run <run>]
363
+ ```
364
+
365
+ ```
366
+ Subcommands:
367
+ add Record a judgment tied to evidence in a run
368
+ dismiss <id> Mark a finding as not a problem; it is kept out of later runs and listed as dismissed
369
+ undismiss <id> Remove a dismissal; the next run reports the finding again
370
+
371
+ add options:
372
+ --run ID Run to add to (default latest)
373
+ --title TEXT Short title (required)
374
+ --category NAME accessibility, usability, responsive, performance, conversion, reliability, content or design-system (required)
375
+ --description TEXT What is wrong and why it matters (required)
376
+ --evidence FILE Screenshot or file inside the run, e.g. screenshots/home-desktop.jpg (required, repeatable)
377
+ --kind KIND defect, hypothesis or needs-review (default: hypothesis for conversion, else needs-review)
378
+ --severity LEVEL critical, serious, moderate, minor or info (default minor)
379
+ --confidence LEVEL low, medium or high (AI judgments are capped at medium)
380
+ --impact TEXT Who is affected and how
381
+ --recommendation TEXT What to change
382
+ --url URL Page the finding is about (default: the run's first page)
383
+ --viewport NAME Viewport the finding was seen in (e.g. desktop, mobile)
384
+ --by WHO agent (default) or user
385
+
386
+ dismiss options:
387
+ --run ID Run to apply it to now (default latest)
388
+ --reason TEXT Why this is not a problem (required)
389
+ --by WHO user (default) or agent
390
+
391
+ undismiss options:
392
+ --run ID Also bring the finding back into this run
265
393
  ```
266
394
 
267
395
  ## System