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.
Files changed (21) hide show
  1. package/assets/manifest/toolkit-bundle.manifest.json +39 -39
  2. package/assets/manifest/toolkit-bundle.sha256.txt +18 -18
  3. package/assets/toolkit/toolkit/install.ps1 +44 -4
  4. package/assets/toolkit/toolkit/scripts/install-claude-skills.ps1 +43 -3
  5. package/assets/toolkit/toolkit/skills/sdtk-api-design-spec/SKILL.md +1 -1
  6. package/assets/toolkit/toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py +87 -11
  7. package/assets/toolkit/toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
  8. package/assets/toolkit/toolkit/skills/sdtk-design-layout/SKILL.md +16 -5
  9. package/assets/toolkit/toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py +34 -1
  10. package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/SKILL.md +17 -4
  11. package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/references/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
  12. package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/references/numbering-rules.md +20 -68
  13. package/assets/toolkit/toolkit/skills/sdtk-screen-design-spec/scripts/validate_flow_action_spec_numbering.py +168 -3
  14. package/assets/toolkit/toolkit/skills-claude/api-design-spec/SKILL.md +22 -8
  15. package/assets/toolkit/toolkit/skills-claude/arch/SKILL.md +26 -39
  16. package/assets/toolkit/toolkit/skills-claude/design-layout/SKILL.md +38 -6
  17. package/assets/toolkit/toolkit/skills-claude/screen-design-spec/SKILL.md +47 -25
  18. package/assets/toolkit/toolkit/templates/docs/design/DESIGN_LAYOUT_TEMPLATE.md +12 -1
  19. package/assets/toolkit/toolkit/templates/docs/specs/FLOW_ACTION_SPEC_CREATION_RULES.md +25 -5
  20. package/assets/toolkit/toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md +34 -9
  21. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.3.8",
3
- "sourceCommit": "9753d286b48644a330683e5570ffd1b2dbe18ffe",
4
- "buildTimestamp": "2026-03-19T02:33:04Z",
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": "e717a2791fb597d7a21f57f4c4790dbc545e954f0af3ca0c47f160f78c8a2474",
15
- "size": 9777
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": "8c66c27262ad4abc3c42bbcbe3a97752a5f29956ac93397133e6780354911549",
35
- "size": 4315
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": "c6147e7b01632cb6ffa017af43e4e5c9e1f98d160ed812ade1d087b1f3ca5490",
80
- "size": 24583
79
+ "sha256": "9564084f78c3b7e241cc367cd4ddd220aa20b5a4fb49473138417be5f18a6dae",
80
+ "size": 28067
81
81
  },
82
82
  {
83
83
  "path": "toolkit/skills/sdtk-api-design-spec/SKILL.md",
84
- "sha256": "6b653f9858f5daa8ae4f2d425f28332676a60053d210aaf8ebccdadc3de9f026",
85
- "size": 3857
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": "e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0",
120
- "size": 10052
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": "ee01a3daeeb4822429f4dcf530c11f15ac65df6700615beefd6c04c3fb41bbbc",
145
- "size": 6832
144
+ "sha256": "5ae589e058ae6af6cec724ecc8cb48b2dab78a2aa2f4df9aff58925c7b60a25c",
145
+ "size": 8171
146
146
  },
147
147
  {
148
148
  "path": "toolkit/skills/sdtk-design-layout/SKILL.md",
149
- "sha256": "e3d739dd8167b3800075fabb4aa8458a29481b85626d8f6bb5ac2e76dd229527",
150
- "size": 1928
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": "e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0",
210
- "size": 10052
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": "4edd3318634fbc142f1ce3161fc3ac93d901a6bb7f0add1d1bed7fc25293c4d9",
215
- "size": 3833
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": "ae0bc9b120c19a142f10cc79168a8f7d6bf8a37e48341fc16cbc74bbdc2e692c",
225
- "size": 8481
224
+ "sha256": "8567db6e007df8927edf748fb4175618a8712c4c5b48b9c890c22dddb983b369",
225
+ "size": 15054
226
226
  },
227
227
  {
228
228
  "path": "toolkit/skills/sdtk-screen-design-spec/SKILL.md",
229
- "sha256": "36ddb765725ec9cc4b01fe02cac222cf7e621643bc1212bac6e073b942f3eee0",
230
- "size": 4446
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": "123873681ff65792a9a269b264155c65a5feb68b23e4eeb1e68cb7da1a137d54",
255
- "size": 3252
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": "e293fd71f9fc71ac63e5e53bf55fbfe9c71e186e298b2fd3429c71a4e972a8b1",
265
- "size": 4175
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": "9765f229108c5aff27457489707218570ad83dc362353a79c2f5a78607adf4de",
275
- "size": 840
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": "5686da60872f1a3c6791e9a740897d4a564f40d53d54902a47fbc3165e68a1ec",
310
- "size": 3261
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": "26fc80a5bced4b67debea943a49c729532a576146a81994f7e28615c3debe681",
370
- "size": 845
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": "e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0",
415
- "size": 10052
414
+ "sha256": "c45705bfe9541d67e3a1e50b91741f9c7a4a006932756d9bed611e67ac832d66",
415
+ "size": 11973
416
416
  },
