@eventmodelers/cli 1.0.156 → 1.0.158
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 +2 -2
- package/package.json +1 -1
- package/shared/skills/load-slice/SKILL.md +64 -3
- package/shared/skills/request-feedback/SKILL.md +32 -0
- package/shared/skills/ui-contract/SKILL.md +3 -1
- package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/axon/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/blank/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/blank/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/blank/templates/build-kit/CLAUDE.md +2 -2
- package/stacks/blank/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/classic/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/classic/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/classic/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/kurrent/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/kurrent/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/kurrent/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/node/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/opencqrs/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/opencqrs/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/opencqrs/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +1 -1
- package/stacks/umadb/templates/.claude/skills/build-state-change/SKILL.md +1 -1
- package/stacks/umadb/templates/.claude/skills/build-state-view/SKILL.md +1 -1
- package/stacks/umadb/templates/build-kit/lib/backend-prompt.md +1 -1
package/README.md
CHANGED
|
@@ -202,7 +202,7 @@ and the agent starts building — `--local` skips platform config and credential
|
|
|
202
202
|
|
|
203
203
|
**Backend → UI handover.** Besides the usual statuses a slice can be `Ready` (modeling done, waiting to be planned) and `Handover` (backend built, UI contract published, waiting for the UI kit). The flow is `Ready → Planned → InProgress → Handover → InProgress → Done`. Install with `init --handover` (or `re-init --handover`; switch later with `eventmodelers config --handover on|off`; for a single run `run --handover` overrides the setting without saving anything), which saves `"handover": true` in `.eventmodelers/config.json` — then a backend kit ends STATE_VIEW / STATE_CHANGE slices at `Handover` instead of `Done` (the `ui-contract` skill, Step 4, owns that rule); without the flag nothing changes: slices end at `Done`, exactly as before. A kit claims work from the status named in its `lib/kit.json` — `{ "pickupStatus": "Handover" }` for the `react` / `supabase-react` UI kits, absent (= `Planned`) for backend kits. A new UI kit ships that file and sets `Done` when its half is built; a new backend kit just invokes `ui-contract`. Needs a platform with the `Ready` / `Handover` statuses.
|
|
204
204
|
|
|
205
|
-
**UI contract.**
|
|
205
|
+
**UI contract (handover only).** With handover on, the scaffolded `build-state-view` / `build-state-change` skills end by invoking the shared `ui-contract` skill, which publishes each slice's read (`GET`) or write (`POST`) contract — the endpoint's OpenAPI operation, as a ```` ```yaml ui-contract ```` block — as a `## UI Contract` section in the slice's feedback-lane markdown node (exported in `slice.json` `notes[]`, so a UI build kit can look it up directly). Two things are yours to decide: *where the contract is derived from* (point the `UI Contract` section of those skills at your stack's machine-readable API description, if it has one — the `node`/`supabase` stacks use their `@openapi` blocks via a `ui-contract-from-openapi.md` reference, taking the operation verbatim — otherwise the skill writes the equivalent OpenAPI operation from the route code), and, if you need a different shape or location, a whole-skill override: ship `.claude/skills/ui-contract/SKILL.md` in the stack's templates and it replaces the shared one (stack templates are applied after `shared/skills/`).
|
|
206
206
|
|
|
207
207
|
Installing both a build stack and `init-modeling` into the same project reuses this one `.eventmodelers/config.json` — run whichever `init` command second and it finds the existing config already satisfies the required fields and skips straight past the credential prompt.
|
|
208
208
|
|
|
@@ -668,7 +668,7 @@ npx @eventmodelers/cli run --handover # this run only — writes
|
|
|
668
668
|
|
|
669
669
|
| | Handover off (default) | Handover on |
|
|
670
670
|
|---|---|---|
|
|
671
|
-
| Backend kit, STATE_VIEW / STATE_CHANGE slice | ends at `Done
|
|
671
|
+
| Backend kit, STATE_VIEW / STATE_CHANGE slice | ends at `Done`, no UI contract published | publishes the UI contract, ends at `Handover` |
|
|
672
672
|
| Backend kit, automation / translation | `Done` | `Done` — no UI counterpart |
|
|
673
673
|
| UI kit (`react`, `supabase-react`) | claims `Handover` only | claims `Handover` only, sets `Done` when its UI is built |
|
|
674
674
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventmodelers/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.158",
|
|
4
4
|
"description": "Eventmodelers CLI — real-time Claude agent + skills for Claude Code, for any stack (Node, Supabase, Axon, OpenCQRS, UmaDB, Kurrent, or modeling-only)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,7 +22,28 @@ If neither is provided, load and persist all slices without filtering.
|
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
25
|
-
## Step 2 — Fetch
|
|
25
|
+
## Step 2 — Fetch the slice(s) from the slicedata API
|
|
26
|
+
|
|
27
|
+
### When `sliceId` is given: fetch exactly that one slice — never all
|
|
28
|
+
|
|
29
|
+
Do **not** fetch the board's full slice data, and do not loop over contexts. Only the one slice's full
|
|
30
|
+
definition is fetched, and only that one is persisted in Step 3:
|
|
31
|
+
|
|
32
|
+
1. **Context known?** If the caller passed a `contextId` (or the chapter id), skip to 3.
|
|
33
|
+
2. **Otherwise locate it with one summary call** — `list_slices { "boardId": "<BOARD_ID>" }` (or the
|
|
34
|
+
`slicedata/slices` curl below). This is a lookup only: take the entry whose `id === sliceId` and read
|
|
35
|
+
its `contextName`. Don't persist or fan out over the rest of the list. If the id isn't in the list, stop
|
|
36
|
+
and report it.
|
|
37
|
+
3. **Resolve the context id unambiguously** (see "A name is not a safe key" below — chapters can share a
|
|
38
|
+
title), then fetch the full slice with one call:
|
|
39
|
+
`get_slice_data { "boardId": "<BOARD_ID>", "contextId": "<contextId>", "sliceId": "<sliceId>" }`
|
|
40
|
+
(curl: `GET …/slicedata?contextId=<contextId>&sliceId=<sliceId>`).
|
|
41
|
+
4. `ALL_SLICES` is then just that one slice; Step 3 persists only it.
|
|
42
|
+
|
|
43
|
+
A `sliceTitle` without an id is resolved to an id via the same one summary call (stop and ask if the
|
|
44
|
+
title matches more than one slice), then continues from step 3.
|
|
45
|
+
|
|
46
|
+
### When neither is given: load all slices
|
|
26
47
|
|
|
27
48
|
Prefer the MCP tool when `mcp__eventmodelers__*` tools are visible in this session:
|
|
28
49
|
|
|
@@ -40,6 +61,22 @@ This call stays full (no `projection`): Step 3 persists the complete slice objec
|
|
|
40
61
|
|
|
41
62
|
(`get_slice_data` requires a `contextName` or `contextId`. If the context isn't already known, list the context names in one call — `mcp__eventmodelers__get_nodes { "boardId": "<BOARD_ID>", "type": "MODEL_CONTEXT", "projection": "line" }` (only titles needed; a timeline name works as `contextName` too, so fall back to `type: "CHAPTER"` with `projection: "line"` when there are no MODEL_CONTEXT nodes) — then map slices to contexts with `list_slices { "boardId": "<BOARD_ID>", "contextName": "<name>" }` per context. Don't `get_node` each `SLICE_BORDER`.)
|
|
42
63
|
|
|
64
|
+
**A name is not a safe key — chapters and contexts can share a title.** The backend resolves `contextName`
|
|
65
|
+
to the *first* chapter/context whose title matches (case-insensitive) and silently returns nothing
|
|
66
|
+
if that one holds no slices — even when a same-titled twin holds them. A `SLICE_NOT_FOUND` (404) or an
|
|
67
|
+
empty `slices: []` for a slice that `list_slices` clearly shows is therefore **not** proof the slice is
|
|
68
|
+
missing. Before trusting it:
|
|
69
|
+
|
|
70
|
+
1. List the chapters (`get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER", "projection": "line" }`)
|
|
71
|
+
and the MODEL_CONTEXT nodes. If two or more share the title in question, **warn in the output**
|
|
72
|
+
(`Duplicate chapter title "<title>": <id1>, <id2>`) and retry the full fetch with **`contextId`**
|
|
73
|
+
set to each candidate id until the slice is found — `contextId` is matched exactly, so it is
|
|
74
|
+
unambiguous.
|
|
75
|
+
2. Only if it is not found under any candidate id is the slice really absent.
|
|
76
|
+
|
|
77
|
+
Prefer `contextId` over `contextName` whenever the id is known (a calling harness that already has the
|
|
78
|
+
chapter id, or the list entry's `contextId`).
|
|
79
|
+
|
|
43
80
|
**Fallback (no MCP):**
|
|
44
81
|
|
|
45
82
|
```bash
|
|
@@ -57,7 +94,22 @@ Save the full array as `ALL_SLICES`.
|
|
|
57
94
|
|
|
58
95
|
## Step 3 — Persist slices to .build-kit/.slices/ directory
|
|
59
96
|
|
|
60
|
-
Apply the following logic for every slice in `ALL_SLICES
|
|
97
|
+
Apply the following logic for every slice in `ALL_SLICES` — **or, when `sliceId`/`sliceTitle` was given,
|
|
98
|
+
only for that one slice** (and only its own context's `index.json`). Don't rewrite 90 other slices'
|
|
99
|
+
folders and indexes to load one; they may hold uncommitted local changes.
|
|
100
|
+
|
|
101
|
+
**`slice.json` must be the full slice, never the list entry.** The `list_slices` / `slicedata/slices`
|
|
102
|
+
payload is a summary (id, title, status, type, context name — no commands, events, fields, specs or
|
|
103
|
+
comments). If the full fetch (Step 2) for a requested slice failed or came back without elements, do
|
|
104
|
+
**not** write the summary as `slice.json` — it reads as an empty slice and has made agents conclude
|
|
105
|
+
"nothing to build". Stop and report the failed fetch instead (see the duplicate-title handling in Step 2).
|
|
106
|
+
|
|
107
|
+
**Check for collisions before writing.** Two slices in one `<contextSlug>` whose `<sliceFolder>` is
|
|
108
|
+
identical (same title, or titles differing only by spaces/case) would overwrite each other, and so
|
|
109
|
+
would two contexts that slugify identically. Detect this before writing; on a collision, don't write
|
|
110
|
+
either, and report it: `Slice folder collision in <contextSlug>: "<title>" (<idA>, <status>) vs
|
|
111
|
+
"<title>" (<idB>, <status>)`. Also report same-titled slices that don't collide (different contexts) as
|
|
112
|
+
a one-line warning, so callers address slices by id.
|
|
61
113
|
|
|
62
114
|
### Derive paths
|
|
63
115
|
|
|
@@ -132,7 +184,9 @@ If `sliceId` was given: find the entry in `ALL_SLICES` where `id === sliceId`.
|
|
|
132
184
|
If `sliceTitle` was given: find the entry where `title` matches case-insensitively.
|
|
133
185
|
If neither: return all slices.
|
|
134
186
|
|
|
135
|
-
If a specific slice was requested but not found, stop and list the available titles
|
|
187
|
+
If a specific slice was requested but not found, stop and list the available titles — after ruling out the
|
|
188
|
+
duplicate-chapter-title case from Step 2. If several slices share the requested title, don't pick one:
|
|
189
|
+
list them with their ids, contexts and statuses and ask the caller to choose by id.
|
|
136
190
|
|
|
137
191
|
---
|
|
138
192
|
|
|
@@ -157,4 +211,11 @@ All slices (<count>) — context: <contextSlug>:
|
|
|
157
211
|
- ...
|
|
158
212
|
```
|
|
159
213
|
|
|
214
|
+
Append any warnings collected above (duplicate chapter titles, same-titled slices, folder collisions):
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
Warnings:
|
|
218
|
+
- Duplicate chapter title "Teams": d151f017-… , e985e6b3-… (slice found under e985e6b3-…)
|
|
219
|
+
```
|
|
220
|
+
|
|
160
221
|
Make the matched slice's `id`, `title`, `status`, and local folder path available to subsequent steps in the same session.
|
|
@@ -71,6 +71,37 @@ Find the slice whose `title` matches `sliceName` (case-insensitive), or whose `i
|
|
|
71
71
|
If no match is found, stop and list the available slice titles so the caller can pick one. Save the
|
|
72
72
|
matched slice's `id` as `SLICE_NODE_ID` and its current `status` as `CURRENT_STATUS`.
|
|
73
73
|
|
|
74
|
+
## Step 2.5 — Verify the slice is really empty, and check for duplicate names
|
|
75
|
+
|
|
76
|
+
"The slice has no elements" is the most common reason to block — and also the easiest to get wrong.
|
|
77
|
+
The backend resolves `contextName` to the *first* chapter/context with a matching title, so when two
|
|
78
|
+
chapters share a title, `slicedata?contextName=…` (and `slicedata/slices?contextName=…`) can return
|
|
79
|
+
nothing for a slice that is fully modeled under the twin. A comment claiming "no elements" then
|
|
80
|
+
blocks a healthy slice. Before posting anything:
|
|
81
|
+
|
|
82
|
+
1. **Fetch the slice by id, not by name.** Resolve the slice's chapter/context id and call
|
|
83
|
+
`get_slice_data { "boardId": "<BOARD_ID>", "contextId": "<id>", "sliceId": "<SLICE_NODE_ID>" }`
|
|
84
|
+
(curl: `GET …/slicedata?contextId=<id>&sliceId=<SLICE_NODE_ID>`). Fetch only this one slice.
|
|
85
|
+
2. **Check for duplicate chapter/context titles.** List chapters and MODEL_CONTEXT nodes
|
|
86
|
+
(`get_nodes { "boardId": "<BOARD_ID>", "type": "CHAPTER", "projection": "line" }`, and likewise
|
|
87
|
+
`MODEL_CONTEXT`). If two or more share the slice's chapter/context title (case-insensitive), retry
|
|
88
|
+
step 1 with each candidate `contextId` before concluding the slice is empty.
|
|
89
|
+
3. **Check for duplicate slice names.** From the `list_slices` result, note any other slice with the
|
|
90
|
+
same title (case-insensitive) — in the same or another context — with its id and status.
|
|
91
|
+
4. **Decide:**
|
|
92
|
+
- The slice has elements under some candidate id → **do not block, do not comment.** The "empty"
|
|
93
|
+
reading was a lookup artefact; go back and build using the correct `contextId`. Report the
|
|
94
|
+
duplicate-title problem to the caller instead.
|
|
95
|
+
- The slice really is empty (or contradictory) under every candidate → continue to Step 3, and
|
|
96
|
+
**name every duplicate you found in the question**, e.g. `Note: 2 timelines are titled "Teams"
|
|
97
|
+
(d151f017-…, e985e6b3-…) and a slice "Add Team" also exists in <context> (<id>, <status>) — please
|
|
98
|
+
check the content isn't under the twin.` so the human can tell a genuinely empty slice from a
|
|
99
|
+
misplaced one.
|
|
100
|
+
- Duplicates exist but the cause of the block is unrelated (e.g. a contradiction between two
|
|
101
|
+
specs): still mention them in the report (Step 5), not necessarily in the comment.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
74
105
|
## Step 3 — Post the comment
|
|
75
106
|
|
|
76
107
|
There is no separate `QUESTION` type at the API level — post a normal `COMMENT` worded as a question.
|
|
@@ -138,6 +169,7 @@ Do not continue implementing the slice after this. Report back to whoever invoke
|
|
|
138
169
|
Requested feedback on slice "<sliceName>" (<SLICE_NODE_ID>)
|
|
139
170
|
Question posted: "<question>"
|
|
140
171
|
Status: <CURRENT_STATUS> → Blocked
|
|
172
|
+
Duplicates: <none | duplicate chapter titles "<title>" (<ids>) | same-titled slices "<title>" (<id> <status>, …)>
|
|
141
173
|
```
|
|
142
174
|
|
|
143
175
|
Then stop work on this slice for this run. If the caller has other, unrelated slices queued, it may
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ui-contract
|
|
3
|
-
description:
|
|
3
|
+
description: When handover is on (`run --handover`), publish the slice's UI contract — the OpenAPI operation of its endpoint (read = GET, write/state-change = POST) — as its own `## UI Contract` section in the slice's MARKDOWN node in the feedback lane, which the slice export carries in `slice.json` `notes[]` — so the UI build kit finds the contract in one lookup instead of parsing the whole note. Called by every build-state-view / build-state-change skill after the endpoint is built. A build kit can override it by shipping its own `ui-contract` skill.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# UI Contract
|
|
@@ -18,6 +18,8 @@ records that as a contract — the endpoint's **OpenAPI operation**, one per sli
|
|
|
18
18
|
|
|
19
19
|
## When
|
|
20
20
|
|
|
21
|
+
**Only when handover is on** — the task request's `Handover: on|off` line (authoritative; the runner resolves `run --handover` over the project setting), else `"handover": true` in `.eventmodelers/config.json`. With handover **off/unset**, do nothing: publish no contract, write no `## UI Contract` section, and finish the slice as `Done` (Step 4). The contract exists only for the UI kit that picks up `Handover` slices.
|
|
22
|
+
|
|
21
23
|
At the end of building a slice, **after** the endpoint exists (so the contract describes the real
|
|
22
24
|
route, not the plan), before the final commit:
|
|
23
25
|
|
|
@@ -437,7 +437,7 @@ leave it undocumented rather than fabricating an assertion.
|
|
|
437
437
|
|
|
438
438
|
## UI Contract
|
|
439
439
|
|
|
440
|
-
|
|
440
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
441
441
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
442
442
|
(a build kit may override it).
|
|
443
443
|
|
|
@@ -321,7 +321,7 @@ class {SliceName}ProjectorTest {
|
|
|
321
321
|
|
|
322
322
|
## UI Contract
|
|
323
323
|
|
|
324
|
-
|
|
324
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
325
325
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
326
326
|
(a build kit may override it).
|
|
327
327
|
|
|
@@ -36,7 +36,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
36
36
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
37
37
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
38
38
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
39
|
-
12.
|
|
39
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
40
40
|
13. Run quality checks — it is enough to run the tests for the slice only, not all tests:
|
|
41
41
|
- Compile: `./mvnw compile -q`
|
|
42
42
|
- Test: `./mvnw test -Dtest="<SliceName>*" -q`
|
|
@@ -44,7 +44,7 @@ TODO — this stack's build command and how to run only this slice's tests (not
|
|
|
44
44
|
|
|
45
45
|
## UI Contract
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes the contract
|
|
48
48
|
as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it.
|
|
49
49
|
|
|
50
50
|
TODO — **Source for this stack:** say where the contract is derived from. If your stack maintains a
|
|
@@ -43,7 +43,7 @@ TODO — this stack's build command and how to run only this slice's tests (not
|
|
|
43
43
|
|
|
44
44
|
## UI Contract
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes the contract
|
|
47
47
|
as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it.
|
|
48
48
|
|
|
49
49
|
TODO — **Source for this stack:** say where the contract is derived from. If your stack maintains a
|
|
@@ -58,7 +58,7 @@ TODO
|
|
|
58
58
|
|
|
59
59
|
## UI Contract
|
|
60
60
|
|
|
61
|
-
`build-state-view` and `build-state-change` end by invoking the shared `ui-contract` skill (publishes the
|
|
62
|
-
slice's read/write contract for the UI build kit). Decide for your stack where it is derived from — see
|
|
61
|
+
`build-state-view` and `build-state-change` end by invoking the shared `ui-contract` skill when handover is on (publishes the
|
|
62
|
+
slice's read/write contract for the UI build kit; skipped with handover off). Decide for your stack where it is derived from — see
|
|
63
63
|
the `UI Contract` section of those two skills — or override the skill entirely by shipping
|
|
64
64
|
`.claude/skills/ui-contract/SKILL.md`.
|
|
@@ -30,7 +30,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
30
30
|
9. Analyze and Implement that single slice, making use of the skills in the skills directory plus your previously collected knowledge. Make a TODO list for what needs to be done, and adjust the implementation according to the JSON definition. Carefully inspect events, fields and compare against the implemented slice. JSON is the desired state. ATTENTION: a "planned" task can also be just added specifications. So always look at the slice itself, but also the specifications. If specifications were added in json which are not on code, you need to add them in code.
|
|
31
31
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
32
32
|
11. Slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it fulfills the slice.json. There must be no specification in json that has no equivalent in code.
|
|
33
|
-
12.
|
|
33
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
34
34
|
13. Run quality checks — TODO: your stack's build command, TODO: your stack's test command (slice-scoped only; do not run all tests).
|
|
35
35
|
14. If checks pass, commit ALL changes with message: `feat: [Slice Name]` and merge back to main as FF merge (update first)
|
|
36
36
|
15. Update the PRD to set `status: Done` for the completed story in index.json **and** update the slice status on the eventmodelers board using the `update-slice-status` skill (or MCP if available). For STATE_VIEW/STATE_CHANGE slices when `handover` is enabled the status to set is `Handover`, not `Done` — see the `ui-contract` skill, Step 4.
|
|
@@ -103,7 +103,7 @@ After the commit, invoke `/record-evidence`: it writes this slice's element →
|
|
|
103
103
|
|
|
104
104
|
## UI Contract
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
107
107
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
108
108
|
(a build kit may override it).
|
|
109
109
|
|
|
@@ -107,7 +107,7 @@ After the commit, invoke `/record-evidence`: it writes this slice's element →
|
|
|
107
107
|
|
|
108
108
|
## UI Contract
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
111
111
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
112
112
|
(a build kit may override it).
|
|
113
113
|
|
|
@@ -33,7 +33,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
33
33
|
9. Analyze and Implement that single slice, making use of the skills in the skills directory plus your previously collected knowledge. Make a TODO list for what needs to be done, and adjust the implementation according to the JSON definition. Carefully inspect events, fields and compare against the implemented slice. JSON is the desired state. ATTENTION: a "planned" task can also be just added specifications. So always look at the slice itself, but also the specifications. If specifications were added in json which are not on code, you need to add them in code.
|
|
34
34
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
35
35
|
11. Slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it fulfills the slice.json. There must be no specification in json that has no equivalent in code.
|
|
36
|
-
12.
|
|
36
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
37
37
|
13. Run the quality checks listed in `.build-kit/ARCHITECTURE.md` — build/compile, then only the tests touched by this slice (do not run all tests).
|
|
38
38
|
14. If checks pass, commit ALL changes with message: `feat: [Slice Name]` and merge back to main as FF merge (update first)
|
|
39
39
|
15. Invoke `/record-evidence` to write the implementation evidence (element → code mapping, files, specification → test mapping, seams, assumptions, commit) as a note into the slice's column, in the chapter's `Implementation` feedback lane.
|
|
@@ -406,7 +406,7 @@ assertion.
|
|
|
406
406
|
|
|
407
407
|
## UI Contract
|
|
408
408
|
|
|
409
|
-
|
|
409
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
410
410
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
411
411
|
(a build kit may override it).
|
|
412
412
|
|
|
@@ -381,7 +381,7 @@ undocumented rather than fabricating an assertion.
|
|
|
381
381
|
|
|
382
382
|
## UI Contract
|
|
383
383
|
|
|
384
|
-
|
|
384
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
385
385
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
386
386
|
(a build kit may override it).
|
|
387
387
|
|
|
@@ -36,7 +36,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
36
36
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
37
37
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
38
38
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
39
|
-
12.
|
|
39
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
40
40
|
13. Run quality checks — it is enough to run the tests for the slice only, not all tests:
|
|
41
41
|
- Compile: `./mvnw compile -q`
|
|
42
42
|
- Test: `./mvnw test -Dtest="<SliceName>*" -q`
|
|
@@ -419,7 +419,7 @@ import {api as {SliceName}Api} from './slices/{context}/{SliceName}/routes';
|
|
|
419
419
|
|
|
420
420
|
## UI Contract
|
|
421
421
|
|
|
422
|
-
|
|
422
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
423
423
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
424
424
|
(a build kit may override it).
|
|
425
425
|
|
|
@@ -486,7 +486,7 @@ import {api as {SliceName}Api} from './slices/{context}/{SliceName}/routes';
|
|
|
486
486
|
|
|
487
487
|
## UI Contract
|
|
488
488
|
|
|
489
|
-
|
|
489
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
490
490
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
491
491
|
(a build kit may override it).
|
|
492
492
|
|
|
@@ -32,7 +32,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
32
32
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
33
33
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
34
34
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
35
|
-
12.
|
|
35
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
36
36
|
13. Run quality checks ( npm run build, npm run test ) - Attention - it´s enough to run the tests for the slice. Do not run all tests.
|
|
37
37
|
14. even if the slice is fully implemented, run your test-analyzer skill and provide the code-slice.json file as defined in the skill
|
|
38
38
|
15. If checks pass, commit ALL changes with message: `feat: [Slice Name]` and merge back to main as FF merge ( update
|
|
@@ -401,7 +401,7 @@ leave it undocumented rather than fabricating an assertion.
|
|
|
401
401
|
|
|
402
402
|
## UI Contract
|
|
403
403
|
|
|
404
|
-
|
|
404
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
405
405
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
406
406
|
(a build kit may override it).
|
|
407
407
|
|
|
@@ -344,7 +344,7 @@ test — leave it undocumented in code rather than fabricating an assertion.
|
|
|
344
344
|
|
|
345
345
|
## UI Contract
|
|
346
346
|
|
|
347
|
-
|
|
347
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
348
348
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
349
349
|
(a build kit may override it).
|
|
350
350
|
|
|
@@ -36,7 +36,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
36
36
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
37
37
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
38
38
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
39
|
-
12.
|
|
39
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
40
40
|
13. Run quality checks — it is enough to run the tests for the slice only, not all tests:
|
|
41
41
|
- Compile: `./mvnw compile -q`
|
|
42
42
|
- Test: `./mvnw test -Dtest="<SliceName>*" -q`
|
|
@@ -426,7 +426,7 @@ import {api as {SliceName}Api} from './slices/{context}/{SliceName}/routes';
|
|
|
426
426
|
|
|
427
427
|
## UI Contract
|
|
428
428
|
|
|
429
|
-
|
|
429
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
430
430
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
431
431
|
(a build kit may override it).
|
|
432
432
|
|
|
@@ -461,7 +461,7 @@ import {api as {SliceName}Api} from './slices/{context}/{SliceName}/routes';
|
|
|
461
461
|
|
|
462
462
|
## UI Contract
|
|
463
463
|
|
|
464
|
-
|
|
464
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
465
465
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
466
466
|
(a build kit may override it).
|
|
467
467
|
|
|
@@ -32,7 +32,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
32
32
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
33
33
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
34
34
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
35
|
-
12.
|
|
35
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
36
36
|
13. Run quality checks ( npm run build, npm run test ) - Attention - it´s enough to run the tests for the slice. Do not run all tests.
|
|
37
37
|
14. even if the slice is fully implemented, run your test-analyzer skill and provide the code-slice.json file as defined in the skill
|
|
38
38
|
15. If checks pass, commit ALL changes with message: `feat: [Slice Name]` and merge back to main as FF merge ( update
|
|
@@ -366,7 +366,7 @@ fabricating an assertion.
|
|
|
366
366
|
|
|
367
367
|
## UI Contract
|
|
368
368
|
|
|
369
|
-
|
|
369
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
|
|
370
370
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
371
371
|
(a build kit may override it).
|
|
372
372
|
|
|
@@ -330,7 +330,7 @@ events to it in production exactly as it does for the already-verified slices.
|
|
|
330
330
|
|
|
331
331
|
## UI Contract
|
|
332
332
|
|
|
333
|
-
|
|
333
|
+
**Only when handover is on** (the task's `Handover: on` line, else `"handover": true` in `.eventmodelers/config.json`; with it off, skip this section): once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
|
|
334
334
|
the endpoint's contract as the `## UI Contract` section of the slice's feedback-lane markdown node, which the slice export then carries in `slice.json` `notes[]`. Do not restate the format here — the skill owns it
|
|
335
335
|
(a build kit may override it).
|
|
336
336
|
|
|
@@ -36,7 +36,7 @@ You work within **exactly ONE context at a time** — the one named in `.build-k
|
|
|
36
36
|
10. The slice in the json is always true, the code follows what is defined in the json
|
|
37
37
|
11. slice is only 'Done' if business logic is implemented as defined in the JSON, APIs are implemented, all scenarios in JSON are implemented in code and it
|
|
38
38
|
fulfills the slice.json. There must be no specification in json, that has no equivalent in code.
|
|
39
|
-
12.
|
|
39
|
+
12. Only when `handover` is on (the task's `Handover: on` line), invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices; with handover off skip this step (publishes the UI Contract section to the slice's feedback-lane markdown node)
|
|
40
40
|
13. Run quality checks — it is enough to run the tests for the slice only, not all tests:
|
|
41
41
|
- Compile: `./mvnw compile -q`
|
|
42
42
|
- Test: `./mvnw test -Dtest="<SliceName>*" -q`
|