@simplysm/sd-claude 14.0.50 → 14.0.52

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 (318) hide show
  1. package/claude/references/sd-frontend-design.md +10 -9
  2. package/claude/references/sd-simplysm-v14/angular/README.md +497 -0
  3. package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +37 -0
  4. package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +16 -0
  5. package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +27 -0
  6. package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +25 -0
  7. package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +36 -0
  8. package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +24 -0
  9. package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +42 -0
  10. package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +23 -0
  11. package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +38 -0
  12. package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +18 -0
  13. package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +69 -0
  14. package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +50 -0
  15. package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +20 -0
  16. package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +158 -0
  17. package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +26 -0
  18. package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +41 -0
  19. package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +23 -0
  20. package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +34 -0
  21. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +65 -0
  22. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +148 -0
  23. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +73 -0
  24. package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +59 -0
  25. package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +34 -0
  26. package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +81 -0
  27. package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +18 -0
  28. package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +40 -0
  29. package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +20 -0
  30. package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +67 -0
  31. package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +18 -0
  32. package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +25 -0
  33. package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +43 -0
  34. package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +64 -0
  35. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +46 -0
  36. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +18 -0
  37. package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +38 -0
  38. package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +65 -0
  39. package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +336 -0
  40. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +191 -0
  41. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +103 -0
  42. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +198 -0
  43. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +109 -0
  44. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +87 -0
  45. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +202 -0
  46. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +280 -0
  47. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +386 -0
  48. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +215 -0
  49. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +64 -0
  50. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +193 -0
  51. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +140 -0
  52. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +123 -0
  53. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +145 -0
  54. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +377 -0
  55. package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +368 -0
  56. package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +238 -0
  57. package/claude/references/sd-simplysm-v14/angular/styling/classes.md +149 -0
  58. package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +100 -0
  59. package/claude/references/sd-simplysm-v14/angular/styling/themes.md +35 -0
  60. package/claude/references/sd-simplysm-v14/angular/styling/variables.md +147 -0
  61. package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +232 -0
  62. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +37 -0
  63. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +212 -0
  64. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +26 -0
  65. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +31 -0
  66. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +103 -0
  67. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +39 -0
  68. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +81 -0
  69. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +27 -0
  70. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +89 -0
  71. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +54 -0
  72. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +26 -0
  73. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +26 -0
  74. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +68 -0
  75. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +52 -0
  76. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +37 -0
  77. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +27 -0
  78. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +33 -0
  79. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +145 -0
  80. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +64 -0
  81. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +37 -0
  82. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +26 -0
  83. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +96 -0
  84. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +34 -0
  85. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +29 -0
  86. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +35 -0
  87. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +26 -0
  88. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +49 -0
  89. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +22 -0
  90. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +43 -0
  91. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +51 -0
  92. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +97 -0
  93. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +23 -0
  94. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +38 -0
  95. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +30 -0
  96. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +69 -0
  97. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +30 -0
  98. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +40 -0
  99. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +34 -0
  100. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +30 -0
  101. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +35 -0
  102. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +36 -0
  103. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +34 -0
  104. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +32 -0
  105. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +24 -0
  106. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +23 -0
  107. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +23 -0
  108. package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +161 -0
  109. package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +35 -0
  110. package/claude/references/sd-simplysm-v14/angular/utils/mark.md +43 -0
  111. package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +96 -0
  112. package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +19 -0
  113. package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +93 -0
  114. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +38 -0
  115. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +115 -0
  116. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +113 -0
  117. package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +197 -0
  118. package/claude/references/sd-simplysm-v14/capacitor-plugin-intent/README.md +235 -0
  119. package/claude/references/sd-simplysm-v14/capacitor-plugin-usb-storage/README.md +251 -0
  120. package/claude/references/sd-simplysm-v14/core-browser/README.md +52 -0
  121. package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +59 -0
  122. package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +137 -0
  123. package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +84 -0
  124. package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +59 -0
  125. package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +91 -0
  126. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +131 -0
  127. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +121 -0
  128. package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +60 -0
  129. package/claude/references/sd-simplysm-v14/core-common/README.md +179 -0
  130. package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +26 -0
  131. package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +33 -0
  132. package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +38 -0
  133. package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +36 -0
  134. package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +125 -0
  135. package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +43 -0
  136. package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +35 -0
  137. package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +48 -0
  138. package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +52 -0
  139. package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +44 -0
  140. package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +100 -0
  141. package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +42 -0
  142. package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +86 -0
  143. package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +106 -0
  144. package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +59 -0
  145. package/claude/references/sd-simplysm-v14/core-common/types/time.md +62 -0
  146. package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +41 -0
  147. package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +36 -0
  148. package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +60 -0
  149. package/claude/references/sd-simplysm-v14/core-common/utils/err.md +26 -0
  150. package/claude/references/sd-simplysm-v14/core-common/utils/json.md +58 -0
  151. package/claude/references/sd-simplysm-v14/core-common/utils/num.md +56 -0
  152. package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +107 -0
  153. package/claude/references/sd-simplysm-v14/core-common/utils/path.md +30 -0
  154. package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +28 -0
  155. package/claude/references/sd-simplysm-v14/core-common/utils/str.md +63 -0
  156. package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +49 -0
  157. package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +35 -0
  158. package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +35 -0
  159. package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +49 -0
  160. package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +77 -0
  161. package/claude/references/sd-simplysm-v14/core-node/README.md +59 -0
  162. package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +110 -0
  163. package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +78 -0
  164. package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +38 -0
  165. package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +77 -0
  166. package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +128 -0
  167. package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +168 -0
  168. package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +73 -0
  169. package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +85 -0
  170. package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +160 -0
  171. package/claude/references/sd-simplysm-v14/excel/README.md +66 -0
  172. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +79 -0
  173. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +36 -0
  174. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +34 -0
  175. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +93 -0
  176. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +147 -0
  177. package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +33 -0
  178. package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +57 -0
  179. package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +28 -0
  180. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +23 -0
  181. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +29 -0
  182. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +39 -0
  183. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +42 -0
  184. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +97 -0
  185. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +22 -0
  186. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +68 -0
  187. package/claude/references/sd-simplysm-v14/excel/types/excel-xml.md +15 -0
  188. package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +101 -0
  189. package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +108 -0
  190. package/claude/references/sd-simplysm-v14/lint/README.md +183 -0
  191. package/claude/references/sd-simplysm-v14/orm-common/README.md +156 -0
  192. package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +208 -0
  193. package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +64 -0
  194. package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +62 -0
  195. package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +198 -0
  196. package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +37 -0
  197. package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +80 -0
  198. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +54 -0
  199. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +75 -0
  200. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +238 -0
  201. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +63 -0
  202. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +137 -0
  203. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +54 -0
  204. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +67 -0
  205. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +95 -0
  206. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +71 -0
  207. package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +146 -0
  208. package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +151 -0
  209. package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +175 -0
  210. package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +58 -0
  211. package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +224 -0
  212. package/claude/references/sd-simplysm-v14/orm-node/README.md +65 -0
  213. package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +85 -0
  214. package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +83 -0
  215. package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +86 -0
  216. package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +62 -0
  217. package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +107 -0
  218. package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +50 -0
  219. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +91 -0
  220. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +33 -0
  221. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +60 -0
  222. package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +17 -0
  223. package/{README.md → claude/references/sd-simplysm-v14/sd-claude/README.md} +85 -84
  224. package/{docs → claude/references/sd-simplysm-v14/sd-claude}/assets.md +2 -2
  225. package/{docs → claude/references/sd-simplysm-v14/sd-claude}/hooks.md +15 -1
  226. package/claude/references/sd-simplysm-v14/sd-cli/README.md +138 -0
  227. package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +60 -0
  228. package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +31 -0
  229. package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +27 -0
  230. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +19 -0
  231. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +21 -0
  232. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +109 -0
  233. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +33 -0
  234. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +78 -0
  235. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +27 -0
  236. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +18 -0
  237. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +19 -0
  238. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +72 -0
  239. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +41 -0
  240. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +19 -0
  241. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +32 -0
  242. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +19 -0
  243. package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +158 -0
  244. package/claude/references/sd-simplysm-v14/service-client/README.md +74 -0
  245. package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +93 -0
  246. package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +63 -0
  247. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +89 -0
  248. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +31 -0
  249. package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +206 -0
  250. package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +64 -0
  251. package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +68 -0
  252. package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +100 -0
  253. package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +7 -0
  254. package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +47 -0
  255. package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +21 -0
  256. package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +22 -0
  257. package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +39 -0
  258. package/claude/references/sd-simplysm-v14/service-common/README.md +161 -0
  259. package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +107 -0
  260. package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +57 -0
  261. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +23 -0
  262. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +42 -0
  263. package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +68 -0
  264. package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +93 -0
  265. package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +21 -0
  266. package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +23 -0
  267. package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +17 -0
  268. package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +21 -0
  269. package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +29 -0
  270. package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +21 -0
  271. package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +19 -0
  272. package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +52 -0
  273. package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +21 -0
  274. package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +19 -0
  275. package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +17 -0
  276. package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +17 -0
  277. package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +15 -0
  278. package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +20 -0
  279. package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +61 -0
  280. package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +19 -0
  281. package/claude/references/sd-simplysm-v14/service-server/README.md +162 -0
  282. package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +18 -0
  283. package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +30 -0
  284. package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +35 -0
  285. package/claude/references/sd-simplysm-v14/service-server/core/auth.md +64 -0
  286. package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +81 -0
  287. package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +43 -0
  288. package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +79 -0
  289. package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +25 -0
  290. package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +32 -0
  291. package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +113 -0
  292. package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +35 -0
  293. package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +59 -0
  294. package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +34 -0
  295. package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +43 -0
  296. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +33 -0
  297. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +29 -0
  298. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +33 -0
  299. package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +64 -0
  300. package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +57 -0
  301. package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +36 -0
  302. package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +29 -0
  303. package/claude/references/sd-simplysm-v14/storage/README.md +99 -0
  304. package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +99 -0
  305. package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +108 -0
  306. package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +114 -0
  307. package/claude/references/sd-simplysm-v14/storage/types/file-info.md +32 -0
  308. package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +55 -0
  309. package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +34 -0
  310. package/claude/rules/sd-claude-rules.md +8 -8
  311. package/claude/rules/sd-simplysm-v14.md +33 -0
  312. package/claude/skills/sd-claude-docs/SKILL.md +41 -24
  313. package/claude/skills/sd-claude-docs/references/package-docs.md +240 -116
  314. package/claude/skills/sd-inner-debug/SKILL.md +1 -1
  315. package/claude/skills/sd-inner-review/SKILL.md +4 -2
  316. package/package.json +2 -3
  317. /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/cli.md +0 -0
  318. /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/scripts.md +0 -0
