@simplysm/sd-claude 14.0.87 → 14.0.89

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 (127) hide show
  1. package/claude/references/sd-simplysm14/README.md +17 -18
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +35 -0
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +51 -0
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +53 -0
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +34 -0
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +40 -0
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +74 -0
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +27 -0
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +103 -0
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +69 -0
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +28 -0
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +57 -0
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +73 -0
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +78 -0
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +66 -0
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +71 -0
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +62 -0
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +70 -0
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +80 -0
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +262 -0
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +121 -0
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +129 -0
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +53 -0
  27. package/claude/references/sd-simplysm14/apis/core-common/obj.md +117 -0
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +17 -0
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +43 -0
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +50 -0
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +41 -0
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +72 -0
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +39 -0
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +52 -0
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +43 -0
  36. package/claude/references/sd-simplysm14/apis/excel/cell.md +54 -0
  37. package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +51 -0
  38. package/claude/references/sd-simplysm14/apis/excel/style.md +67 -0
  39. package/claude/references/sd-simplysm14/apis/excel/utils.md +35 -0
  40. package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +97 -0
  41. package/claude/references/sd-simplysm14/apis/excel/wrapper.md +83 -0
  42. package/claude/references/sd-simplysm14/apis/lint/README.md +49 -0
  43. package/claude/references/sd-simplysm14/apis/lint/rules.md +130 -0
  44. package/claude/references/sd-simplysm14/apis/orm-common/README.md +13 -0
  45. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +111 -0
  46. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +128 -0
  47. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +145 -0
  48. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +147 -0
  49. package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -0
  50. package/claude/references/sd-simplysm14/apis/orm-node/README.md +90 -0
  51. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +94 -0
  52. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +26 -0
  53. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +117 -0
  54. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +291 -0
  55. package/claude/references/sd-simplysm14/apis/service-client/README.md +150 -0
  56. package/claude/references/sd-simplysm14/apis/service-client/orm.md +48 -0
  57. package/claude/references/sd-simplysm14/apis/service-client/transport.md +59 -0
  58. package/claude/references/sd-simplysm14/apis/service-common/README.md +84 -0
  59. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +48 -0
  60. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +72 -0
  61. package/claude/references/sd-simplysm14/apis/service-server/README.md +118 -0
  62. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +71 -0
  63. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +62 -0
  64. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +39 -0
  65. package/claude/references/sd-simplysm14/apis/storage/README.md +120 -0
  66. package/claude/skills/sd-demo/SKILL.md +6 -0
  67. package/claude/skills/sd-impl/SKILL.md +4 -7
  68. package/claude/skills/sd-spec/SKILL.md +31 -858
  69. package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
  70. package/claude/workflows/sd-docs.js +84 -0
  71. package/claude/{skills/sd-docs/references/subagent-prompt.md → workflows/sd-docs.rules.md} +25 -40
  72. package/package.json +1 -1
  73. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
  74. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
  75. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
  76. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
  77. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
  78. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
  79. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
  80. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
  81. package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
  82. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
  83. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  84. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  85. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
  86. package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
  87. package/claude/skills/sd-docs/SKILL.md +0 -58
  88. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
  89. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
  90. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
  91. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
  92. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
  93. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
  94. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
  95. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
  96. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
  97. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
  98. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
  99. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
  100. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
  101. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
  102. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
  103. package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
  104. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
  105. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
  106. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
  107. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
  108. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
  109. package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
  110. package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
  111. package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
  112. package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
  113. package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
  114. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
  115. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
  116. package/claude/skills/sd-review/evals/golden.jsonl +0 -2
  117. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
  118. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  119. package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
  120. package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
  121. package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
  122. package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
  123. package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
  124. package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
  125. package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
  126. package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
  127. package/claude/skills/sd-use/evals/golden.jsonl +0 -6
@@ -1,31 +1,25 @@
1
- # subagent 호출 프롬프트 (sd-docs)
1
+ # API 문서 작성 규칙 (sd-docs)
2
2
 
3
- 메인 에이전트가 패키지 1개당 1번씩 `general-purpose` subagent 호출할 쓰는 프롬프트 양식. `<PACKAGE_NAME>` `<PACKAGE_DIR>` 자리만 치환.
3
+ 패키지 1개의 API 문서를 작성·갱신할 때 따르는 규칙. 산출 자리는 `.claude/references/sd-simplysm14/apis/<패키지명>/` (`<패키지명>` = `@simplysm/` 접두사 제외한 짧은 이름. 예: `@simplysm/foo` `apis/foo/`).
4
4
 
