@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,121 +1,150 @@
1
1
  ---
2
2
  name: sd-impl
3
- description: spec.md 의 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를 현재 코드베이스 상태와 비교해 차이만큼 풀 구현(테스트·시연 포함)한다. Use when "화면 풀 구현", "데모를 실 구현으로", "화면 실가동", "자동 처리 풀 구현", "횡단 처리 풀 구현" 을 요청할 때.
3
+ description: spec.md 의 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를 현재 코드베이스 상태와 비교해 차이만큼 풀 구현(테스트·시연 포함). Use when "화면 풀 구현", "데모를 실 구현으로", "화면 실가동", "자동 처리 풀 구현", "횡단 처리 풀 구현" 을 요청할 때.
4
4
  ---
5
5
 
6
6
  # sd-impl
7
7
 
8
- spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를 현재 코드베이스 상태와 비교해 빠지거나 어긋난 부분만큼 풀 구현한다. 데모 골격이 있으면 보존. 신규/갱신 무관 동일 워크플로. 끝에 사용자 시연으로 회귀를 잡는다.
8
+ spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를 현재 코드베이스 상태와 비교해 빠지거나 어긋난 부분만큼 풀 구현함. 데모 골격이 있으면 보존. 끝에 사용자 시연으로 회귀를 잡음.
9
9
 
10
- ## 본질
10
+ 호출 시나리오 2종 — 동일 워크플로:
11
11
 
12
- - **차이만 작업**: spec 항목 1개당 (없음 / 불일치 / 일치) 판정. 일치 항목은 손대지 않는다.
13
- - **YAGNI**: spec 없는 기능·옵션·추상화 추가 금지.
14
- - **임의 채움 금지**: spec 본문에 명시 없거나 모호한 분기를 발견하면 즉시 멈추고 사용자에게 질문. 자체 판단으로 채우지 않는다. 신규/갱신 무관.
15
- - **환경 무관**: framework 처방을 본문에 박지 않는다. 코드베이스 매뉴얼·기준 단위 + 계층별 보강 패턴·테스트 환경은 발견되면 따르고, 없으면 표준 패턴.
12
+ - **신규**: spec 단위가 코드베이스에 아직 없음 처음 구현.
13
+ - **갱신**: spec 단위가 이미 구현되어 있고 spec 변경분에 맞춰 수정.
14
+
15
+ ## 본질 (횡단 룰)
16
+
17
+ 워크플로 전 단계 적용:
18
+
19
+ - **임의 채움 금지**: spec 본문에 명시 없거나 모호한 분기를 발견하면 즉시 멈추고 사용자에게 질문. 자체 판단으로 채우지 않음.
20
+ - **사용자 보고 어휘**: 사용자 보고에 코드 식별자(변수명·SQL 함수명·타입 키워드 등) 노출 금지. 도메인 어휘로 풀어 보고.
16
21
 
17
22
  ## 워크플로
18
23
 
19
24
  ### 1단계: 입력 확보
20
25
 
21
- - 대상 spec.md 경로
22
- - 구현할 단위 식별자 — `§4.x` (화면) / `§5.x` (자동 처리) / `§6.x` (횡단 처리)
26
+ - 대상 spec.md 경로.
27
+ - 구현할 단위 식별자 — `§4.x` (화면) / `§5.x` (자동 처리) / `§6.x` (횡단 처리).
23
28
 
24
29
  없으면 묻기. spec.md 에 식별자 매칭이 안 되면 §4 화면 목록 표 / §5 자동 처리 / §6 횡단 처리 헤더 목록에서 후보 제시 후 확정.
25
30
 
26
- ### 2단계: 외부 입력 점검 (BLOCKING)
31
+ ### 2단계: 외부 입력 점검
27
32
 
28
33
  작업 대상 §4.x/§5.x/§6.x 와 그가 참조하는 §5/§6/§7/§8/§9 항목 점검:
29
34
 
