@simplysm/sd-claude 14.0.79 → 14.0.81

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 (96) hide show
  1. package/claude/references/sd-requirement-source-handling.md +17 -17
  2. package/claude/references/sd-simplysm14/README.md +58 -58
  3. package/claude/references/sd-simplysm14/manuals/client-component.md +739 -739
  4. package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
  5. package/claude/references/sd-simplysm14/manuals/client-demo.md +1 -1
  6. package/claude/references/sd-simplysm14/manuals/client-setup.md +2 -2
  7. package/claude/references/sd-simplysm14/manuals/client-tab.md +2 -2
  8. package/claude/references/sd-simplysm14/manuals/logging.md +3 -3
  9. package/claude/references/sd-simplysm14/manuals/orm-union.md +7 -7
  10. package/claude/references/sd-simplysm14/manuals/orm.md +75 -75
  11. package/claude/references/sd-simplysm14/manuals/test.md +8 -8
  12. package/claude/rules/sd-base-rules.md +261 -354
  13. package/claude/rules/sd-design-rules.md +44 -0
  14. package/claude/{sd-check-forbidden-files.py → sd-check-edit.py} +2 -1
  15. package/claude/{sd-check-bash.py → sd-check-shell.py} +2 -2
  16. package/claude/settings.json +3 -4
  17. package/claude/skills/sd-commit/SKILL.md +17 -17
  18. package/claude/skills/sd-config/SKILL.md +4 -4
  19. package/claude/skills/sd-demo/SKILL.md +41 -43
  20. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +99 -0
  21. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +12 -0
  22. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +3 -0
  23. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +150 -0
  24. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +143 -0
  25. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +150 -0
  26. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +2 -0
  27. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +12 -0
  28. package/claude/skills/sd-demo/evals/golden.jsonl +1 -5
  29. package/claude/skills/sd-dev/SKILL.md +49 -22
  30. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +8 -0
  31. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  32. package/claude/skills/sd-dev/evals/fixtures/{case-modify → minimal-ts-pkg}/tsconfig.json +1 -3
  33. package/claude/skills/sd-dev/evals/golden.jsonl +1 -3
  34. package/claude/skills/sd-docs/SKILL.md +8 -8
  35. package/claude/skills/sd-impl/SKILL.md +172 -82
  36. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +101 -0
  37. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +101 -0
  38. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +46 -0
  39. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +89 -0
  40. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +101 -0
  41. package/claude/skills/sd-impl/evals/golden.jsonl +4 -6
  42. package/claude/skills/sd-review/SKILL.md +33 -0
  43. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +7 -0
  44. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +4 -0
  45. package/claude/skills/sd-review/evals/golden.jsonl +2 -0
  46. package/claude/skills/sd-skill/SKILL.md +217 -29
  47. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +14 -0
  48. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  49. package/claude/skills/sd-skill/evals/golden.jsonl +2 -5
  50. package/claude/skills/sd-spec/SKILL.md +384 -305
  51. package/claude/skills/sd-spec/references/example-spec.md +41 -64
  52. package/claude/skills/sd-unpack/SKILL.md +83 -83
  53. package/claude/skills/sd-use/SKILL.md +4 -4
  54. package/package.json +1 -1
  55. package/claude/output-styles/sd-tone.md +0 -152
  56. package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +0 -45
  57. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +0 -42
  58. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  59. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +0 -45
  60. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  61. package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +0 -75
  62. package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  63. package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +0 -45
  64. package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  65. package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +0 -13
  66. package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +0 -10
  67. package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +0 -11
  68. package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +0 -12
  69. package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +0 -13
  70. package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +0 -10
  71. package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +0 -11
  72. package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +0 -12
  73. package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +0 -13
  74. package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +0 -10
  75. package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +0 -11
  76. package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +0 -55
  77. package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +0 -55
  78. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +0 -22
  79. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +0 -57
  80. package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +0 -58
  81. package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +0 -52
  82. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.test.ts +0 -10
  83. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.ts +0 -11
  84. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/data-access//352/261/260/353/236/230/354/262/230-/354/240/221/352/267/274.ts +0 -12
  85. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/models//352/261/260/353/236/230/354/262/230.ts +0 -8
  86. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +0 -77
  87. package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  88. package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  89. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +0 -1
  90. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +0 -1
  91. package/claude/skills/sd-impl/references/spec-cross-check.md +0 -82
  92. package/claude/skills/sd-skill/evals/fixtures/with-existing-review/.claude/skills/review/SKILL.md +0 -14
  93. package/claude/skills/sd-skill/references/eval-authoring.md +0 -81
  94. package/claude/skills/sd-skill/references/eval-run.md +0 -32
  95. package/claude/skills/sd-skill/references/skill-authoring.md +0 -70
  96. /package/claude/skills/{sd-skill/evals/fixtures/empty → sd-dev/evals/fixtures/minimal-ts-pkg/src}/.gitkeep +0 -0