5
- ---
6
-
7
- ## 프롬프트 (이 마커 아래 전부를 그대로 subagent 에 전달)
8
-
9
- 너는 `<PACKAGE_NAME>` 패키지(소스 위치: `<PACKAGE_DIR>/src/`)의 API 문서를 작성·갱신하는 subagent. 산출 자리는 `.claude/references/sd-simplysm14/apis/<PACKAGE_NAME 의 `@simplysm/` 접두사를 제외한 짧은 이름>/` (예: `@simplysm/foo` → `apis/foo/`). 아래 규칙을 끝까지 따름.
10
-
11
- ### 1. 입력 분석
5
+ ## 1. 입력 분석
12
6
 
13
7
  다음만 진실 근거로 사용 — 외부 자료·과거 git 기록·다른 패키지의 사용처는 참조 금지.
14
8
 
15
- - `<PACKAGE_DIR>/src/index.ts` 의 export — **entry 시작점**. 여기서 노출된 심볼만 문서 대상.
9
+ - `<패키지 디렉토리>/src/index.ts` 의 export — **entry 시작점**. 여기서 노출된 심볼만 문서 대상.
16
10
  - 위 entry 가 재노출하는 각 심볼의 정의 파일(타입 시그니처 + 본문).
17
11
  - 위 정의 파일 또는 동일 패키지 안의 다른 파일에 달린 JSDoc 주석.
18
12
  - `tests/` 디렉토리 중 해당 패키지를 import 해 검증하는 테스트 코드 (존재할 경우에만).
19
13
 
20
14
  타입 시그니처에서 직접 드러나지 않는 사용 패턴을 보강해야 하면 위 4개 소스 안에서만 추론.
21
15
 
22
- ### 2. 사용 트리거 군 분류
16
+ ## 2. 사용 트리거 군 분류
23
17
 
24
18
  entry 의 export 심볼들을 "한 작업 컨텍스트에서 함께 참조될 군"으로 묶음. 예: 에러 처리 군, 값 타입 군, 큐/이벤트 군. 분류 기준은 폴더 구조나 심볼 종류가 아니라 **사용 시점**(언제 같이 읽힐 것인가) 기준.
25
19
 
26
20
  군이 모호하거나 작아 트리거가 1~2개뿐인 심볼은 별도 군을 만들지 말고 README 의 공통 인라인 섹션에 배치.
27
21
 
28
- ### 3. 산출 단위 판정
22
+ ## 3. 산출 단위 판정
29
23
 
30
24
  기본은 `README.md` 1장. 다음 조건을 **모두** 만족하는 군만 별도 `<군명>.md` 로 분할.
31
25
 
@@ -34,19 +28,17 @@ entry 의 export 심볼들을 "한 작업 컨텍스트에서 함께 참조될
34
28
 
35
29
  위 조건을 만족하지 않으면 README 안에 유지.
36
30
 
37
- ### 4. 풀 재작성 모드 (범위: `apis/<패키지명>/` 자리만)
31
+ ## 4. 풀 재작성 모드 (범위: `apis/<패키지명>/` 자리만)
38
32
 
39
- - 기존 `apis/<패키지명>/README.md` 와 분할 `<군명>.md` 가 있어도 **참고하지 않고 처음부터 작성**. 코드 + 본 프롬프트의 형식 (아래 README 형식 섹션·분할 .md 형식 섹션·작성 원칙 섹션) 만을 진실 근거로 삼음.
40
- - 기존 파일 내용·표현 보존 시도 금지. 변경(예: 식별자 풀이 의무) 이 자동 반영되도록 호출마다 패키지별 산출물(README + 분할 `<군명>.md`) 을 다시 작성.
33
+ - 기존 `apis/<패키지명>/README.md` 와 분할 `<군명>.md` 가 있어도 **참고하지 않고 처음부터 작성**. 코드 + 본 문서의 형식 규칙(아래 README 형식·분할 .md 형식·작성 원칙) 만을 진실 근거로 삼음.
34
+ - 기존 파일 내용·표현 보존 시도 금지. 규칙 변경(예: 식별자 풀이 의무) 이 자동 반영되도록 매번 패키지별 산출물(README + 분할 `<군명>.md`) 을 다시 작성.
41
35
  - 결과적으로 코드가 변경되지 않은 패키지도 표현이 달라질 수 있음 — 정상.
