@simplysm/sd-claude 14.0.41 → 14.0.43

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 (67) hide show
  1. package/claude/references/sd-simplysm14/angular/docs/directives.md +74 -3
  2. package/claude/references/sd-simplysm14/angular/docs/features.md +64 -14
  3. package/claude/references/sd-simplysm14/angular/docs/plugins.md +2 -90
  4. package/claude/references/sd-simplysm14/angular/docs/providers.md +2 -2
  5. package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +1 -2
  6. package/claude/references/sd-simplysm14/angular/docs/ui-data.md +103 -23
  7. package/claude/references/sd-simplysm14/angular/docs/ui-form.md +173 -28
  8. package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +19 -4
  9. package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +20 -2
  10. package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +23 -14
  11. package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +15 -7
  12. package/claude/references/sd-simplysm14/angular/docs/utils.md +1 -1
  13. package/claude/references/sd-simplysm14/angular/usage.md +16 -15
  14. package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +1 -1
  15. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +154 -0
  16. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +84 -0
  17. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +107 -0
  18. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +83 -0
  19. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +83 -128
  20. package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +99 -1
  21. package/claude/references/sd-simplysm14/core-node/docs/child-process.md +182 -0
  22. package/claude/references/sd-simplysm14/core-node/docs/features.md +1 -1
  23. package/claude/references/sd-simplysm14/core-node/docs/file-system.md +509 -0
  24. package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +139 -0
  25. package/claude/references/sd-simplysm14/core-node/docs/logging.md +180 -0
  26. package/claude/references/sd-simplysm14/core-node/docs/path.md +176 -0
  27. package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +334 -0
  28. package/claude/references/sd-simplysm14/core-node/usage.md +192 -96
  29. package/claude/references/sd-simplysm14/excel/docs/core-classes.md +33 -14
  30. package/claude/references/sd-simplysm14/excel/usage.md +47 -45
  31. package/claude/references/sd-simplysm14/lint/usage.md +3 -2
  32. package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +30 -35
  33. package/claude/references/sd-simplysm14/orm-common/usage.md +9 -8
  34. package/claude/references/sd-simplysm14/sd-claude/docs/assets.md +43 -34
  35. package/claude/references/sd-simplysm14/sd-claude/docs/cli.md +1 -1
  36. package/claude/references/sd-simplysm14/sd-claude/docs/hooks.md +20 -2
  37. package/claude/references/sd-simplysm14/sd-claude/docs/scripts.md +5 -18
  38. package/claude/references/sd-simplysm14/sd-claude/usage.md +6 -5
  39. package/claude/references/sd-simplysm14/sd-cli/usage.md +176 -1
  40. package/claude/references/sd-simplysm14/service-client/usage.md +126 -61
  41. package/claude/references/sd-simplysm14/service-common/usage.md +28 -28
  42. package/claude/references/sd-simplysm14/storage/usage.md +123 -30
  43. package/claude/references/sd-testing.md +100 -4
  44. package/claude/rules/sd-claude-rules.md +19 -4
  45. package/claude/sd-check-write.py +1 -1
  46. package/claude/skills/sd-check/SKILL.md +7 -4
  47. package/claude/skills/sd-claude-docs/SKILL.md +7 -4
  48. package/claude/skills/sd-claude-docs/references/package-doc-gen.md +30 -7
  49. package/claude/skills/sd-commit/SKILL.md +2 -0
  50. package/claude/skills/sd-debug/SKILL.md +1 -1
  51. package/claude/skills/sd-deliverable/SKILL.md +2 -0
  52. package/claude/skills/sd-dev/SKILL.md +1 -1
  53. package/claude/skills/sd-doc-extract/SKILL.md +2 -0
  54. package/claude/{references/sd-debug.md → skills/sd-inner-debug/SKILL.md} +16 -20
  55. package/claude/{references/sd-review.md → skills/sd-inner-review/SKILL.md} +9 -4
  56. package/claude/skills/sd-issue/SKILL.md +2 -0
  57. package/claude/skills/sd-outlook/SKILL.md +2 -0
  58. package/claude/skills/sd-plan/SKILL.md +1 -1
  59. package/claude/skills/sd-prompt/SKILL.md +2 -2
  60. package/claude/skills/sd-refactor/SKILL.md +2 -2
  61. package/claude/skills/sd-review/SKILL.md +1 -1
  62. package/claude/skills/sd-tdd/SKILL.md +7 -7
  63. package/claude/skills/sd-use/SKILL.md +2 -0
  64. package/claude/skills/sd-wbs/SKILL.md +41 -18
  65. package/package.json +1 -1
  66. /package/claude/{rules → references}/sd-simplysm14.md +0 -0
  67. /package/claude/{references → rules}/sd-clarify.md +0 -0
@@ -1,6 +1,6 @@
1
1
  # @simplysm/lint
2
2
 