417
417
  {
418
418
  "path": "toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md",
419
- "sha256": "97367b222dbe970c5b1f08fd72533d778a422cd209bc82f32dd67b9b98827f0f",
420
- "size": 4879
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
- e717a2791fb597d7a21f57f4c4790dbc545e954f0af3ca0c47f160f78c8a2474 toolkit/install.ps1
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
- 8c66c27262ad4abc3c42bbcbe3a97752a5f29956ac93397133e6780354911549 toolkit/scripts/install-claude-skills.ps1
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
- c6147e7b01632cb6ffa017af43e4e5c9e1f98d160ed812ade1d087b1f3ca5490 toolkit/skills/sdtk-api-design-spec/scripts/generate_api_design_detail.py
16
- 6b653f9858f5daa8ae4f2d425f28332676a60053d210aaf8ebccdadc3de9f026 toolkit/skills/sdtk-api-design-spec/SKILL.md
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
- e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0 toolkit/skills/sdtk-arch/references/FLOW_ACTION_SPEC_CREATION_RULES.md
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
- ee01a3daeeb4822429f4dcf530c11f15ac65df6700615beefd6c04c3fb41bbbc toolkit/skills/sdtk-design-layout/scripts/render_design_layout_images.py
29
- e3d739dd8167b3800075fabb4aa8458a29481b85626d8f6bb5ac2e76dd229527 toolkit/skills/sdtk-design-layout/SKILL.md
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
- e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0 toolkit/skills/sdtk-screen-design-spec/references/FLOW_ACTION_SPEC_CREATION_RULES.md
42
- 4edd3318634fbc142f1ce3161fc3ac93d901a6bb7f0add1d1bed7fc25293c4d9 toolkit/skills/sdtk-screen-design-spec/references/numbering-rules.md
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
- ae0bc9b120c19a142f10cc79168a8f7d6bf8a37e48341fc16cbc74bbdc2e692c toolkit/skills/sdtk-screen-design-spec/scripts/validate_flow_action_spec_numbering.py
45
- 36ddb765725ec9cc4b01fe02cac222cf7e621643bc1212bac6e073b942f3eee0 toolkit/skills/sdtk-screen-design-spec/SKILL.md
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
- 123873681ff65792a9a269b264155c65a5feb68b23e4eeb1e68cb7da1a137d54 toolkit/skills-claude/api-design-spec/SKILL.md
50
+ 02680cf409130185d9e415ccc7b75c89229474d12b0246d37c58cc1bf0b3248d toolkit/skills-claude/api-design-spec/SKILL.md
51
51
  6f6ddb470bc61d286b84418e299b360d5f148e6bed75fa50b6c8f2929e6fe49c toolkit/skills-claude/api-doc/SKILL.md
52
- e293fd71f9fc71ac63e5e53bf55fbfe9c71e186e298b2fd3429c71a4e972a8b1 toolkit/skills-claude/arch/SKILL.md
52
+ 381f054e376a43c86c1d2301978b9d8ef4b636d632aca018234e0425f6c25f92 toolkit/skills-claude/arch/SKILL.md
53
53
  4dd1db27839c73a8ec0bba2b465b7cacffd55393a325a822ced8f2f209f6b51b toolkit/skills-claude/ba/SKILL.md
54
- 9765f229108c5aff27457489707218570ad83dc362353a79c2f5a78607adf4de toolkit/skills-claude/design-layout/SKILL.md
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
- 5686da60872f1a3c6791e9a740897d4a564f40d53d54902a47fbc3165e68a1ec toolkit/skills-claude/screen-design-spec/SKILL.md
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
- 26fc80a5bced4b67debea943a49c729532a576146a81994f7e28615c3debe681 toolkit/templates/docs/design/DESIGN_LAYOUT_TEMPLATE.md
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
- e007db18ad55333a371be739f6ef7928316a5f6f55a9fbffcf6de9a821a02ff0 toolkit/templates/docs/specs/FLOW_ACTION_SPEC_CREATION_RULES.md
83
- 97367b222dbe970c5b1f08fd72533d778a422cd209bc82f32dd67b9b98827f0f toolkit/templates/docs/specs/FLOW_ACTION_SPEC_TEMPLATE.md
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
- $destFile = Join-Path $skillsDest "$($skillDir.Name)/SKILL.md"
106
- Copy-File -SourcePath $srcFile -DestinationPath $destFile -Overwrite $Overwrite
107
- $skillCount++
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
- $destFile = Join-Path $skillsDest "$($skillDir.Name)/SKILL.md"
63
- Copy-File -SourcePath $srcFile -DestinationPath $destFile -Overwrite ([bool]$Force)
64
- $skillCount++
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)
@@ -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 collect_flow_map(flow_text: str) -> Dict[Tuple[str, str], str]:
103
- flow_map: Dict[Tuple[str, str], str] = {}
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
- flow_map[(method, path)] = sanitized + "\n"
113
- return flow_map
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
- flow_map = collect_flow_map(flow_path.read_text(encoding="utf-8"))
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
- flow = flow_map.get((method, path))
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:
@@ -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 valid PlantUML syntax and renderability checks before handoff.
140
- - Use `\\n` for multi-line labels in nodes.
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
- - If the rendered `.svg` file exists, use it as the `Screen image:` reference.
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.