@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
@@ -0,0 +1,64 @@
1
+ # Requirement Source 부정확성 처리
2
+
3
+ ## STT 텍스트 보정
4
+
5
+ **명백한 오타만 보정**. 보정 시 `[원문]` 발췌로 원본도 보존.
6
+
7
+ ```markdown
8
+ > [2026-03-17 회의] "PDF에 빨간색으로 강조"
9
+ > [원문] "PDF에 빨간색으루 강조"
10
+ > 출처: .docs/회의대본_3.txt:L120
11
+ ```
12
+
13
+ 판정:
14
+ - ✅ 명백 (오타 1~2글자, 의미 자명): 보정
15
+ - ❌ 모호 (의미가 여러 갈래로 해석 가능): **사용자에게 즉시 확인**, 원문 그대로 발췌
16
+
17
+ ## 화자 추정
18
+
19
+ 회의록 화자가 부정확/누락된 경우 컨텍스트로 추정. `[추정: ...]` 표기.
20
+
21
+ ```markdown
22
+ > [2026-03-17 회의, 추정: B 차장] "주문 단위로 가는 게 맞다"
23
+ > 출처: .docs/회의대본_3.txt:L78-L80
24
+ ```
25
+
26
+ 판정:
27
+ - ✅ 컨텍스트로 명확: 추정
28
+ - ❌ 모호: **사용자에게 즉시 확인**, 화자 미상으로 발췌
29
+
30
+ ## 모호 발화 처리
31
+
32
+ 지시대명사·생략 표현·비격식 발언:
33
+ - "그거 그렇게" / "이렇게 가는 걸로" / "지난번처럼" / "알아서"
34
+
35
+ 처리:
36
+ - **자동 해석 금지** (이전 발언/맥락 추측해서 채워 넣지 말 것)
37
+ - **사용자에게 즉시 확인** — "그거"가 무엇인지, "그렇게"가 어떤 방식인지
38
+
39
+ ## 다중 화자 발언 섞임 (회의록)
40
+
41
+ 여러 사람이 같은 주제를 다른 입장에서 말한 경우:
42
+ - 양쪽(또는 모든) 발언 모두 발췌 보존
43
+ - 사용자에게 어느 의견 채택할지 즉시 확인
44
+
45
+ ## 비격식 메일 / paste
46
+
47
+ 주어 생략, 맥락 누락:
48
+ - 보충 가능한 부분(자명한 주어 등): 발췌 시 `[추정 보충: ...]` 표기로 원문에 덧붙이지 않고 명시
49
+ - 모호한 부분: 사용자에게 즉시 확인
50
+
51
+ ## 도메인 용어 다의성
52
+
53
+ Requirement Source 는 시스템 용어가 아니라 **현장 은어**. 같은 단어가 시스템상 여러 동작에 매핑될 수 있음.
54
+
55
+ - 예: "출고" → 창고간 재고이동 / 고객사 납품 / 차량 적재 / 그 외
56
+ - 예: "마감" → 일마감 / 월마감 / 정산마감 / 작업종료
57
+ - 예: "주문" → 고객 발주 / 내부 작업지시 / 견적 단계
58
+
59
+ **위험도 역설**: 일반적으로 들리는 업무 용어(출고/입고/재고/주문/마감/등록 등)일수록 더 의심. 낯선 용어는 자연스럽게 의문이 생기지만, 익숙한 용어는 모두가 안다고 착각함.
60
+
61
+ 처리:
62
+ - **자동 매핑 금지**
63
+ - **사용자에게 즉시 확인** — "이 단어가 시스템상 어떤 동작을 가리키는지"
64
+ - **후보 나열 금지** — Claude 가 추측한 후보를 제시하면 사용자가 그 안에서만 고르게 가둠. 후보는 사용자가 답하게 둘 것
@@ -1,51 +1,55 @@
1
- # 문서 설명
1
+ # @simplysm/* v14 행동 지침
2
2
 
3
3
  Claude 에이전트가 반드시 지켜야 할 행동 지침이다. (@simplysm/\* v14 포함시)
4
4
 
5
- ## CLAUDE.md 명령어 구성 참조
5
+ ## 코드 위치 원칙
6
6
 
7
- 명령어 구성시 check, typecheck, lint check 가 기본임을 표기
7
+ 기본 위치는 **클라이언트**. 서버(`service-server`)는 다음 경우에만 둔다:
8
8
 
9
- - `pnpm check --fix`이 **기본 검증 명령**이며, typecheck + lint 한꺼번에, 자동수정 포함
10
- - `pnpm typecheck`, `pnpm lint`는 `pnpm check` 에서 문제 났을 타입만 따로 보기 위함
9
+ - **보안**: 클라이언트에 노출 불가한 자격증명/키, 권한 우회 위험, 외부에 직접 노출하면 안 되는 연산.
10
+ - **클라이언트 미지원**: 브라우저/모바일 런타임에서 실행 불가한 기능(특정 네이티브 API, 서버 자원 접근 등).
11
+
12
+ ORM 호출, 파일 변환, 비즈니스 로직 등은 위 두 사유에 해당하지 않는 한 클라이언트 코드에 직접 둔다. "서버에 두는 게 관행"이라는 이유로 service 로 이관하지 않는다.
13
+
14
+ ## CLAUDE.md 명령어 표기
15
+
16
+ `CLAUDE.md` 작성 시, 검증 명령은 다음 역할로 표기한다.
17
+
18
+ - **기본 검증 (평소 사용)**: `pnpm check --fix` — typecheck + lint 일괄, 자동 수정 포함.
19
+ - **보조**: `pnpm typecheck`, `pnpm lint` — `pnpm check` 에서 문제 났을 때 각각 따로 보기 위함. 단독 사용은 회피.
11
20
 
12
21
  ## 개발 매뉴얼
13
22
 