3
- Simplysm 모노레포 전용 ESLint 플러그인 및 공유 Flat Config 설정. 커스텀 규칙 7개와 권장 설정을 제공한다.
3
+ Simplysm 모노레포 전용 ESLint 플러그인 및 공유 Flat Config 설정. 커스텀 규칙 8개와 권장 설정을 제공한다.
4
4
 
5
5
  ## Installation
6
6
 
@@ -14,7 +14,7 @@ npm install @simplysm/lint
14
14
 
15
15
  | API | Type | Description |
16
16
  |-----|------|-------------|
17
- | `default` | object | `{ rules: {...} }` 형태의 ESLint 플러그인 객체. 7개의 커스텀 규칙을 포함한다 |
17
+ | `default` | object | `{ rules: {...} }` 형태의 ESLint 플러그인 객체. 8개의 커스텀 규칙을 포함한다 |
18
18
 
19
19
  #### Rules
20
20
 
@@ -26,6 +26,7 @@ npm install @simplysm/lint
26
26
  | `ts-no-unused-injects` | problem | autofix | 미사용 Angular `inject()` 필드를 감지하여 제거한다. 클래스 내 `inject()` 호출로 초기화된 프로퍼티 중 다른 곳에서 참조되지 않는 필드를 보고 |
27
27
  | `ts-no-unused-protected-readonly` | problem | autofix | Angular `@Component` 클래스의 미사용 `protected readonly` 필드를 감지하여 제거한다. 인라인 템플릿과 클래스 본문 모두에서 참조 여부를 확인 |
28
28
  | `ng-template-no-todo-comments` | problem | - | HTML 템플릿 내 `<!-- TODO: ... -->` 주석을 경고한다. raw text regex 방식으로 동작 |
29
+ | `ng-template-no-strict-null-check` | problem | - | Angular 템플릿에서 `=== null`, `!== null`, `=== undefined`, `!== undefined` 사용을 금지한다. `== null` / `!= null`로 통일하도록 강제. autofix 미제공(인라인 템플릿 offset 매핑 문제) |
29
30
  | `ng-template-sd-require-binding-attrs` | problem | autofix | `sd-*` 컴포넌트에서 허용 목록 외 plain attribute 사용을 금지하고 Angular property binding(`[attr]="..."`)을 강제한다 |
30
31
 
31
32
  #### `ng-template-sd-require-binding-attrs` Options
@@ -59,11 +59,11 @@ export class Queryable<TData extends DataRecord, TFrom extends TableBuilder | ne
59
59
 
60
60
  // UPDATE
61
61
  update(recordFwd: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>): Promise<void>;
62
- update<K>(recordFwd: ..., outputColumns: K[]): Promise<Pick<TFrom["$columns"], K>[]>;
62
+ update<K>(recordFwd: ..., outputColumns: K[]): Promise<Pick<TFrom["$inferColumns"], K>[]>;
63
63
 
64
64
  // DELETE
65
65
  delete(): Promise<void>;
66
- delete<K>(outputColumns: K[]): Promise<Pick<TFrom["$columns"], K>[]>;
66
+ delete<K>(outputColumns: K[]): Promise<Pick<TFrom["$inferColumns"], K>[]>;
67
67
 
68
68
  // UPSERT
69
69
  upsert(updateFn: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>): Promise<void>;
@@ -129,11 +129,19 @@ Queryable의 column 프록시 레코드 타입. 각 column이 `ExprUnit`으로
129
129
  export type QueryableRecord<TData extends DataRecord> = {
130
130
  [K in keyof TData]: TData[K] extends ColumnPrimitive
131
131
  ? ExprUnit<TData[K]>
132
- : TData[K] extends (infer U extends DataRecord)[]
133
- ? [QueryableRecord<U>]
134
- : TData[K] extends DataRecord
135
- ? QueryableRecord<TData[K]>
136
- : ExprUnit<TData[K] & ColumnPrimitive>;
132
+ : TData[K] extends (infer U)[]
133
+ ? U extends DataRecord
134
+ ? QueryableRecord<U>[]
135
+ : never
136
+ : TData[K] extends (infer U)[] | undefined
137
+ ? U extends DataRecord
138
+ ? QueryableRecord<U>[] | undefined
139
+ : never
140
+ : TData[K] extends DataRecord
141
+ ? QueryableRecord<TData[K]>
142
+ : TData[K] extends DataRecord | undefined
143
+ ? QueryableRecord<Exclude<TData[K], undefined>> | undefined
144
+ : never;
137
145
  };
138
146
  ```
139
147
 
@@ -143,23 +151,7 @@ UPDATE/INSERT용 column 레코드 타입. `ExprUnit` 또는 리터럴 값을 받
143
151
 
144
152
  ```typescript