30
- - **헤더 `[OPEN: 날짜]` 섹션**: 본문이 재분석 포인터일 뿐 임의안 부재 → sd-impl 해소 불가. 사용자 보고 후 **종료**. 사용자가 sd-spec 으로 확정 받은 뒤 sd-impl 재호출.
31
- - **본문 인라인 `[OPEN]`**: `sd-base-rules` "결정 근거" 적용 근거 없으면 1건씩 질문. 답변 후 즉시 spec.md 반영 다음 건. 결정이 다른 섹션의 구조 변경(필드 추가, 새 규칙 항목 등)을 요구하면 헤더 OPEN 과 동일 처리: 종료 + sd-spec 재호출. 종료 전 식별·보고:
32
- - sd-spec 넘길 변경 항목 위치 + 변경 내용)
33
- - 변경이 영향 미치는 **다른 §4.x/§5.x/§6.x 단위 목록** 구조 변경된 §5/§6/§7/§8/§9 항목을 spec 에서 역인용해 수집
34
- - 영향 단위 중 이미 구현된 것 / 미구현인 것 구분
35
- - **사용자 제공 예정 자료**: spec 본문에 "사용자 제공 예정" 류로 적힌 파일·값. 사용자 회신 후 진행.
36
- - **묵시적 모호**: 명시 마커 없지만 spec 본문이 분기·정의·정의식·경계 케이스를 다루지 않는 부분. 4단계 분해 표 작성 중 발견될 가능성 높음. 발견 시 본 단계로 회귀해 인라인 `[OPEN]` 절차 적용.
35
+ - **헤더 `[OPEN: 날짜]` 섹션**: 본문이 재분석 포인터일 뿐 임의안 부재 → "spec 수정 절차" 적용.
36
+ - **본문 인라인 `[OPEN]`**: 결정 근거 있으면 결정. 없으면 1건씩 질문 답변 후 "spec 수정 절차" 적용.
37
+ - **사용자 제공 예정 자료**: spec 본문에 사용자 회신 대기로 적힌 자료. 사용자 회신 후 진행.
38
+ - **묵시적 모호**: 명시 마커 없지만 spec 본문이 분기·정의·정의식·경계 케이스를 다루지 않는 부분. 4단계 분해 발견 가능성 높음. 발견 단계로 회귀.
39
+
40
+ #### spec 수정 절차
41
+
42
+ spec 본문 수정이 필요한 경우(인라인 `[OPEN]` 해소·헤더 `[OPEN]` 해소·구조 변경·6단계 (b)(d) 분류 처리 등) 메인 LLM 이 직접 처리:
43
+
44
+ 1. **sd-spec SKILL.md Read** — 룰 인지 (임의안 작성 사이클·헤더 마커 형식·관련 섹션·의존 식별 룰).
45
+ 2. **임의안 → "맞나요?" → 확정 → spec.md Edit** (sd-spec 사이클 적용).
46
+ 3. **의존 식별** — 수정된 § 항목이 의존인 §4.x/§5.x/§6.x 탐색 (sd-spec "의존 식별" 룰). 본 작업 단위 본인은 제외 (작업 중).
47
+ 4. **마커 제거** — 의존 §4.x/§5.x/§6.x 헤더의 `, 구현: YYYY-MM-DD` 부분만 제거 (이전 구현 무효화).
48
+ - 영향 단위 번호 매겨 사용자에게 모아 "맞나요?" — 전체 동의 → 일괄 제거 / 일부 유지 지목 → 지목 항목 마커 유지.
49
+
50
+ 본 작업 단위(§4.x/§5.x/§6.x 본인) 의 헤더 `[확정]` 은 9단계에서 `[확정, 구현]` 으로 확장.
37
51
 
38
52
  ### 3단계: 보조 자료 수집 (있다면 활용)
39
53
 
40
- 부재로 워크플로를 멈추지 않는다.
54
+ 부재로 워크플로를 멈추지 않음. framework 처방은 본 SKILL.md 본문에 박지 않음 — 코드베이스 매뉴얼·기준 단위·테스트 환경을 발견되면 따르고, 부재 시 framework 자체 표준(Angular CLI 기본 구조·esbuild 기본 옵션 등) 채움 가능. 도메인 결정·분기·계산식 등 spec 결정 사항은 본질 "임의 채움 금지" 적용.
41
55
 
42
- **A. 라이브러리/개발 매뉴얼**
56
+ #### A. 라이브러리·개발 매뉴얼
43
57
 
44
- - `@simplysm/*` 14.x — [.claude/references/sd-simplysm14/README.md](../../references/sd-simplysm14/README.md) Read 후 "개발 매뉴얼" 진입.
45
- - 그 외 framework — 코드베이스 안의 동등 위치 문서 Read.
46
- - 없으면 표준 패턴.
58
+ - `@simplysm/*` 14.x — [.claude/references/sd-simplysm14/README.md](../../references/sd-simplysm14/README.md) 참조 후 "개발 매뉴얼" 진입.
59
+ - 그 외 framework — 코드베이스 안의 동등 위치 문서 참조.
47
60
 
48
- **B. 기준 단위 + 계층별 보강**
61
+ #### B. 기준 단위 + 계층별 보강
49
62
 
50
- 풀 구현은 다층 흐름이 한 줄로 가야 일관성이 유지된다. 답습 단위 1개를 통째 답습하는 모델이 아니라, 기준 단위 1개를 잡고 비어있거나 부적합한 계층만 다른 단위에서 보강한다. 계층 간 의존성(모델 → 데이터 접근 → 본체 → 테스트)을 끊지 않으면서, 기준 단위에 부재한 계층의 LLM 단독 처방을 막는다.
63
+ 풀 구현은 다층 흐름이 한 줄로 가야 일관성이 유지됨. 답습 단위 1개를 통째 답습하는 모델이 아니라, 기준 단위 1개를 잡고 비어있거나 부적합한 계층만 다른 단위에서 보강함.
51
64
 
52
- **4계층**: 도메인 모델 / 데이터 접근 / 본체(§4.x = 화면 컴포넌트, §5.x = 자동 처리 로직 + 트리거, §6.x = 횡단 처리 로직 + 부수효과 후크) / 테스트.
65
+ **4계층**:
53
66
 
