kaloko 0.5.1 → 0.6.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/README.md CHANGED
@@ -210,6 +210,87 @@ 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
+ ![before](kaloko:checkout/payment?version=prev) ![after](kaloko:checkout/payment)
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
+
241
+ When release-please, changesets or semantic-release makes your releases,
242
+ `npx kaloko ci github --release` adds a workflow that records each published
243
+ release on Kaloko; your release tool keeps writing `CHANGELOG.md`.
244
+
245
+ ## Docs that keep up with the app
246
+
247
+ Guides in your `docs/` folder (tutorials, how-to guides, reference,
248
+ explanation) use the same step references, so their pictures never go stale.
249
+ A Czech translation of `pay.md` is `pay.cs.md` next to it.
250
+
251
+ ```bash
252
+ npx kaloko init --docs=full # docs folders with a template in each
253
+ npx kaloko docs check # broken references, stale sections, missing translations; exit 1 in CI
254
+ npx kaloko docs publish # the docs on kaloko.app: versions, languages, screens, search
255
+ npx kaloko export --format docusaurus # or md, vitepress, mkdocs, html, pdf, json: pictures as files
256
+ ```
257
+
258
+ When a screen changes after its guide was written, the section on kaloko.app
259
+ says "the screen changed in 2.4 — check the text", and `kaloko docs check`
260
+ lists it. A guide plays as a walkthrough, one step at a time, and readers can
261
+ ask for a "What's new" e-mail with every release.
262
+
263
+ ## Jira, Linear, Slack and Teams
264
+
265
+ When a reviewer returns a step, the fix usually gets planned in Jira or
266
+ Linear. Create the issue from the step, on the canvas or from the terminal:
267
+
268
+ ```bash
269
+ npx kaloko issue create --step checkout --to jira --criterion AC2
270
+ ```
271
+
272
+ The issue gets the screenshot, the criterion, the reviewers' notes and a link
273
+ back to the step. When it is done in the tracker, the comment on the step is
274
+ resolved. A branch or pull request title that names the issue (`WEB-12`, or
275
+ Linear's `eng-42`) links the run to it. Slack and Teams channels are chosen per
276
+ project in Settings → Integrations, with the events each channel wants and
277
+ quiet hours.
278
+
279
+ ## Pages checked on a schedule
280
+
281
+ A read-only scenario of public or gated pages can run on Kaloko's own
282
+ browsers every morning, with nobody starting the CLI (Business plan):
283
+
284
+ ```bash
285
+ npx kaloko schedule add --scenario qa/flows/public.yml --env production --every day --at 5
286
+ npx kaloko schedule export github --scenario qa/flows/checkout.yml --env staging # the full walk in GitHub Actions
287
+ ```
288
+
289
+ Hosted runs open pages (HTTP Basic and saved sessions work), take full-page
290
+ screenshots in every locale and viewport and check selectors and text. Steps
291
+ that click or type, apps and local environments need the full walk, which the
292
+ exported workflow runs on the same schedule.
293
+
213
294
  ## Design (Kaloko Design)
214
295
 
215
296
  Design the screens of a flow as live HTML with your own agent and skills, in the same scenario that development
@@ -238,6 +319,28 @@ npx kaloko spec payment # elements, styles → tokens, states
238
319
  npx kaloko walk && npx kaloko drift # expected token vs actual value per element; exit 1 while it differs
239
320
  ```
240
321
 
322
+ Each published version says what changed since the previous one, step by step: the text that moved, the
323
+ viewports that look different, the tokens that changed. Read it before publishing and write your own where the
324
+ reason matters:
325
+
326
+ ```bash
327
+ npx kaloko share --notes-preview # what the version notes would say
328
+ npx kaloko share --notes notes.md # a summary, then "step-id: what changed" lines
329
+ ```
330
+
331
+ Design in Figma? Import the frames as design steps and make them the design reference without redrawing them.
332
+ Frames match steps by name (`Payment / mobile`); each step gets the frame image, its text layers with their type
333
+ and colors, and the file's variables as `tokens.json`. It goes one way: prototype links and components stay in
334
+ Figma. Without an API token, import a folder of frames exported from Figma.
335
+
336
+ ```bash
337
+ FIGMA_TOKEN=figd_… npx kaloko design import figma "https://www.figma.com/design/<key>/Shop" --scenario qa/flows/checkout.yml
338
+ npx kaloko design import figma ./figma-export --scenario qa/flows/checkout.yml
339
+ ```
340
+
341
+ Looking for where a pattern is already used? `npx kaloko screens "empty cart"` searches the newest screenshot of
342
+ every step across your flows (also at `/<org>/screens` on kaloko.app and MCP `search_screens`).
343
+
241
344
  On the canvas, *Prototype* (or `P`) presents the steps full screen as live pages: click through links between
242
345
  steps, switch the device, walk with the arrow keys, and share a link that opens straight into a step. The rules
243
346
  for pages that work everywhere are in `skills/kaloko/reference/portable-html.md`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaloko",
3
- "version": "0.5.1",
3
+ "version": "0.6.0",
4
4
  "description": "See what your AI agents built: every screen, language and device walked, assessed and approved on one canvas.",
5
5
  "keywords": [
6
6
  "qa",
@@ -0,0 +1,83 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://qawalk.com/schemas/changelog.v1.json",
4
+ "title": "qawalk.changelog.v1",
5
+ "description": "The visual changelog as data (docs/DOCS-CHANGELOG.md → Exports): releases newest first with their Keep a Changelog groups and items, each item with the pictures its step references resolve to. Written by src/lib/docs-export.mjs changelogJson; served by GET …/docs/export?format=json and the Download menu of the changelog and docs pages; kaloko export --format json saves it. image is a link for the reader who exported it (signed links expire); canvas opens the step on Kaloko when the reader may see the run.",
6
+ "type": "object",
7
+ "required": ["schema", "product", "releases"],
8
+ "properties": {
9
+ "schema": { "const": "qawalk.changelog.v1" },
10
+ "product": {
11
+ "type": "object",
12
+ "required": ["slug"],
13
+ "properties": {
14
+ "slug": { "type": "string" },
15
+ "name": { "description": "A name, or names per language ({ \"en\": …, \"cs\": … }).", "oneOf": [{ "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" } }, { "type": "null" }] }
16
+ }
17
+ },
18
+ "generated_at": { "type": ["string", "null"], "format": "date-time" },
19
+ "releases": {
20
+ "type": "array",
21
+ "items": {
22
+ "type": "object",
23
+ "required": ["version", "groups"],
24
+ "properties": {
25
+ "version": { "type": "string" },
26
+ "released_on": { "type": ["string", "null"], "description": "YYYY-MM-DD" },
27
+ "tag": { "type": ["string", "null"] },
28
+ "notes": { "type": "string", "description": "Text before the first group." },
29
+ "groups": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "object",
33
+ "required": ["name", "items"],
34
+ "properties": {
35
+ "name": { "type": "string", "description": "Added, Changed, Deprecated, Removed, Fixed, Security, or the heading as written." },
36
+ "heading": { "type": "string" },
37
+ "items": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "object",
41
+ "required": ["text", "pictures"],
42
+ "properties": {
43
+ "text": { "type": "string", "description": "The item's words without pictures and comments." },
44
+ "pictures": {
45
+ "type": "array",
46
+ "items": {
47
+ "type": "object",
48
+ "required": ["ref", "ok"],
49
+ "properties": {
50
+ "ref": { "type": "string", "description": "The step reference kaloko:<scenario>/<step>[?…]." },
51
+ "ok": { "type": "boolean", "description": "false: no accepted picture for this reference." },
52
+ "scenario": { "type": "string" },
53
+ "step": { "type": "string" },
54
+ "title": { "type": ["string", "null"] },
55
+ "locale": { "type": "string" },
56
+ "viewport": { "type": "string" },
57
+ "run": { "type": ["string", "null"] },
58
+ "version": { "type": ["string", "null"], "description": "The release the picture belongs to (null: the newest accepted)." },
59
+ "image": { "type": ["string", "null"] },
60
+ "canvas": { "type": ["string", "null"] }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ },
73
+ "docs": {
74
+ "type": "array",
75
+ "description": "The docs pages in the export (one language).",
76
+ "items": {
77
+ "type": "object",
78
+ "required": ["path", "title"],
79
+ "properties": { "path": { "type": "string" }, "lang": { "type": ["string", "null"] }, "title": { "type": "string" }, "kind": { "type": ["string", "null"], "enum": ["tutorials", "how-to", "reference", "explanation", null] } }
80
+ }
81
+ }
82
+ }
83
+ }
@@ -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": [
@@ -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
  },
@@ -267,6 +275,13 @@
267
275
  "number": {
268
276
  "type": "integer"
269
277
  },
278
+ "key": {
279
+ "type": [
280
+ "string",
281
+ "null"
282
+ ],
283
+ "description": "Jira or Linear issue key (ENG-42) from the scenario, the branch or the pull request title."
284
+ },
270
285
  "url": {
271
286
  "type": [
272
287
  "string",
@@ -321,6 +336,18 @@
321
336
  },
322
337
  "description": "Steps whose revision differs from the parent version."
323
338
  },
339
+ "notes": {
340
+ "type": [
341
+ "object",
342
+ "null"
343
+ ],
344
+ "description": "\"What changed\" notes of a design version (qawalk.version-notes.v1): summary and steps [{ step, title, locales, reason, changes, text }]; generated texts are { en, cs }, edited ones a string.",
345
+ "properties": {
346
+ "schema": { "const": "qawalk.version-notes.v1" },
347
+ "summary": { "type": ["string", "object", "null"] },
348
+ "steps": { "type": "array", "items": { "type": "object", "required": ["step"], "properties": { "step": { "type": "string" }, "reason": { "enum": ["new", "changed", "removed", "note"] }, "text": { "type": ["string", "object"] } } } }
349
+ }
350
+ },
324
351
  "draft": {
325
352
  "type": "object",
326
353
  "description": "Present when the manifest is a live draft, not a run."
@@ -113,7 +113,7 @@
113
113
  "issue": {
114
114
  "type": "object",
115
115
  "additionalProperties": false,
116
- "description": "Ticket the scenario verifies. `number` alone resolves against the repository's remote.",
116
+ "description": "Ticket the scenario verifies. `number` alone resolves against the repository's remote; `key` names a Jira or Linear issue (ENG-42).",
117
117
  "properties": {
118
118
  "repo": {
119
119
  "type": "string",
@@ -123,6 +123,11 @@
123
123
  "type": "integer",
124
124
  "minimum": 1
125
125
  },
126
+ "key": {
127
+ "type": "string",
128
+ "pattern": "^[A-Z][A-Z0-9_]{0,19}-[1-9][0-9]{0,8}$",
129
+ "description": "Jira or Linear issue key, e.g. ENG-42."
130
+ },
126
131
  "url": {
127
132
  "type": "string"
128
133
  },
@@ -166,6 +171,14 @@
166
171
  "$ref": "#/$defs/slug",
167
172
  "description": "Optional project this flow belongs to; overrides `project` from kaloko.config.yml and the repository name for its runs."
168
173
  },
174
+ "product": {
175
+ "$ref": "#/$defs/slug",
176
+ "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."
177
+ },
178
+ "module": {
179
+ "$ref": "#/$defs/slug",
180
+ "description": "Module of the product (one of its `modules:`), for changelog and docs sections per module."
181
+ },
169
182
  "capture": {
170
183
  "$ref": "#/$defs/capture"
171
184
  }
@@ -13,10 +13,14 @@ description: >
13
13
  reviewer rejected on a canvas, what is waiting in the Kaloko inbox, or how
14
14
  to report a run in an issue, and when designing screens of a flow in a
15
15
  design environment (live HTML steps, drafts, versions, the design
16
- reference, checking implementation against it), and when implementing a
16
+ reference, checking implementation against it, importing Figma frames),
17
+ when looking for existing screens across flows, and when implementing a
17
18
  screen that has an approved design (read the step spec, build with its
18
19
  tokens, check drift), and when a step should be recorded on video or its
19
- trace read (actions, requests, console).
20
+ trace read (actions, requests, console), and when a user-visible change
21
+ should land in the visual changelog (CHANGELOG.md with step references,
22
+ kaloko changelog draft, kaloko release) or a guide should show a step or
23
+ be written, translated or checked (kaloko docs check).
20
24
  ---
21
25
 
22
26
  # Kaloko
@@ -37,6 +41,15 @@ the canvas, storage and collaboration are the service.
37
41
  for them (`kaloko share` prints it; `kaloko review` repeats it), and you
38
42
  read `kaloko feedback` and `kaloko inbox` before continuing on that task.
39
43
  - Changes to intent are written back to `ACCEPTANCE.md` (change log row).
44
+ - When the project keeps a visual changelog (`CHANGELOG.md`, `docs:` or
45
+ `products:` in the config) and the change is user-visible: the Unreleased
46
+ entry says it for people, with step references for the screens it changed
47
+ (`kaloko changelog draft`), and new scenarios carry `product:` (and
48
+ `module:`) when the config has products.
49
+ - When the project keeps docs (`docs.dir`, a `docs/` folder with step
50
+ references) and the change is user-visible: the guides that show the changed
51
+ screens say what people see now, their translations follow, and
52
+ `kaloko docs check` reports no broken references or stale sections.
40
53
  - When you implemented a step from an approved design: you read its spec
41
54
  (`kaloko spec <step>`), walked the implementation with `packs: [design]`,
42
55
  and `kaloko drift` is clean or the PR names each difference left for a
@@ -44,7 +57,8 @@ the canvas, storage and collaboration are the service.
44
57
  - On a design environment: the folder follows the bundle rules and
45
58
  `kaloko design lint` shows no error, `kaloko walk` and `kaloko sync` ran,
46
59
  `kaloko status` shows no conflict, and you read the draft's feedback; a
47
- version is published only when the person asked.
60
+ version is published only when the person asked, with notes that say what
61
+ changed and why (`kaloko share --notes-preview`, then `--notes`).
48
62
 
49
63
  ## You may do without asking
50
64
 
@@ -61,6 +75,10 @@ the design folder, walk, and sync the draft (including taking others' steps
61
75
  with `--theirs`). Move to the trash runs you uploaded in this session that
62
76
  were superseded before anyone looked at them (debug rounds: no comments, no
63
77
  verdict), and run `kaloko prune` without `--yes` to see what a clean-up would do.
78
+ Draft and edit the Unreleased section of the changelog (`kaloko changelog draft
79
+ --apply`) and add step references to it and to guides. Write, translate and fix
80
+ guides in the docs folder, run `kaloko docs check`, and export them for a docs
81
+ site (`kaloko export --format …`) into a local folder.
64
82
 
65
83
  ## Ask first
66
84
 
@@ -70,7 +88,11 @@ replacing a CI workflow (`kaloko ci github|gitlab`), uploading with
70
88
  design reference or baseline, merging a design branch, keeping your version of
71
89
  a step in a sync conflict (`--mine`), turning on `html_view`, turning on recordings for
72
90
  a whole project (`capture.record` in the config: storage), a real clean-up
73
- (`kaloko prune --yes`), trashing someone else's run, archiving a scenario, and
91
+ (`kaloko prune --yes`), trashing someone else's run, archiving a scenario,
92
+ recording a release (`kaloko release`) or asking to publish a changelog,
93
+ publishing docs (`kaloko docs publish`, `--reviewed` above all: it says a
94
+ person checked the text), writing a release workflow (`kaloko ci github
95
+ --release`), and
74
96
  anything the environment profile blocks. Never trash an accepted run, a
75
97
  baseline, a run with review comments, or a run linked from an open PR or issue
76
98
  comment. Never approve a
@@ -120,6 +142,15 @@ they can do; never write secrets into the config, a scenario or a script.
120
142
  [reference/collaboration.md](reference/collaboration.md)
121
143
  - Reading runs, feedback and the inbox over MCP instead of the CLI:
122
144
  [reference/mcp.md](reference/mcp.md)
145
+ - Filing a returned step or a failing criterion in Jira or Linear, issue keys in
146
+ branches, channels per project, and hosted runs of read-only scenarios on a
147
+ schedule (`kaloko issue`, `kaloko schedule`):
148
+ [reference/integrations.md](reference/integrations.md)
149
+ - The visual changelog and guides with step references (`kaloko:<scenario>/<step>`):
150
+ drafting the Unreleased entry, Diátaxis templates, translations, stale sections
151
+ and `kaloko docs check`, training guides, exports, release tools in CI,
152
+ products, modules and versions, who reads it:
153
+ [reference/docs.md](reference/docs.md)
123
154
  - Refreshing a manual, course or product documentation from the newest
124
155
  captures (latest URLs, changed steps, webhooks, export):
125
156
  [reference/documentation.md](reference/documentation.md)
@@ -127,6 +158,10 @@ they can do; never write secrets into the config, a scenario or a script.
127
158
  references, handoff, tokens, the design pack, canvas edits, branches, HTML
128
159
  view, presenting the prototype, exports, bringing your own design skill):
129
160
  [reference/design.md](reference/design.md)
161
+ - Bringing Figma frames in as design steps and the design reference
162
+ (`kaloko design import figma`), notes on what changed in a version, and
163
+ finding existing screens across flows (`kaloko screens`):
164
+ [reference/design.md#import-from-figma](reference/design.md#import-from-figma)
130
165
  - Implementing a screen from the approved design: read the step spec, build
131
166
  with its tokens, walk, check drift, fix:
132
167
  [reference/design.md#implement-from-the-approved-design](reference/design.md#implement-from-the-approved-design)
@@ -95,6 +95,8 @@ color_schemes: [light, dark]
95
95
  on both sides is a conflict: name it with `--mine <step>` or `--theirs <step>`; never delete to resolve.
96
96
  - `kaloko share` on a design environment publishes a version of the flow (`v4 · 3 changed, 17 unchanged`).
97
97
  A version counts as a shared run. Publish when the person asks, not after every change.
98
+ - Every version gets notes on what changed since the previous one; see
99
+ [What changed in a version](#what-changed-in-a-version).
98
100
  - Step status (`in progress`, `ready for review`, `ready for dev`) is set in the canvas or with MCP
99
101
  `set_step_status`; `ready for dev` notifies followers.
100
102
  - Set `KALOKO_AGENT=<your name>` so people see your writes as yours in presence, history and audit.
@@ -121,6 +123,59 @@ opens straight into the presentation of that step: share it with the person who
121
123
  relative links click through there too.
122
124
  - A link's query and hash travel to the next step (`../payment/index.html?plan=pro#card`): keep prototype state there.
123
125
 
126
+ ## What changed in a version
127
+
128
+ When a version is published, Kaloko writes a short note per changed step against the previous version of the
129
+ branch: a new or removed step, the text that changed (from the step spec), the viewports whose screenshot looks
130
+ different, a new token set, or "looks the same; only the page code changed". Reviewers read it in the version's
131
+ side panel and in the step detail; followers get the summary in their inbox.
132
+
133
+ - Read what it would say before you publish: `kaloko share --notes-preview` (MCP `get_version_notes` with
134
+ `version: draft`).
135
+ - Say why, not only what: write a file with a summary first and then `step-id: what changed and why` lines, and
136
+ publish with `kaloko share --notes notes.md` (or `--notes -` from standard input; MCP `publish_version` takes
137
+ `notes`). Your text replaces the generated one for the steps you name; the other steps keep theirs.
138
+ - Fix them afterwards with MCP `set_version_notes` or `PUT …/scenarios/<id>/versions/v4/notes`. Plain language for
139
+ the people who review the design: what they will notice, not file names.
140
+
141
+ ## Import from Figma
142
+
143
+ Teams whose design lives in Figma can make it the design reference without redrawing it:
144
+
145
+ ```bash
146
+ export FIGMA_TOKEN=figd_… # Figma → Settings → Security → Personal access tokens (file content: read-only)
147
+ kaloko design import figma "https://www.figma.com/design/<key>/Shop?node-id=12-0" --scenario qa/flows/checkout.yml
148
+ ```
149
+
150
+ - Frames match steps by name: a frame named after the step id or title, with a viewport or locale in it
151
+ (`Payment / mobile`, `payment@desktop`, `Košík [cs]`). Several frames of one step without a viewport in the name
152
+ take the viewport of their width. Anything else: `--map frames.json` (`{ "Frame 12": "payment" }`, or
153
+ `{ "step": "payment", "viewport": "mobile", "locale": "cs" }`, or `{ "skip": true }`). `--frames a,b` and
154
+ `--page <name>` narrow the import; `--dry-run` shows the matches without writing.
155
+ - Each step gets `<step>/index.html` with the frame's PNG (1× and 2×) and, under it, the frame's text layers as
156
+ real text with Figma's typography and colors (`var(--token)` where a layer uses a variable or style), so
157
+ `kaloko spec` and `kaloko drift` have elements to compare. `figma.json` says which frame a page came from.
158
+ - Variables become `tokens.json` (W3C DTCG; extra modes such as dark as mode groups); without variables, the color
159
+ and text styles the frames use. A `tokens.json` you wrote yourself stays unless you pass `--tokens write`.
160
+ - Steps written by hand are not replaced without `--force`. Importing again replaces what the last import wrote;
161
+ unchanged frames give the same files, so the next version shows them unchanged.
162
+ - No API token: export the frames from Figma as PNG (1× and 2×) or SVG into a folder and import the folder
163
+ (`kaloko design import figma ./export`); a `*.tokens.json` in it becomes the token set.
164
+ - Then walk and share as usual, or add `--publish` (start, walk and share in one go). Once a person accepts the
165
+ version, set it as the design reference: implementation runs with `packs: [design]` are checked against the
166
+ frames (`design_pixels`) and the text styles and tokens (`kaloko drift`).
167
+ - One way only: prototype links, components, auto layout and interactions do not come over, and nothing goes
168
+ back to Figma. A frame wider or narrower than its viewport is compared as it is; draw a frame per viewport for a
169
+ clean pixel comparison.
170
+
171
+ ## Screen library
172
+
173
+ The newest screenshot of every step across the organization's flows, searchable: `/<org>/screens` on the service,
174
+ `kaloko screens [words]` (`--project`, `--locale`, `--viewport`, `--status fail`, `--designs` for design versions,
175
+ `--json`), MCP `search_screens`. Search matches step and flow titles, ids, paths, URLs, page titles and the H1,
176
+ without caring about diacritics. Use it to find where a pattern is already used before designing a new one, and
177
+ link the screens you reuse in your notes.
178
+
124
179
  ## References
125
180
 
126
181
  - The design reference is an accepted version: `kaloko reference --design --version 4` (a person accepts the