145
153
  export type QueryableWriteRecord<TData> = {
146
- [K in keyof TData]: ExprInput<TData[K] & ColumnPrimitive>;
147
- };
148
- ```
149
-
150
- ## `NullableQueryableRecord`
151
-
152
- 모든 column이 nullable인 Queryable 레코드 타입.
153
-
154
- ```typescript
155
- export type NullableQueryableRecord<TData extends DataRecord> = {
156
- [K in keyof TData]: TData[K] extends ColumnPrimitive
157
- ? ExprUnit<TData[K] | undefined>
158
- : TData[K] extends (infer U extends DataRecord)[]
159
- ? [NullableQueryableRecord<U>]
160
- : TData[K] extends DataRecord
161
- ? NullableQueryableRecord<TData[K]>
162
- : ExprUnit<(TData[K] & ColumnPrimitive) | undefined>;
154
+ [K in keyof TData]: TData[K] extends ColumnPrimitive ? ExprInput<TData[K]> : never;
163
155
  };
164
156
  ```
165
157
 
@@ -169,25 +161,28 @@ QueryableRecord에서 실제 데이터 타입을 추출한다.
169
161
 
170
162
  ```typescript
171
163
  export type UnwrapQueryableRecord<R> = {
172
- [K in keyof R]: R[K] extends ExprUnit<infer T> ? T
173
- : R[K] extends [infer U] ? UnwrapQueryableRecord<U>[]
174
- : R[K] extends Record<string, any> ? UnwrapQueryableRecord<R[K]>
175
- : R[K];
164
+ [K in keyof R as K extends symbol ? never : K]: R[K] extends ExprUnit<infer T>
165
+ ? T
166
+ : NonNullable<R[K]> extends (infer U)[]
167
+ ? U extends Record<string, any>
168
+ ? UnwrapQueryableRecord<U>[] | Extract<R[K], undefined>
169
+ : never
170
+ : NonNullable<R[K]> extends Record<string, any>
171
+ ? UnwrapQueryableRecord<NonNullable<R[K]>> | Extract<R[K], undefined>
172
+ : never;
176
173
  };
177
174
  ```
178
175
 
179
176
  ## `PathProxy`
180
177
 
181
- include()에서 관계 경로를 타입 안전하게 지정하기 위한 프록시 타입.
178
+ include()에서 관계 경로를 타입 안전하게 지정하기 위한 프록시 타입. `ColumnPrimitive`가 아닌 필드(FK, FKT 관계)만 접근 가능하다.
182
179
 
183
180
  ```typescript