14
- - **클라이언트 화면 작성** [client-component.md](./client-component.md)
15
- - **클라이언트 탭 컨트롤** — [client-tab.md](./client-tab.md)
16
- - **클라이언트 환경 셋업** — [client-setup.md](./client-setup.md)
17
- - **ORM 쿼리 작성** — [orm.md](./orm.md)
18
- - **UNION 사용법** — [orm-union.md](./orm-union.md)
23
+ 트리거 조건이 처음 충족될 해당 자료를 Read.
24
+
25
+ | 트리거 | 매뉴얼 |
26
+ | ------------------------------------------------------- | ------------------------------------------------------ |
27
+ | 클라이언트 코드(앱·`@simplysm/angular`) 작성 항상 | [client-rules.md](./manuals/client-rules.md) |
28
+ | 화면 컴포넌트(`<domain>.<역할>.ts`) 작성/수정 | [client-component.md](./manuals/client-component.md) |
29
+ | `sd-crud-list` / `sd-crud-detail` 채택한 목록·단건 화면 | [client-crud.md](./manuals/client-crud.md) |
30
+ | 클라이언트 데모 컴포넌트 작성 | [client-demo.md](./manuals/client-demo.md) |
31
+ | `<sd-tab>` 사용 | [client-tab.md](./manuals/client-tab.md) |
32
+ | 새 앱 부트스트랩 또는 새 서비스·마스터 데이터 추가 | [client-setup.md](./manuals/client-setup.md) |
33
+ | DB 스키마 정의 또는 ORM 쿼리 작성 | [orm.md](./manuals/orm.md) |
34
+ | 이종 엔티티를 한 목록으로 합쳐 표시 (UNION) | [orm-union.md](./manuals/orm-union.md) |
19
35
 
20
36
  ## 패키지 인덱스
21
37
 
