@simplysm/sd-claude 14.0.65 → 14.0.66

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 (227) hide show
  1. package/claude/references/sd-requirement-source-handling.md +64 -0
  2. package/claude/references/sd-simplysm14/README.md +44 -40
  3. package/claude/references/sd-simplysm14/apis/angular/README.md +95 -0
  4. package/claude/references/sd-simplysm14/apis/angular/app-structure.md +49 -0
  5. package/claude/references/sd-simplysm14/apis/angular/buttons.md +42 -0
  6. package/claude/references/sd-simplysm14/apis/angular/crud.md +35 -0
  7. package/claude/references/sd-simplysm14/apis/angular/forms.md +63 -0
  8. package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +80 -0
  9. package/claude/references/sd-simplysm14/apis/angular/kanban.md +33 -0
  10. package/claude/references/sd-simplysm14/apis/angular/layout.md +41 -0
  11. package/claude/references/sd-simplysm14/apis/angular/modal.md +63 -0
  12. package/claude/references/sd-simplysm14/apis/angular/routing.md +45 -0
  13. package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +35 -0
  14. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +50 -0
  15. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +42 -0
  16. package/claude/references/sd-simplysm14/apis/angular/sheet.md +52 -0
  17. package/claude/references/sd-simplysm14/apis/angular/toast.md +46 -0
  18. package/claude/references/sd-simplysm14/apis/angular/visual.md +41 -0
  19. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +76 -0
  20. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +83 -0
  21. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +80 -0
  22. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +39 -0
  23. package/claude/references/sd-simplysm14/apis/core-browser/README.md +112 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/README.md +53 -0
  25. package/claude/references/sd-simplysm14/apis/core-common/extensions.md +123 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/features.md +46 -0
  27. package/claude/references/sd-simplysm14/apis/core-common/types.md +114 -0
  28. package/claude/references/sd-simplysm14/apis/core-common/utils.md +158 -0
  29. package/claude/references/sd-simplysm14/apis/core-node/README.md +12 -0
  30. package/claude/references/sd-simplysm14/apis/core-node/consola.md +64 -0
  31. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +52 -0
  32. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +53 -0
  33. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +81 -0
  34. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +55 -0
  35. package/claude/references/sd-simplysm14/apis/core-node/worker.md +111 -0
  36. package/claude/references/sd-simplysm14/apis/excel/README.md +81 -0
  37. package/claude/references/sd-simplysm14/apis/lint/README.md +80 -0
  38. package/claude/references/sd-simplysm14/apis/orm-common/README.md +33 -0
  39. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +77 -0
  40. package/claude/references/sd-simplysm14/apis/orm-common/executable.md +20 -0
  41. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +92 -0
  42. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +98 -0
  43. package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +128 -0
  44. package/claude/references/sd-simplysm14/apis/orm-node/README.md +59 -0
  45. package/claude/references/sd-simplysm14/apis/sd-claude/README.md +9 -0
  46. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +50 -0
  47. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +155 -0
  48. package/claude/references/sd-simplysm14/apis/service-client/README.md +92 -0
  49. package/claude/references/sd-simplysm14/apis/service-common/README.md +29 -0
  50. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +63 -0
  51. package/claude/references/sd-simplysm14/apis/service-common/messages.md +56 -0
  52. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +64 -0
  53. package/claude/references/sd-simplysm14/apis/service-common/service-types.md +43 -0
  54. package/claude/references/sd-simplysm14/apis/service-server/README.md +20 -0
  55. package/claude/references/sd-simplysm14/apis/service-server/auth.md +31 -0
  56. package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +47 -0
  57. package/claude/references/sd-simplysm14/apis/service-server/define-service.md +71 -0
  58. package/claude/references/sd-simplysm14/apis/service-server/internals.md +41 -0
  59. package/claude/references/sd-simplysm14/apis/service-server/server.md +66 -0
  60. package/claude/references/sd-simplysm14/apis/storage/README.md +69 -0
  61. package/claude/references/sd-simplysm14/{client-component.md → manuals/client-component.md} +133 -128
  62. package/claude/references/sd-simplysm14/manuals/client-crud.md +102 -0
  63. package/claude/references/sd-simplysm14/manuals/client-demo.md +128 -0
  64. package/claude/references/sd-simplysm14/manuals/client-rules.md +7 -0
  65. package/claude/references/sd-simplysm14/{client-setup.md → manuals/client-setup.md} +2 -2
  66. package/claude/references/sd-simplysm14/{client-tab.md → manuals/client-tab.md} +13 -11
  67. package/claude/references/sd-simplysm14/{orm-union.md → manuals/orm-union.md} +1 -1
  68. package/claude/references/sd-simplysm14/manuals/orm.md +75 -0
  69. package/claude/rules/sd-base-rules.md +172 -79
  70. package/claude/sd-check-bash.py +5 -0
  71. package/claude/sd-statusline.py +7 -12
  72. package/claude/skills/sd-commit/SKILL.md +7 -3
  73. package/claude/skills/sd-demo/SKILL.md +81 -62
  74. package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +45 -0
  75. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +42 -0
  76. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  77. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +45 -0
  78. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  79. package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +75 -0
  80. package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  81. package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +45 -0
  82. package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  83. package/claude/skills/sd-demo/evals/golden.jsonl +5 -3
  84. package/claude/skills/sd-dev/SKILL.md +33 -63
  85. package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +13 -0
  86. package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +10 -0
  87. package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +11 -0
  88. package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +12 -0
  89. package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +13 -0
  90. package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +10 -0
  91. package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +11 -0
  92. package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +12 -0
  93. package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +13 -0
  94. package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +10 -0
  95. package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +11 -0
  96. package/claude/skills/sd-dev/evals/fixtures/case-modify/tsconfig.json +12 -0
  97. package/claude/skills/sd-dev/evals/golden.jsonl +3 -3
  98. package/claude/skills/sd-docs/SKILL.md +53 -0
  99. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +7 -0
  100. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +5 -0
  101. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +3 -0
  102. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +6 -0
  103. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +1 -0
  104. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +5 -0
  105. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +8 -0
  106. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +7 -0
  107. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +3 -0
  108. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +5 -0
  109. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +3 -0
  110. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +6 -0
  111. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +1 -0
  112. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +5 -0
  113. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +8 -0
  114. package/claude/skills/sd-docs/evals/golden.jsonl +2 -0
  115. package/claude/skills/sd-docs/references/subagent-prompt.md +100 -0
  116. package/claude/skills/sd-impl/SKILL.md +125 -46
  117. package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
  118. package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
  119. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +1 -0
  120. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +1 -0
  121. package/claude/skills/sd-impl/evals/golden.jsonl +2 -3
  122. package/claude/skills/sd-skill/SKILL.md +3 -3
  123. package/claude/skills/sd-skill/evals/golden.jsonl +0 -1
  124. package/claude/skills/sd-skill/references/eval-authoring.md +15 -0
  125. package/claude/skills/sd-skill/references/eval-run.md +1 -1
  126. package/claude/skills/sd-skill/references/skill-authoring.md +8 -5
  127. package/claude/skills/sd-skill/scripts/run_eval.py +39 -60
  128. package/claude/skills/sd-spec/SKILL.md +163 -105
  129. package/claude/skills/sd-spec/references/example-spec.md +585 -0
  130. package/claude/skills/sd-spec/references/spec-authoring.md +287 -0
  131. package/claude/skills/sd-spec/references/spec-md-template.md +15 -93
  132. package/claude/skills/sd-unpack/SKILL.md +7 -1
  133. package/claude/skills/sd-unpack/scripts/handlers/_common.py +10 -0
  134. package/claude/skills/sd-unpack/scripts/handlers/eml_handler.py +5 -13
  135. package/claude/skills/sd-unpack/scripts/handlers/msg_handler.py +3 -12
  136. package/claude/skills/sd-unpack/scripts/handlers/office_com.py +23 -37
  137. package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +1 -4
  138. package/claude/skills/sd-unpack/scripts/handlers/pdf_handler.py +4 -13
  139. package/claude/skills/sd-unpack/scripts/unpack.py +4 -4
  140. package/claude/skills/sd-use/SKILL.md +1 -0
  141. package/claude/skills/sd-wip/SKILL.md +38 -0
  142. package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/_wip.md +3 -0
  143. package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/spec.md +15 -0
  144. package/claude/skills/sd-wip/evals/fixtures/with-existing-wip/.wips/260101120000_acct.md +6 -0
  145. package/claude/skills/sd-wip/evals/fixtures/with-existing-wip-for-compact/.wips/260101120000_acct.md +14 -0
  146. package/claude/skills/sd-wip/evals/golden.jsonl +4 -0
  147. package/claude/skills/sd-wip/references/compact.md +79 -0
  148. package/package.json +1 -1
  149. package/claude/references/sd-simplysm14/orm.md +0 -11
  150. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -27
  151. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/overview.md +0 -12
  152. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Button.tsx +0 -12
  153. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Input.tsx +0 -27
  154. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -25
  155. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/overview.md +0 -12
  156. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/components/Input.tsx +0 -25
  157. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/pages/.gitkeep +0 -0
  158. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-001-RTP/354/236/205/353/240/245/355/231/224/353/251/264/spec.md +0 -19
  159. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-002-RTP/354/266/234/353/240/245/355/231/224/353/251/264/spec.md +0 -20
  160. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/overview.md +0 -16
  161. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Button.tsx +0 -6
  162. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Input.tsx +0 -15
  163. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/pages/.gitkeep +0 -0
  164. package/claude/skills/sd-demo/references/demo-md-template.md +0 -92
  165. package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260301_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/232/224/354/262/255.eml +0 -5
  166. package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260305_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/354/232/224/354/262/255.eml +0 -6
  167. package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260310_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234.eml +0 -6
  168. package/claude/skills/sd-dev/evals/fixtures/single-req-auto-chain/src/lib/.gitkeep +0 -0
  169. package/claude/skills/sd-dev/evals/fixtures/start-from-plan/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
  170. package/claude/skills/sd-dev/evals/fixtures/start-from-plan/src/lib/.gitkeep +0 -0
  171. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/plan.md +0 -28
  172. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -14
  173. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/components/Input.tsx +0 -6
  174. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/pages/.gitkeep +0 -0
  175. package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/plan.md +0 -40
  176. package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/spec.md +0 -13
  177. package/claude/skills/sd-impl/evals/fixtures/multi-r/src/components/Input.tsx +0 -25
  178. package/claude/skills/sd-impl/evals/fixtures/multi-r/src/pages/.gitkeep +0 -0
  179. package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -26
  180. package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
  181. package/claude/skills/sd-impl/evals/fixtures/with-test-file/src/lib/.gitkeep +0 -0
  182. package/claude/skills/sd-impl/references/impl-md-template.md +0 -87
  183. package/claude/skills/sd-impl/references/modes-and-failure.md +0 -65
  184. package/claude/skills/sd-plan/SKILL.md +0 -130
  185. package/claude/skills/sd-plan/evals/fixtures/already-implemented/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -14
  186. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/api/user.ts +0 -13
  187. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/components/Input.tsx +0 -15
  188. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/pages/UserList.tsx +0 -29
  189. package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -17
  190. package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/components/Input.tsx +0 -6
  191. package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/pages/.gitkeep +0 -0
  192. package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/DEMO-001-/352/261/260/353/236/230/354/262/230/demo.md +0 -26
  193. package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -15
  194. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/components/Input.tsx +0 -25
  195. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/data/mock-customer.ts +0 -16
  196. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/pages/CustomerList.tsx +0 -25
  197. package/claude/skills/sd-plan/evals/golden.jsonl +0 -3
  198. package/claude/skills/sd-plan/references/plan-md-template.md +0 -138
  199. package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260122_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/260/234/354/204/240/354/232/224/354/262/255.eml +0 -20
  200. package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260205_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/355/231/224/353/251/264/352/264/200/353/240/250.eml +0 -17
  201. package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260301_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234/354/262/264/352/263/204.eml +0 -18
  202. package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs/20260317_/352/263/240/352/260/235/354/202/254_/352/270/264/352/270/211/354/262/230/353/246/254/353/260/251/354/271/250.eml +0 -17
  203. package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs//355/232/214/354/235/230/353/214/200/353/263/270_20260320.txt +0 -13
  204. package/claude/skills/sd-spec/evals/fixtures/direct-simple/.gitkeep +0 -0
  205. package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/REQ-001-test/spec.md +0 -19
  206. package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/overview.md +0 -18
  207. package/claude/skills/sd-spec/evals/golden.jsonl +0 -4
  208. package/claude/skills/sd-spec/references/overview-md-template.md +0 -89
  209. package/claude/skills/sd-spec/references/raw-input-handling.md +0 -96
  210. package/claude/skills/sd-verify/SKILL.md +0 -96
  211. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/impl.md +0 -20
  212. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -14
  213. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
  214. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.test.ts +0 -11
  215. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.ts +0 -7
  216. package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/impl.md +0 -21
  217. package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/plan.md +0 -21
  218. package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -12
  219. package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/src/pages/UserList.tsx +0 -19
  220. package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/impl.md +0 -19
  221. package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/plan.md +0 -14
  222. package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/spec.md +0 -12
  223. package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.test.ts +0 -10
  224. package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.ts +0 -7
  225. package/claude/skills/sd-verify/evals/golden.jsonl +0 -3
  226. package/claude/skills/sd-verify/references/verify-md-template.md +0 -99
  227. /package/claude/skills/{sd-demo/evals/fixtures/basic-single-req/src/pages → sd-wip/evals/fixtures/empty}/.gitkeep +0 -0
