sdtk-kit 0.3.8 → 0.3.9
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/assets/manifest/toolkit-bundle.manifest.json +39 -39
- package/assets/manifest/toolkit-bundle.sha256.txt +18 -18
- package/assets/toolkit/toolkit/install.ps1 +44 -4
- package/assets/toolkit/toolkit/scripts/install-claude-skills.ps1 +43 -3
- package/assets/toolkit/toolkit/skills/sdtk-api-design-spec/SKILL.md +1 -1
- package/assets/toolkit/toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py +87 -11
- package/assets/toolkit/toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
- package/assets/toolkit/toolkit/skills/sdtk-design-layout/SKILL.md +16 -5
- package/assets/toolkit/toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py +34 -1
- package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/SKILL.md +17 -4
- package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/references/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
- package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/references/numbering-rules.md +20 -68
- package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/scripts/validate_flow_action_spec_numbering.py +168 -3
- package/assets/toolkit/toolkit/skills-claude/api-design-spec/SKILL.md +22 -8
- package/assets/toolkit/toolkit/skills-claude/arch/SKILL.md +26 -39
- package/assets/toolkit/toolkit/skills-claude/design-layout/SKILL.md +38 -6
- package/assets/toolkit/toolkit/skills-claude/screen-design-spec/SKILL.md +47 -25
- package/assets/toolkit/toolkit/templates/docs/design/DESIGN_LAYOUT_TEMPLATE.md +12 -1
- package/assets/toolkit/toolkit/templates/docs/specs/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
- package/assets/toolkit/toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md +34 -9
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.3.
|
|
3
|
-
"sourceCommit": "
|
|
4
|
-
"buildTimestamp": "2026-03-
|
|
2
|
+
"version": "0.3.9",
|
|
3
|
+
"sourceCommit": "5cbe99e81179ea8a25d768079fedfb448b473305",
|
|
4
|
+
"buildTimestamp": "2026-03-20T02:20:39Z",
|
|
5
5
|
"fileCount": 93,
|
|
6
6
|
"files": [
|
|
7
7
|
{
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"path": "toolkit/install.ps1",
|
|
14
|
-
"sha256": "
|
|
15
|
-
"size":
|
|
14
|
+
"sha256": "b212d4cd0c04429e3c855ebc08ec61aca788a30cd43098e777a42ee867b90f5e",
|
|
15
|
+
"size": 11156
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "toolkit/runtimes/claude/CLAUDE_TEMPLATE.md",
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"path": "toolkit/scripts/install-claude-skills.ps1",
|
|
34
|
-
"sha256": "
|
|
35
|
-
"size":
|
|
34
|
+
"sha256": "3d13e0e2099581a4fa08ddaebe6e0dddbc09023489c8aae954eb35e1072b56b7",
|
|
35
|
+
"size": 5692
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"path": "toolkit/scripts/install-codex-skills.ps1",
|
|
@@ -76,13 +76,13 @@
|
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"path": "toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py",
|
|
79
|
-
"sha256": "
|
|
80
|
-
"size":
|
|
79
|
+
"sha256": "9564084f78c3b7e241cc367cd4ddd220aa20b5a4fb49473138417be5f18a6dae",
|
|
80
|
+
"size": 28067
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
"path": "toolkit/skills/sdtk-api-design-spec/SKILL.md",
|
|
84
|
-
"sha256": "
|
|
85
|
-
"size":
|
|
84
|
+
"sha256": "fa92b00578571925aeeb6bce4ee7f95e63d2e656605085ee683bc294e4146671",
|
|
85
|
+
"size": 3868
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
88
|
"path": "toolkit/skills/sdtk-api-doc/references/API_DESIGN_FLOWCHART_CREATION_RULES.md",
|
|
@@ -116,8 +116,8 @@
|
|
|
116
116
|
},
|
|
117
117
|
{
|
|
118
118
|
"path": "toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md",
|
|
119
|
-
"sha256": "
|
|
120
|
-
"size":
|
|
119
|
+
"sha256": "c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66",
|
|
120
|
+
"size": 11973
|
|
121
121
|
},
|
|
122
122
|
{
|
|
123
123
|
"path": "toolkit/skills/sdtk-arch/references/FLOWCHART_CREATION_RULES.md",
|
|
@@ -141,13 +141,13 @@
|
|
|
141
141
|
},
|
|
142
142
|
{
|
|
143
143
|
"path": "toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py",
|
|
144
|
-
"sha256": "
|
|
145
|
-
"size":
|
|
144
|
+
"sha256": "5ae589e058ae6af6cec724ecc8cb48b2dab78a2aa2f4df9aff58925c7b60a25c",
|
|
145
|
+
"size": 8171
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
148
|
"path": "toolkit/skills/sdtk-design-layout/SKILL.md",
|
|
149
|
-
"sha256": "
|
|
150
|
-
"size":
|
|
149
|
+
"sha256": "97a5169d81ba95fa1353a59295c93e529adc0f1f8c0446f5c4ec34d3d8191804",
|
|
150
|
+
"size": 3289
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
153
|
"path": "toolkit/skills/sdtk-dev/prompts/code-quality-reviewer.md",
|
|
@@ -206,13 +206,13 @@
|
|
|
206
206
|
},
|
|
207
207
|
{
|
|
208
208
|
"path": "toolkit/skills/sdtk-screen-design-spec/references/FLOW_ACTION_SPEC_CREATION_RULES.md",
|
|
209
|
-
"sha256": "
|
|
210
|
-
"size":
|
|
209
|
+
"sha256": "c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66",
|
|
210
|
+
"size": 11973
|
|
211
211
|
},
|
|
212
212
|
{
|
|
213
213
|
"path": "toolkit/skills/sdtk-screen-design-spec/references/numbering-rules.md",
|
|
214
|
-
"sha256": "
|
|
215
|
-
"size":
|
|
214
|
+
"sha256": "920b203c82ce549e49f1beaa182d26a277883a0bf4e015147265489a246f092c",
|
|
215
|
+
"size": 1549
|
|
216
216
|
},
|
|
217
217
|
{
|
|
218
218
|
"path": "toolkit/skills/sdtk-screen-design-spec/scripts/renumber_flow_action_spec_global.py",
|
|
@@ -221,13 +221,13 @@
|
|
|
221
221
|
},
|
|
222
222
|
{
|
|
223
223
|
"path": "toolkit/skills/sdtk-screen-design-spec/scripts/validate_flow_action_spec_numbering.py",
|
|
224
|
-
"sha256": "
|
|
225
|
-
"size":
|
|
224
|
+
"sha256": "8567db6e007df8927edf748fb4175618a8712c4c5b48b9c890c22dddb983b369",
|
|
225
|
+
"size": 15054
|
|
226
226
|
},
|
|
227
227
|
{
|
|
228
228
|
"path": "toolkit/skills/sdtk-screen-design-spec/SKILL.md",
|
|
229
|
-
"sha256": "
|
|
230
|
-
"size":
|
|
229
|
+
"sha256": "4767d15d11cc2dd54cad5c77a159fb0a783dfe07372d622120e35a1c2eccd765",
|
|
230
|
+
"size": 5853
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
"path": "toolkit/skills/sdtk-test-case-spec/references/TEST_CASE_CREATION_RULES.md",
|
|
@@ -251,8 +251,8 @@
|
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
253
|
"path": "toolkit/skills-claude/api-design-spec/SKILL.md",
|
|
254
|
-
"sha256": "
|
|
255
|
-
"size":
|
|
254
|
+
"sha256": "02680cf409130185d9e415ccc7b75c89229474d12b0246d37c58cc1bf0b3248d",
|
|
255
|
+
"size": 3667
|
|
256
256
|
},
|
|
257
257
|
{
|
|
258
258
|
"path": "toolkit/skills-claude/api-doc/SKILL.md",
|
|
@@ -261,8 +261,8 @@
|
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
263
|
"path": "toolkit/skills-claude/arch/SKILL.md",
|
|
264
|
-
"sha256": "
|
|
265
|
-
"size":
|
|
264
|
+
"sha256": "381f054e376a43c86c1d2301978b9d8ef4b636d632aca018234e0425f6c25f92",
|
|
265
|
+
"size": 3051
|
|
266
266
|
},
|
|
267
267
|
{
|
|
268
268
|
"path": "toolkit/skills-claude/ba/SKILL.md",
|
|
@@ -271,8 +271,8 @@
|
|
|
271
271
|
},
|
|
272
272
|
{
|
|
273
273
|
"path": "toolkit/skills-claude/design-layout/SKILL.md",
|
|
274
|
-
"sha256": "
|
|
275
|
-
"size":
|
|
274
|
+
"sha256": "e8048498b6d97a5e7ed171bf49b4704236020e5bbbc4778da4ba46f27ce1b96b",
|
|
275
|
+
"size": 3330
|
|
276
276
|
},
|
|
277
277
|
{
|
|
278
278
|
"path": "toolkit/skills-claude/dev/SKILL.md",
|
|
@@ -306,8 +306,8 @@
|
|
|
306
306
|
},
|
|
307
307
|
{
|
|
308
308
|
"path": "toolkit/skills-claude/screen-design-spec/SKILL.md",
|
|
309
|
-
"sha256": "
|
|
310
|
-
"size":
|
|
309
|
+
"sha256": "38bbcaf3128a283fd8ae90f5fd1a0bf88a759b3be839be6be0bf12caf60aa034",
|
|
310
|
+
"size": 5770
|
|
311
311
|
},
|
|
312
312
|
{
|
|
313
313
|
"path": "toolkit/skills-claude/test-case-spec/SKILL.md",
|
|
@@ -366,8 +366,8 @@
|
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "toolkit/templates/docs/design/DESIGN_LAYOUT_TEMPLATE.md",
|
|
369
|
-
"sha256": "
|
|
370
|
-
"size":
|
|
369
|
+
"sha256": "e9f671b13bfd022d34faba8f877d9bbbbb14aaaff26b3d825c480674428151b2",
|
|
370
|
+
"size": 1302
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "toolkit/templates/docs/dev/FEATURE_IMPL_PLAN_TEMPLATE.md",
|
|
@@ -411,13 +411,13 @@
|
|
|
411
411
|
},
|
|
412
412
|
{
|
|
413
413
|
"path": "toolkit/templates/docs/specs/FLOW_ACTION_SPEC_CREATION_RULES.md",
|
|
414
|
-
"sha256": "
|
|
415
|
-
"size":
|
|
414
|
+
"sha256": "c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66",
|
|
415
|
+
"size": 11973
|
|
416
416
|
},
|
|
417
417
|
{
|
|
418
418
|
"path": "toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md",
|
|
419
|
-
"sha256": "
|
|
420
|
-
"size":
|
|
419
|
+
"sha256": "b95db006b277e2534e4f33d759df5c2ea9fd26a3e49e744081275d4e7c0eacfa",
|
|
420
|
+
"size": 5960
|
|
421
421
|
},
|
|
422
422
|
{
|
|
423
423
|
"path": "toolkit/templates/handoffs/ARCH_TO_DEV.md",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
f13f557e79ead09d5f57452d5ea7cbe192d12ac0a3de138a7a1a2514e44df505 toolkit/AGENTS.md
|
|
2
|
-
|
|
2
|
+
b212d4cd0c04429e3c855ebc08ec61aca788a30cd43098e777a42ee867b90f5e toolkit/install.ps1
|
|
3
3
|
0f3e0bfe1b5165250f0da4da5790a9e6220023752713088a0076eb7f17fd6397 toolkit/runtimes/claude/CLAUDE_TEMPLATE.md
|
|
4
4
|
4154c15c71f44d2f2caf07fb41722fa65d4f9ec7e78f798ee084effd12345c62 toolkit/runtimes/codex/CODEX_TEMPLATE.md
|
|
5
5
|
5c1f5442fd3c26b8bf62db4b25e9f1c4207258c7fe52f12ed533968f77dfbf65 toolkit/scripts/init-feature.ps1
|
|
6
|
-
|
|
6
|
+
3d13e0e2099581a4fa08ddaebe6e0dddbc09023489c8aae954eb35e1072b56b7 toolkit/scripts/install-claude-skills.ps1
|
|
7
7
|
ca64e0c2a0f13137bc6b780a57442de46a3e0551778bbcbadd4eb779c21cb203 toolkit/scripts/install-codex-skills.ps1
|
|
8
8
|
809ffc1f96528ac1cd453214cd1c2d231ca0753f0d3c19b4a20f11835a64a152 toolkit/scripts/uninstall-claude-skills.ps1
|
|
9
9
|
e0d462bd6dcdb17cc003d459063ff341bd2e4f60b245cda9b7e9b9e94b3cf01f toolkit/scripts/uninstall-codex-skills.ps1
|
|
@@ -12,21 +12,21 @@ de2921da9ce504487d9c7d97bf862b65d0ba00b9f1593a4fbfadf41ac36adb49 toolkit/sdtk.c
|
|
|
12
12
|
e169500521e556036ea550d7ea61031e27646eb7f65fd4a75a6a5c03f53eabc5 toolkit/skills/sdtk-api-design-spec/references/API_DESIGN_CREATION_RULES.md
|
|
13
13
|
d77095777dc689b545337fcdb8f61384936ed53ea9a0ca6bc8589975e284204b toolkit/skills/sdtk-api-design-spec/references/API_DESIGN_FLOWCHART_CREATION_RULES.md
|
|
14
14
|
decffe52425e22b3dd82e9c8f3768aefbb209ec58237107d84f583fee876ea8f toolkit/skills/sdtk-api-design-spec/references/FLOWCHART_CREATION_RULES.md
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
9564084f78c3b7e241cc367cd4ddd220aa20b5a4fb49473138417be5f18a6dae toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py
|
|
16
|
+
fa92b00578571925aeeb6bce4ee7f95e63d2e656605085ee683bc294e4146671 toolkit/skills/sdtk-api-design-spec/SKILL.md
|
|
17
17
|
d77095777dc689b545337fcdb8f61384936ed53ea9a0ca6bc8589975e284204b toolkit/skills/sdtk-api-doc/references/API_DESIGN_FLOWCHART_CREATION_RULES.md
|
|
18
18
|
decffe52425e22b3dd82e9c8f3768aefbb209ec58237107d84f583fee876ea8f toolkit/skills/sdtk-api-doc/references/FLOWCHART_CREATION_RULES.md
|
|
19
19
|
f29c6774019ef0789dfb88678e1ab31d4d8eb7b3ab69b2115368ef5d879e5276 toolkit/skills/sdtk-api-doc/references/YAML_CREATION_RULES.md
|
|
20
20
|
dd23e42dbdbedf6d0f9f88788957ff8f7d3e6849b533c9d1a18326944dcdeda2 toolkit/skills/sdtk-api-doc/SKILL.md
|
|
21
21
|
e169500521e556036ea550d7ea61031e27646eb7f65fd4a75a6a5c03f53eabc5 toolkit/skills/sdtk-arch/references/API_DESIGN_CREATION_RULES.md
|
|
22
22
|
d77095777dc689b545337fcdb8f61384936ed53ea9a0ca6bc8589975e284204b toolkit/skills/sdtk-arch/references/API_DESIGN_FLOWCHART_CREATION_RULES.md
|
|
23
|
-
|
|
23
|
+
c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66 toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md
|
|
24
24
|
decffe52425e22b3dd82e9c8f3768aefbb209ec58237107d84f583fee876ea8f toolkit/skills/sdtk-arch/references/FLOWCHART_CREATION_RULES.md
|
|
25
25
|
f29c6774019ef0789dfb88678e1ab31d4d8eb7b3ab69b2115368ef5d879e5276 toolkit/skills/sdtk-arch/references/YAML_CREATION_RULES.md
|
|
26
26
|
469a274eca3ac8a353f67a6159feed430b6f14dee6f5a090248e202b51e8a5cd toolkit/skills/sdtk-arch/SKILL.md
|
|
27
27
|
2548951bc437bf05066cbedb9adf71a66739eab7e4bbc920650fc9415cea6e8d toolkit/skills/sdtk-ba/SKILL.md
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
5ae589e058ae6af6cec724ecc8cb48b2dab78a2aa2f4df9aff58925c7b60a25c toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py
|
|
29
|
+
97a5169d81ba95fa1353a59295c93e529adc0f1f8c0446f5c4ec34d3d8191804 toolkit/skills/sdtk-design-layout/SKILL.md
|
|
30
30
|
3d44bc436dab6201beeb4fed52ab3aa94791c51baca7b7b8e2e8a5ecd6c08baf toolkit/skills/sdtk-dev/prompts/code-quality-reviewer.md
|
|
31
31
|
9bed2859fbeee84257199e63eb471874975d26d57f5a19dcedab0c06980e24ad toolkit/skills/sdtk-dev/prompts/implementer.md
|
|
32
32
|
1dc33dd59afe48c4c78564bdb32999b9a4f34958361ad8f5580cef0e77c953ef toolkit/skills/sdtk-dev/prompts/spec-reviewer.md
|
|
@@ -38,27 +38,27 @@ dcb763d46fc49d977a7ef608541c36950ac6958da26729696e07f98082a07552 toolkit/skills
|
|
|
38
38
|
c6092cb13646afdd6d49ca2766b52b1265a542f0452fadd0b7c716478b0435b5 toolkit/skills/sdtk-qa/SKILL.md
|
|
39
39
|
97f65fd84c80e4836c9bbb82d8b7fc81527336c55dbbd82ea5e69672e21b22e4 toolkit/skills/sdtk-screen-design-spec/references/excel-image-export.md
|
|
40
40
|
a9b414a07d76e63331ffc832dea2381357f9a99e2cd82ea74f713b3a9d7acee7 toolkit/skills/sdtk-screen-design-spec/references/figma-mcp.md
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66 toolkit/skills/sdtk-screen-design-spec/references/FLOW_ACTION_SPEC_CREATION_RULES.md
|
|
42
|
+
920b203c82ce549e49f1beaa182d26a277883a0bf4e015147265489a246f092c toolkit/skills/sdtk-screen-design-spec/references/numbering-rules.md
|
|
43
43
|
b54b14cc75c02c3fe9f89547b3f09baf1d7d036ef5f3d9f40487516e22351c45 toolkit/skills/sdtk-screen-design-spec/scripts/renumber_flow_action_spec_global.py
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
8567db6e007df8927edf748fb4175618a8712c4c5b48b9c890c22dddb983b369 toolkit/skills/sdtk-screen-design-spec/scripts/validate_flow_action_spec_numbering.py
|
|
45
|
+
4767d15d11cc2dd54cad5c77a159fb0a783dfe07372d622120e35a1c2eccd765 toolkit/skills/sdtk-screen-design-spec/SKILL.md
|
|
46
46
|
7c21e74f5eee712c6b65665b4f10483ed008113186a92dc0a4673ce1fcd3ef5c toolkit/skills/sdtk-test-case-spec/references/TEST_CASE_CREATION_RULES.md
|
|
47
47
|
4d1e813908114f2be68007fb7373973e2c6e0aebc5a6305b8b19443d5ae477d0 toolkit/skills/sdtk-test-case-spec/scripts/validate_test_case_spec.py
|
|
48
48
|
c4e9e276b440bbe0822fb0c0ff62d6eb0dea5e8fb25f1a9f342ebcf30a12b754 toolkit/skills/sdtk-test-case-spec/SKILL.md
|
|
49
49
|
9b1a4917cd1cccbacd11d3922319b2abdbc763f0b6906b1875f840ed967e4975 toolkit/skills/skills.catalog.yaml
|
|
50
|
-
|
|
50
|
+
02680cf409130185d9e415ccc7b75c89229474d12b0246d37c58cc1bf0b3248d toolkit/skills-claude/api-design-spec/SKILL.md
|
|
51
51
|
6f6ddb470bc61d286b84418e299b360d5f148e6bed75fa50b6c8f2929e6fe49c toolkit/skills-claude/api-doc/SKILL.md
|
|
52
|
-
|
|
52
|
+
381f054e376a43c86c1d2301978b9d8ef4b636d632aca018234e0425f6c25f92 toolkit/skills-claude/arch/SKILL.md
|
|
53
53
|
4dd1db27839c73a8ec0bba2b465b7cacffd55393a325a822ced8f2f209f6b51b toolkit/skills-claude/ba/SKILL.md
|
|
54
|
-
|
|
54
|
+
e8048498b6d97a5e7ed171bf49b4704236020e5bbbc4778da4ba46f27ce1b96b toolkit/skills-claude/design-layout/SKILL.md
|
|
55
55
|
cea9f6512bc805d5b22a84a4ef8dbd229b4f7a3f073f9e125e933e6e79a206d5 toolkit/skills-claude/dev/SKILL.md
|
|
56
56
|
142a8fe088a4b0326ca79e00200cb5f562c53728b7adc83e6b749db6e29f1d0d toolkit/skills-claude/dev-backend/SKILL.md
|
|
57
57
|
1631bd51bc3d0106c18f4c00412f6279626bdce9f0e310822d5dcdff08063a88 toolkit/skills-claude/dev-frontend/SKILL.md
|
|
58
58
|
c8e8303f1833e71cacdf20b1f398e476b44b3de14fbffad9a404c2a68fa713a3 toolkit/skills-claude/orchestrator/SKILL.md
|
|
59
59
|
b34621fe61957e573c616ad816d591a60a6c8d1333d0bfb71f39f45b93331cb0 toolkit/skills-claude/pm/SKILL.md
|
|
60
60
|
3ab5af1b27aa0947052ef7b76abca132d89b78b74516b8668474c08c344289aa toolkit/skills-claude/qa/SKILL.md
|
|
61
|
-
|
|
61
|
+
38bbcaf3128a283fd8ae90f5fd1a0bf88a759b3be839be6be0bf12caf60aa034 toolkit/skills-claude/screen-design-spec/SKILL.md
|
|
62
62
|
c397431a7752fcdee1dbb7720472703d262bfcc8fb543c4562fbc24a79064769 toolkit/skills-claude/test-case-spec/SKILL.md
|
|
63
63
|
e169500521e556036ea550d7ea61031e27646eb7f65fd4a75a6a5c03f53eabc5 toolkit/templates/docs/api/API_DESIGN_CREATION_RULES.md
|
|
64
64
|
7a13ed21baa2f8ccf2dc3a4ecdd2e30c90f0cbcbbcff06db2a64df6a8945b727 toolkit/templates/docs/api/API_DESIGN_DETAIL_TEMPLATE.md
|
|
@@ -70,7 +70,7 @@ decffe52425e22b3dd82e9c8f3768aefbb209ec58237107d84f583fee876ea8f toolkit/templa
|
|
|
70
70
|
f29c6774019ef0789dfb88678e1ab31d4d8eb7b3ab69b2115368ef5d879e5276 toolkit/templates/docs/api/YAML_CREATION_RULES.md
|
|
71
71
|
bc32ad83f06dc60ada7312f8d05f56b12da2d5e99c275fbc7895cf1e34a6c358 toolkit/templates/docs/architecture/ARCH_DESIGN_TEMPLATE.md
|
|
72
72
|
d4cec8811e2a336a0ab8dd6e68998753cf7eca927207cdb8afc20666a5c452f7 toolkit/templates/docs/database/DATABASE_SPEC_TEMPLATE.md
|
|
73
|
-
|
|
73
|
+
e9f671b13bfd022d34faba8f877d9bbbbb14aaaff26b3d825c480674428151b2 toolkit/templates/docs/design/DESIGN_LAYOUT_TEMPLATE.md
|
|
74
74
|
b7bb3ed90857029f3e7c38f628bac8e04f4ba0ea506c9bbf940765da55b19df1 toolkit/templates/docs/dev/FEATURE_IMPL_PLAN_TEMPLATE.md
|
|
75
75
|
35488641da64f1bca10c985f66c495da85257d193aad1879a5bd9152e6bbc8c5 toolkit/templates/docs/product/BACKLOG_TEMPLATE.md
|
|
76
76
|
8c04fe6dcfdc1f2de178dddcafe9ea92803f1a94b1bbc9ef351be632cf04af94 toolkit/templates/docs/product/PRD_TEMPLATE.md
|
|
@@ -79,8 +79,8 @@ e8d3554fc4893a8a57fbf006e58f37f21347de5f31ce02f0717e97d29b387eea toolkit/templa
|
|
|
79
79
|
7c21e74f5eee712c6b65665b4f10483ed008113186a92dc0a4673ce1fcd3ef5c toolkit/templates/docs/qa/TEST_CASE_CREATION_RULES.md
|
|
80
80
|
4b64a123d6e22edefa17a23a1eff766cf612ec5fa2f78b34bf50eecb39abf06a toolkit/templates/docs/qa/TEST_CASE_TEMPLATE.md
|
|
81
81
|
3b5f911d5e0eb042efc388ef3a441285a57d2dc02ae032d080934495e2d06f4d toolkit/templates/docs/specs/BA_SPEC_TEMPLATE.md
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66 toolkit/templates/docs/specs/FLOW_ACTION_SPEC_CREATION_RULES.md
|
|
83
|
+
b95db006b277e2534e4f33d759df5c2ea9fd26a3e49e744081275d4e7c0eacfa toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md
|
|
84
84
|
8af30132cee4a0e9740e56e678f292649b096a22a97d03d5c099480bcd19ad0a toolkit/templates/handoffs/ARCH_TO_DEV.md
|
|
85
85
|
e0195c1815bc14852d02e9ee57ebc1845df80c02a6d052a12f8ed12b82941cc3 toolkit/templates/handoffs/BA_TO_ARCH.md
|
|
86
86
|
4450703248fa18c9d9a2c030cfe253c95fc812bc45a427c3b30b4312734b6684 toolkit/templates/handoffs/DEV_STAGE1_SPEC_REVIEW.md
|
|
@@ -58,6 +58,46 @@ function Copy-File {
|
|
|
58
58
|
Copy-Item -LiteralPath $SourcePath -Destination $DestinationPath -Force
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
function Install-ClaudeSkillDirectory {
|
|
62
|
+
param(
|
|
63
|
+
[Parameter(Mandatory = $true)][System.IO.DirectoryInfo]$SkillDir,
|
|
64
|
+
[Parameter(Mandatory = $true)][string]$SkillsDest,
|
|
65
|
+
[Parameter(Mandatory = $true)][string]$ToolkitRoot,
|
|
66
|
+
[Parameter(Mandatory = $true)][bool]$Overwrite
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
$destDir = Join-Path $SkillsDest $SkillDir.Name
|
|
70
|
+
if (Test-Path -LiteralPath $destDir) {
|
|
71
|
+
if (-not $Overwrite) {
|
|
72
|
+
Write-Warning "Already exists (skipping). Use -Force to overwrite: $destDir"
|
|
73
|
+
return $true
|
|
74
|
+
}
|
|
75
|
+
Remove-Item -LiteralPath $destDir -Recurse -Force
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
$parent = Split-Path -Parent $destDir
|
|
79
|
+
if ($parent -and -not (Test-Path -LiteralPath $parent)) {
|
|
80
|
+
New-Item -ItemType Directory -Force -Path $parent | Out-Null
|
|
81
|
+
}
|
|
82
|
+
Copy-Item -LiteralPath $SkillDir.FullName -Destination $destDir -Recurse -Force
|
|
83
|
+
|
|
84
|
+
$canonicalSkillDir = Join-Path $ToolkitRoot "skills/sdtk-$($SkillDir.Name)"
|
|
85
|
+
foreach ($subDirName in @('scripts', 'prompts')) {
|
|
86
|
+
$srcSubDir = Join-Path $canonicalSkillDir $subDirName
|
|
87
|
+
$destSubDir = Join-Path $destDir $subDirName
|
|
88
|
+
if (-not (Test-Path -LiteralPath $srcSubDir)) {
|
|
89
|
+
continue
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (Test-Path -LiteralPath $destSubDir) {
|
|
93
|
+
Remove-Item -LiteralPath $destSubDir -Recurse -Force
|
|
94
|
+
}
|
|
95
|
+
Copy-Item -LiteralPath $srcSubDir -Destination $destSubDir -Recurse -Force
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return $true
|
|
99
|
+
}
|
|
100
|
+
|
|
61
101
|
function Install-RuntimeAdapter {
|
|
62
102
|
param(
|
|
63
103
|
[Parameter(Mandatory = $true)][string]$ToolkitRoot,
|
|
@@ -102,9 +142,9 @@ function Install-ClaudeSkills {
|
|
|
102
142
|
$srcFile = Join-Path $skillDir.FullName 'SKILL.md'
|
|
103
143
|
if (-not (Test-Path -LiteralPath $srcFile)) { continue }
|
|
104
144
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
145
|
+
if (Install-ClaudeSkillDirectory -SkillDir $skillDir -SkillsDest $skillsDest -ToolkitRoot $ToolkitRoot -Overwrite $Overwrite) {
|
|
146
|
+
$skillCount++
|
|
147
|
+
}
|
|
108
148
|
}
|
|
109
149
|
|
|
110
150
|
# Install reference files
|
|
@@ -267,4 +307,4 @@ if (-not $Quiet) {
|
|
|
267
307
|
}
|
|
268
308
|
Write-Host '3) Generate feature docs:'
|
|
269
309
|
Write-Host ' sdtk generate --feature-key YOUR_FEATURE --feature-name "Your Feature"'
|
|
270
|
-
}
|
|
310
|
+
}
|
|
@@ -34,6 +34,46 @@ function Copy-File {
|
|
|
34
34
|
Copy-Item -LiteralPath $SourcePath -Destination $DestinationPath -Force
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
function Install-ClaudeSkillDirectory {
|
|
38
|
+
param(
|
|
39
|
+
[Parameter(Mandatory = $true)][System.IO.DirectoryInfo]$SkillDir,
|
|
40
|
+
[Parameter(Mandatory = $true)][string]$SkillsDest,
|
|
41
|
+
[Parameter(Mandatory = $true)][string]$ToolkitRoot,
|
|
42
|
+
[Parameter(Mandatory = $true)][bool]$Overwrite
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
$destDir = Join-Path $SkillsDest $SkillDir.Name
|
|
46
|
+
if (Test-Path -LiteralPath $destDir) {
|
|
47
|
+
if (-not $Overwrite) {
|
|
48
|
+
Write-Warning "Already exists (skipping). Use -Force to overwrite: $destDir"
|
|
49
|
+
return $true
|
|
50
|
+
}
|
|
51
|
+
Remove-Item -LiteralPath $destDir -Recurse -Force
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
$parent = Split-Path -Parent $destDir
|
|
55
|
+
if ($parent -and -not (Test-Path -LiteralPath $parent)) {
|
|
56
|
+
New-Item -ItemType Directory -Force -Path $parent | Out-Null
|
|
57
|
+
}
|
|
58
|
+
Copy-Item -LiteralPath $SkillDir.FullName -Destination $destDir -Recurse -Force
|
|
59
|
+
|
|
60
|
+
$canonicalSkillDir = Join-Path $ToolkitRoot "skills/sdtk-$($SkillDir.Name)"
|
|
61
|
+
foreach ($subDirName in @('scripts', 'prompts')) {
|
|
62
|
+
$srcSubDir = Join-Path $canonicalSkillDir $subDirName
|
|
63
|
+
$destSubDir = Join-Path $destDir $subDirName
|
|
64
|
+
if (-not (Test-Path -LiteralPath $srcSubDir)) {
|
|
65
|
+
continue
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (Test-Path -LiteralPath $destSubDir) {
|
|
69
|
+
Remove-Item -LiteralPath $destSubDir -Recurse -Force
|
|
70
|
+
}
|
|
71
|
+
Copy-Item -LiteralPath $srcSubDir -Destination $destSubDir -Recurse -Force
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return $true
|
|
75
|
+
}
|
|
76
|
+
|
|
37
77
|
$toolkitRoot = Resolve-Path (Join-Path $PSScriptRoot '..')
|
|
38
78
|
|
|
39
79
|
# Resolve destination based on scope
|
|
@@ -59,9 +99,9 @@ foreach ($skillDir in (Get-ChildItem -Path $skillsSource -Directory)) {
|
|
|
59
99
|
$srcFile = Join-Path $skillDir.FullName 'SKILL.md'
|
|
60
100
|
if (-not (Test-Path -LiteralPath $srcFile)) { continue }
|
|
61
101
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
102
|
+
if (Install-ClaudeSkillDirectory -SkillDir $skillDir -SkillsDest $skillsDest -ToolkitRoot $toolkitRoot -Overwrite ([bool]$Force)) {
|
|
103
|
+
$skillCount++
|
|
104
|
+
}
|
|
65
105
|
}
|
|
66
106
|
|
|
67
107
|
# Install reference files
|
|
@@ -36,7 +36,7 @@ description: Generate detailed API design markdown (`[FEATURE_KEY]_API_DESIGN_DE
|
|
|
36
36
|
## Generation Procedure
|
|
37
37
|
1. Resolve input files (`yaml`, `flow_list`, `output`).
|
|
38
38
|
2. Parse YAML endpoints (method, path, request schema, success/error schema).
|
|
39
|
-
3. Parse flow blocks from flow list (`@startuml ... @enduml`) and map by `METHOD + path`.
|
|
39
|
+
3. Parse flow blocks from flow list (`@startuml ... @enduml`) and map by normalized `METHOD + path`.
|
|
40
40
|
4. Generate detailed markdown sections per API:
|
|
41
41
|
- Flow summary / notes / login bullets from YAML `description`
|
|
42
42
|
- Process flow source block (`text` fenced block)
|
package/assets/toolkit/toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py
CHANGED
|
@@ -53,6 +53,49 @@ def normalize_feature_snake(feature_key: str) -> str:
|
|
|
53
53
|
return re.sub(r"[^a-z0-9]+", "_", feature_key.lower()).strip("_")
|
|
54
54
|
|
|
55
55
|
|
|
56
|
+
def collect_server_prefixes(spec: dict) -> List[str]:
|
|
57
|
+
prefixes: List[str] = []
|
|
58
|
+
for server in spec.get("servers", []) or []:
|
|
59
|
+
url = str((server or {}).get("url", "")).strip()
|
|
60
|
+
if not url:
|
|
61
|
+
continue
|
|
62
|
+
if "://" in url:
|
|
63
|
+
match = re.match(r"https?://[^/]+(?P<path>/.*)?", url)
|
|
64
|
+
url = match.group("path") if match and match.group("path") else "/"
|
|
65
|
+
if not url.startswith("/"):
|
|
66
|
+
continue
|
|
67
|
+
normalized = re.sub(r"/{2,}", "/", url).rstrip("/")
|
|
68
|
+
if normalized:
|
|
69
|
+
prefixes.append(normalized)
|
|
70
|
+
return sorted(set(prefixes), key=len, reverse=True)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def normalize_match_path(path: str, server_prefixes: List[str]) -> str:
|
|
74
|
+
normalized = path.strip()
|
|
75
|
+
if "://" in normalized:
|
|
76
|
+
match = re.match(r"https?://[^/]+(?P<path>/.*)?", normalized)
|
|
77
|
+
normalized = match.group("path") if match and match.group("path") else "/"
|
|
78
|
+
normalized = normalized.split("?", maxsplit=1)[0].strip()
|
|
79
|
+
if not normalized.startswith("/"):
|
|
80
|
+
normalized = "/" + normalized
|
|
81
|
+
normalized = re.sub(r"/{2,}", "/", normalized)
|
|
82
|
+
|
|
83
|
+
for prefix in server_prefixes:
|
|
84
|
+
if normalized == prefix:
|
|
85
|
+
normalized = "/"
|
|
86
|
+
break
|
|
87
|
+
if normalized.startswith(prefix + "/"):
|
|
88
|
+
normalized = normalized[len(prefix) :]
|
|
89
|
+
break
|
|
90
|
+
|
|
91
|
+
if not normalized.startswith("/"):
|
|
92
|
+
normalized = "/" + normalized
|
|
93
|
+
if len(normalized) > 1:
|
|
94
|
+
normalized = normalized.rstrip("/")
|
|
95
|
+
normalized = re.sub(r"\{[^/]+\}", "{}", normalized)
|
|
96
|
+
return normalized
|
|
97
|
+
|
|
98
|
+
|
|
56
99
|
def parse_include_filters(raw_filters: List[str]) -> List[Tuple[Optional[str], str]]:
|
|
57
100
|
parsed: List[Tuple[Optional[str], str]] = []
|
|
58
101
|
for raw in raw_filters:
|
|
@@ -99,18 +142,30 @@ def collect_operations(spec: dict, include_filters: List[Tuple[Optional[str], st
|
|
|
99
142
|
return operations
|
|
100
143
|
|
|
101
144
|
|
|
102
|
-
def
|
|
103
|
-
|
|
145
|
+
def extract_flow_signature(block: str, server_prefixes: List[str]) -> Tuple[Optional[str], Optional[str]]:
|
|
146
|
+
patterns = [
|
|
147
|
+
r'partition\s+"API:\s*([A-Z]+)\s+(\S+)(?:\s{2,}.*?)?"\s*\{',
|
|
148
|
+
r'partition\s+"([A-Z]+)\s+\*\*(.*?)\*\*',
|
|
149
|
+
r'partition\s+"API:\s*([A-Z]+)\s+\*\*(.*?)\*\*',
|
|
150
|
+
]
|
|
151
|
+
for pattern in patterns:
|
|
152
|
+
match = re.search(pattern, block)
|
|
153
|
+
if not match:
|
|
154
|
+
continue
|
|
155
|
+
method = match.group(1).lower().strip()
|
|
156
|
+
path = normalize_match_path(match.group(2), server_prefixes)
|
|
157
|
+
return method, path
|
|
158
|
+
return None, None
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def collect_flow_blocks(flow_text: str, server_prefixes: List[str]) -> List[Tuple[Optional[str], Optional[str], str]]:
|
|
162
|
+
blocks_with_meta: List[Tuple[Optional[str], Optional[str], str]] = []
|
|
104
163
|
blocks = re.findall(r"@startuml[\s\S]*?@enduml", flow_text)
|
|
105
164
|
for block in blocks:
|
|
106
|
-
m = re.search(r'partition\s+"([A-Z]+)\s+\*\*(.*?)\*\*', block)
|
|
107
|
-
if not m:
|
|
108
|
-
continue
|
|
109
|
-
method = m.group(1).lower().strip()
|
|
110
|
-
path = m.group(2).strip()
|
|
111
165
|
sanitized = re.sub(r";<<#[^>]+>>", ";", block.strip())
|
|
112
|
-
|
|
113
|
-
|
|
166
|
+
method, path = extract_flow_signature(sanitized, server_prefixes)
|
|
167
|
+
blocks_with_meta.append((method, path, sanitized + "\n"))
|
|
168
|
+
return blocks_with_meta
|
|
114
169
|
|
|
115
170
|
|
|
116
171
|
def slugify(text: str) -> str:
|
|
@@ -435,13 +490,19 @@ def main() -> int:
|
|
|
435
490
|
images_dir = Path(args.images_dir)
|
|
436
491
|
|
|
437
492
|
spec = load_yaml(yaml_path)
|
|
493
|
+
server_prefixes = collect_server_prefixes(spec)
|
|
438
494
|
include_filters = parse_include_filters(args.include)
|
|
439
495
|
operations = collect_operations(spec, include_filters)
|
|
440
496
|
if not operations:
|
|
441
497
|
raise RuntimeError("No API operations selected from YAML")
|
|
442
498
|
|
|
443
|
-
|
|
499
|
+
flow_blocks = collect_flow_blocks(flow_path.read_text(encoding="utf-8"), server_prefixes)
|
|
500
|
+
flow_map: Dict[Tuple[str, str], str] = {}
|
|
501
|
+
for block_method, block_path, block_text in flow_blocks:
|
|
502
|
+
if block_method and block_path and (block_method, block_path) not in flow_map:
|
|
503
|
+
flow_map[(block_method, block_path)] = block_text
|
|
444
504
|
missing_flows: List[str] = []
|
|
505
|
+
order_fallbacks: List[str] = []
|
|
445
506
|
|
|
446
507
|
flows_dir.mkdir(parents=True, exist_ok=True)
|
|
447
508
|
images_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -481,7 +542,18 @@ def main() -> int:
|
|
|
481
542
|
svg_rel = Path(os.path.relpath(svg_path, output_path.parent))
|
|
482
543
|
desc_sections = parse_description_sections(str(op.get("description", "")))
|
|
483
544
|
|
|
484
|
-
|
|
545
|
+
normalized_path = normalize_match_path(path, server_prefixes)
|
|
546
|
+
flow = flow_map.get((method, normalized_path))
|
|
547
|
+
if not flow and len(flow_blocks) == len(operations):
|
|
548
|
+
candidate_method, candidate_path, candidate_flow = flow_blocks[i - 1]
|
|
549
|
+
flow = candidate_flow
|
|
550
|
+
if candidate_method and candidate_path and (candidate_method != method or candidate_path != normalized_path):
|
|
551
|
+
order_fallbacks.append(
|
|
552
|
+
f"{method.upper()} {path} -> used block {i} by order fallback despite signature mismatch "
|
|
553
|
+
f"({candidate_method.upper()} {candidate_path})"
|
|
554
|
+
)
|
|
555
|
+
else:
|
|
556
|
+
order_fallbacks.append(f"{method.upper()} {path} -> used block {i} by order fallback")
|
|
485
557
|
if not flow:
|
|
486
558
|
missing_flows.append(f"{method.upper()} {path}")
|
|
487
559
|
flow = (
|
|
@@ -638,6 +710,10 @@ def main() -> int:
|
|
|
638
710
|
print("[WARN] Missing flow blocks:")
|
|
639
711
|
for item in missing_flows:
|
|
640
712
|
print(f" - {item}")
|
|
713
|
+
if order_fallbacks:
|
|
714
|
+
print("[WARN] Flow block order fallback used:")
|
|
715
|
+
for item in order_fallbacks:
|
|
716
|
+
print(f" - {item}")
|
|
641
717
|
if render_errors:
|
|
642
718
|
print("[WARN] Render issues:")
|
|
643
719
|
for item in render_errors:
|
package/assets/toolkit/toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md
CHANGED
|
@@ -94,6 +94,7 @@ If a section is not in scope, keep the section and mark explicitly as `N/A` with
|
|
|
94
94
|
|
|
95
95
|
- Use one numbering mode only: `global across document`.
|
|
96
96
|
- Number values must increase across all action tables in the document.
|
|
97
|
+
- DESIGN_LAYOUT wireframe markers are a separate screen-local visual system. They may reset per screen and do not need to numerically equal the global action-table `No`.
|
|
97
98
|
- Avoid duplicate item descriptions for the same UI control across screens unless behavior differs.
|
|
98
99
|
- If duplicate number is intentional (rare), annotate reason in `Note`.
|
|
99
100
|
|
|
@@ -127,6 +128,19 @@ Rules:
|
|
|
127
128
|
- The flow-action spec and the design-layout doc must remain separate documents.
|
|
128
129
|
- When Figma becomes available later, update the source mode from `generated-draft` to `source-backed`.
|
|
129
130
|
|
|
131
|
+
## 5.2 Wireframe Marker Mapping for Generated-Draft Screens
|
|
132
|
+
|
|
133
|
+
For generated-draft screens with rendered design-layout images:
|
|
134
|
+
|
|
135
|
+
- Treat wireframe markers as screen-local visual references only.
|
|
136
|
+
- Keep action-table `No` global across the document per section 4.
|
|
137
|
+
- Add a wireframe marker mapping table directly under the screen image.
|
|
138
|
+
- Use this stable header:
|
|
139
|
+
- `No | Wireframe Marker | Action Table No | Item Name | Notes`
|
|
140
|
+
- Map only the items visibly present on the wireframe image.
|
|
141
|
+
- If an action-table row is not visible on the wireframe, state `Not shown on wireframe` in `Notes` instead of inventing a marker.
|
|
142
|
+
- If the wireframe label and the action-table label differ slightly, keep the action-table item name and explain the label difference in `Notes`.
|
|
143
|
+
|
|
130
144
|
## 6. API Traceability Rules
|
|
131
145
|
|
|
132
146
|
- Every actionable UI event that changes state must map to a write API.
|
|
@@ -136,8 +150,11 @@ Rules:
|
|
|
136
150
|
|
|
137
151
|
## 7. PlantUML Rules for Screen Flow
|
|
138
152
|
|
|
139
|
-
- Use
|
|
140
|
-
-
|
|
153
|
+
- Use new-style PlantUML activity diagram syntax only for screen-flow diagrams.
|
|
154
|
+
- Allowed activity constructs include: `start`, `stop`, `partition "..." {}`, `:Activity;`, `->`, `if/then/else/endif`, `fork`, `fork again`, `end fork`, and `note right/left`.
|
|
155
|
+
- Do not mix legacy activity syntax such as `(*)`, `-->`, or `[edge label]` with new-style activity actions like `:Activity;`.
|
|
156
|
+
- Validate renderability before handoff. If a renderer is unavailable in the current environment, at minimum keep the block internally consistent with new-style activity syntax only.
|
|
157
|
+
- Use `\\n` for multi-line labels in activity nodes and notes.
|
|
141
158
|
- Keep diagram at navigation/action level (not low-level SQL or backend internals).
|
|
142
159
|
- Ensure screen names in PlantUML match section names in layout spec.
|
|
143
160
|
|
|
@@ -147,7 +164,8 @@ Rules:
|
|
|
147
164
|
1. Confirmed design source (for example Figma)
|
|
148
165
|
2. Confirmed requirement files (Excel/spec)
|
|
149
166
|
3. User-provided screenshots
|
|
150
|
-
- Store images in repository-relative paths.
|
|
167
|
+
- Store images in repository-relative filesystem paths.
|
|
168
|
+
- Reference images in markdown using file-relative paths from the spec file's directory.
|
|
151
169
|
- Do not keep temporary local absolute paths in markdown.
|
|
152
170
|
|
|
153
171
|
### 8.1 Rendered Screen Images for Generated-Draft Screens
|
|
@@ -155,8 +173,10 @@ Rules:
|
|
|
155
173
|
When `Design Source Type` is `generated-draft`:
|
|
156
174
|
- Screen preview images may be rendered from `DESIGN_LAYOUT_[FEATURE_KEY].md` PlantUML SALT wireframes.
|
|
157
175
|
- Renderer: `toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py`
|
|
158
|
-
- Expected output path: `docs/specs/assets/<feature_snake>/screens/<screen_id>.svg`
|
|
159
|
-
-
|
|
176
|
+
- Expected output path (filesystem): `docs/specs/assets/<feature_snake>/screens/<screen_id>.svg`
|
|
177
|
+
- Markdown image path (file-relative from `docs/specs/*_FLOW_ACTION_SPEC.md`): `assets/<feature_snake>/screens/<screen_id>.svg`
|
|
178
|
+
- DESIGN_LAYOUT markers inside the image are screen-local visual references and may reset per screen; use the wireframe mapping table to bridge them to the global action-table `No`.
|
|
179
|
+
- If the rendered `.svg` file exists, use the file-relative markdown path in the `Screen image:` reference.
|
|
160
180
|
- If rendering is unavailable or the `.svg` does not exist, replace the image line with:
|
|
161
181
|
`> Screen image not rendered in this environment. See Design Source Reference for layout.`
|
|
162
182
|
- Do not leave a broken image reference pointing to a non-existent file.
|