my-frontend-observer 0.2.0 → 0.4.0
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/CHANGELOG.md +102 -0
- package/README.md +51 -13
- package/dist/application/comparisonService.d.ts +56 -0
- package/dist/application/comparisonService.js +77 -0
- package/dist/application/comparisonService.js.map +1 -0
- package/dist/application/observationPersistence.js +1 -0
- package/dist/application/observationPersistence.js.map +1 -1
- package/dist/artifacts/artifactReader.d.ts +19 -0
- package/dist/artifacts/artifactReader.js +36 -0
- package/dist/artifacts/artifactReader.js.map +1 -0
- package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/browser/chromiumAdapter.js +58 -4
- package/dist/browser/chromiumAdapter.js.map +1 -1
- package/dist/browser/evidenceCapture.d.ts +29 -2
- package/dist/browser/evidenceCapture.js +43 -19
- package/dist/browser/evidenceCapture.js.map +1 -1
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +3 -1
- package/dist/cli.js +299 -2
- package/dist/cli.js.map +1 -1
- package/dist/domain/comparison.d.ts +198 -0
- package/dist/domain/comparison.js +324 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +48 -0
- package/dist/domain/comparisonEngine.js +694 -0
- package/dist/domain/comparisonEngine.js.map +1 -0
- package/dist/domain/comparisonIdentity.d.ts +13 -0
- package/dist/domain/comparisonIdentity.js +46 -0
- package/dist/domain/comparisonIdentity.js.map +1 -0
- package/dist/domain/evidence.d.ts +2 -0
- package/dist/domain/evidence.js +4 -0
- package/dist/domain/evidence.js.map +1 -1
- package/dist/domain/identity.d.ts +8 -3
- package/dist/domain/identity.js +9 -3
- package/dist/domain/identity.js.map +1 -1
- package/dist/domain/relationships.d.ts +168 -0
- package/dist/domain/relationships.js +343 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +116 -2
- package/dist/domain/schema.js +186 -2
- package/dist/domain/schema.js.map +1 -1
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +17 -4
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/request/request.d.ts +29 -0
- package/dist/request/request.js +108 -0
- package/dist/request/request.js.map +1 -1
- package/docs/ARCHITECTURE.md +110 -4
- package/docs/CI_CD.md +62 -6
- package/docs/COMMANDS.md +247 -6
- package/docs/CONTRACTS.md +172 -7
- package/docs/CURRENT_STATE.md +148 -10
- package/docs/DEVELOPMENT.md +52 -12
- package/docs/PROJECT_OVERVIEW.md +18 -11
- package/docs/QUICKSTART.md +7 -1
- package/docs/RELEASE.md +14 -7
- package/docs/ROADMAP.md +9 -0
- package/docs/SECURITY.md +14 -1
- package/docs/WORKFLOWS.md +90 -22
- package/package.json +1 -1
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -21,9 +21,9 @@ npm run check:docs
|
|
|
21
21
|
npm pack --dry-run
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
`npm test` runs the fast unit suite only (`tests/unit/`, currently
|
|
24
|
+
`npm test` runs the fast unit suite only (`tests/unit/`, currently 176
|
|
25
25
|
passing tests). `npm run test:browser` runs the real-Chromium integration
|
|
26
|
-
suite (`tests/browser/`, currently
|
|
26
|
+
suite (`tests/browser/`, currently 88 passing tests) against deterministic
|
|
27
27
|
local fixtures under `tests/fixtures/` and requires the Chromium binary
|
|
28
28
|
above to be installed first; it is kept out of `npm test` because it
|
|
29
29
|
launches a real browser and is slower.
|
|
@@ -62,25 +62,65 @@ It is what `.github/workflows/pre-release-readiness.yml` runs identically on
|
|
|
62
62
|
Windows, Linux, and macOS against one shared candidate tarball (see
|
|
63
63
|
`docs/CI_CD.md`); it can also be run locally the same way the workflow runs
|
|
64
64
|
it. It is readiness/CI infrastructure only, not part of the published
|
|
65
|
-
package and never imported by production code.
|
|
66
|
-
legacy CSS-shorthand `--target` packed-observation shape
|
|
67
|
-
structured semantic `--targets-file` shape
|
|
68
|
-
`
|
|
65
|
+
package and never imported by production code. In the same run it
|
|
66
|
+
exercises the legacy CSS-shorthand `--target` packed-observation shape,
|
|
67
|
+
the structured semantic `--targets-file` shape, a `window-scroll-by`
|
|
68
|
+
scroll scenario, and a `target-scroll-by` scroll scenario - see
|
|
69
|
+
`docs/CI_CD.md` for the current readiness coverage.
|
|
69
70
|
|
|
70
71
|
`scripts/dev/builtCliTargetsFileSmoke.mjs` is a separate, narrower v0.2
|
|
71
72
|
development smoke, added alongside the `--targets-file` implementation: it
|
|
72
73
|
runs the built `dist/cli.js` directly (`node dist/cli.js observe
|
|
73
74
|
--targets-file ...`) against an inline disposable local HTTP fixture and a
|
|
74
75
|
temporary JSON target file, proving a real semantic observation persists a
|
|
75
|
-
valid schema-`1.
|
|
76
|
+
valid schema-`1.2.0` artifact with no packed-tarball step involved. Run it
|
|
76
77
|
locally after `npm run build`:
|
|
77
78
|
|
|
78
79
|
```powershell
|
|
79
80
|
node scripts/dev/builtCliTargetsFileSmoke.mjs
|
|
80
81
|
```
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
`scripts/dev/builtCliScrollScenarioSmoke.mjs` is the v0.3 equivalent, added
|
|
84
|
+
alongside the `--scroll-scenario-file` implementation: it runs the built
|
|
85
|
+
`dist/cli.js` directly against an inline disposable local HTTP fixture,
|
|
86
|
+
once with a temporary `window-scroll-by` scenario file and once with a
|
|
87
|
+
temporary structured `--targets-file` plus a `target-scroll-by` scenario
|
|
88
|
+
file, proving both real runtime scroll actions persist a valid
|
|
89
|
+
schema-`1.2.0` artifact with populated `scrollScenarioEvidence`,
|
|
90
|
+
scenario-file path privacy, and target-application immutability. Run it
|
|
91
|
+
locally after `npm run build`:
|
|
92
|
+
|
|
93
|
+
```powershell
|
|
94
|
+
node scripts/dev/builtCliScrollScenarioSmoke.mjs
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`scripts/dev/builtCliCompareSmoke.mjs` is the v0.4 equivalent, added
|
|
98
|
+
alongside the `compare` command implementation (shipped as part of the
|
|
99
|
+
published `0.4.0` package - see `docs/CURRENT_STATE.md`): it runs the built
|
|
100
|
+
`dist/cli.js` twice as
|
|
101
|
+
`observe` against an inline disposable local HTTP fixture whose served
|
|
102
|
+
content changes deterministically between the two runs (a real moved/
|
|
103
|
+
resized target, and a page-width transition from fitting to exceeding the
|
|
104
|
+
viewport), then runs the built `dist/cli.js compare` against the two
|
|
105
|
+
resulting persisted observation artifacts. It validates artifact kind/
|
|
106
|
+
schema `1.0.0`, `comparability: "comparable"`, source observation
|
|
107
|
+
references, at least one real `moved` difference and one real page-width
|
|
108
|
+
relationship change, that the comparison directory contains `manifest.json`
|
|
109
|
+
only, that no operational filesystem path leaked into the persisted
|
|
110
|
+
manifest, and that both source observation manifests are byte-identical
|
|
111
|
+
before and after the comparison ran. Run it locally after `npm run build`:
|
|
112
|
+
|
|
113
|
+
```powershell
|
|
114
|
+
node scripts/dev/builtCliCompareSmoke.mjs
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Unlike `scripts/ci/runPackedObservationSmoke.mjs`, none of these three dev
|
|
118
|
+
smokes is wired into any CI workflow or is a release gate - they are
|
|
119
|
+
source-checkout development evidence only, proving the built CLI's
|
|
120
|
+
`--targets-file`/`--scroll-scenario-file`/`compare` behavior without
|
|
121
|
+
installing a packed tarball or requiring cross-platform infrastructure.
|
|
122
|
+
None is part of the published package. Cross-platform packed validation of
|
|
123
|
+
both the v0.1-v0.3 observation behavior and the v0.4 `compare` command is
|
|
124
|
+
`scripts/ci/runPackedObservationSmoke.mjs`'s responsibility (see
|
|
125
|
+
`docs/CI_CD.md`) - the same script, against the same single candidate
|
|
126
|
+
tarball per platform.
|
package/docs/PROJECT_OVERVIEW.md
CHANGED
|
@@ -15,15 +15,22 @@ The responsibility split is stable:
|
|
|
15
15
|
|
|
16
16
|
## Current repository state
|
|
17
17
|
|
|
18
|
-
v0.1, Runtime Observation Foundation
|
|
19
|
-
Region Identity,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
`
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
v0.1, Runtime Observation Foundation; v0.2, Stable Semantic Targets and
|
|
19
|
+
Region Identity; v0.3, Runtime Scrolling, Overflow, and Visibility Behavior;
|
|
20
|
+
and v0.4, Layout Relationships, Dependency Evidence, and Before/After
|
|
21
|
+
Comparison, are released, published to npm (current version `0.4.0`,
|
|
22
|
+
observation schema `1.2.0`, comparison schema `1.0.0`) and validated as a
|
|
23
|
+
packed npm tarball in a clean consumer environment across Windows, Linux,
|
|
24
|
+
and macOS: a real `observe` CLI command launches Chromium, enforces
|
|
25
|
+
loopback-only safety, captures bounded page/target evidence via legacy
|
|
26
|
+
CSS-shorthand targets, structured semantic `--targets-file` targets, or a
|
|
27
|
+
bounded `--scroll-scenario-file` runtime scroll scenario
|
|
28
|
+
(`window-scroll-by` or `target-scroll-by`), and persists one portable local
|
|
29
|
+
artifact; a real `compare` CLI command reads two already-persisted
|
|
30
|
+
observation artifacts and derives before/after layout-relationship and
|
|
31
|
+
difference evidence without launching a browser - see
|
|
32
|
+
`docs/CURRENT_STATE.md` for the implementation summary. v0.5–v0.10 remain
|
|
33
|
+
future and unimplemented.
|
|
27
34
|
|
|
28
35
|
The revised dependency path reaches practical coding-agent use before graphical
|
|
29
36
|
interaction:
|
|
@@ -49,8 +56,8 @@ Repository-local authorities and navigation:
|
|
|
49
56
|
capability plan and cross-milestone rules.
|
|
50
57
|
- [ROADMAP.md](ROADMAP.md) owns version-level direction without prewritten
|
|
51
58
|
implementation batches.
|
|
52
|
-
- [CURRENT_STATE.md](CURRENT_STATE.md) records
|
|
53
|
-
state.
|
|
59
|
+
- [CURRENT_STATE.md](CURRENT_STATE.md) records current implementation and
|
|
60
|
+
release state.
|
|
54
61
|
|
|
55
62
|
Historical greenfield artifacts and reports are retained as evidence that an
|
|
56
63
|
earlier run overreached into v0.1; they are not current-state authority.
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -22,7 +22,13 @@ node dist/cli.js observe `
|
|
|
22
22
|
This launches Chromium, captures a screenshot plus bounded page/target
|
|
23
23
|
evidence, and writes one portable artifact under `observations/<observation-id>/`.
|
|
24
24
|
See [COMMANDS.md](COMMANDS.md) for the full flag reference, including the
|
|
25
|
-
`--targets-file` structured semantic-target input
|
|
25
|
+
`--targets-file` structured semantic-target input and the
|
|
26
|
+
`--scroll-scenario-file` bounded runtime scroll scenario input.
|
|
27
|
+
|
|
28
|
+
Once you have two such artifacts, `node dist/cli.js compare --before
|
|
29
|
+
<root> --after <root> --output comparisons` derives before/after evidence
|
|
30
|
+
between them without launching a browser again - see
|
|
31
|
+
[COMMANDS.md](COMMANDS.md#compare) for details.
|
|
26
32
|
|
|
27
33
|
To validate the repository itself instead:
|
|
28
34
|
|
package/docs/RELEASE.md
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
# Release
|
|
2
2
|
|
|
3
|
-
`v0.
|
|
3
|
+
`v0.4.0` is published to npm as `my-frontend-observer`, validated on
|
|
4
4
|
Windows, Linux, and macOS as an installed packed-tarball consumer prior to
|
|
5
|
-
publication (covering
|
|
6
|
-
structured semantic `--targets-file` path
|
|
7
|
-
|
|
5
|
+
publication (covering the legacy CSS-shorthand `--target` path, the
|
|
6
|
+
structured semantic `--targets-file` path, the bounded
|
|
7
|
+
`--scroll-scenario-file` `window-scroll-by`/`target-scroll-by` runtime
|
|
8
|
+
scroll scenario path, and the installed `compare` command's comparable and
|
|
9
|
+
incomparable cases). No project license has been declared yet; that
|
|
10
|
+
decision remains open for a later explicit task.
|
|
8
11
|
|
|
9
|
-
Observation
|
|
10
|
-
version is `0.
|
|
11
|
-
automatically with the package version.
|
|
12
|
+
Observation, comparison, and package version remain separate: package
|
|
13
|
+
version is `0.4.0`; observation schema is `1.2.0` and comparison schema is
|
|
14
|
+
`1.0.0`, neither of which changes automatically with the package version.
|
|
15
|
+
|
|
16
|
+
Prior releases: `v0.3.0` (Runtime Scrolling, Overflow, and Visibility
|
|
17
|
+
Behavior), `v0.2.0` (Stable Semantic Targets and Region Identity), `v0.1.0`
|
|
18
|
+
(Runtime Observation Foundation) - see `CHANGELOG.md`.
|
package/docs/ROADMAP.md
CHANGED
|
@@ -60,6 +60,11 @@ identity persistence rules from current evidence.
|
|
|
60
60
|
|
|
61
61
|
## v0.3 — Runtime Scrolling, Overflow, and Visibility Behavior
|
|
62
62
|
|
|
63
|
+
Current status: released as `0.3.0`, published to npm and validated as a
|
|
64
|
+
packed npm tarball in a clean consumer environment on Windows, Linux, and
|
|
65
|
+
macOS (observation schema `1.2.0`). See `docs/CURRENT_STATE.md` for the
|
|
66
|
+
implementation summary.
|
|
67
|
+
|
|
63
68
|
Objective/problem: show which container actually scrolls and what becomes
|
|
64
69
|
visible, clipped, or overflowing after controlled actions. Required capabilities
|
|
65
70
|
are bounded action scenarios, before/after window and target scroll positions,
|
|
@@ -72,6 +77,10 @@ syntax, stabilization, and visibility thresholds.
|
|
|
72
77
|
|
|
73
78
|
## v0.4 — Layout Relationships, Dependency Evidence, and Before/After Comparison
|
|
74
79
|
|
|
80
|
+
Current status: released as `0.4.0`, published to npm and validated as a
|
|
81
|
+
packed npm tarball in a clean consumer environment on Windows, Linux, and
|
|
82
|
+
macOS. See `docs/CURRENT_STATE.md` for the implementation summary.
|
|
83
|
+
|
|
75
84
|
Objective/problem: explain whole-layout consequences rather than isolated
|
|
76
85
|
numbers. Required capabilities are containment/order/overlap/fit relationships,
|
|
77
86
|
comparable observation identity, before/after differences, appearance and
|
package/docs/SECURITY.md
CHANGED
|
@@ -24,12 +24,25 @@ tests:
|
|
|
24
24
|
unexpected internal error);
|
|
25
25
|
- the observed target's own content/source is never modified by observation.
|
|
26
26
|
|
|
27
|
+
## Comparison (`compare`, shipped as part of the published `0.4.0` package)
|
|
28
|
+
|
|
29
|
+
`my-frontend-observer compare` introduces no new network or browser
|
|
30
|
+
surface: it never
|
|
31
|
+
launches Chromium, never navigates, and never re-observes a target - it only
|
|
32
|
+
reads two local, already-persisted observation-artifact `manifest.json`
|
|
33
|
+
files (`src/artifacts/artifactReader.ts`) through the same structural
|
|
34
|
+
validator the observation writer uses, computes a pure in-memory
|
|
35
|
+
comparison, and writes one local comparison `manifest.json`
|
|
36
|
+
(`src/artifacts/comparisonArtifactWriter.ts`). Manifest content is parsed
|
|
37
|
+
as JSON only and is never executed (no `eval`, no dynamic code loading from
|
|
38
|
+
a manifest).
|
|
39
|
+
|
|
27
40
|
## Not yet addressed
|
|
28
41
|
|
|
29
42
|
Certificate-failure-specific handling, permission-prompt-specific handling
|
|
30
43
|
(Chromium's default deny-all applies; no permission is ever explicitly
|
|
31
44
|
granted), and any non-loopback/remote browsing mode remain unimplemented and
|
|
32
|
-
out of scope. `my-frontend-observer@0.
|
|
45
|
+
out of scope. `my-frontend-observer@0.4.0` is published to npm, and a
|
|
33
46
|
pre-release readiness CI workflow (Windows/Linux/macOS packed-candidate
|
|
34
47
|
validation) already exists (see `docs/CI_CD.md`); these are no longer future
|
|
35
48
|
decisions. Those facts do not expand the security scope above: remote
|
package/docs/WORKFLOWS.md
CHANGED
|
@@ -11,44 +11,111 @@ install dependencies (npm install; npx playwright install chromium)
|
|
|
11
11
|
→ validate documentation (npm run check:docs)
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
## Current observation workflow (published as 0.
|
|
14
|
+
## Current observation workflow (published as 0.4.0)
|
|
15
15
|
|
|
16
|
-
The real `observe` workflow, part of the published `my-frontend-observer@0.
|
|
17
|
-
package, accepts target configuration through either of two input paths
|
|
16
|
+
The real `observe` workflow, part of the published `my-frontend-observer@0.4.0`
|
|
17
|
+
package, accepts target configuration through either of two input paths,
|
|
18
|
+
plus one optional runtime scroll scenario:
|
|
18
19
|
|
|
19
20
|
```text
|
|
20
|
-
CLI arguments (--url, --viewport, --output, --timeout,
|
|
21
|
+
CLI arguments (--url, --viewport, --output, --timeout, exactly one of:
|
|
21
22
|
one-or-more --target <id=css-selector>
|
|
22
|
-
or --targets-file <json-file
|
|
23
|
+
or --targets-file <json-file>,
|
|
24
|
+
plus optionally --scroll-scenario-file <json-file>)
|
|
23
25
|
→ (--targets-file only: read + validate the local JSON root wrapper)
|
|
26
|
+
→ (--scroll-scenario-file only: read + validate the local JSON root shape -
|
|
27
|
+
a non-array object; the file supplies RawObservationRequest.scrollScenario
|
|
28
|
+
directly, with no wrapper field)
|
|
24
29
|
→ request construction (same RawObservationRequest either way)
|
|
25
|
-
→ normalizeRequest() - producing canonical {name, locators} targets
|
|
30
|
+
→ normalizeRequest() - producing canonical {name, locators} targets and
|
|
31
|
+
validating the optional scrollScenario (supported action kind, delta
|
|
32
|
+
bounds/both-zero rule, stable target-name reference)
|
|
26
33
|
→ application observation use case (src/application/observationPersistence.ts#observe)
|
|
27
|
-
→ Chromium capture
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
→ Chromium capture: launch, safe navigation, readiness, then - only if a
|
|
35
|
+
scenario was configured - resolve configured targets once, capture an
|
|
36
|
+
initial ScrollRuntimeSnapshot, perform the one immediate scroll
|
|
37
|
+
(window.scrollBy/element.scrollBy, behavior: "instant"), wait exactly two
|
|
38
|
+
requestAnimationFrame cycles, capture a final ScrollRuntimeSnapshot and
|
|
39
|
+
derive transition/scroll-owner evidence; then screenshot and page/target
|
|
40
|
+
evidence (resolving all six locator kinds through the single canonical
|
|
41
|
+
resolver, plus semantic state/landmark/containment evidence), from the
|
|
42
|
+
same live page - exactly once, always describing the final state
|
|
31
43
|
→ atomic artifact persistence (manifest.json + screenshot.png), schema
|
|
32
|
-
1.
|
|
44
|
+
1.2.0 - exactly once, only on a successful capture; scrollScenarioEvidence
|
|
45
|
+
is simply one more optional manifest field, never a separate file
|
|
33
46
|
→ concise CLI result (Observation/State/Artifact/Targets/Diagnostics)
|
|
34
47
|
→ process exit status (0 for a persisted observation, including one whose
|
|
35
48
|
state honestly reports "partial"; nonzero otherwise)
|
|
36
49
|
```
|
|
37
50
|
|
|
51
|
+
A request with no scroll scenario is unaffected: no extra snapshots, no
|
|
52
|
+
scroll, no extra animation-frame wait, unchanged request identity.
|
|
53
|
+
|
|
38
54
|
This is exercised by `runCli()`-level tests, real-Chromium end-to-end tests
|
|
39
|
-
(`tests/browser/cliObserve.test.ts`
|
|
40
|
-
`node dist/cli.js
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
55
|
+
(`tests/browser/cliObserve.test.ts`, `tests/browser/windowScrollScenario.test.ts`,
|
|
56
|
+
`tests/browser/targetScrollScenario.test.ts`), built `node dist/cli.js
|
|
57
|
+
observe ...` runs against the deterministic local fixture
|
|
58
|
+
(`scripts/dev/builtCliTargetsFileSmoke.mjs` for the semantic `--targets-file`
|
|
59
|
+
path, `scripts/dev/builtCliScrollScenarioSmoke.mjs` for the scroll-scenario
|
|
60
|
+
path), and the real `npm pack` tarball installed and run from a clean
|
|
61
|
+
temporary consumer directory outside the repository, on Windows, Linux, and
|
|
62
|
+
macOS (`scripts/ci/runPackedObservationSmoke.mjs`) - the same workflow,
|
|
63
|
+
independent of the source checkout.
|
|
64
|
+
|
|
65
|
+
## Current comparison workflow (published as 0.4.0)
|
|
66
|
+
|
|
67
|
+
**Current status: shipped as part of the published `my-frontend-observer@0.4.0`
|
|
68
|
+
package.** This is a separate workflow from the observation workflow above -
|
|
69
|
+
it consumes two already-persisted observation artifacts rather than
|
|
70
|
+
producing one, and it never launches a browser:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
two prior real "observe" invocations, each producing its own persisted
|
|
74
|
+
ObservationArtifact (before, after) - unrelated to this workflow itself
|
|
75
|
+
→ CLI arguments (--before <root>, --after <root>, --output <directory>,
|
|
76
|
+
optionally --config-file <json-file>)
|
|
77
|
+
→ (--config-file only: read + validate the local JSON root shape - a
|
|
78
|
+
non-array object; the file supplies ComparisonConfig directly, with no
|
|
79
|
+
wrapper field)
|
|
80
|
+
→ read + validate both observation artifacts (src/artifacts/artifactReader.ts,
|
|
81
|
+
the same isValidObservationArtifact structural gate the writer uses)
|
|
82
|
+
→ application comparison use case
|
|
83
|
+
(src/application/comparisonService.ts#compareAndPersistFromArtifactRoots
|
|
84
|
+
→ compareAndPersist)
|
|
85
|
+
→ pure comparison derivation (src/domain/comparisonEngine.ts#compareObservations):
|
|
86
|
+
comparability first, then - only if comparable/comparable-with-warnings -
|
|
87
|
+
deriveLayoutRelationships for each side plus target/page differences,
|
|
88
|
+
relationship changes, and explicit non-causal dependency evidence
|
|
89
|
+
→ atomic comparison-artifact persistence (manifest.json only, no copied
|
|
90
|
+
screenshots), schema 1.0.0 - exactly once, for every comparability
|
|
91
|
+
outcome including "incomparable"
|
|
92
|
+
→ concise CLI result (Comparison/State/Artifact/Differences/Relationship
|
|
93
|
+
changes/Diagnostics)
|
|
94
|
+
→ process exit status (0 for any successfully computed and persisted
|
|
95
|
+
comparison, including "incomparable"; nonzero only for invalid
|
|
96
|
+
syntax/unreadable or invalid source artifacts/invalid configuration/a
|
|
97
|
+
failed write)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Source observations are never modified by this workflow. Operational paths
|
|
101
|
+
(`--before`/`--after`/`--config-file`/`--output`) never affect
|
|
102
|
+
`comparisonRequestId` and are never written into the persisted manifest.
|
|
103
|
+
|
|
104
|
+
This is exercised by `runCli()`-level tests
|
|
105
|
+
(`tests/unit/cli.test.ts`, `tests/unit/cliCompareOrchestration.test.ts`,
|
|
106
|
+
`tests/unit/cliCompareEndToEnd.test.ts`), a real-Chromium end-to-end test
|
|
107
|
+
(`tests/browser/cliCompare.test.ts`), built `node dist/cli.js compare ...`
|
|
108
|
+
runs against real persisted observations from the deterministic local
|
|
109
|
+
fixture (`scripts/dev/builtCliCompareSmoke.mjs`), and packed-tarball
|
|
110
|
+
validation of the installed `compare` command
|
|
111
|
+
(`scripts/ci/runPackedObservationSmoke.mjs` - see `docs/CI_CD.md`).
|
|
46
112
|
|
|
47
|
-
|
|
113
|
+
## Future workflows
|
|
48
114
|
|
|
49
115
|
```text
|
|
50
116
|
stable targets and bounded runtime behavior
|
|
51
|
-
→ relationships
|
|
117
|
+
→ relationships and before/after comparison (released - see above)
|
|
118
|
+
→ safe-change contracts
|
|
52
119
|
→ bounded agent context plus runtime/static ecosystem integration
|
|
53
120
|
→ text/config-driven coding-agent change review
|
|
54
121
|
→ interactive viewer
|
|
@@ -56,5 +123,6 @@ stable targets and bounded runtime behavior
|
|
|
56
123
|
→ full visual human–LLM workflow
|
|
57
124
|
```
|
|
58
125
|
|
|
59
|
-
|
|
60
|
-
must work without the v0.8 viewer or v0.9
|
|
126
|
+
Safe-change contracts (v0.5+) and everything after remain unimplemented. The
|
|
127
|
+
v0.7 coding-agent workflow must work without the v0.8 viewer or v0.9
|
|
128
|
+
annotation system.
|