@terreno/mcp 57.12.0 → 57.13.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/dist/docs/upgrades/57.13.0.md +75 -0
- package/dist/docs/versioned/next/explanation/README.md +1 -1
- package/dist/docs/versioned/next/explanation/agent-ui-blocks.md +69 -9
- package/dist/docs/versioned/next/explanation/example-coverage.md +3 -3
- package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +12 -0
- package/dist/docs/versioned/next/how-to/README.md +2 -0
- package/dist/docs/versioned/next/how-to/agent-ui-blocks.md +187 -3
- package/dist/docs/versioned/next/how-to/circleci.md +2 -0
- package/dist/docs/versioned/next/how-to/preview-demo.md +5 -5
- package/dist/docs/versioned/next/how-to/rate-limiting.md +17 -0
- package/dist/docs/versioned/next/how-to/test-ui-accessibility.md +35 -0
- package/dist/docs/versioned/next/implementationPlans/agent-ui-rich-replies.md +359 -0
- package/dist/docs/versioned/next/reference/README.md +1 -1
- package/dist/docs/versioned/next/reference/admin-backend.md +26 -0
- package/dist/docs/versioned/next/reference/admin-frontend.md +15 -0
- package/dist/docs/versioned/next/reference/ai.md +55 -3
- package/dist/docs/versioned/next/reference/api.md +4 -0
- package/dist/docs/versioned/next/reference/blocks.md +243 -11
- package/dist/docs/versioned/next/reference/environment-variables.md +3 -0
- package/dist/docs/versioned/next/reference/ui.md +212 -10
- package/dist/docs/versioned/next/tasks/agent-ui-rich-replies.md +188 -0
- package/package.json +3 -3
- package/src/docs/upgrades/57.13.0.md +75 -0
- package/src/docs/versioned/next/explanation/README.md +1 -1
- package/src/docs/versioned/next/explanation/agent-ui-blocks.md +69 -9
- package/src/docs/versioned/next/explanation/example-coverage.md +3 -3
- package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +12 -0
- package/src/docs/versioned/next/how-to/README.md +2 -0
- package/src/docs/versioned/next/how-to/agent-ui-blocks.md +187 -3
- package/src/docs/versioned/next/how-to/circleci.md +2 -0
- package/src/docs/versioned/next/how-to/preview-demo.md +5 -5
- package/src/docs/versioned/next/how-to/rate-limiting.md +17 -0
- package/src/docs/versioned/next/how-to/test-ui-accessibility.md +35 -0
- package/src/docs/versioned/next/implementationPlans/agent-ui-rich-replies.md +359 -0
- package/src/docs/versioned/next/reference/README.md +1 -1
- package/src/docs/versioned/next/reference/admin-backend.md +26 -0
- package/src/docs/versioned/next/reference/admin-frontend.md +15 -0
- package/src/docs/versioned/next/reference/ai.md +55 -3
- package/src/docs/versioned/next/reference/api.md +4 -0
- package/src/docs/versioned/next/reference/blocks.md +243 -11
- package/src/docs/versioned/next/reference/environment-variables.md +3 -0
- package/src/docs/versioned/next/reference/ui.md +212 -10
- package/src/docs/versioned/next/tasks/agent-ui-rich-replies.md +188 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Task List: Agent UI Rich Replies
|
|
2
|
+
|
|
3
|
+
**Status:** approved 2026-10-07. Start with T1 (or T19, which is independent).
|
|
4
|
+
**IP:** [`docs/implementationPlans/agent-ui-rich-replies.md`](../implementationPlans/agent-ui-rich-replies.md). The contracts, acceptance criteria (AC1–AC14, including AC6b), and open questions are there.
|
|
5
|
+
**Supporting skills:** `terreno-ui`, `terreno-backend-api`, `ai-prompt-governance`, `update-docs`, `verify-ui-changes`, `backend-test-env`.
|
|
6
|
+
|
|
7
|
+
Two write chains share files, so their tasks are ordered.
|
|
8
|
+
|
|
9
|
+
- **Contract chain:** T1 → T2 → T5 → T6 → T7 → T8 → T9. These write `blocks/src/schema.ts`, `limits.ts`, `lint.ts`, `prompt.ts`, fixtures, and `docs/reference/blocks.md`.
|
|
10
|
+
- **Renderer chain:** T1 → T3 → T10 → T11 → T12 → T13 → T14. These write `ui/src/blocks/blockRenderers.tsx`, `BlocksView.test.tsx`, `demo/stories/BlocksView.stories.tsx`, and the BlocksView section of `docs/reference/ui.md`.
|
|
11
|
+
|
|
12
|
+
Each renderer task also waits for its own contract task. T4 sits in the renderer chain between T3 and T10 because it also edits `docs/reference/ui.md`. Every contract task that adds fixtures also edits `blocks/src/parse.test.ts` (`expectedInvalid`); invalid cases that need validate options go in `blocks/src/lint.test.ts`. Fixtures under `valid/` use `data:image` or `file:` image sources.
|
|
13
|
+
|
|
14
|
+
### Phase 1: Tracer
|
|
15
|
+
|
|
16
|
+
- [x] **T1** — Stepper block round trips through a host callback
|
|
17
|
+
- Depends on: none
|
|
18
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/limits.ts`, `blocks/src/errors.ts` (`OUT_OF_RANGE`), `blocks/src/lint.ts` (stepper `callback.name` in `UNKNOWN_HOST_ACTION`; reserved `<id>_increase` / `<id>_decrease` in `DUPLICATE_ID`), `blocks/src/fixtures/valid/stepper*.yaml`, `blocks/src/fixtures/invalid/stepper*.yaml`, `blocks/src/parse.test.ts`, `blocks/src/lint.test.ts`, `blocks/src/index.ts`; `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`; `ai/src/service/agentBlocks.ts` (`findAgentBlock`), `ai/src/service/agentBlocks.test.ts`, `ai/src/service/scaleStepper.ts`, `ai/src/service/scaleStepper.test.ts`, `ai/src/types/index.ts` (`handles?`, `logResponse?` on host actions), `ai/src/routes/gptActions.ts` (honour `logResponse: false`), `ai/src/routes/gptActions.test.ts`, `ai/src/index.ts`; `docs/reference/blocks.md`, `docs/reference/ai.md`, `docs/reference/ui.md`.
|
|
19
|
+
- Delivers:
|
|
20
|
+
- The `stepper` contract from the IP.
|
|
21
|
+
- The renderer: − value +, unit, `itemsTitle`, an items grid formatted with `decimals`, and the note. It emits the callback with `{...payload, value}`. Buttons are disabled at the bounds, while pending, and when the callback is not in `hostActions`.
|
|
22
|
+
- `scaleStepperHostAction`: payload `z.object({value: z.number()}).passthrough()`. It reads the agent's stepper through `findAgentBlock`: `history.prompts[n]` (`msg-<n>`), or the only prompt holding that stepper id (409 when there are several, 404 when none). It checks `value` and returns `{replace: "block", blocks: {v: 1, blocks: [stepper]}}`.
|
|
23
|
+
- The `logResponse` host-action option. With it off, the log keeps the ids-only prompt plus `value`, with no response.
|
|
24
|
+
- Acceptance: AC4; AC5; the stepper rows of AC1 and AC2. `bun test blocks/`, `cd ui && bun test src/blocks`, and `cd ai && bun test --preload ./src/tests/bunSetup.ts src/service/scaleStepper.test.ts src/routes/gptActions.test.ts` are green.
|
|
25
|
+
|
|
26
|
+
- [x] **T2** — Prompt offers the new blocks by default, with an opt-out
|
|
27
|
+
- Depends on: T1
|
|
28
|
+
- Files: `blocks/src/prompt.ts`, `blocks/src/prompt.test.ts`, `blocks/src/validate.ts` (`stepperActions`), `blocks/src/lint.ts`; `ai/src/types/index.ts` (`uiBlocks.richBlocks`), `ai/src/service/prompts.ts`, `ai/src/service/chatTurn.ts` (derive `stepperActions` and `checklistActions` from the host actions' `handles`; pass `richBlocks`), `ai/src/routes/gpt.test.ts`; `docs/reference/blocks.md`, `docs/reference/ai.md`.
|
|
29
|
+
- Delivers: the default-on table in the IP. It adds the `richBlocks` plumbing (default `true` in both `uiBlocks` and `blocksPromptSection`), the stepper gate (a `handles: "stepper"` action), and the `checklistActions` list that T5 uses. With `richBlocks: false`, the prompt text is byte-identical to `master`, even with a stepper action registered. Later contract tasks add their prompt line under `richBlocks`.
|
|
30
|
+
- Acceptance: the AC3 `false` case, the default-on check, and the stepper line; a chat-turn test where a stepper naming a non-stepper action fails `UNKNOWN_HOST_ACTION`. The full on-case snapshot is T9's.
|
|
31
|
+
|
|
32
|
+
### Phase 2: Tables
|
|
33
|
+
|
|
34
|
+
- [x] **T3** — Table block renders typed columns
|
|
35
|
+
- Depends on: T1
|
|
36
|
+
- Files: `ui/src/DataTable.tsx` (number and date cells), `ui/src/DataTable.test.tsx`, `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `docs/reference/ui.md` (DataTable and BlocksView sections).
|
|
37
|
+
- Delivers: right-aligned `number` cells and Luxon `DATE_MED` `date` cells in `DataTable`. The `table` block maps the dataset column types to these cells, measures its width with `onLayout`, and splits the width evenly, at least 96 per column, scrolling sideways past that.
|
|
38
|
+
- Acceptance: AC9 (table half); the new tests fail on `master`.
|
|
39
|
+
|
|
40
|
+
- [x] **T4** — Markdown tables in `text` get theme styling
|
|
41
|
+
- Depends on: T3 (shares `docs/reference/ui.md`; T10 follows T4 for the same reason)
|
|
42
|
+
- Files: `ui/src/MarkdownView.tsx`, `ui/src/MarkdownView.test.tsx`, `docs/reference/ui.md` (MarkdownView section only).
|
|
43
|
+
- Delivers: `border.default` cell borders, a bold header on `surface.secondaryLight`, and horizontal scroll when the table is wide.
|
|
44
|
+
- Acceptance: AC9 (markdown half); the test fails on `master`.
|
|
45
|
+
|
|
46
|
+
### Phase 3: Contracts
|
|
47
|
+
|
|
48
|
+
- [x] **T5** — `checklist` contract
|
|
49
|
+
- Depends on: T2
|
|
50
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/limits.ts`, `blocks/src/lint.ts` (item ids; reserved `<id>_<item id>` element ids; checklist `callback.name` against `checklistActions`), `blocks/src/prompt.ts`, `blocks/src/fixtures/{valid,invalid}/checklist*.yaml`, `blocks/src/parse.test.ts`, `docs/reference/blocks.md`.
|
|
51
|
+
- Delivers: the `checklist` schema from the IP, including the optional `callback`. Its prompt line sits under `richBlocks` and names the checklist action when there is one.
|
|
52
|
+
- Acceptance: the checklist rows of AC1 and AC3; `bun test blocks/`.
|
|
53
|
+
|
|
54
|
+
- [x] **T6** — `gallery` contract
|
|
55
|
+
- Depends on: T5
|
|
56
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/limits.ts`, `blocks/src/lint.ts` (image hosts per tile), `blocks/src/prompt.ts`, `blocks/src/fixtures/{valid,invalid}/gallery*.yaml`, `blocks/src/parse.test.ts`, `docs/reference/blocks.md`.
|
|
57
|
+
- Delivers: the `gallery` schema. `IMAGE_HOST_NOT_ALLOWED` names the tile path (`blocks[0].images[2].src`).
|
|
58
|
+
- Acceptance: the gallery rows of AC1 and AC3; an invalid fixture with a disallowed host.
|
|
59
|
+
|
|
60
|
+
- [x] **T7** — `list` contract
|
|
61
|
+
- Depends on: T6
|
|
62
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/limits.ts`, `blocks/src/lint.ts`, `blocks/src/prompt.ts`, `blocks/src/fixtures/{valid,invalid}/list*.yaml`, `blocks/src/parse.test.ts`, `docs/reference/blocks.md`.
|
|
63
|
+
- Delivers: the `list` schema. The optional image on each item goes through image-host lint.
|
|
64
|
+
- Acceptance: the list rows of AC1 and AC3.
|
|
65
|
+
|
|
66
|
+
- [x] **T8** — `card.eyebrow` contract
|
|
67
|
+
- Depends on: T7
|
|
68
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/limits.ts`, `blocks/src/prompt.ts`, `blocks/src/fixtures/{valid,invalid}/card-eyebrow*.yaml`, `blocks/src/parse.test.ts`, `docs/reference/blocks.md`.
|
|
69
|
+
- Delivers: an optional `eyebrow` (1–60) on `card`.
|
|
70
|
+
- Acceptance: the eyebrow rows of AC1 and AC3.
|
|
71
|
+
|
|
72
|
+
- [x] **T9** — `copy` action contract and `blockPlainText`
|
|
73
|
+
- Depends on: T8
|
|
74
|
+
- Files: `blocks/src/schema.ts`, `blocks/src/errors.ts` (`COPY_TARGET_INVALID`), `blocks/src/lint.ts` (exactly one of `text` / `target`, as `open` does), `blocks/src/prompt.ts`, `blocks/src/plainText.ts`, `blocks/src/plainText.test.ts`, `blocks/src/index.ts`, `blocks/src/fixtures/{valid,invalid}/copy*.yaml`, `blocks/src/parse.test.ts`, `docs/reference/blocks.md`.
|
|
75
|
+
- Delivers: the `copy` action kind, target lint, and `blockPlainText` as the IP table describes it.
|
|
76
|
+
- Acceptance: the copy rows of AC1, AC2, and AC3; the full AC3 `richBlocks`-on snapshot. `plainText.test.ts` covers every row of the IP table.
|
|
77
|
+
|
|
78
|
+
### Phase 4: Renderers
|
|
79
|
+
|
|
80
|
+
- [x] **T10** — Checklist renders and toggles
|
|
81
|
+
- Depends on: T3, T4, T5
|
|
82
|
+
- Files: `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/useChecklistState.ts`, `ui/src/blocks/BlocksView.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `demo/stories/BlocksView.stories.tsx`, `docs/reference/ui.md`.
|
|
83
|
+
- Delivers: a `CheckBox` row per item (meta, bold text, detail) and the "n of m" counter. With a callback in `hostActions`, a tick emits `{...payload, itemId, checked, state}`, disables the whole checklist while a tick is pending (so a second tick cannot send a stale `state`), and shows the returned block. Without one, ticks are local for each rendered document.
|
|
84
|
+
- Acceptance: AC6.
|
|
85
|
+
|
|
86
|
+
- [x] **T11** — Gallery renders
|
|
87
|
+
- Depends on: T6, T10
|
|
88
|
+
- Files: `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `demo/stories/BlocksView.stories.tsx`, `docs/reference/ui.md`.
|
|
89
|
+
- Delivers: one row of 4:3 `Image` tiles up to 3, a 3-column grid above that, captions, `file:` ids through `useResolvedImages`, and sideways scroll on narrow screens.
|
|
90
|
+
- Acceptance: AC7 (gallery).
|
|
91
|
+
|
|
92
|
+
- [x] **T12** — List renders
|
|
93
|
+
- Depends on: T7, T11
|
|
94
|
+
- Files: `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `demo/stories/BlocksView.stories.tsx`, `docs/reference/ui.md`.
|
|
95
|
+
- Delivers: for each item, a 3:4 thumbnail on the left, a bold title, muted text, and the meta.
|
|
96
|
+
- Acceptance: AC7 (list).
|
|
97
|
+
|
|
98
|
+
- [x] **T13** — Card eyebrow renders
|
|
99
|
+
- Depends on: T8, T12
|
|
100
|
+
- Files: `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `docs/reference/ui.md`.
|
|
101
|
+
- Delivers: small, muted eyebrow text above the card title.
|
|
102
|
+
- Acceptance: AC7 (eyebrow).
|
|
103
|
+
|
|
104
|
+
- [x] **T14** — Copy action writes the clipboard
|
|
105
|
+
- Depends on: T9, T13
|
|
106
|
+
- Files: `ui/src/blocks/BlocksView.tsx`, `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `docs/reference/ui.md`.
|
|
107
|
+
- Delivers: a copy button builds its text with `blockPlainText` from the current block (override and toggles applied), writes it with `expo-clipboard`, and shows "Copied" in a polite live region for 2 s. It never calls `onAction`.
|
|
108
|
+
- Acceptance: AC8.
|
|
109
|
+
|
|
110
|
+
### Phase 5: The roast reply end to end
|
|
111
|
+
|
|
112
|
+
- [x] **T15** — Sunday roast golden document and playground story
|
|
113
|
+
- Depends on: T14
|
|
114
|
+
- Files: `blocks/src/fixtures/golden/sunday-roast.yaml`, `blocks/src/golden.test.ts` (validate with `hostActions: ["scaleStepper"]`, `stepperActions: ["scaleStepper"]`, `imageHosts: ["images.example.com"]`), `demo/stories/BlocksPlayground.stories.tsx` (a roast preset).
|
|
115
|
+
- Delivers: the GPT-6 demo reply as one document: the title; the gallery; the summary card with an eyebrow; the menu list; the stepper and copy card; the checklist with its first item checked; the USDA note as `context`; the tips as `text`; and follow-up `reply` buttons. It also includes the GPT-5.6 "How much lamb?" table as a `table` block. Images use `https://images.example.com/...` and validate only with `imageHosts`, so the file lives under `golden/`, not `valid/`.
|
|
116
|
+
- Acceptance: AC10; a playground screenshot under `/opt/cursor/artifacts/`.
|
|
117
|
+
|
|
118
|
+
- [x] **T16** — Example app runs the roast reply against the real callback route
|
|
119
|
+
- Depends on: T15, T20, T21
|
|
120
|
+
- Files:
|
|
121
|
+
- `example-backend/src/ai/hostActions.ts`: register `scaleStepper: scaleStepperHostAction` and `toggleChecklist: toggleChecklistHostAction` (`richBlocks` is on by default).
|
|
122
|
+
- `example-frontend/app/(tabs)/ai.tsx`: add `scaleStepper` and `toggleChecklist` to `hostActions`.
|
|
123
|
+
- `example-frontend/e2e/helpers/seedGptHistory.ts` (new): `POST /gpt/histories` as the logged-in user, with the roast document as the assistant prompt.
|
|
124
|
+
- `example-frontend/e2e/helpers/mockGpt.ts`: the mocked stream returns the seeded `historyId`, and `/gpt/actions` is no longer mocked for this spec.
|
|
125
|
+
- `example-frontend/e2e/ai-chat.spec.ts`.
|
|
126
|
+
- `docs/explanation/example-coverage.md`.
|
|
127
|
+
- Delivers: the seeded roast document uses `file:` ids from a test `PhotoLibraryEntry`. Playwright presses + (5 → 6, the quantities change) and ticks a checklist item, both through the real `POST /gpt/actions`, then presses copy. Only the signed-URL image download is stubbed.
|
|
128
|
+
- Acceptance: AC11.
|
|
129
|
+
|
|
130
|
+
- [x] **T17** — Model smoke: a real model writes the roast reply
|
|
131
|
+
- Depends on: T15, T20
|
|
132
|
+
- Files: `example-backend/src/scripts/blocksSmoke.ts`, `example-backend/package.json` and root `package.json` (`blocks:smoke` script).
|
|
133
|
+
- Delivers: a script that runs the post's prompt through `AIService` with the opted-in blocks prompt and checks the reply. It skips cleanly when no model key is set.
|
|
134
|
+
- Acceptance: AC12.
|
|
135
|
+
|
|
136
|
+
- [x] **T18** — Docs sweep, changelog, rules
|
|
137
|
+
- Depends on: T15, T20, T21
|
|
138
|
+
- Files:
|
|
139
|
+
- `docs/explanation/agent-ui-blocks.md`: the catalog list, adding the missing `callout`, `image`, `details`, and `html`; why the stepper is a callback; the default-on rollout and the `richBlocks: false` opt-out for shipped native builds.
|
|
140
|
+
- `docs/how-to/agent-ui-blocks.md`: a section "Add a stepper callback", including the warning that stored history prompts are owner-writable, so a handler whose numbers matter must use its own data.
|
|
141
|
+
- `changelog/unreleased/agent-ui-rich-replies.md`, with a "Behaviour change" note: hosts with `uiBlocks` get the new blocks in the prompt by default; set `uiBlocks.richBlocks: false` to keep the old catalog.
|
|
142
|
+
- `.rulesync/rules/ui/00-ui.md` and `.rulesync/rules/ai/00-ai.md`, then `bun run rules`.
|
|
143
|
+
- Delivers: docs a stranger can follow to build the roast reply without reading the PR.
|
|
144
|
+
- Acceptance: AC13.
|
|
145
|
+
|
|
146
|
+
- [x] **T19** — Generated photo library: generate images once and store them
|
|
147
|
+
- Depends on: none
|
|
148
|
+
- Files: `example-backend/src/models/photoLibraryEntry.ts`, `example-backend/src/types/models/photoLibraryEntryTypes.ts`, `example-backend/src/scripts/photoPrompts.ts`, `example-backend/src/scripts/generatePhotoLibrary.ts`, `example-backend/src/scripts/generatePhotoLibrary.test.ts`, `knip.jsonc` (script entry), `example-backend/package.json` (`photos:generate`).
|
|
149
|
+
- Delivers: the `PhotoLibraryEntry` model and the `photos:generate` script from the IP. It runs AI SDK `generateImage` with the Vertex image model, then `FileStorageService.upload`, then upserts by `prompt`. It validates the required env up front, skips existing prompts, and takes `--force`. Supporting skill: `mongoose-schema-safety`.
|
|
150
|
+
- Acceptance: AC14 (generation half), using a fake image model and fake storage.
|
|
151
|
+
|
|
152
|
+
- [x] **T20** — `findPhotos` tool and photo URLs in the example app
|
|
153
|
+
- Depends on: T19
|
|
154
|
+
- Files: `example-backend/src/ai/tools.ts` (`findPhotos`), `example-backend/src/ai/tools.test.ts`, `example-backend/src/api/photoLibrary.ts` (`modelRouter` with instance action `url`), `example-backend/src/api/photoLibrary.test.ts`, `example-backend/src/server.ts` (register it), `example-frontend/store/openApiSdk.ts` (regenerated with `bun run sdk`), `example-frontend/app/(tabs)/ai.tsx` (`resolveImage`), `docs/how-to/agent-ui-blocks.md` ("Give the agent photos"; T18 follows it).
|
|
155
|
+
- Delivers: `findPhotos({query, count})` returns `{src: "file:<id>", alt}` from the library. `GET /photoLibrary/:id/url` returns a signed URL to any authenticated user. The example chat resolves `file:` ids through the generated hook. Supporting skills: `model-router-actions`, `generate-sdk`.
|
|
156
|
+
- Acceptance: AC14 (tool and route half).
|
|
157
|
+
|
|
158
|
+
- [x] **T21** — Checklist ticks round trip through a host callback
|
|
159
|
+
- Depends on: T10
|
|
160
|
+
- Files: `ai/src/service/toggleChecklist.ts`, `ai/src/service/toggleChecklist.test.ts`, `ai/src/routes/gptActions.test.ts`, `ai/src/index.ts`, `docs/reference/ai.md`.
|
|
161
|
+
- Delivers: `toggleChecklistHostAction` from the IP, built on `findAgentBlock`.
|
|
162
|
+
- Acceptance: AC6b.
|
|
163
|
+
|
|
164
|
+
### Phase 6: Playground follow-up (D7)
|
|
165
|
+
|
|
166
|
+
- [x] **T22** — Every block type has a playground preset
|
|
167
|
+
- Depends on: T15
|
|
168
|
+
- Files: `demo/stories/BlocksPlayground.stories.tsx`, `demo/story-config/BlocksPlayground.config.tsx`, a demo test that every schema block type appears in a preset and every preset validates.
|
|
169
|
+
- Delivers: one preset per block type plus "All blocks", covering every action kind and the segmented control.
|
|
170
|
+
- Acceptance: the coverage test fails when a block type has no preset; every preset validates; runtime screenshots at 1280 and 390.
|
|
171
|
+
|
|
172
|
+
- [x] **T23** — Stepper and checklist callbacks run in the playground
|
|
173
|
+
- Depends on: T22
|
|
174
|
+
- Files: `blocks/src/hostActionLogic.ts` (or similar) + tests + `blocks/src/index.ts`, `ai/src/service/scaleStepper.ts`, `ai/src/service/toggleChecklist.ts`, `demo/stories/BlocksPlayground.stories.tsx`, `docs/reference/blocks.md`.
|
|
175
|
+
- Delivers: pure `scaleStepperBlock` and `applyChecklistState` in `@terreno/blocks`, used by both host actions and the playground; other actions show a toast.
|
|
176
|
+
- Acceptance: in the playground, + shows 6 and "2.4 kg", a tick shows "2 of 8", a reply button shows a toast; ai host-action tests unchanged and green.
|
|
177
|
+
|
|
178
|
+
- [x] **T24** — Checklist rows read bold title, then time, then description
|
|
179
|
+
- Depends on: none
|
|
180
|
+
- Files: `ui/src/blocks/blockRenderers.tsx`, `ui/src/blocks/BlocksView.test.tsx`, `docs/reference/ui.md`.
|
|
181
|
+
- Delivers: the row order from D7, test IDs unchanged.
|
|
182
|
+
- Acceptance: a test asserts the order; the e2e roast spec still passes.
|
|
183
|
+
|
|
184
|
+
- [x] **T25** — Demo blocks use real photos
|
|
185
|
+
- Depends on: T22
|
|
186
|
+
- Files: `demo/assets/blocks/*.jpg`, `demo/assets/blocks/ATTRIBUTION.md`, `demo/stories/BlocksView.stories.tsx`, `demo/stories/BlocksPlayground.stories.tsx`.
|
|
187
|
+
- Delivers: gallery, list, and image presets and stories show bundled public-domain photos through `file:` ids and `resolveImage`.
|
|
188
|
+
- Acceptance: in the browser every photo loads (`naturalWidth` 800); attribution lists each source and license.
|