@@ -1,152 +0,0 @@
1
- ---
2
- name: sd-tone
3
- description: simplysm 워크스페이스 기본 톤·표현 규칙
4
- keep-coding-instructions: true
5
- ---
6
-
7
- # 톤·표현 규칙
8
-
9
- **적용**: 모든 응답 + 산출물(spec.md·문서·코드 주석 등 Write/Edit 본문).
10
-
11
- **자가 점검** (매 응답·Write/Edit 직전):
12
-
13
- - 압축 룰을 적용했는가?
14
- - 한국어 모국어 사용자가 한 번 읽고 흐름대로 이해되는가?
15
-
16
- ## 도메인 어휘로 풀이
17
-
18
- - 산출물 소비자의 도메인 어휘로 응답.
19
- - 시스템 내부 용어 회피.
20
- - 간결·명확.
21
- - 다음은 단독 노출 금지 — 옆에 의미 동반 또는 도메인 어휘·시나리오로 풀이:
22
- - 식별자 — 실제 의미를 옆에 표기 (원본 없이도 문장만으로 의미 전달):
23
- - 코드 심볼
24
- - 영문 변수명·함수명 (예: `surplus`·`isCompleted`·`joinSingle`)
25
- - 기술 약어 (API·DB 컬럼 축약 등)
26
- - 수식·계산식 (예: `(A − B) − C`) — 값 대입 시나리오 1건 동반
27
- - SQL·프레임워크·구현 용어 (예: "LEFT JOIN 깊이 1 자르기"·"subagent 위탁") — 도메인 흐름으로 풀이
28
- - "이해 못함"·"무슨 소리야" 피드백 시 같은 내용 반복 X. 도메인 시나리오로 재풀이.
29
-
30
- ## 내부 문서 거론 시
31
-
32
- **적용**: 사용자 응답 중 내부 문서 (룰·스킬·합의 산출물·참고 자료) 거론 시.
33
-
34
- **원칙**: 사용자는 *문서 역할* 만 인지, *문서 내부* 는 미인지.
35
-
36
- **경계**:
37
-
38
- - 면제 (문서 자체): 파일명·분류명
39
- - 풀이 (문서 내부): §·헤더·룰명·결정 단어·내부 식별자
40
-
41
- **풀이 형식**:
42
-
43
- - 의미·내용 1줄 동반 또는 도메인 시나리오로 풀이
44
- - 자가 점검 — "이 표현이 문서 내부를 가리키는가? 사용자 처음 보는가?"
45
-
46
- **❌ 위반 패턴**:
47
-
48
- - `<§·룰명·내부 식별자> 에 따라 X` — 식별자만 노출, 풀이 누락
49
-
50
- **✅ 정상 패턴**:
51
-
52
- - `<§·룰의 본질·의미> → X` — 의미를 일반어로 풀어쓰기
53
- - 필요 시 `(출처: <문서명>)` 짧게 부기
54
-
55
- ## 응답·산출물 표현
56
-
57
- **구조 선호** (산문체 회피·세로 정돈):
58
-
59
- - 2개 이상의 정보·예시·항목은 라벨/헤더 + bullet 으로. 줄글로 풀지 말 것.
60
- - 한 bullet 안 열거가 3개 이상이거나 한 줄이 시각적으로 길면 sub-bullet 으로 세로 분리.
61
- - 예외: 짧은 토큰(부연 없는 단어급)만의 묶음은 시각적 길이 기준만 적용.
62
- - 라벨/헤더 뒤 부연이 두 절(clause) 이상이면 bullet 으로 분리.
63
-
64
- **압축 룰**:
65
-
66
- - 어미·조사 압축 — "~할 수도 있을 것 같습니다" → "~ 가능"
67
- - 접속어 제거. 인과는 화살표 `X → Y` 로 표현. 예시 접속어:
68
- - 인과: 그래서·따라서
69
- - 대등·역접: 또한·하지만
70
- - 1단어 가능 시 1단어
71
- - preamble·sign-off 금지. 예시:
72
- - 인사
73
- - 작업 개시
74
- - 마무리
75
- - 키워드+기호 구조 권장 — `원인: X → Y` · `해결: Z`
76
- - 중복 bullet 병합
77
-
78
- **절대 보존** (압축·약어화·재서술 X):
79
-
80
- - 코드 심볼·함수명
81
- - API명·에러 문자열
82
- - URL·파일경로
83
- - 명령어
84
- - 기술 용어·고유명사
85
- - 날짜·버전
86
- - 숫자·환경변수
87
- - 사용자 발언 verbatim 인용
88
- - 도메인 어휘 (위 "도메인 어휘로 풀이" 룰)
89
- - 구조 (보존하고 안의 텍스트만 압축 룰 적용):
90
- - 헤딩
91
- - bullet 계층·numbered
92
- - 표·frontmatter
93
- - 질문 구조 `[맥락+선택지+추천+질문]`
94
-
95
- **압축 미적용 조건** (표준 톤 응답):
96
-
97
- - 보안 경고·되돌릴 수 없는 작업 컨펌
98
- - 다단계 시퀀스에서 압축이 오독 위험
99
- - 압축 자체가 기술 모호함 생성
100
-
101
- ## 한국어 가독성 가드
102
-
103
- 원칙:
104
-
105
- - 압축 강도 유지.
106
- - 영어 직역체로 인한 가독성 저하만 차단.
107
-
108
- **직역체 회피**:
109
-
110
- - 어순 — 한국어 SOV: 중요 정보·결론은 문장 뒤.
111
- - 수동태 — `X 가 Y 에 의해 Z 되었다` → `Y 가 X 를 Z 했다`.
112
- - 직역 패턴:
113
- - `~에 의해(서)` → 주어를 능동형으로
114
- - `~에 대하여`·`~에 관하여` → 생략 또는 `~을/를`
115
- - `~로부터` → `~에서`
116
- - `~을 통해` → `~로`·`~으로써`·동사로 풀이
117
- - `~에 있어` → `~에`·`~에서`
118
- - `~하기 위해` → `~하려고`·`~할`
119
- - `~로 인해` → `~때문에`
120
- - `~의 경우` (첫머리) → `~는/은`·생략
121
- - `X 를 가진`·`가지고 있다` → `X 가 있다`·`X 다`
122
- - `~하는 중이다` → 현재형
123
- - `~에도 불구하고` → `~지만`·`~인데도`
124
- - `위치하다` → `있다`
125
-
126
- **남용 회피**:
127
-
128
- - 대명사 (그·그것·그녀·그들) — 명사 반복 또는 생략
129
- - 복수 표지 `들` — 한국어는 단수형으로 다수 표현 가능
130
- - `의` — 띄어쓰기 가능 시 생략
131
-
132
- **허용**:
133
-
134
- - 일상 한국어 단어 — 일상에 정착한 압축어(예: `비추`) 포함
135
- - 명사구 종결 — 압축 일관성 유지
136
-
137
- ## ASCII 그림
138
-
139
- 적용 대상 — 모든 ASCII 그림:
140
-
141
- - 다이어그램
142
- - 구성도
143
- - 와이어프레임 등
144
-
145
- 룰:
146
-
147
- - 이모지(✏ ☐ ❌ ⭐ ♥ 등) 금지 — 렌더러별 1칸/2칸 변동 → 정렬 깨짐.
148
- - 그 외 폭 안정 문자 허용:
149
- - ASCII·한글
150
- - 박스 라인 ┌─┐ │ └┘ ├┤
151
- - 도형 ▲ ▼ ► ◄
152
- - 화살표 ← → ↑ ↓
@@ -1,45 +0,0 @@
1
- # 창고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적
6
-
7
- 창고 입출고 및 기준정보를 관리한다.
8
-
9
- ## 4. 화면
10
-
11
- | § | 분류 | 화면 | 유형 | 장치 |
12
- | --- | -------- | ------------- | ------ | ---- |
13
- | 4.1 | 기준정보 | Item Register | 마스터 | PC |
14
-
15
- ### 4.1 Item Register (PC) [확정: 2026-05-13]
16
-
17
- Actor: Warehouse Manager
18
-
19
- 기능 개요:
20
-
21
- - Register and edit items.
22
-
23
- 와이어프레임:
24
-
25
- ```
26
- ┌──────────────────────────┐
27
- │ Code [ ] │
28
- │ Name [ ] │
29
- │ [Save] [Cancel] │
30
- └──────────────────────────┘
31
- ```
32
-
33
- 항목:
34
-
35
- **입력 폼**
36
-
37
- | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
38
- | ---- | ------ | ---- | ---------------- | ---- |
39
- | Code | 텍스트 | O | [모델.Item.code] | - |
40
- | Name | 텍스트 | O | [모델.Item.name] | - |
41
-
42
- 동작:
43
-
44
- - [Save]: Save the form.
45
- - [Cancel]: Reset the form.
@@ -1,42 +0,0 @@
1
- # 창고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적
6
-
7
- 창고 입출고 및 기준정보를 관리한다.
8
-
9
- ## 4. 화면
10
-
11
- | § | 분류 | 화면 | 유형 | 장치 |
12
- | --- | ---- | --------- | ---- | ---- |
13
- | 4.1 | 메인 | Dashboard | 조회 | PC |
14
-
15
- ### 4.1 Dashboard (PC) [확정: 2026-05-13]
16
-
17
- Actor: Warehouse Manager
18
-
19
- 기능 개요:
20
-
21
- - Show warehouse summary.
22
-
23
- 와이어프레임:
24
-
25
- ```
26
- ┌──────────────────────────┐
27
- │ Total stock: ____ │
28
- │ [Refresh] │
29
- └──────────────────────────┘
30
- ```
31
-
32
- 항목:
33
-
34
- **입력 폼**
35
-
36
- | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
37
- | ----------- | ---- | ---- | ----------- | -------------------- |
38
- | Total stock | 숫자 | X | - | 표시 전용 (readonly) |
39
-
40
- 동작:
41
-
42
- - [Refresh]: Refresh data.
@@ -1,33 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- signal,
6
- } from "@angular/core";
7
- import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
-
9
- @Component({
10
- selector: "app-dashboard-view",
11
- standalone: true,
12
- changeDetection: ChangeDetectionStrategy.OnPush,
13
- encapsulation: ViewEncapsulation.None,
14
- imports: [SdBaseContainer],
15
- template: `
16
- <sd-base-container
17
- [(ready)]="ready"
18
- [initialized]="initialized()"
19
- [(busyCount)]="busyCount"
20
- [viewType]="viewType()"
21
- >
22
- <ng-template #contentTpl>
23
- <div class="p-default">Existing Dashboard - manually edited</div>
24
- </ng-template>
25
- </sd-base-container>
26
- `,
27
- })
28
- export class DashboardView {
29
- ready = signal(false);
30
- initialized = signal(true);
31
- busyCount = signal(0);
32
- viewType = injectViewTypeSignal();
33
- }
@@ -1,45 +0,0 @@
1
- # 창고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적
6
-
7
- 창고 입출고 및 기준정보를 관리한다.
8
-
9
- ## 4. 화면
10
-
11
- | § | 분류 | 화면 | 유형 | 장치 |
12
- | --- | -------- | --------------- | ------ | ---- |
13
- | 4.1 | 기준정보 | Location Master | 마스터 | PC |
14
-
15
- ### 4.1 Location Master (PC) [확정: 2026-05-13]
16
-
17
- Actor: Warehouse Admin
18
-
19
- 기능 개요:
20
-
21
- - 창고 로케이션 마스터를 관리한다 (등록·수정·삭제·복구·엑셀 입출력 포함 표준 마스터 화면).
22
-
23
- 와이어프레임:
24
-
25
- ```
26
- [등록] [선택 삭제] [선택 복구] [엑셀 업로드] [엑셀 다운로드]
27
- | [ ] | ID | 코드 | 이름 |
28
- | [ ] | [E 2] | L-02 | 2층 창고 |
29
- | [ ] | [E 1] | L-01 | 1층 창고 |
30
- ```
31
-
32
- 범례: `[ ]` = 행 선택 체크박스, `[E N]` = 편집 버튼 (N = ID). 클릭 시 인라인 편집.
33
-
34
- 항목:
35
-
36
- **시트 컬럼**
37
-
38
- | 컬럼 | 종류 | 도메인 매핑 | 비고 |
39
- | ---- | ------ | -------------------- | ---- |
40
- | 코드 | 텍스트 | [모델.Location.code] | - |
41
- | 이름 | 텍스트 | [모델.Location.name] | - |
42
-
43
- 동작:
44
-
45
- - 표준 마스터 동작 (등록·선택 삭제·선택 복구·엑셀 업/다운로드·ID 편집 클릭 시 인라인 편집).
@@ -1,33 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- signal,
6
- } from "@angular/core";
7
- import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
-
9
- @Component({
10
- selector: "app-dashboard-view",
11
- standalone: true,
12
- changeDetection: ChangeDetectionStrategy.OnPush,
13
- encapsulation: ViewEncapsulation.None,
14
- imports: [SdBaseContainer],
15
- template: `
16
- <sd-base-container
17
- [(ready)]="ready"
18
- [initialized]="initialized()"
19
- [(busyCount)]="busyCount"
20
- [viewType]="viewType()"
21
- >
22
- <ng-template #contentTpl>
23
- <div class="p-default">대시보드</div>
24
- </ng-template>
25
- </sd-base-container>
26
- `,
27
- })
28
- export class DashboardView {
29
- ready = signal(false);
30
- initialized = signal(true);
31
- busyCount = signal(0);
32
- viewType = injectViewTypeSignal();
33
- }
@@ -1,75 +0,0 @@
1
- # 창고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적
6
-
7
- 창고 입출고 및 기준정보를 관리한다.
8
-
9
- ## 4. 화면
10
-
11
- | § | 분류 | 화면 | 유형 | 장치 |
12
- | --- | -------- | --------------- | -------- | ---- |
13
- | 4.1 | 기준정보 | Item List | 조회 | PC |
14
- | 4.2 | 기준정보 | Item Edit Modal | 트랜잭션 | PC |
15
-
16
- ### 4.1 Item List (PC) [확정: 2026-05-13]
17
-
18
- Actor: Warehouse Manager
19
-
20
- 기능 개요:
21
-
22
- - Browse items registered in the warehouse.
23
-
24
- 와이어프레임:
25
-
26
- ```
27
- [Register]
28
- | Code | Name | Edit |
29
- ```
30
-
31
- 항목:
32
-
33
- **시트 컬럼**
34
-
35
- | 컬럼 | 종류 | 도메인 매핑 | 비고 |
36
- | ---- | ------ | ---------------- | ---- |
37
- | Code | 텍스트 | [모델.Item.code] | - |
38
- | Name | 텍스트 | [모델.Item.name] | - |
39
-
40
- 동작:
41
-
42
- - [Register]: → [화면.Item Edit Modal] 을 모달로 띄움.
43
- - [Edit] (행 버튼): → [화면.Item Edit Modal] 을 모달로 띄움.
44
-
45
- ### 4.2 Item Edit Modal (PC) [확정: 2026-05-13]
46
-
47
- Actor: Warehouse Manager
48
-
49
- 기능 개요:
50
-
51
- - Create or edit an item via modal.
52
-
53
- 와이어프레임:
54
-
55
- ```
56
- ┌──────────────────────────┐
57
- │ Code [ ] │
58
- │ Name [ ] │
59
- │ [Save] [Cancel] │
60
- └──────────────────────────┘
61
- ```
62
-
63
- 항목:
64
-
65
- **입력 폼**
66
-
67
- | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
68
- | ---- | ------ | ---- | ---------------- | ---- |
69
- | Code | 텍스트 | O | [모델.Item.code] | - |
70
- | Name | 텍스트 | O | [모델.Item.name] | - |
71
-
72
- 동작:
73
-
74
- - [Save]: Save and close the modal.
75
- - [Cancel]: Close without saving.
@@ -1,33 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- signal,
6
- } from "@angular/core";
7
- import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
-
9
- @Component({
10
- selector: "app-dashboard-view",
11
- standalone: true,
12
- changeDetection: ChangeDetectionStrategy.OnPush,
13
- encapsulation: ViewEncapsulation.None,
14
- imports: [SdBaseContainer],
15
- template: `
16
- <sd-base-container
17
- [(ready)]="ready"
18
- [initialized]="initialized()"
19
- [(busyCount)]="busyCount"
20
- [viewType]="viewType()"
21
- >
22
- <ng-template #contentTpl>
23
- <div class="p-default">대시보드</div>
24
- </ng-template>
25
- </sd-base-container>
26
- `,
27
- })
28
- export class DashboardView {
29
- ready = signal(false);
30
- initialized = signal(true);
31
- busyCount = signal(0);
32
- viewType = injectViewTypeSignal();
33
- }
@@ -1,45 +0,0 @@
1
- # 창고 관리 요구 분석서
2
-
3
- ## 1. 개요
4
-
5
- ### 1.1 핵심 목적
6
-
7
- 창고 입출고 및 기준정보를 관리한다.
8
-
9
- ## 4. 화면
10
-
11
- | § | 분류 | 화면 | 유형 | 장치 |
12
- | --- | -------- | ------------- | ------ | ---- |
13
- | 4.1 | 기준정보 | Item Register | 마스터 | PC |
14
-
15
- ### 4.1 Item Register (PC) [확정: 2026-05-13]
16
-
17
- Actor: Warehouse Manager
18
-
19
- 기능 개요:
20
-
21
- - Register and edit items.
22
-
23
- 와이어프레임:
24
-
25
- ```
26
- ┌──────────────────────────┐
27
- │ Code [ ] │
28
- │ Name [ ] │
29
- │ [Save] [Cancel] │
30
- └──────────────────────────┘
31
- ```
32
-
33
- 항목:
34
-
35
- **입력 폼**
36
-
37
- | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
38
- | ---- | ------ | ---- | ---------------- | ---- |
39
- | Code | 텍스트 | O | [모델.Item.code] | - |
40
- | Name | 텍스트 | O | [모델.Item.name] | - |
41
-
42
- 동작:
43
-
44
- - [Save]: Save the form.
45
- - [Cancel]: Reset the form.
@@ -1,33 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- signal,
6
- } from "@angular/core";
7
- import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
8
-
9
- @Component({
10
- selector: "app-dashboard-view",
11
- standalone: true,
12
- changeDetection: ChangeDetectionStrategy.OnPush,
13
- encapsulation: ViewEncapsulation.None,
14
- imports: [SdBaseContainer],
15
- template: `
16
- <sd-base-container
17
- [(ready)]="ready"
18
- [initialized]="initialized()"
19
- [(busyCount)]="busyCount"
20
- [viewType]="viewType()"
21
- >
22
- <ng-template #contentTpl>
23
- <div class="p-default">대시보드</div>
24
- </ng-template>
25
- </sd-base-container>
26
- `,
27
- })
28
- export class DashboardView {
29
- ready = signal(false);
30
- initialized = signal(true);
31
- busyCount = signal(0);
32
- viewType = injectViewTypeSignal();
33
- }
@@ -1,13 +0,0 @@
1
- {
2
- "name": "sd-dev-eval-fixture",
3
- "version": "0.0.0",
4
- "type": "module",
5
- "scripts": {
6
- "test": "vitest run"
7
- },
8
- "devDependencies": {
9
- "@types/node": "^20.0.0",
10
- "typescript": "^5.4.0",
11
- "vitest": "^2.0.0"
12
- }
13
- }
@@ -1,10 +0,0 @@
1
- export function toCamelCase(input: string): string {
2
- return input
3
- .split(/[-_]/)
4
- .map((part, i) =>
5
- i === 0
6
- ? part.toLowerCase()
7
- : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(),
8
- )
9
- .join("");
10
- }
@@ -1,11 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { toCamelCase } from "../src/index.js";
3
-
4
- describe("toCamelCase", () => {
5
- it("converts kebab-case to camelCase", () => {
6
- expect(toCamelCase("foo-bar")).toBe("fooBar");
7
- });
8
- it("converts snake_case to camelCase", () => {
9
- expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
- });
11
- });
@@ -1,12 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "Bundler",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "verbatimModuleSyntax": true
10
- },
11
- "include": ["src/**/*", "tests/**/*"]
12
- }
@@ -1,13 +0,0 @@
1
- {
2
- "name": "sd-dev-eval-fixture",
3
- "version": "0.0.0",
4
- "type": "module",
5
- "scripts": {
6
- "test": "vitest run"
7
- },
8
- "devDependencies": {
9
- "@types/node": "^20.0.0",
10
- "typescript": "^5.4.0",
11
- "vitest": "^2.0.0"
12
- }
13
- }
@@ -1,10 +0,0 @@
1
- export function toCamelCase(input: string): string {
2
- const parts = input.split(/[-_]/).filter(Boolean);
3
- return (
4
- parts[0].toLowerCase() +
5
- parts
6
- .slice(1)
7
- .map((p) => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase())
8
- .join("")
9
- );
10
- }
@@ -1,11 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { toCamelCase } from "../src/index.js";
3
-
4
- describe("toCamelCase", () => {
5
- it("converts kebab-case to camelCase", () => {
6
- expect(toCamelCase("foo-bar")).toBe("fooBar");
7
- });
8
- it("converts snake_case to camelCase", () => {
9
- expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
- });
11
- });
@@ -1,12 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "Bundler",
6
- "strict": true,
7
- "esModuleInterop": true,
8
- "skipLibCheck": true,
9
- "verbatimModuleSyntax": true
10
- },
11
- "include": ["src/**/*", "tests/**/*"]
12
- }
@@ -1,13 +0,0 @@
1
- {
2
- "name": "sd-dev-eval-fixture",
3
- "version": "0.0.0",
4
- "type": "module",
5
- "scripts": {
6
- "test": "vitest run"
7
- },
8
- "devDependencies": {
9
- "@types/node": "^20.0.0",
10
- "typescript": "^5.4.0",
11
- "vitest": "^2.0.0"
12
- }
13
- }
@@ -1,10 +0,0 @@
1
- export function toCamelCase(input: string): string {
2
- return input
3
- .split(/[-_]/)
4
- .map((part, i) =>
5
- i === 0
6
- ? part.toLowerCase()
7
- : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase(),
8
- )
9
- .join("");
10
- }
@@ -1,11 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { toCamelCase } from "../src/index.js";
3
-
4
- describe("toCamelCase", () => {
5
- it("converts kebab-case to camelCase", () => {
6
- expect(toCamelCase("foo-bar")).toBe("fooBar");
7
- });
8
- it("converts snake_case to camelCase", () => {
9
- expect(toCamelCase("foo_bar_baz")).toBe("fooBarBaz");
10
- });
11
- });