@simplysm/sd-claude 14.0.49 → 14.0.50

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.
@@ -6,13 +6,12 @@ effort: low
6
6
 
7
7
  # sd-claude-docs: CLAUDE.md + README.md/docs 통합 생성
8
8
 
9
- 프로젝트를 분석하여 CLAUDE.md(내부 개발 컨텍스트)와 README.md/docs/(소비자용 API 문서)를 한 번에 생성한다.
10
- 설정 파일, 스크립트, 소스 코드에서 검증 가능한 사실만 추출한다. 기존 문서가 있으면 섹션 단위로 병합한다.
9
+ 프로젝트를 분석하여 **CLAUDE.md**(모노레포 내부 개발자용 컨텍스트)와 **README.md + docs/**(패키지 소비자용 API 문서)를 한 번에 생성·갱신한다. 설정 파일·스크립트·소스 코드에서 검증 가능한 사실만 추출하며, 기존 문서는 섹션 단위로 병합한다.
11
10
 
12
- - **라이브러리 프로젝트** (`private: true`가 아닌 패키지가 1개 이상): CLAUDE.md + 각 패키지 `README.md`(+ 필요 시 `docs/`)
11
+ - **라이브러리 프로젝트** (`private: true`가 아닌 패키지 1개 이상 존재): CLAUDE.md + 각 패키지 `README.md` (+ 분량 조건에 해당 시 `docs/{category}/{entry}.md` 트리)
13
12
  - **소비앱** (모든 패키지가 `private: true`): CLAUDE.md만 생성
14
13
 
15
- CLAUDE.md는 모노레포 **내부 개발자(LLM 포함)** 용 컨텍스트이고, README.md + docs/는 **패키지 소비자** API/사용 지침 문서다. 문서는 독립적으로 유지한다. 패키지 CLAUDE.md 최상단에는 README.md 참조하도록 안내 문구를 삽입한다(Step 3에서 규정).
14
+ **두 문서의 독립성.** CLAUDE.md는 **모노레포 내부 개발자(LLM 포함)**용, README.md + docs/는 **패키지 소비자**용이다. 대상·관점이 달라 중복되지 않는다. README.md + docs/는 **wiki 스타일**로 구성한다 — 각 export된 class/component(Entry)는 자체 md 파일로 분리되어, 소비자(특히 LLM)가 필요한 Entry 하나만 조회할 수 있게 한다. README.md 인덱스, 상세는 Entry 파일에 둔다.
16
15
 
17
16
  ## 사용법
18
17
 
@@ -21,7 +20,33 @@ CLAUDE.md는 모노레포 **내부 개발자(LLM 포함)** 용 컨텍스트이
21
20
  /sd-claude-docs angular ← packages/angular 만
22
21
  ```
23
22
 
24
- ## Step 1: 프로젝트 설정 분석
23
+ ## 공통 규칙
24
+
25
+ ### 작성 언어
26
+
27
+ 모든 문서는 **대화언어**로 작성한다. "적절히", "필요에 따라", "상황에 따라" 같은 모호한 표현을 사용하지 않는다.
28
+
29
+ ### 문서 병합 규칙
30
+
31
+ 기존 문서가 있으면 섹션(`##` 제목) 단위로 비교한다.
32
+
33
+ 1. 동일 주제의 기존 섹션 → 새 콘텐츠로 **대체**
34
+ 2. 대응 섹션이 없는 기존 섹션 → 그대로 **보존**
35
+ 3. 기존 섹션 위치를 유지하고, 새로 생성된 섹션은 마지막 기존 섹션 **뒤에** 추가
36
+
37
+ ### 출력 경로 규칙
38
+
39
+ 라이브러리 프로젝트에서 패키지 소비자용 문서는 **해당 패키지 루트**에 위치한다.
40
+
41
+ | 구분 | CLAUDE.md | README.md | docs/ |
42
+ |------|-----------|-----------|-------|
43
+ | 모노레포 (각 패키지) | `{패키지 경로}/CLAUDE.md` | `{패키지 경로}/README.md` | `{패키지 경로}/docs/{category}/{entry}.md` |
44
+ | 모노레포 루트 | `./CLAUDE.md` | — | — |
45
+ | 단일 패키지 (루트=패키지) | `./CLAUDE.md` | `./README.md` | `./docs/{category}/{entry}.md` |
46
+
47
+ `private: true` 패키지는 README.md / docs/를 생성하지 않는다 (CLAUDE.md만).
48
+
49
+ ## Step 1: 사전 분석
25
50
 
26
51
  ### 1-1. 패키지 매니저 감지
27
52
 
@@ -37,11 +62,11 @@ CLAUDE.md는 모노레포 **내부 개발자(LLM 포함)** 용 컨텍스트이
37
62
  루트 `package.json`의 `scripts` 섹션을 읽고 각 스크립트의 CLI 도구를 분석한다.
38
63
 
39
64
  - **잘 알려진 도구** (`tsc`, `vitest`, `eslint`, `prettier`, `playwright` 등): 명령어를 그대로 기록
40
- - **커스텀 CLI 또는 프로젝트 내부 스크립트** (예: `tsx packages/.../cli.ts`): Bash에서 `--help`를 먼저 실행한다(5초 타임아웃). `--help`로 하위 명령어와 주요 옵션을 파악할 수 있으면 그 결과를 사용한다. `--help`가 실패하거나 유용한 정보가 없을 때에만 소스 코드를 Read로 분석한다
65
+ - **커스텀 CLI** (예: `tsx packages/.../cli.ts`): Bash에서 `--help`를 먼저 실행한다 (5초 타임아웃). 유용한 정보가 있으면 그 결과를 사용한다. `--help`가 실패하거나 정보가 부족할 때만 소스 코드를 Read로 분석한다.
41
66
 
42
67
  ### 1-3. 코딩 규칙 추출
43
68
 
44
- 프로젝트 루트에서 아래 설정 파일을 찾아 읽는다 (없는 파일은 건너뛴다):
69
+ 아래 설정 파일을 찾아 읽는다 (없는 파일은 건너뛴다):
45
70
 
46
71
  - ESLint: `eslint.config.*`, `.eslintrc.*`
47
72
  - Prettier: `.prettierrc*`, `prettier.config.*`
@@ -49,113 +74,99 @@ CLAUDE.md는 모노레포 **내부 개발자(LLM 포함)** 용 컨텍스트이
49
74
  - TypeScript: `tsconfig.json` → `compilerOptions`
50
75
  - Stylelint: `.stylelintrc*`, `stylelint.config.*`
51
76
 
52
- 아래 기준으로 규칙을 선별한다:
77
+ 선별 기준:
53
78
 
54
- - 도구의 기본값과 다른 설정 (예: TypeScript `verbatimModuleSyntax: true`, Prettier `printWidth: 100`)
79
+ - 도구 기본값과 다른 설정 (예: TypeScript `verbatimModuleSyntax: true`, Prettier `printWidth: 100`)
55
80
  - error 수준의 비표준 규칙 (예: `no-console: error`)
56
81
  - 특정 API를 금지하거나 요구하는 규칙 (예: `Buffer` 금지 → `Uint8Array` 사용)
57
82
 
58
- ### 1-4. .claude/rules/ 스캔
83
+ ### 1-4. `.claude/rules/` 스캔
59
84
 
60
- `.claude/rules/` 디렉토리가 존재하면 모든 `.md` 파일을 읽는다. 이미 다루고 있는 주제를 목록화한다. 해당 주제는 **CLAUDE.md에서 제외**한다 — 파일 간 규칙 중복은 LLM이 고유한 지침 대신 중복 컨텍스트를 처리하게 되어 지침의 효과를 약화시킨다.
85
+ 디렉토리가 존재하면 모든 `.md` 파일을 읽어 이미 다루고 있는 주제를 목록화한다. 해당 주제는 **CLAUDE.md에서 제외**한다 — 파일 간 규칙 중복은 LLM이 고유 지침 대신 중복 컨텍스트를 처리하게 되어 지침의 효과를 약화시킨다.
61
86
 
62
87
  ### 1-5. 프로젝트 유형 감지
63
88
 
64
- 모노레포인 경우 모든 패키지의 `package.json`을, 단일 패키지인 경우 루트 `package.json`을 확인한다.
89
+ 모노레포면 모든 패키지의 `package.json`을, 단일 패키지면 루트 `package.json`을 확인한다.
65
90
 
66
- - **라이브러리 프로젝트**: `private: true`가 아닌 패키지가 1개 이상 존재
91
+ - **라이브러리 프로젝트**: `private: true`가 아닌 패키지가 1개 이상
67
92
  - **소비앱**: 모든 패키지가 `private: true`
68
93
 
69
- 라이브러리 프로젝트인 경우 소비자용 문서의 출력 경로는 **해당 패키지 루트**다:
70
- - `README.md` → `{패키지 경로}/README.md`
71
- - 분량이 많은 경우 `{패키지 경로}/docs/*.md`
72
- - 단일 패키지 프로젝트면 루트가 곧 패키지 경로다 (`./README.md`, `./docs/`)
73
-
74
- `private: true` 패키지는 README.md / docs/를 생성하지 않는다 (CLAUDE.md만).
94
+ ## Step 2: 처리 대상 결정
75
95
 
76
- ## Step 2: 분기
96
+ 인자 유무와 워크스페이스 구성으로 **처리 대상 패키지 경로 목록**을 확정한다. 단일 패키지 프로젝트는 루트를 "가상 패키지"로 취급하여 동일 프로세스를 적용한다 (자기참조 없음).
77
97
 
78
- ### 패키지명 지정
98
+ | 경우 | 처리 대상 | Step 4 수행 |
99
+ |------|-----------|-------------|
100
+ | 인자 있음 | `packages/{인자}/package.json`이 존재하면 해당 1개 경로. 없으면 사용자에게 알리고 종료. | 건너뜀 |
101
+ | 인자 없음 + 모노레포 | `packages/` 하위 모든 패키지 경로 | 수행 |
102
+ | 인자 없음 + 단일 패키지 | 루트 경로 1개 (루트 = 패키지) | 건너뜀 |
79
103
 
80
- `packages/{패키지명}/package.json`이 존재하는지 확인한다. 없으면 사용자에게 알린다.
81
- 존재하면 해당 패키지에 대해 subagent 1개를 실행한다 (3단계의 subagent 프롬프트와 동일).
82
- root 문서는 생성·변경하지 않는다.
104
+ ## Step 3: 패키지 처리
83
105
 
84
- ### 전체 실행 — 단일 패키지 프로젝트
106
+ ### 3-1. 소스 병합
85
107
 
86
- `workspaces` 필드가 없고 `pnpm-workspace.yaml`도 없으면 단일 패키지다.
87
- 패키지별 CLAUDE.md는 생성하지 않는다. 바로 4단계로 진행하여 root 문서를 생성한다.
88
- 라이브러리 프로젝트인 경우 `package-doc-gen.md`의 Step 2~4를 root에 직접 적용하여 루트의 `README.md` (+ 분량이 많으면 `docs/*.md`)를 생성한다.
108
+ subagent가 개별 파일을 하나씩 Read하는 대신 병합 파일 1회 Read로 전체 소스를 파악할 수 있게 한다. 컨텍스트 소비를 대폭 줄이는 핵심 단계이다.
89
109
 
90
- ### 전체 실행 모노레포
110
+ 패키지에 대해 Bash로 실행 (여러 패키지면 병렬):
91
111
 
92
- `packages/` 하위의 모든 패키지를 탐색하여 전체를 처리 대상으로 한다. 3단계로 진행한다.
112
+ ```bash
113
+ bash .claude/skills/sd-claude-docs/merge-source.sh {패키지경로} ./tmp/{패키지명}-source.txt
114
+ ```
93
115
 
94
- ## Step 3: 패키지별 문서 생성 (모노레포)
116
+ ### 3-2. subagent 병렬 실행
95
117
 
96
- 패키지에 대해 **Agent 도구로 subagent(effort: `low`)를 병렬 실행**한다.
97
- 하나의 메시지에서 모든 패키지의 Agent 호출을 동시에 보낸다.
118
+ 처리 대상 목록의 경로에 대해 **Agent 도구로 subagent(effort: `low`)를 병렬 실행**한다. 하나의 메시지에서 모든 Agent 호출을 동시에 보낸다.
98
119
 
99
- ### subagent 프롬프트
120
+ #### subagent 프롬프트
100
121
 
101
122
  ```
102
- {패키지 경로}의 CLAUDE.md와 README.md/docs를 생성한다.
123
+ {패키지 경로}의 CLAUDE.md와 README.md/docs를 생성·갱신한다.
103
124
 
104
- ## CLAUDE.md 생성 (`{패키지 경로}/CLAUDE.md`)
125
+ `.claude/skills/sd-claude-docs/references/package-docs.md`를 읽고 지침을 따른다.
105
126
 
106
- `.claude/skills/sd-claude-docs/references/package-claudemd.md`를 읽고 그 지침을 따른다.
107
-
108
- 루트 수준 설정 (이 내용과 동일한 정보는 패키지 CLAUDE.md에 반복하지 않는다):
109
- {1단계에서 추출한 코딩 규칙 컴파일러 설정 목록}
110
-
111
- ## README.md / docs/ 생성 {`private: true` 패키지이면 이 섹션 전체 생략}
112
-
113
- `.claude/skills/sd-claude-docs/references/package-doc-gen.md`를 읽고 그 지침을 따른다.
114
- 출력 경로: `{패키지 경로}/` (README.md는 항상, docs/는 분량 분기 조건에 해당될 때)
127
+ 전달 사항:
128
+ - 패키지 경로: {패키지 경로}
129
+ - 소스 병합 파일: {./tmp/{패키지명}-source.txt의 절대 경로}
130
+ - 루트 수준 설정 (이 내용과 중복되는 정보는 패키지 CLAUDE.md에 반복하지 않는다):
131
+ {Step 1에서 추출한 코딩 규칙·컴파일러 설정 목록}
115
132
  ```
116
133
 
117
- 각 subagent는 소스 코드를 한 번 분석하여 CLAUDE.md(Key Patterns)와 README.md/docs(API 문서) 모두에 활용한다.
134
+ 각 subagent는 소스 병합 파일을 한 번 Read하여 CLAUDE.md(Key Patterns)와 README.md/docs(API 문서) 모두에 활용한다.
118
135
 
119
136
  ### subagent 반환 정보
120
137
 
121
- - CLAUDE.md 생성 여부
122
- - README.md 생성 여부 + 문서 구조 (README 단독 / README + docs/)
123
- - API 항목
138
+ - 패키지 경로
139
+ - CLAUDE.md 생성/갱신/건너뜀 여부
140
+ - README.md 생성/갱신/건너뜀 여부 + 구조 (README 단독 / README + docs 트리)
141
+ - Entry 수 / 총 API 항목 수
124
142
  - 생성된 파일 목록
125
143
 
126
- ## Step 4: root 문서 생성
144
+ ## Step 4: 루트 CLAUDE.md 생성
127
145
 
128
- ### root CLAUDE.md
146
+ Step 2의 "Step 4 수행" 열이 "수행"인 경우에만 진행한다.
129
147
 
130
- 1단계의 정보를 조합하여 루트 CLAUDE.md 콘텐츠를 생성한다. `.claude/rules/`에서 이미 다루고 있는 주제(1-4단계에서 감지)는 제외한다.
148
+ ### 4-1. 콘텐츠 구성
131
149
 
132
- **모노레포인 경우**: 3단계에서 생성된 패키지의 `CLAUDE.md`를 Read하여 참고한다. 패키지별 CLAUDE.md에 이미 기술된 상세 내용(아키텍처, 패턴 등) 루트에 중복 기술하지 않고, 아키텍처 섹션에서 패키지 간 의존 관계와 역할 요약만 포함한다.
150
+ Step 1 결과와 Step 3패키지 CLAUDE.md 조합하여 루트 CLAUDE.md를 생성한다. `.claude/rules/`에서 이미 다루는 주제(1-4에서 감지)는 **제외**한다. 패키지 CLAUDE.md에 기술된 상세(아키텍처, 패턴 등) 루트에 중복하지 않고, 아키텍처 섹션에서 패키지 간 의존 관계와 역할 요약만 포함한다.
133
151
 
134
152
  #### 포함할 섹션
135
153
 
136
- - **프로젝트 정보**: `package.json`의 `name`과 `description`, 패키지 매니저
137
- - **모노레포 구조**: `workspaces` 필드 또는 `pnpm-workspace.yaml`이 있으면 워크스페이스 경로를 나열하고패키지를 간략히 설명 (패키지당 10단어 이내)
138
- - **기술 스택**: `dependencies`/`devDependencies`의 주요 라이브러리 — 프레임워크, 번들러, 테스트 도구 (최대 10개)
139
- - **명령어**: 1-2단계의 스크립트를 bash 코드 블록으로 포매팅하고 인라인 주석 추가, 카테고리별 그룹화
140
- - **아키텍처**: 모노레포인 경우 패키지별 CLAUDE.md에서 역할을 읽어 패키지 간 의존 관계를 요약한다
141
- - **코딩 규칙**: 1-3단계에서 선별한 규칙을 불릿 리스트로 포매팅
154
+ - **프로젝트 정보**: 루트 `package.json`의 `name`/`description`, 패키지 매니저
155
+ - **모노레포 구조**: 워크스페이스 경로 나열,패키지 10단어 이내 요약
156
+ - **기술 스택**: 주요 프레임워크·번들러·테스트 도구 (최대 10개)
157
+ - **명령어**: 1-2 스크립트를 카테고리별 bash 코드 블록으로 포매팅, 인라인 주석 추가
158
+ - **아키텍처**: 패키지 간 의존 관계 및 역할 요약
159
+ - **코딩 규칙**: 1-3에서 선별한 규칙을 불릿 리스트로 포매팅
142
160
 
143
- 실질적 내용이 없는 섹션은 생략한다. 프로젝트에 필요하면목록에 없는 섹션도 추가한다 (예: 통합 테스트).
161
+ 실질적 내용이 없는 섹션은 생략한다. 필요 섹션도 추가한다 (예: 통합 테스트).
144
162
 
145
- #### 병합
163
+ ### 4-2. 병합
146
164
 
147
- - **기존 파일이 없는 경우**: 바로 저장
148
- - **기존 파일이 있는 경우**:
149
- 1. 기존 파일을 읽는다
150
- 2. 새 콘텐츠와 기존 콘텐츠를 섹션(`##` 제목) 단위로 비교한다
151
- 3. 병합 규칙:
152
- - 생성된 섹션과 동일한 주제의 기존 섹션 → 새 콘텐츠로 **대체**
153
- - 생성된 대응 섹션이 없는 기존 섹션 → 그대로 **보존**
154
- - 기존 섹션의 위치를 보존한다. 새로 생성된 섹션은 반드시 마지막 기존 섹션 뒤에 추가한다
165
+ 공통 규칙의 "문서 병합 규칙"을 적용한다.
155
166
 
156
- #### 참고 예시
167
+ ### 참고 예시
157
168
 
158
- 아래의 **섹션 구조와 포매팅 스타일**을 따른다. **CLAUDE.md는 반드시 대화언어로 작성한다.**
169
+ 아래 **섹션 구조와 포매팅 스타일**을 따른다.
159
170
 
160
171
  ````markdown
161
172
  # Simplysm
@@ -164,8 +175,6 @@ pnpm 모노레포. 패키지 경로: `packages/*`, 테스트: `tests/*`
164
175
 
165
176
  ## 명령어
166
177
 
167
- 모든 명령어는 내부적으로 `pnpm sd-cli <command>`를 실행한다.
168
-
169
178
  ### 개발
170
179
 
171
180
  ```bash
@@ -176,7 +185,7 @@ pnpm watch [targets..] # 라이브러리 패키지를 watch
176
185
  ### 코드 품질
177
186
 
178
187
  ```bash
179
- pnpm check [targets..] # 전체 검사 (typecheck + lint 병렬)
188
+ pnpm check [targets..] # 전체 검사
180
189
  pnpm typecheck [targets..] # TypeScript 타입 체크
181
190
  ```
182
191
 
@@ -186,7 +195,7 @@ pnpm typecheck [targets..] # TypeScript 타입 체크
186
195
 
187
196
  ```
188
197
  UI: angular (Angular)
189
- 서비스: service-server (Fastify) / service-client / service-common
198
+ 서비스: service-server / service-client / service-common
190
199
  코어: core-common (중립) / core-browser / core-node
191
200
  ```
192
201
 
@@ -201,20 +210,20 @@ UI: angular (Angular)
201
210
  ```markdown
202
211
  ## sd-claude-docs 결과
203
212
 
204
- | 패키지 | CLAUDE.md | README.md | 구조 | API 항목 |
213
+ | 패키지 | CLAUDE.md | README.md | 구조 | Entry / API |
205
214
  |--------|-----------|-----------|------|-------------|
206
215
  | root | 생성 | — | — | — |
207
- | @simplysm/core-common | 갱신 | 갱신 | README 단독 | 35 |
208
- | @simplysm/angular | 갱신 | 갱신 | README + docs/ | 126 |
209
- | @simplysm/storage | 생성 | 생성 | README 단독 | 8 |
216
+ | @simplysm/core-common | 갱신 | 갱신 | README 단독 | 8 / 35 |
217
+ | @simplysm/angular | 갱신 | 갱신 | README + docs 트리 | 72 / 126 |
210
218
  | @simplysm/internal | 생성 | — (private) | — | — |
211
219
 
212
220
  ### 생성된 파일 목록
213
221
  - CLAUDE.md (root)
214
222
  - packages/core-common/CLAUDE.md
215
223
  - packages/core-common/README.md
224
+ - packages/core-common/docs/utils/string-utils.md
216
225
  - packages/angular/CLAUDE.md
217
226
  - packages/angular/README.md
218
- - packages/angular/docs/types.md
227
+ - packages/angular/docs/{category}/{entry}.md
219
228
  - ...
220
229
  ```
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ # 패키지 소스 파일을 하나의 텍스트 파일로 병합
3
+ # Usage: merge-source.sh <패키지경로> <출력파일경로>
4
+
5
+ pkg_path="$1"
6
+ output="$2"
7
+
8
+ if [ -z "$pkg_path" ] || [ -z "$output" ]; then
9
+ echo "Usage: $0 <package-path> <output-file>" >&2
10
+ exit 1
11
+ fi
12
+
13
+ mkdir -p "$(dirname "$output")"
14
+
15
+ files=$(find "$pkg_path/src" -name "*.ts" 2>/dev/null | sort)
16
+ [ -d "$pkg_path/scss" ] && files+=$'\n'$(find "$pkg_path/scss" -name "*.scss" 2>/dev/null | sort)
17
+
18
+ echo "$files" | while IFS= read -r f; do
19
+ [ -z "$f" ] && continue
20
+ echo "=== $f ==="
21
+ cat "$f"
22
+ echo
23
+ done > "$output"