@@ -0,0 +1,110 @@
1
+ # FsWatcher
2
+
3
+ Chokidar 기반 파일 시스템 감시 래퍼. 짧은 시간 내에 발생하는 이벤트를 병합하여 콜백을 한 번만 호출한다.
4
+ EPERM 에러 발생 시 최대 3회까지 watcher를 자동 재시작한다.
5
+
6
+ ## When to use
7
+
8
+ - ✅ 파일/디렉토리 변경을 지속적으로 감시하고, 짧은 시간 내 연속 이벤트를 하나로 병합해야 할 때
9
+ - ✅ glob 패턴으로 특정 파일만 감시하면서 이벤트 디바운싱이 필요할 때
10
+ - ❌ 단발성 파일 변경 확인 → `fsx.stat`으로 mtime 비교
11
+
12
+ ```typescript
13
+ export class FsWatcher {
14
+ static async watch(paths: string[], options?: chokidar.ChokidarOptions): Promise<FsWatcher>
15
+ onChange(opt: { delay?: number }, cb: (changeInfos: FsWatcherChangeInfo[]) => void | Promise<void>): this
16
+ async close(): Promise<void>
17
+ }
18
+ ```
19
+
20
+ ## Members
21
+
22
+ | Member | Kind | Type | Description |
23
+ |--------|------|------|-------------|
24
+ | `watch` | static method | `(paths: string[], options?: ChokidarOptions) => Promise<FsWatcher>` | 파일 감시 시작. `ready` 이벤트까지 대기 후 반환 |
25
+ | `onChange` | method | `(opt: { delay?: number }, cb: ...) => this` | 파일 변경 이벤트 핸들러 등록 |
26
+ | `close` | method | `() => Promise<void>` | 파일 감시자 종료 |
27
+
28
+ ## `ignoreInitial` 주의
29
+
30
+ chokidar의 `ignoreInitial` 옵션은 내부적으로 항상 `true`로 설정된다.
31
+ `options.ignoreInitial: false`를 전달하면 첫 번째 `onChange` 호출 시 빈 배열로 콜백이 호출되지만, 실제 초기 파일 목록은 포함되지 않는다. 이는 이벤트 병합 로직과의 충돌을 방지하기 위한 의도적인 동작이다.
32
+
33
+ ## Related Types
34
+
35
+ ### `FsWatcherEvent`
36
+
37
+ ```typescript
38
+ export type FsWatcherEvent = "add" | "addDir" | "change" | "unlink" | "unlinkDir";
39
+ ```
40
+
41
+ 지원되는 파일 변경 이벤트 타입.
42
+
43
+ ### `FsWatcherChangeInfo`
44
+
45
+ ```typescript
46
+ export interface FsWatcherChangeInfo {
47
+ event: FsWatcherEvent;
48
+ path: PosixPath;
49
+ }
50
+ ```
51
+
52
+ | Field | Type | Description |
53
+ |-------|------|-------------|
54
+ | `event` | `FsWatcherEvent` | 변경 이벤트 타입 |
55
+ | `path` | [`PosixPath`](../utils/pathx.md#posixpath) | 변경된 파일/디렉토리 경로 (정규화됨) |
56
+
57
+ ## 이벤트 병합 전략
58
+
59
+ 같은 파일에 대해 `delay` 시간 내에 여러 이벤트가 발생하면 최종 상태만 전달된다:
60
+
61
+ | 이전 이벤트 | 신규 이벤트 | 결과 |
62
+ |------------|------------|------|
63
+ | `add` | `change` | `add` (생성 직후 수정 → 생성) |
64
+ | `add` | `unlink` | 제거 (생성 직후 삭제 → 변경 없음) |
65
+ | `addDir` | `unlinkDir` | 제거 (생성 직후 삭제 → 변경 없음) |
66
+ | `unlink` | `add` | `add` (삭제 후 재생성 → 생성) |
67
+ | `unlink` | `change` | `change` |
68
+ | `unlinkDir` | `addDir` | `addDir` (디렉토리 재생성) |
69
+ | 그 외 | — | 최신 이벤트로 덮어쓰기 |
70
+
71
+ ## Glob 패턴 처리
72
+
73
+ glob 패턴이 포함된 경로(`*`, `?`, `{`, `[`, `]`)는 glob base 디렉토리를 감시하고, Minimatch로 이벤트를 필터링한다.
74
+
75
+ ## Usage
76
+
77
+ ```typescript
78
+ import { FsWatcher } from "@simplysm/core-node";
79
+
80
+ const watcher = await FsWatcher.watch(["src/**/*.ts"]);
81
+
82
+ watcher.onChange({ delay: 300 }, (changes) => {
83
+ for (const { event, path } of changes) {
84
+ // event: "add" | "addDir" | "change" | "unlink" | "unlinkDir"
85
+ // path: PosixPath
86
+ }
87
+ });
88
+
89
+ // 종료
90
+ await watcher.close();
91
+ ```
92
+
93
+ ## 🚫 Anti-patterns
94
+
95
+ ### close() 누락
96
+
97
+ ```typescript
98
+ // ❌ close하지 않으면 프로세스가 종료되지 않음
99
+ const watcher = await FsWatcher.watch(["src/**/*.ts"]);
100
+ watcher.onChange({ delay: 300 }, handler);
101
+ // 프로세스 행
102
+
103
+ // ✅ 작업 완료 후 반드시 close
104
+ const watcher = await FsWatcher.watch(["src/**/*.ts"]);
105
+ watcher.onChange({ delay: 300 }, handler);
106
+ // ... 작업 완료 후
107
+ await watcher.close();
108
+ ```
109
+
110
+ **근거**: chokidar watcher는 persistent 모드로 동작하여 close하지 않으면 프로세스가 종료되지 않는다.
@@ -0,0 +1,78 @@
1
+ # createFileReporter
2
+
3
+ 파일 기반 consola reporter를 생성한다. `.logs/` 디렉토리에 `app.YYYY-MM-DD.log` 형식으로 JSON 라인을 기록하며, 날짜별 로테이션과 크기 제한을 지원한다.
4
+
5
+ ## When to use
6
+
7
+ - ✅ 로그를 파일로 영구 보관하고, 날짜별 로테이션/크기 제한이 필요할 때
8
+ - ❌ 터미널 출력용 → [`PrettyReporter`](./pretty-reporter.md) 사용
9
+ - ❌ 환경별 자동 구성 → [`setupConsola`](./setup-consola.md) 사용
10
+
11
+ ```typescript
12
+ export function createFileReporter(options?: FileReporterOptions): ConsolaReporter
13
+ ```
14
+
15
+ ## Parameters
16
+
17
+ | Param | Type | Description |
18
+ |-------|------|-------------|
19
+ | `options` | `FileReporterOptions` (optional) | 파일 reporter 옵션 |
20
+
21
+ ## Returns
22
+
23
+ `ConsolaReporter` — consola reporter 인터페이스 구현체
24
+
25
+ ## Related Types
26
+
27
+ ### `FileReporterOptions`
28
+
29
+ ```typescript
30
+ export interface FileReporterOptions {
31
+ /** @default 20MB */
32
+ maxSize?: number;
33
+ /** @default 14 */
34
+ maxDays?: number;
35
+ }
36
+ ```
37
+
38
+ | Field | Type | Default | Description |
39
+ |-------|------|---------|-------------|
40
+ | `maxSize` | `number` (optional) | `20 * 1024 * 1024` (20MB) | 파일 1개의 최대 크기(bytes). 초과 시 `app.YYYY-MM-DD.N.log`로 순번 파일 생성 |
41
+ | `maxDays` | `number` (optional) | `14` | 보관할 최대 일수. 날짜가 바뀔 때 이전 파일을 정리 |
42
+
43
+ ## 로그 파일 형식
44
+
45
+ 각 라인은 JSON 객체:
46
+
47
+ ```json
48
+ {"time":"2024-01-15T10:30:00.000Z","level":"INFO","msg":"서버 시작"}
49
+ {"time":"2024-01-15T10:30:01.000Z","level":"ERROR","tag":"db","err":{"message":"연결 실패","stack":"Error: ..."}}
50
+ ```
51
+
52
+ | 필드 | 설명 |
53
+ |------|------|
54
+ | `time` | ISO 8601 타임스탬프 |
55
+ | `level` | 로그 타입 대문자 (INFO, ERROR, DEBUG 등) |
56
+ | `tag` | consola 태그 (있을 때만 포함) |
57
+ | `msg` | 문자열 인자를 공백으로 합친 메시지 (있을 때만 포함) |
58
+ | `err` | Error 객체 (있을 때만 포함): `{ message, stack }` |
59
+
60
+ ## 파일 명명 규칙
61
+
62
+ - 기본: `.logs/app.YYYY-MM-DD.log`
63
+ - 크기 초과 시: `.logs/app.YYYY-MM-DD.1.log`, `.logs/app.YYYY-MM-DD.2.log`, ...
64
+ - `process.cwd()` 기준 `.logs/` 디렉토리에 저장
65
+
66
+ ## Usage
67
+
68
+ ```typescript
69
+ import { createFileReporter } from "@simplysm/core-node";
70
+ import consola from "consola";
71
+
72
+ // 기본 옵션
73
+ consola.options.reporters = [createFileReporter()];
74
+
75
+ // 크기/기간 커스텀
76
+ const reporter = createFileReporter({ maxSize: 10 * 1024 * 1024, maxDays: 7 });
77
+ consola.options.reporters = [reporter];
78
+ ```
@@ -0,0 +1,38 @@
1
+ # PrettyReporter
2
+
3
+ 터미널 출력용 consola reporter. 로그 타입별 아이콘과 색상을 지원하며, 에러 스택 트레이스를 포맷팅한다.
4
+
5
+ ## When to use
6
+
7
+ - ✅ 터미널에 아이콘/색상이 포함된 가독성 좋은 로그를 출력할 때
8
+ - ✅ `setupConsola()`의 기본 동작 대신 reporter를 직접 조합할 때
9
+ - ❌ 로그를 파일로 저장 → [`createFileReporter`](./create-file-reporter.md) 사용
10
+
11
+ ```typescript
12
+ export class PrettyReporter implements ConsolaReporter {
13
+ log(logObj: LogObject, ctx: { options: ConsolaOptions }): void
14
+ }
15
+ ```
16
+
17
+ ## Members
18
+
19
+ | Member | Kind | Type | Description |
20
+ |--------|------|------|-------------|
21
+ | `log` | method | `(logObj: LogObject, ctx: { options: ConsolaOptions }) => void` | 로그 항목을 터미널에 출력 |
22
+
23
+ ## 동작 방식
24
+
25
+ - `logObj.level < 2` (error/fatal)이면 `stderr`, 그 외이면 `stdout`에 출력
26
+ - 컬러 지원 자동 감지: `NO_COLOR` 환경 변수 → `FORCE_COLOR` 환경 변수 → `process.stdout.isTTY` → Windows 여부 순으로 판단
27
+ - 로그 타입별 아이콘: `error`/`fatal`/`fail` = `✖`, `ready`/`success` = `✔`, `warn` = `⚠`, `info` = `ℹ`, `debug` = `⚙`, `trace` = `→`
28
+ - `Error` 객체는 메시지 + 스택 트레이스로 포맷팅되며, `cause` 체인도 재귀적으로 표시됨
29
+ - `badge` 옵션이나 error/fatal 레벨이면 로그 앞뒤에 빈 줄을 추가 (시각적 강조)
30
+
31
+ ## Usage
32
+
33
+ ```typescript
34
+ import { PrettyReporter } from "@simplysm/core-node";
35
+ import consola from "consola";
36
+
37
+ consola.options.reporters = [new PrettyReporter()];
38
+ ```
@@ -0,0 +1,77 @@
1
+ # setupConsola
2
+
3
+ 환경에 따라 consola reporter를 자동 구성한다. 이 패키지의 `console.*` 사용 금지 규칙을 대체하는 표준 로깅 진입점이다.
4
+
5
+ ## When to use
6
+
7
+ - ✅ 서버/CLI 애플리케이션 시작 시 환경별(개발/프로덕션) 로깅을 한 번에 구성할 때
8
+ - ❌ reporter를 세밀하게 커스텀 조합할 때 → `createFileReporter`/`PrettyReporter`를 직접 사용
9
+
10
+ ```typescript
11
+ export function setupConsola(opts?: SetupConsolaOptions): void
12
+ ```
13
+
14
+ ## Parameters
15
+
16
+ | Param | Type | Description |
17
+ |-------|------|-------------|
18
+ | `opts` | `SetupConsolaOptions` (optional) | 구성 옵션 |
19
+
20
+ ## Related Types
21
+
22
+ ### `SetupConsolaOptions`
23
+
24
+ ```typescript
25
+ export interface SetupConsolaOptions {
26
+ cli?: boolean;
27
+ }
28
+ ```
29
+
30
+ | Field | Type | Description |
31
+ |-------|------|-------------|
32
+ | `cli` | `boolean` (optional) | CLI 모드 여부. `true`이면 프로덕션에서도 개발 경로(FileReporter + PrettyReporter)를 사용 |
33
+
34
+ ## 환경별 동작
35
+
36
+ | 조건 | Reporter | 레벨 |
37
+ |------|----------|------|
38
+ | 프로덕션 (`DEV` 아님, `cli` 아님) | `FileReporter`만 | debug까지 파일 기록 |
39
+ | 개발 또는 `cli: true` + `SD_DEBUG=true` | `PrettyReporter`만 | debug까지 터미널 출력 |
40
+ | 개발 또는 `cli: true` (일반) | `FileReporter` + `PrettyReporter` (info 이하만) | debug는 파일에만 기록, info 이하는 터미널 출력 |
41
+
42
+ `DEV` 환경 변수 감지에는 `@simplysm/core-common`의 `parseBoolEnv(env("DEV"))`를 사용한다.
43
+
44
+ ## `withMaxLevel`
45
+
46
+ reporter에 로그 레벨 상한선을 설정한 래퍼를 반환한다. `setupConsola()` 내부에서 PrettyReporter를 info 레벨로 제한할 때 사용된다.
47
+
48
+ ```typescript
49
+ export function withMaxLevel(reporter: ConsolaReporter, maxLevel: number): ConsolaReporter
50
+ ```
51
+
52
+ | Param | Type | Description |
53
+ |-------|------|-------------|
54
+ | `reporter` | `ConsolaReporter` | 감쌀 reporter |
55
+ | `maxLevel` | `number` | 이 레벨보다 높은 로그는 무시 (consola의 `LogLevels` 상수 사용 권장) |
56
+
57
+ ## Usage
58
+
59
+ ```typescript
60
+ import { setupConsola, withMaxLevel, PrettyReporter } from "@simplysm/core-node";
61
+ import { LogLevels } from "consola";
62
+
63
+ // 환경별 자동 구성 (일반 서버)
64
+ setupConsola();
65
+
66
+ // CLI 모드 (프로덕션에서도 터미널 출력)
67
+ setupConsola({ cli: true });
68
+
69
+ // 개별 reporter 직접 조합
70
+ import consola from "consola";
71
+ import { createFileReporter } from "@simplysm/core-node";
72
+
73
+ consola.options.reporters = [
74
+ createFileReporter(),
75
+ withMaxLevel(new PrettyReporter(), LogLevels.info),
76
+ ];
77
+ ```
@@ -0,0 +1,128 @@
1
+ # cpx
2
+
3
+ 자식 프로세스 실행 및 인코딩 감지 유틸리티 네임스페이스.
4
+
5
+ ```typescript
6
+ import { cpx } from "@simplysm/core-node";
7
+ ```
8
+
9
+ ## When to use
10
+
11
+ - ✅ 외부 명령어(git, npm, 빌드 도구 등)를 실행하고 결과를 받아야 할 때
12
+ - ✅ 자식 프로세스의 stdout/stderr를 Uint8Array로 수집하고 시스템 인코딩에 맞게 디코딩해야 할 때
13
+ - ❌ Worker thread로 CPU 작업 분리 → [`Worker`](../worker/worker.md) 사용
14
+
15
+ ## Members
16
+
17
+ | Member | Kind | Signature | Description |
18
+ |--------|------|-----------|-------------|
19
+ | `spawn` | function | `(cmd: string, args: string[], options?: SpawnOptions & { reject?: boolean }) => SpawnProcess` | 자식 프로세스 실행 (비동기). `SpawnProcess`를 반환한다 |
20
+ | `spawnSync` | function | `(cmd: string, args: string[], options?: SpawnSyncOptions & { reject?: boolean }) => SpawnResult` | 자식 프로세스 동기 실행 |
21
+ | `getSystemEncoding` | function | `() => string` | 시스템 기본 인코딩 감지. 결과는 캐시됨 |
22
+ | `codePageToEncoding` | function | `(codePage: number) => string` | Windows 코드 페이지 번호를 인코딩 이름으로 변환 |
23
+ | `resetEncodingCache` | function | `() => void` | 캐시된 시스템 인코딩 초기화 |
24
+ | `decodeBytes` | function | `(raw: Uint8Array, systemEncoding?: string) => string` | Uint8Array를 문자열로 디코딩 |
25
+ | `resolveStdioPipe` | function | `(stdio: SpawnOptions["stdio"]) => { stdout: boolean; stderr: boolean }` | stdio 옵션에서 pipe 여부 추출 |
26
+ | `SpawnProcess` | class | — | `spawn()` 반환 타입. PromiseLike 구현, kill() 지원 |
27
+ | `SpawnResult` | interface | — | `spawn`/`spawnSync` 결과 타입 |
28
+
29
+ ## `SpawnProcess`
30
+
31
+ `spawn()`이 반환하는 클래스. `PromiseLike<SpawnResult>`를 구현하여 `await`로 사용 가능하다.
32
+
33
+ ```typescript
34
+ export class SpawnProcess implements PromiseLike<SpawnResult> {
35
+ get pid(): number | undefined
36
+ then<TResult1 = SpawnResult, TResult2 = never>(
37
+ onfulfilled?: ((value: SpawnResult) => TResult1 | PromiseLike<TResult1>) | null,
38
+ onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,
39
+ ): Promise<TResult1 | TResult2>
40
+ catch<TResult = never>(
41
+ onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,
42
+ ): Promise<SpawnResult | TResult>
43
+ kill(signal?: NodeJS.Signals | number): boolean
44
+ }
45
+ ```
46
+
47
+ | Member | Kind | Type | Description |
48
+ |--------|------|------|-------------|
49
+ | `pid` | getter | `number \| undefined` | 자식 프로세스의 PID |
50
+ | `then` | method | `PromiseLike.then` | Promise then 메서드 |
51
+ | `catch` | method | `PromiseLike.catch` | Promise catch 메서드 |
52
+ | `kill` | method | `(signal?: NodeJS.Signals \| number) => boolean` | 프로세스에 신호를 보냄 (기본값: SIGTERM) |
53
+
54
+ ## `SpawnResult`
55
+
56
+ ```typescript
57
+ export interface SpawnResult {
58
+ stdout: string;
59
+ stderr: string;
60
+ exitCode: number;
61
+ }
62
+ ```
63
+
64
+ | Field | Type | Description |
65
+ |-------|------|-------------|
66
+ | `stdout` | `string` | 표준 출력 내용. stdio가 "pipe"가 아니면 빈 문자열 |
67
+ | `stderr` | `string` | 표준 에러 내용. stdio가 "pipe"가 아니면 빈 문자열 |
68
+ | `exitCode` | `number` | 프로세스 종료 코드 |
69
+
70
+ ## reject 옵션
71
+
72
+ `spawn`/`spawnSync` 모두 기본적으로 `exitCode !== 0`이면 오류를 발생시킨다. `options.reject: false`를 지정하면 항상 정상 반환된다.
73
+
74
+ ## getSystemEncoding 인코딩 감지 로직
75
+
76
+ - **Windows**: `chcp` 명령으로 코드 페이지를 얻어 `codePageToEncoding()`으로 변환
77
+ - **Linux/macOS**: `LANG` 또는 `LC_ALL` 환경 변수의 `.` 이후 부분 사용
78
+ - 감지 실패 시 `"utf-8"` 반환
79
+
80
+ ## decodeBytes 디코딩 로직
81
+
82
+ - `systemEncoding`이 `"utf-8"`이면 UTF-8로 바로 디코딩
83
+ - 그렇지 않으면 먼저 UTF-8 strict 디코딩을 시도하고, 실패하면 `systemEncoding`으로 디코딩
84
+
85
+ ## Usage
86
+
87
+ ```typescript
88
+ import { cpx } from "@simplysm/core-node";
89
+
90
+ // 기본 실행 (결과 대기)
91
+ const result = await cpx.spawn("git", ["status"], { cwd: "/project" });
92
+ console.log(result.stdout);
93
+
94
+ // 실시간 출력 표시
95
+ await cpx.spawn("npm", ["run", "build"], { stdio: "inherit" });
96
+
97
+ // 오류 무시
98
+ const result2 = await cpx.spawn("cmd", ["nonexistent"], { reject: false });
99
+ // result2.exitCode가 0이 아니어도 throw되지 않음
100
+
101
+ // 프로세스 제어
102
+ const proc = cpx.spawn("long-running", []);
103
+ setTimeout(() => proc.kill(), 5000);
104
+ const r = await proc;
105
+
106
+ // 동기 실행
107
+ const syncResult = cpx.spawnSync("node", ["--version"]);
108
+
109
+ // 인코딩 감지
110
+ const encoding = cpx.getSystemEncoding(); // e.g. "utf-8", "euc-kr"
111
+ ```
112
+
113
+ ## 🚫 Anti-patterns
114
+
115
+ ### reject: false 없이 실패 허용 프로세스 실행
116
+
117
+ ```typescript
118
+ // ❌ exitCode !== 0이면 throw — 의도적으로 실패를 허용할 때 문제
119
+ const result = await cpx.spawn("grep", ["pattern", "file.txt"]);
120
+
121
+ // ✅ reject: false로 종료 코드를 직접 확인
122
+ const result = await cpx.spawn("grep", ["pattern", "file.txt"], { reject: false });
123
+ if (result.exitCode === 0) {
124
+ // 매칭 있음
125
+ }
126
+ ```
127
+
128
+ **근거**: `spawn`/`spawnSync`는 기본적으로 `exitCode !== 0`이면 오류를 발생시킨다. 실패가 정상 흐름인 경우 `reject: false` 필수.
@@ -0,0 +1,168 @@
1
+ # fsx
2
+
3
+ 파일 시스템 작업을 위한 유틸리티 네임스페이스. 모든 연산은 동기(`*Sync`)와 비동기 쌍으로 제공된다.
4
+ 비동기 버전을 기본으로 사용하고, CLI 초기화 등 동기가 반드시 필요한 경우에만 동기 버전을 사용한다.
5
+
6
+ ```typescript
7
+ import { fsx } from "@simplysm/core-node";
8
+ ```
9
+
10
+ ## When to use
11
+
12
+ - ✅ Node.js에서 파일/디렉토리 CRUD, glob 검색, JSON 파일 처리가 필요할 때
13
+ - ✅ 상위 디렉토리 자동 생성, 복사 시 필터링, 삭제 시 자동 재시도 등 편의 기능이 필요할 때
14
+ - ❌ 브라우저 환경 → `@simplysm/core-browser` 또는 Web API 사용
15
+ - ❌ 스트림 기반 대용량 파일 처리 → Node.js `fs.createReadStream` 직접 사용
16
+
17
+ ## Members
18
+
19
+ ### 존재 여부 확인
20
+
21
+ | Member | Kind | Signature | Description |
22
+ |--------|------|-----------|-------------|
23
+ | `exists` | function | `(targetPath: string) => Promise<boolean>` | 파일 또는 디렉토리가 존재하는지 확인 (비동기) |
24
+ | `existsSync` | function | `(targetPath: string) => boolean` | 파일 또는 디렉토리가 존재하는지 확인 (동기) |
25
+
26
+ ### 디렉토리 생성
27
+
28
+ | Member | Kind | Signature | Description |
29
+ |--------|------|-----------|-------------|
30
+ | `mkdir` | function | `(targetPath: string) => Promise<void>` | 디렉토리를 재귀적으로 생성 (비동기) |
31
+ | `mkdirSync` | function | `(targetPath: string) => void` | 디렉토리를 재귀적으로 생성 (동기) |
32
+
33
+ ### 삭제
34
+
35
+ | Member | Kind | Signature | Description |
36
+ |--------|------|-----------|-------------|
37
+ | `rm` | function | `(targetPath: string) => Promise<void>` | 파일/디렉토리 삭제. 파일 잠금 오류 시 최대 6회(500ms 간격) 재시도 (비동기) |
38
+ | `rmSync` | function | `(targetPath: string) => void` | 파일/디렉토리 삭제. 재시도 없이 즉시 실패 (동기) |
39
+
40
+ ### 복사
41
+
42
+ | Member | Kind | Signature | Description |
43
+ |--------|------|-----------|-------------|
44
+ | `copy` | function | `(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean) => Promise<void>` | 파일/디렉토리 복사. sourcePath가 없으면 아무것도 하지 않음 (비동기) |
45
+ | `copySync` | function | `(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean) => void` | 파일/디렉토리 복사 (동기) |
46
+
47
+ ### 파일 읽기
48
+
49
+ | Member | Kind | Signature | Description |
50
+ |--------|------|-----------|-------------|
51
+ | `read` | function | `(targetPath: string) => Promise<string>` | 파일을 UTF-8 문자열로 읽음 (비동기) |
52
+ | `readSync` | function | `(targetPath: string) => string` | 파일을 UTF-8 문자열로 읽음 (동기) |
53
+ | `readBytes` | function | `(targetPath: string) => Promise<Uint8Array>` | 파일을 Uint8Array로 읽음 (비동기) |
54
+ | `readBytesSync` | function | `(targetPath: string) => Uint8Array` | 파일을 Uint8Array로 읽음 (동기) |
55
+ | `readJson` | function | `<TData = unknown>(targetPath: string) => Promise<TData>` | JSON 파일 읽기, `@simplysm/core-common`의 `json.parse` 사용 (비동기) |
56
+ | `readJsonSync` | function | `<TData = unknown>(targetPath: string) => TData` | JSON 파일 읽기 (동기) |
57
+
58
+ ### 파일 쓰기
59
+
60
+ | Member | Kind | Signature | Description |
61
+ |--------|------|-----------|-------------|
62
+ | `write` | function | `(targetPath: string, data: string \| Uint8Array) => Promise<void>` | 파일에 데이터 쓰기. 상위 디렉토리 자동 생성 (비동기) |
63
+ | `writeSync` | function | `(targetPath: string, data: string \| Uint8Array) => void` | 파일에 데이터 쓰기. 상위 디렉토리 자동 생성 (동기) |
64
+ | `writeJson` | function | `(targetPath: string, data: unknown, options?: { replacer?: ...; space?: string \| number }) => Promise<void>` | JSON 파일 쓰기, `@simplysm/core-common`의 `json.stringify` 사용 (비동기) |
65
+ | `writeJsonSync` | function | `(targetPath: string, data: unknown, options?: { replacer?: ...; space?: string \| number }) => void` | JSON 파일 쓰기 (동기) |
66
+
67
+ ### 디렉토리 읽기
68
+
69
+ | Member | Kind | Signature | Description |
70
+ |--------|------|-----------|-------------|
71
+ | `readdir` | function | `(targetPath: string) => Promise<string[]>` | 디렉토리 내용 읽기 (비동기) |
72
+ | `readdirSync` | function | `(targetPath: string) => string[]` | 디렉토리 내용 읽기 (동기) |
73
+
74
+ ### 파일 정보
75
+
76
+ | Member | Kind | Signature | Description |
77
+ |--------|------|-----------|-------------|
78
+ | `stat` | function | `(targetPath: string) => Promise<fs.Stats>` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라감 (비동기) |
79
+ | `statSync` | function | `(targetPath: string) => fs.Stats` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라감 (동기) |
80
+ | `lstat` | function | `(targetPath: string) => Promise<fs.Stats>` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라가지 않음 (비동기) |
81
+ | `lstatSync` | function | `(targetPath: string) => fs.Stats` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라가지 않음 (동기) |
82
+
83
+ ### Glob
84
+
85
+ | Member | Kind | Signature | Description |
86
+ |--------|------|-----------|-------------|
87
+ | `glob` | function | `(pattern: string, options?: GlobOptions) => Promise<string[]>` | Glob 패턴으로 파일 검색. 절대 경로 배열 반환 (비동기) |
88
+ | `globSync` | function | `(pattern: string, options?: GlobOptions) => string[]` | Glob 패턴으로 파일 검색 (동기) |
89
+
90
+ ### 유틸리티
91
+
92
+ | Member | Kind | Signature | Description |
93
+ |--------|------|-----------|-------------|
94
+ | `clearEmptyDirectory` | function | `(dirPath: string) => Promise<void>` | 지정 디렉토리 하위의 빈 디렉토리를 재귀적으로 삭제 |
95
+ | `findAllParentChildPaths` | function | `(childGlob: string, fromPath: string, rootPath?: string) => Promise<string[]>` | 시작 경로에서 루트 방향으로 부모 디렉토리를 순회하며 glob 패턴에 매칭되는 파일 검색 (비동기) |
96
+ | `findAllParentChildPathsSync` | function | `(childGlob: string, fromPath: string, rootPath?: string) => string[]` | 시작 경로에서 루트 방향으로 부모 디렉토리를 순회하며 glob 패턴에 매칭되는 파일 검색 (동기) |
97
+
98
+ ## `copy` / `copySync` — filter 파라미터
99
+
100
+ - 각 파일/디렉토리의 **절대 경로**가 전달된다
101
+ - `true` 반환 시 복사, `false` 반환 시 제외
102
+ - 최상위 `sourcePath`는 필터링 대상이 아니다. 필터는 모든 하위 항목(직접 및 간접)에 재귀적으로 적용된다
103
+ - 디렉토리에 대해 `false`를 반환하면 해당 디렉토리와 모든 내용을 건너뛴다
104
+
105
+ ## `findAllParentChildPaths` / `findAllParentChildPathsSync` — rootPath 주의
106
+
107
+ - `fromPath`는 `rootPath`의 하위 경로여야 한다. 그렇지 않으면 파일 시스템 루트까지 검색한다
108
+
109
+ ## Usage
110
+
111
+ ```typescript
112
+ import { fsx } from "@simplysm/core-node";
113
+
114
+ // 파일 존재 확인
115
+ const exists = await fsx.exists("/path/to/file.txt");
116
+
117
+ // 읽기/쓰기
118
+ const content = await fsx.read("/path/to/file.txt");
119
+ await fsx.write("/path/to/new-file.txt", "Hello, World!");
120
+
121
+ // JSON 읽기/쓰기
122
+ const data = await fsx.readJson<{ name: string }>("/config.json");
123
+ await fsx.writeJson("/config.json", { name: "test" });
124
+
125
+ // 복사 (필터 적용)
126
+ await fsx.copy("/src/dir", "/dst/dir", (filePath) => !filePath.includes("node_modules"));
127
+
128
+ // Glob 검색
129
+ const tsFiles = await fsx.glob("src/**/*.ts");
130
+
131
+ // 빈 디렉토리 정리
132
+ await fsx.clearEmptyDirectory("/output");
133
+
134
+ // 부모 디렉토리에서 파일 검색
135
+ const configs = await fsx.findAllParentChildPaths("package.json", "/project/src/components");
136
+ ```
137
+
138
+ ## 🚫 Anti-patterns
139
+
140
+ ### 동기 버전을 기본으로 사용
141
+
142
+ ```typescript
143
+ // ❌ 비동기 컨텍스트에서 동기 함수 사용
144
+ async function process() {
145
+ const content = fsx.readSync("/path/to/file.txt");
146
+ fsx.writeSync("/path/to/output.txt", content);
147
+ }
148
+
149
+ // ✅ 비동기 버전 사용
150
+ async function process() {
151
+ const content = await fsx.read("/path/to/file.txt");
152
+ await fsx.write("/path/to/output.txt", content);
153
+ }
154
+ ```
155
+
156
+ **근거**: 동기 버전은 이벤트 루프를 차단한다. CLI 초기화 등 반드시 동기가 필요한 경우에만 `*Sync` 사용.
157
+
158
+ ### rmSync로 일시적 파일 잠금 오류 처리
159
+
160
+ ```typescript
161
+ // ❌ rmSync는 재시도 없이 즉시 실패
162
+ fsx.rmSync("/path/to/locked-file");
163
+
164
+ // ✅ rm은 파일 잠금 시 최대 6회(500ms 간격) 재시도
165
+ await fsx.rm("/path/to/locked-file");
166
+ ```
167
+
168
+ **근거**: Windows에서 파일 잠금은 흔한 일시적 오류. 비동기 `rm`을 사용하면 자동 재시도된다.
@@ -0,0 +1,73 @@
1
+ # pathx
2
+
3
+ 경로 처리 및 `PosixPath` 브랜드 타입 유틸리티 네임스페이스.
4
+
5
+ ```typescript
6
+ import { pathx } from "@simplysm/core-node";
7
+ ```
8
+
9
+ ## When to use
10
+
11
+ - ✅ Windows 경로를 POSIX 슬래시로 정규화해야 할 때
12
+ - ✅ 경로 간 하위 관계를 확인하거나, 파일 경로의 디렉토리를 바꿔야 할 때
13
+ - ❌ 단순 `path.join`/`path.resolve`만 필요한 경우 → Node.js `path` 모듈 직접 사용
14
+
15
+ ## Members
16
+
17
+ | Member | Kind | Signature | Description |
18
+ |--------|------|-----------|-------------|
19
+ | `PosixPath` | type | `string & { [POSIX]: never }` | POSIX 스타일(슬래시) 경로 브랜드 타입 |
20
+ | `posix` | function | `(p: string) => PosixPath` | 백슬래시를 슬래시로 변환. resolve는 수행하지 않음 |
21
+ | `posixResolve` | function | `(...args: string[]) => PosixPath` | 절대 경로로 resolve한 뒤 POSIX 스타일로 변환 |
22
+ | `changeFileDirectory` | function | `(filePath: string, fromDirectory: string, toDirectory: string) => string` | 파일 경로의 디렉토리를 변경 |
23
+ | `basenameWithoutExt` | function | `(filePath: string) => string` | 확장자를 제외한 파일명(basename) 반환 |
24
+ | `isChildPath` | function | `(childPath: string, parentPath: string) => boolean` | childPath가 parentPath의 하위 경로인지 확인 |
25
+ | `filterByTargets` | function | `(files: string[], targets: string[], cwd: string) => string[]` | 대상 경로 목록에 기반한 파일 필터링 |
26
+
27
+ ## `PosixPath`
28
+
29
+ 슬래시(`/`) 구분자임을 타입 수준에서 보장하는 브랜드 타입. `posix()` 또는 `posixResolve()`를 통해서만 생성할 수 있다. `FsWatcher`가 반환하는 경로는 항상 `PosixPath`다.
30
+
31
+ ```typescript
32
+ export type PosixPath = string & {
33
+ [POSIX]: never;
34
+ };
35
+ ```
36
+
37
+ ## `changeFileDirectory` — 예외 조건
38
+
39
+ `filePath`가 `fromDirectory` 내부에 없으면 `ArgumentError`를 throw한다.
40
+
41
+ ## `isChildPath` — 동일 경로 처리
42
+
43
+ 동일한 경로이면 `false`를 반환한다. 내부적으로 `posixResolve()`로 정규화하여 비교한다.
44
+
45
+ ## `filterByTargets` — files 파라미터 주의
46
+
47
+ `files`는 `cwd` 하위의 절대 경로여야 한다. `cwd` 외부 경로는 상대 경로(`../`)로 변환되어 처리되며 의도치 않은 결과가 생길 수 있다. `targets`가 비어있으면 `files`를 그대로 반환한다.
48
+
49
+ ## Usage
50
+
51
+ ```typescript
52
+ import { pathx } from "@simplysm/core-node";
53
+
54
+ // POSIX 경로 변환
55
+ const p = pathx.posix("C:\\Users\\test"); // "C:/Users/test"
56
+
57
+ // 절대 경로 resolve + POSIX
58
+ const abs = pathx.posixResolve("./relative", "path"); // e.g. "D:/cwd/relative/path"
59
+
60
+ // 파일 디렉토리 변경
61
+ const newPath = pathx.changeFileDirectory("/a/b/c.txt", "/a", "/x"); // "/x/b/c.txt"
62
+
63
+ // 확장자 없는 basename
64
+ pathx.basenameWithoutExt("file.spec.ts"); // "file.spec"
65
+
66
+ // 자식 경로 확인
67
+ pathx.isChildPath("/a/b/c", "/a/b"); // true
68
+ pathx.isChildPath("/a/b", "/a/b"); // false (동일 경로)
69
+
70
+ // 파일 필터링
71
+ const files = ["/proj/src/a.ts", "/proj/tests/b.ts"];
72
+ pathx.filterByTargets(files, ["src"], "/proj"); // ["/proj/src/a.ts"]
73
+ ```