22
- - **angular** — 표준 Angular UI/기능 라이브러리
23
- - **capacitor-plugin-auto-update** — 모바일 자동 업데이트(zip diff + APK 설치)
24
- - **capacitor-plugin-file-system** — 모바일 네이티브 파일시스템 접근
25
- - **capacitor-plugin-intent** — Android Intent 송수신
26
- - **capacitor-plugin-usb-storage** — Android USB OTG 외장 저장소 접근
27
- - **core-common** — 환경 비종속 공용 도구
28
- - 표준 에러 클래스(`SdError`/`ArgumentError`/`NotImplementedError`/`TimeoutError`)
29
- - 타입(`Uuid`/`DateTime`/`DateOnly`/`Time`/`LazyGcMap`)
30
- - 디바운스 큐·직렬 큐·이벤트 에미터
31
- - bytes/날짜/JSON/숫자/객체/경로/텍스트/XML/zip 변환 유틸
32
- - **core-browser** — 브라우저 전용 보강
33
- - DOM 트리 탐색·포커스 보조 확장
34
- - IndexedDB 기반 가상 파일시스템
35
- - 진행률·취소·타임아웃 가능 fetch 래퍼
36
- - 파일 선택/다운로드 헬퍼
37
- - **core-node** — Node 전용 보강
38
- - 파일 IO/복사/경로 래퍼
39
- - 파일 감시(chokidar)
40
- - 로거(consola)
41
- - worker_threads 추상화
42
- - **excel** — xlsx 파일 읽기/쓰기
43
- - **lint** — 자체 ESLint 플러그인 + recommended 프리셋
44
- - **orm-common** — DB 비종속 ORM 코어(쿼리 빌더·표현식·스키마·DDL)
45
- - **orm-node** — Node DB 드라이버 연결(mssql/mysql/postgresql)
46
- - **sd-claude** — 소비 앱에 Claude Code 셋업을 npm 으로 배포
47
- - **sd-cli** — 모노레포 빌드/배포 오케스트레이터(tsc/esbuild/ngtsc/Capacitor/Electron)
48
- - **service-client** — 서비스 서버 호출 클라이언트 SDK
49
- - **service-common** — 서비스 서버↔클라이언트 프로토콜·타입 계약
50
- - **service-server** — Fastify 기반 서비스 서버
51
- - **storage** — FTP/SFTP 원격 파일 스토리지 클라이언트
38
+ - **angular** — Angular 21 standalone/signal/zoneless 기반 업무 클라이언트 UI 라이브러리. `provideSdAngular` 부트스트랩, 폼/시트/CRUD/모달/토스트/사이드바·탑바·드롭다운/공유데이터·칸반 등 화면 컴포넌트와 인프라 프로바이더 제공. 자세히: [apis/angular/README.md](./apis/angular/README.md)
39
+ - **capacitor-plugin-auto-update** — Android Capacitor 앱에서 APK 자동 업데이트와 APK 설치 권한·버전 조회. 자세히: [apis/capacitor-plugin-auto-update/README.md](./apis/capacitor-plugin-auto-update/README.md)
40
+ - **capacitor-plugin-file-system** — Capacitor 모바일/웹 파일 시스템 접근(권한·경로·디렉토리·파일 IO). 자세히: [apis/capacitor-plugin-file-system/README.md](./apis/capacitor-plugin-file-system/README.md)
41
+ - **capacitor-plugin-intent** — Android 인텐트 브로드캐스트 송수신 및 `startActivityForResult` 연동(산업용 스캐너·PDA·외부 결제 등). 자세히: [apis/capacitor-plugin-intent/README.md](./apis/capacitor-plugin-intent/README.md)
42
+ - **capacitor-plugin-usb-storage** — Android/Browser 에서 USB Mass Storage 장치 목록·권한·디렉토리/파일 읽기. 자세히: [apis/capacitor-plugin-usb-storage/README.md](./apis/capacitor-plugin-usb-storage/README.md)
43
+ - **core-browser** — 브라우저 전용. `Element`/`HTMLElement` 프로토타입 확장, DOM 탐색·포커스·레이아웃 보정, 클립보드/측정, 파일 다이얼로그·다운로드, 진행률 fetch, IndexedDB 키/값 저장소와 가상 파일시스템. 자세히: [apis/core-browser/README.md](./apis/core-browser/README.md)
44
+ - **core-common** 공통 유틸리티(타입·에러·큐·이벤트·변환·확장 메서드·환경변수). simplysm 모든 패키지의 공용 기반. 자세히: [apis/core-common/README.md](./apis/core-common/README.md)
45
+ - **core-node** — Node 전용 IO/경로/프로세스/감시/consola/worker_threads 래퍼(`fsx`, `pathx`, `cpx`, `FsWatcher`, `setupConsola`, `Worker`/`createWorker`). 자세히: [apis/core-node/README.md](./apis/core-node/README.md)
46
+ - **excel** xlsx 워크북을 열어 셀·시트·스타일·조건부서식·이미지를 읽고 쓰거나, Zod 스키마 기반 레코드 입출력. 자세히: [apis/excel/README.md](./apis/excel/README.md)
47
+ - **lint** — ESLint flat config 작성 시 `@simplysm/lint/eslint-recommended` 프리셋 또는 `@simplysm/lint/eslint-plugin` 개별 규칙 import. 자세히: [apis/lint/README.md](./apis/lint/README.md)
48
+ - **orm-common** — Dialect 독립 ORM 코어. `DbContext` 서브클래싱 + Table/View/Procedure 빌더 + `expr` AST + `Queryable` 체이닝으로 SQL 을 만들고 dialect QueryBuilder 로 렌더. 자세히: [apis/orm-common/README.md](./apis/orm-common/README.md)
49
+ - **orm-node** Node 환경에서 `DbContext` 를 MSSQL/MySQL/PostgreSQL 실 연결에 붙이는 어댑터(`createOrm`), raw SQL/bulk insert (`createDbConn`). 자세히: [apis/orm-node/README.md](./apis/orm-node/README.md)
50
+ - **sd-claude** `.claude/` 자산 배포 및 `sd-claude` CLI 만 제공. 라이브러리 코드 API 없음(npm 배포 전용). 자세히: [apis/sd-claude/README.md](./apis/sd-claude/README.md)
51
+ - **sd-cli** `sd.config.ts` 작성 타입, Vitest 의 Angular AOT plugin(`sdAngularPlugin`), TS 패키지 증분 컴파일 엔진(`SdTsCompiler`). 자세히: [apis/sd-cli/README.md](./apis/sd-cli/README.md)
52
+ - **service-client** `@simplysm/service-server` 와 WebSocket 으로 통신하는 클라이언트. RPC·이벤트 구독·파일 업/다운로드·원격 ORM 실행을 단일 `ServiceClient` 에서 제공(Node/브라우저 공용). 자세히: [apis/service-client/README.md](./apis/service-client/README.md)
53
+ - **service-common** — 서버/클라이언트가 공유하는 서비스 프로토콜·메시지·서비스 인터페이스·앱 구조·이벤트 정의. 자세히: [apis/service-common/README.md](./apis/service-common/README.md)
54
+ - **service-server** Fastify + WebSocket 위에 서비스(`defineService`)·JWT 인증(`auth`)·빌트인 ORM/AutoUpdate/AppStructure·V1 레거시 호환을 부트스트랩(`createServiceServer().listen()`). 자세히: [apis/service-server/README.md](./apis/service-server/README.md)
55
+ - **storage** — FTP/FTPS/SFTP 원격 스토리지에 동일 인터페이스(`StorageClient`)로 파일 읽기/쓰기/관리. 자세히: [apis/storage/README.md](./apis/storage/README.md)
@@ -0,0 +1,95 @@
1
+ # @simplysm/angular
2
+
3
+ Angular 21 기반 클라이언트 UI 라이브러리. 폼/리스트/시트/모달/토스트 등 업무화면 컴포넌트와 부트스트랩 프로바이더를 모두 포함한다. 모든 컴포넌트는 standalone, signal/zoneless 기반.
4
+
5
+ ## 사용 트리거 인덱스
6
+
7
+ - **앱 부트스트랩** — `provideSdAngular`, `SdAngularConfigProvider`, `setupBgTheme`, `SdSystemLogProvider`. 앱 부트스트랩/루트 컴포넌트에서 1회.
8
+ - **테마 (`SdThemeProvider`, `SdThemeSelector`)** — dark/fontSize 토글. `provideSdAngular`가 localStorage 자동 연동.
9
+ - **라우팅/페이지 컨텍스트** — 자세히: [routing.md](./routing.md). `SdRouterLink`, `injectViewTypeSignal`, `setupCanDeactivate` 등.
10
+ - **앱 구조/메뉴/권한** — 자세히: [app-structure.md](./app-structure.md). `SdAppStructureProvider`, `injectPermsSignal`, `SdMenu`.
11
+ - **모달** — 자세히: [modal.md](./modal.md). `SdModalProvider`, `SdModal`, `SdPromptModal`/`SdConfirmModal`, `SdAddressSearchModal`.
12
+ - **토스트** — 자세히: [toast.md](./toast.md). `SdToastProvider`(info/success/warning/danger/notify/try).
13
+ - **버튼류** — 자세히: [buttons.md](./buttons.md). `SdButton`, `SdAnchor`, `SdAdditionalButton`, `SdModalSelectButton`.
14
+ - **입력/폼 컨트롤** — 자세히: [forms.md](./forms.md). `SdForm`, `SdTextfield`/`SdTextarea`/`SdNumpad`/`SdRange`/`SdDateRangePicker`, `SdCheckbox`/`SdSwitch`/`SdCheckboxGroup(Item)`.
15
+ - **드롭다운/셀렉트** — 자세히: [select-dropdown.md](./select-dropdown.md). `SdDropdown(Popup)`, `SdSelect(Item|Button)`.
16
+ - **레이아웃 (사이드바/탑바)** — 자세히: [layout.md](./layout.md). `SdSidebar*`, `SdTopbar*`.
17
+ - **시트(테이블)** — 자세히: [sheet.md](./sheet.md). `SdSheet`, `SdSheetColumn`, `SdSheetColumnCellTemplate`, `SdSheetConfig*`.
18
+ - **CRUD 화면 골격** — 자세히: [crud.md](./crud.md). `SdBaseContainer`, `SdCrudList`, `SdCrudDetail`.
19
+ - **서버 공유 데이터 (`SharedData*` + 선택 컨트롤)** — 자세히: [shared-data.md](./shared-data.md). `SdSharedDataProvider`, `SdSharedDataSelect(Button|List)`, `matchesSearchText`.
20
+ - **선택/확장/정렬 매니저 훅** — 자세히: [selection-managers.md](./selection-managers.md). `useSelectionManager`, `useExpandingManager`, `useSortingManager`.
21
+ - **칸반 보드** — 자세히: [kanban.md](./kanban.md). `SdKanbanBoard`, `SdKanban`, `SdKanbanLane`.
22
+ - **시각 컴포넌트 (라벨/노트/프로그레스/달력/바코드/차트)** — 자세히: [visual.md](./visual.md).
23
+ - **인프라 프로바이더 (서비스 클라이언트/파일 다이얼로그/스토리지/시스템 설정/인쇄)** — 자세히: [infrastructure.md](./infrastructure.md).
24
+ - **`SdBusyContainer` / `SdBusyProvider`** — busy 오버레이. `provideSdAngular`가 라우터 navigation 동안 globalBusyCount 자동 증감.
25
+ - **`SdPermissionTable`** — `SdPermission<TModule>[]` 트리를 `Record<string, boolean>` 모델로 편집하는 권한표.
26
+ - **`SdStatePreset` / `SdStatePresetDef`** — 화면 상태(`state`)를 키별 프리셋으로 저장/복원. `SdSystemConfigProvider` 활용.
27
+ - **`SdTiptapEditor`** — Tiptap 기반 리치 에디터. `value`, `extensions`, `validatorFn`.
28
+ - **유틸 디렉티브/파이프 등** — 인라인 항목 참조.
29
+ - **유틸 타입/함수** — 인라인 항목 참조.
30
+
31
+ ## 앱 부트스트랩
32
+
33
+ ```typescript
34
+ bootstrapApplication(AppComponent, {
35
+ providers: [provideSdAngular({ clientName: "myapp" }), provideRouter(routes)],
36
+ });
37
+ ```
38
+
39
+ - `provideSdAngular({ clientName })`: zoneless CD, NgIcons config, 글로벌 에러 핸들러(`SdGlobalErrorHandlerPlugin`), `SdOptionEventPlugin`(이벤트 `.capture`/`.passive`/`.once`), 테마 dark/fontSize ↔ localStorage 동기화, SwUpdate 폴링, Router navigation 중 `SdBusyProvider.globalBusyCount` 자동 ±1.
40
+ - `SdAngularConfigProvider.clientName`: localStorage 키 prefix·service client name 으로 사용. `provideSdAngular` 옵션에서 설정됨.
41
+ - `SdSystemLogProvider.writeFn?`: severity별 로그 후크 등록(서버 전송 등). 자동으로 console에도 출력.
42
+ - `setupBgTheme({ theme?, lightness? })`: 컴포넌트 constructor 내에서 호출. body `--background-color` CSS 변수 토글, 파괴 시 자동 복원.
43
+
44
+ ## 테마
45
+
46
+ - `SdThemeProvider`: `dark = signal<boolean>`, `fontSize = signal<number>` (presets `[12,14,16,20,24,28]`), `increaseFontSize()`/`decreaseFontSize()`. dark면 body에 `sd-theme-dark` 클래스, fontSize는 html `font-size` 적용. `provideSdAngular`가 localStorage 영속화.
47
+ - `SdThemeSelector`: 토글 UI 컴포넌트.
48
+
49
+ ## SdBusyContainer / SdBusyProvider
50
+
51
+ `<sd-busy-container [busy] [message] [type] [progressPercent]>`. type: `"spinner" | "bar" | "cube"`. `busy=true` 동안 keydown 차단.
52
+ `SdBusyProvider.globalBusyCount = signal(0)`. > 0이면 body 전면 오버레이.
53
+
54
+ ## SdPermissionTable
55
+
56
+ `<sd-permission-table [items] [(value)] [disabled]>`. `items: SdPermission<TModule>[]` (`SdAppStructureUtils.getPermissions` 결과), `value: Record<string, boolean>` (코드.use|edit 형식).
57
+
58
+ ## SdStatePreset
59
+
60
+ `<sd-state-preset [key] [(state)] [size]>`. `state` 를 `SdSystemConfigProvider` 키 `key` 아래 프리셋 배열로 저장/로드. 별 아이콘 클릭 → 이름 입력 모달 → 저장.
61
+
62
+ ## SdTiptapEditor
63
+
64
+ `<sd-tiptap-editor [(value)] [disabled] [readonly] [required] [placeholder] [validatorFn] [extensions]>`. value=HTML string. `extensions?: AnyExtension[]` 으로 Tiptap 확장 주입.
65
+
66
+ ## 유틸 디렉티브/파이프
67
+
68
+ 이벤트·표시 보조용. constructor injection 또는 셀렉터 attach.
69
+
70
+ - `SdOptionEventPlugin`: `(click.capture)`, `(scroll.passive)`, `(touchmove.capture.passive)`, `(transitionend.once)` 등 `.capture/.passive/.once` 변형 이벤트 바인딩 활성화. `provideSdAngular`로 자동 등록.
71
+ - `SdResizeDirective` (`[sdResize]`): RO 기반 size 변화 emit (`{ heightChanged, widthChanged, target, contentRect }`).
72
+ - `SdIntersectionDirective` (`[sdIntersection]`): IO entry emit.
73
+ - `SdEvents`: 다양한 native event의 `.capture`/`.passive`/`.once` output 디렉티브 (예: `(scroll.passive)`, `(touchstart.passive)`).
74
+ - `SdCommandDirective`: `[sdRefreshCommand]`/`[sdSaveCommand]`/`[sdInsertCommand]` — Ctrl+Alt+L/Ctrl+S/Insert 단축키 emit. 최상위 열린 모달 또는 모달이 없을 때만 처리.
75
+ - `SdRipple` (`[sdRipple]="bool"`) / `setupRipple(enableFn?)`: pointerdown 시 원형 ripple.
76
+ - `SdShowEffect` (`[sdShowEffect]="bool"` + `[sdShowEffectType]="'l2r'|'t2b'"`) / `setupRevealOnShow`: viewport intersection 시 fade-in.
77
+ - `SdInvalid` (`[sdInvalid]="msg"`) / `setupInvalid(getMsg)`: hidden input의 customValidity 로 form 검증 + 표시 인디케이터.
78
+ - `SdTypedTemplate` (`<ng-template [typed]>`): template context 타입 추론용 (typeToken).
79
+ - `SdItemOfTemplate` (`<ng-template [itemOf]>`, ctx `{ $implicit, item, index, depth }`) — 컬렉션 컴포넌트 항목 템플릿.
80
+ - `FormatPipe` (`{{ v | format:fmt }}`): `DateTime`/`DateOnly`는 `toFormatString(fmt)`, string은 `X` 자리표시(예: `'XXX-XXXX-XXXX'`).
81
+ - `SdGap`: spacer. `height|width|widthEm` 또는 `heightPx|widthPx`. 단위 키: `xxs|xs|sm|default|lg|xl|xxl`.
82
+ - `SdCollapse [open]` / `SdCollapseIcon`: 접힘.
83
+ - `SdTab [(value)]`/`SdTabItem [value]`: 탭.
84
+ - `SdList`/`SdListItem`: 리스트. `SdListItem` `layout: "accordion"|"flat"`, `selectedIcon`, `contentStyle/Class`.
85
+ - `SdPagination [(currentPage)] [totalPageCount] [visiblePageCount=10]`.
86
+ - `mark(signal)`: array/object signal의 in-place mutation 후 shallow copy로 trigger.
87
+ - `setSafeStyle(renderer, el, partial)`: renderer.setStyle 일괄.
88
+ - `setupModelHook(model, canFn)`: WritableSignal의 set/update를 `canFn(value) -> boolean | Promise<boolean>`로 가로채기. constructor 내에서 호출.
89
+
90
+ ## 유틸 타입/기타
91
+
92
+ - `DirectiveInputSignals<T>`: 컴포넌트의 InputSignal 프로퍼티만 추출(`{ name: T }`). undefined 필드는 optional.
93
+ - `UndefToOptional<T>`: undefined 포함 필드를 optional 로 변환.
94
+ - `WithOptional<T, K>`: 특정 키만 optional 로.
95
+ - `SelectModalOutputResult<TKey> = { selectedKeys: TKey[] }`: 모달 선택 결과.
@@ -0,0 +1,49 @@
1
+ # @simplysm/angular — app-structure
2
+
3
+ 서버의 `AppStructureService`에서 받은 메뉴/권한 트리(`AppStructureItem<TModule>[]`)를 클라이언트 측에서 사용 가능 형태로 변환.
4
+
5
+ ## `SdAppStructureProvider<TModule>`
6
+
7
+ ```typescript
8
+ const sas = inject<SdAppStructureProvider<MyModule>>(SdAppStructureProvider);
9
+ await sas.initialize("main"); // 서비스 키 → AppStructureService.getItems()
10
+ sas.usableModules.set(myModules); // 활성 모듈
11
+ sas.permRecord.set({ "order.list.use": true });
12
+
13
+ sas.usableMenus(); // Signal<SdMenu[]> (트리)
14
+ sas.usableFlatMenus(); // Signal<SdFlatMenu[]> (flat)
15
+ sas.getTitleByFullCode("order.list");
16
+ sas.getPermsByFullCode(["order.list"], ["use","edit"]);
17
+ sas.getPermissionsByStructure(items, codeChain);
18
+ ```
19
+
20
+ 내부적으로 `SdAppStructureUtils.getMenus/getFlatMenus/getPermissions/...` 위임.
21
+
22
+ ## `injectPermsSignal<K>(viewCodes, keys)`
23
+
24
+ ```typescript
25
+ const perms = injectPermsSignal(["order.list"], ["use", "edit"] as const);
26
+ perms(); // 갖고 있는 권한만 필터된 배열
27
+ ```
28
+
29
+ ## 타입
30
+
31
+ ```typescript
32
+ interface SdMenu { title; codeChain: string[]; url?; icon?; children? }
33
+ interface SdFlatMenu { titleChain; codeChain; modulesChain: TModule[][] }
34
+ interface SdPermission { title; codeChain; modules; perms: ("use"|"edit")[]?; children? }
35
+ ```
36
+
37
+ ## `SdAppStructureUtils` 정적 메서드
38
+
39
+ - `getMenus(items, codeChain, usableModules, permRecord)` — `isNotMenu` 제외, 모듈 활성·`.use` 권한 통과한 항목.
40
+ - `getFlatMenus(items, usableModules, permRecord)` — 평탄화 + 부모 modules 누적 검사.
41
+ - `getPermissions(items, codeChain, usableModules)` — 권한 트리 (`SdPermissionTable` 입력용).
42
+ - `getFlatPermissions(items, usableModules)` — `@simplysm/service-common` 재노출.
43
+ - `getTitleByFullCode`, `getItemChainByFullCode`, `getPermsByFullCode`.
44
+
45
+ ## 주의
46
+
47
+ - `permRecord` 키는 `"<code>.<perm>"` (예: `"order.list.use"`).
48
+ - 그룹 메뉴는 자식 중 하나라도 표시 가능해야 노출.
49
+ - Leaf 가 `perms`를 가지면 `.use` 권한 필수, `perms`가 없거나 권한 자체가 없으면 통과.
@@ -0,0 +1,42 @@
1
+ # @simplysm/angular — buttons
2
+
3
+ ## `<sd-button>`
4
+
5
+ `type: "button"|"submit" = "button"`, `theme`(`primary|secondary|info|success|warning|danger|gray|blue-gray|link|link-<theme>|link-rev`), `inline`, `inset`, `size: "sm"|"lg"`, `disabled`, `buttonStyle`, `buttonClass`. content projection.
6
+
7
+ ```html
8
+ <sd-button [theme]="'primary'" (click)="save()">저장</sd-button>
9
+ ```
10
+
11
+ ## `<sd-anchor>`
12
+
13
+ 링크형 클릭 요소. `disabled`, `theme`(`primary|secondary|...|blue-gray`, default `primary`). tabindex 자동.
14
+
15
+ ```html
16
+ <sd-anchor [theme]="'danger'" (click)="del()">삭제</sd-anchor>
17
+ ```
18
+
19
+ ## `<sd-additional-button>`
20
+
21
+ 본문 + 우측 부가 버튼 슬롯. `size`.
22
+
23
+ ## `<sd-modal-select-button>`
24
+
25
+ 검색 모달을 띄워 값을 선택받는 입력 위젯. `setupInvalid` 로 required 검증 내장.
26
+
27
+ ```html
28
+ <sd-modal-select-button
29
+ [modal]="orderSelectModalInfo" <!-- SdSelectModalInfo<SdSelectModal<TKey>> -->
30
+ [(value)]="selectedKey" <!-- single 모드: TKey | multi 모드: TKey[] -->
31
+ [selectMode]="'single'"
32
+ [modalOptions]="{ resizable: true }"
33
+ [required]="true"
34
+ [disabled]="false"
35
+ [searchIcon]="customIcon">
36
+ {{ displayLabel() }}
37
+ </sd-modal-select-button>
38
+ ```
39
+
40
+ - `SdSelectModal<TKey>` = `SdModalContentDef<SelectModalOutputResult<TKey>>` + `selectMode: InputSignal<"single"|"multi"|undefined>` + `selectedKeys: InputSignal<TKey[]>`.
41
+ - `SdSelectModalInfo<T>` = `SdModalInfo<T, "selectMode"|"selectedKeys">`.
42
+ - erase 아이콘 클릭 시 `value` 초기화(`undefined` 또는 `[]`).
@@ -0,0 +1,35 @@
1
+ # @simplysm/angular — crud
2
+
3
+ CRUD 화면 골격. 상단 명령바·필터·toolbar·페이지 페이저·시트를 갖춘 리스트 화면(`SdCrudList`)과 디테일 화면(`SdCrudDetail`)과 공통 컨테이너(`SdBaseContainer`).
4
+
5
+ ## `<sd-base-container>`
6
+
7
+ 페이지/모달 공통 컨테이너. `SdSharedDataProvider.wait()` 완료까지 busy 표시 후 `ready=true`.
8
+
9
+ inputs: `viewType: SdViewType` (required), `restricted`, `initialized`. models: `ready`, `busyCount`. content templates: `#topbarTpl`, `#commandTpl`, `#contentTpl`, `#bottomCommandTpl`.
10
+
11
+ ```html
12
+ <sd-base-container [viewType]="vt">
13
+ <ng-template #commandTpl>...</ng-template>
14
+ <ng-template #contentTpl>...</ng-template>
15
+ </sd-base-container>
16
+ ```
17
+
18
+ ## `<sd-crud-list<TItem, TKey>>`
19
+
20
+ 리스트+페이지+선택+삭제/복원 골격.
21
+
22
+ - 필수 input: `viewType`, `key`, `trackByFn: (TItem) => TKey`.
23
+ - inputs: `selectMode: "single"|"multi"`, `items`, `currDeletedItems`, `totalPageCount`, `itemsPerPage`, `visiblePageCount=10`, `readonly`, `restricted`, `initialized`.
24
+ - models: `ready`, `busyCount`, `selectedKeys: NonNullable<TKey>[]`, `currentPage`, `sorts: SortingDef[]`.
25
+ - outputs: `filterSubmit`, `submit`, `create`, `delete: TItem[]`, `restore: TItem[]`.
26
+ - content templates: `#commandTpl`, `#filterTpl`, `#toolTpl`, `#bottomCommandTpl` + `<sd-sheet-column>` 자식들이 자동으로 sheet 에 전달.
27
+ - 삭제된 아이템은 `text-decoration: line-through`.
28
+ - 모달 컨텍스트면 confirm/cancel 핸들러 자동 (`onModalSelectionConfirmClick`/`onModalSelectionCancelClick`).
29
+
30
+ ## `<sd-crud-detail>`
31
+
32
+ 단일 레코드 편집.
33
+
34
+ - 필수: `viewType`. inputs: `restricted`, `readonly`, `initialized`. models: `ready`, `busyCount`. output: `submit`. templates: `#commandTpl`, `#contentTpl`, `#bottomCommandTpl`.
35
+ - 저장 버튼 → 내부 `SdForm.requestSubmit()`.
@@ -0,0 +1,63 @@
1
+ # @simplysm/angular — forms
2
+
3
+ 폼 컨테이너 + 입력 컨트롤. 모든 컨트롤은 `value` model 기반. native form validity API 사용 (`SdForm`이 submit 시 reportValidity 호출).
4
+
5
+ ## `<sd-form>`
6
+
7
+ ```html
8
+ <sd-form (formSubmit)="onSubmit($event)" (formInvalid)="onInvalid()">
9
+ <sd-textfield [type]="'text'" [(value)]="name" [required]="true" />
10
+ <sd-button [type]="'submit'">저장</sd-button>
11
+ </sd-form>
12
+ ```
13
+
14
+ - 내부에 hidden submit 버튼 자동 삽입(Enter 키 submit 지원).
15
+ - `requestSubmit()` 메서드 노출.
16
+ - invalid 시 reportValidity → `formInvalid` emit.
17
+
18
+ ## `<sd-textfield<K>>`
19
+
20
+ ```html
21
+ <sd-textfield [type]="'number'" [(value)]="qty" [min]="0" [max]="999" [step]="1" />
22
+ <sd-textfield [type]="'date'" [(value)]="dt" />
23
+ <sd-textfield [type]="'format'" [format]="'XXX-XXXX-XXXX'" [(value)]="phone" />
24
+ ```
25
+
26
+ `SdTextfieldTypes`: `number→number`, `text|password|color|email|format→string`, `date|month|year→DateOnly`, `datetime|datetime-sec→DateTime`, `time|time-sec→Time`. `sdTextfieldTypes` 배열로 키 목록 enum.
27
+
28
+ 주요 input: `value` (model), `type` (required), `placeholder`, `title`, `inputStyle/Class`, `disabled/readonly/required` (booleanAttribute), `min/max/minlength/maxlength`, `pattern`, `validatorFn(value) => string | undefined` (커스텀 메시지), `format`, `step`, `autocomplete`, `minDigits`, `size`, `theme`.
29
+
30
+ ## `<sd-textarea>`
31
+
32
+ `[(value)]: string`, `placeholder`, `title`, `minRows=1`, `size`, `validatorFn`, `theme`, `inputStyle/Class`.
33
+
34
+ ## `<sd-numpad>`
35
+
36
+ 숫자 키패드. `[(value)]: number`, `placeholder`.
37
+
38
+ ## `<sd-range<K>>`
39
+
40
+ `type: K` (TextfieldTypes 키), `[(from)]`, `[(to)]: SdTextfieldTypes[K]`, `inputStyle`.
41
+
42
+ ## `<sd-date-range-picker>`
43
+
44
+ `[(periodType)]: "일"|"월"|"범위" = "범위"`, `[(from)]: DateOnly`, `[(to)]: DateOnly`.
45
+
46
+ ## `<sd-checkbox>` / `<sd-switch>`
47
+
48
+ ```html
49
+ <sd-checkbox [(value)]="agreed" [theme]="'primary'">동의</sd-checkbox>
50
+ <sd-switch [(value)]="enabled" [size]="'sm'" />
51
+ ```
52
+
53
+ `value: boolean` (model), `canChangeFn(value) => boolean | Promise<boolean>` — false 면 변경 차단. `radio` (checkbox만), `disabled`, `size`, `inline`, `inset`, `theme`, `contentStyle` (checkbox).
54
+
55
+ ## `<sd-checkbox-group<T>>` / `<sd-checkbox-group-item<T>>`
56
+
57
+ `<sd-checkbox-group [(value)]="selected"> <sd-checkbox-group-item [value]="opt">{{opt}}</sd-checkbox-group-item> ... </sd-checkbox-group>`. value: `T[]` (다중).
58
+
59
+ ## 검증
60
+
61
+ - 컨트롤 내부에서 `setupInvalid(getMessage)` 사용 (cf. directives). 빈 문자열이면 valid.
62
+ - `validatorFn` 은 컨트롤 입력값을 검사해 메시지 반환.
63
+ - `SdForm` submit 시 자동으로 reportValidity 호출 + invalid 인디케이터 표시.
@@ -0,0 +1,80 @@
1
+ # @simplysm/angular — infrastructure
2
+
3
+ 앱 인프라 프로바이더(전부 `providedIn: "root"` 또는 single instance).
4
+
5
+ ## `SdServiceClientFactoryProvider`
6
+
7
+ `@simplysm/service-client` 의 `ServiceClient` 를 키별로 보관.
8
+
9
+ ```typescript
10
+ const factory = inject(SdServiceClientFactoryProvider);
11
+ await factory.connectAsync("main", { host, port, ssl }); // 옵션 생략 시 location 기반
12
+ const client = factory.get("main");
13
+ await factory.closeAsync("main");
14
+ ```
15
+
16
+ - 같은 키 재연결 금지(`이미 연결된`/`이미 연결이 끊긴`). 한 번 close된 키는 재사용 불가.
17
+ - request/response progress → `SdToastProvider.info(message, true)` 로 진행률 토스트 자동.
18
+ - destroy 시 모든 클라이언트 close.
19
+
20
+ ## `SdFileDialogProvider`
21
+
22
+ ```typescript
23
+ const file = await inject(SdFileDialogProvider).showAsync();
24
+ const files = await inject(SdFileDialogProvider).showAsync(true, "image/*");
25
+ ```
26
+
27
+ cancel/empty → `undefined`. 동적 `<input type=file>` 생성/제거.
28
+
29
+ ## `SdLocalStorageProvider<T>`
30
+
31
+ ```typescript
32
+ const ls = inject<SdLocalStorageProvider<Schema>>(SdLocalStorageProvider);
33
+ ls.set("theme", "dark");
34
+ const v = ls.get("theme");
35
+ ls.remove("theme");
36
+ ```
37
+
38
+ 키는 `<clientName>.<key>` 로 prefix. JSON 직렬화.
39
+
40
+ ## `SdSystemConfigProvider<T>`
41
+
42
+ ```typescript
43
+ const cfg = inject<SdSystemConfigProvider<Schema>>(SdSystemConfigProvider);
44
+ cfg.fn = { set: (k, v) => svc.set(k, v), get: (k) => svc.get(k) }; // 옵션: 서버 연동
45
+ await cfg.setAsync("sheet.order", config);
46
+ const v = await cfg.getAsync("sheet.order");
47
+ ```
48
+
49
+ `fn` 미설정이면 `SdLocalStorageProvider` 폴백. SdSheet/SdModal/SdStatePreset 등이 자동 사용.
50
+
51
+ ## `injectSdSystemConfigResource<T>({ key })`
52
+
53
+ ```typescript
54
+ const r = injectSdSystemConfigResource<MyConfig>({ key: keySignal });
55
+ r.value(); r.isLoading(); r.status();
56
+ r.set(v); r.update((prev) => ...); r.reload(); r.hasValue();
57
+ ```
58
+
59
+ 키는 `<elementTagName>.<key()>` 로 prefix. set 호출 시 화면 즉시 갱신 + queueMicrotask 로 비동기 영속화 (실패 시 ErrorHandler).
60
+
61
+ ## `SdGlobalErrorHandlerPlugin`
62
+
63
+ `provideSdAngular`가 `ErrorHandler` 로 등록. 처리되지 않은 Error/PromiseRejectionEvent/ErrorEvent 캐치 → `SdSystemLogProvider.writeAsync("error", ...)` + 전면 오버레이 + ApplicationRef destroy. 클릭 시 reload(prod는 hash `/` 로 리셋).
64
+
65
+ ## `SdOptionEventPlugin`
66
+
67
+ `provideSdAngular`가 `EVENT_MANAGER_PLUGINS` 로 등록. 이벤트명에 `.capture` / `.passive` / `.once` 접미 허용 (예: `(scroll.passive)`, `(click.capture.once)`).
68
+
69
+ ## `SdPrintProvider`
70
+
71
+ ```typescript
72
+ await print.printAsync({ type: MyTpl, inputs: { ... } }, { size: "A4", margin: "0" });
73
+ const bytes = await print.getPdfBufferAsync({ type, inputs }, { orientation: "portrait", pageSize: "a4" });
74
+ ```
75
+
76
+ - 템플릿 컴포넌트는 `SdPrint` 구현 필요 (`initialized: Signal<boolean>`, optional `_optionalPrintInputs`).
77
+ - `SdPrintInput<T, X>` = `{ type; inputs: WithOptional<DirectiveInputSignals<T> 제외..., optional 키들> }`.
78
+ - print: `@page` + `@media print` 스타일 임시 주입 → `initialized=true` 및 이미지 로드 대기 → `window.print()`.
79
+ - PDF: `.page` 자식이 있으면 페이지별, 없으면 단일 페이지. `htmlToImage.toCanvas` (pixelRatio=4) → `jspdf.addImage`.
80
+ - 두 메서드 모두 진행 동안 `SdBusyProvider.globalBusyCount` ±1.
@@ -0,0 +1,33 @@
1
+ # @simplysm/angular — kanban
2
+
3
+ 드래그·드롭 칸반 보드.
4
+
5
+ ```html
6
+ <sd-kanban-board [(selectedValues)]="selected" (drop)="onDrop($event)">
7
+ <sd-kanban-lane [value]="laneA" [busy]="loading">
8
+ <sd-kanban [value]="card" [draggable]="true" [selectable]="true">{{ card.title }}</sd-kanban>
9
+ </sd-kanban-lane>
10
+ </sd-kanban-board>
11
+ ```
12
+
13
+ ## `<sd-kanban-board<L, T>>`
14
+
15
+ - `selectedValues = model<T[]>([])`.
16
+ - `drop = output<SdKanbanBoardDropInfo<L, T>>` (`{ sourceKanbanValue?, targetLaneValue?, targetKanbanValue? }`).
17
+ - `dragKanban = signal<SdKanbanDragRef | undefined>` — 자식이 드래그 시작 시 설정.
18
+
19
+ ## `<sd-kanban-lane<L, T>>`
20
+
21
+ `value: L`, `busy`, `useCollapse`, `collapse` (model). drop target 구현.
22
+
23
+ ## `<sd-kanban<L, T>>`
24
+
25
+ `value: T`, `draggable`, `selectable`, `contentClass`. drag ref + drop target 둘 다 구현(카드 위에 드롭 가능).
26
+
27
+ ## 타입
28
+
29
+ ```typescript
30
+ interface SdKanbanBoardDropInfo<L, T> { sourceKanbanValue?: T; targetLaneValue?: L; targetKanbanValue?: T }
31
+ interface SdKanbanDragRef<_L, T> { value(): T | undefined; heightOnDrag(): number }
32
+ interface SdKanbanDropTarget<L, T> { targetLaneValue(): L | undefined; targetKanbanValue?(): T | undefined }
33
+ ```
@@ -0,0 +1,41 @@
1
+ # @simplysm/angular — layout
2
+
3
+ ## 사이드바
4
+
5
+ ```html
6
+ <sd-sidebar-container>
7
+ <sd-sidebar>
8
+ <sd-sidebar-user [userMenu]="userMenu">유저영역</sd-sidebar-user>
9
+ <sd-sidebar-menu [menus]="menus" [layout]="'accordion'" [getMenuIsSelectedFn]="isSel" />
10
+ </sd-sidebar>
11
+ <ng-content />
12
+ </sd-sidebar-container>
13
+ ```
14
+
15
+ - `SdSidebarContainer`: `toggle = signal(false)`. Router NavigationStart 시 자동 false.
16
+ - `SdSidebar`: 부모 container의 toggle 추종.
17
+ - `SdSidebarMenu`: `menus: SdMenu[]`, `layout: "accordion"|"flat"`, `getMenuIsSelectedFn?`.
18
+ - `SdSidebarUser`: `userMenu?: SdSidebarUserMenu`.
19
+
20
+ ```typescript
21
+ interface SdSidebarUserMenu { /* see source */ }
22
+ ```
23
+
24
+ ## 탑바
25
+
26
+ ```html
27
+ <sd-topbar-container>
28
+ <sd-topbar [sidebarContainer]="sc">
29
+ <sd-topbar-menu [menus]="menus" />
30
+ <sd-topbar-user [menus]="userMenus" />
31
+ </sd-topbar>
32
+ </sd-topbar-container>
33
+ ```
34
+
35
+ - `SdTopbar`: `sidebarContainer?: SdSidebarContainer` 입력(미지정 시 inject 시도). 햄버거 버튼이 `sc.toggle` 토글.
36
+ - `SdTopbarMenu`: `menus: SdMenu[]`, `getMenuIsSelectedFn?`.
37
+ - `SdTopbarUser`: `menus: SdTopbarUserMenu[]` (required).
38
+
39
+ ## 메뉴 데이터
40
+
41
+ `SdMenu` (`./app-structure.md` 참조)을 그대로 입력. 선택 상태는 `getIsMenuSelected(menu, fullPageCode, customFn?)` 또는 `getMenuIsSelectedFn` 으로.