@@ -0,0 +1,45 @@
1
+ # 창고 관리 요구 분석서
2
+
3
+ ## 1. 개요
4
+
5
+ ### 1.1 핵심 목적
6
+
7
+ 창고 입출고 및 기준정보를 관리한다.
8
+
9
+ ## 4. 화면
10
+
11
+ | § | 분류 | 화면 | 유형 | 장치 |
12
+ | --- | -------- | --------------- | ------ | ---- |
13
+ | 4.1 | 기준정보 | Location Master | 마스터 | PC |
14
+
15
+ ### 4.1 Location Master (PC) [확정: 2026-05-13]
16
+
17
+ Actor: Warehouse Admin
18
+
19
+ 기능 개요:
20
+
21
+ - 창고 로케이션 마스터를 관리한다 (등록·수정·삭제·복구·엑셀 입출력 포함 표준 마스터 화면).
22
+
23
+ 와이어프레임:
24
+
25
+ ```
26
+ [등록] [선택 삭제] [선택 복구] [엑셀 업로드] [엑셀 다운로드]
27
+ | [ ] | ID | 코드 | 이름 |
28
+ | [ ] | [E 2] | L-02 | 2층 창고 |
29
+ | [ ] | [E 1] | L-01 | 1층 창고 |
30
+ ```
31
+
32
+ 범례: `[ ]` = 행 선택 체크박스, `[E N]` = 편집 버튼 (N = ID). 클릭 시 인라인 편집.
33
+
34
+ 항목:
35
+
36
+ **시트 컬럼**
37
+
38
+ | 컬럼 | 종류 | 도메인 매핑 | 비고 |
39
+ | ---- | ------ | -------------------- | ---- |
40
+ | 코드 | 텍스트 | [모델.Location.code] | - |
41
+ | 이름 | 텍스트 | [모델.Location.name] | - |
42
+
43
+ 동작:
44
+
45
+ - 표준 마스터 동작 (등록·선택 삭제·선택 복구·엑셀 업/다운로드·ID 편집 클릭 시 인라인 편집).
@@ -0,0 +1,33 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ signal,
6
+ } from "@angular/core";
7
+ import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
+
9
+ @Component({
10
+ selector: "app-dashboard-view",
11
+ standalone: true,
12
+ changeDetection: ChangeDetectionStrategy.OnPush,
13
+ encapsulation: ViewEncapsulation.None,
14
+ imports: [SdBaseContainer],
15
+ template: `
16
+ <sd-base-container
17
+ [(ready)]="ready"
18
+ [initialized]="initialized()"
19
+ [(busyCount)]="busyCount"
20
+ [viewType]="viewType()"
21
+ >
22
+ <ng-template #contentTpl>
23
+ <div class="p-default">대시보드</div>
24
+ </ng-template>
25
+ </sd-base-container>
26
+ `,
27
+ })
28
+ export class DashboardView {
29
+ ready = signal(false);
30
+ initialized = signal(true);
31
+ busyCount = signal(0);
32
+ viewType = injectViewTypeSignal();
33
+ }
@@ -0,0 +1,75 @@
1
+ # 창고 관리 요구 분석서
2
+
3
+ ## 1. 개요
4
+
5
+ ### 1.1 핵심 목적
6
+
7
+ 창고 입출고 및 기준정보를 관리한다.
8
+
9
+ ## 4. 화면
10
+
11
+ | § | 분류 | 화면 | 유형 | 장치 |
12
+ | --- | -------- | --------------- | -------- | ---- |
13
+ | 4.1 | 기준정보 | Item List | 조회 | PC |
14
+ | 4.2 | 기준정보 | Item Edit Modal | 트랜잭션 | PC |
15
+
16
+ ### 4.1 Item List (PC) [확정: 2026-05-13]
17
+
18
+ Actor: Warehouse Manager
19
+
20
+ 기능 개요:
21
+
22
+ - Browse items registered in the warehouse.
23
+
24
+ 와이어프레임:
25
+
26
+ ```
27
+ [Register]
28
+ | Code | Name | Edit |
29
+ ```
30
+
31
+ 항목:
32
+
33
+ **시트 컬럼**
34
+
35
+ | 컬럼 | 종류 | 도메인 매핑 | 비고 |
36
+ | ---- | ------ | ---------------- | ---- |
37
+ | Code | 텍스트 | [모델.Item.code] | - |
38
+ | Name | 텍스트 | [모델.Item.name] | - |
39
+
40
+ 동작:
41
+
42
+ - [Register]: → [화면.Item Edit Modal] 을 모달로 띄움.
43
+ - [Edit] (행 버튼): → [화면.Item Edit Modal] 을 모달로 띄움.
44
+
45
+ ### 4.2 Item Edit Modal (PC) [확정: 2026-05-13]
46
+
47
+ Actor: Warehouse Manager
48
+
49
+ 기능 개요:
50
+
51
+ - Create or edit an item via modal.
52
+
53
+ 와이어프레임:
54
+
55
+ ```
56
+ ┌──────────────────────────┐
57
+ │ Code [ ] │
58
+ │ Name [ ] │
59
+ │ [Save] [Cancel] │
60
+ └──────────────────────────┘
61
+ ```
62
+
63
+ 항목:
64
+
65
+ **입력 폼**
66
+
67
+ | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
68
+ | ---- | ------ | ---- | ---------------- | ---- |
69
+ | Code | 텍스트 | O | [모델.Item.code] | - |
70
+ | Name | 텍스트 | O | [모델.Item.name] | - |
71
+
72
+ 동작:
73
+
74
+ - [Save]: Save and close the modal.
75
+ - [Cancel]: Close without saving.
@@ -0,0 +1,33 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ signal,
6
+ } from "@angular/core";
7
+ import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
+
9
+ @Component({
10
+ selector: "app-dashboard-view",
11
+ standalone: true,
12
+ changeDetection: ChangeDetectionStrategy.OnPush,
13
+ encapsulation: ViewEncapsulation.None,
14
+ imports: [SdBaseContainer],
15
+ template: `
16
+ <sd-base-container
17
+ [(ready)]="ready"
18
+ [initialized]="initialized()"
19
+ [(busyCount)]="busyCount"
20
+ [viewType]="viewType()"
21
+ >
22
+ <ng-template #contentTpl>
23
+ <div class="p-default">대시보드</div>
24
+ </ng-template>
25
+ </sd-base-container>
26
+ `,
27
+ })
28
+ export class DashboardView {
29
+ ready = signal(false);
30
+ initialized = signal(true);
31
+ busyCount = signal(0);
32
+ viewType = injectViewTypeSignal();
33
+ }
@@ -0,0 +1,45 @@
1
+ # 창고 관리 요구 분석서
2
+
3
+ ## 1. 개요
4
+
5
+ ### 1.1 핵심 목적
6
+
7
+ 창고 입출고 및 기준정보를 관리한다.
8
+
9
+ ## 4. 화면
10
+
11
+ | § | 분류 | 화면 | 유형 | 장치 |
12
+ | --- | -------- | ------------- | ------ | ---- |
13
+ | 4.1 | 기준정보 | Item Register | 마스터 | PC |
14
+
15
+ ### 4.1 Item Register (PC) [확정: 2026-05-13]
16
+
17
+ Actor: Warehouse Manager
18
+
19
+ 기능 개요:
20
+
21
+ - Register and edit items.
22
+
23
+ 와이어프레임:
24
+
25
+ ```
26
+ ┌──────────────────────────┐
27
+ │ Code [ ] │
28
+ │ Name [ ] │
29
+ │ [Save] [Cancel] │
30
+ └──────────────────────────┘
31
+ ```
32
+
33
+ 항목:
34
+
35
+ **입력 폼**
36
+
37
+ | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
38
+ | ---- | ------ | ---- | ---------------- | ---- |
39
+ | Code | 텍스트 | O | [모델.Item.code] | - |
40
+ | Name | 텍스트 | O | [모델.Item.name] | - |
41
+
42
+ 동작:
43
+
44
+ - [Save]: Save the form.
45
+ - [Cancel]: Reset the form.
@@ -0,0 +1,33 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ ViewEncapsulation,
5
+ signal,
6
+ } from "@angular/core";
7
+ import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
+
9
+ @Component({
10
+ selector: "app-dashboard-view",
11
+ standalone: true,
12
+ changeDetection: ChangeDetectionStrategy.OnPush,
13
+ encapsulation: ViewEncapsulation.None,
14
+ imports: [SdBaseContainer],
15
+ template: `
16
+ <sd-base-container
17
+ [(ready)]="ready"
18
+ [initialized]="initialized()"
19
+ [(busyCount)]="busyCount"
20
+ [viewType]="viewType()"
21
+ >
22
+ <ng-template #contentTpl>
23
+ <div class="p-default">대시보드</div>
24
+ </ng-template>
25
+ </sd-base-container>
26
+ `,
27
+ })
28
+ export class DashboardView {
29
+ ready = signal(false);
30
+ initialized = signal(true);
31
+ busyCount = signal(0);
32
+ viewType = injectViewTypeSignal();
33
+ }
@@ -1,3 +1,5 @@
1
- {"id": "basic-single-req-001", "input": "/sd-demo REQ-001 데모 만들어줘", "rubric": [".specs/260503143025/ 안에 'DEMO-' 시작하는 디렉토리가 1개 이상 새로 생성되었는가?", " DEMO-* 디렉토리 안에 'demo.md' 파일이 존재하는가?", "demo.md 본문에 '## 메타', '## 시나리오', '## 만든 파일' 3개 섹션 헤더가 모두 포함되어 있는가?", "demo.md 본문의 '대상 REQ' 표기에 'REQ-001' 포함되어 있는가?", "src/pages/ 디렉토리에 .tsx 확장자 파일이 1개 이상 새로 생성되었는가?", "에이전트의 마지막 텍스트 응답에 '고객' 또는 '시연' 또는 'demo-ready' 하나 이상의 표현이 포함되어 있는가? (사용자에게 시연 알림 단계 도달)"], "fixture": "basic-single-req"}
2
- {"id": "multi-req-domain-001", "input": "/sd-demo REQ-001 REQ-002 묶어서 데모 만들어줘", "rubric": [".specs/260503143025/ 안에 'DEMO-' 시작하는 디렉토리가 1개 이상 새로 생성되었는가?", " DEMO-* 디렉토리 안에 'demo.md' 파일이 존재하는가?", "demo.md 본문의 '대상 REQ' 표기에 'REQ-001' 'REQ-002' 모두 포함되어 있는가?", "src/pages/ 디렉토리에 .tsx 확장자 파일이 2개 이상 새로 생성되었는가? (다중 REQ 대응)", "에이전트의 마지막 텍스트 응답에 '고객' 또는 '시연' 또는 'demo-ready' 하나 이상의 표현이 포함되어 있는가?"], "fixture": "multi-req-domain"}
3
- {"id": "mock-data-policy-001", "input": "/sd-demo REQ-001 데모 만들어줘", "rubric": [".specs/260503143025/ 안에 'DEMO-' 시작하는 디렉토리가 1개 이상 새로 생성되었는가?", "src/data/ 또는 src/mocks/ 또는 그와 유사한 별도 폴더에 mock data 파일이 1 이상 생성되었는가? (페이지 inline 금지)", "그 mock data 파일에 'MOCK_' prefix 붙은 변수/상수가 1개 이상 포함되어 있는가?", " mock data 파일 본문(주석 포함)에 'MOCK' 키워드가 1회 이상 포함되어 있는가?", "src/pages/ 페이지 파일들 본문에 'const mock' 또는 'let mock' 같은 inline mock 데이터 정의가 없는가? (mock data 는 별도 파일에만)"], "fixture": "mock-data-policy"}
1
+ {"id": "simple-screen", "input": "/sd-demo .specs/260513120000_warehouse/spec.md §4.1 화면을 데모로 만들어줘", "rubric": ["packages/app/src/screens/ 아래에 .ts 파일이 1개 이상 생성되었는가? (.specs/, dashboard/ 하위 제외)", "새로 생성된 .ts 파일의 파일명이 권위 규약(<domain>.list.ts / .detail.ts / .view.ts / .modal.ts / .ts) 중 하나의 형식을 따르는가? (.component.ts 형식이면 FAIL)", "새로 생성된 .ts 파일 적어도 하나의 @Component selector 가 'app-' prefix 로 시작하는가?", "새로 생성된 .ts 파일 적어도 하나에 'standalone: true' 가 포함되었는가?", "새로 생성된 .ts 파일 적어도 하나의 템플릿에 'sd-textfield' 또는 '<input' 중 하나가 1개 이상 포함되었는가?", "새로 생성된 .ts 파일 적어도 하나에 '// sd-demo: 더미' 로 시작하는 주석이 1개 이상 있는가?", "새로 생성된 .ts 파일 적어도 하나에 '// sd-demo: 미구현' 으로 시작하는 주석이 1개 이상 있는가?", "기존 packages/app/src/screens/dashboard/dashboard.view.ts 파일이 손실되지 않고 보존되었는가?"], "fixture": "with-screens"}
2
+ {"id": "modal-screen", "input": "/sd-demo .specs/260513120000_warehouse/spec.md §4.1 화면을 데모로 만들어줘", "rubric": ["packages/app/src/screens/ 아래에 .ts 파일이 2개 이상 생성되었는가? (호출 화면 + 모달 화면, dashboard/ 하위 제외)", "새로 생성된 파일 모달 역할 파일이 권위 규약의 '.modal.ts' 접미사를 사용하는가?", "새로 생성된 파일 적어도 하나에 'SdModalProvider' 식별자가 포함되었는가?", "새로 생성된 파일 적어도 하나에 '_sdModal.showAsync(' 호출 코드가 포함되었는가?", "새로 생성된 파일 적어도 하나에 'close' 라는 이름의 output 선언이 포함되었는가?", "기존 packages/app/src/screens/dashboard/dashboard.view.ts 파일이 손실되지 않고 보존되었는가?"], "fixture": "with-modal"}
3
+ {"id": "recall-overwrite", "input": "/sd-demo .specs/260513120000_warehouse/spec.md §4.1 화면을 데모로 만들어줘. 이미 파일이 있으면 ① 덮어쓰기 분기로 진행해줘.", "rubric": ["packages/app/src/screens/dashboard/ 디렉토리 안의 화면 파일이 spec §4.1 'Total stock' 또는 'Refresh' 하나의 문자열을 포함하는가?", "packages/app/src/screens/dashboard/ 디렉토리 안의 화면 파일에 'standalone: true' 포함되었는가?", "packages/app/src/screens/dashboard/ 디렉토리 안의 화면 파일에 '// sd-demo:' 시작하는 주석이 1개 이상 있는가?"], "fixture": "with-existing-screen"}
4
+ {"id": "empty-screen", "input": "/sd-demo .specs/260513120000_warehouse/spec.md 의 §4.1 화면을 데모로 만들어줘", "rubric": ["fixture 안 어딘가에 .ts 파일이 새로 1개 이상 생성되었는가? (.specs/, 메타 파일 제외)", "새로 생성된 파일의 파일명이 권위 규약(<domain>.list.ts / .detail.ts / .view.ts / .modal.ts / .ts) 중 하나의 형식을 따르는가? (.component.ts 형식이면 FAIL)", "새로 생성된 파일 중 적어도 하나의 @Component selector 가 'app-' prefix 로 시작하는가?", "새로 생성된 파일 중 적어도 하나에 'standalone: true' 가 포함되었는가?", "새로 생성된 파일 중 적어도 하나에 'sd-textfield' 또는 '<input' 중 하나가 1개 이상 포함되었는가?", "새로 생성된 파일 중 적어도 하나에 '// sd-demo:' 로 시작하는 주석이 1개 이상 있는가?"], "fixture": "empty"}
5
+ {"id": "master-screen", "input": "/sd-demo .specs/260513120000_warehouse/spec.md 의 §4.1 화면을 데모로 만들어줘", "rubric": ["packages/app/src/screens/ 아래에 새 .ts 파일이 1개 이상 생성되었는가? (dashboard/ 하위 제외)", "새로 생성된 파일의 파일명이 권위 규약의 '.list.ts' 접미사를 사용하는가? (마스터 화면은 sd-crud-list 채택이 표준이며 .list.ts 가 권위 규약)", "새로 생성된 .ts 파일 중 적어도 하나의 템플릿에 'sd-crud-list' selector 가 1개 이상 포함되었는가?", "새로 생성된 .ts 파일 중 적어도 하나에 '// sd-demo:' 로 시작하는 주석이 1개 이상 있는가?"], "fixture": "with-master-screen"}
@@ -1,89 +1,59 @@
1
1
  ---