54
- **B-1. 기준 단위 선정** (같은 종류 §4.x↔§4.x, §5.x↔§5.x, §6.x↔§6.x 안에서):
67
+ | 계층 | §4.x (화면) | §5.x (자동 처리) | §6.x (횡단 처리) |
68
+ | ----------- | ------------- | ----------------------- | ------------------------------ |
69
+ | 도메인 모델 | 엔티티·필드 | 동일 | 동일 |
70
+ | 데이터 접근 | 쿼리·서비스 | 동일 | 동일 |
71
+ | 본체 | 화면 컴포넌트 | 자동 처리 로직 + 트리거 | 횡단 처리 로직 + 부수효과 후크 |
72
+ | 테스트 | 단위 테스트 | 동일 | 동일 |
55
73
 
56
- 1. 도메인/sub-app 인접 풀구현 단위 후보 Glob 탐색.
57
- 2. 1개 → 자동 채택. 2개 이상 → 후보 목록 제시 후 사용자 1회 질문. 0개 → 같은 종류 전 범위로 확장 후 동일 규칙.
58
- 3. 전 범위에도 0개 → 기준 단위 없이 매뉴얼(3-A) + 표준 패턴.
74
+ **기준 단위 선정** (같은 종류 §4.x↔§4.x, §5.x↔§5.x, §6.x↔§6.x 안에서):
59
75
 
60
- **B-2. 계층별 보강**:
76
+ 1. 도메인 인접 풀구현 단위 후보 탐색 (인접 도메인 정의는 sd-spec §4 화면 목록 분류·코드베이스 구조 등 자유 도출).
77
+ 2. 1개 → 자동 채택. 2개 이상 → 후보 목록 제시 후 사용자 1회 질문. 0개 → 같은 종류 전 범위로 확장 후 동일 규칙.
78
+ 3. 전 범위에도 0개 → 기준 단위 없이 매뉴얼(A) + framework 자체 표준.
61
79
 
62
- 기준 단위의 4계층 각각을 (비어있음 / 부적합 / 적합) 으로 평가:
80
+ **계층별 보강**: 기준 단위의 4계층 각각을 평가:
63
81
 
64
- - 비어있음: 해당 계층 파일이 기준 단위에 없음 (예: 테스트 없음).
65
- - 부적합: 있지만 spec 요구와 어긋남 (예: 단일 테이블 접근인데 spec 은 조인 요구).
66
- - 적합: 그대로 답습.
82
+ | 평가 | 의미 | 처리 |
83
+ | -------- | --------------------------------- | ----------------------------------------- |
84
+ | 비어있음 | 해당 계층 파일이 기준 단위에 없음 | 같은 종류 다른 단위에서 그 계층 패턴 답습 |
85
+ | 부적합 | 있지만 spec 요구와 어긋남 | 같은 종류 다른 단위에서 그 계층 패턴 답습 |
86
+ | 적합 | 그대로 답습 | 변경 없이 사용 |
67
87
 
68
- 비어있음·부적합 계층은 같은 종류 다른 단위에서 그 계층만 발췌해 다수 반복 패턴 자동 채택. 1회만 쓰인 변종은 배제. 다수 패턴이 갈리면 사용자 1회 질문.
88
+ 비어있음·부적합 계층은 2회 이상 반복된 패턴 자동 채택. 1회만 쓰인 변종은 배제. 다수 패턴이 갈리면 사용자 1회 질문.
69
89
 
70
- **B-3. Read**: 기준 단위의 적합 계층 파일 + 보강 출처 파일을 모두 Read. 7단계 정합 점검 입력.
90
+ **읽기**: 기준 단위의 적합 계층 파일 + 보강 출처 파일을 모두 읽기. 7단계 정합 점검 입력.
71
91
 
72
- **C. 테스트 환경**
92
+ #### C. 테스트 환경
73
93
 
74
- 단위 테스트 프로젝트 구분·실행 명령·mocking 패턴·dev 서버 실행 명령 파악. 없으면 표준 조합.
94
+ 단위 테스트 프로젝트 구분·실행 명령·mocking 패턴·dev 서버 실행 명령 파악. 부재 시 framework 자체 표준 조합.
75
95
 
76
96
  ### 4단계: spec 분해 표
77
97
 
78
- 대상 §4.x/§5.x/§6.x 와 참조 §5/§6/§7/§8/§9 본문을 **항목 단위까지 분해**해 표 작성. 표는 assistant 응답으로 출력 (이후 5·6단계 입력).
98
+ 대상 §4.x/§5.x/§6.x 와 참조 §5/§6/§7/§8/§9 본문을 **항목 단위까지 분해**해 표 작성. 표는 assistant 응답으로 출력 (이후 5·6단계 입력). 일치 항목은 손대지 않음(차이만 작업).
79
99
 
80
- | 항목 | spec 인용 | 현재 코드 상태 | 판정 | 매핑 파일 | 의존 |
81
- | ---- | --------- | -------------- | ---- | --------- | ---- |
100
+ **예시** (재고관리 도메인, 박스 입고 화면 §4.1 일부):
82
101
 
