@simplysm/sd-claude 14.0.88 → 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 -17
- package/claude/references/sd-simplysm14/apis/angular/README.md +27 -53
- package/claude/references/sd-simplysm14/apis/angular/controls.md +37 -105
- package/claude/references/sd-simplysm14/apis/angular/crud.md +46 -43
- package/claude/references/sd-simplysm14/apis/angular/directives.md +22 -32
- package/claude/references/sd-simplysm14/apis/angular/features.md +40 -55
- package/claude/references/sd-simplysm14/apis/angular/infra.md +40 -40
- package/claude/references/sd-simplysm14/apis/angular/layout.md +25 -53
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +70 -82
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +44 -39
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +21 -36
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +52 -65
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +65 -70
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +33 -35
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +7 -7
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +29 -29
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +13 -12
- package/claude/references/sd-simplysm14/apis/core-common/README.md +222 -98
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +102 -53
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +98 -64
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
- package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +34 -28
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +104 -40
- package/claude/references/sd-simplysm14/apis/core-node/README.md +11 -8
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +23 -31
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +33 -22
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +28 -25
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +39 -53
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +26 -29
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +27 -29
- package/claude/references/sd-simplysm14/apis/excel/README.md +14 -14
- package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
- package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +5 -59
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +98 -67
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +107 -92
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +99 -65
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +83 -98
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -52
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +62 -25
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +27 -27
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +12 -15
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
- package/claude/references/sd-simplysm14/apis/service-client/README.md +84 -86
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +14 -11
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +33 -10
- package/claude/references/sd-simplysm14/apis/service-common/README.md +37 -23
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +9 -9
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +13 -13
- package/claude/references/sd-simplysm14/apis/service-server/README.md +81 -65
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +32 -35
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +44 -33
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +34 -45
- package/claude/references/sd-simplysm14/apis/storage/README.md +24 -18
- 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/package.json +1 -1
- package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
- 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 -46
- 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
- /package/claude/{skills/sd-docs/references/doc-rules.md → workflows/sd-docs.rules.md} +0 -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,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
|
-
}
|
|
@@ -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 IOutboundItem {
|
|
20
|
-
id: number;
|
|
21
|
-
orderNo: string;
|
|
22
|
-
customerName: string;
|
|
23
|
-
itemName: string;
|
|
24
|
-
quantity: number;
|
|
25
|
-
shippedAt: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
interface IFilter {
|
|
29
|
-
searchText: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@Component({
|
|
33
|
-
selector: "app-outbound-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]="'orderNo'" [header]="'출고 번호'">
|
|
64
|
-
<ng-template [cell]="items()" let-item="item">
|
|
65
|
-
<div class="p-xs-sm">{{ item.orderNo }}</div>
|
|
66
|
-
</ng-template>
|
|
67
|
-
</sd-sheet-column>
|
|
68
|
-
|
|
69
|
-
<sd-sheet-column [key]="'customerName'" [header]="'거래처'">
|
|
70
|
-
<ng-template [cell]="items()" let-item="item">
|
|
71
|
-
<div class="p-xs-sm">{{ item.customerName }}</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 OutboundListComponent {
|
|
95
|
-
private readonly _sdToast = inject(SdToastProvider);
|
|
96
|
-
|
|
97
|
-
perms = injectPermsSignal(["outbound"], ["use"]);
|
|
98
|
-
|
|
99
|
-
ready = signal(false);
|
|
100
|
-
initialized = signal(false);
|
|
101
|
-
busyCount = signal(0);
|
|
102
|
-
|
|
103
|
-
items = signal<IOutboundItem[]>([]);
|
|
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: IOutboundItem) => 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 +0,0 @@
|
|
|
1
|
-
{"id": "case-001", "input": "/sd-demo .specs/inventory/spec.md §4.1 데모 만들어줘", "rubric": ["fixture 의 `packages/demo-client/src/screens/inventory/` 폴더 안에 화면 컴포넌트 파일이 새로 생성되었는가", "생성된 컴포넌트 파일이 Angular @Component 데코레이터 + selector 를 가지는가", "생성된 컴포넌트의 template 에 필터 영역·시트 영역·빈 상태 영역 마크업이 모두 등장하는가", "생성된 컴포넌트의 template 가 답습 화면(출고·입고 조회) 의 부위 마크업 구조(같은 컴포넌트·같은 클래스 패턴 사용)와 일치하는가", "생성된 파일 본문에 `// sd-demo:` 마커가 1회 이상 등장하는가", "events 에 `.claude/references/sd-simplysm14/` 폴더 안 파일 Read 또는 동등 명령 1회 이상 있는가"], "fixture": "inventory-list"}
|
|
File without changes
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"id": "sum-add", "input": "/sd-dev sum 함수 추가해줘. a + b 반환.", "rubric": ["tree.json 에 sum 함수 구현 파일이 src/ 하위 (위치 자유) 에 존재하는가", "tree.json 에 sum 함수 테스트 파일 (위치 자유) 이 존재하는가", "events 에 테스트 러너 실행 흔적 (Bash 의 node --test 또는 동등 명령) 이 1회 이상 있는가", "구현 파일 내용에 sum 함수 정의 및 export 가 포함되는가", "테스트 파일 내용에 sum 호출 + 결과 검증 assertion 이 1개 이상 있는가"], "fixture": "minimal-ts-pkg"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sd-docs
|
|
3
|
-
description: `@simplysm/*` 라이브러리 패키지의 API 문서를 `.claude/references/sd-simplysm14/apis/<패키지명>/` 위치에 사용 트리거 기준으로 작성·갱신. Use when 라이브러리 API 문서를 새로 작성하거나 코드 변경을 반영해 갱신할 때.
|
|
4
|
-
model: haiku
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# sd-docs
|
|
8
|
-
|
|
9
|
-
`@simplysm/*` 라이브러리 패키지의 API 문서를 코드만을 진실 근거로 풀 재작성하고, 상위 README 의 패키지 인덱스를 최신 상태로 맞춤.
|
|
10
|
-
|
|
11
|
-
## 산출물 위치
|
|
12
|
-
|
|
13
|
-
- `.claude/references/sd-simplysm14/apis/<패키지명>/README.md` — 패키지당 1개, 필수.
|
|
14
|
-
- `.claude/references/sd-simplysm14/apis/<패키지명>/<군명>.md` — 사용 트리거 군이 커서 README 한 장에 풀어쓰면 같은 README 의 다른 군 정보까지 함께 읽혀 부담이 커지는 경우에만 분할 산출.
|
|
15
|
-
- `.claude/references/sd-simplysm14/README.md` 의 "패키지 인덱스" 섹션.
|
|
16
|
-
|
|
17
|
-
여기서 `<패키지명>` = `@simplysm/` 접두사 제외한 짧은 이름.
|
|
18
|
-
|
|
19
|
-
## 대상
|
|
20
|
-
|
|
21
|
-
- **public**: `packages/*/package.json` 중 `private: true` 가 아닌 패키지. 문서·인덱스 대상.
|
|
22
|
-
- **private**: `private: true` 인 패키지. 인덱스에서 제외.
|
|
23
|
-
|
|
24
|
-
## 오케스트레이션
|
|
25
|
-
|
|
26
|
-
Workflow 도구로 처리. 실행 형태(parallel/pipeline/schema/동시성)는 스크립트 작성 시 최적으로 선택하되, 다음 정합성 제약만 충족:
|
|
27
|
-
|
|
28
|
-
- 팬아웃 단위 = public 패키지 1개. 각 agent 는 [references/doc-rules.md](references/doc-rules.md) 의 작성 규칙을 따라 해당 `apis/<패키지명>/` 자리만 산출하고, doc-rules.md "8. 구조화 결과 반환" 형태로 결과를 돌려줌.
|
|
29
|
-
- 상위 README "패키지 인덱스" 섹션 갱신은 전 패키지 결과가 모두 모인 뒤 1회 처리 (전체 알파벳 리스트라 취합 필요). 개별 agent 는 상위 README 를 건드리지 않음.
|
|
30
|
-
|
|
31
|
-
## 패키지 인덱스 갱신 규칙
|
|
32
|
-
|
|
33
|
-
`.claude/references/sd-simplysm14/README.md` 는 **풀 재작성 대상 아님**. "패키지 인덱스" 섹션의 항목 리스트만 재구성.
|
|
34
|
-
|
|
35
|
-
- **갱신 대상**: "패키지 인덱스" 섹션 본문(항목 리스트)만.
|
|
36
|
-
- **건드리지 않음**: 섹션 머리(`## 패키지 인덱스`), 다른 모든 섹션, 파일 상단/하단 텍스트.
|
|
37
|
-
- **항목 형식**: `- **<패키지명>** — <triggerSummary>. 자세히: [apis/<패키지명>/README.md](./apis/<패키지명>/README.md)`.
|
|
38
|
-
- **순서**: 패키지명 알파벳순.
|
|
39
|
-
- **포함**: public 만. **제외**: private, 코드베이스에 더 이상 존재하지 않는 패키지.
|
|
40
|
-
|
|
41
|
-
## 사용자 보고
|
|
42
|
-
|
|
43
|
-
- 재작성된 패키지 목록 (= public 전체. 풀 재작성 모드 — 매번 모든 패키지 산출).
|
|
44
|
-
- 분할(`<군명>.md`) 발생 패키지 목록.
|
|
45
|
-
- 삭제된 분할 파일 (코드에서 사라진 군, 있다면).
|
|
46
|
-
- 인덱스에서 제거된 항목 (있다면).
|