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.
Files changed (61) hide show
  1. package/LICENSE +31 -0
  2. package/README.ko.md +417 -0
  3. package/README.md +417 -0
  4. package/bin/codesyncer.js +3 -0
  5. package/dist/commands/add-repo.d.ts +3 -0
  6. package/dist/commands/add-repo.d.ts.map +1 -0
  7. package/dist/commands/add-repo.js +145 -0
  8. package/dist/commands/add-repo.js.map +1 -0
  9. package/dist/commands/init.d.ts +3 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +489 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/update.d.ts +3 -0
  14. package/dist/commands/update.d.ts.map +1 -0
  15. package/dist/commands/update.js +123 -0
  16. package/dist/commands/update.js.map +1 -0
  17. package/dist/constants/keywords.d.ts +23 -0
  18. package/dist/constants/keywords.d.ts.map +1 -0
  19. package/dist/constants/keywords.js +133 -0
  20. package/dist/constants/keywords.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +52 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/templates/en/architecture.md +147 -0
  26. package/dist/templates/en/claude.md +267 -0
  27. package/dist/templates/en/comment_guide.md +324 -0
  28. package/dist/templates/en/decisions.md +227 -0
  29. package/dist/templates/en/master.md +179 -0
  30. package/dist/templates/ko/architecture.md +147 -0
  31. package/dist/templates/ko/claude.md +267 -0
  32. package/dist/templates/ko/comment_guide.md +324 -0
  33. package/dist/templates/ko/decisions.md +227 -0
  34. package/dist/templates/ko/master.md +179 -0
  35. package/dist/types.d.ts +78 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +16 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils/messages.d.ts +129 -0
  40. package/dist/utils/messages.d.ts.map +1 -0
  41. package/dist/utils/messages.js +168 -0
  42. package/dist/utils/messages.js.map +1 -0
  43. package/dist/utils/scanner.d.ts +11 -0
  44. package/dist/utils/scanner.d.ts.map +1 -0
  45. package/dist/utils/scanner.js +311 -0
  46. package/dist/utils/scanner.js.map +1 -0
  47. package/dist/utils/template-loader.d.ts +18 -0
  48. package/dist/utils/template-loader.d.ts.map +1 -0
  49. package/dist/utils/template-loader.js +496 -0
  50. package/dist/utils/template-loader.js.map +1 -0
  51. package/package.json +70 -0
  52. package/src/templates/en/architecture.md +147 -0
  53. package/src/templates/en/claude.md +267 -0
  54. package/src/templates/en/comment_guide.md +324 -0
  55. package/src/templates/en/decisions.md +227 -0
  56. package/src/templates/en/master.md +179 -0
  57. package/src/templates/ko/architecture.md +147 -0
  58. package/src/templates/ko/claude.md +267 -0
  59. package/src/templates/ko/comment_guide.md +324 -0
  60. package/src/templates/ko/decisions.md +227 -0
  61. 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
+ }