83
- **항목 분해 단위:**
102
+ | 항목 ID | spec 인용 | 현재 코드 상태 | 판정 | 매핑 파일 | 의존 |
103
+ | ------- | ------------------------------------------ | ---------------- | ------ | -------------------------------------------------- | ---- |
104
+ | 1 | §4.1 항목 "박스 바코드" (필수·문자열·24자) | 없음 | 없음 | packages/app/src/screens/incoming/box-form.view.ts | - |
105
+ | 2 | §4.1 동작 "스캔: 바코드 검증·박스 등록" | 있음 (검증 누락) | 불일치 | (동일) | 1 |
84
106
 
85
- - 도메인 모델: 필드 1개당 1줄 (타입·제약·기본값)
86
- - 계산식: 정의식 1개당 1줄 (좌변·우변·참조)
87
- - 상태값·분기: 케이스 1개당 1줄 (조건·결과)
88
- - UI 항목: 컬럼·필드·버튼 1개당 1줄
89
- - 동작·자동 처리: 트리거·결과 단위 1줄
107
+ **항목 분해 단위**:
90
108
 
91
- **컬럼:**
109
+ - 도메인 모델: 필드 1개당 1줄 (타입·제약·기본값).
110
+ - 계산식: 정의식 1개당 1줄 (좌변·우변·참조).
111
+ - 상태값·분기: 케이스 1개당 1줄 (조건·결과).
112
+ - UI 항목: 컬럼·필드·버튼 1개당 1줄.
113
+ - 동작·자동 처리: 트리거·결과 단위 1줄.
92
114
 
93
- - **항목**: 분해 단위 1개의 짧은 식별자
94
- - **spec 인용**: spec.md 의 § 위치 + 본문 문구를 그대로
95
- - **현재 코드 상태**: 코드베이스 조사 결과 사실. 신규 호출은 "없음", 갱신 호출은 "있음(어떻게)". 조사는 워킹트리 파일 Read·Grep·Glob 만. **git 호출(`status`/`diff`/`log`/`show`/`blame` 등) 금지** — 갱신 호출이라도 현재 워킹트리 자체가 진실 원천이며, git 으로 변경분만 훑으면 일관성을 놓침 (sd-base-rules "분석 작업" 참조).
96
- - **판정**: 없음 / 불일치(차이) / 일치
97
- - **매핑 파일**: 이 항목이 작성·갱신될 파일 경로
98
- - **의존**: 다른 항목 ID
115
+ **컬럼**:
99
116
 
100
- 분해 spec 본문이 정의·정의식·분기·경계 케이스를 다루지 않거나 모순되는 부분 발견 → 2단계 회귀.
117
+ - **항목 ID**: 1, 2 ... (이후 의존 컬럼 참조용. 형식 자유).
118
+ - **spec 인용**: spec.md § 위치 + 본문 문구.
119
+ - **현재 코드 상태**: 코드베이스 조사 결과 사실. 신규 = "없음", 갱신 = "있음(어떻게)". 조사는 워킹트리 파일 Read·Grep·Glob 만. 갱신 호출도 동일.
120
+ - **판정**: 없음 / 불일치 / 일치.
121
+ - **매핑 파일**: 이 항목이 작성·갱신될 파일 경로.
122
+ - **의존**: 다른 항목 ID.
123
+
124
+ 분해 중 spec 본문이 정의·정의식·분기·경계 케이스를 다루지 않거나 모순되는 부분 발견 → 2단계 회귀("spec 수정 절차" 적용).
101
125
 
102
126
  표 작성 완료 후 5단계 진입.
103
127
 
104
128
  ### 5단계: 작업 사이클
105
129
 
106
- 표의 (없음·불일치) 항목만 의존 순서로 진행. 일치 항목은 손대지 않는다.
130
+ 표의 (없음·불일치) 항목만 의존 순서로 진행 (차이만 작업). 일치 항목은 손대지 않음.
131
+
132
+ **데모 골격 보존**: 작업 대상 매핑 파일이 데모 골격(sd-demo 산출물)이면 골격 구조 유지하며 차이만 보강.
107
133
 
108
134
  각 항목 시작 시 **테스트 작성 가능 여부** 판정 (3-C 의 테스트 환경 이용):
109
135
 
110
- - **테스트 가능** 입출력 명확 + 외부 의존 통제 가능 (도메인 로직·계산·변환·서버 함수·데이터 접근).
111
- 사이클: **RED GREEN REFACTOR**
112
- - **RED**: 테스트만 작성 러너 실행실패 확인. **구현 파일 손대지 않음.**
113
- - **GREEN**: 테스트 통과하는 **최소** 구현 → 러너 통과 확인.
114
- - **REFACTOR**: 중복·가독성·기존 패턴 정합 정리 → 러너 통과 유지. 정리할 게 없으면 스킵.
115
- - **테스트 불가/비효율** — UI 시각·인터랙션, 외부 서비스 실호출, 환경 의존.
116
- 사이클: **구현 → REFACTOR**
136
+ | 분류 | 적용 대상 | 사이클 |
137
+ | ------------------ | --------------------------------------------- | ---------------------- |
138
+ | 테스트 가능 | 도메인 로직·계산·변환·서버 함수·데이터 접근 | RED GREEN REFACTOR |
139
+ | 테스트 불가·비효율 | UI 시각·인터랙션·외부 서비스 실호출·환경 의존 | 구현 → REFACTOR |
140
+
141
+ **사이클 단계 정의**:
117
142
 
