@simplysm/sd-claude 14.0.65 → 14.0.68

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 (241) 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} +134 -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 +191 -79
  70. package/claude/scripts/sd_paths.py +22 -0
  71. package/claude/sd-check-bash.py +19 -0
  72. package/claude/sd-statusline.py +7 -12
  73. package/claude/skills/sd-commit/SKILL.md +8 -3
  74. package/claude/skills/sd-demo/SKILL.md +103 -62
  75. package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +45 -0
  76. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +42 -0
  77. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  78. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +45 -0
  79. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  80. package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +75 -0
  81. package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  82. package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +45 -0
  83. package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
  84. package/claude/skills/sd-demo/evals/golden.jsonl +5 -3
  85. package/claude/skills/sd-dev/SKILL.md +33 -63
  86. package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +13 -0
  87. package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +10 -0
  88. package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +11 -0
  89. package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +12 -0
  90. package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +13 -0
  91. package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +10 -0
  92. package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +11 -0
  93. package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +12 -0
  94. package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +13 -0
  95. package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +10 -0
  96. package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +11 -0
  97. package/claude/skills/sd-dev/evals/fixtures/case-modify/tsconfig.json +12 -0
  98. package/claude/skills/sd-dev/evals/golden.jsonl +3 -3
  99. package/claude/skills/sd-docs/SKILL.md +53 -0
  100. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +7 -0
  101. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +5 -0
  102. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +3 -0
  103. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +6 -0
  104. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +1 -0
  105. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +5 -0
  106. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +8 -0
  107. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +7 -0
  108. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +3 -0
  109. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +5 -0
  110. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +3 -0
  111. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +6 -0
  112. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +1 -0
  113. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +5 -0
  114. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +8 -0
  115. package/claude/skills/sd-docs/evals/golden.jsonl +2 -0
  116. package/claude/skills/sd-docs/references/subagent-prompt.md +100 -0
  117. package/claude/skills/sd-impl/SKILL.md +149 -46
  118. package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +55 -0
  119. package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +55 -0
  120. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +22 -0
  121. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +57 -0
  122. package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +58 -0
  123. package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +52 -0
  124. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.test.ts +10 -0
  125. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.ts +11 -0
  126. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/data-access//352/261/260/353/236/230/354/262/230-/354/240/221/352/267/274.ts +12 -0
  127. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/models//352/261/260/353/236/230/354/262/230.ts +8 -0
  128. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +77 -0
  129. package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
  130. package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
  131. 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
  132. 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
  133. package/claude/skills/sd-impl/evals/golden.jsonl +6 -3
  134. package/claude/skills/sd-impl/references/spec-cross-check.md +82 -0
  135. package/claude/skills/sd-skill/SKILL.md +4 -4
  136. package/claude/skills/sd-skill/evals/golden.jsonl +1 -2
  137. package/claude/skills/sd-skill/references/eval-authoring.md +31 -0
  138. package/claude/skills/sd-skill/references/eval-run.md +1 -1
  139. package/claude/skills/sd-skill/references/skill-authoring.md +8 -5
  140. package/claude/skills/sd-skill/scripts/run_eval.py +39 -60
  141. package/claude/skills/sd-spec/SKILL.md +163 -105
  142. package/claude/skills/sd-spec/references/example-spec.md +585 -0
  143. package/claude/skills/sd-spec/references/spec-authoring.md +287 -0
  144. package/claude/skills/sd-spec/references/spec-md-template.md +15 -93
  145. package/claude/skills/sd-unpack/SKILL.md +7 -1
  146. package/claude/skills/sd-unpack/scripts/handlers/_common.py +10 -0
  147. package/claude/skills/sd-unpack/scripts/handlers/eml_handler.py +5 -13
  148. package/claude/skills/sd-unpack/scripts/handlers/msg_handler.py +3 -12
  149. package/claude/skills/sd-unpack/scripts/handlers/office_com.py +23 -37
  150. package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +1 -4
  151. package/claude/skills/sd-unpack/scripts/handlers/pdf_handler.py +4 -13
  152. package/claude/skills/sd-unpack/scripts/unpack.py +4 -4
  153. package/claude/skills/sd-use/SKILL.md +1 -0
  154. package/claude/skills/sd-wip/SKILL.md +38 -0
  155. package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/_wip.md +3 -0
  156. package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/spec.md +15 -0
  157. package/claude/skills/sd-wip/evals/fixtures/with-existing-wip/.wips/260101120000_acct.md +6 -0
  158. package/claude/skills/sd-wip/evals/fixtures/with-existing-wip-for-compact/.wips/260101120000_acct.md +14 -0
  159. package/claude/skills/sd-wip/evals/golden.jsonl +4 -0
  160. package/claude/skills/sd-wip/references/compact.md +79 -0
  161. package/package.json +1 -1
  162. package/scripts/sd-entries.mjs +2 -2
  163. package/claude/references/sd-simplysm14/orm.md +0 -11
  164. 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
  165. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/overview.md +0 -12
  166. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Button.tsx +0 -12
  167. package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Input.tsx +0 -27
  168. 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
  169. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/overview.md +0 -12
  170. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/components/Input.tsx +0 -25
  171. package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/pages/.gitkeep +0 -0
  172. 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
  173. 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
  174. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/overview.md +0 -16
  175. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Button.tsx +0 -6
  176. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Input.tsx +0 -15
  177. package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/pages/.gitkeep +0 -0
  178. package/claude/skills/sd-demo/references/demo-md-template.md +0 -92
  179. 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
  180. 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
  181. 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
  182. package/claude/skills/sd-dev/evals/fixtures/single-req-auto-chain/src/lib/.gitkeep +0 -0
  183. 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
  184. package/claude/skills/sd-dev/evals/fixtures/start-from-plan/src/lib/.gitkeep +0 -0
  185. 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
  186. 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
  187. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/components/Input.tsx +0 -6
  188. package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/pages/.gitkeep +0 -0
  189. 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
  190. 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
  191. package/claude/skills/sd-impl/evals/fixtures/multi-r/src/components/Input.tsx +0 -25
  192. package/claude/skills/sd-impl/evals/fixtures/multi-r/src/pages/.gitkeep +0 -0
  193. 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
  194. 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
  195. package/claude/skills/sd-impl/evals/fixtures/with-test-file/src/lib/.gitkeep +0 -0
  196. package/claude/skills/sd-impl/references/impl-md-template.md +0 -87
  197. package/claude/skills/sd-impl/references/modes-and-failure.md +0 -65
  198. package/claude/skills/sd-plan/SKILL.md +0 -130
  199. 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
  200. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/api/user.ts +0 -13
  201. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/components/Input.tsx +0 -15
  202. package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/pages/UserList.tsx +0 -29
  203. 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
  204. package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/components/Input.tsx +0 -6
  205. package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/pages/.gitkeep +0 -0
  206. 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
  207. 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
  208. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/components/Input.tsx +0 -25
  209. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/data/mock-customer.ts +0 -16
  210. package/claude/skills/sd-plan/evals/fixtures/demo-built/src/pages/CustomerList.tsx +0 -25
  211. package/claude/skills/sd-plan/evals/golden.jsonl +0 -3
  212. package/claude/skills/sd-plan/references/plan-md-template.md +0 -138
  213. 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
  214. 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
  215. 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
  216. 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
  217. 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
  218. package/claude/skills/sd-spec/evals/fixtures/direct-simple/.gitkeep +0 -0
  219. package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/REQ-001-test/spec.md +0 -19
  220. package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/overview.md +0 -18
  221. package/claude/skills/sd-spec/evals/golden.jsonl +0 -4
  222. package/claude/skills/sd-spec/references/overview-md-template.md +0 -89
  223. package/claude/skills/sd-spec/references/raw-input-handling.md +0 -96
  224. package/claude/skills/sd-verify/SKILL.md +0 -96
  225. 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
  226. 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
  227. 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
  228. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.test.ts +0 -11
  229. package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.ts +0 -7
  230. 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
  231. 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
  232. 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
  233. package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/src/pages/UserList.tsx +0 -19
  234. 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
  235. 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
  236. 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
  237. package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.test.ts +0 -10
  238. package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.ts +0 -7
  239. package/claude/skills/sd-verify/evals/golden.jsonl +0 -3
  240. package/claude/skills/sd-verify/references/verify-md-template.md +0 -99
  241. /package/claude/skills/{sd-demo/evals/fixtures/basic-single-req/src/pages → sd-wip/evals/fixtures/empty}/.gitkeep +0 -0
