codesyncer 2.1.0 β 2.1.2
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/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/templates/en/root_claude.md +239 -0
- package/dist/templates/en/setup_guide.md +30 -11
- package/dist/templates/ko/root_claude.md +239 -0
- package/dist/templates/ko/setup_guide.md +30 -11
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +5 -116
- package/dist/utils/scanner.js.map +1 -1
- package/package.json +1 -1
- package/src/templates/en/root_claude.md +239 -0
- package/src/templates/en/setup_guide.md +30 -11
- package/src/templates/ko/root_claude.md +239 -0
- package/src/templates/ko/setup_guide.md +30 -11
|
@@ -158,20 +158,35 @@
|
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
-
## π 4λ¨κ³:
|
|
161
|
+
## π 4λ¨κ³: λ£¨νΈ λ¬Έμ μμ±
|
|
162
162
|
|
|
163
|
-
μν¬μ€νμ΄μ€ 루νΈμ
|
|
163
|
+
μν¬μ€νμ΄μ€ 루νΈμ λ€μ νμΌλ€μ μμ±:
|
|
164
164
|
|
|
165
|
-
###
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
### 4.1 CLAUDE.md β **ν΄λ‘λκ° λ¨Όμ μ½λ νμΌ**
|
|
166
|
+
|
|
167
|
+
루νΈμ `CLAUDE.md` μμ± (ν΄λ‘λκ° μλμΌλ‘ μ°Ύλ νμΌ):
|
|
168
|
+
|
|
169
|
+
ν
νλ¦Ώ μ¬μ©: `./templates/[lang]/root_claude.md`
|
|
170
|
+
- [PROJECT_NAME], [GITHUB_USERNAME], [TODAY] κ΅μ²΄
|
|
171
|
+
- [REPO_COUNT]λ₯Ό μ€μ λ ν¬μ§ν 리 κ°μλ‘ κ΅μ²΄
|
|
172
|
+
- λ©ν°λ ν¬ νλ‘μ νΈμμ λͺ
μ
|
|
173
|
+
- MASTER_CODESYNCER.mdλ₯Ό λ¨Όμ μ½μΌλΌκ³ μ§μ
|
|
174
|
+
- μ 체 νλ‘μ νΈ κ³΅ν΅ κ·μΉ λͺ
μ
|
|
175
|
+
|
|
176
|
+
**μ€μ**: μ΄ νμΌμ΄ μμ΄μΌ ν΄λ‘λκ° μΈμ
μμ μ μλμΌλ‘ 컨ν
μ€νΈλ₯Ό λ‘λν©λλ€!
|
|
177
|
+
|
|
178
|
+
### 4.2 .codesyncer/MASTER_CODESYNCER.md
|
|
179
|
+
|
|
180
|
+
μν¬μ€νμ΄μ€ 루νΈμ `.codesyncer/MASTER_CODESYNCER.md` μμ±:
|
|
170
181
|
|
|
171
182
|
ν
νλ¦Ώ μ¬μ©: `./templates/[lang]/master.md`
|
|
172
183
|
- [REPO_TABLE]μ μ€μ κ°μ§λ λ ν¬λ‘ κ΅μ²΄
|
|
173
184
|
- [KEYWORD_MAPPING]μ λ ν¬λ³ ν€μλλ‘ κ΅μ²΄
|
|
174
185
|
- [PROJECT_NAME], [GITHUB_USERNAME] κ΅μ²΄
|
|
186
|
+
- λͺ¨λ λ ν¬μ§ν 리μ μν λμ΄
|
|
187
|
+
- μλ λ ν¬μ§ν 리 μ ν κ·μΉ
|
|
188
|
+
- ν€μλ κΈ°λ° λ€λΉκ²μ΄μ
λ§€ν
|
|
189
|
+
- λ©ν° λ ν¬ μν¬νλ‘μ° μμ
|
|
175
190
|
|
|
176
191
|
---
|
|
177
192
|
|
|
@@ -183,8 +198,10 @@
|
|
|
183
198
|
β
CodeSyncer μ€μ μλ£!
|
|
184
199
|
|
|
185
200
|
μμ±λ νμΌ:
|
|
186
|
-
π
|
|
187
|
-
|
|
201
|
+
π 루νΈ/
|
|
202
|
+
βββ CLAUDE.md β ν΄λ‘λκ° λ¨Όμ μ½λ νμΌ
|
|
203
|
+
βββ .codesyncer/
|
|
204
|
+
βββ MASTER_CODESYNCER.md
|
|
188
205
|
|
|
189
206
|
π [repo1]/.claude/
|
|
190
207
|
βββ CLAUDE.md
|
|
@@ -197,8 +214,10 @@
|
|
|
197
214
|
|
|
198
215
|
λ€μ λ¨κ³:
|
|
199
216
|
1. μμ±λ νμΌ κ²ν
|
|
200
|
-
2. CLAUDE.md
|
|
201
|
-
3.
|
|
217
|
+
2. κ° λ ν¬μ CLAUDE.md 컀μ€ν°λ§μ΄μ¦
|
|
218
|
+
3. λ£¨νΈ CLAUDE.md λλ κ°λ³ λ ν¬ CLAUDE.md μ½κ³ κ°λ° μμ
|
|
219
|
+
|
|
220
|
+
π‘ ν΄λ‘λλ μλμΌλ‘ λ£¨νΈ CLAUDE.mdλ₯Ό μ°Ύμμ μ½μ΅λλ€!
|
|
202
221
|
|
|
203
222
|
CodeSyncer μ¬μ© μ€λΉ μλ£!
|
|
204
223
|
```
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1E,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE1E,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,eAAe,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,WAAW,CAAC;KACnB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,eAAe,EAAE,CAAC;CACtC;AAGD,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,eAAO,MAAM,cAAc,+DAMjB,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAmCrF;AAwDD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKvE"}
|
package/dist/utils/scanner.js
CHANGED
|
@@ -55,12 +55,11 @@ async function scanForRepositories(rootPath) {
|
|
|
55
55
|
const folderPath = path.join(rootPath, entry.name);
|
|
56
56
|
const isRepo = await isValidRepository(folderPath);
|
|
57
57
|
if (isRepo) {
|
|
58
|
-
const type = await detectProjectType(folderPath, entry.name);
|
|
59
58
|
const hasCodeSyncer = await hasCodeSyncerSetup(folderPath);
|
|
60
59
|
repos.push({
|
|
61
60
|
name: entry.name,
|
|
62
61
|
path: folderPath,
|
|
63
|
-
type,
|
|
62
|
+
type: undefined, // AI will analyze
|
|
64
63
|
description: undefined, // AI will analyze
|
|
65
64
|
techStack: undefined, // AI will analyze
|
|
66
65
|
hasCodeSyncer,
|
|
@@ -110,120 +109,10 @@ async function isValidRepository(folderPath) {
|
|
|
110
109
|
return false;
|
|
111
110
|
}
|
|
112
111
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
try {
|
|
118
|
-
// Analyze repository name for hints
|
|
119
|
-
const nameLower = repoName.toLowerCase();
|
|
120
|
-
const nameHints = {
|
|
121
|
-
backend: ['server', 'api', 'backend', 'service', 'socket', 'gateway', 'middleware'],
|
|
122
|
-
frontend: ['client', 'frontend', 'web', 'app', 'ui', 'admin', 'dashboard'],
|
|
123
|
-
mobile: ['mobile', 'ios', 'android', 'app'],
|
|
124
|
-
};
|
|
125
|
-
// Check for Java projects (Spring Boot)
|
|
126
|
-
const hasPomXml = await fs.pathExists(path.join(folderPath, 'pom.xml'));
|
|
127
|
-
const hasGradle = await fs.pathExists(path.join(folderPath, 'build.gradle'));
|
|
128
|
-
if (hasPomXml || hasGradle) {
|
|
129
|
-
// Check if it's Android (mobile) or Spring (backend)
|
|
130
|
-
const hasAndroid = await fs.pathExists(path.join(folderPath, 'app', 'src', 'main', 'AndroidManifest.xml'));
|
|
131
|
-
if (hasAndroid) {
|
|
132
|
-
return 'mobile';
|
|
133
|
-
}
|
|
134
|
-
return 'backend'; // Java Spring Boot
|
|
135
|
-
}
|
|
136
|
-
// Check for Python projects (Django, FastAPI)
|
|
137
|
-
const hasRequirements = await fs.pathExists(path.join(folderPath, 'requirements.txt'));
|
|
138
|
-
const hasPipfile = await fs.pathExists(path.join(folderPath, 'Pipfile'));
|
|
139
|
-
if (hasRequirements || hasPipfile) {
|
|
140
|
-
try {
|
|
141
|
-
let content = '';
|
|
142
|
-
if (hasRequirements) {
|
|
143
|
-
content = await fs.readFile(path.join(folderPath, 'requirements.txt'), 'utf-8');
|
|
144
|
-
}
|
|
145
|
-
// Check for web frameworks
|
|
146
|
-
if (content.includes('django') || content.includes('fastapi') || content.includes('flask')) {
|
|
147
|
-
return 'backend';
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// If can't read file, default to backend
|
|
152
|
-
}
|
|
153
|
-
return 'backend'; // Python backend
|
|
154
|
-
}
|
|
155
|
-
// Check for Node.js projects
|
|
156
|
-
const packageJsonPath = path.join(folderPath, 'package.json');
|
|
157
|
-
if (await fs.pathExists(packageJsonPath)) {
|
|
158
|
-
const packageJson = await fs.readJson(packageJsonPath);
|
|
159
|
-
const deps = {
|
|
160
|
-
...packageJson.dependencies,
|
|
161
|
-
...packageJson.devDependencies,
|
|
162
|
-
};
|
|
163
|
-
// Check for mobile
|
|
164
|
-
if (deps['react-native'] || deps['expo'] || deps['@react-native']) {
|
|
165
|
-
return 'mobile';
|
|
166
|
-
}
|
|
167
|
-
// Strong hint from repo name (socket server, api server, etc.)
|
|
168
|
-
if (nameHints.backend.some(keyword => nameLower.includes(keyword))) {
|
|
169
|
-
// If it has socket.io or backend keywords in name, prioritize backend
|
|
170
|
-
if (deps['socket.io'] || deps['express'] || deps['fastify'] || deps['@nestjs/core']) {
|
|
171
|
-
return 'backend';
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Check for frontend (React, Vue, etc.)
|
|
175
|
-
if (deps['react'] || deps['vue'] || deps['angular'] || deps['svelte']) {
|
|
176
|
-
// Check repo name hints
|
|
177
|
-
if (nameHints.frontend.some(keyword => nameLower.includes(keyword))) {
|
|
178
|
-
return 'frontend';
|
|
179
|
-
}
|
|
180
|
-
// Check if it's Next.js (could be fullstack)
|
|
181
|
-
if (deps['next']) {
|
|
182
|
-
// If has database or backend hints in name, it's fullstack
|
|
183
|
-
if (deps['prisma'] || deps['mongoose'] || deps['@prisma/client'] ||
|
|
184
|
-
nameLower.includes('fullstack') || nameLower.includes('full-stack')) {
|
|
185
|
-
return 'fullstack';
|
|
186
|
-
}
|
|
187
|
-
// If name suggests frontend only, return frontend
|
|
188
|
-
if (nameHints.frontend.some(keyword => nameLower.includes(keyword))) {
|
|
189
|
-
return 'frontend';
|
|
190
|
-
}
|
|
191
|
-
// Next.js with no DB is usually frontend
|
|
192
|
-
return 'frontend';
|
|
193
|
-
}
|
|
194
|
-
return 'frontend';
|
|
195
|
-
}
|
|
196
|
-
// Check for backend (Express, Fastify, NestJS, Socket.IO)
|
|
197
|
-
if (deps['express'] || deps['fastify'] || deps['koa'] || deps['@nestjs/core'] ||
|
|
198
|
-
deps['socket.io'] || deps['ws']) {
|
|
199
|
-
return 'backend';
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
// Check for mobile-specific files
|
|
203
|
-
const hasPodfile = await fs.pathExists(path.join(folderPath, 'ios', 'Podfile'));
|
|
204
|
-
const hasAndroidGradle = await fs.pathExists(path.join(folderPath, 'android', 'build.gradle'));
|
|
205
|
-
if (hasPodfile || hasAndroidGradle) {
|
|
206
|
-
return 'mobile';
|
|
207
|
-
}
|
|
208
|
-
// Use repo name as fallback
|
|
209
|
-
if (nameHints.backend.some(keyword => nameLower.includes(keyword))) {
|
|
210
|
-
return 'backend';
|
|
211
|
-
}
|
|
212
|
-
if (nameHints.frontend.some(keyword => nameLower.includes(keyword))) {
|
|
213
|
-
return 'frontend';
|
|
214
|
-
}
|
|
215
|
-
if (nameHints.mobile.some(keyword => nameLower.includes(keyword))) {
|
|
216
|
-
return 'mobile';
|
|
217
|
-
}
|
|
218
|
-
// Default to fullstack if can't determine
|
|
219
|
-
return 'fullstack';
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
return 'fullstack';
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// Tech stack and description detection removed
|
|
226
|
-
// AI will analyze these accurately during setup phase
|
|
112
|
+
// All project analysis removed - AI will analyze during setup phase
|
|
113
|
+
// - Project type (frontend/backend/mobile/fullstack)
|
|
114
|
+
// - Tech stack
|
|
115
|
+
// - Description
|
|
227
116
|
/**
|
|
228
117
|
* Check if CodeSyncer is already set up in the repository
|
|
229
118
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# CLAUDE.md - [PROJECT_NAME] Multi-Repo Project
|
|
2
|
+
|
|
3
|
+
> **π― This is a Multi-Repository Workspace**
|
|
4
|
+
>
|
|
5
|
+
> Each repository is an independent project, working together collaboratively.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## π First Thing to Do
|
|
10
|
+
|
|
11
|
+
**If you've read this file, immediately read the following file:**
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
.codesyncer/MASTER_CODESYNCER.md
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
β This file contains **all repository information**, **auto-switching rules**, and **keyword mappings**.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## ποΈ Project Overview
|
|
22
|
+
|
|
23
|
+
- **Project Name**: [PROJECT_NAME]
|
|
24
|
+
- **GitHub**: https://github.com/[GITHUB_USERNAME]/[PROJECT_NAME]
|
|
25
|
+
- **Created**: [TODAY]
|
|
26
|
+
- **Repositories**: [REPO_COUNT]
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## ποΈ Repository Structure
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
[PROJECT_NAME]/
|
|
34
|
+
βββ CLAUDE.md (current file)
|
|
35
|
+
βββ .codesyncer/
|
|
36
|
+
β βββ MASTER_CODESYNCER.md β Multi-repo navigation
|
|
37
|
+
β
|
|
38
|
+
βββ [repo1]/
|
|
39
|
+
β βββ .claude/
|
|
40
|
+
β βββ CLAUDE.md (individual repo rules)
|
|
41
|
+
β
|
|
42
|
+
βββ [repo2]/
|
|
43
|
+
β βββ .claude/
|
|
44
|
+
β βββ CLAUDE.md (individual repo rules)
|
|
45
|
+
β
|
|
46
|
+
βββ ...
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## π¨ Important Rules
|
|
52
|
+
|
|
53
|
+
### 1. Check Repository Before Working
|
|
54
|
+
Always verify which repository you're working in:
|
|
55
|
+
```bash
|
|
56
|
+
pwd # Check current directory
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. Read CLAUDE.md When Switching Repos
|
|
60
|
+
Every time you work in a new repo:
|
|
61
|
+
```
|
|
62
|
+
"Read [repo-name]/.claude/CLAUDE.md"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. No Work in Root Directory
|
|
66
|
+
Never code in root directory. Always navigate to specific repo before working.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## π Multi-Repo Workflow
|
|
71
|
+
|
|
72
|
+
### Scenario 1: User Specifies Specific Repo
|
|
73
|
+
```
|
|
74
|
+
User: "Add login API to backend"
|
|
75
|
+
β
|
|
76
|
+
1. Check MASTER_CODESYNCER.md for "backend" keyword β find api-server repo
|
|
77
|
+
2. Read api-server/.claude/CLAUDE.md
|
|
78
|
+
3. Work in api-server
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Scenario 2: Multiple Repos Need Changes
|
|
82
|
+
```
|
|
83
|
+
User: "Add order feature"
|
|
84
|
+
β
|
|
85
|
+
1. "Order feature requires both backend (API) and frontend (UI). Proceed?"
|
|
86
|
+
2. After user confirmation
|
|
87
|
+
3. Work on API in api-server β report completion
|
|
88
|
+
4. Work on UI in web-client β report completion
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Scenario 3: Unclear Which Repo
|
|
92
|
+
```
|
|
93
|
+
1. Check keyword mapping in MASTER_CODESYNCER.md
|
|
94
|
+
2. If unclear, ask user
|
|
95
|
+
"Which repo should I work in?"
|
|
96
|
+
- A) api-server (backend)
|
|
97
|
+
- B) web-client (frontend)
|
|
98
|
+
- C) mobile-app (mobile)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## π Project-Wide Common Rules
|
|
104
|
+
|
|
105
|
+
The following rules apply to **all repositories**:
|
|
106
|
+
|
|
107
|
+
### Coding Standards
|
|
108
|
+
- β
Use TypeScript strict mode
|
|
109
|
+
- β
Explicit type definitions required
|
|
110
|
+
- β
Prefer functional programming
|
|
111
|
+
- β
Document all functions/components
|
|
112
|
+
- β
Error handling required
|
|
113
|
+
|
|
114
|
+
### Comment Tag System
|
|
115
|
+
Use the same tags across all repos:
|
|
116
|
+
```typescript
|
|
117
|
+
@codesyncer-rule // Special rules
|
|
118
|
+
@codesyncer-inference // Inference with reasoning
|
|
119
|
+
@codesyncer-decision // Decisions after discussion
|
|
120
|
+
@codesyncer-todo // User confirmation needed
|
|
121
|
+
@codesyncer-context // Business context explanation
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Details: `.claude/COMMENT_GUIDE.md` in each repo
|
|
125
|
+
|
|
126
|
+
### No-Inference Zones
|
|
127
|
+
**Never infer, always ask the user:**
|
|
128
|
+
- π° Business logic numbers (prices, fees, limits, discounts)
|
|
129
|
+
- π API endpoint URLs
|
|
130
|
+
- π Security settings (token expiry, encryption methods)
|
|
131
|
+
- ποΈ Database schema
|
|
132
|
+
- π External service integration details
|
|
133
|
+
|
|
134
|
+
### Discussion-Required Keywords
|
|
135
|
+
When these keywords are detected, **stop work automatically** and discuss with user:
|
|
136
|
+
- π΄ **CRITICAL**: payment, billing, auth, permission, delete, personal data, GDPR
|
|
137
|
+
- π‘ **IMPORTANT**: API integration, DB schema, deployment, caching, email
|
|
138
|
+
- π’ **MINOR**: optimization, testing, logging, UI/UX
|
|
139
|
+
|
|
140
|
+
Full keyword list: `.codesyncer/MASTER_CODESYNCER.md`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## π― Session Start Checklist
|
|
145
|
+
|
|
146
|
+
When AI reads this file:
|
|
147
|
+
|
|
148
|
+
1. β
Immediately read `.codesyncer/MASTER_CODESYNCER.md`
|
|
149
|
+
2. β
Understand overall repository structure
|
|
150
|
+
3. β
Check keyword mappings
|
|
151
|
+
4. β
Output ready message:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
β
[PROJECT_NAME] multi-repo project ready!
|
|
155
|
+
|
|
156
|
+
π Repositories: [REPO_COUNT]
|
|
157
|
+
π Read MASTER_CODESYNCER.md
|
|
158
|
+
π― Ready to work
|
|
159
|
+
|
|
160
|
+
Which repo should we work in?
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## π‘ Useful Commands
|
|
166
|
+
|
|
167
|
+
### Navigation
|
|
168
|
+
```
|
|
169
|
+
"Show repo list" β List repos from MASTER_CODESYNCER.md
|
|
170
|
+
"Go to backend" β Read api-server/.claude/CLAUDE.md
|
|
171
|
+
"Switch to frontend" β Read web-client/.claude/CLAUDE.md
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Document Updates
|
|
175
|
+
```
|
|
176
|
+
"Update all structures" β Refresh all ARCHITECTURE.md files
|
|
177
|
+
"Check decision log" β Review DECISIONS.md in each repo
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Multi-Repo Tasks
|
|
181
|
+
```
|
|
182
|
+
"Add ESLint to all repos" β Work sequentially on each repo
|
|
183
|
+
"Need common type defs" β Discuss where to place them
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## π Related Documents
|
|
189
|
+
|
|
190
|
+
### Root Documents
|
|
191
|
+
- **Multi-repo Navigation**: `.codesyncer/MASTER_CODESYNCER.md` β **Required**
|
|
192
|
+
- **Setup Guide**: `.codesyncer/SETUP_GUIDE.md` (Reference after AI setup)
|
|
193
|
+
|
|
194
|
+
### Individual Repo Documents
|
|
195
|
+
In each repo's `.claude/` folder:
|
|
196
|
+
- **CLAUDE.md** - Repo-specific coding rules
|
|
197
|
+
- **ARCHITECTURE.md** - Project structure
|
|
198
|
+
- **COMMENT_GUIDE.md** - Comment writing guide
|
|
199
|
+
- **DECISIONS.md** - Discussion decision log
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## π Search Comments (Entire Project)
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# Find all TODOs across repos
|
|
207
|
+
grep -r "@codesyncer-todo" ./*/.claude/
|
|
208
|
+
|
|
209
|
+
# Find all decision records
|
|
210
|
+
grep -r "@codesyncer-decision" ./*/
|
|
211
|
+
|
|
212
|
+
# Search for specific keyword
|
|
213
|
+
grep -r "payment" ./*/
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## β οΈ Important Notes
|
|
219
|
+
|
|
220
|
+
1. **Context Switch When Changing Repos**
|
|
221
|
+
- Each repo may have independent rules
|
|
222
|
+
- Always check that repo's CLAUDE.md
|
|
223
|
+
|
|
224
|
+
2. **Cross-Repo Dependencies**
|
|
225
|
+
- Discuss changes affecting multiple repos with user
|
|
226
|
+
- Explain clearly when order matters
|
|
227
|
+
|
|
228
|
+
3. **Common Code Management**
|
|
229
|
+
- Discuss location for shared types, utilities
|
|
230
|
+
- Establish duplication prevention strategy
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
**Version**: 1.0.0 (Powered by CodeSyncer)
|
|
235
|
+
**AI Tools**: Optimized for Claude Code | Compatible: Cursor, GitHub Copilot, Continue.dev
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
*CodeSyncer is open source: https://github.com/bitjaru/codesyncer*
|
|
@@ -158,20 +158,35 @@ Use template: `./templates/[lang]/decisions.md`
|
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
161
|
-
## π Step 4: Generate
|
|
161
|
+
## π Step 4: Generate Root Documents
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
Create the following files at the workspace root:
|
|
164
164
|
|
|
165
|
-
###
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
165
|
+
### 4.1 CLAUDE.md β **Claude Reads This First**
|
|
166
|
+
|
|
167
|
+
Create `CLAUDE.md` at root (automatically discovered by Claude):
|
|
168
|
+
|
|
169
|
+
Use template: `./templates/[lang]/root_claude.md`
|
|
170
|
+
- Replace [PROJECT_NAME], [GITHUB_USERNAME], [TODAY]
|
|
171
|
+
- Replace [REPO_COUNT] with actual repository count
|
|
172
|
+
- Indicate this is a multi-repo project
|
|
173
|
+
- Instruct to read MASTER_CODESYNCER.md first
|
|
174
|
+
- Specify project-wide common rules
|
|
175
|
+
|
|
176
|
+
**Important**: This file must exist for Claude to automatically load context at session start!
|
|
177
|
+
|
|
178
|
+
### 4.2 .codesyncer/MASTER_CODESYNCER.md
|
|
179
|
+
|
|
180
|
+
Create `.codesyncer/MASTER_CODESYNCER.md` at workspace root:
|
|
170
181
|
|
|
171
182
|
Use template: `./templates/[lang]/master.md`
|
|
172
183
|
- Replace [REPO_TABLE] with actual detected repos
|
|
173
184
|
- Replace [KEYWORD_MAPPING] with repo-specific keywords
|
|
174
185
|
- Replace [PROJECT_NAME], [GITHUB_USERNAME]
|
|
186
|
+
- List all repositories with their roles
|
|
187
|
+
- Automatic repository switching rules
|
|
188
|
+
- Keyword-based navigation mapping
|
|
189
|
+
- Multi-repo workflow examples
|
|
175
190
|
|
|
176
191
|
---
|
|
177
192
|
|
|
@@ -183,8 +198,10 @@ After generating all files, present a summary:
|
|
|
183
198
|
β
CodeSyncer Setup Complete!
|
|
184
199
|
|
|
185
200
|
Created files:
|
|
186
|
-
π
|
|
187
|
-
|
|
201
|
+
π Root/
|
|
202
|
+
βββ CLAUDE.md β Claude reads this first
|
|
203
|
+
βββ .codesyncer/
|
|
204
|
+
βββ MASTER_CODESYNCER.md
|
|
188
205
|
|
|
189
206
|
π [repo1]/.claude/
|
|
190
207
|
βββ CLAUDE.md
|
|
@@ -197,8 +214,10 @@ Created files:
|
|
|
197
214
|
|
|
198
215
|
Next Steps:
|
|
199
216
|
1. Review the generated files
|
|
200
|
-
2. Customize
|
|
201
|
-
3.
|
|
217
|
+
2. Customize each repo's CLAUDE.md
|
|
218
|
+
3. Read root CLAUDE.md or individual repo CLAUDE.md to start development
|
|
219
|
+
|
|
220
|
+
π‘ Claude automatically finds and reads root CLAUDE.md!
|
|
202
221
|
|
|
203
222
|
Ready to start using CodeSyncer!
|
|
204
223
|
```
|