118
- **임의 채움 금지**: 작업 사이클 spec 미정의/모호 분기 만나면 즉시 멈추고 2단계 회귀. 자체 판단으로 채우지 않는다.
143
+ - **RED**: 테스트만 작성 러너 실행 실패 확인. **구현 파일 손대지 않음.**
144
+ - **GREEN**: 테스트 통과하는 **최소** 구현 → 러너 통과 확인.
145
+ - **REFACTOR**: 중복·가독성·기존 패턴 정합 정리 → 러너 통과 유지. 정리할 게 없으면 스킵.
146
+
147
+ 작업 사이클 중 spec 미정의·모호 분기 만나면 2단계 회귀.
119
148
 
120
149
  ### 6단계: spec 대조 (subagent 위탁)
121
150
 
@@ -123,18 +152,87 @@ spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를
123
152
 
124
153
  **대조는 단위 전체 대상.** 신규/갱신 무관, "이번 변경분만" 스코프 제한 없음.
125
154
 
126
- 상세 (subagent 호출 형식, 입력 패키지, 4분류 출력 스키마, 분류별 처리): [references/spec-cross-check.md](references/spec-cross-check.md) Read 후 진행.
155
+ #### subagent 호출
156
+
157
+ - 도구: `Agent`.
158
+ - `subagent_type`: `general-purpose` (추론·도메인 어휘 풀어 보고 필요해 read-only 에이전트 X).
159
+ - `description`: `sd-impl spec 대조`.
160
+ - `prompt`: 아래 입력 패키지 (그대로 복사 후 `<…>` 부분만 채움).
161
+
162
+ ````
163
+ sd-impl 의 spec ↔ 코드 독립 대조를 수행해줘.
164
+
165
+ **대상**:
166
+ - spec.md 경로: <절대경로>
167
+ - 단위 식별자: <§4.x / §5.x / §6.x>
168
+
169
+ **참조 자료**:
170
+
171
+ (1) 4단계 spec 분해 표 (인라인):
127
172
 
128
- 차이 0건이면 7단계 진입. 1건 이상이면 분류별 처리 단계 재실행.
173
+ | 항목 ID | spec 인용 | 현재 코드 상태 | 판정 | 매핑 파일 | 의존 |
174
+ | ------- | --------- | -------------- | ---- | --------- | ---- |
175
+ | ... | ... | ... | ... | ... | ... |
176
+
177
+ (2) 현재 구현 파일 목록 (절대경로):
178
+ - <file1>
179
+ - <file2>
180
+ - ...
181
+
182
+ **작업**:
183
+
184
+ 1. spec.md 의 §<단위> 본문 + 참조 §5/§6/§7/§8/§9 항목을 다시 읽는다.
185
+ 2. 현재 구현 파일을 모두 읽는다.
186
+ 3. spec ↔ 코드를 항목 단위로 1:1 대조 (단위 전체 대상. "이번 변경분만" 스코프 제한 없음).
187
+ 4. 차이 발견 시 아래 3분류로 보고:
188
+
189
+ - (a) **코드 위반**: spec 명확한데 코드가 빠뜨림·다름.
190
+ - (b) **spec 내부 모순**: §A 정의 vs §B 정의 충돌. (양쪽 인용 명시)
191
+ - (d) **spec 미정의 + 코드 임의 채움**: spec 본문에 정의·분기·경계 케이스 명시 없는데 코드가 채움.
192
+
193
+ 5. 보고 형식 (각 차이 1건마다):
194
+
195
+ ### 차이 N: <도메인 어휘로 표현된 한줄 요약>
196
+ - 분류: (a) / (b) / (d)
197
+ - spec 위치: §X.x line Y
198
+ - spec 인용: "..."
199
+ - 코드 위치: <file:line>
200
+ - 코드 동작: <도메인 어휘로>
201
+ - 비고: (b) 면 모순 상대 인용 함께
202
+
203
+ 6. 차이 0건이면 `차이 없음, 검증 통과` 1줄만 응답.
204
+
205
+ **제약**:
206
+
207
+ - 보고 본문에 코드 식별자(변수명·SQL 함수명·타입 키워드 등) 노출 금지. 모두 도메인 어휘로 풀 것.
208
+ - "코드가 spec 위반" 으로 단정 금지. 3분류 중 어디인지 명시.
209
+ - spec 본문에 인용 가능한 문구가 없으면 (b)(d) 후보.
210
+
211
+ **산출**: 위 3분류 보고 목록 또는 `차이 없음, 검증 통과`.
212
+ ````
213
+
214
+ #### 결과 처리
215
+
216
+ subagent 출력을 받은 후 분류별 처리:
217
+
218
+ - **(a) 코드 위반**: 5단계 사이클 재진입. 코드 수정.
219
+ - **(b) spec 내부 모순**: 사용자에게 1건씩 보고 (모순 양쪽 인용 + 어느 쪽이 합리적인지 의견) → 처리 방향 묻기 (spec 수정 / 코드 정정) → spec 수정 시 2단계 "spec 수정 절차" 적용.
220
+ - **(d) spec 미정의 + 코드 임의 채움**: 사용자에게 1건씩 질문 → 결정 받기 → 2단계 "spec 수정 절차" (인라인 결정 반영) → 5단계 사이클 재진입.
221
+
222
+ (b)(d) 모두 한꺼번에 묶음 보고 금지. 1건씩 합의.
223
+
224
+ 처리 완료 후 6단계 재실행 (재대조). 차이 0건 확인 후 7단계 진입.
129
225
 