2
2
  name: sd-dev
3
- description: SD 워크플로(spec/demo/plan/impl/verify) 오케스트레이터. 입력 분석으로 시작 단계를 판별하고, 단일 단위(REQ 1개·R 1개)는 자동 chain, 분기점에서는 멈춤+보고. Use when raw input부터 끝까지 번에 진행하거나, 중간 산출물(spec.md/plan.md)에서 이어서 진행할 때
3
+ description: 코드 변경 요청을 받아 의도 합의·테스트 우선 구현·검증까지 번에 수행한다. Use when 화면 단위 spec 분석이 필요 없는 라이브러리·CLI·내부 모듈의 기능 추가·수정·버그 수정 요청 시.
4
4
  ---
5
5
 
6
- # SD 오케스트레이터
6
+ # sd-dev
7
7
 
8
- 5개 sd-* 스킬(sd-spec/sd-demo/sd-plan/sd-impl/sd-verify)을 입력 따라 자동 chain.
8
+ spec.md 없이 진행하는 가벼운 코드 작업. 의도 합의가 끝나면 분석·계획·구현·검증까지 사용자 추가 개입 없이 자동.
9
9
 
10
- ## 입력 분석 → 시작 스킬
10
+ ## 워크플로
11
11
 
12
- | 입력 상태 | 시작 스킬 |
13
- |---|---|
14
- | spec.md(`상태: specified`) 존재 | sd-plan |
15
- | plan.md(`상태: planned`) 존재 | sd-impl |
16
- | impl.md(`상태: implemented`) 존재 | sd-verify |
17
- | 그 외 (raw input / draft / 없음) | sd-spec |
12
+ ### 1단계: 의도파악
18
13
 