42
36
  - 코드에서 사라진 군의 분할 파일은 삭제.
43
- - **범위 밖**: 상위 `.claude/references/sd-simplysm14/README.md` 는 건드리지 말 것 (메인 에이전트가 인덱스 섹션 항목만 갱신, subagent 와 무관).
37
+ - **범위 밖**: 상위 `.claude/references/sd-simplysm14/README.md` 는 건드리지 말 것 (인덱스 섹션은 취합 단계에서 별도 처리).
44
38
 
45
- ### 5. README.md 형식
39
+ ## 5. README.md 형식
46
40
 
47
- 각 패키지의 `apis/<패키지명>/README.md` 는 다음 구조를 따름.
48
-
49
- H1 은 `# @simplysm/<short-name>` 형식으로 고정 (예: `# @simplysm/foo`).
41
+ 각 패키지의 `apis/<패키지명>/README.md` 는 다음 구조를 따름. H1 은 `# @simplysm/<short-name>` 형식으로 고정.
50
42
 
51
43
  ```markdown
52
44
  # @simplysm/<short-name>
@@ -61,6 +53,7 @@ H1 은 `# @simplysm/<short-name>` 형식으로 고정 (예: `# @simplysm/foo`).
61
53
  ## <인라인 군 이름 1>
62
54
 
63
55
  각 심볼별로 짧은 시그니처 + 옵션·prop·필드·enum literal(열거형 리터럴 값) 1줄 풀이 + 즉시 사용 가능한 사용법을 작성. 본질적으로 큰 군이라 분할된 경우 이 섹션은 두지 않고, 위 인덱스에서 `자세히:` 링크로 안내.
56
+ ```
64
57
 
65
58
  **식별자 풀이 의무**: 시그니처에 나오는 옵션·prop·필드·enum literal 각각에 1줄 풀이 부착. 풀이 구성 = `<무엇을 함>` + (enum/boolean 인 경우) `<값별 동작 차이>` + `<언제 쓰는지 단서 1조각>`. 이름만 나열하는 형식 금지.
66
59
 
@@ -77,15 +70,9 @@ inputs: selectMode, autoSelect: "click"|"focus", useAutoSort, focusMode: "row"|"
77
70
  - focusMode: "row"|"cell" — 키보드 포커스 단위. "row" = 행 전체 이동, "cell" = 셀 단위 이동. 셀 편집·복사 화면이면 "cell".
78
71
  ```
79
72
 
80
- ## <인라인 이름 2>
81
- ...
82
- ```
83
-
84
- ### 6. 분할 .md 형식
85
-
86
- `<군명>.md` 는 다음 구조를 따름.
73
+ ## 6. 분할 .md 형식
87
74
 
88
- 분할 `.md` H1 동일 형식 + 군명을 붙임: `# @simplysm/<short-name> — <군명>`.
75
+ `<군명>.md` 다음 구조를 따름. H1 `# @simplysm/<short-name> — <군명>` 형식.
89
76
 
90
77
  ```markdown
91
78
  # @simplysm/<short-name> — <군명>
@@ -94,25 +81,23 @@ inputs: selectMode, autoSelect: "click"|"focus", useAutoSort, focusMode: "row"|"
94
81
 
95
82
  ## <심볼>
96
83
 
97
- 시그니처, 옵션·prop·필드·enum literal 1줄 풀이(위 README 형식 섹션의 "식별자 풀이 의무" 와 동일 적용), 사용 예, 주의사항.
98
-
99
- ## <심볼>
100
- ...
84
+ 시그니처, 옵션·prop·필드·enum literal 1줄 풀이(위 "식별자 풀이 의무" 와 동일 적용), 사용 예, 주의사항.
101
85
  ```
102
86
 
103
- ### 7. 작성 원칙
87
+ ## 7. 작성 원칙
104
88
 
105
89
  - 산출물의 소비자는 Claude 에이전트. 사람 가독성보다 에이전트가 즉시 따를 수 있는 간결·명확성이 우선.