130
226
  ### 7단계: 코드 정리
131
227
 
228
+ spec 에 없는 기능·옵션·추상화 추가 금지(YAGNI).
229
+
132
230
  - **횡단 중복**: 작업 사이클 사이 흩어진 동일 로직 합치기.
133
- - **계층별 정합 점검**: 3-B 의 기준 단위 + 보강 출처 파일을 다시 Read 해 4계층별로 실제 작성분과 비교. 한 계층이라도 채택 패턴과 어긋나면 (임의 변형·새 발명) 수정.
134
- - 도메인 모델: 필드·타입·제약·네이밍 패턴 일치
135
- - 데이터 접근: 함수 시그니처·쿼리 패턴·에러 처리 일치
136
- - 본체: 컴포넌트 구조·상태·핸들러·의존성 패턴 일치 (§4.x) / 트리거·처리 단계 구조 일치 (§5.x) / 부수효과 후크·처리 단계 구조 일치 (§6.x)
137
- - 테스트: 러너·assertion·mock 패턴 일치
231
+ - **계층별 정합 점검**: 3-B 의 기준 단위 + 보강 출처 파일을 다시 Read 해 4계층별로 실제 작성분과 비교. 한 계층이라도 채택 패턴과 어긋나면(임의 변형·새 발명) 수정.
232
+ - 도메인 모델: 필드·타입·제약·네이밍 패턴 일치.
233
+ - 데이터 접근: 함수 시그니처·쿼리 패턴·에러 처리 일치.
234
+ - 본체: 컴포넌트·트리거·처리 단계·핸들러·의존성 패턴 일치.
235
+ - 테스트: 러너·assertion·mock 패턴 일치.
138
236
  - **불필요한 코드**: 미사용 import·변수·주석, 요구 없는 옵션·추상화 제거. 작업 결과로 어디서도 참조되지 않는 파일도 포함 (검사 범위는 전체 워크스페이스). **단 파일 단위 삭제는 후보 목록을 사용자에게 보고 → 확정분만 삭제** (dynamic import·마이그레이션·문서 자산 등 보존분 사용자 제외).
139
237
  - **매뉴얼 권위 규약**: 3-A Read 한 매뉴얼 위반 항목 수정.
140
238
 
@@ -144,7 +242,7 @@ spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를
144
242
 
145
243
  사용자에게 요청: "**dev 서버**를 실행하고 접속 주소를 알려달라."
146
244
 
147
- **dev 서버·외부 프로세스 자체 실행 금지**: assistant 가 직접 `ng serve`·`npm run dev`·`vite`·`pnpm dev` 등으로 dev 서버를 띄우지 않는다. 사용자가 띄워 주소를 회신할 때까지 대기. 사용자가 본 단계 스킵을 지시하거나 시연 불가 환경이 명시되면 본 단계 스킵 후 9단계.
245
+ **dev 서버·외부 프로세스 자체 실행 금지**: assistant 가 직접 `ng serve`·`npm run dev`·`vite`·`pnpm dev` 등으로 dev 서버를 띄우지 않음. 사용자가 띄워 주소를 회신할 때까지 대기. 사용자가 본 단계 스킵을 지시하거나 시연 불가 환경이 명시되면 본 단계 스킵 후 9단계.
148
246
 
149
247
  주소 회신 후 `playwright-cli` 로 §4.x/§5.x/§6.x 동작 시나리오 직접 시연:
150
248
 
@@ -157,15 +255,7 @@ spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 횡단 처리) 1개를
157
255
 
158
256
  ### 9단계: 완료 보고
159
257
 
160
- - 대상 spec.md 의 해당 §4.x / §5.x / §6.x 헤더 `[확정: 날짜]` 를 `[확정: 날짜, 구현: 오늘날짜]` 로 확장 (Bash `date +%Y-%m-%d`). 이미 `구현: …` 가 들어있으면 그 날짜만 갱신.
258
+ - 대상 spec.md 의 해당 §4.x / §5.x / §6.x 헤더 `[확정: YYYY-MM-DD]` 를 `[확정: YYYY-MM-DD, 구현: YYYY-MM-DD]` 로 확장. 이미 `, 구현: …` 가 들어있으면 그 날짜만 갱신. 날짜 = Bash `date +%Y-%m-%d`.
161
259
  - 만들거나 갱신한 파일 목록 보고 (마커 부착한 spec.md 포함).
