zinkee 0.1.44 → 0.1.45
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 +4 -0
- package/dist/chunk-MHEVRMDX.js +1230 -0
- package/dist/chunk-MHEVRMDX.js.map +1 -0
- package/{src/utils/examples.ts → dist/examples-E6FFEVBE.js} +856 -1141
- package/dist/examples-E6FFEVBE.js.map +1 -0
- package/dist/index.js +1145 -8456
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/.github/workflows/npm-publish.yml +0 -77
- package/.github/workflows/pr-checks.yml +0 -36
- package/AGENTS.md +0 -110
- package/docs/cli-contract.md +0 -41
- package/docs/npm-release.md +0 -64
- package/docs/superpowers/plans/2026-03-24-zinkee-cli-implementation.md +0 -837
- package/docs/superpowers/plans/2026-03-25-cli-backend-error-contract.md +0 -503
- package/docs/superpowers/plans/2026-03-26-display-freeform-create.md +0 -389
- package/docs/superpowers/specs/2026-03-24-zinkee-cli-backend-blockers.md +0 -172
- package/docs/superpowers/specs/2026-03-24-zinkee-cli-design.md +0 -1576
- package/docs/superpowers/specs/2026-03-24-zinkee-cli-e2e-checklist.md +0 -215
- package/docs/superpowers/specs/2026-03-24-zinkee-cli-e2e-design.md +0 -492
- package/docs/superpowers/specs/2026-03-24-zinkee-cli-e2e-status.md +0 -307
- package/docs/superpowers/specs/2026-07-30-cli-pr-checks-design.md +0 -37
- package/src/api/automations.ts +0 -404
- package/src/api/comments.ts +0 -51
- package/src/api/displays.ts +0 -337
- package/src/api/document-templates.ts +0 -110
- package/src/api/files.ts +0 -50
- package/src/api/formulas.test.ts +0 -65
- package/src/api/formulas.ts +0 -67
- package/src/api/logs.ts +0 -34
- package/src/api/navigation.ts +0 -70
- package/src/api/records.ts +0 -184
- package/src/api/schemas.ts +0 -148
- package/src/api/teamspace.ts +0 -110
- package/src/cli-examples.ts +0 -130
- package/src/cli-runner.ts +0 -95
- package/src/client.test.ts +0 -189
- package/src/client.ts +0 -269
- package/src/command-registry.ts +0 -882
- package/src/commands/automations.test.ts +0 -1030
- package/src/commands/automations.ts +0 -2102
- package/src/commands/comments.test.ts +0 -214
- package/src/commands/comments.ts +0 -303
- package/src/commands/config.test.ts +0 -81
- package/src/commands/config.ts +0 -150
- package/src/commands/displays.test.ts +0 -1105
- package/src/commands/displays.ts +0 -1442
- package/src/commands/document-templates.test.ts +0 -569
- package/src/commands/document-templates.ts +0 -563
- package/src/commands/files.test.ts +0 -284
- package/src/commands/files.ts +0 -280
- package/src/commands/formulas.test.ts +0 -194
- package/src/commands/formulas.ts +0 -243
- package/src/commands/logs.test.ts +0 -123
- package/src/commands/logs.ts +0 -159
- package/src/commands/navigation.test.ts +0 -211
- package/src/commands/navigation.ts +0 -348
- package/src/commands/profiles.test.ts +0 -191
- package/src/commands/profiles.ts +0 -303
- package/src/commands/records.test.ts +0 -860
- package/src/commands/records.ts +0 -883
- package/src/commands/schemas.test.ts +0 -1252
- package/src/commands/schemas.ts +0 -890
- package/src/commands/teamspace.test.ts +0 -229
- package/src/commands/teamspace.ts +0 -546
- package/src/completion/engine.test.ts +0 -138
- package/src/completion/engine.ts +0 -168
- package/src/completion/install.test.ts +0 -179
- package/src/completion/install.ts +0 -260
- package/src/completion/runtime.ts +0 -150
- package/src/completion/scripts.ts +0 -91
- package/src/config.test.ts +0 -362
- package/src/config.ts +0 -294
- package/src/index.test.ts +0 -217
- package/src/index.ts +0 -8
- package/src/parsers/expressions.test.ts +0 -95
- package/src/parsers/expressions.ts +0 -128
- package/src/parsers/kv.test.ts +0 -35
- package/src/parsers/kv.ts +0 -49
- package/src/parsers/selectors.test.ts +0 -23
- package/src/parsers/selectors.ts +0 -29
- package/src/program.ts +0 -64
- package/src/runtime-context.ts +0 -103
- package/src/types.ts +0 -76
- package/src/utils/argv-rewrite.test.ts +0 -149
- package/src/utils/argv-rewrite.ts +0 -269
- package/src/utils/errors.test.ts +0 -85
- package/src/utils/errors.ts +0 -191
- package/src/utils/examples.test.ts +0 -374
- package/src/utils/output.test.ts +0 -65
- package/src/utils/output.ts +0 -154
- package/src/utils/schema-fields.ts +0 -1016
- package/tsconfig.json +0 -20
- package/tsup.config.ts +0 -13
|
@@ -1,389 +0,0 @@
|
|
|
1
|
-
# Display Freeform Create Implementation Plan
|
|
2
|
-
|
|
3
|
-
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
-
|
|
5
|
-
**Goal:** Extend the public display create API so clients can create a freeform display and persist `freeformLayouts` in the initial `POST`, while preserving all existing create behavior for non-freeform layouts.
|
|
6
|
-
|
|
7
|
-
**Architecture:** Keep the contract shape consistent by adding optional `layout.freeformLayouts` to the create request, then route creation through the same layout rules already used by `PATCH /api/v2/displays/{id}/layout`. The backend remains the source of truth for layout validation and persistence, and the CLI can adopt the new field later without requiring a second request.
|
|
8
|
-
|
|
9
|
-
**Tech Stack:** Java Spring WebFlux backend, Java records for API contracts, JUnit/Reactor tests, TypeScript ESM CLI with Commander/Vitest for follow-up parity.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## File Map
|
|
14
|
-
|
|
15
|
-
**Backend files**
|
|
16
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java`
|
|
17
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2ContractValidator.java`
|
|
18
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java`
|
|
19
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/infra/web/v2/ApiV2DisplayDocumentation.java`
|
|
20
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java`
|
|
21
|
-
|
|
22
|
-
**CLI follow-up files**
|
|
23
|
-
- Modify: `/Users/david/dev/z2/cli/src/commands/displays.ts`
|
|
24
|
-
- Modify: `/Users/david/dev/z2/cli/src/utils/examples.ts`
|
|
25
|
-
- Modify: `/Users/david/dev/z2/cli/src/commands/displays.test.ts`
|
|
26
|
-
|
|
27
|
-
## Task 1: Extend the Create Contract to Accept `layout.freeformLayouts`
|
|
28
|
-
|
|
29
|
-
**Files:**
|
|
30
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java`
|
|
31
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2ContractValidator.java`
|
|
32
|
-
|
|
33
|
-
- [ ] **Step 1: Add or adjust the relevant tests**
|
|
34
|
-
|
|
35
|
-
Add service-level tests that cover these create cases:
|
|
36
|
-
|
|
37
|
-
```java
|
|
38
|
-
new DisplayV2CreateRequest(
|
|
39
|
-
"Board",
|
|
40
|
-
new DisplayV2CreateRequest.Layout("freeform", Map.of("lg", List.of()))
|
|
41
|
-
)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
and:
|
|
45
|
-
|
|
46
|
-
```java
|
|
47
|
-
new DisplayV2CreateRequest(
|
|
48
|
-
"Board",
|
|
49
|
-
new DisplayV2CreateRequest.Layout("widget_row", Map.of("lg", List.of()))
|
|
50
|
-
)
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Assert that:
|
|
54
|
-
- freeform create accepts `freeformLayouts`
|
|
55
|
-
- non-freeform create rejects `freeformLayouts`
|
|
56
|
-
- existing create without `freeformLayouts` still works
|
|
57
|
-
|
|
58
|
-
- [ ] **Step 2: Run the relevant check and capture the current result**
|
|
59
|
-
|
|
60
|
-
Run:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
cd /Users/david/dev/z2/z2-backend
|
|
64
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Expected: compilation or test failure because `DisplayV2CreateRequest.Layout` does not yet accept `freeformLayouts`.
|
|
68
|
-
|
|
69
|
-
- [ ] **Step 3: Write minimal implementation**
|
|
70
|
-
|
|
71
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java`:
|
|
72
|
-
- add `Object freeformLayouts` to the nested `Layout` record
|
|
73
|
-
|
|
74
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2ContractValidator.java`:
|
|
75
|
-
- keep `name` and `layout.template` required
|
|
76
|
-
- reject `layout.freeformLayouts` when `layout.template` is not `"freeform"`
|
|
77
|
-
- do not require `freeformLayouts` for freeform layouts
|
|
78
|
-
|
|
79
|
-
- [ ] **Step 4: Run verification to confirm the intended result**
|
|
80
|
-
|
|
81
|
-
Run:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
cd /Users/david/dev/z2/z2-backend
|
|
85
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Expected: create contract compiles and validation cases behave as intended.
|
|
89
|
-
|
|
90
|
-
- [ ] **Step 5: Commit**
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
cd /Users/david/dev/z2/z2-backend
|
|
94
|
-
git add api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2ContractValidator.java api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java
|
|
95
|
-
git commit -m "feat: accept freeform layouts in display create contract"
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Task 2: Persist `currentLayouts` During Display Creation
|
|
99
|
-
|
|
100
|
-
**Files:**
|
|
101
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java`
|
|
102
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java`
|
|
103
|
-
|
|
104
|
-
- [ ] **Step 1: Add or adjust the relevant test**
|
|
105
|
-
|
|
106
|
-
Add a test proving that:
|
|
107
|
-
|
|
108
|
-
```java
|
|
109
|
-
service.createDisplay(
|
|
110
|
-
APP_NAME,
|
|
111
|
-
new DisplayV2CreateRequest(
|
|
112
|
-
"Employees",
|
|
113
|
-
new DisplayV2CreateRequest.Layout(
|
|
114
|
-
"freeform",
|
|
115
|
-
Map.of("lg", List.of(Map.of("i", "widget-1", "x", 0, "y", 0, "w", 6, "h", 5)))
|
|
116
|
-
)
|
|
117
|
-
)
|
|
118
|
-
)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
persists:
|
|
122
|
-
- `"layoutTemplate": "freeform"`
|
|
123
|
-
- `"slots": "{\"grid\":[]}"`
|
|
124
|
-
- `"currentLayouts"` with serialized freeform JSON
|
|
125
|
-
|
|
126
|
-
- [ ] **Step 2: Run the relevant check and capture the current result**
|
|
127
|
-
|
|
128
|
-
Run:
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
cd /Users/david/dev/z2/z2-backend
|
|
132
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Expected: the new persistence assertion fails because `createDisplay` currently never writes `currentLayouts`.
|
|
136
|
-
|
|
137
|
-
- [ ] **Step 3: Write minimal implementation**
|
|
138
|
-
|
|
139
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java`:
|
|
140
|
-
- update `createDisplay` to read `request.layout().freeformLayouts()`
|
|
141
|
-
- when template is `"freeform"` and layouts are present, persist them to `additionalProperties.put("currentLayouts", writeJson(...))`
|
|
142
|
-
- keep slot initialization unchanged
|
|
143
|
-
|
|
144
|
-
Refactor only if it materially reduces duplication:
|
|
145
|
-
- extract a private helper that applies `layoutTemplate`, `slots`, and optional `currentLayouts` to `additionalProperties`
|
|
146
|
-
- use the helper from both `createDisplay` and `patchDisplayLayout`
|
|
147
|
-
|
|
148
|
-
Do not change response shapes or existing slot behavior.
|
|
149
|
-
|
|
150
|
-
- [ ] **Step 4: Run verification to confirm the intended result**
|
|
151
|
-
|
|
152
|
-
Run:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
cd /Users/david/dev/z2/z2-backend
|
|
156
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Expected: create now persists `currentLayouts` only for valid freeform create requests.
|
|
160
|
-
|
|
161
|
-
- [ ] **Step 5: Commit**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
cd /Users/david/dev/z2/z2-backend
|
|
165
|
-
git add api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java
|
|
166
|
-
git commit -m "feat: persist freeform layouts during display creation"
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## Task 3: Keep Error Messages and Serialization Semantics Consistent
|
|
170
|
-
|
|
171
|
-
**Files:**
|
|
172
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java`
|
|
173
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java`
|
|
174
|
-
|
|
175
|
-
- [ ] **Step 1: Add or adjust the relevant test**
|
|
176
|
-
|
|
177
|
-
Add a test that passes a non-serializable `freeformLayouts` object through create and asserts the backend returns a display-layout validation error instead of saving broken data.
|
|
178
|
-
|
|
179
|
-
- [ ] **Step 2: Run the relevant check and capture the current result**
|
|
180
|
-
|
|
181
|
-
Run:
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
cd /Users/david/dev/z2/z2-backend
|
|
185
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
Expected: either no coverage for the case exists, or the current error code/message is tied specifically to patch-only wording.
|
|
189
|
-
|
|
190
|
-
- [ ] **Step 3: Write minimal implementation**
|
|
191
|
-
|
|
192
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java`:
|
|
193
|
-
- rename or generalize `writeJson` failure messaging so it is correct for both create and patch flows
|
|
194
|
-
- keep the error in the display layout family
|
|
195
|
-
- avoid introducing create-only and patch-only serializers if one shared helper is enough
|
|
196
|
-
|
|
197
|
-
- [ ] **Step 4: Run verification to confirm the intended result**
|
|
198
|
-
|
|
199
|
-
Run:
|
|
200
|
-
|
|
201
|
-
```bash
|
|
202
|
-
cd /Users/david/dev/z2/z2-backend
|
|
203
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
Expected: invalid freeform layout payloads fail with a clear, reusable display layout validation error.
|
|
207
|
-
|
|
208
|
-
- [ ] **Step 5: Commit**
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
cd /Users/david/dev/z2/z2-backend
|
|
212
|
-
git add api/src/main/java/com/zinkee/api/service/v2/display/DisplayV2Service.java api/src/test/java/com/zinkee/api/service/v2/display/DisplayV2ServiceTest.java
|
|
213
|
-
git commit -m "refactor: reuse display layout serialization errors across create and patch"
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
## Task 4: Update the Public API Documentation
|
|
217
|
-
|
|
218
|
-
**Files:**
|
|
219
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/infra/web/v2/ApiV2DisplayDocumentation.java`
|
|
220
|
-
- Modify: `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java`
|
|
221
|
-
|
|
222
|
-
- [ ] **Step 1: Add or adjust the relevant example**
|
|
223
|
-
|
|
224
|
-
Update the documented create example so it shows both:
|
|
225
|
-
- a normal create payload with `layout.template`
|
|
226
|
-
- a freeform create payload with nested `layout.freeformLayouts`
|
|
227
|
-
|
|
228
|
-
- [ ] **Step 2: Run the relevant check and capture the current result**
|
|
229
|
-
|
|
230
|
-
Run:
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
cd /Users/david/dev/z2/z2-backend
|
|
234
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
Expected: no behavior change, but docs still show the old create-only-template example until updated.
|
|
238
|
-
|
|
239
|
-
- [ ] **Step 3: Write minimal implementation**
|
|
240
|
-
|
|
241
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/infra/web/v2/ApiV2DisplayDocumentation.java`:
|
|
242
|
-
- update the create description to mention optional `layout.freeformLayouts` for freeform displays
|
|
243
|
-
- replace the current example with one that reflects the new contract
|
|
244
|
-
|
|
245
|
-
In `/Users/david/dev/z2/z2-backend/api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java`:
|
|
246
|
-
- add `@Schema` descriptions for the new nested field
|
|
247
|
-
|
|
248
|
-
- [ ] **Step 4: Run verification to confirm the intended result**
|
|
249
|
-
|
|
250
|
-
Run:
|
|
251
|
-
|
|
252
|
-
```bash
|
|
253
|
-
cd /Users/david/dev/z2/z2-backend
|
|
254
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
Expected: the API docs and record schema now describe the new create capability without changing runtime behavior.
|
|
258
|
-
|
|
259
|
-
- [ ] **Step 5: Commit**
|
|
260
|
-
|
|
261
|
-
```bash
|
|
262
|
-
cd /Users/david/dev/z2/z2-backend
|
|
263
|
-
git add api/src/main/java/com/zinkee/api/infra/web/v2/ApiV2DisplayDocumentation.java api/src/main/java/com/zinkee/api/domain/model/v2/display/DisplayV2CreateRequest.java
|
|
264
|
-
git commit -m "docs: document freeform layouts in display create api"
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Task 5: Add CLI Parity for Single-Step Freeform Create
|
|
268
|
-
|
|
269
|
-
**Files:**
|
|
270
|
-
- Modify: `/Users/david/dev/z2/cli/src/commands/displays.ts`
|
|
271
|
-
- Modify: `/Users/david/dev/z2/cli/src/utils/examples.ts`
|
|
272
|
-
- Modify: `/Users/david/dev/z2/cli/src/commands/displays.test.ts`
|
|
273
|
-
|
|
274
|
-
- [ ] **Step 1: Add or adjust the relevant test**
|
|
275
|
-
|
|
276
|
-
Add a CLI test asserting that:
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
zinkee --json displays create --name Pipeline --template freeform --freeform-layouts '{"lg":[]}'
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
sends:
|
|
283
|
-
|
|
284
|
-
```json
|
|
285
|
-
{
|
|
286
|
-
"name": "Pipeline",
|
|
287
|
-
"layout": {
|
|
288
|
-
"template": "freeform",
|
|
289
|
-
"freeformLayouts": {
|
|
290
|
-
"lg": []
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
- [ ] **Step 2: Run the relevant check and capture the current result**
|
|
297
|
-
|
|
298
|
-
Run:
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
cd /Users/david/dev/z2/cli
|
|
302
|
-
npm test -- src/commands/displays.test.ts
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
Expected: the new assertion fails because `displays create` currently only sends `name` and `layout.template`.
|
|
306
|
-
|
|
307
|
-
- [ ] **Step 3: Write minimal implementation**
|
|
308
|
-
|
|
309
|
-
In `/Users/david/dev/z2/cli/src/commands/displays.ts`:
|
|
310
|
-
- add `--freeform-layouts <json>` and `--freeform-layouts-file <path>` to `displays create`
|
|
311
|
-
- reuse `readNamedJsonOption(...)`
|
|
312
|
-
- include `layout.freeformLayouts` only when provided
|
|
313
|
-
|
|
314
|
-
In `/Users/david/dev/z2/cli/src/utils/examples.ts`:
|
|
315
|
-
- add a concrete freeform create example
|
|
316
|
-
|
|
317
|
-
- [ ] **Step 4: Run verification to confirm the intended result**
|
|
318
|
-
|
|
319
|
-
Run:
|
|
320
|
-
|
|
321
|
-
```bash
|
|
322
|
-
cd /Users/david/dev/z2/cli
|
|
323
|
-
npm test -- src/commands/displays.test.ts
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
Expected: CLI create supports the new API contract in one request.
|
|
327
|
-
|
|
328
|
-
- [ ] **Step 5: Commit**
|
|
329
|
-
|
|
330
|
-
```bash
|
|
331
|
-
cd /Users/david/dev/z2/cli
|
|
332
|
-
git add src/commands/displays.ts src/utils/examples.ts src/commands/displays.test.ts
|
|
333
|
-
git commit -m "feat: support freeform layouts in displays create"
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
## Task 6: Run Final Verification Across Backend and CLI
|
|
337
|
-
|
|
338
|
-
**Files:**
|
|
339
|
-
- Verify only
|
|
340
|
-
|
|
341
|
-
- [ ] **Step 1: Run backend display tests**
|
|
342
|
-
|
|
343
|
-
Run:
|
|
344
|
-
|
|
345
|
-
```bash
|
|
346
|
-
cd /Users/david/dev/z2/z2-backend
|
|
347
|
-
./gradlew :api:test --tests com.zinkee.api.service.v2.display.DisplayV2ServiceTest
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
Expected: all display service tests pass.
|
|
351
|
-
|
|
352
|
-
- [ ] **Step 2: Run CLI display tests**
|
|
353
|
-
|
|
354
|
-
Run:
|
|
355
|
-
|
|
356
|
-
```bash
|
|
357
|
-
cd /Users/david/dev/z2/cli
|
|
358
|
-
npm test -- src/commands/displays.test.ts
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
Expected: CLI display tests pass.
|
|
362
|
-
|
|
363
|
-
- [ ] **Step 3: Run a focused end-to-end create flow manually**
|
|
364
|
-
|
|
365
|
-
Run:
|
|
366
|
-
|
|
367
|
-
```bash
|
|
368
|
-
cd /Users/david/dev/z2/cli
|
|
369
|
-
zinkee --json displays create --name "Freeform desde CLI" --template freeform --freeform-layouts '{"lg":[{"i":"widget-1","x":0,"y":0,"w":6,"h":5}]}'
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
Then verify with:
|
|
373
|
-
|
|
374
|
-
```bash
|
|
375
|
-
zinkee --json displays get <display-id>
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
Expected: the returned `layout.freeformLayouts` is present immediately after create, without a second layout patch.
|
|
379
|
-
|
|
380
|
-
- [ ] **Step 4: Commit**
|
|
381
|
-
|
|
382
|
-
```bash
|
|
383
|
-
cd /Users/david/dev/z2/z2-backend
|
|
384
|
-
git status --short
|
|
385
|
-
cd /Users/david/dev/z2/cli
|
|
386
|
-
git status --short
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
Expected: only intended backend and CLI files remain changed.
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
# Zinkee CLI Backend Blockers
|
|
2
|
-
|
|
3
|
-
Lista de problemas detectados desde la CLI contra el backend local (`z2` + `api`) que parecen ser del backend o del contrato backend, no del binario del CLI.
|
|
4
|
-
|
|
5
|
-
Perfil usado para reproducir:
|
|
6
|
-
|
|
7
|
-
- `local`
|
|
8
|
-
- `base_url = http://localhost:8088`
|
|
9
|
-
|
|
10
|
-
## 1. `schemas fields create` falla cuando se manda `config`
|
|
11
|
-
|
|
12
|
-
### Síntoma
|
|
13
|
-
|
|
14
|
-
La creación de fields funciona si la CLI no manda `config`, pero falla cuando se manda `config` en el payload.
|
|
15
|
-
|
|
16
|
-
### Request
|
|
17
|
-
|
|
18
|
-
Ruta:
|
|
19
|
-
|
|
20
|
-
```text
|
|
21
|
-
POST /api/v2/schemas/{schemaId}/fields
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Ejemplo de payload que falla:
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"type": "TextField",
|
|
29
|
-
"slug": "test-name",
|
|
30
|
-
"label": "Test Name",
|
|
31
|
-
"required": true,
|
|
32
|
-
"config": {
|
|
33
|
-
"textType": "LONG",
|
|
34
|
-
"defaultValue": "Ada",
|
|
35
|
-
"conditionalFormatting": []
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Resultado
|
|
41
|
-
|
|
42
|
-
- HTTP `500`
|
|
43
|
-
|
|
44
|
-
### Error observado en logs
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
InvalidDefinitionException
|
|
48
|
-
Cannot construct instance of `com.fasterxml.jackson.databind.JsonNode`
|
|
49
|
-
through reference chain: com.zinkee.api.domain.model.v2.schema.SchemaV2CreateFieldRequest["config"]
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Interpretación
|
|
53
|
-
|
|
54
|
-
El backend local está rompiendo en binding/deserialización del campo `config` en `SchemaV2CreateFieldRequest`.
|
|
55
|
-
|
|
56
|
-
## 2. `displays delete` no tiene ruta efectiva en API v2
|
|
57
|
-
|
|
58
|
-
### Síntoma
|
|
59
|
-
|
|
60
|
-
La CLI intenta borrar displays con:
|
|
61
|
-
|
|
62
|
-
```text
|
|
63
|
-
DELETE /api/v2/displays/{displayId}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
pero el backend responde con error.
|
|
67
|
-
|
|
68
|
-
### Resultado
|
|
69
|
-
|
|
70
|
-
- HTTP `500`
|
|
71
|
-
|
|
72
|
-
### Error observado en logs
|
|
73
|
-
|
|
74
|
-
```text
|
|
75
|
-
500 Server Error for HTTP DELETE "/api/v2/displays/{displayId}"
|
|
76
|
-
ResponseStatusException: 404 NOT_FOUND
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
### Interpretación
|
|
80
|
-
|
|
81
|
-
La ruta de borrado parece no existir realmente en `ApiV2DisplayRoutes`, aunque desde el punto de vista del dominio sería esperable.
|
|
82
|
-
|
|
83
|
-
## 3. `automations create` devuelve `automation_create_payload_invalid`
|
|
84
|
-
|
|
85
|
-
### Síntoma
|
|
86
|
-
|
|
87
|
-
La creación de automatizaciones falla incluso con payloads alineados con la documentación.
|
|
88
|
-
|
|
89
|
-
### Request
|
|
90
|
-
|
|
91
|
-
Ruta:
|
|
92
|
-
|
|
93
|
-
```text
|
|
94
|
-
POST /api/v2/automations
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Payload mínimo probado:
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{
|
|
101
|
-
"name": "e2e-auto-direct",
|
|
102
|
-
"folderId": "0fd93776-33ac-4089-a7b8-ec1fcb810312",
|
|
103
|
-
"trigger": {
|
|
104
|
-
"type": "scheduled",
|
|
105
|
-
"config": {
|
|
106
|
-
"cronExpression": "0 15 10 * * 1"
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Resultado
|
|
113
|
-
|
|
114
|
-
- HTTP `400`
|
|
115
|
-
|
|
116
|
-
### Error observado
|
|
117
|
-
|
|
118
|
-
```json
|
|
119
|
-
{
|
|
120
|
-
"reason": "automation_create_payload_invalid",
|
|
121
|
-
"message": "Automation create payload is invalid."
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Interpretación
|
|
126
|
-
|
|
127
|
-
El backend local rechaza `POST /api/v2/automations` incluso con payloads que parecen compatibles con:
|
|
128
|
-
|
|
129
|
-
- `AutomationV2CreateRequest`
|
|
130
|
-
- `AutomationTriggerV2PutRequest`
|
|
131
|
-
- `AutomationScheduledTriggerV2Config`
|
|
132
|
-
|
|
133
|
-
No se observó stacktrace claro asociado en logs, solo paso por el error handler.
|
|
134
|
-
|
|
135
|
-
## 4. `displays tabs create` falla correctamente en layouts que no soportan tabs
|
|
136
|
-
|
|
137
|
-
### Nota
|
|
138
|
-
|
|
139
|
-
Esto no parece bug del backend, sino validación correcta.
|
|
140
|
-
|
|
141
|
-
### Error observado
|
|
142
|
-
|
|
143
|
-
- HTTP `400`
|
|
144
|
-
- `reason=display_tabs_unsupported`
|
|
145
|
-
|
|
146
|
-
Mensaje:
|
|
147
|
-
|
|
148
|
-
```text
|
|
149
|
-
Display layout does not support shared tabs.
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Observación útil
|
|
153
|
-
|
|
154
|
-
`displays tabs create` sí funciona con el layout:
|
|
155
|
-
|
|
156
|
-
- `side_tabs_widgets`
|
|
157
|
-
|
|
158
|
-
## 5. Warnings de entorno no bloqueantes
|
|
159
|
-
|
|
160
|
-
Estos warnings aparecen en logs pero no parecen ser la causa de los fallos funcionales:
|
|
161
|
-
|
|
162
|
-
- OTLP metrics:
|
|
163
|
-
- `Connection refused` a `http://localhost:4318/v1/metrics`
|
|
164
|
-
- warning de Netty DNS nativo en macOS
|
|
165
|
-
|
|
166
|
-
## Resumen
|
|
167
|
-
|
|
168
|
-
Problemas a revisar en backend:
|
|
169
|
-
|
|
170
|
-
- [ ] binding de `config` en `SchemaV2CreateFieldRequest`
|
|
171
|
-
- [ ] existencia/soporte de `DELETE /api/v2/displays/{displayId}`
|
|
172
|
-
- [ ] validación/binding de `POST /api/v2/automations`
|