19
- > 입력에 spec.md/plan.md 경로가 명시되어 있거나 사용자가 특정 REQ ID 지목한 경우 그대로 사용.
20
- > 모호하면 그 외로 판단 → sd-spec.
14
+ 사용자 발화를 토대로 무엇을 만들거나 바꿀지 합의. **1건씩 질문 답변 다음 건** (sd-base-rules "결정 근거"). 합의 결과는 대화 메모리에만 (필요 시 사용자가 `/sd-wip`).
21
15
 
22
- ## 자동 chain 분기
16
+ 다음을 확정해야 진행:
23
17
 
24
- ```
25
- sd-spec 끝:
26
- ├─ REQ 1개:
27
- │ ├─ demo 후보 (UI 키워드) → "demo 만들까요?" 묻기
28
- │ │ ├─ Yes → sd-demo → 종료(보고)
29
- │ │ └─ No → 자동 sd-plan
30
- │ └─ demo 불필요 → 자동 sd-plan
31
- └─ REQ N개 → 멈춤(보고)
18
+ - 작업 종류: 신규 추가 / 기존 수정 / 버그 수정
19
+ - 대상 파일·모듈·패키지
20
+ - 변경의 입출력·동작 — 이름·시그니처·예외 동작 등
32
21
 
33
- sd-plan 끝:
34
- ├─ skip-to-verify → 자동 sd-verify
35
- └─ proceed → 자동 sd-impl
22
+ 근거 충분(사용자 발화에 명시 + 기존 코드 패턴 추론 가능)이면 묻지 않고 진행. 외부 자료(시크릿·시안·샘플 데이터)가 필요하면 이 단계에서 요청.
36
23
 
37
- sd-impl → 자동 sd-verify
24
+ ### 2단계: 분석
38
25
 
39
- sd-verify 종료(보고)
40
- ```
26
+ 작업 영역의 코드베이스 분석.
41
27
 