184
181
  export type PathProxy<TObject> = {
185
- [K in keyof TObject]-?: TObject[K] extends (infer U)[] | undefined
186
- ? PathProxy<U>
187
- : TObject[K] extends infer U | undefined
188
- ? PathProxy<U>
189
- : PathProxy<TObject[K]>;
190
- } & { [PATH_SYMBOL]: string[] };
182
+ [K in keyof TObject as TObject[K] extends ColumnPrimitive ? never : K]-?: PathProxy<
183
+ UnwrapArray<TObject[K]>
184
+ >;
185
+ } & { readonly [PATH_SYMBOL]: string[] };
191
186
  ```
192
187
 
193
188
  ## `Executable`
@@ -22,7 +22,7 @@ npm install @simplysm/orm-common
22
22
  | `DbErrorCode` | enum | 트랜잭션 에러 코드 (NO_ACTIVE_TRANSACTION, DEADLOCK 등) |
23
23
  | `DbTransactionError` | class | DBMS 네이티브 에러를 표준 에러 코드로 래핑하는 에러 클래스 |
24
24
 
25
- -> See [docs/core.md](./docs/core.md) for details.
25
+ See [docs/core.md](./docs/core.md) for detailed API documentation.
26
26
 
27
27
  ### Queryable / Executable
28
28
 
@@ -33,7 +33,6 @@ npm install @simplysm/orm-common
33
33
  | `getMatchedPrimaryKeys` | function | FK column 배열과 대상 테이블 PK를 매칭하여 PK column 이름 반환 |
34
34
  | `QueryableRecord` | type | Queryable column 프록시 레코드 타입 |
35
35
  | `QueryableWriteRecord` | type | UPDATE/INSERT용 column 레코드 타입 |
36
- | `NullableQueryableRecord` | type | 모든 column이 nullable인 Queryable 레코드 타입 |
37
36
  | `UnwrapQueryableRecord` | type | QueryableRecord에서 실제 데이터 타입 추출 |
38
37
  | `PathProxy` | type | include()에서 관계 경로를 타입 안전하게 지정하기 위한 프록시 타입 |
39
38
  | `Executable` | class | Stored Procedure 실행 래퍼 클래스 |
@@ -41,7 +40,7 @@ npm install @simplysm/orm-common
41
40
  | `parseSearchQuery` | function | 검색 쿼리 문자열을 SQL LIKE 패턴으로 파싱 |
42
41
  | `ParsedSearchQuery` | interface | parseSearchQuery 결과 타입 (or, must, not 배열) |
43
42
 
44
- -> See [docs/queryable-executable.md](./docs/queryable-executable.md) for details.
43
+ See [docs/queryable-executable.md](./docs/queryable-executable.md) for detailed API documentation.
45
44
 
46
45
  ### Expression
47
46
 
@@ -54,7 +53,7 @@ npm install @simplysm/orm-common
54
53
  | `ExprInput` | type | ExprUnit 또는 리터럴 값을 받는 입력 타입 |
55
54
  | `toExpr` | function | ExprInput을 Expr AST로 변환하는 내부 헬퍼 (커스텀 빌더 작성 시 사용) |
56
55
 
57
- -> See [docs/expression.md](./docs/expression.md) for details.
56
+ See [docs/expression.md](./docs/expression.md) for detailed API documentation.
58
57
 
59
58
  ### Schema Builders
60
59
 
@@ -88,7 +87,7 @@ npm install @simplysm/orm-common
88
87
  | `ExtractRelationTargetResult` | type | FKTarget에서 대상 타입 추출 (배열/단일) |
89
88
  | `InferDeepRelations` | type | 관계 정의에서 심층 타입 추론 |
90
89
 
91
- -> See [docs/schema-builders.md](./docs/schema-builders.md) for details.
90
+ See [docs/schema-builders.md](./docs/schema-builders.md) for detailed API documentation.
92
91
 
93
92
  ### Models
94
93
 
@@ -96,7 +95,7 @@ npm install @simplysm/orm-common
96
95
  |-----|------|-------------|
97
96
  | `_Migration` | const | 시스템 마이그레이션 테이블 정의 (TableBuilder 인스턴스) |
98
97
 
99
- -> See [docs/models.md](./docs/models.md) for details.
98
+ See [docs/models.md](./docs/models.md) for detailed API documentation.
100
99
 
101
100
  ### Query Builder
102
101
 
@@ -112,7 +111,7 @@ npm install @simplysm/orm-common
112
111
  | `PostgresqlQueryBuilder` | class | PostgreSQL용 QueryBuilder |
113
112
  | `PostgresqlExprRenderer` | class | PostgreSQL용 ExprRenderer |
114
113
 
115
- -> See [docs/query-builder.md](./docs/query-builder.md) for details.
114
+ See [docs/query-builder.md](./docs/query-builder.md) for detailed API documentation.
116
115
 
117
116
  ### Types
118
117
 
@@ -142,18 +141,20 @@ npm install @simplysm/orm-common
142
141
  | `WinFn` | type | Window 함수 유니온 타입 |
143
142
  | `QueryDef` | type | 모든 쿼리 정의의 유니온 타입 |
144
143
  | `SelectQueryDef` | interface | SELECT 쿼리 정의 |
144
+ | `SelectQueryDefJoin` | interface | SELECT 쿼리 JOIN 정의 (SelectQueryDef 확장) |
145
145
  | `InsertQueryDef` | interface | INSERT 쿼리 정의 |
146
146
  | `UpdateQueryDef` | interface | UPDATE 쿼리 정의 |
147
147
  | `DeleteQueryDef` | interface | DELETE 쿼리 정의 |
148
148
  | `UpsertQueryDef` | interface | UPSERT 쿼리 정의 |
149
149
  | `QueryDefObjectName` | interface | 테이블/뷰 이름 정의 (database, schema, name) |
150
+ | `CudOutputDef` | interface | INSERT/UPDATE/DELETE output 정의 (columns, pkColNames, aiColName) |
150
151
  | `DDL_TYPES` | const | DDL 타입 문자열 목록 |
151
152
  | `DdlType` | type | DDL 타입 유니온 |
152
153
  | 60+ `Expr*` interfaces | interface | 각 표현식 AST 인터페이스 (ExprColumn, ExprValue, ExprEq, ...) |
153
154
  | 13+ `WinFn*` interfaces | interface | Window 함수 AST 인터페이스 |
154
155
  | DDL QueryDef interfaces | interface | DDL 쿼리 정의 인터페이스 (CreateTable, DropTable, ...) |
155
156
 
156
- -> See [docs/types.md](./docs/types.md) for details.
157
+ See [docs/types.md](./docs/types.md) for detailed API documentation.
157
158
 
158
159
  ## Usage Examples
159
160
 
@@ -9,15 +9,16 @@ claude/
9
9
  ├── references/ ← 스킬/규칙에서 참조하는 공유 문서
10
10
  ├── rules/ ← Claude Code 규칙 파일
11
11
  ├── skills/ ← 스킬 파일 디렉토리
12
- ├── sd-check-bash.py ← 훅 스크립트
13
- ├── sd-check-write.py ← 훅 스크립트
14
- ├── sd-session-start.sh ← 훅 스크립트
15
- └── sd-statusline.py ← 훅 스크립트
12
+ ├── sd-check-bash.py ← 훅 스크립트
13
+ ├── sd-check-forbidden-files.py ← 훅 스크립트
14
+ ├── sd-check-write.py ← 훅 스크립트
15
+ ├── sd-session-start.sh ← 훅 스크립트
16
+ └── sd-statusline.py ← 훅 스크립트
16
17
  ```
