@eventmodelers/cli 1.0.155 → 1.0.157

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.
Files changed (32) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/shared/skills/ui-contract/SKILL.md +3 -1
  4. package/stacks/axon/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  5. package/stacks/axon/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  6. package/stacks/axon/templates/build-kit/lib/backend-prompt.md +1 -1
  7. package/stacks/blank/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  8. package/stacks/blank/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  9. package/stacks/blank/templates/build-kit/CLAUDE.md +2 -2
  10. package/stacks/blank/templates/build-kit/lib/backend-prompt.md +1 -1
  11. package/stacks/classic/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  12. package/stacks/classic/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  13. package/stacks/classic/templates/build-kit/lib/backend-prompt.md +1 -1
  14. package/stacks/kurrent/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  15. package/stacks/kurrent/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  16. package/stacks/kurrent/templates/build-kit/lib/backend-prompt.md +1 -1
  17. package/stacks/node/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  18. package/stacks/node/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  19. package/stacks/node/templates/build-kit/lib/backend-prompt.md +1 -1
  20. package/stacks/node/templates/root/package.json +1 -1
  21. package/stacks/node/templates/root/server.ts +3 -3
  22. package/stacks/opencqrs/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  23. package/stacks/opencqrs/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  24. package/stacks/opencqrs/templates/build-kit/lib/backend-prompt.md +1 -1
  25. package/stacks/supabase/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  26. package/stacks/supabase/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  27. package/stacks/supabase/templates/build-kit/lib/backend-prompt.md +1 -1
  28. package/stacks/supabase/templates/root/package.json +1 -1
  29. package/stacks/supabase/templates/root/server.ts +3 -3
  30. package/stacks/umadb/templates/.claude/skills/build-state-change/SKILL.md +1 -1
  31. package/stacks/umadb/templates/.claude/skills/build-state-view/SKILL.md +1 -1
  32. 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.** The scaffolded `build-state-view` / `build-state-change` skills already 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/`).
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` | publishes the UI contract, ends at `Handover` |
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.155",
3
+ "version": "1.0.157",
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": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: ui-contract
3
- description: 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.
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes the contract
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes the contract
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
@@ -7,7 +7,7 @@
7
7
  "dev": "node --env-file=.env --require ts-node/register server.ts",
8
8
  "build": "tsc",
9
9
  "start": "NODE_ENV=production node --env-file=.env --require ts-node/register server.ts",
10
- "test": "tsx --test 'src/**/*.test.ts'",
10
+ "test": "tsx --test \"src/**/*.test.ts\"",
11
11
  "run:checks": "node .build-kit/lib/check-commit-scope.cjs"
12
12
  },
13
13
  "dependencies": {
@@ -16,15 +16,15 @@ async function startServer() {
16
16
  const slicesBase = join(__dirname, 'dist/src/slices');
17
17
  const routesPattern = join(slicesBase, '**/routes{,-*}.js');
18
18
 
19
- const routeFiles = await glob(routesPattern, {nodir: true});
19
+ const routeFiles = await glob(routesPattern, {nodir: true, windowsPathsNoEscape: true});
20
20
  console.log('Found route files:', routeFiles);
21
21
 
22
22
  const processorPattern = join(slicesBase, '**/processor{,-*}.js');
23
- const processorFiles = await glob(processorPattern, {nodir: true});
23
+ const processorFiles = await glob(processorPattern, {nodir: true, windowsPathsNoEscape: true});
24
24
  console.log('Found processor files:', processorFiles);
25
25
 
26
26
  const commonPattern = join(__dirname, 'src/common/routes{,-*}.@(ts|js)');
27
- const commonRouteFiles = await glob(commonPattern, {nodir: true});
27
+ const commonRouteFiles = await glob(commonPattern, {nodir: true, windowsPathsNoEscape: true});
28
28
  console.log('Found common route files:', commonRouteFiles);
29
29
 
30
30
 
@@ -401,7 +401,7 @@ leave it undocumented rather than fabricating an assertion.
401
401
 
402
402
  ## UI Contract
403
403
 
404
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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
@@ -7,7 +7,7 @@
7
7
  "dev": "node --env-file=.env --require ts-node/register server.ts",
8
8
  "build": "tsc",
9
9
  "start": "NODE_ENV=production node --env-file=.env --require ts-node/register server.ts",
10
- "test": "tsx --test 'src/**/*.test.ts'",
10
+ "test": "tsx --test \"src/**/*.test.ts\"",
11
11
  "run:checks": "node .build-kit/lib/check-commit-scope.cjs"
12
12
  },
13
13
  "dependencies": {
@@ -17,11 +17,11 @@ async function startServer() {
17
17
  const slicesBase = join(__dirname, 'dist/src/slices');
18
18
  const routesPattern = join(slicesBase, '**/routes{,-*}.js');
19
19
 
20
- const routeFiles = await glob(routesPattern, {nodir: true});
20
+ const routeFiles = await glob(routesPattern, {nodir: true, windowsPathsNoEscape: true});
21
21
  console.log('Found route files:', routeFiles);
22
22
 
23
23
  const processorPattern = join(slicesBase, '**/processor{,-*}.js');
24
- const processorFiles = await glob(processorPattern, {nodir: true});
24
+ const processorFiles = await glob(processorPattern, {nodir: true, windowsPathsNoEscape: true});
25
25
  console.log('Found processor files:', processorFiles);
26
26
 
27
27
  // Common routes (e.g. projection replay) are privileged/operational and are
@@ -29,7 +29,7 @@ async function startServer() {
29
29
  const commonRoutesEnabled = process.env.COMMON_ROUTES_ENABLED === 'true';
30
30
  const commonPattern = join(__dirname, 'src/common/routes{,-*}.@(ts|js)');
31
31
  const commonRouteFiles = commonRoutesEnabled
32
- ? await glob(commonPattern, {nodir: true})
32
+ ? await glob(commonPattern, {nodir: true, windowsPathsNoEscape: true})
33
33
  : [];
34
34
  console.log(commonRoutesEnabled
35
35
  ? `Found common route files: ${commonRouteFiles}`
@@ -366,7 +366,7 @@ fabricating an assertion.
366
366
 
367
367
  ## UI Contract
368
368
 
369
- Once the command endpoint is built, invoke the `ui-contract` skill (write contract, `POST`): it publishes
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
- Once the read endpoint is built, invoke the `ui-contract` skill (read contract, `GET`): it publishes
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. Invoke the `ui-contract` skill for STATE_VIEW / STATE_CHANGE slices (publishes the UI Contract section to the slice's feedback-lane markdown node)
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`