@@ -1,28 +0,0 @@
1
- # REQ-001-입고지시서긴급표시 / Plan
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 생성일: 2026-05-03
6
- - 마지막 갱신: 2026-05-03
7
- - 결과: proceed
8
-
9
- ## 결과 사유
10
- proceed — R1 미구현, 신규 페이지 + 체크박스 추가 필요.
11
-
12
- ## R 단위 계획
13
- - [ ] R1: 입고지시서 화면 헤더 우측에 "긴급" 체크박스 추가
14
- - **현황**: 미구현 (입고지시서 페이지 자체가 없음)
15
- - **변경 위치**:
16
- - `src/pages/InboundOrder.tsx` (신설) - `InboundOrderForm` 컴포넌트
17
- - **변경 방식**:
18
- - 입고지시서 폼 화면 신설. 헤더 우측에 `<Checkbox label="긴급" />` 배치, formState.urgent와 연동.
19
- - **테스트**:
20
- - 방식: 사후 테스트 (UI 변경)
21
- - 케이스: 체크박스 클릭 → 상태 토글 확인
22
-
23
- ## 작업 순서
24
- - 의존: 없음 (R1 단독)
25
- - 권장 순서: R1
26
-
27
- ## 통합/E2E 테스트
28
- - 입고지시서 폼 진입 → 긴급 체크박스 표시 확인 → 클릭 → 체크 상태 변화 확인
@@ -1,14 +0,0 @@
1
- # REQ-001-입고지시서긴급표시
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 생성일: 2026-05-03
6
- - 마지막 갱신: 2026-05-03
7
- - 관련 영역: WMS / 입고관리
8
-
9
- ## 요약
10
- 입고지시서 화면 헤더에 "긴급" 체크박스 추가.
11
-
12
- ## 세부 요구
13
- - [ ] R1: 입고지시서 화면 헤더 우측에 "긴급" 체크박스 추가
14
- - **A**: 디폴트 unchecked
@@ -1,6 +0,0 @@
1
- // 디자인 시스템 stub
2
- import React from 'react'
3
-
4
- export const Checkbox: React.FC<{ checked: boolean; onChange: (v: boolean) => void; label?: string }> = ({ checked, onChange, label }) => {
5
- return <label><input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} /> {label}</label>
6
- }
@@ -1,40 +0,0 @@
1
- # REQ-001-거래처목록 / Plan
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 결과: proceed
6
-
7
- ## 결과 사유
8
- proceed — 모두 미구현, 신규 페이지 + 데이터 + 로직 추가 필요.
9
-
10
- ## R 단위 계획
11
- - [ ] R1: 거래처 목록 표시 (이름/사업자번호/담당자/연락처)
12
- - **현황**: 미구현
13
- - **변경 위치**:
14
- - `src/pages/CustomerList.tsx` (신설) - `CustomerList` 컴포넌트
15
- - `src/data/customers.ts` (신설) - 샘플 데이터
16
- - **변경 방식**: Table 컴포넌트로 4개 컬럼 표시
17
- - **테스트**: 사후 (UI 변경)
18
-
19
- - [ ] R2: 거래처명 검색
20
- - **현황**: 미구현
21
- - **변경 위치**:
22
- - `src/pages/CustomerList.tsx` - `CustomerList` 검색 로직 추가
23
- - `src/lib/customer-filter.ts` (신설) - 필터 함수
24
- - **변경 방식**: Input으로 검색어 받고, 부분 일치 필터링
25
- - **테스트**: TDD (필터 함수 단위 테스트)
26
-
27
- - [ ] R3: 페이지네이션 (한 페이지 20건)
28
- - **현황**: 미구현
29
- - **변경 위치**:
30
- - `src/pages/CustomerList.tsx` - 페이지네이션 로직
31
- - `src/lib/paginate.ts` (신설) - 페이지 분할 함수
32
- - **변경 방식**: 20건씩 슬라이스, Pagination 컴포넌트 사용
33
- - **테스트**: TDD (페이지 함수 단위 테스트)
34
-
35
- ## 작업 순서
36
- - 의존: R3는 R2(필터 결과)에 의존
37
- - 권장 순서: R1 → R2 → R3
38
-
39
- ## 통합/E2E 테스트
40
- - 목록 진입 → 검색 → 결과 페이지네이션 동작 확인
@@ -1,13 +0,0 @@
1
- # REQ-001-거래처목록
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 관련 영역: 거래처관리
6
-
7
- ## 요약
8
- 거래처 목록 화면 (검색 + 페이지네이션).
9
-
10
- ## 세부 요구
11
- - [ ] R1: 거래처 목록 표시
12
- - [ ] R2: 거래처명 검색
13
- - [ ] R3: 페이지네이션 (20건/페이지)
@@ -1,25 +0,0 @@
1
- // 디자인 시스템 stub
2
- import React from 'react'
3
-
4
- export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
5
- return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
6
- }
7
-
8
- export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
9
- return (
10
- <table>
11
- <thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
12
- <tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
13
- </table>
14
- )
15
- }
16
-
17
- export const Pagination: React.FC<{ page: number; total: number; onChange: (p: number) => void }> = ({ page, total, onChange }) => {
18
- return (
19
- <div>
20
- <button onClick={() => onChange(page - 1)}>이전</button>
21
- <span>{page} / {total}</span>
22
- <button onClick={() => onChange(page + 1)}>다음</button>
23
- </div>
24
- )
25
- }
@@ -1,26 +0,0 @@
1
- # REQ-001-할인계산 / Plan
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 결과: proceed
6
-
7
- ## 결과 사유
8
- proceed — 비즈니스 로직 신규 구현 필요.
9
-
10
- ## R 단위 계획
11
- - [ ] R1: 할인율 계산 함수 (금액별 차등)
12
- - **현황**: 미구현
13
- - **변경 위치**:
14
- - `src/lib/discount.ts` (신설) - `calcDiscountRate(amount: number): number` 함수
15
- - **변경 방식**:
16
- - 100만원 이상: 0.15 / 50만원 이상: 0.10 / 10만원 이상: 0.05 / 그 외: 0
17
- - 큰 구간부터 비교
18
- - **테스트**:
19
- - **방식: TDD** (순수 함수, 비즈니스 로직)
20
- - 케이스: 0원, 99999원, 100000원, 499999원, 500000원, 999999원, 1000000원
21
-
22
- ## 작업 순서
23
- - 의존: 없음
24
-
25
- ## 통합/E2E 테스트
26
- - 단위 함수만 있으므로 통합 시나리오 X (단위 테스트로 충분)
@@ -1,12 +0,0 @@
1
- # REQ-001-할인계산
2
-
3
- ## 메타
4
- - 상태: planned
5
- - 관련 영역: 주문/결제
6
-
7
- ## 요약
8
- 주문 금액에 따른 할인 계산 로직 추가.
9
-
10
- ## 세부 요구
11
- - [ ] R1: 할인율 계산 함수 (금액별 차등: 10만↑ 5%, 50만↑ 10%, 100만↑ 15%)
12
- - **A**: 적용 우선순위는 금액 큰 구간 먼저
@@ -1,87 +0,0 @@
1
- # impl.md 템플릿
2
-
3
- 위치: `.specs/{yyMMdd_HHmmss}/REQ-XXX-슬러그/impl.md`
4
-
5
- ## 템플릿
6
-
7
- ```markdown
8
- # REQ-001-슬러그 / Implementation
9
-
10
- ## 메타
11
- - 상태: implementing | implemented
12
- - 생성일: YYYY-MM-DD
13
- - 마지막 갱신: YYYY-MM-DD
14
-
15
- ## R 단위 구현 결과
16
-
17
- ### R1: <요구 제목>
18
- - **상태**: 진행중 | 완료 | 막힘 | 보류
19
- - **모드**: TDD | 사후 | 생략
20
- - **변경 파일**:
21
- - `<파일경로>`
22
- - 변경 함수: `<함수/컴포넌트명>`
23
- - 변경 종류: 추가 | 수정 | 삭제 | 신설
24
- - **테스트**:
25
- - 추가/수정: `<테스트 파일>`
26
- - 케이스: <케이스 이름들>
27
- - 결과: PASS / FAIL
28
- - **plan 대비 차이**: 없음 | <차이 설명>
29
- - **변경 의도**: spec.md R1 + plan.md R1 그대로 | <사유>
30
- - **이슈/결정**: (있을 때만) <막힘/시도/결정 기록>
31
- ```
32
-
33
- ## 섹션별 역할
34
-
35
- | 섹션 | 용도 |
36
- |---|---|
37
- | `## 메타` | 상태 |
38
- | `## R 단위 구현 결과` | R별 상태/모드/변경/테스트/차이/의도 인라인 통합 |
39
-
40
- ## R 항목 내부 요소
41
-
42
- | 요소 | 의미 |
43
- |---|---|
44
- | **상태** | `완료` / `진행중` / `막힘` / `보류` (종료 시엔 모두 `완료`) |
45
- | **모드** | TDD / 사후 / 생략 |
46
- | **변경 파일** | 파일 경로 + 변경 함수 + 변경 종류 (라인 번호 X) |
47
- | **테스트** | 추가/수정 테스트 + 케이스 + 결과 |
48
- | **plan 대비 차이** | 계획 vs 실제 (verify가 활용) |
49
- | **변경 의도** | 자명하면 "그대로", 자명하지 않으면 사유 |
50
- | **이슈/결정** | (있을 때만) 막힘 상황, 시도 횟수, 결정 |
51
-
52
- `plan 대비 차이`가 "없음"이 아니거나 `이슈/결정`에 결정이 발생한 경우, 결정 출처를 `근거:` 줄로 명시한다.
53
-
54
- ## 예시
55
-
56
- ```markdown
57
- ### R1: 입고지시서 화면에 "긴급" 체크박스 추가
58
- - **상태**: 완료
59
- - **모드**: 사후 테스트
60
- - **변경 파일**:
61
- - `src/pages/InboundOrder.tsx`
62
- - 변경 함수: `InboundOrderForm`
63
- - 변경 종류: 추가 (Checkbox 컴포넌트, formState.urgent 연동)
64
- - **테스트**:
65
- - 추가: `src/pages/InboundOrder.test.tsx`
66
- - 케이스: "체크박스 클릭 → 저장 → 재조회 시 상태 유지"
67
- - 결과: PASS (1/1)
68
- - **plan 대비 차이**: 없음
69
- - **변경 의도**: spec.md R1 + plan.md R1 그대로
70
-
71
- ### R3: 권한 체크 추가
72
- - **상태**: 완료
73
- - **모드**: TDD
74
- - **변경 파일**:
75
- - `src/contexts/PermissionContext.tsx` (신설)
76
- - **테스트**:
77
- - 추가: `src/contexts/PermissionContext.test.tsx`
78
- - 케이스: "권한 있는 사용자 → true" / "권한 없는 사용자 → false"
79
- - 결과: PASS (2/2)
80
- - **plan 대비 차이**: PermissionContext 신설 (plan은 기존 hasPermission 가정)
81
- - 근거: 사용자 답변 (2026-05-04)
82
- - **이슈/결정**:
83
- - 이슈: hasPermission 패턴이 사용 안 되고 있음 발견
84
- - 시도: 1회
85
- - 결정: PermissionContext 신설
86
- - 근거: 사용자 답변 (2026-05-04)
87
- ```
@@ -1,65 +0,0 @@
1
- # 모드별 표준 흐름 + 막힘 처리
2
-
3
- ## 모드별 표준 흐름
4
-
5
-
6
- ### TDD (비즈니스 로직, 알고리즘)
7
- ```
8
- 1. 실패하는 테스트 작성 (RED)
9
- 2. 테스트 실행 → 실패 확인
10
- 3. 통과하는 최소 코드 (GREEN)
11
- 4. 테스트 실행 → 통과 확인
12
- 5. 정리 (REFACTOR)
13
- 6. 테스트 재실행 → 통과 유지
14
- ```
15
-
16
- ### 사후 테스트 (UI, 외부 API)
17
- ```
18
- 1. 코드 작성
19
- 2. 동작 확인
20
- 3. 테스트 작성
21
- 4. 테스트 실행 → 통과 확인
22
- ```
23
-
24
- ### 생략 (마이그레이션, 일회성 스크립트)
25
- ```
26
- 1. 코드 작성
27
- 2. 타입체크/린트 통과 확인
28
- ```
29
-
30
- ### 모드 변경 정책
31
-
32
- implement 도중 "이 R은 plan과 다른 모드 적합" 판단되면:
33
- - **자동 변경 금지**. 사용자에게 Q → 승인 받으면 변경 + impl.md `이슈/결정` 기록.
34
-
35
- ## 막힘 처리
36
-
37
- ### 자동 시도
38
- 단순 에러(타입/린트/단순 테스트 실패)는 **자동 N=2회 시도**:
39
- - 성공 → 다음 단계, impl.md `이슈/결정`에 "N회 시도 후 해결" 기록
40
- - 실패 → 종류별 분기 (아래)
41
-
42
- ### 막힘 종류 (4가지)
43
-
44
- | 종류 | 예시 | 처리 |
45
- |---|---|---|
46
- | 단순 에러 | 타입/린트/단순 테스트 실패 | 자동 N=2회 |
47
- | 코드 문제 | 회귀 검증 실패, 비단순 테스트 실패 | impl.md `상태: 막힘` + Q (해결 방안) |
48
- | 계획 문제 | plan.md ↔ 실제 코드 모순 | impl.md `상태: 보류` + plan 재진입 알림 |
49
- | 정보 부족 | 패턴 모름, 옵션 선택 필요 | impl.md `상태: 막힘` + Q (정보 요청) |
50
-
51
- ### 사용자 답변 후
52
-
53
- - 해결 방안 적용 → 다음 시도
54
- - 우회 → 적용 + impl.md `결정` 기록
55
- - 중단 → implement 단계 중단, plan 재진입
56
-
57
- ### 계획 재진입 절차
58
-
59
- ```
60
- 1. impl.md `상태: 보류` + 사유 기록
61
- 2. plan.md 메타 `상태: re-planning`
62
- 3. 사용자 알림 ("implement 중 X 발견. plan 재토론 필요")
63
- 4. plan 재진입 → 변경된 부분만 재계획 → 새 체크포인트
64
- 5. implement 재개 (보류된 R만 재구현)
65
- ```
@@ -1,130 +0,0 @@
1
- ---
2
- name: sd-plan
3
- description: spec.md(요구사항)를 기존 코드베이스에 매핑하고 R별 변경 계획(위치/방식/테스트)과 작업 순서를 plan.md로 작성하는 스킬. Use when spec 단계 후 implement 진입 전, 변경 계획 수립이 필요할 때
4
- ---
5
-
6
- # plan 단계
7
-
8
- 대상 spec.md 및 관련 자료를 읽고 → 현황 매핑 + 변경 계획 (R별 변경 위치/방식/테스트 + R 간 작업 순서).
9
-
10
- ## 산출물
11
-
12
- ```
13
- .specs/{yyMMdd_HHmmss}/REQ-XXX-슬러그/
14
- spec.md ← 입력 (이미 존재)
15
- plan.md ← 본 단계 산출물
16
- ```
17
-
18
- ## 워크플로
19
-
20
- 1. 입력: 대상 REQ ID
21
-
22
- 2. 읽기: 대상 spec.md + overview.md + raw input(있으면) + 관련 타 spec.md 및 plan.md + 기존 코드베이스
23
- - 특히 "spec.md, overview.md, raw input(있으면), 관련 타 spec.md 및 plan.md"는 반드시 통독할것
24
-
25
- 3. 초안 plan.md 작성 (템플릿: [references/plan-md-template.md](references/plan-md-template.md))
26
- - **R별 현황 매핑** (4단계: 구현/부분/미구현/차이있음)
27
- - **R별 설계** (R 성격별 조건부 — 아래 "R 성격별 설계 정보" 참조)
28
- - **R별 변경 위치** (파일 경로 + 함수/컴포넌트 이름. 라인 번호 X)
29
- - **R별 변경 방식** (자연어. 복잡한 로직만 의사코드)
30
- - **R별 테스트** (방식: TDD/사후/생략 + 케이스)
31
- - **작업 순서** (R 간 의존성, 권장 순서, 병렬 가능 여부)
32
- - **통합/E2E 테스트** (R 간 흐름)
33
- - **결과** 메타 필드 (`proceed` | `skip-to-verify`)
34
- - 결정 근거 없는 부분 → Q. 모든 결정은 plan.md에 근거 출처 명시.
35
-
36
- 4. Q 다이얼로그 (한 번에 하나씩) → 사용자 답변 → 즉시 plan.md 갱신
37
- - **spec 모순 발견 시**: Q로 알림 → 사용자 답변 받아 spec.md 수정 + spec.md 메타 `이력` 기록 → 변경된 R 부분만 재계획. plan 단계 종료 X.
38
-
39
- 5. Q 0개 도달 시 종료 절차:
40
- ```
41
- loop:
42
- plan.md 전체 재검토 (R별 현황/변경 위치/방식 정합성 / 누락 결정거리 / 작업 순서 / 테스트 모드 / 모호 표현 / 미해결 의존)
43
- if 신규 Q 등록됨:
44
- "Q 다이얼로그" 재진입 → Q 0 도달
45
- continue
46
- break
47
-
48
- loop:
49
- 역방향 문서 검토 (overview, spec, demo)
50
- if 신규 모순/수정 등록됨:
51
- "Q 다이얼로그" 재진입 → Q 0 도달
52
- continue
53
- break
54
-
55
- 산출물 소비자 친화적 보고
56
- 상태 ← planned
57
- ```
58
- - 보고: 산출물 소비자가 그대로 읽어도 의도가 전달되는 수준 자연어. REQ 차원 "어디를 어떻게 바꿀지" 요약 (R별 변경 위치/방식 핵심) + 작업 순서 + 결과. 기술 용어 최소화 (단, 파일·함수명 같은 위치 식별자는 필요). 안내 텍스트라 별도 사용자 승인 게이트 X.
59
-
60
- ## 현황 분류 (4단계)
61
-
62
- | 분류 | 의미 |
63
- |---|---|
64
- | **구현** | spec R 의도가 코드에 이미 반영됨 |
65
- | **부분** | R 일부만 구현됨 (예: UI는 있으나 로직 없음) |
66
- | **미구현** | 관련 코드 없음 |
67
- | **차이있음** | 구현되어 있으나 R 의도와 불일치 |
68
-
69
- ## 변경 계획 입도
70
-
71
- - **변경 위치**: 파일 경로 + 함수/컴포넌트 이름 (라인 번호 X — 코드 변경에 취약)
72
- - **변경 방식**: 자연어. 복잡한 로직(상태 머신, 알고리즘)만 의사코드. 완전한 코드 스니펫 X (implement 단계 의미 무력화)
73
-
74
- ## R 성격별 설계 정보
75
-
76
- R의 성격에 따라 "변경 위치/방식"만으로는 산출물 소비자가 그림을 그릴 수 없는 경우가 있다. 아래 표에 해당하는 R은 **설계** 서브섹션을 추가한다. 단순 변경(예: 색상/문구/상수 값)은 생략한다.
77
-
78
- | R 성격 | 설계 서브섹션 내용 |
79
- |---|---|
80
- | **UI** | 레이아웃(좌우 분할/배치/주요 영역), 사용자 이벤트 흐름(클릭→모달→저장 같은 시퀀스), 상태 변화 |
81
- | **API** | 엔드포인트(메서드+경로), 요청/응답 스키마, 에러 케이스, 인증/권한 |
82
- | **데이터 모델** | 스키마 변경(테이블/컬럼/제약), 마이그레이션 전략, 기존 데이터 처리 |
83
- | **외부 연동** | 호출 시퀀스, 실패/재시도/타임아웃 정책, 멱등성 |
84
- | **단순 변경** | (생략) |
85
-
86
- 표현은 **자연어 우선**. 그림이 꼭 필요하면 짧은 ASCII 박스 허용하되 강제는 아님. 예: "좌측 목록 / 우측 상세 폼, 우상단 + 버튼 → 신규 등록 모달".
87
-
88
- **demo 산출물이 있는 UI R**: 레이아웃/이벤트 흐름은 demo.md를 정본으로 삼고, plan에서는 "demo.md 참조" + plan에서 추가로 결정해야 할 부분만 짧게 적는다 (중복 작성 X).
89
-
90
- ## 테스트 모드 선택
91
-
92
- **우선순위: TDD > 사후 테스트 > 생략**. 위에서부터 적용 가능 여부를 따져 가능한 **가장 높은** 모드를 고른다. 낮은 모드로 내려갈수록 테스트가 실제로 작성되지 않을 위험이 커지므로, 안일하게 떨어뜨리지 않는다.
93
-
94
- | 모드 | 적용 조건 | 일반적인 R 성격 |
95
- |---|---|---|
96
- | **TDD** | 입력 → 출력을 코드로 단언 가능 | 비즈니스 로직, 알고리즘, 데이터 변환, 순수 함수, mock 가능한 외부 연동 |
97
- | **사후 테스트** | TDD 불가하지만 동작 후 상태/응답을 코드로 단언 가능 | UI 동작, 실제 외부 API 응답, DB 변경 결과 |
98
- | **생략** | 위 둘 다 불가하거나 검증 비용 대비 가치 낮음 | 일회성 스크립트, 단순 마이그레이션 |
99
-
100
- 판단 모호 → Q. 특히 "TDD로 끌어올릴 여지가 있나?"를 먼저 검토.
101
-
102
- ## 결과
103
-
104
- | 결과 | 의미 | 다음 동작 |
105
- |---|---|---|
106
- | `proceed` | 변경할 R 있음 | implement 진행 |
107
- | `skip-to-verify` | 모든 R 이미 구현됨 | verify 직행 |
108
-
109
- (`back-to-spec` 분기는 없음. spec 모순은 plan 안에서 처리 후 계속.)
110
-
111
- ## 핵심 원칙
112
-
113
- - self-contained 블록 (R 블록 안에 현황/변경/테스트 인라인)
114
- - raw input 불변
115
- - ID 불변
116
- - 자동 판단 금지: 결정 근거 없으면 Q 등록 (현황/모드 판단 포함). 모든 결정은 plan.md에 근거 출처 명시.
117
- - 한 번에 하나씩 Q
118
-
119
- ## 안티패턴
120
-
121
- - ❌ 라인 번호로 변경 위치 표기
122
- - ❌ 변경 방식에 완전한 코드 스니펫
123
- - ❌ 결정 근거 없는 추정을 Q 없이 단정
124
- - ❌ R 단위 정보를 별도 섹션으로 분리 (self-contained 블록 깨짐)
125
- - ❌ 작업 순서를 R 안에 적기 (R 간 관계는 별도 섹션)
126
- - ❌ 마지막 Q 답변 직후 plan.md 전체 재검토 없이 planned 전환
127
- - ❌ 역방향 검토 없이 planned 전환
128
- - ❌ 단순 변경 R(색상/문구/상수)에 설계 서브섹션 추가
129
- - ❌ demo.md가 있는 UI R인데 plan에 레이아웃/이벤트 흐름 중복 작성
130
- - ❌ UI/API/데이터 모델/외부 연동 R인데 설계 서브섹션 누락
@@ -1,14 +0,0 @@
1
- # REQ-001-사용자목록
2
-
3
- ## 메타
4
- - 상태: specified
5
- - 생성일: 2026-05-03
6
- - 마지막 갱신: 2026-05-03
7
- - 관련 영역: 사용자관리
8
-
9
- ## 요약
10
- 사용자 목록 화면 (이름/이메일 표시, 이메일 검색).
11
-
12
- ## 세부 요구
13
- - [ ] R1: 사용자 목록 표시 (이름, 이메일)
14
- - [ ] R2: 이메일 검색
@@ -1,13 +0,0 @@
1
- // 실제 구현된 API 호출
2
- export interface User {
3
- id: string
4
- name: string
5
- email: string
6
- }
7
-
8
- export async function fetchUsers(emailQuery?: string): Promise<User[]> {
9
- const url = emailQuery ? `/api/users?email=${encodeURIComponent(emailQuery)}` : '/api/users'
10
- const res = await fetch(url)
11
- if (!res.ok) throw new Error('Failed to fetch users')
12
- return res.json()
13
- }
@@ -1,15 +0,0 @@
1
- // 디자인 시스템 stub
2
- import React from 'react'
3
-
4
- export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
5
- return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
6
- }
7
-
8
- export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
9
- return (
10
- <table>
11
- <thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
12
- <tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
13
- </table>
14
- )
15
- }
@@ -1,29 +0,0 @@
1
- // 이미 구현된 사용자 목록 화면 (실제 API 호출, 검색 동작)
2
- import React, { useState, useEffect } from 'react'
3
- import { Input, Table } from '../components/Input'
4
- import { fetchUsers, User } from '../api/user'
5
-
6
- export const UserList: React.FC = () => {
7
- const [search, setSearch] = useState('')
8
- const [users, setUsers] = useState<User[]>([])
9
- const [loading, setLoading] = useState(false)
10
-
11
- useEffect(() => {
12
- setLoading(true)
13
- fetchUsers(search || undefined)
14
- .then(setUsers)
15
- .finally(() => setLoading(false))
16
- }, [search])
17
-
18
- const columns = [
19
- { key: 'name', label: '이름' },
20
- { key: 'email', label: '이메일' },
21
- ]
22
-
23
- return (
24
- <div>
25
- <Input value={search} onChange={setSearch} placeholder="이메일 검색" />
26
- {loading ? <p>로딩 중...</p> : <Table rows={users} columns={columns} />}
27
- </div>
28
- )
29
- }
@@ -1,17 +0,0 @@
1
- # REQ-001-입고지시서긴급표시
2
-
3
- ## 메타
4
- - 상태: specified
5
- - 생성일: 2026-05-03
6
- - 마지막 갱신: 2026-05-03
7
- - 관련 영역: WMS / 입고관리
8
-
9
- ## 요약
10
- 입고지시서에 긴급 여부 표시 기능 추가.
11
-
12
- ## 세부 요구
13
- - [ ] R1: 입고지시서 화면 헤더 우측에 "긴급" 체크박스 추가
14
- - **A**: 디폴트 unchecked
15
-
16
- - [ ] R2: 긴급 표시 PDF 빨간색 강조
17
- - **A**: 빨간색은 #D32F2F
@@ -1,6 +0,0 @@
1
- // 디자인 시스템 stub
2
- import React from 'react'
3
-
4
- export const Checkbox: React.FC<{ checked: boolean; onChange: (v: boolean) => void; label?: string }> = ({ checked, onChange, label }) => {
5
- return <label><input type="checkbox" checked={checked} onChange={(e) => onChange(e.target.checked)} /> {label}</label>
6
- }
@@ -1,26 +0,0 @@
1
- # DEMO-001-거래처 / Demo
2
-
3
- ## 메타
4
- - 상태: done
5
- - 대상 REQ: REQ-001
6
- - 생성일: 2026-05-03
7
- - 마지막 갱신: 2026-05-03
8
- - 라운드: 1
9
-
10
- ## 시나리오
11
- 1. 거래처 목록 화면 진입 → mock 데이터 표시
12
- 2. 검색창에 텍스트 입력 → 시각적 필터 (실제 검색 X)
13
- 3. 페이지네이션 버튼 클릭 → 다음 페이지 표시 (mock)
14
-
15
- ## 만든 파일
16
- - `src/pages/CustomerList.tsx` (신규)
17
- - `src/data/mock-customer.ts` (mock data)
18
-
19
- ## Mock Data 요약
20
- - 위치: `src/data/mock-customer.ts`
21
- - 샘플: 25건
22
-
23
- ## 산출물 소비자 피드백 라운드
24
- ### 라운드 1 (2026-05-03)
25
- - **산출물 소비자 피드백**: OK
26
- - **처리**: demo 종료
@@ -1,15 +0,0 @@
1
- # REQ-001-거래처목록화면
2
-
3
- ## 메타
4
- - 상태: specified
5
- - 생성일: 2026-05-03
6
- - 마지막 갱신: 2026-05-03
7
- - 관련 영역: 거래처관리
8
-
9
- ## 요약
10
- 거래처 목록 조회 화면.
11
-
12
- ## 세부 요구
13
- - [ ] R1: 거래처 목록 표시 (이름/사업자번호/담당자/연락처)
14
- - [ ] R2: 거래처명 검색
15
- - [ ] R3: 페이지네이션 (한 페이지 20건)
@@ -1,25 +0,0 @@
1
- // 디자인 시스템 stub
2
- import React from 'react'
3
-
4
- export const Input: React.FC<{ value: string; onChange: (v: string) => void; placeholder?: string }> = ({ value, onChange, placeholder }) => {
5
- return <input value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} />
6
- }
7
-
8
- export const Table: React.FC<{ rows: any[]; columns: { key: string; label: string }[] }> = ({ rows, columns }) => {
9
- return (
10
- <table>
11
- <thead><tr>{columns.map((c) => <th key={c.key}>{c.label}</th>)}</tr></thead>
12
- <tbody>{rows.map((r, i) => <tr key={i}>{columns.map((c) => <td key={c.key}>{r[c.key]}</td>)}</tr>)}</tbody>
13
- </table>
14
- )
15
- }
16
-
17
- export const Pagination: React.FC<{ page: number; total: number; onChange: (p: number) => void }> = ({ page, total, onChange }) => {
18
- return (
19
- <div>
20
- <button onClick={() => onChange(page - 1)}>이전</button>
21
- <span>{page} / {total}</span>
22
- <button onClick={() => onChange(page + 1)}>다음</button>
23
- </div>
24
- )
25
- }
@@ -1,16 +0,0 @@
1
- // MOCK DATA - replaced in implement stage
2
- export interface Customer {
3
- id: string
4
- name: string
5
- bizNumber: string
6
- manager: string
7
- phone: string
8
- }
9
-
10
- export const MOCK_CUSTOMER_LIST: Customer[] = Array.from({ length: 25 }, (_, i) => ({
11
- id: `c-${i + 1}`,
12
- name: `샘플거래처 ${i + 1}`,
13
- bizNumber: `123-45-${String(i).padStart(5, '0')}`,
14
- manager: `담당자 ${i + 1}`,
15
- phone: `010-0000-${String(i).padStart(4, '0')}`,
16
- }))