kaloko 0.5.0 → 0.5.2
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/README.md +28 -0
- package/package.json +1 -1
- package/schemas/config.v1.json +46 -0
- package/schemas/run.v1.json +8 -0
- package/schemas/scenario.v1.json +8 -0
- package/skills/kaloko/SKILL.md +20 -4
- package/skills/kaloko/reference/acceptance.md +4 -2
- package/skills/kaloko/reference/collaboration.md +35 -6
- package/skills/kaloko/reference/docs.md +127 -0
- package/skills/kaloko/reference/execution.md +9 -0
- package/skills/kaloko/reference/mcp.md +8 -2
- package/src/cli.mjs +136 -7
- package/src/lib/changelog-core.mjs +323 -0
- package/src/lib/changelog.mjs +333 -0
- package/src/lib/doctor.mjs +6 -1
- package/src/lib/run.mjs +2 -2
- package/src/lib/signoff-core.mjs +138 -0
- package/src/lib/signoff.mjs +83 -0
- package/src/lib/stability.mjs +82 -0
- package/viewer/index.html +458 -30
package/README.md
CHANGED
|
@@ -210,6 +210,34 @@ link) and reads names from the accessibility tree. Pixel diffs skip the
|
|
|
210
210
|
regions a step ignores; `kaloko walk --stability 3` and `kaloko stability`
|
|
211
211
|
find the clocks, ads and carousels worth ignoring.
|
|
212
212
|
|
|
213
|
+
## A changelog with pictures
|
|
214
|
+
|
|
215
|
+
Your accepted runs already hold every screen of the release. `CHANGELOG.md`
|
|
216
|
+
can show them: a picture names a step instead of a file, and Kaloko shows the
|
|
217
|
+
accepted capture of it.
|
|
218
|
+
|
|
219
|
+
```markdown
|
|
220
|
+
- You can pay with Apple Pay in the checkout.
|
|
221
|
+
 
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npx kaloko changelog draft # the Unreleased entry: merged PRs and changed screens, before and after
|
|
226
|
+
npx kaloko changelog draft --apply # the same, written into CHANGELOG.md (Keep a Changelog)
|
|
227
|
+
npx kaloko release 2.4.0 # record the release and its pictures; prints the changelog page
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
The draft groups pull requests and commits (Conventional Commits when you
|
|
231
|
+
use them) into Added, Changed, Fixed and Removed; your agent rewrites the
|
|
232
|
+
lines for people. The version comes from what the repository already uses
|
|
233
|
+
(git tags, `package.json`, release-please, changesets, semantic-release);
|
|
234
|
+
when a release tool owns `CHANGELOG.md`, Kaloko only reads it. The page on
|
|
235
|
+
kaloko.app has a slider between before and after, switches language and
|
|
236
|
+
screen size, and links each picture to its flow on the canvas. Share it with
|
|
237
|
+
guests, readers from your company's domain, or publish it with a feed.
|
|
238
|
+
Repositories with several apps list them under `products:` in
|
|
239
|
+
`kaloko.config.yml`.
|
|
240
|
+
|
|
213
241
|
## Design (Kaloko Design)
|
|
214
242
|
|
|
215
243
|
Design the screens of a flow as live HTML with your own agent and skills, in the same scenario that development
|
package/package.json
CHANGED
package/schemas/config.v1.json
CHANGED
|
@@ -9,6 +9,13 @@
|
|
|
9
9
|
"schema": { "const": "qawalk.config.v1" },
|
|
10
10
|
"org": { "type": "string", "description": "Organization slug on kaloko.app." },
|
|
11
11
|
"project": { "type": "string" },
|
|
12
|
+
"products": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"description": "Optional: what is released and versioned as a whole and has its own visual changelog (docs/DOCS-CHANGELOG.md). Without it the project is the product. Keys are product slugs.",
|
|
15
|
+
"propertyNames": { "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$" },
|
|
16
|
+
"additionalProperties": { "$ref": "#/$defs/product" }
|
|
17
|
+
},
|
|
18
|
+
"docs": { "$ref": "#/$defs/docs" },
|
|
12
19
|
"scenarios": { "type": "array", "items": { "type": "string" }, "description": "Glob patterns of scenario files." },
|
|
13
20
|
"output": { "type": "string", "description": "Run folder; default tmp/kaloko (tmp/qawalk when only that one exists)" },
|
|
14
21
|
"browser": {
|
|
@@ -106,6 +113,45 @@
|
|
|
106
113
|
}
|
|
107
114
|
},
|
|
108
115
|
"$defs": {
|
|
116
|
+
"product": {
|
|
117
|
+
"type": "object",
|
|
118
|
+
"additionalProperties": false,
|
|
119
|
+
"properties": {
|
|
120
|
+
"name": { "oneOf": [{ "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" }, "description": "Name per language, e.g. { en: Web shop, cs: E-shop }." }] },
|
|
121
|
+
"version": {
|
|
122
|
+
"type": "object",
|
|
123
|
+
"additionalProperties": false,
|
|
124
|
+
"description": "Where the product's version comes from. Default: detected (release-please, changesets, semantic-release, package.json, pyproject.toml, Cargo.toml, else git tags v*).",
|
|
125
|
+
"properties": {
|
|
126
|
+
"source": { "enum": ["auto", "git-tag", "package.json", "release-please", "changesets", "semantic-release", "pyproject", "cargo", "gemspec", "manual"] },
|
|
127
|
+
"path": { "type": "string", "description": "File that holds the version (package.json of the app, the release-please manifest)." },
|
|
128
|
+
"pattern": { "type": "string", "description": "Git tag pattern with one *, e.g. shop-v* (default v*)." }
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"docs": { "$ref": "#/$defs/docs" },
|
|
132
|
+
"project": { "type": "string", "description": "The Kaloko project people review this product in." },
|
|
133
|
+
"projects": { "type": "array", "items": { "type": "string" }, "description": "Several projects that work on this product." },
|
|
134
|
+
"modules": { "type": "array", "items": { "type": "string" } },
|
|
135
|
+
"reference_env": { "type": "string", "description": "Environment whose accepted runs the pictures come from (default: any)." },
|
|
136
|
+
"default_scenario": { "type": "string", "description": "Scenario of short step references (kaloko:<step>)." },
|
|
137
|
+
"publish": { "enum": ["members", "domain", "public"], "description": "Who reads the changelog on Kaloko; domain and public need an admin on the service." }
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"docs": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"additionalProperties": false,
|
|
143
|
+
"description": "Visual changelog and docs settings (all optional).",
|
|
144
|
+
"properties": {
|
|
145
|
+
"dir": { "type": "string", "description": "Docs sources (default docs)." },
|
|
146
|
+
"changelog": { "type": "string", "description": "Changelog file (default CHANGELOG.md)." },
|
|
147
|
+
"style": { "enum": ["keep-a-changelog", "release-notes"] },
|
|
148
|
+
"version_source": { "enum": ["auto", "git-tag", "package.json", "release-please", "changesets", "semantic-release", "pyproject", "cargo", "gemspec", "manual"] },
|
|
149
|
+
"languages": { "type": "array", "items": { "type": "string" } },
|
|
150
|
+
"framework": { "enum": ["auto", "docusaurus", "vitepress", "mkdocs", "nextra", "plain"] },
|
|
151
|
+
"publish": { "enum": ["members", "domain", "public"], "description": "Who reads the changelog on Kaloko; domain and public need an admin on the service." },
|
|
152
|
+
"images": { "type": "object", "additionalProperties": false, "properties": { "viewport": { "type": "string" }, "locale": { "type": "string", "description": "reader (the reader's language) or a locale." } } }
|
|
153
|
+
}
|
|
154
|
+
},
|
|
109
155
|
"record": {
|
|
110
156
|
"description": "Recordings of walked steps (opt-in): true or step records each step from the previous screen to its capture; flow records the whole walk per locale with a chapter per step; failed keeps only steps that fail; false or off turns it off. Uploaded on Business and Enterprise.",
|
|
111
157
|
"oneOf": [
|
package/schemas/run.v1.json
CHANGED
|
@@ -58,6 +58,14 @@
|
|
|
58
58
|
},
|
|
59
59
|
"archived": {
|
|
60
60
|
"type": "boolean"
|
|
61
|
+
},
|
|
62
|
+
"product": {
|
|
63
|
+
"type": ["string", "null"],
|
|
64
|
+
"description": "Product the flow documents (scenario product tag, or the only product of the config)."
|
|
65
|
+
},
|
|
66
|
+
"module": {
|
|
67
|
+
"type": ["string", "null"],
|
|
68
|
+
"description": "Module of the product (scenario module tag)."
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
71
|
},
|
package/schemas/scenario.v1.json
CHANGED
|
@@ -166,6 +166,14 @@
|
|
|
166
166
|
"$ref": "#/$defs/slug",
|
|
167
167
|
"description": "Optional project this flow belongs to; overrides `project` from kaloko.config.yml and the repository name for its runs."
|
|
168
168
|
},
|
|
169
|
+
"product": {
|
|
170
|
+
"$ref": "#/$defs/slug",
|
|
171
|
+
"description": "Product this flow documents (a key of `products:` in kaloko.config.yml). The visual changelog and docs of that product use its steps; with one product in the config, untagged flows belong to it."
|
|
172
|
+
},
|
|
173
|
+
"module": {
|
|
174
|
+
"$ref": "#/$defs/slug",
|
|
175
|
+
"description": "Module of the product (one of its `modules:`), for changelog and docs sections per module."
|
|
176
|
+
},
|
|
169
177
|
"capture": {
|
|
170
178
|
"$ref": "#/$defs/capture"
|
|
171
179
|
}
|
package/skills/kaloko/SKILL.md
CHANGED
|
@@ -16,7 +16,9 @@ description: >
|
|
|
16
16
|
reference, checking implementation against it), and when implementing a
|
|
17
17
|
screen that has an approved design (read the step spec, build with its
|
|
18
18
|
tokens, check drift), and when a step should be recorded on video or its
|
|
19
|
-
trace read (actions, requests, console)
|
|
19
|
+
trace read (actions, requests, console), and when a user-visible change
|
|
20
|
+
should land in the visual changelog (CHANGELOG.md with step references,
|
|
21
|
+
kaloko changelog draft, kaloko release) or a guide should show a step.
|
|
20
22
|
---
|
|
21
23
|
|
|
22
24
|
# Kaloko
|
|
@@ -37,6 +39,11 @@ the canvas, storage and collaboration are the service.
|
|
|
37
39
|
for them (`kaloko share` prints it; `kaloko review` repeats it), and you
|
|
38
40
|
read `kaloko feedback` and `kaloko inbox` before continuing on that task.
|
|
39
41
|
- Changes to intent are written back to `ACCEPTANCE.md` (change log row).
|
|
42
|
+
- When the project keeps a visual changelog (`CHANGELOG.md`, `docs:` or
|
|
43
|
+
`products:` in the config) and the change is user-visible: the Unreleased
|
|
44
|
+
entry says it for people, with step references for the screens it changed
|
|
45
|
+
(`kaloko changelog draft`), and new scenarios carry `product:` (and
|
|
46
|
+
`module:`) when the config has products.
|
|
40
47
|
- When you implemented a step from an approved design: you read its spec
|
|
41
48
|
(`kaloko spec <step>`), walked the implementation with `packs: [design]`,
|
|
42
49
|
and `kaloko drift` is clean or the PR names each difference left for a
|
|
@@ -52,7 +59,8 @@ Start the shared browser, walk a scenario on a non-production environment,
|
|
|
52
59
|
create test data there (users, roles, carts), capture screens and e-mails,
|
|
53
60
|
evaluate, build the preview, and fix scenario mechanics (selectors, scripts)
|
|
54
61
|
that do not change what is being accepted, including applying a selector
|
|
55
|
-
proposal with `kaloko walk --heal` when it names the same element
|
|
62
|
+
proposal with `kaloko walk --heal` when it names the same element, and pulling
|
|
63
|
+
the regions people drew to ignore into the scenario (`kaloko stability --pull`). Walk only
|
|
56
64
|
the steps a change reaches (`--affected`) and import screenshots into a run. Record steps locally
|
|
57
65
|
(`walk --record`) when a screenshot cannot show what a person has to judge, read traces, and
|
|
58
66
|
export a walkthrough video into the run folder. On a design environment: change
|
|
@@ -60,6 +68,8 @@ the design folder, walk, and sync the draft (including taking others' steps
|
|
|
60
68
|
with `--theirs`). Move to the trash runs you uploaded in this session that
|
|
61
69
|
were superseded before anyone looked at them (debug rounds: no comments, no
|
|
62
70
|
verdict), and run `kaloko prune` without `--yes` to see what a clean-up would do.
|
|
71
|
+
Draft and edit the Unreleased section of the changelog (`kaloko changelog draft
|
|
72
|
+
--apply`) and add step references to it and to guides.
|
|
63
73
|
|
|
64
74
|
## Ask first
|
|
65
75
|
|
|
@@ -69,11 +79,13 @@ replacing a CI workflow (`kaloko ci github|gitlab`), uploading with
|
|
|
69
79
|
design reference or baseline, merging a design branch, keeping your version of
|
|
70
80
|
a step in a sync conflict (`--mine`), turning on `html_view`, turning on recordings for
|
|
71
81
|
a whole project (`capture.record` in the config: storage), a real clean-up
|
|
72
|
-
(`kaloko prune --yes`), trashing someone else's run, archiving a scenario,
|
|
82
|
+
(`kaloko prune --yes`), trashing someone else's run, archiving a scenario,
|
|
83
|
+
recording a release (`kaloko release`) or asking to publish a changelog, and
|
|
73
84
|
anything the environment profile blocks. Never trash an accepted run, a
|
|
74
85
|
baseline, a run with review comments, or a run linked from an open PR or issue
|
|
75
86
|
comment. Never approve a
|
|
76
|
-
step or accept a run on a person's behalf
|
|
87
|
+
step or accept a run on a person's behalf, and never hand out a signed
|
|
88
|
+
acceptance record (`kaloko signoff`) for a run a person has not accepted; report what waits for them
|
|
77
89
|
(`kaloko review`, MCP `get_review_queue`) instead. Ask the person
|
|
78
90
|
for secret values (passwords, tokens, gate credentials) and for sign-ins only
|
|
79
91
|
they can do; never write secrets into the config, a scenario or a script.
|
|
@@ -118,6 +130,10 @@ they can do; never write secrets into the config, a scenario or a script.
|
|
|
118
130
|
[reference/collaboration.md](reference/collaboration.md)
|
|
119
131
|
- Reading runs, feedback and the inbox over MCP instead of the CLI:
|
|
120
132
|
[reference/mcp.md](reference/mcp.md)
|
|
133
|
+
- The visual changelog and guides with step references (`kaloko:<scenario>/<step>`):
|
|
134
|
+
drafting the Unreleased entry, templates for entries, client release notes and
|
|
135
|
+
how-tos, products, modules and versions, who reads it:
|
|
136
|
+
[reference/docs.md](reference/docs.md)
|
|
121
137
|
- Refreshing a manual, course or product documentation from the newest
|
|
122
138
|
captures (latest URLs, changed steps, webhooks, export):
|
|
123
139
|
[reference/documentation.md](reference/documentation.md)
|
|
@@ -342,5 +342,7 @@ design pixel check (`AC801`) leave them out:
|
|
|
342
342
|
|
|
343
343
|
Do not guess them: `kaloko walk --stability 3` notes what moves while the
|
|
344
344
|
page sits still, and `kaloko stability` compares the step with earlier runs
|
|
345
|
-
and writes suggestions (see [execution.md](execution.md)).
|
|
346
|
-
a region
|
|
345
|
+
and writes suggestions (see [execution.md](execution.md)). Reviewers can also
|
|
346
|
+
draw a region on a screenshot on kaloko.app; `kaloko stability --pull` writes
|
|
347
|
+
those into `ignore:`. Ignore only noise; a region that matters to a criterion
|
|
348
|
+
stays in.
|
|
@@ -72,8 +72,11 @@ comments; at the end they accept or return the run.
|
|
|
72
72
|
Comments are threads in three places:
|
|
73
73
|
|
|
74
74
|
- **A step:** optionally pinned to a position on the screenshot
|
|
75
|
-
(`pin: {x, y}` as fractions, per viewport)
|
|
76
|
-
|
|
75
|
+
(`pin: {x, y}` as fractions, per viewport), drawn on it (a box, an arrow or
|
|
76
|
+
a line: `shape`, with `region` giving the area as fractions and in CSS
|
|
77
|
+
pixels of the page, and for an arrow the point it aims at), or attached to
|
|
78
|
+
an element of a live design step (`anchor`). Comments may carry images
|
|
79
|
+
(`attachments`, each with a download URL that needs the token).
|
|
77
80
|
- **The whole run:** `node_id` is `''`.
|
|
78
81
|
- **The whole flow:** these stay across runs, e.g. "add the empty-cart
|
|
79
82
|
state".
|
|
@@ -85,8 +88,12 @@ said what.
|
|
|
85
88
|
|
|
86
89
|
The loop, for every open thread:
|
|
87
90
|
|
|
88
|
-
1. **Understand it.**
|
|
89
|
-
|
|
91
|
+
1. **Understand it.** A `region` says exactly where to look: `px` is
|
|
92
|
+
`[x, y, width, height]` in CSS pixels of the captured page for that
|
|
93
|
+
viewport (`region.viewport`) and locale; find the element there in the
|
|
94
|
+
step's HTML or screenshot. Download attached images (a corrected copy, a
|
|
95
|
+
reference) before you change anything. Open the canvas link when a pin or
|
|
96
|
+
an element matters.
|
|
90
97
|
2. **Fix it** in the code or the scenario. When the comment asks for a
|
|
91
98
|
change of intent (criteria, scope), ask the person first.
|
|
92
99
|
3. **Answer and close.** Use
|
|
@@ -181,14 +188,25 @@ e-mail works too). Use it when a step needs a decision from a specific person
|
|
|
181
188
|
Put the relevant lines in the issue comment. On the canvas the same
|
|
182
189
|
comparison is the **Compare** selector in the top bar (or `#cmp=<run>` in
|
|
183
190
|
the URL): pixel differences per step, changed criteria, and a side-by-side
|
|
184
|
-
or diff view in the lightbox
|
|
185
|
-
|
|
191
|
+
or diff view in the lightbox, plus *Swipe* (a divider dragged across both
|
|
192
|
+
screenshots) and *Onion skin* (this run faded over the other). Pixel diffs
|
|
193
|
+
are computed in the browser; nothing is uploaded. **G** opens the grid: one
|
|
194
|
+
step in every locale and viewport at once, failing cells marked.
|
|
186
195
|
- **Manual criteria** are decided on the canvas by a reviewer; treat a
|
|
187
196
|
reviewer's `fail` like a failing deterministic check.
|
|
188
197
|
- Admins may name **required approvers** per scenario (Settings). Such a
|
|
189
198
|
run stays `pending` until every one of them approved; `kaloko feedback`
|
|
190
199
|
prints `awaiting approval from: …`, so do not treat a single approval as
|
|
191
200
|
acceptance there.
|
|
201
|
+
- An accepted run has a **signed acceptance record** (Business and up): the
|
|
202
|
+
run, scenario, commit and environment, who approved what and when (people
|
|
203
|
+
apart from tokens and agents, approvals carried over unchanged steps with
|
|
204
|
+
where they came from), criteria results, capture hashes and the hash of
|
|
205
|
+
`run.json`, signed with the service's Ed25519 key. `kaloko signoff <run>`
|
|
206
|
+
downloads the JSON and the PDF and checks them; `kaloko signoff --verify
|
|
207
|
+
<file>` checks a record someone handed over (public key at
|
|
208
|
+
`/.well-known/kaloko-signoff.json`). Give it to the person when they ask
|
|
209
|
+
for proof of acceptance; never create one for a run that is not accepted.
|
|
192
210
|
|
|
193
211
|
## Cleaning up runs
|
|
194
212
|
|
|
@@ -245,6 +263,17 @@ Everything above is available over the API with an organization token:
|
|
|
245
263
|
(the whole flow), and per comment `PATCH`, `DELETE`, `POST …/<cid>/resolve`
|
|
246
264
|
(with `note`) and `…/<cid>/reopen`; `GET /api/v1/orgs/<org>/comments?state=open|all&scenario=&run=&mine=1`
|
|
247
265
|
across the organization. Lists of runs and scenarios carry `open_comments`.
|
|
266
|
+
A comment body may carry `shape` (`{kind: box, box: [x, y, w, h]}`,
|
|
267
|
+
`{kind: arrow, from, to}` or `{kind: pen, points}` in fractions, with
|
|
268
|
+
`viewport` and `size`) and `attachments` (ids from
|
|
269
|
+
`POST …/comments/attachments?name=<file>` with the image as the body: PNG,
|
|
270
|
+
JPEG, WebP or GIF up to 5 MB, counted in the plan's storage).
|
|
271
|
+
- `GET|POST /api/v1/orgs/<org>/runs/<id>/ignore-regions`,
|
|
272
|
+
`DELETE …/ignore-regions/<rid>`, `GET …/scenarios/<id>/ignore-regions[?state=all]`
|
|
273
|
+
and `POST …/scenarios/<id>/ignore-regions/applied` (`{ids}`): regions drawn
|
|
274
|
+
to leave out of pixel diffs (drawing needs Developer / Tester).
|
|
275
|
+
- `GET /api/v1/orgs/<org>/runs/<id>/signoff` (JSON), `…/signoff.pdf`,
|
|
276
|
+
`…/signoff.html`: the signed acceptance record of an accepted run.
|
|
248
277
|
- `GET /api/v1/orgs/<org>/notifications[?unread=1]`, `POST` with
|
|
249
278
|
`{"read": "all"}` or `{"read": [ids]}`
|
|
250
279
|
- `GET /api/v1/orgs/<org>/runs[?project=&scenario=&kind=&verdict=&author=&environment=&branch=&q=][&latest=1]`
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Visual changelog and docs with step references
|
|
2
|
+
|
|
3
|
+
The project keeps `CHANGELOG.md` (and guides in `docs/`) in the repository. You write and update them as part of
|
|
4
|
+
normal work; Kaloko turns step references into pictures from accepted runs and shows the changelog as a page that
|
|
5
|
+
clients, support and marketing can read.
|
|
6
|
+
|
|
7
|
+
## Step references
|
|
8
|
+
|
|
9
|
+
A picture in Markdown names a step instead of a PNG file:
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
 newest accepted capture
|
|
13
|
+
 the capture of release 2.4.0
|
|
14
|
+
 the release before the one this entry belongs to
|
|
15
|
+

|
|
16
|
+
 a step of the product's default_scenario
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`<scenario>` is the scenario id, `<step>` the node id. Without `locale` and `viewport` the reader's language and
|
|
20
|
+
the product's default screen are used. `state` picks a capture variant (`dark`, `webkit`, `reduce`: the values in
|
|
21
|
+
capture keys like `mobile.webkit.dark`). Check a reference with MCP `resolve_step_image` or
|
|
22
|
+
`GET /api/v1/orgs/<org>/steps/resolve?ref=…`: it answers the signed image URL, the run and how the version was found
|
|
23
|
+
(`release`, `app_version`, `reference_env`, `accepted`; `exact: false` means a fallback).
|
|
24
|
+
|
|
25
|
+
Never invent a step id or a version. Use ids from the scenario files and versions from `CHANGELOG.md` or git tags.
|
|
26
|
+
|
|
27
|
+
## After a user-visible change
|
|
28
|
+
|
|
29
|
+
1. Walk the affected steps and share the run as usual; a person accepts it on the canvas.
|
|
30
|
+
2. `kaloko changelog draft` prints the Unreleased entry: merged pull requests and commits since the last release,
|
|
31
|
+
grouped Added / Changed / Fixed / Removed, plus before/after pictures of the screens that accepted runs show
|
|
32
|
+
differently (it needs a token for the pictures). `--apply` writes it into `CHANGELOG.md`.
|
|
33
|
+
3. Edit the draft for people: what they can do now or what looks different, one change per line, no commit jargon.
|
|
34
|
+
Delete internal items (refactors, tests, CI). Keep the step references; move a picture under the line it shows.
|
|
35
|
+
Remove the `<!-- … -->` hints.
|
|
36
|
+
4. Commit `CHANGELOG.md` with the change. At release time `kaloko release <version>` (ask first: it records the
|
|
37
|
+
release on Kaloko) turns Unreleased into the version, records its pictures and prints the changelog page.
|
|
38
|
+
|
|
39
|
+
`--since v2.3.0` drafts from another tag; `--product shop` picks a product when the config has several.
|
|
40
|
+
|
|
41
|
+
## Templates
|
|
42
|
+
|
|
43
|
+
A changelog entry (Keep a Changelog):
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
## [2.4.0] - 2026-10-12
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- You can pay with Apple Pay in the checkout. ([#412](https://github.com/acme/shop/pull/412))
|
|
51
|
+
 
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- The cart total no longer jumps while prices load on phones.
|
|
56
|
+

|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Release notes for a client (a sibling file, or the text of a release on your Git host):
|
|
60
|
+
|
|
61
|
+
```markdown
|
|
62
|
+
# What's new in the web shop, October
|
|
63
|
+
|
|
64
|
+
Customers can pay with Apple Pay. The button sits above the card form on phones and computers.
|
|
65
|
+
|
|
66
|
+

|
|
67
|
+
|
|
68
|
+
Also fixed: the cart total no longer jumps on phones.
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
A how-to guide (`docs/how-to/pay-with-apple-pay.md`):
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# Pay with Apple Pay
|
|
75
|
+
|
|
76
|
+
1. Open the cart and choose **Checkout**.
|
|
77
|
+

|
|
78
|
+
2. Choose **Apple Pay** above the card form and confirm on your phone or Mac.
|
|
79
|
+

|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Rules: write for the person using the product; one change per line; before/after pictures for changes people see;
|
|
83
|
+
no internal names, prices or numbers you cannot show.
|
|
84
|
+
|
|
85
|
+
## Products, modules and versions
|
|
86
|
+
|
|
87
|
+
Without `products:` in `kaloko.config.yml` the project is the product and `CHANGELOG.md` in the root is its
|
|
88
|
+
changelog. Pick the pattern that fits; tag new scenarios accordingly without asking each time:
|
|
89
|
+
|
|
90
|
+
1. **One app, one team**: no products. Optional `docs: { changelog: CHANGELOG.md }`.
|
|
91
|
+
2. **Monorepo with several apps**: one product per app, each with its version file and changelog; every scenario
|
|
92
|
+
says `product: <slug>`.
|
|
93
|
+
```yaml
|
|
94
|
+
products:
|
|
95
|
+
shop:
|
|
96
|
+
name: { en: Web shop, cs: E-shop }
|
|
97
|
+
version: { source: package.json, path: apps/shop/package.json }
|
|
98
|
+
docs: { changelog: apps/shop/CHANGELOG.md }
|
|
99
|
+
project: eshop
|
|
100
|
+
reference_env: staging
|
|
101
|
+
admin:
|
|
102
|
+
version: { source: git-tag, pattern: "admin-v*" }
|
|
103
|
+
```
|
|
104
|
+
3. **Agency**: a project per client, a product per client deliverable; client guests of the project read only that
|
|
105
|
+
product's changelog.
|
|
106
|
+
4. **Large app with modules**: one product with `modules: [checkout, account, …]`; scenarios carry
|
|
107
|
+
`product:` and `module:`; one combined release changelog with a section per module if the team wants it.
|
|
108
|
+
|
|
109
|
+
The version comes from what the repository already uses: release-please, changesets, semantic-release,
|
|
110
|
+
`package.json` (or pyproject/Cargo/gemspec), else git tags `v*`. When a release tool writes `CHANGELOG.md`, Kaloko
|
|
111
|
+
reads its entry and never rewrites the file; put your draft into the pull request or release notes instead.
|
|
112
|
+
`reference_env` says which environment the pictures come from (default: any accepted run).
|
|
113
|
+
|
|
114
|
+
`kaloko doctor` warns when a product's version cannot be read or a scenario names no product while several exist.
|
|
115
|
+
|
|
116
|
+
## Readers
|
|
117
|
+
|
|
118
|
+
The changelog page (`/<org>/products/<product>/changelog`, or `/<org>/projects/<project>/changelog`) is read by
|
|
119
|
+
everyone who sees one of the product's projects, guests included. An admin of those projects may open it to
|
|
120
|
+
readers from the organization's verified domains or publish it (`/p/<org>/<product>/changelog` with an Atom feed;
|
|
121
|
+
not indexed until the organization allows it). `publish:` in the config only asks for it; an admin confirms on the
|
|
122
|
+
page. Never publish without the person asking.
|
|
123
|
+
|
|
124
|
+
## MCP
|
|
125
|
+
|
|
126
|
+
`get_changelog` (releases with entries; `resolve: true` adds the pictures), `draft_changelog_entry` (the service's
|
|
127
|
+
half of a draft: changed screens with before/after references), `resolve_step_image` (one reference).
|
|
@@ -88,6 +88,7 @@ When pixel diffs between runs keep flagging the same clock, ad or carousel:
|
|
|
88
88
|
kaloko walk --stability 3 # 3 screenshots per capture, a moment apart; what moved is noted
|
|
89
89
|
kaloko stability # this run against the 3 previous local runs of the scenario
|
|
90
90
|
kaloko stability --apply # adds the suggested ignore: to each step (block-style YAML only)
|
|
91
|
+
kaloko stability --pull # regions people drew on screenshots on kaloko.app go into ignore:
|
|
91
92
|
```
|
|
92
93
|
|
|
93
94
|
`kaloko stability` writes `stability.json` and `stability.yml` into the run
|
|
@@ -98,6 +99,14 @@ changed is not noise. `--same-commit` compares only runs of the same commit,
|
|
|
98
99
|
`--runs a,b` names them, `--last N` sets how many runs are compared. Capture
|
|
99
100
|
the steps again after applying: the capture records the ignored regions.
|
|
100
101
|
|
|
102
|
+
People mark noise by hand too: a Developer / Tester draws a rectangle on a
|
|
103
|
+
screenshot (step detail → *Mark a changing region*). It is kept per flow, shows
|
|
104
|
+
dashed on every run and the canvas pixel diff already skips it.
|
|
105
|
+
`kaloko stability --pull` writes those regions into the scenario's `ignore:`
|
|
106
|
+
(appended to an existing block list, never twice) and tells the service they
|
|
107
|
+
are in the file; walk those steps again afterwards. MCP `list_ignore_regions`
|
|
108
|
+
lists them, `add_ignore_region` suggests one.
|
|
109
|
+
|
|
101
110
|
## Only what changed
|
|
102
111
|
|
|
103
112
|
After a fix, walk the steps the change reaches instead of the whole flow:
|
|
@@ -33,6 +33,9 @@ file.
|
|
|
33
33
|
| `decide_step` | records your (the agent's) decision on a step: `approve`, or `return` with a `note`; marked as an agent's and not counted as a person's. Never use it to approve for a person |
|
|
34
34
|
| `revoke_carried_approval` | revokes an approval carried over to a step that looks unchanged but should be looked at again (`run_id`, `step`) |
|
|
35
35
|
| `get_step_assets` | documentation layer (Business): newest capture of every step of a scenario with stable image, HTML and metadata URLs (`scenario`, `step`, `locale`, `viewport`, `accepted`) |
|
|
36
|
+
| `get_changelog` | the visual changelog of a product (`product`, `version`, `resolve: true` for the pictures, `limit`): releases newest first with the entry as written and its groups; see [docs.md](docs.md) |
|
|
37
|
+
| `draft_changelog_entry` | what accepted runs since the last release (or `since`) show differently, as a Keep a Changelog draft with before/after step references (`product`, `since`) |
|
|
38
|
+
| `resolve_step_image` | one step reference (`ref` = `kaloko:<scenario>/<step>?…`, `product`, `version`, `locale`, `viewport`) as a signed image URL with its run, how the version was found and canvas links |
|
|
36
39
|
| `list_step_changes` | documentation layer: steps whose capture or status changed since the previous accepted run or `since` (`scenario`, `since`, `accepted`); see [documentation.md](documentation.md) |
|
|
37
40
|
| `get_started` | where the organization stands (`empty`, `sample`, `active`), its sample run, the next steps and a prompt; call it in a new project, see [first-run.md](first-run.md) |
|
|
38
41
|
| `add_sample_run` | adds the sample run (or returns the one there is); needs an upload or full token and the Developer / Tester role |
|
|
@@ -42,8 +45,11 @@ file.
|
|
|
42
45
|
|
|
43
46
|
| Tool | Use |
|
|
44
47
|
|---|---|
|
|
45
|
-
| `list_comments` | open threads (or `state: all`) across the organization, filtered by `scenario` or `run_id`, with replies, pins, anchors and who wrote them |
|
|
46
|
-
| `add_comment` | comment on a step (`run_id` + `step`), the whole run (`run_id`) or the whole flow (`scenario`); `parent_id` replies; optional `pin` `{ x, y, viewport }` |
|
|
48
|
+
| `list_comments` | open threads (or `state: all`) across the organization, filtered by `scenario` or `run_id`, with replies, pins, anchors, drawn regions (`region.px`: CSS pixels of the page in `region.viewport`), attached images with URLs, and who wrote them |
|
|
49
|
+
| `add_comment` | comment on a step (`run_id` + `step`), the whole run (`run_id`) or the whole flow (`scenario`); `parent_id` replies; optional `pin` `{ x, y, viewport }` or `shape` (box or arrow in fractions, with `viewport` and `size`) |
|
|
50
|
+
| `list_ignore_regions` | regions people drew to leave out of pixel diffs, per step, with the `ignore:` entry each becomes (`kaloko stability --pull` writes them) |
|
|
51
|
+
| `add_ignore_region` | suggest such a region (`run_id`, `step`, `viewport`, `rect` in CSS px); Developer / Tester, scope upload or full |
|
|
52
|
+
| `get_signoff_record` | the signed acceptance record of an accepted run (Business): approvals with provenance, criteria, capture hashes, signature |
|
|
47
53
|
| `resolve_comment` | close a thread with a `note` that says what changed (it becomes the last reply) |
|
|
48
54
|
| `reopen_comment`, `edit_comment`, `delete_comment` | reopen; edit or delete your own comment |
|
|
49
55
|
|