17
18
 
18
19
  ## `claude/skills/`
19
20
 
20
- 16개 `sd-*` 접두어 스킬 디렉토리. 각 스킬은 아래 파일을 포함한다:
21
+ 다수의 스킬 디렉토리. `sd-*` 접두어 스킬은 postinstall로 소비 프로젝트에 배포되고, `my-apk-decompile/`·`playwright-cli/` 같이 `sd-*`로 시작하지 않는 스킬은 모노레포 로컬 전용이다. 각 스킬은 아래 파일을 포함한다:
21
22
 
22
23
  | 파일 | 필수 | Description |
23
24
  | --------------- | ---- | ------------------------------------------------------------ |
@@ -27,24 +28,28 @@ claude/
27
28
 
28
29
  ### 스킬 목록
29
30
 
30
- | 디렉토리 | 스킬 이름 | Description |
31
- | ------------------- | ---------------- | ------------------------------------------------ |
32
- | `sd-check/` | sd-check | typecheck/lint/test 실행에러 해결 |
33
- | `sd-claude-docs/` | sd-claude-docs | CLAUDE.md + usage 문서 동시 생성 |
34
- | `sd-commit/` | sd-commit | 전체 변경사항에 대한 단일 커밋 생성 |
35
- | `sd-debug/` | sd-debug | 버그 근본 원인 분석 해결책 제안 |
36
- | `sd-deliverable/` | sd-deliverable | 매뉴얼/SIT 문서 생성 |
37
- | `sd-dev/` | sd-dev | 통합 개발 오케스트레이터 (요구명세 TDD → 리뷰) |
38
- | `sd-doc-extract/` | sd-doc-extract | 문서 파일 텍스트/이미지 추출 (Python) |
39
- | `sd-issue/` | sd-issue | GitHub 이슈 생성 |
40
- | `sd-outlook/` | sd-outlook | Outlook 메일 검색/다운로드 (Python) |
41
- | `sd-plan/` | sd-plan | 요구명세/구현계획 작성 |
42
- | `sd-prompt/` | sd-prompt | 스킬/프롬프트 파일 작성/개선 |
43
- | `sd-refactor/` | sd-refactor | 리팩토링 분석 리포트 생성 |
44
- | `sd-review/` | sd-review | 코드 리뷰 리포트 생성 |
45
- | `sd-tdd/` | sd-tdd | TDD 개발 |
46
- | `sd-use/` | sd-use | 자연어 sd-\* 스킬 라우팅 |
47
- | `sd-wbs/` | sd-wbs | WBS Feature 분해 |
31
+ | 디렉토리 | 스킬 이름 | Description |
32
+ | --------------------- | ------------------ | -------------------------------------------------- |
33
+ | `my-apk-decompile/` | my-apk-decompile | APK 파일 디컴파일 소스코드 분석 |
34
+ | `playwright-cli/` | playwright-cli | 브라우저 자동화 Playwright 테스트 |
35
+ | `sd-check/` | sd-check | typecheck/lint/test 실행 에러 해결 |
36
+ | `sd-claude-docs/` | sd-claude-docs | CLAUDE.md + usage 문서 동시 생성 |
37
+ | `sd-commit/` | sd-commit | 전체 변경사항에 대한 단일 커밋 생성 |
38
+ | `sd-debug/` | sd-debug | 버그 근본 원인 분석 해결책 제안 |
39
+ | `sd-deliverable/` | sd-deliverable | 매뉴얼/SIT 문서 생성 |
40
+ | `sd-dev/` | sd-dev | 통합 개발 오케스트레이터 (요구명세 → TDD → 리뷰) |
41
+ | `sd-doc-extract/` | sd-doc-extract | 문서 파일 텍스트/이미지 추출 (Python) |
42
+ | `sd-inner-debug/` | sd-inner-debug | (내부 전용) 근본 원인 분석(ACH) 로직 |
43
+ | `sd-inner-review/` | sd-inner-review | (내부 전용) 코드 리뷰 분석 로직 |
44
+ | `sd-issue/` | sd-issue | GitHub 이슈 생성 |
45
+ | `sd-outlook/` | sd-outlook | Outlook 메일 검색/다운로드 (Python) |
46
+ | `sd-plan/` | sd-plan | 요구명세/구현계획 작성 |
47
+ | `sd-prompt/` | sd-prompt | 스킬/프롬프트 파일 작성/개선 |
48
+ | `sd-refactor/` | sd-refactor | 리팩토링 분석 리포트 생성 |
49
+ | `sd-review/` | sd-review | 코드 리뷰 리포트 생성 |
50
+ | `sd-tdd/` | sd-tdd | TDD 개발 |
51
+ | `sd-use/` | sd-use | 자연어 → sd-\* 스킬 라우팅 |
52
+ | `sd-wbs/` | sd-wbs | WBS Feature 분해 |
48
53
 