42
- ## demo 필요 판단 (휴리스틱)
28
+ ### 3단계: 계획
43
29
 
44
- spec.md R 항목 본문에 다음 UI 키워드 **1개 이상** 등장 → demo 후보:
45
- - `화면`, `UI`, `표시`, `버튼`, `필드`, `폼`, `목록`, `리스트`, `클릭`, `입력`
30
+ 분석을 토대로 TDD 기반 개발 계획 수립.
46
31
 
47
- 외(백엔드 로직, 마이그레이션, 데이터 변환, 검증 함수 등) → demo 불필요.
32
+ ### 4단계: TDD 사이클
48
33
 
49
- ## sd-* 스킬 호출 방식
34
+ 작업 시작 **테스트 작성 가능 여부** 판정 — 입출력 명확 + 외부 의존 통제 가능한가.
50
35
 
51
- 단계에서 해당 sd-* 스킬을 호출. sd-* 스킬 내부 동작/결정엔 개입 X (sd-* 스킬의 자체 체크포인트가 그대로 통과).
36
+ - **테스트 가능**: **RED GREEN REFACTOR**
37
+ - **RED**: 테스트만 작성 → 러너 실행 → 실패 확인. **이 단계에서 구현 파일 절대 손대지 말 것.**
38
+ - **GREEN**: 통과하는 최소 구현 → 러너 재실행 → 통과 확인.
39
+ - **REFACTOR**: 중복·가독성·기존 패턴 정합 정리 → 통과 유지 확인. 정리할 게 없으면 스킵.
40
+ - **테스트 불가/비효율** (UI 시각·외부 서비스 실호출 등): **구현 → REFACTOR**.
52
41
 