162
- - 본 세션에서 §5/§6/§7/§8/§9 공통 자원을 신규/변경했다면, 자원을 참조하는 **다른 §4.x/§5.x/§6.x 이미 구현된 것**을 spec 역인용으로 수집해 영향 단위 목록 보고 (재구현 필요 여부 사용자 판단용). 변경 없었으면 생략.
260
+ - 본 세션에서 2단계·6단계 "spec 수정 절차" 의존 §4.x/§5.x/§6.x 마커가 제거된 항목이 있으면 영향 단위 목록 보고 (재구현 필요 알림). 없으면 생략.
163
261
  - 시연에서 사용자 확인 끝나면 종료.
164
-
165
- ## 운용
166
-
167
- - 결정 근거: `sd-base-rules.md` "결정 근거" 적용.
168
- - **사용자 보고 어휘**: 코드 식별자(변수명·SQL 함수명·타입 키워드 등) 노출 금지. 도메인 어휘로 풀어 보고. (output-style `sd-tone` "산출물 소비자 도메인 어휘" 적용)
169
- - **spec.md 동기화**: sd-impl 이 직접 손대는 spec 변경은 다음 2건뿐. 헤더 OPEN·구조 변경은 2단계 규칙대로 종료 후 sd-spec.
170
- - 본문 인라인 `[OPEN]` 해소 시 마커를 결정 내용으로 교체 (2단계).
171
- - 9단계 완료 시 §4.x/§5.x/§6.x 헤더 `[확정: …]` 를 `[확정: …, 구현: 날짜]` 로 확장.
@@ -0,0 +1,101 @@
1
+ # 재고관리 요구 분석서
2
+
3
+ ## 1. 개요
4
+
5
+ ### 1.1 핵심 목적
6
+
7
+ - 박스 단위 입고·재고 관리
8
+
9
+ ### 1.2 주요 목표
10
+
11
+ - 박스 1건 등록
12
+
13
+ ### 1.3 최종 사용자/이해관계자
14
+
15
+ - 창고 작업자
16
+
17
+ ### 1.4 환경/장치
18
+
19
+ #### 구성도
20
+
21
+ ```
22
+ ┌──────────────┐ ┌──────────────┐
23
+ │ PC 클라이언트 │───→│ 서버 │
24
+ └──────────────┘ └──────────────┘
25
+ ```
26
+
27
+ #### 장치 목록
28
+
29
+ - PC: 창고 작업자용. Chrome 최신. 1920x1080
30
+ - 서버: Node 20
31
+
32
+ ## 2. 업무 프로세스
33
+
34
+ ## 3. 기타 요구사항
35
+
36
+ ## 4. 화면
37
+
38
+ | § | 분류 | 화면 | 유형 | 장치 |
39
+ | --- | -------- | --------- | -------- | ---- |
40
+ | 4.1 | 기준정보 | 박스 등록 | 트랜잭션 | PC |
41
+
42
+ ### 4.1 박스 등록 (PC) [확정: 2026-05-20]
43
+
44
+ Actor: 창고 작업자
45
+ 관련 섹션: [모델.박스]
46
+
47
+ 기능 개요:
48
+
49
+ - 박스 1건 신규 등록
50
+
51
+ #### 와이어프레임 (텍스트)
52
+
53
+ ```
54
+ ┌─────────────────────────┐
55
+ │ 박스 등록 │
56
+ ├─────────────────────────┤
57
+ │ <등록 폼> │
58
+ │ │
59
+ │ [저장] │
60
+ └─────────────────────────┘
61
+ ```
62
+
63
+ #### 항목
64
+
65
+ **등록 폼**
66
+
67
+ | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
68
+ | --------- | ------ | ---- | ---------------- | ------------------- |
69
+ | 박스 코드 | 문자열 | Y | [모델.박스.코드] | 코드 길이 규칙 따름 |
70
+ | 품목 코드 | 문자열 | Y | [모델.박스.품목] | - |
71
+
72
+ #### 동작
73
+
74
+ - `[저장]` 클릭: 입력값으로 박스 1건 등록
75
+
76
+ ## 5. 자동 처리
77
+
78
+ ## 6. 횡단 처리
79
+
80
+ ## 7. 공통 정의
81
+
82
+ ## 8. 도메인 모델
83
+
84
+ ### 8.1 박스 [확정: 2026-05-20]
85
+
86
+ 필드:
87
+
88
+ | 필드 | 타입 | 필수 | 비고 |
89
+ | ---- | ------ | ---- | ---------------------- |
90
+ | ID | 숫자 | Y | 자동 부여 |
91
+ | 코드 | 문자열 | Y | 12자, 영문 대문자·숫자 |
92
+ | 품목 | 문자열 | Y | 품목 코드 |
93
+
94
+ 키/제약:
95
+
96
+ - 식별 키: ID
97
+ - 비즈니스 키: 코드 (수정 가능)
98
+
99
+ ## 9. 외부 인터페이스
100
+
101
+ ## 10. 본문 외 결정사항
@@ -0,0 +1,101 @@
1
+ # 재고관리 요구 분석서
2
+
3
+ ## 1. 개요
4
+
5
+ ### 1.1 핵심 목적
6
+
7
+ - 박스 단위 입고·재고 관리
8
+
9
+ ### 1.2 주요 목표
10
+
11
+ - 박스 1건 등록
12
+
13
+ ### 1.3 최종 사용자/이해관계자
14
+
15
+ - 창고 작업자
16
+
17
+ ### 1.4 환경/장치
18
+
19
+ #### 구성도
20
+
21
+ ```
22
+ ┌──────────────┐ ┌──────────────┐
23
+ │ PC 클라이언트 │───→│ 서버 │
24
+ └──────────────┘ └──────────────┘
25
+ ```
26
+
27
+ #### 장치 목록
28
+
29
+ - PC: 창고 작업자용. Chrome 최신. 1920x1080
30
+ - 서버: Node 20
31
+
32
+ ## 2. 업무 프로세스
33
+
34
+ ## 3. 기타 요구사항
35
+
36
+ ## 4. 화면
37
+
38
+ | § | 분류 | 화면 | 유형 | 장치 |
39
+ | --- | -------- | --------- | -------- | ---- |
40
+ | 4.1 | 기준정보 | 박스 등록 | 트랜잭션 | PC |
41
+
42
+ ### 4.1 박스 등록 (PC) [확정: 2026-05-20]
43
+
44
+ Actor: 창고 작업자
45
+ 관련 섹션: [모델.박스]
46
+
47
+ 기능 개요:
48
+
49
+ - 박스 1건 신규 등록
50
+
51
+ #### 와이어프레임 (텍스트)
52
+
53
+ ```
54
+ ┌─────────────────────────┐
55
+ │ 박스 등록 │
56
+ ├─────────────────────────┤
57
+ │ <등록 폼> │
58
+ │ │
59
+ │ [저장] │
60
+ └─────────────────────────┘
61
+ ```
62
+
63
+ #### 항목
64
+
65
+ **등록 폼**
66
+
67
+ | 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
68
+ | --------- | ------ | ---- | ---------------- | ------------------- |
69
+ | 박스 코드 | 문자열 | Y | [모델.박스.코드] | 코드 길이 규칙 따름 |
70
+ | 품목 코드 | 문자열 | Y | [모델.박스.품목] | - |
71
+
72
+ #### 동작
73
+
74
+ - `[저장]` 클릭: 입력값으로 박스 1건 등록
75
+
76
+ ## 5. 자동 처리
77
+
78
+ ## 6. 횡단 처리
79
+
80
+ ## 7. 공통 정의
81
+
82
+ ## 8. 도메인 모델
83
+
84
+ ### 8.1 박스 [확정: 2026-05-20]
85
+
86
+ 필드:
87
+
88
+ | 필드 | 타입 | 필수 | 비고 |
89
+ | ---- | ------ | ---- | ---------------------- |
90
+ | ID | 숫자 | Y | 자동 부여 |
91
+ | 코드 | 문자열 | Y | 12자, 영문 대문자·숫자 |
92
+ | 품목 | 문자열 | Y | 품목 코드 |
93
+
94
+ 키/제약:
95
+
96
+ - 식별 키: ID
97
+ - 비즈니스 키: 코드 (수정 가능)
98
+
99
+ ## 9. 외부 인터페이스
100
+
101
+ ## 10. 본문 외 결정사항
@@ -0,0 +1,46 @@
1
+ import { Component, signal } from "@angular/core";
2
+
3
+ @Component({
4
+ selector: "app-box-register",
5
+ template: `
6
+ <div class="box-register">
7
+ <h2>박스 등록</h2>
8
+ <div class="form">
9
+ <label>
10
+ 박스 코드
11
+ <input
12
+ type="text"
13
+ [value]="boxCode()"
14
+ (input)="onBoxCodeInput($event)"
15
+ />
16
+ </label>
17
+ <label>
18
+ 품목 코드
19
+ <input
20
+ type="text"
21
+ [value]="itemCode()"
22
+ (input)="onItemCodeInput($event)"
23
+ />
24
+ </label>
25
+ </div>
26
+ <button (click)="onSave()">저장</button>
27
+ </div>
28
+ `,
29
+ })
30
+ export class BoxRegisterView {
31
+ boxCode = signal("");
32
+ itemCode = signal("");
33
+
34
+ onBoxCodeInput(e: Event) {
35
+ this.boxCode.set((e.target as HTMLInputElement).value);
36
+ }
37
+
38
+ onItemCodeInput(e: Event) {
39
+ this.itemCode.set((e.target as HTMLInputElement).value);
40
+ }
41
+
42
+ onSave() {
43
+ // 데모 골격: 실제 저장 동작 없음 (sd-impl 풀 구현 대기)
44
+ console.log("박스 등록 데모", { box: this.boxCode(), item: this.itemCode() });
45
+ }
46
+ }