49
54
  ### SKILL.md frontmatter 형식
50
55
 
@@ -73,17 +78,21 @@ Claude Code 규칙 파일. 세션 시작 시 `sd-session-start.sh`에 의해 읽
73
78
 
74
79
  ## `claude/references/`
75
80
 
76
- 스킬과 규칙에서 참조하는 공유 문서. 규칙 파일에서 `Read tool로 읽으라`는 지시로 참조된다. 7개 md파일 + 1개 디렉토리.
77
-
78
- | 파일/디렉토리 | Description |
79
- | ----------------------- | ----------------------------------------- |
80
- | `sd-clarify.md` | 사용자 요청 명확화 지침 |
81
- | `sd-debug.md` | 디버그 프로세스 참조 문서 |
82
- | `sd-frontend-design.md` | 프론트엔드 UI 코드 작성 지침 |
83
- | `sd-review.md` | 코드 리뷰 관점 참조 문서 |
84
- | `sd-simplysm14.md` | simplysm 패키지 문서 진입점 |
85
- | `sd-simplysm14/` | simplysm v14 패키지별 usage 문서 디렉토리 |
86
- | `sd-testing.md` | 테스트 작성 지침 |
81
+ 스킬과 규칙에서 참조하는 공유 문서. 규칙 파일에서 `Read tool로 읽으라`는 지시로 참조된다. 공유 문서(md파일)와 패키지별 사용 설명서 디렉토리.
82
+
83
+ ### 공유 문서
84
+
85
+ | 파일 | Description |
86
+ |------|-------------|
87
+ | `sd-frontend-design.md` | 프론트엔드 UI 코드 작성 지침 |
88
+ | `sd-simplysm14.md` | simplysm 패키지 문서 진입점 |
89
+ | `sd-testing.md` | 테스트 작성 지침 |
90
+
91
+ ### 패키지 문서 디렉토리
92
+
93
+ | 디렉토리 | Description |
94
+ |----------|-------------|
95
+ | `sd-simplysm14/` | simplysm v14 패키지별 CLAUDE.md와 usage.md |
87
96
 
88
97
  ## 소스 오브 트루스
89
98
 
@@ -80,4 +80,4 @@
80
80
  - 다른 계정: 마지막 저장/전환 시점의 데이터 사용 (← 저장 시점 표시)
81
81
  - 사용량 정보 없음: `[사용량 정보 없음]` 표시
82
82
 
83
- 남은 시간 형식: `Xd Yh` (일+시간), `Xh Ym` (시간+분), `Xm` (분), `리셋됨` (만료)
83
+ 남은 시간 형식: `Xd Yh` (일+시간), `Xh Ym` (시간+분), `Xm` (분), `0m` (만료)
@@ -1,6 +1,6 @@
1
1
  # Hooks
2
2
 
3
- `claude/` 디렉토리의 훅 스크립트. `postinstall`에 의해 `.claude/`에 설치되고, `settings.json`에 자동 등록되어 Claude Code 세션에서 실행된다.
3
+ `claude/` 디렉토리의 훅 스크립트 (총 5개). `postinstall`에 의해 `.claude/`에 설치되고, `settings.json`에 자동 등록되어 Claude Code 세션에서 실행된다.
4
4
 
5
5
  ## `sd-session-start.sh`
6
6
 
@@ -57,6 +57,24 @@ PreToolUse 훅 (matcher: `Bash`). 금지된 명령어를 차단한다. 명령어
57
57
  | `npx\s+tsc` | `npx tsc` | `pnpm typecheck` 사용 필수 |
58
58
  | `npx\s+eslint` | `npx eslint` | `pnpm lint` 사용 필수 |
59
59
 
60
+ ## `sd-check-forbidden-files.py`
61
+
62
+ PreToolUse 훅 (matcher: `Write|Edit`). `tsconfig.json`, `eslint.config.ts` 등 보호 대상 파일의 수정을 차단한다.
63
+
64
+ ```python
65
+ # stdin으로 tool_input JSON을 받아 file_path를 검사
66
+ # 보호 대상 파일이면 stderr에 메시지 출력 후 exit(2)
67
+ ```
68
+
69
+ 입력: stdin JSON (`tool_input.file_path`)
70
+
71
+ 차단 대상 파일:
72
+
73
+ | 파일명 | 이유 |
74
+ |--------|------|
75
+ | `tsconfig.json` | 빌드 설정 보호 |
76
+ | `eslint.config.ts` | 린트 설정 보호 |
77
+
60
78
  ## `sd-statusline.py`