53
- ## 멈춤 보고 형식
42
+ ### 5단계: 코드 정리
54
43
 
55
- ```
56
- [현재까지 만든 것]
57
- - <단계>: <산출물 요약 — 산출물 소비자가 봐도 이해 가능한 자연어>
44
+ 전체 변경분을 한번 훑어 정돈. 4단계 REFACTOR 가 잡지 못한 횡단 이슈와 작업 잔재가 대상.
58
45
 
59
- [멈춤 사유]
60
- - <왜 멈췄는지>
46
+ - **횡단 중복**: 작업 사이클 사이에 동일 로직이 흩어져 있으면 합치기.
47
+ - **인접 코드 패턴 정합**: 코드베이스 컨벤션 vs 실제 작성 — 파일 위치·네이밍·구조.
48
+ - **불필요한 코드**: 미사용 import·변수·주석, 요구 없는 옵션·추상화 제거. 갱신·덮어쓰기 결과로 어디서도 참조되지 않는 파일도 포함. **단 파일 단위 삭제는 후보 목록을 사용자에게 보고 → 확정분만 삭제** (dynamic import·문서 자산 등 보존분 사용자 제외).
49
+ - **매뉴얼 권위 규약**: 코드베이스 매뉴얼 위반 항목 수정.
61
50
 
62
- [다음 권장 액션]
63
- - <다음 단계>를 진행하려면: <명령 예시>
64
- ```
51
+ 정리 단위 테스트 재실행 — 회귀 없음 확인.
65
52
 
