@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.
Files changed (122) hide show
  1. package/claude/references/sd-simplysm14/README.md +17 -17
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +27 -53
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +37 -105
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +46 -43
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +22 -32
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +40 -55
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +40 -40
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +25 -53
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +70 -82
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +44 -39
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +21 -36
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +52 -65
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +65 -70
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +33 -35
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +7 -7
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +29 -29
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +13 -12
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +222 -98
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +102 -53
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +98 -64
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +34 -28
  27. package/claude/references/sd-simplysm14/apis/core-common/obj.md +104 -40
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +11 -8
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +23 -31
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +33 -22
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +28 -25
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +39 -53
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +26 -29
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +27 -29
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +14 -14
  36. package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
  37. package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
  38. package/claude/references/sd-simplysm14/apis/orm-common/README.md +5 -59
  39. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +98 -67
  40. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +107 -92
  41. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +99 -65
  42. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +83 -98
  43. package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -52
  44. package/claude/references/sd-simplysm14/apis/orm-node/README.md +62 -25
  45. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +27 -27
  46. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +12 -15
  47. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
  48. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
  49. package/claude/references/sd-simplysm14/apis/service-client/README.md +84 -86
  50. package/claude/references/sd-simplysm14/apis/service-client/orm.md +14 -11
  51. package/claude/references/sd-simplysm14/apis/service-client/transport.md +33 -10
  52. package/claude/references/sd-simplysm14/apis/service-common/README.md +37 -23
  53. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +9 -9
  54. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +13 -13
  55. package/claude/references/sd-simplysm14/apis/service-server/README.md +81 -65
  56. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +32 -35
  57. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +44 -33
  58. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +34 -45
  59. package/claude/references/sd-simplysm14/apis/storage/README.md +24 -18
  60. package/claude/skills/sd-demo/SKILL.md +6 -0
  61. package/claude/skills/sd-impl/SKILL.md +4 -7
  62. package/claude/skills/sd-spec/SKILL.md +31 -858
  63. package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
  64. package/claude/workflows/sd-docs.js +84 -0
  65. package/package.json +1 -1
  66. package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
  67. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
  68. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
  69. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
  70. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
  71. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
  72. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
  73. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
  74. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
  75. package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
  76. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
  77. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  78. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  79. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
  80. package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
  81. package/claude/skills/sd-docs/SKILL.md +0 -46
  82. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
  83. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
  84. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
  85. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
  86. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
  87. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
  88. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
  89. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
  90. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
  91. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
  92. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
  93. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
  94. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
  95. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
  96. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
  97. package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
  98. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
  99. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
  100. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
  101. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
  102. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
  103. package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
  104. package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
  105. package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
  106. package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
  107. package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
  108. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
  109. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
  110. package/claude/skills/sd-review/evals/golden.jsonl +0 -2
  111. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
  112. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  113. package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
  114. package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
  115. package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
  116. package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
  117. package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
  118. package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
  119. package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
  120. package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
  121. package/claude/skills/sd-use/evals/golden.jsonl +0 -6
  122. /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,12 +0,0 @@