61
79
 
62
80
  statusLine 훅. Claude Code 상태바에 `폴더 | 모델 | 컨텍스트% | 5h사용량 | 7d사용량 | $추가요금` 형식으로 표시한다.
@@ -99,7 +117,7 @@ statusLine 훅. Claude Code 상태바에 `폴더 | 모델 | 컨텍스트% | 5h
99
117
  | Function | Description |
100
118
  |----------|-------------|
101
119
  | `format_model(model_id)` | 모델 ID를 `Name X.Y` 형식으로 변환 (예: `claude-opus-4-6` → `Opus 4.6`) |
102
- | `format_remaining(reset_epoch)` | 리셋까지 남은 시간을 `Xd Yh` / `Xh Ym` / `Xm` 형식으로 변환 |
120
+ | `format_remaining(reset_epoch)` | 리셋까지 남은 시간을 `Xd Yh` / `Xh Ym` / `Xm` 형식으로 변환. 만료 시 `0m` 반환 |
103
121
  | `format_rate_limit(rate_limit)` | rate limit을 `X%(남은시간)` 형식으로 변환 |
104
122
  | `read_cache()` | 캐시 파일을 읽어 딕셔너리로 반환 |
105
123
  | `should_fetch(cache)` | 캐시가 없거나 180초 이상 경과했으면 `True` |
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## `postinstall.mjs`
6
6
 
7
- `pnpm install` 후 자동 실행되는 라이프사이클 스크립트. `claude/` 디렉토리의 에셋을 소비 프로젝트의 `.claude/`에 설치하고 `settings.json`에 훅을 등록한다.
7
+ `pnpm install` 후 자동 실행되는 라이프사이클 스크립트. `claude/` 디렉토리의 에셋을 소비 프로젝트의 `.claude/`에 복사한다. `settings.json`도 `sd-*` 항목과 함께 복사된다.
8
8
 
9
9
  전체 try-catch로 감싸서 실패해도 `pnpm install`을 차단하지 않는다.
10
10
 
@@ -14,22 +14,9 @@
14
14
  2. **자기 자신 설치 방지**: simplysm 모노레포에서 동일 메이저 버전이면 건너뜀
15
15
  3. **소스 디렉토리 확인**: `claude/` 디렉토리가 없으면 건너뜀
16
16
  4. **cleanSdEntries**: 기존 `.claude/` 내 `sd-*` 항목 삭제
17
- 5. **copySdEntries**: `claude/` → `.claude/` 복사
18
- 6. **setupSettings**: `.claude/settings.json`에 훅 등록
17
+ 5. **copySdEntries**: `claude/sd-*` + `settings.json` → `.claude/` 복사
19
18
 
20
- ### setupSettings 등록
21
-
22
- `settings.json`에 아래 훅을 멱등적으로 등록한다. 기존 항목이 있으면 덮어쓰고, 없으면 추가한다.
23
-
24
- | Hook Type | Matcher | Command | Description |
25
- |-----------|---------|---------|-------------|
26
- | `SessionStart` | `startup\|resume\|clear\|compact` | `bash .claude/sd-session-start.sh` | 세션 시작 시 규칙 파일 경로 출력 |
27
- | `PreToolUse` | `Write` | `python .claude/sd-check-write.py` | 기존 파일 Write 차단 |
28
- | `PreToolUse` | `Bash` | `python .claude/sd-check-bash.py` | 금지 명령어 차단 (git, cd, npx tsc/eslint) |
29
- | `SubagentStart` | (없음) | `bash .claude/sd-session-start.sh` | 서브에이전트 시작 시 규칙 파일 경로 출력 |
30
- | `statusLine` | — | `python .claude/sd-statusline.py` | 상태바 표시 |
31
-
32
- 마이그레이션: 루트 레벨에 잘못 위치한 `SessionStart` 키를 `hooks.SessionStart`로 이동한다.
19
+ `settings.json`은 훅이 미리 등록된 정적 파일로 관리된다. 소비 프로젝트에서 커스텀 훅이 필요하면 `settings.local.json`을 사용한다.
33
20
 
34
21
  ### 내부 함수
35
22
 
@@ -96,8 +83,8 @@ function setupSettings(targetDir) → void
96
83
 
97
84
  동작:
98
85
  1. 기존 `claude/` 디렉토리 삭제
99
- 2. 루트 `.claude/`에서 `sd-*` 항목을 수집
100
- 3. 수집된 항목을 `claude/`로 복사
86
+ 2. 루트 `.claude/`에서 `sd-*` 항목 수집, `settings.json` 포함
87
+ 3. 수집된 항목을 `claude/`로 복사 (단, `SKILL.eval.md`와 `eval_*` 파일은 제외)
101
88
 
102
89
  ---
103
90
 
@@ -1,6 +1,6 @@
1
1
  # @simplysm/sd-claude
2
2
 
3
- Claude Code 에셋을 소비 프로젝트의 `.claude/` 디렉토리에 자동 설치하는 패키지. 16개 스킬(`sd-*` 접두어), 2개 rules 파일, 참조 문서, 훅 스크립트를 포함한다. CLI(`sd-claude`)로 멀티 계정 전환 기능도 제공한다.
3
+ Claude Code 에셋을 소비 프로젝트의 `.claude/` 디렉토리에 자동 설치하는 패키지. 다수의 스킬(`sd-*` 접두어 포함), 2개 rules 파일, 참조 문서, 훅 스크립트를 포함한다. CLI(`sd-claude`)로 멀티 계정 전환 기능도 제공한다.
4
4
 
5
5
  TypeScript 소스 없음. `scripts/`는 Node.js `.mjs` 스크립트이고, `claude/`는 배포 에셋 디렉토리다.
6
6
 
@@ -10,7 +10,7 @@ TypeScript 소스 없음. `scripts/`는 Node.js `.mjs` 스크립트이고, `clau
10
10
  npm install @simplysm/sd-claude