66
- ## 종료 시 보고 형식
53
+ ### 6단계: 검증
67
54
 
68
- ```
69
- [완료된 것]
70
- - <REQ ID>: <기능 요약 — 산출물 소비자 이해 가능 자연어>
71
- - 산출물: spec.md / plan.md / impl.md / verify.md (또는 demo.md)
72
- ```
55
+ 산출물이 브라우저 시연이 필요한 화면·UI 면 사용자에게 dev 서버 실행 요청 → `playwright-cli` 로 시연. 그 외(라이브러리·CLI·내부 모듈·서버 함수)는 4단계 단위 테스트 통과로 종결.
73
56
 
74
- ## 핵심 원칙
57
+ ## 운용
75
58
 
76
- - REQ 단일 단위만 자동 chain (REQ 다수 → 멈춤)
77
- - 단계 사이(plan→impl, impl→verify)는 자동 진행
78
- - 자체 산출물 만들지 말 것 (chain만 담당)
79
- - sd-* 스킬 결정엔 개입 X
80
- - demo는 후보 판단 시만 묻기 (강제 X)
81
-
82
- ## 안티패턴
83
-
84
- - ❌ REQ 여러 개를 자동으로 모두 처리 (사용자 결정 필요)
85
- - ❌ sd-impl 안에서 R 사이에 멈춤 (REQ 완료 전 중단 금지)
86
- - ❌ demo를 매번 묻기 (UI 키워드 없으면 안 물음)
87
- - ❌ sd-* 스킬 내부 결정 침범 (예: sd-spec의 Q 풀이를 sd-dev가 대신함)
88
- - ❌ 자체 dev.md 같은 산출물 만들기
89
- - ❌ 멈췄는데 자체 판단으로 "그냥 진행" 하기 (멈춤 = 사용자 결정 대기)
59
+ - 결정 근거: `sd-base-rules.md` "결정 근거" 적용.
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "sd-dev-eval-fixture",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "test": "vitest run"
7
+ },
8
+ "devDependencies": {
9
+ "@types/node": "^20.0.0",
10
+ "typescript": "^5.4.0",
11
+ "vitest": "^2.0.0"
12
+ }
13
+ }
@@ -0,0 +1,10 @@
1
+ export function toCamelCase(input: string): string {
2
+ return input
3
+ .split(/[-_]/)
4
+ .map((part, i) =>
5
+ i === 0
6
+ ? part.toLowerCase()
7
+ : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(),
8
+ )
9
+ .join("");
10
+ }
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { toCamelCase } from "../src/index.js";
3
+
4
+ describe("toCamelCase", () => {
5
+ it("converts kebab-case to camelCase", () => {
6
+ expect(toCamelCase("foo-bar")).toBe("fooBar");
7
+ });
8
+ it("converts snake_case to camelCase", () => {
9
+ expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
+ });
11
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "verbatimModuleSyntax": true
10
+ },
11
+ "include": ["src/**/*", "tests/**/*"]
12
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "sd-dev-eval-fixture",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "test": "vitest run"
7
+ },
8
+ "devDependencies": {
9
+ "@types/node": "^20.0.0",
10
+ "typescript": "^5.4.0",
11
+ "vitest": "^2.0.0"
12
+ }
13
+ }
@@ -0,0 +1,10 @@
1
+ export function toCamelCase(input: string): string {
2
+ const parts = input.split(/[-_]/).filter(Boolean);
3
+ return (
4
+ parts[0].toLowerCase() +
5
+ parts
6
+ .slice(1)
7
+ .map((p) => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase())
8
+ .join("")
9
+ );
10
+ }
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { toCamelCase } from "../src/index.js";
3
+
4
+ describe("toCamelCase", () => {
5
+ it("converts kebab-case to camelCase", () => {
6
+ expect(toCamelCase("foo-bar")).toBe("fooBar");
7
+ });
8
+ it("converts snake_case to camelCase", () => {
9
+ expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
+ });
11
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "verbatimModuleSyntax": true
10
+ },
11
+ "include": ["src/**/*", "tests/**/*"]
12
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "sd-dev-eval-fixture",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "test": "vitest run"
7
+ },
8
+ "devDependencies": {
9
+ "@types/node": "^20.0.0",
10
+ "typescript": "^5.4.0",
11
+ "vitest": "^2.0.0"
12
+ }
13
+ }
@@ -0,0 +1,10 @@
1
+ export function toCamelCase(input: string): string {
2
+ return input
3
+ .split(/[-_]/)
4
+ .map((part, i) =>
5
+ i === 0
6
+ ? part.toLowerCase()
7
+ : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(),
8
+ )
9
+ .join("");
10
+ }
@@ -0,0 +1,11 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { toCamelCase } from "../src/index.js";
3
+
4
+ describe("toCamelCase", () => {
5
+ it("converts kebab-case to camelCase", () => {
6
+ expect(toCamelCase("foo-bar")).toBe("fooBar");
7
+ });
8
+ it("converts snake_case to camelCase", () => {
9
+ expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
+ });
11
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "verbatimModuleSyntax": true
10
+ },
11
+ "include": ["src/**/*", "tests/**/*"]
12
+ }
@@ -1,3 +1,3 @@
1
- {"id": "single-req-auto-chain-001", "input": "/sd-dev 할인율 계산 함수 추가 (10만원 이상 5%, 50만원 이상 10%, 100만원 이상 15%, 큰 구간 우선)", "rubric": [".specs/ 디렉토리 안에 12자리 숫자 디렉토리(세션 폴더) 1개 이상 존재하는가?", "세션 폴더 안 어느 'REQ-' 시작 디렉토리에 'spec.md' 파일이 존재하는가?", "동일 REQ 디렉토리에 'plan.md' 파일이 존재하는가? (자동 chain으로 spec → plan 진행)", "동일 REQ 디렉토리에 'impl.md' 파일이 존재하는가? (자동 chain으로 plan → impl 진행)", "동일 REQ 디렉토리에 'verify.md' 파일이 존재하는가? (자동 chain으로 impl → verify 진행)", "src/ 디렉토리 하위에 .ts 또는 .tsx 확장자 파일이 1개 이상 새로 생성되었는가? (구현 코드)"], "fixture": "single-req-auto-chain"}
2
- {"id": "multi-req-stop-after-spec-001", "input": "/sd-dev .docs/ 폴더 자료 정리해줘", "rubric": [".specs/ 디렉토리 안에 12자리 숫자 디렉토리(세션 폴더)1개 이상 존재하는가?", "세션 폴더 안에 'REQ-' 시작하는 디렉토리가 2개 이상 존재하는가? (다중 REQ 생성)", " REQ-* 디렉토리에 'spec.md' 파일이 존재하는가?", "어느 REQ-* 디렉토리에도 'plan.md' 파일이 존재하지 않는가? (REQ 다수로 sd-spec 멈춤, plan 진행 안 함)", "에이전트의 마지막 텍스트 응답에 '멈춤' 또는 '선택' 또는 '결정' 같은 분기 안내 표현이 포함되어 있는가? (멈춤 보고 + 다음 권장 액션 안내)"], "fixture": "multi-req-stop-after-spec"}
3
- {"id": "start-from-plan-001", "input": "/sd-dev .specs/260503143025/REQ-001-할인계산/spec.md 기반으로 진행해줘", "rubric": [".specs/260503143025/REQ-001-할인계산/spec.md 본문에 fixture의 R1 텍스트인 '할인율 계산 함수' 가 그대로 포함되어 있는가? (sd-spec 단계가 spec.md를 새로 만들지 않고 기존 것을 사용했는지 확인 — 메타 상태 갱신은 허용)", ".specs/260503143025/REQ-001-할인계산/plan.md 파일이 새로 생성되었는가? (plan 단계 진행)", ".specs/260503143025/REQ-001-할인계산/impl.md 파일이 새로 생성되었는가? (자동 chain으로 plan impl)", ".specs/260503143025/REQ-001-할인계산/verify.md 파일이 새로 생성되었는가? (자동 chain으로 impl verify)", "src/lib/ 디렉토리에 'discount' 키워드를 포함한 파일(.ts / .js / .mjs JS 계열 확장자)이 1개 이상 새로 생성되었는가? (할인 계산 함수 구현)"], "fixture": "start-from-plan"}
1
+ {"id": "case-add", "input": "/sd-dev toSnakeCase 함수를 추가해줘", "fixture": "case-add", "rubric": ["src/index.ts (또는 src 하위 신규 파일) toSnakeCase 함수가 export 키워드로 추가되었는가?", "tests 디렉토리에 toSnakeCase 테스트 케이스가 1건 이상 추가되었는가?", "기존 toCamelCase 함수 정의가 src/index.ts 보존되어 있는가?", "vitest run 명령이 Bash 도구로 1회 이상 호출되었고 최종 호출의 종료 코드가 0 인가?"]}
2
+ {"id": "case-modify", "input": "/sd-dev toCamelCase 공백도 구분자로 처리하게 바꿔줘", "fixture": "case-modify", "rubric": ["src/index.ts toCamelCase공백 문자를 구분자로 인식하도록 변경되었는가? (split 정규식에 공백 포함 또는 동등 처리)", "tests 디렉토리에 공백 구분자 입력 케이스 테스트가 1건 이상 추가되었는가?", "기존 kebab-case snake_case 테스트 케이스가 삭제되지 않고 보존되어 있는가?", "vitest run 명령이 Bash 도구로 1회 이상 호출되었고 최종 호출의 종료 코드가 0 인가?"]}
3
+ {"id": "case-bug", "input": "/sd-dev toCamelCase 문자열 입력하면 에러나, 고쳐줘", "fixture": "case-bug", "rubric": ["tests 디렉토리에 문자열 입력 케이스 테스트가 1건 이상 추가되었는가?", "src/index.ts toCamelCase 문자열 입력 throw 하지 않고 문자열을 반환하도록 수정되었는가?", "최종 vitest run 종료 코드가 0 이고 기존 테스트와 신규 문자열 테스트가 모두 통과하는가?"]}