1
- {
2
- "name": "@demo/client",
3
- "version": "0.0.0",
4
- "private": true,
5
- "type": "module",
6
- "dependencies": {
7
- "@angular/core": "^21.0.0",
8
- "@ng-icons/core": "^32.0.0",
9
- "@ng-icons/tabler-icons": "^32.0.0",
10
- "@simplysm/angular": "^14.0.0"
11
- }
12
- }
@@ -1,3 +0,0 @@
1
- export { InventoryMasterListComponent } from "./screens/inventory/inventory-master.list";
2
- export { OutboundListComponent } from "./screens/outbound/outbound.list";
3
- export { InboundListComponent } from "./screens/inbound/inbound.list";
@@ -1,150 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- effect,
6
- inject,
7
- signal,
8
- untracked,
9
- } from "@angular/core";
10
- import {
11
- injectPermsSignal,
12
- mark,
13
- SdCrudListComponent,
14
- SdSheetColumnDirective,
15
- SdTextfieldComponent,
16
- SdToastProvider,
17
- } from "@simplysm/angular";
18
-
19
- interface IInboundItem {
20
- id: number;
21
- receiptNo: string;
22
- supplierName: string;
23
- itemName: string;
24
- quantity: number;
25
- receivedAt: string;
26
- }
27
-
28
- interface IFilter {
29
- searchText: string;
30
- }
31
-
32
- @Component({
33
- selector: "app-inbound-list",
34
- changeDetection: ChangeDetectionStrategy.OnPush,
35
- encapsulation: ViewEncapsulation.None,
36
- standalone: true,
37
- imports: [SdCrudListComponent, SdSheetColumnDirective, SdTextfieldComponent],
38
- template: `
39
- <div class="flex-column fill">
40
- <sd-crud-list
41
- title="입고 내역 조회"
42
- [(ready)]="ready"
43
- [initialized]="initialized()"
44
- [(busyCount)]="busyCount"
45
- [items]="items()"
46
- [(selectedKeys)]="selectedKeys"
47
- [(page)]="page"
48
- [totalPageCount]="pageLength()"
49
- [(sorts)]="sortingDefs"
50
- [trackByFn]="trackByFn"
51
- [restricted]="!perms().includes('use')"
52
- (filterSubmit)="onFilterSubmit()"
53
- >
54
- <ng-template #filterTpl>
55
- <div class="form-box-inline">
56
- <div>
57
- <label>검색</label>
58
- <sd-textfield [(value)]="filter().searchText" (valueChange)="mark(filter)" />
59
- </div>
60
- </div>
61
- </ng-template>
62
-
63
- <sd-sheet-column [key]="'receiptNo'" [header]="'입고 번호'">
64
- <ng-template [cell]="items()" let-item="item">
65
- <div class="p-xs-sm">{{ item.receiptNo }}</div>
66
- </ng-template>
67
- </sd-sheet-column>
68
-
69
- <sd-sheet-column [key]="'supplierName'" [header]="'공급처'">
70
- <ng-template [cell]="items()" let-item="item">
71
- <div class="p-xs-sm">{{ item.supplierName }}</div>
72
- </ng-template>
73
- </sd-sheet-column>
74
-
75
- <sd-sheet-column [key]="'itemName'" [header]="'품목'">
76
- <ng-template [cell]="items()" let-item="item">
77
- <div class="p-xs-sm">{{ item.itemName }}</div>
78
- </ng-template>
79
- </sd-sheet-column>
80
-
81
- <sd-sheet-column [key]="'quantity'" [header]="'수량'">
82
- <ng-template [cell]="items()" let-item="item">
83
- <div class="p-xs-sm tx-right">{{ item.quantity }}</div>
84
- </ng-template>
85
- </sd-sheet-column>
86
- </sd-crud-list>
87
-
88
- @if (initialized() && items().length === 0) {
89
- <div class="p-default tx-center tx-theme-gray-default">조회된 입고 내역이 없습니다.</div>
90
- }
91
- </div>
92
- `,
93
- })
94
- export class InboundListComponent {
95
- private readonly _sdToast = inject(SdToastProvider);
96
-
97
- perms = injectPermsSignal(["inbound"], ["use"]);
98
-
99
- ready = signal(false);
100
- initialized = signal(false);
101
- busyCount = signal(0);
102
-
103
- items = signal<IInboundItem[]>([]);
104
- selectedKeys = signal<number[]>([]);
105
- page = signal(0);
106
- pageLength = signal(0);
107
- sortingDefs = signal<{ key: string; desc: boolean }[]>([]);
108
-
109
- filter = signal<IFilter>({ searchText: "" });
110
- lastFilter = signal<IFilter>({ searchText: "" });
111
-
112
- trackByFn = (item: IInboundItem) => item.id;
113
-
114
- protected readonly mark = mark;
115
-
116
- constructor() {
117
- effect(() => {
118
- if (!this.perms().includes("use") || !this.ready()) {
119
- this.initialized.set(true);
120
- return;
121
- }
122
-
123
- this.lastFilter();
124
- this.page();
125
- this.sortingDefs();
126
-
127
- void untracked(async () => {
128
- this.busyCount.update((v) => v + 1);
129
- await this._sdToast.try(async () => {
130
- await this._refresh();
131
- });
132
- this.busyCount.update((v) => v - 1);
133
- this.initialized.set(true);
134
- });
135
- });
136
- }
137
-
138
- onFilterSubmit(): void {
139
- this.page.set(0);
140
- this.lastFilter.set({ ...this.filter() });
141
- }
142
-
143
- doRefresh(): void {
144
- if (!this.perms().includes("use")) return;
145
- mark(this.lastFilter);
146
- }
147
-
148
- private async _refresh(): Promise<void> {
149
- }
150
- }
@@ -1,143 +0,0 @@
1
- import {
2
- ChangeDetectionStrategy,
3
- Component,
4
- ViewEncapsulation,
5
- effect,
6
- inject,
7
- signal,
8
- untracked,
9
- } from "@angular/core";
10
- import {
11
- injectPermsSignal,
12
- mark,
13
- SdCrudListComponent,
14
- SdSheetColumnDirective,
15
- SdTextfieldComponent,
16
- SdToastProvider,
17
- } from "@simplysm/angular";
18
-
19
- interface IInventoryMasterItem {
20
- id: number;
21
- warehouseCode: string;
22
- itemCode: string;
23
- itemName: string;
24
- active: boolean;
25
- }
26
-
27
- interface IFilter {
28
- searchText: string;
29
- }
30
-
31
- @Component({
32
- selector: "app-inventory-master-list",
33
- changeDetection: ChangeDetectionStrategy.OnPush,
34
- encapsulation: ViewEncapsulation.None,
35
- standalone: true,
36
- imports: [SdCrudListComponent, SdSheetColumnDirective, SdTextfieldComponent],
37
- template: `
38
- <div class="flex-column fill">
39
- <sd-crud-list
40
- title="재고 마스터"
41
- [(ready)]="ready"
42
- [initialized]="initialized()"
43
- [(busyCount)]="busyCount"
44
- [items]="items()"
45
- [(selectedKeys)]="selectedKeys"
46
- [(page)]="page"
47
- [totalPageCount]="pageLength()"
48
- [(sorts)]="sortingDefs"
49
- [trackByFn]="trackByFn"
50
- [restricted]="!perms().includes('use')"
51
- (filterSubmit)="onFilterSubmit()"
52
- >
53
- <ng-template #filterTpl>
54
- <div class="form-box-inline">
55
- <div>
56
- <label>검색</label>
57
- <sd-textfield [(value)]="filter().searchText" (valueChange)="mark(filter)" />
58
- </div>
59
- </div>
60
- </ng-template>
61
-
62
- <sd-sheet-column [key]="'warehouseCode'" [header]="'창고'">
63
- <ng-template [cell]="items()" let-item="item">
64
- <div class="p-xs-sm">{{ item.warehouseCode }}</div>
65
- </ng-template>
66
- </sd-sheet-column>
67
-
68
- <sd-sheet-column [key]="'itemCode'" [header]="'품목 코드'">
69
- <ng-template [cell]="items()" let-item="item">
70
- <div class="p-xs-sm">{{ item.itemCode }}</div>
71
- </ng-template>
72
- </sd-sheet-column>
73
-
74
- <sd-sheet-column [key]="'itemName'" [header]="'품목명'">
75
- <ng-template [cell]="items()" let-item="item">
76
- <div class="p-xs-sm">{{ item.itemName }}</div>
77
- </ng-template>
78
- </sd-sheet-column>
79
- </sd-crud-list>
80
-
81
- @if (initialized() && items().length === 0) {
82
- <div class="p-default tx-center tx-theme-gray-default">조회된 재고 마스터가 없습니다.</div>
83
- }
84
- </div>
85
- `,
86
- })
87
- export class InventoryMasterListComponent {
88
- private readonly _sdToast = inject(SdToastProvider);
89
-
90
- perms = injectPermsSignal(["inventory.master"], ["use", "edit"]);
91
-
92
- ready = signal(false);
93
- initialized = signal(false);
94
- busyCount = signal(0);
95
-
96
- items = signal<IInventoryMasterItem[]>([]);
97
- selectedKeys = signal<number[]>([]);
98
- page = signal(0);
99
- pageLength = signal(0);
100
- sortingDefs = signal<{ key: string; desc: boolean }[]>([]);
101
-
102
- filter = signal<IFilter>({ searchText: "" });
103
- lastFilter = signal<IFilter>({ searchText: "" });
104
-
105
- trackByFn = (item: IInventoryMasterItem) => item.id;
106
-
107
- protected readonly mark = mark;
108
-
109
- constructor() {
110
- effect(() => {
111
- if (!this.perms().includes("use") || !this.ready()) {
112
- this.initialized.set(true);
113
- return;
114
- }
115
-
116
- this.lastFilter();
117
- this.page();
118
- this.sortingDefs();
119
-
120
- void untracked(async () => {
121
- this.busyCount.update((v) => v + 1);
122
- await this._sdToast.try(async () => {
123
- await this._refresh();
124
- });
125
- this.busyCount.update((v) => v - 1);
126
- this.initialized.set(true);
127
- });
128
- });
129
- }
130
-
131
- onFilterSubmit(): void {
132
- this.page.set(0);
133
- this.lastFilter.set({ ...this.filter() });
134
- }
135
-
136
- doRefresh(): void {
137
- if (!this.perms().includes("use")) return;
138
- mark(this.lastFilter);
139
- }
140
-
141
- private async _refresh(): Promise<void> {
142
- }
143
- }
@@ -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,2 +0,0 @@
1
- packages:
2
- - packages/*
@@ -1,12 +0,0 @@
1
- import type { SdConfigFn } from "@simplysm/sd-cli";
2
-
3
- const config: SdConfigFn = () => ({
4
- packages: {
5
- "demo-client": {
6
- target: "client",
7
- server: 4000,
8
- },
9
- },
10
- });
11
-
12
- export default config;
@@ -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"}
@@ -1,8 +0,0 @@
1
- {
2
- "name": "minimal-ts-pkg",
3
- "version": "0.1.0",
4
- "type": "module",
5
- "scripts": {
6
- "test": "node --test tests/"
7
- }
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "Bundler",
6
- "strict": true,
7
- "esModuleInterop": true
8
- },
9
- "include": ["src/**/*", "tests/**/*"]
10
- }
@@ -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
- - 인덱스에서 제거된 항목 (있다면).
@@ -1,7 +0,0 @@
1
- # @simplysm/* v14 행동 지침
2
-
3
- (eval fixture — 미니 README)
4
-
5
- ## 패키지 인덱스
6
-
7
- (비어 있음 — sd-docs 가 채워야 함)
@@ -1,5 +0,0 @@
1
- {
2
- "name": "@simplysm/bar",
3
- "version": "14.0.0",
4
- "type": "module"
5
- }
@@ -1,3 +0,0 @@
1
- export function barSum(a: number, b: number): number {
2
- return a + b;
3
- }