11
11
  ```
12
12
 
13
- 설치 시 `postinstall` 스크립트가 자동 실행되어, `claude/` 디렉토리의 에셋을 프로젝트 루트 `.claude/`에 복사하고 `settings.json`에 훅을 등록한다.
13
+ 설치 시 `postinstall` 스크립트가 자동 실행되어, `claude/sd-*` 에셋과 `settings.json`을 프로젝트 루트 `.claude/`에 복사한다. `settings.json`은 훅이 미리 등록된 정적 파일이다.
14
14
 
15
15
  ## API Overview
16
16
 
@@ -27,7 +27,7 @@ npm install @simplysm/sd-claude
27
27
 
28
28
  | API | Type | Description |
29
29
  |-----|------|-------------|
30
- | `postinstall.mjs` | lifecycle script | `pnpm install` 후 `.claude/`에 에셋 설치 및 settings.json 등록 |
30
+ | `postinstall.mjs` | lifecycle script | `pnpm install` 후 `claude/sd-*``settings.json`을 소비 프로젝트 `.claude/`에 복사 |
31
31
  | `sync.mjs` | lifecycle script | `prepack` 시 루트 `.claude/sd-*` 에셋을 `claude/`로 동기화 |
32
32
  | `forEachSdEntry(dir, callback)` | function | 디렉토리에서 `sd-*` 항목을 2단계 깊이로 탐색하며 콜백 호출 |
33
33
  | `collectSdEntries(dir)` | function | `forEachSdEntry`로 수집한 `sd-*` 항목의 상대 경로 배열 반환 |
@@ -41,6 +41,7 @@ npm install @simplysm/sd-claude
41
41
  | `sd-session-start.sh` | SessionStart / SubagentStart hook | 세션 시작 시 `.claude/rules/*.md`와 `CLAUDE.md` 경로를 출력하여 Claude가 읽도록 안내 |
42
42
  | `sd-check-write.py` | PreToolUse hook (Write) | 기존 파일에 Write 도구 사용 시 차단하고 Edit 도구 사용을 안내 |
43
43
  | `sd-check-bash.py` | PreToolUse hook (Bash) | 금지된 명령어 차단 (git stash/checkout/restore/reset/clean, cd, npx tsc, npx eslint) |
44
+ | `sd-check-forbidden-files.py` | PreToolUse hook (Write/Edit) | `tsconfig.json`, `eslint.config.ts` 등 보호 파일 수정 차단 |
44
45
  | `sd-statusline.py` | statusLine hook | 상태바에 `폴더 | 모델 | 컨텍스트% | 5h사용량 | 7d사용량 | $추가요금` 표시 |
45
46
 
46
47
  → See [docs/hooks.md](./docs/hooks.md) for details.
@@ -49,9 +50,9 @@ npm install @simplysm/sd-claude
49
50
 
50
51
  | API | Type | Description |
51
52
  |-----|------|-------------|
52
- | `claude/skills/` | asset directory | 16개 sd-* 스킬 디렉토리 (각 스킬은 `SKILL.md` + 선택적 `references/` 포함) |
53
+ | `claude/skills/` | asset directory | 16개 sd-* 스킬 디렉토리 (각 스킬은 `SKILL.md` + 선택적 `SKILL.eval.md`와 `references/` 포함) |
53
54
  | `claude/rules/` | asset directory | Claude Code 규칙 파일 (`sd-claude-rules.md`, `sd-options.md`) |
54
- | `claude/references/` | asset directory | 스킬/규칙에서 참조하는 공유 문서 (7개 md파일 + 1개 디렉토리) |
55
+ | `claude/references/` | asset directory | 스킬/규칙에서 참조하는 공유 문서 패키지 문서 디렉토리 |
55
56
 
56
57
  → See [docs/assets.md](./docs/assets.md) for details.
57
58