@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.
- package/claude/references/sd-simplysm14/README.md +17 -18
- package/claude/references/sd-simplysm14/apis/angular/README.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/controls.md +51 -0
- package/claude/references/sd-simplysm14/apis/angular/crud.md +53 -0
- package/claude/references/sd-simplysm14/apis/angular/directives.md +34 -0
- package/claude/references/sd-simplysm14/apis/angular/features.md +40 -0
- package/claude/references/sd-simplysm14/apis/angular/infra.md +74 -0
- package/claude/references/sd-simplysm14/apis/angular/layout.md +27 -0
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +103 -0
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +69 -0
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +28 -0
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +57 -0
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +73 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +78 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +66 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +71 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +62 -0
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +70 -0
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +80 -0
- package/claude/references/sd-simplysm14/apis/core-common/README.md +262 -0
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +121 -0
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +129 -0
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
- package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +117 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +17 -0
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +43 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +50 -0
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +41 -0
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +72 -0
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +39 -0
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +52 -0
- package/claude/references/sd-simplysm14/apis/excel/README.md +43 -0
- package/claude/references/sd-simplysm14/apis/excel/cell.md +54 -0
- package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +51 -0
- package/claude/references/sd-simplysm14/apis/excel/style.md +67 -0
- package/claude/references/sd-simplysm14/apis/excel/utils.md +35 -0
- package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +97 -0
- package/claude/references/sd-simplysm14/apis/excel/wrapper.md +83 -0
- package/claude/references/sd-simplysm14/apis/lint/README.md +49 -0
- package/claude/references/sd-simplysm14/apis/lint/rules.md +130 -0
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +13 -0
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +111 -0
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +128 -0
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +145 -0
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +147 -0
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -0
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +90 -0
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +94 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +26 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +117 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +291 -0
- package/claude/references/sd-simplysm14/apis/service-client/README.md +150 -0
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +48 -0
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +59 -0
- package/claude/references/sd-simplysm14/apis/service-common/README.md +84 -0
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +48 -0
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +72 -0
- package/claude/references/sd-simplysm14/apis/service-server/README.md +118 -0
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +71 -0
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +62 -0
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +39 -0
- package/claude/references/sd-simplysm14/apis/storage/README.md +120 -0
- package/claude/skills/sd-demo/SKILL.md +6 -0
- package/claude/skills/sd-impl/SKILL.md +4 -7
- package/claude/skills/sd-spec/SKILL.md +31 -858
- package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
- package/claude/workflows/sd-docs.js +84 -0
- package/claude/{skills/sd-docs/references/subagent-prompt.md → workflows/sd-docs.rules.md} +25 -40
- package/package.json +1 -1
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
- package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
- package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
- package/claude/skills/sd-docs/SKILL.md +0 -58
- package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
- package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
- package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
- package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
- package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
- package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
- package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
- package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
- package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
- package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
- package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
- package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
- package/claude/skills/sd-review/evals/golden.jsonl +0 -2
- package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
- package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
- package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
- package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
- package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
- package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
- package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
- package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
- package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
- package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
- package/claude/skills/sd-use/evals/golden.jsonl +0 -6
|
@@ -1,31 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# API 문서 작성 규칙 (sd-docs)
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
-
|
|
9
|
+
- `<패키지 디렉토리>/src/index.ts` 의 export — **entry 시작점**. 여기서 노출된 심볼만 문서 대상.
|
|
16
10
|
- 위 entry 가 재노출하는 각 심볼의 정의 파일(타입 시그니처 + 본문).
|
|
17
11
|
- 위 정의 파일 또는 동일 패키지 안의 다른 파일에 달린 JSDoc 주석.
|
|
18
12
|
- `tests/` 디렉토리 중 해당 패키지를 import 해 검증하는 테스트 코드 (존재할 경우에만).
|
|
19
13
|
|
|
20
14
|
타입 시그니처에서 직접 드러나지 않는 사용 패턴을 보강해야 하면 위 4개 소스 안에서만 추론.
|
|
21
15
|
|
|
22
|
-
|
|
16
|
+
## 2. 사용 트리거 군 분류
|
|
23
17
|
|
|
24
18
|
entry 의 export 심볼들을 "한 작업 컨텍스트에서 함께 참조될 군"으로 묶음. 예: 에러 처리 군, 값 타입 군, 큐/이벤트 군. 분류 기준은 폴더 구조나 심볼 종류가 아니라 **사용 시점**(언제 같이 읽힐 것인가) 기준.
|
|
25
19
|
|
|
26
20
|
군이 모호하거나 작아 트리거가 1~2개뿐인 심볼은 별도 군을 만들지 말고 README 의 공통 인라인 섹션에 배치.
|
|
27
21
|
|
|
28
|
-
|
|
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
|
-
|
|
31
|
+
## 4. 풀 재작성 모드 (범위: `apis/<패키지명>/` 자리만)
|
|
38
32
|
|
|
39
|
-
- 기존 `apis/<패키지명>/README.md` 와 분할 `<군명>.md` 가 있어도 **참고하지 않고 처음부터 작성**. 코드 + 본
|
|
40
|
-
- 기존 파일 내용·표현 보존 시도 금지.
|
|
33
|
+
- 기존 `apis/<패키지명>/README.md` 와 분할 `<군명>.md` 가 있어도 **참고하지 않고 처음부터 작성**. 코드 + 본 문서의 형식 규칙(아래 README 형식·분할 .md 형식·작성 원칙) 만을 진실 근거로 삼음.
|
|
34
|
+
- 기존 파일 내용·표현 보존 시도 금지. 규칙 변경(예: 식별자 풀이 의무) 이 자동 반영되도록 매번 패키지별 산출물(README + 분할 `<군명>.md`) 을 다시 작성.
|
|
41
35
|
- 결과적으로 코드가 변경되지 않은 패키지도 표현이 달라질 수 있음 — 정상.
|
|
42
36
|
- 코드에서 사라진 군의 분할 파일은 삭제.
|
|
43
|
-
- **범위 밖**: 상위 `.claude/references/sd-simplysm14/README.md` 는 건드리지 말 것 (
|
|
37
|
+
- **범위 밖**: 상위 `.claude/references/sd-simplysm14/README.md` 는 건드리지 말 것 (인덱스 섹션은 취합 단계에서 별도 처리).
|
|
44
38
|
|
|
45
|
-
|
|
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
|
-
##
|
|
81
|
-
...
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### 6. 분할 .md 형식
|
|
85
|
-
|
|
86
|
-
`<군명>.md` 는 다음 구조를 따름.
|
|
73
|
+
## 6. 분할 .md 형식
|
|
87
74
|
|
|
88
|
-
|
|
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줄 풀이(위
|
|
98
|
-
|
|
99
|
-
## <심볼>
|
|
100
|
-
...
|
|
84
|
+
시그니처, 옵션·prop·필드·enum literal 1줄 풀이(위 "식별자 풀이 의무" 와 동일 적용), 사용 예, 주의사항.
|
|
101
85
|
```
|
|
102
86
|
|
|
103
|
-
|
|
87
|
+
## 7. 작성 원칙
|
|
104
88
|
|
|
105
89
|
- 산출물의 소비자는 Claude 에이전트. 사람 가독성보다 에이전트가 즉시 따를 수 있는 간결·명확성이 우선.
|
|
106
90
|
- **코드 본문에 드러난 동작은 JSDoc 이 없어도 기재**. 옵션·prop·필드·enum literal 의 동작을 본문(분기·기본값·사용처) 에서 추론해 풀이. 단, 본문에서 확인 불가한 외부 추측·미검증 동작은 기재 금지.
|
|
107
|
-
- **식별자만 나열 금지** — 위
|
|
91
|
+
- **식별자만 나열 금지** — 위 "식별자 풀이 의무" 강제. 이름을 콤마로 나열하고 끝내지 말 것. 자명해 보여도 enum literal 의 값별 동작, boolean 의 토글 효과, 함수형 prop 의 호출 시점은 반드시 풀이.
|
|
108
92
|
- 사용 예는 실제 호출 코드 형태로 1~3줄 분량, 군마다 1개 가량.
|
|
109
93
|
- 분량을 늘리기 위한 부연·중복·꾸밈 금지. 단, 식별자 풀이는 "분량 늘리기" 가 아니라 필수 정보로 취급 — 풀이 생략을 통한 분량 절약 금지.
|
|
110
94
|
|
|
111
|
-
|
|
95
|
+
## 8. 구조화 결과 반환
|
|
112
96
|
|
|
113
|
-
작성·갱신을 마치면
|
|
97
|
+
작성·갱신을 마치면 다음 항목을 구조화해 반환 (상위 README 인덱스 취합·사용자 보고에 사용).
|
|
114
98
|
|
|
115
|
-
-
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
- 삭제한
|
|
99
|
+
- `shortName`: `@simplysm/` 제외한 짧은 이름.
|
|
100
|
+
- `mode`: 신규 작성인지 갱신인지.
|
|
101
|
+
- `writtenFiles`: 산출·갱신한 파일 목록 (README + 분할 `.md` 모두).
|
|
102
|
+
- `deletedFiles`: 삭제한 파일 목록 (코드에서 사라진 군, 없으면 빈 목록).
|
|
103
|
+
- `triggerSummary`: 패키지의 한 줄 트리거 요약 (상위 README 인덱스에 옮겨 적을 문장).
|
package/package.json
CHANGED
|
@@ -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,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
|
-
}
|