106
90
  - **코드 본문에 드러난 동작은 JSDoc 이 없어도 기재**. 옵션·prop·필드·enum literal 의 동작을 본문(분기·기본값·사용처) 에서 추론해 풀이. 단, 본문에서 확인 불가한 외부 추측·미검증 동작은 기재 금지.
107
- - **식별자만 나열 금지** — 위 README 형식 섹션·분할 .md 형식 섹션의 "식별자 풀이 의무" 강제. 이름을 콤마로 나열하고 끝내지 말 것. 자명해 보여도 enum literal 의 값별 동작, boolean 의 토글 효과, 함수형 prop 의 호출 시점은 반드시 풀이.
91
+ - **식별자만 나열 금지** — 위 "식별자 풀이 의무" 강제. 이름을 콤마로 나열하고 끝내지 말 것. 자명해 보여도 enum literal 의 값별 동작, boolean 의 토글 효과, 함수형 prop 의 호출 시점은 반드시 풀이.
108
92
  - 사용 예는 실제 호출 코드 형태로 1~3줄 분량, 군마다 1개 가량.
109
93
  - 분량을 늘리기 위한 부연·중복·꾸밈 금지. 단, 식별자 풀이는 "분량 늘리기" 가 아니라 필수 정보로 취급 — 풀이 생략을 통한 분량 절약 금지.
110
94
 
111
- ### 8. 산출 보고
95
+ ## 8. 구조화 결과 반환
112
96
 
113
- 작성·갱신을 마치면 호출자(메인 에이전트) 에게 다음 항목을 1단락으로 보고.
97
+ 작성·갱신을 마치면 다음 항목을 구조화해 반환 (상위 README 인덱스 취합·사용자 보고에 사용).
114
98
 
