codesyncer 1.0.0
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/LICENSE +31 -0
- package/README.ko.md +417 -0
- package/README.md +417 -0
- package/bin/codesyncer.js +3 -0
- package/dist/commands/add-repo.d.ts +3 -0
- package/dist/commands/add-repo.d.ts.map +1 -0
- package/dist/commands/add-repo.js +145 -0
- package/dist/commands/add-repo.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +489 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +123 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/keywords.d.ts +23 -0
- package/dist/constants/keywords.d.ts.map +1 -0
- package/dist/constants/keywords.js +133 -0
- package/dist/constants/keywords.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/templates/en/architecture.md +147 -0
- package/dist/templates/en/claude.md +267 -0
- package/dist/templates/en/comment_guide.md +324 -0
- package/dist/templates/en/decisions.md +227 -0
- package/dist/templates/en/master.md +179 -0
- package/dist/templates/ko/architecture.md +147 -0
- package/dist/templates/ko/claude.md +267 -0
- package/dist/templates/ko/comment_guide.md +324 -0
- package/dist/templates/ko/decisions.md +227 -0
- package/dist/templates/ko/master.md +179 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/messages.d.ts +129 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +168 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/scanner.d.ts +11 -0
- package/dist/utils/scanner.d.ts.map +1 -0
- package/dist/utils/scanner.js +311 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/template-loader.d.ts +18 -0
- package/dist/utils/template-loader.d.ts.map +1 -0
- package/dist/utils/template-loader.js +496 -0
- package/dist/utils/template-loader.js.map +1 -0
- package/package.json +70 -0
- package/src/templates/en/architecture.md +147 -0
- package/src/templates/en/claude.md +267 -0
- package/src/templates/en/comment_guide.md +324 -0
- package/src/templates/en/decisions.md +227 -0
- package/src/templates/en/master.md +179 -0
- package/src/templates/ko/architecture.md +147 -0
- package/src/templates/ko/claude.md +267 -0
- package/src/templates/ko/comment_guide.md +324 -0
- package/src/templates/ko/decisions.md +227 -0
- package/src/templates/ko/master.md +179 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.loadTemplate = loadTemplate;
|
|
37
|
+
exports.replaceTemplateVars = replaceTemplateVars;
|
|
38
|
+
exports.generateMasterDoc = generateMasterDoc;
|
|
39
|
+
exports.generateRepoDoc = generateRepoDoc;
|
|
40
|
+
const fs = __importStar(require("fs-extra"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
/**
|
|
43
|
+
* Load template file from templates directory
|
|
44
|
+
*/
|
|
45
|
+
async function loadTemplate(templateName, lang) {
|
|
46
|
+
const templatePath = path.join(__dirname, '..', 'templates', lang, `${templateName}.md`);
|
|
47
|
+
try {
|
|
48
|
+
return await fs.readFile(templatePath, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`Template ${templateName} not found for language ${lang}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Replace variables in template with actual values
|
|
56
|
+
*/
|
|
57
|
+
function replaceTemplateVars(template, vars) {
|
|
58
|
+
let result = template;
|
|
59
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
60
|
+
const regex = new RegExp(`\\[${key}\\]`, 'g');
|
|
61
|
+
result = result.replace(regex, value);
|
|
62
|
+
}
|
|
63
|
+
// Replace [์ค๋ ๋ ์ง] / [TODAY] with current date
|
|
64
|
+
const today = new Date().toISOString().split('T')[0];
|
|
65
|
+
result = result.replace(/\[์ค๋ ๋ ์ง\]/g, today);
|
|
66
|
+
result = result.replace(/\[TODAY\]/g, today);
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generate master document content
|
|
71
|
+
*/
|
|
72
|
+
async function generateMasterDoc(config) {
|
|
73
|
+
const template = await loadTemplate('master', config.language);
|
|
74
|
+
// Build repository table
|
|
75
|
+
const repoTable = config.repositories
|
|
76
|
+
.map((repo, index) => `| ${repo.name} | ${repo.folder} | ${repo.role} | ${repo.vibeSyncPath} |`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
// Build keyword mapping
|
|
79
|
+
const keywordMapping = config.repositories
|
|
80
|
+
.map((repo) => {
|
|
81
|
+
const keywords = getKeywordsForType(repo.type);
|
|
82
|
+
return `| ${keywords} | ${repo.folder} | cd ${repo.folder} && cat CLAUDE.md |`;
|
|
83
|
+
})
|
|
84
|
+
.join('\n');
|
|
85
|
+
const vars = {
|
|
86
|
+
'ํ๋ก์ ํธ๋ช
': config.projectName,
|
|
87
|
+
PROJECT_NAME: config.projectName,
|
|
88
|
+
'GitHub username': config.githubUsername,
|
|
89
|
+
GITHUB_USERNAME: config.githubUsername,
|
|
90
|
+
REPO_TABLE: repoTable,
|
|
91
|
+
KEYWORD_MAPPING: keywordMapping,
|
|
92
|
+
};
|
|
93
|
+
return replaceTemplateVars(template, vars);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate repository-specific collaboration system docs
|
|
97
|
+
*/
|
|
98
|
+
async function generateRepoDoc(docType, config) {
|
|
99
|
+
const templateName = docType.toLowerCase();
|
|
100
|
+
const template = await loadTemplate(templateName, config.language);
|
|
101
|
+
const vars = {
|
|
102
|
+
'ํ๋ก์ ํธ๋ช
': config.projectName,
|
|
103
|
+
PROJECT_NAME: config.projectName,
|
|
104
|
+
'๊ธฐ์ ์คํ': config.techStack.join(', '),
|
|
105
|
+
TECH_STACK: config.techStack.join(', '),
|
|
106
|
+
PROJECT_TYPE: config.type,
|
|
107
|
+
'ํ๋ก์ ํธ ํ์
': getProjectTypeKorean(config.type),
|
|
108
|
+
};
|
|
109
|
+
let result = replaceTemplateVars(template, vars);
|
|
110
|
+
// For CLAUDE.md, add keywords and code templates
|
|
111
|
+
if (docType === 'CLAUDE') {
|
|
112
|
+
const keywords = formatKeywordsForDoc(config.keywordCategories, config.language);
|
|
113
|
+
result = result.replace('[KEYWORDS]', keywords);
|
|
114
|
+
const codeTemplates = generateCodeTemplates(config.techStack, config.language);
|
|
115
|
+
result = result.replace('[TEMPLATES]', codeTemplates);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get keywords for project type
|
|
121
|
+
*/
|
|
122
|
+
function getKeywordsForType(type) {
|
|
123
|
+
const keywordMap = {
|
|
124
|
+
backend: 'API, ์๋ฒ, ์๋ํฌ์ธํธ, ๋ฐฑ์๋, DB',
|
|
125
|
+
frontend: 'ํ์ด์ง, UI, ํ๋ฉด, ํ๋ก ํธ, ์ปดํฌ๋ํธ',
|
|
126
|
+
mobile: '์ฑ, ๋ชจ๋ฐ์ผ, ์คํฌ๋ฆฐ',
|
|
127
|
+
fullstack: '์ ์ฒด, ํ์คํ',
|
|
128
|
+
};
|
|
129
|
+
return keywordMap[type] || '';
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get Korean translation for project type
|
|
133
|
+
*/
|
|
134
|
+
function getProjectTypeKorean(type) {
|
|
135
|
+
const typeMap = {
|
|
136
|
+
frontend: 'ํ๋ก ํธ์๋',
|
|
137
|
+
backend: '๋ฐฑ์๋',
|
|
138
|
+
mobile: '๋ชจ๋ฐ์ผ',
|
|
139
|
+
fullstack: 'ํ์คํ',
|
|
140
|
+
};
|
|
141
|
+
return typeMap[type] || type;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Format keyword categories for documentation
|
|
145
|
+
*/
|
|
146
|
+
function formatKeywordsForDoc(categories, lang) {
|
|
147
|
+
const enabledCategories = categories.filter((cat) => cat.enabled);
|
|
148
|
+
return enabledCategories
|
|
149
|
+
.map((cat) => {
|
|
150
|
+
const name = lang === 'ko' ? cat.nameKo : cat.name;
|
|
151
|
+
const desc = lang === 'ko' ? cat.descriptionKo : cat.description;
|
|
152
|
+
const keywords = cat.keywords.slice(0, 10).join(', ');
|
|
153
|
+
const moreIndicator = cat.keywords.length > 10 ? ', ...' : '';
|
|
154
|
+
return `- **${name}** (${cat.severity}): ${keywords}${moreIndicator}\n _${desc}_`;
|
|
155
|
+
})
|
|
156
|
+
.join('\n\n');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate simple guidelines based on tech stack
|
|
160
|
+
* Focus on comment tags and basic best practices only
|
|
161
|
+
*/
|
|
162
|
+
function generateCodeTemplates(techStack, lang) {
|
|
163
|
+
const hasJava = techStack.some((tech) => tech.toLowerCase().includes('java'));
|
|
164
|
+
const hasPython = techStack.some((tech) => tech.toLowerCase().includes('python'));
|
|
165
|
+
const hasReact = techStack.some((tech) => tech.toLowerCase().includes('react') || tech.toLowerCase().includes('next'));
|
|
166
|
+
const hasTypeScript = techStack.some((tech) => tech.toLowerCase().includes('typescript'));
|
|
167
|
+
if (hasJava) {
|
|
168
|
+
return getJavaGuidelines(lang);
|
|
169
|
+
}
|
|
170
|
+
else if (hasPython) {
|
|
171
|
+
return getPythonGuidelines(lang);
|
|
172
|
+
}
|
|
173
|
+
else if (hasReact) {
|
|
174
|
+
return getReactGuidelines(lang);
|
|
175
|
+
}
|
|
176
|
+
else if (hasTypeScript) {
|
|
177
|
+
return getTypeScriptGuidelines(lang);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return getGenericGuidelines(lang);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Java basic guidelines
|
|
185
|
+
*/
|
|
186
|
+
function getJavaGuidelines(lang) {
|
|
187
|
+
if (lang === 'ko') {
|
|
188
|
+
return `### โ Java ํ๋ก์ ํธ ๊ฐ์ด๋
|
|
189
|
+
|
|
190
|
+
**์ฃผ์ ์์ฑ ์์:**
|
|
191
|
+
\`\`\`java
|
|
192
|
+
/**
|
|
193
|
+
* ์ฌ์ฉ์ ์๋น์ค
|
|
194
|
+
*
|
|
195
|
+
* @codesyncer-context ์ฌ์ฉ์ ๊ด๋ฆฌ ๋น์ฆ๋์ค ๋ก์ง
|
|
196
|
+
* @codesyncer-rule ํธ๋์ญ์
๊ด๋ฆฌ ํ์
|
|
197
|
+
*/
|
|
198
|
+
@Service
|
|
199
|
+
public class UserService {
|
|
200
|
+
// @codesyncer-inference: BCrypt ์ฌ์ฉ (๋ณด์ ํ์ค)
|
|
201
|
+
private final PasswordEncoder passwordEncoder;
|
|
202
|
+
|
|
203
|
+
// @codesyncer-todo: ์ด๋ฉ์ผ ์ค๋ณต ์ฒดํฌ ์ถ๊ฐ ํ์
|
|
204
|
+
public User createUser(UserDto dto) {
|
|
205
|
+
// @codesyncer-decision: [๋ ์ง] Soft Delete ๋ฐฉ์ ์ฑํ
|
|
206
|
+
return userRepository.save(user);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
\`\`\`
|
|
210
|
+
|
|
211
|
+
**๊ธฐ๋ณธ ์์น:**
|
|
212
|
+
- ๋ชจ๋ public ๋ฉ์๋์ JavaDoc ์์ฑ
|
|
213
|
+
- ์ถ๋ก ํ ๋ด์ฉ์ \`@codesyncer-inference\` ํ๊ทธ๋ก ๋ช
์
|
|
214
|
+
- ๋น์ฆ๋์ค ๊ฒฐ์ ์ \`@codesyncer-decision\` ํ๊ทธ๋ก ๊ธฐ๋ก
|
|
215
|
+
- ํ์ธ ํ์ํ ๋ถ๋ถ์ \`@codesyncer-todo\` ํ๊ทธ ์ถ๊ฐ`;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
return `### โ Java Project Guidelines
|
|
219
|
+
|
|
220
|
+
**Comment Examples:**
|
|
221
|
+
\`\`\`java
|
|
222
|
+
/**
|
|
223
|
+
* User service
|
|
224
|
+
*
|
|
225
|
+
* @codesyncer-context User management business logic
|
|
226
|
+
* @codesyncer-rule Transaction management required
|
|
227
|
+
*/
|
|
228
|
+
@Service
|
|
229
|
+
public class UserService {
|
|
230
|
+
// @codesyncer-inference: Using BCrypt (security standard)
|
|
231
|
+
private final PasswordEncoder passwordEncoder;
|
|
232
|
+
|
|
233
|
+
// @codesyncer-todo: Add email duplicate check
|
|
234
|
+
public User createUser(UserDto dto) {
|
|
235
|
+
// @codesyncer-decision: [DATE] Adopted soft delete pattern
|
|
236
|
+
return userRepository.save(user);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
\`\`\`
|
|
240
|
+
|
|
241
|
+
**Basic Principles:**
|
|
242
|
+
- Write JavaDoc for all public methods
|
|
243
|
+
- Mark inferences with \`@codesyncer-inference\` tag
|
|
244
|
+
- Record decisions with \`@codesyncer-decision\` tag
|
|
245
|
+
- Use \`@codesyncer-todo\` for items needing confirmation`;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Python basic guidelines
|
|
250
|
+
*/
|
|
251
|
+
function getPythonGuidelines(lang) {
|
|
252
|
+
if (lang === 'ko') {
|
|
253
|
+
return `### ๐ Python ํ๋ก์ ํธ ๊ฐ์ด๋
|
|
254
|
+
|
|
255
|
+
**์ฃผ์ ์์ฑ ์์:**
|
|
256
|
+
\`\`\`python
|
|
257
|
+
"""
|
|
258
|
+
์ฌ์ฉ์ ์๋น์ค
|
|
259
|
+
|
|
260
|
+
@codesyncer-context ์ฌ์ฉ์ ๊ด๋ฆฌ ๋น์ฆ๋์ค ๋ก์ง
|
|
261
|
+
@codesyncer-rule ๋ชจ๋ DB ์์
์ async/await ์ฌ์ฉ
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
class UserService:
|
|
265
|
+
# @codesyncer-inference: bcrypt ์ฌ์ฉ (๋ณด์ ํ์ค)
|
|
266
|
+
def __init__(self, pwd_context: CryptContext):
|
|
267
|
+
self.pwd_context = pwd_context
|
|
268
|
+
|
|
269
|
+
async def create_user(self, data: CreateUserRequest):
|
|
270
|
+
"""
|
|
271
|
+
์ฌ์ฉ์ ์์ฑ
|
|
272
|
+
|
|
273
|
+
@codesyncer-todo: ์ด๋ฉ์ผ ์ค๋ณต ์ฒดํฌ ์ถ๊ฐ
|
|
274
|
+
@codesyncer-decision: [๋ ์ง] Soft delete ํจํด ์ฑํ
|
|
275
|
+
"""
|
|
276
|
+
return await self.db.save(user)
|
|
277
|
+
\`\`\`
|
|
278
|
+
|
|
279
|
+
**๊ธฐ๋ณธ ์์น:**
|
|
280
|
+
- ๋ชจ๋ ํจ์/ํด๋์ค์ docstring ์์ฑ
|
|
281
|
+
- ์ถ๋ก ํ ๋ด์ฉ์ \`@codesyncer-inference\` ํ๊ทธ๋ก ๋ช
์
|
|
282
|
+
- ๋น์ฆ๋์ค ๊ฒฐ์ ์ \`@codesyncer-decision\` ํ๊ทธ๋ก ๊ธฐ๋ก
|
|
283
|
+
- ํ์ธ ํ์ํ ๋ถ๋ถ์ \`@codesyncer-todo\` ํ๊ทธ ์ถ๊ฐ`;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return `### ๐ Python Project Guidelines
|
|
287
|
+
|
|
288
|
+
**Comment Examples:**
|
|
289
|
+
\`\`\`python
|
|
290
|
+
"""
|
|
291
|
+
User service
|
|
292
|
+
|
|
293
|
+
@codesyncer-context User management business logic
|
|
294
|
+
@codesyncer-rule All DB operations use async/await
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
class UserService:
|
|
298
|
+
# @codesyncer-inference: Using bcrypt (security standard)
|
|
299
|
+
def __init__(self, pwd_context: CryptContext):
|
|
300
|
+
self.pwd_context = pwd_context
|
|
301
|
+
|
|
302
|
+
async def create_user(self, data: CreateUserRequest):
|
|
303
|
+
"""
|
|
304
|
+
Create user
|
|
305
|
+
|
|
306
|
+
@codesyncer-todo: Add email duplicate check
|
|
307
|
+
@codesyncer-decision: [DATE] Adopted soft delete pattern
|
|
308
|
+
"""
|
|
309
|
+
return await self.db.save(user)
|
|
310
|
+
\`\`\`
|
|
311
|
+
|
|
312
|
+
**Basic Principles:**
|
|
313
|
+
- Write docstrings for all functions/classes
|
|
314
|
+
- Mark inferences with \`@codesyncer-inference\` tag
|
|
315
|
+
- Record decisions with \`@codesyncer-decision\` tag
|
|
316
|
+
- Use \`@codesyncer-todo\` for items needing confirmation`;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* React basic guidelines
|
|
321
|
+
*/
|
|
322
|
+
function getReactGuidelines(lang) {
|
|
323
|
+
if (lang === 'ko') {
|
|
324
|
+
return `### โ๏ธ React ํ๋ก์ ํธ ๊ฐ์ด๋
|
|
325
|
+
|
|
326
|
+
**์ฃผ์ ์์ฑ ์์:**
|
|
327
|
+
\`\`\`tsx
|
|
328
|
+
/**
|
|
329
|
+
* ์ฌ์ฉ์ ๋ชฉ๋ก ์ปดํฌ๋ํธ
|
|
330
|
+
*
|
|
331
|
+
* @codesyncer-context ์ฌ์ฉ์ ๊ด๋ฆฌ ํ์ด์ง
|
|
332
|
+
* @codesyncer-inference React Query ์ฌ์ฉ (๋ฐ์ดํฐ ํ์นญ ํ์ค)
|
|
333
|
+
*/
|
|
334
|
+
export default function UserList() {
|
|
335
|
+
// @codesyncer-inference: ํ์ด์ง ํฌ๊ธฐ 20 (์ผ๋ฐ์ ์ธ UX)
|
|
336
|
+
const [page, setPage] = useState(1);
|
|
337
|
+
|
|
338
|
+
// @codesyncer-todo: ํํฐ๋ง ๊ธฐ๋ฅ ์ถ๊ฐ ํ์
|
|
339
|
+
const { data } = useQuery(['users', page], fetchUsers);
|
|
340
|
+
|
|
341
|
+
// @codesyncer-decision: [๋ ์ง] ํ
์ด๋ธ ๋ ์ด์์ ์ฑํ (UXํ ๊ฒฐ์ )
|
|
342
|
+
return <UserTable data={data} />;
|
|
343
|
+
}
|
|
344
|
+
\`\`\`
|
|
345
|
+
|
|
346
|
+
**๊ธฐ๋ณธ ์์น:**
|
|
347
|
+
- ๋ชจ๋ ์ปดํฌ๋ํธ์ JSDoc ์์ฑ
|
|
348
|
+
- ์ถ๋ก ํ ๋ด์ฉ์ \`@codesyncer-inference\` ํ๊ทธ๋ก ๋ช
์
|
|
349
|
+
- ๋น์ฆ๋์ค ๊ฒฐ์ ์ \`@codesyncer-decision\` ํ๊ทธ๋ก ๊ธฐ๋ก
|
|
350
|
+
- ํ์ธ ํ์ํ ๋ถ๋ถ์ \`@codesyncer-todo\` ํ๊ทธ ์ถ๊ฐ`;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
return `### โ๏ธ React Project Guidelines
|
|
354
|
+
|
|
355
|
+
**Comment Examples:**
|
|
356
|
+
\`\`\`tsx
|
|
357
|
+
/**
|
|
358
|
+
* User list component
|
|
359
|
+
*
|
|
360
|
+
* @codesyncer-context User management page
|
|
361
|
+
* @codesyncer-inference Using React Query (data fetching standard)
|
|
362
|
+
*/
|
|
363
|
+
export default function UserList() {
|
|
364
|
+
// @codesyncer-inference: Page size 20 (common UX)
|
|
365
|
+
const [page, setPage] = useState(1);
|
|
366
|
+
|
|
367
|
+
// @codesyncer-todo: Need to add filtering feature
|
|
368
|
+
const { data } = useQuery(['users', page], fetchUsers);
|
|
369
|
+
|
|
370
|
+
// @codesyncer-decision: [DATE] Adopted table layout (UX team decision)
|
|
371
|
+
return <UserTable data={data} />;
|
|
372
|
+
}
|
|
373
|
+
\`\`\`
|
|
374
|
+
|
|
375
|
+
**Basic Principles:**
|
|
376
|
+
- Write JSDoc for all components
|
|
377
|
+
- Mark inferences with \`@codesyncer-inference\` tag
|
|
378
|
+
- Record decisions with \`@codesyncer-decision\` tag
|
|
379
|
+
- Use \`@codesyncer-todo\` for items needing confirmation`;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* TypeScript basic guidelines
|
|
384
|
+
*/
|
|
385
|
+
function getTypeScriptGuidelines(lang) {
|
|
386
|
+
if (lang === 'ko') {
|
|
387
|
+
return `### ๐ TypeScript ํ๋ก์ ํธ ๊ฐ์ด๋
|
|
388
|
+
|
|
389
|
+
**์ฃผ์ ์์ฑ ์์:**
|
|
390
|
+
\`\`\`typescript
|
|
391
|
+
/**
|
|
392
|
+
* ์ฌ์ฉ์ ์๋น์ค
|
|
393
|
+
*
|
|
394
|
+
* @codesyncer-context ์ฌ์ฉ์ ๊ด๋ฆฌ ๋น์ฆ๋์ค ๋ก์ง
|
|
395
|
+
* @codesyncer-rule ๋ชจ๋ ํจ์๋ ๋ช
์์ ํ์
์ ์
|
|
396
|
+
*/
|
|
397
|
+
export class UserService {
|
|
398
|
+
// @codesyncer-inference: ์ฑ๊ธํค ํจํด ์ฌ์ฉ (๋ฆฌ์์ค ๊ด๋ฆฌ)
|
|
399
|
+
private static instance: UserService;
|
|
400
|
+
|
|
401
|
+
// @codesyncer-todo: ์๋ฌ ํธ๋ค๋ง ๊ฐ์ ํ์
|
|
402
|
+
async createUser(data: CreateUserDto): Promise<User> {
|
|
403
|
+
// @codesyncer-decision: [๋ ์ง] Prisma ORM ์ฑํ
|
|
404
|
+
return await prisma.user.create({ data });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
\`\`\`
|
|
408
|
+
|
|
409
|
+
**๊ธฐ๋ณธ ์์น:**
|
|
410
|
+
- ๋ชจ๋ ํจ์์ ํ์
์ ์ ๋ฐ JSDoc ์์ฑ
|
|
411
|
+
- ์ถ๋ก ํ ๋ด์ฉ์ \`@codesyncer-inference\` ํ๊ทธ๋ก ๋ช
์
|
|
412
|
+
- ๋น์ฆ๋์ค ๊ฒฐ์ ์ \`@codesyncer-decision\` ํ๊ทธ๋ก ๊ธฐ๋ก
|
|
413
|
+
- ํ์ธ ํ์ํ ๋ถ๋ถ์ \`@codesyncer-todo\` ํ๊ทธ ์ถ๊ฐ`;
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
return `### ๐ TypeScript Project Guidelines
|
|
417
|
+
|
|
418
|
+
**Comment Examples:**
|
|
419
|
+
\`\`\`typescript
|
|
420
|
+
/**
|
|
421
|
+
* User service
|
|
422
|
+
*
|
|
423
|
+
* @codesyncer-context User management business logic
|
|
424
|
+
* @codesyncer-rule All functions must have explicit types
|
|
425
|
+
*/
|
|
426
|
+
export class UserService {
|
|
427
|
+
// @codesyncer-inference: Using singleton pattern (resource management)
|
|
428
|
+
private static instance: UserService;
|
|
429
|
+
|
|
430
|
+
// @codesyncer-todo: Need to improve error handling
|
|
431
|
+
async createUser(data: CreateUserDto): Promise<User> {
|
|
432
|
+
// @codesyncer-decision: [DATE] Adopted Prisma ORM
|
|
433
|
+
return await prisma.user.create({ data });
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
\`\`\`
|
|
437
|
+
|
|
438
|
+
**Basic Principles:**
|
|
439
|
+
- Write type definitions and JSDoc for all functions
|
|
440
|
+
- Mark inferences with \`@codesyncer-inference\` tag
|
|
441
|
+
- Record decisions with \`@codesyncer-decision\` tag
|
|
442
|
+
- Use \`@codesyncer-todo\` for items needing confirmation`;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Generic guidelines
|
|
447
|
+
*/
|
|
448
|
+
function getGenericGuidelines(lang) {
|
|
449
|
+
if (lang === 'ko') {
|
|
450
|
+
return `### ๐ ์ฝ๋ฉ ๊ฐ์ด๋
|
|
451
|
+
|
|
452
|
+
**์ฃผ์ ์์ฑ ์์:**
|
|
453
|
+
\`\`\`
|
|
454
|
+
/**
|
|
455
|
+
* ํจ์/ํด๋์ค ์ค๋ช
|
|
456
|
+
*
|
|
457
|
+
* @codesyncer-context ๋น์ฆ๋์ค ๋งฅ๋ฝ ์ค๋ช
|
|
458
|
+
* @codesyncer-rule ํน๋ณํ ๊ท์น์ด ์๋ค๋ฉด ๋ช
์
|
|
459
|
+
*/
|
|
460
|
+
|
|
461
|
+
// @codesyncer-inference: ์ถ๋ก ํ ๋ด์ฉ (๊ทผ๊ฑฐ ํฌํจ)
|
|
462
|
+
// @codesyncer-decision: [๋ ์ง] ๊ฒฐ์ ์ฌํญ (์ด์ ํฌํจ)
|
|
463
|
+
// @codesyncer-todo: ํ์ธ ํ์ํ ๋ด์ฉ
|
|
464
|
+
\`\`\`
|
|
465
|
+
|
|
466
|
+
**๊ธฐ๋ณธ ์์น:**
|
|
467
|
+
- ๋ชจ๋ ํจ์/ํด๋์ค์ ์ค๋ช
์ฃผ์ ์์ฑ
|
|
468
|
+
- ์ถ๋ก ํ ๋ด์ฉ์ \`@codesyncer-inference\` ํ๊ทธ๋ก ๋ช
์
|
|
469
|
+
- ๋น์ฆ๋์ค ๊ฒฐ์ ์ \`@codesyncer-decision\` ํ๊ทธ๋ก ๊ธฐ๋ก
|
|
470
|
+
- ํ์ธ ํ์ํ ๋ถ๋ถ์ \`@codesyncer-todo\` ํ๊ทธ ์ถ๊ฐ`;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
return `### ๐ Coding Guidelines
|
|
474
|
+
|
|
475
|
+
**Comment Examples:**
|
|
476
|
+
\`\`\`
|
|
477
|
+
/**
|
|
478
|
+
* Function/Class description
|
|
479
|
+
*
|
|
480
|
+
* @codesyncer-context Business context explanation
|
|
481
|
+
* @codesyncer-rule Specify special rules if any
|
|
482
|
+
*/
|
|
483
|
+
|
|
484
|
+
// @codesyncer-inference: Inferred content (with rationale)
|
|
485
|
+
// @codesyncer-decision: [DATE] Decision made (with reason)
|
|
486
|
+
// @codesyncer-todo: Items needing confirmation
|
|
487
|
+
\`\`\`
|
|
488
|
+
|
|
489
|
+
**Basic Principles:**
|
|
490
|
+
- Write descriptive comments for all functions/classes
|
|
491
|
+
- Mark inferences with \`@codesyncer-inference\` tag
|
|
492
|
+
- Record decisions with \`@codesyncer-decision\` tag
|
|
493
|
+
- Use \`@codesyncer-todo\` for items needing confirmation`;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=template-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/utils/template-loader.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codesyncer",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered multi-repository collaboration system - Works with Claude Code, Cursor, GitHub Copilot, and more",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai-collaboration",
|
|
7
|
+
"claude-code",
|
|
8
|
+
"cursor",
|
|
9
|
+
"github-copilot",
|
|
10
|
+
"multi-repo",
|
|
11
|
+
"developer-tools",
|
|
12
|
+
"cli",
|
|
13
|
+
"ai-assistant",
|
|
14
|
+
"code-documentation",
|
|
15
|
+
"codesyncer"
|
|
16
|
+
],
|
|
17
|
+
"main": "dist/index.js",
|
|
18
|
+
"bin": {
|
|
19
|
+
"codesyncer": "./bin/codesyncer.js"
|
|
20
|
+
},
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc && npm run copy-templates",
|
|
23
|
+
"copy-templates": "mkdir -p dist/templates && cp -r src/templates/* dist/templates/",
|
|
24
|
+
"dev": "tsc --watch",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"test": "jest",
|
|
27
|
+
"lint": "eslint src/**/*.ts"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"bin",
|
|
32
|
+
"src/templates"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/bitjaru/codesyncer.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/bitjaru/codesyncer/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/bitjaru/codesyncer#readme",
|
|
42
|
+
"author": {
|
|
43
|
+
"name": "bitjaru",
|
|
44
|
+
"email": "bitjaru0402@naver.com",
|
|
45
|
+
"url": "https://github.com/bitjaru"
|
|
46
|
+
},
|
|
47
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"chalk": "^4.1.2",
|
|
50
|
+
"commander": "^11.1.0",
|
|
51
|
+
"inquirer": "^8.2.6",
|
|
52
|
+
"ora": "^5.4.1",
|
|
53
|
+
"fs-extra": "^11.2.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/inquirer": "^9.0.7",
|
|
57
|
+
"@types/node": "^20.10.0",
|
|
58
|
+
"@types/fs-extra": "^11.0.4",
|
|
59
|
+
"typescript": "^5.3.2",
|
|
60
|
+
"@types/jest": "^29.5.11",
|
|
61
|
+
"jest": "^29.7.0",
|
|
62
|
+
"ts-jest": "^29.1.1",
|
|
63
|
+
"eslint": "^8.56.0",
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
65
|
+
"@typescript-eslint/parser": "^6.15.0"
|
|
66
|
+
},
|
|
67
|
+
"engines": {
|
|
68
|
+
"node": ">=14.0.0"
|
|
69
|
+
}
|
|
70
|
+
}
|