115
- - 신규 작성인지 갱신인지 구분.
116
- - 산출·갱신한 파일 목록 (README 와 분할 `.md` 모두 포함).
117
- - 패키지의 트리거 요약 (메인 에이전트가 상위 README 인덱스에 옮겨 적을 문장).
118
- - 삭제한 파일이 있으면 목록.
99
+ - `shortName`: `@simplysm/` 제외한 짧은 이름.
100
+ - `mode`: 신규 작성인지 갱신인지.
101
+ - `writtenFiles`: 산출·갱신한 파일 목록 (README + 분할 `.md` 모두).
102
+ - `deletedFiles`: 삭제한 파일 목록 (코드에서 사라진 군, 없으면 빈 목록).
103
+ - `triggerSummary`: 패키지의 한 줄 트리거 요약 (상위 README 인덱스에 옮겨 적을 문장).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-claude",
3
- "version": "14.0.87",
3
+ "version": "14.0.89",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -1,99 +0,0 @@
1
- # 재고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적 [확정: 2026-05-26]
6
-
7
- 창고별 품목 재고 현황 조회 시스템
8
-
9
- ### 1.2 주요 목표 [확정: 2026-05-26]
10
-
11
- - 창고별·품목별 재고 현황 조회
12
-
13
- ### 1.3 최종 사용자/이해관계자 [확정: 2026-05-26]
14
-
15
- - 창고 관리자: PC 로 재고 현황 조회
16
-
17
- ### 1.4 환경/장치 [확정: 2026-05-26]
18
-
19
- ```
20
- ┌─────────┐
21
- │ PC │
22
- └────┬────┘
23
-
24
-
25
- ┌──────────┐
26
- │ WMS 서버 │
27
- └──────────┘
28
- ```
29
-
30
- - PC — 창고 관리자가 재고 화면 조회에 사용
31
- - OS: Windows 11
32
- - Browser: Chrome 최신
33
- - 해상도: 1920 x 1080
34
-
35
- ## 4. 화면
36
-
37
- | § | 분류 | 화면 | 유형 | 장치 |
38
- | --- | ---- | --------- | ---- | ---- |
39
- | 4.1 | 재고 | 재고 조회 | 조회 | PC |
40
-
41
- ### 4.1 재고 조회 (PC) [확정: 2026-05-26]
42
-
43
- Actor: 창고 관리자
44
- 관련 섹션: [모델.재고]
45
-
46
- 기능 개요:
47
-
48
- - 창고별·품목별 재고 현황 조회
49
-
50
- #### 와이어프레임
51
-
52
- ```
53
- ┌────────────────────────────────────────────────────────────────────┐
54
- │ 재고 조회 │
55
- │ [조회] <필터> │
56
- ├────────────────────────────────────────────────────────────────────┤
57
- │ <재고 목록 시트> │
58
- └────────────────────────────────────────────────────────────────────┘
59
- ```
60
-
61
- #### 항목
62
-
63
- **필터**
64
-
65
- | 항목 | 종류 | 필수 | 비고 |
66
- | --------- | --------- | ---- | ------------------------ |
67
- | 창고 | 정적 선택 | X | 전체·창고 목록 |
68
- | 품목 검색 | 텍스트 | X | 코드 또는 명칭 부분 일치 |
69
-
70
- **재고 목록 시트**
71
-
72
- | 컬럼 | 종류 | 필수 | 도메인 매핑 | 비고 |
73
- | ------ | ---- | ---- | -------------------- | --------- |
74
- | 창고 | 문자 | - | [모델.재고.창고] | |
75
- | 품목 | 문자 | - | [모델.재고.품목명] | |
76
- | 재고량 | 숫자 | - | [모델.재고.수량] | 우측 정렬 |
77
- | 갱신일 | 날짜 | - | [모델.재고.갱신일] | |
78
-
79
- #### 동작
80
-
81
- - `[조회]` 클릭: 검색 필터 조건으로 목록 갱신
82
-
83
- #### 빈 상태
84
-
85
- - 검색 결과 없음: "조회된 재고가 없습니다." 표시
86
-
87
- ## 8. 도메인 모델
88
-
89
- ### 8.1 재고 [확정: 2026-05-26]
90
-
91
- 필드:
92
-
93
- | 필드 | 타입 | 필수 | 비고 |
94
- | ------ | ---- | ---- | ---------------- |
95
- | ID | 숫자 | O | 자동 부여 |
96
- | 창고 | 문자 | O | 창고명 |
97
- | 품목명 | 문자 | O | 품목명 |
98
- | 수량 | 숫자 | O | 재고 수량 |
99
- | 갱신일 | 날짜 | O | 마지막 갱신 일자 |
@@ -1,12 +0,0 @@
1
- {
2
- "name": "@demo/client",
3
- "version": "0.0.0",
4
- "private": true,
5
- "type": "module",
6
- "dependencies": {
7
- "@angular/core": "^21.0.0",
8
- "@ng-icons/core": "^32.0.0",
9
- "@ng-icons/tabler-icons": "^32.0.0",
10
- "@simplysm/angular": "^14.0.0"
11
- }
12
- }
@@ -1,3 +0,0 @@
1
- export { InventoryMasterListComponent } from "./screens/inventory/inventory-master.list";
2
- export { OutboundListComponent } from "./screens/outbound/outbound.list";
3
- export { InboundListComponent } from "./screens/inbound/inbound.list";
@@ -1,150 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- effect,
6
- inject,
7
- signal,
8
- untracked,
9
- } from "@angular/core";
10
- import {
11
- injectPermsSignal,
12
- mark,
13
- SdCrudListComponent,
14
- SdSheetColumnDirective,
15
- SdTextfieldComponent,
16
- SdToastProvider,
17
- } from "@simplysm/angular";
18
-
19
- interface IInboundItem {
20
- id: number;
21
- receiptNo: string;
22
- supplierName: string;
23
- itemName: string;
24
- quantity: number;
25
- receivedAt: string;
26
- }
27
-
28
- interface IFilter {
29
- searchText: string;
30
- }
31
-
32
- @Component({
33
- selector: "app-inbound-list",
34
- changeDetection: ChangeDetectionStrategy.OnPush,
35
- encapsulation: ViewEncapsulation.None,
36
- standalone: true,
37
- imports: [SdCrudListComponent, SdSheetColumnDirective, SdTextfieldComponent],
38
- template: `
39
- <div class="flex-column fill">
40
- <sd-crud-list
41
- title="입고 내역 조회"
42
- [(ready)]="ready"
43
- [initialized]="initialized()"
44
- [(busyCount)]="busyCount"
45
- [items]="items()"
46
- [(selectedKeys)]="selectedKeys"
47
- [(page)]="page"
48
- [totalPageCount]="pageLength()"
49
- [(sorts)]="sortingDefs"
50
- [trackByFn]="trackByFn"
51
- [restricted]="!perms().includes('use')"
52
- (filterSubmit)="onFilterSubmit()"
53
- >
54
- <ng-template #filterTpl>
55
- <div class="form-box-inline">
56
- <div>
57
- <label>검색</label>
58
- <sd-textfield [(value)]="filter().searchText" (valueChange)="mark(filter)" />
59
- </div>
60
- </div>
61
- </ng-template>
62
-
63
- <sd-sheet-column [key]="'receiptNo'" [header]="'입고 번호'">
64
- <ng-template [cell]="items()" let-item="item">
65
- <div class="p-xs-sm">{{ item.receiptNo }}</div>
66
- </ng-template>
67
- </sd-sheet-column>
68
-
69
- <sd-sheet-column [key]="'supplierName'" [header]="'공급처'">
70
- <ng-template [cell]="items()" let-item="item">
71
- <div class="p-xs-sm">{{ item.supplierName }}</div>
72
- </ng-template>
73
- </sd-sheet-column>
74
-
75
- <sd-sheet-column [key]="'itemName'" [header]="'품목'">
76
- <ng-template [cell]="items()" let-item="item">
77
- <div class="p-xs-sm">{{ item.itemName }}</div>
78
- </ng-template>
79
- </sd-sheet-column>
80
-
81
- <sd-sheet-column [key]="'quantity'" [header]="'수량'">
82
- <ng-template [cell]="items()" let-item="item">
83
- <div class="p-xs-sm tx-right">{{ item.quantity }}</div>
84
- </ng-template>
85
- </sd-sheet-column>
86
- </sd-crud-list>
87
-
88
- @if (initialized() && items().length === 0) {
89
- <div class="p-default tx-center tx-theme-gray-default">조회된 입고 내역이 없습니다.</div>
90
- }
91
- </div>
92
- `,
93
- })
94
- export class InboundListComponent {
95
- private readonly _sdToast = inject(SdToastProvider);
96
-
97
- perms = injectPermsSignal(["inbound"], ["use"]);
98
-
99
- ready = signal(false);
100
- initialized = signal(false);
101
- busyCount = signal(0);
102
-
103
- items = signal<IInboundItem[]>([]);
104
- selectedKeys = signal<number[]>([]);
105
- page = signal(0);
106
- pageLength = signal(0);
107
- sortingDefs = signal<{ key: string; desc: boolean }[]>([]);
108
-
109
- filter = signal<IFilter>({ searchText: "" });
110
- lastFilter = signal<IFilter>({ searchText: "" });
111
-
112
- trackByFn = (item: IInboundItem) => item.id;
113
-
114
- protected readonly mark = mark;
115
-
116
- constructor() {
117
- effect(() => {
118
- if (!this.perms().includes("use") || !this.ready()) {
119
- this.initialized.set(true);
120
- return;
121
- }
122
-
123
- this.lastFilter();
124
- this.page();
125
- this.sortingDefs();
126
-
127
- void untracked(async () => {
128
- this.busyCount.update((v) => v + 1);
129
- await this._sdToast.try(async () => {
130
- await this._refresh();
131
- });
132
- this.busyCount.update((v) => v - 1);
133
- this.initialized.set(true);
134
- });
135
- });
136
- }
137
-
138
- onFilterSubmit(): void {
139
- this.page.set(0);
140
- this.lastFilter.set({ ...this.filter() });
141
- }
142
-
143
- doRefresh(): void {
144
- if (!this.perms().includes("use")) return;
145
- mark(this.lastFilter);
146
- }
147
-
148
- private async _refresh(): Promise<void> {
149
- }
150
- }
@@ -1,143 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- effect,
6
- inject,
7
- signal,
8
- untracked,
9
- } from "@angular/core";
10
- import {
11
- injectPermsSignal,
12
- mark,
13
- SdCrudListComponent,
14
- SdSheetColumnDirective,
15
- SdTextfieldComponent,
16
- SdToastProvider,
17
- } from "@simplysm/angular";
18
-
19
- interface IInventoryMasterItem {
20
- id: number;
21
- warehouseCode: string;
22
- itemCode: string;
23
- itemName: string;
24
- active: boolean;
25
- }
26
-
27
- interface IFilter {
28
- searchText: string;
29
- }
30
-
31
- @Component({
32
- selector: "app-inventory-master-list",
33
- changeDetection: ChangeDetectionStrategy.OnPush,
34
- encapsulation: ViewEncapsulation.None,
35
- standalone: true,
36
- imports: [SdCrudListComponent, SdSheetColumnDirective, SdTextfieldComponent],
37
- template: `
38
- <div class="flex-column fill">
39
- <sd-crud-list
40
- title="재고 마스터"
41
- [(ready)]="ready"
42
- [initialized]="initialized()"
43
- [(busyCount)]="busyCount"
44
- [items]="items()"
45
- [(selectedKeys)]="selectedKeys"
46
- [(page)]="page"
47
- [totalPageCount]="pageLength()"
48
- [(sorts)]="sortingDefs"
49
- [trackByFn]="trackByFn"
50
- [restricted]="!perms().includes('use')"
51
- (filterSubmit)="onFilterSubmit()"
52
- >
53
- <ng-template #filterTpl>
54
- <div class="form-box-inline">
55
- <div>
56
- <label>검색</label>
57
- <sd-textfield [(value)]="filter().searchText" (valueChange)="mark(filter)" />
58
- </div>
59
- </div>
60
- </ng-template>
61
-
62
- <sd-sheet-column [key]="'warehouseCode'" [header]="'창고'">
63
- <ng-template [cell]="items()" let-item="item">
64
- <div class="p-xs-sm">{{ item.warehouseCode }}</div>
65
- </ng-template>
66
- </sd-sheet-column>
67
-
68
- <sd-sheet-column [key]="'itemCode'" [header]="'품목 코드'">
69
- <ng-template [cell]="items()" let-item="item">
70
- <div class="p-xs-sm">{{ item.itemCode }}</div>
71
- </ng-template>
72
- </sd-sheet-column>
73
-
74
- <sd-sheet-column [key]="'itemName'" [header]="'품목명'">
75
- <ng-template [cell]="items()" let-item="item">
76
- <div class="p-xs-sm">{{ item.itemName }}</div>
77
- </ng-template>
78
- </sd-sheet-column>
79
- </sd-crud-list>
80
-
81
- @if (initialized() && items().length === 0) {
82
- <div class="p-default tx-center tx-theme-gray-default">조회된 재고 마스터가 없습니다.</div>
83
- }
84
- </div>
85
- `,
86
- })
87
- export class InventoryMasterListComponent {
88
- private readonly _sdToast = inject(SdToastProvider);
89
-
90
- perms = injectPermsSignal(["inventory.master"], ["use", "edit"]);
91
-
92
- ready = signal(false);
93
- initialized = signal(false);
94
- busyCount = signal(0);
95
-
96
- items = signal<IInventoryMasterItem[]>([]);
97
- selectedKeys = signal<number[]>([]);
98
- page = signal(0);
99
- pageLength = signal(0);
100
- sortingDefs = signal<{ key: string; desc: boolean }[]>([]);
101
-
102
- filter = signal<IFilter>({ searchText: "" });
103
- lastFilter = signal<IFilter>({ searchText: "" });
104
-
105
- trackByFn = (item: IInventoryMasterItem) => item.id;
106
-
107
- protected readonly mark = mark;
108
-
109
- constructor() {
110
- effect(() => {
111
- if (!this.perms().includes("use") || !this.ready()) {
112
- this.initialized.set(true);
113
- return;
114
- }
115
-
116
- this.lastFilter();
117
- this.page();
118
- this.sortingDefs();
119
-
120
- void untracked(async () => {
121
- this.busyCount.update((v) => v + 1);
122
- await this._sdToast.try(async () => {
123
- await this._refresh();
124
- });
125
- this.busyCount.update((v) => v - 1);
126
- this.initialized.set(true);
127
- });
128
- });
129
- }
130
-
131
- onFilterSubmit(): void {
132
- this.page.set(0);
133
- this.lastFilter.set({ ...this.filter() });
134
- }
135
-
136
- doRefresh(): void {
137
- if (!this.perms().includes("use")) return;
138
- mark(this.lastFilter);
139
- }
140
-
141
- private async _refresh(): Promise<void> {
142
- }
143
- }