codesyncer 3.0.0 → 3.1.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 (50) hide show
  1. package/README.ko.md +50 -12
  2. package/README.md +50 -12
  3. package/dist/commands/update.d.ts.map +1 -1
  4. package/dist/commands/update.js +136 -0
  5. package/dist/commands/update.js.map +1 -1
  6. package/dist/templates/en/architecture.md +2 -0
  7. package/dist/templates/en/claude.md +2 -0
  8. package/dist/templates/en/comment_guide.md +2 -0
  9. package/dist/templates/en/decisions.md +2 -0
  10. package/dist/templates/en/master.md +2 -0
  11. package/dist/templates/en/root_claude.md +2 -0
  12. package/dist/templates/en/setup_guide.md +2 -0
  13. package/dist/templates/en/setup_guide_monorepo.md +2 -0
  14. package/dist/templates/en/setup_guide_single.md +2 -0
  15. package/dist/templates/ko/architecture.md +2 -0
  16. package/dist/templates/ko/claude.md +2 -0
  17. package/dist/templates/ko/comment_guide.md +2 -0
  18. package/dist/templates/ko/decisions.md +2 -0
  19. package/dist/templates/ko/master.md +2 -0
  20. package/dist/templates/ko/root_claude.md +2 -0
  21. package/dist/templates/ko/setup_guide.md +2 -0
  22. package/dist/templates/ko/setup_guide_monorepo.md +2 -0
  23. package/dist/templates/ko/setup_guide_single.md +2 -0
  24. package/dist/utils/template-upgrader.d.ts +72 -0
  25. package/dist/utils/template-upgrader.d.ts.map +1 -0
  26. package/dist/utils/template-upgrader.js +249 -0
  27. package/dist/utils/template-upgrader.js.map +1 -0
  28. package/dist/utils/template-version.d.ts +64 -0
  29. package/dist/utils/template-version.d.ts.map +1 -0
  30. package/dist/utils/template-version.js +177 -0
  31. package/dist/utils/template-version.js.map +1 -0
  32. package/package.json +1 -1
  33. package/src/templates/en/architecture.md +2 -0
  34. package/src/templates/en/claude.md +2 -0
  35. package/src/templates/en/comment_guide.md +2 -0
  36. package/src/templates/en/decisions.md +2 -0
  37. package/src/templates/en/master.md +2 -0
  38. package/src/templates/en/root_claude.md +2 -0
  39. package/src/templates/en/setup_guide.md +2 -0
  40. package/src/templates/en/setup_guide_monorepo.md +2 -0
  41. package/src/templates/en/setup_guide_single.md +2 -0
  42. package/src/templates/ko/architecture.md +2 -0
  43. package/src/templates/ko/claude.md +2 -0
  44. package/src/templates/ko/comment_guide.md +2 -0
  45. package/src/templates/ko/decisions.md +2 -0
  46. package/src/templates/ko/master.md +2 -0
  47. package/src/templates/ko/root_claude.md +2 -0
  48. package/src/templates/ko/setup_guide.md +2 -0
  49. package/src/templates/ko/setup_guide_monorepo.md +2 -0
  50. package/src/templates/ko/setup_guide_single.md +2 -0
@@ -0,0 +1,249 @@
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.backupFile = backupFile;
37
+ exports.upgradeTemplate = upgradeTemplate;
38
+ exports.upgradeTemplates = upgradeTemplates;
39
+ exports.extractVarsFromFile = extractVarsFromFile;
40
+ exports.getTemplateVarsFromContext = getTemplateVarsFromContext;
41
+ exports.formatUpgradeSummary = formatUpgradeSummary;
42
+ const fs = __importStar(require("fs-extra"));
43
+ const path = __importStar(require("path"));
44
+ const template_loader_1 = require("./template-loader");
45
+ /**
46
+ * Create a backup of a file before upgrading
47
+ *
48
+ * @param filePath - Path to the file to backup
49
+ * @returns Path to the backup file
50
+ */
51
+ async function backupFile(filePath) {
52
+ const dir = path.dirname(filePath);
53
+ const fileName = path.basename(filePath);
54
+ const today = new Date().toISOString().split('T')[0];
55
+ const backupFileName = `${fileName}.backup.${today}`;
56
+ const backupPath = path.join(dir, backupFileName);
57
+ // If backup already exists today, add a numeric suffix
58
+ let finalBackupPath = backupPath;
59
+ let counter = 1;
60
+ while (await fs.pathExists(finalBackupPath)) {
61
+ finalBackupPath = path.join(dir, `${fileName}.backup.${today}.${counter}`);
62
+ counter++;
63
+ }
64
+ await fs.copy(filePath, finalBackupPath);
65
+ return finalBackupPath;
66
+ }
67
+ /**
68
+ * Upgrade a single template file
69
+ *
70
+ * @param templateStatus - Template status from version check
71
+ * @param options - Upgrade options
72
+ * @returns Promise resolving to UpgradeResult
73
+ */
74
+ async function upgradeTemplate(templateStatus, options) {
75
+ const { file, templateName } = templateStatus;
76
+ const { lang, vars, dryRun } = options;
77
+ try {
78
+ // Skip if dry run
79
+ if (dryRun) {
80
+ return {
81
+ success: true,
82
+ file,
83
+ backupPath: `${file}.backup.${new Date().toISOString().split('T')[0]} (dry run)`,
84
+ };
85
+ }
86
+ // Backup existing file
87
+ let backupPath;
88
+ if (await fs.pathExists(file)) {
89
+ backupPath = await backupFile(file);
90
+ }
91
+ // Load and render new template
92
+ const template = await (0, template_loader_1.loadTemplate)(templateName, lang);
93
+ const content = (0, template_loader_1.replaceTemplateVars)(template, vars);
94
+ // Write the upgraded template
95
+ await fs.writeFile(file, content, 'utf-8');
96
+ return {
97
+ success: true,
98
+ file,
99
+ backupPath,
100
+ };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ success: false,
105
+ file,
106
+ error: error instanceof Error ? error.message : String(error),
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * Upgrade multiple templates
112
+ *
113
+ * @param templates - Array of template statuses to upgrade
114
+ * @param options - Upgrade options
115
+ * @returns Promise resolving to array of UpgradeResults
116
+ */
117
+ async function upgradeTemplates(templates, options) {
118
+ const results = [];
119
+ for (const template of templates) {
120
+ const result = await upgradeTemplate(template, options);
121
+ results.push(result);
122
+ }
123
+ return results;
124
+ }
125
+ /**
126
+ * Extract variables from existing file for re-use during upgrade
127
+ *
128
+ * @param filePath - Path to existing file
129
+ * @returns Record of extracted variables
130
+ */
131
+ async function extractVarsFromFile(filePath) {
132
+ const vars = {};
133
+ try {
134
+ const content = await fs.readFile(filePath, 'utf-8');
135
+ // Extract project name
136
+ const projectNameMatch = content.match(/\*\*(?:프로젝트명|Project Name)\*\*:\s*([^\n]+)/);
137
+ if (projectNameMatch) {
138
+ vars['PROJECT_NAME'] = projectNameMatch[1].trim();
139
+ vars['프로젝트명'] = projectNameMatch[1].trim();
140
+ }
141
+ // Extract tech stack
142
+ const techStackMatch = content.match(/\*\*(?:기술 스택|Tech Stack)\*\*:\s*([^\n]+)/);
143
+ if (techStackMatch) {
144
+ vars['TECH_STACK'] = techStackMatch[1].trim();
145
+ vars['기술 스택'] = techStackMatch[1].trim();
146
+ }
147
+ // Extract project type
148
+ const projectTypeMatch = content.match(/\*\*(?:프로젝트 타입|Project Type)\*\*:\s*([^\n]+)/);
149
+ if (projectTypeMatch) {
150
+ vars['PROJECT_TYPE'] = projectTypeMatch[1].trim();
151
+ vars['프로젝트 타입'] = projectTypeMatch[1].trim();
152
+ }
153
+ // Extract GitHub username
154
+ const githubMatch = content.match(/github\.com\/([^/\s]+)/i);
155
+ if (githubMatch) {
156
+ vars['GITHUB_USERNAME'] = githubMatch[1];
157
+ }
158
+ }
159
+ catch (error) {
160
+ // Ignore extraction errors
161
+ }
162
+ return vars;
163
+ }
164
+ /**
165
+ * Get template variables from .claude directory context
166
+ *
167
+ * @param claudeDir - Path to .claude directory
168
+ * @param lang - Language to use
169
+ * @returns Record of template variables
170
+ */
171
+ async function getTemplateVarsFromContext(claudeDir, lang) {
172
+ const vars = {};
173
+ // Try to extract from CLAUDE.md first
174
+ const claudeMdPath = path.join(claudeDir, 'CLAUDE.md');
175
+ if (await fs.pathExists(claudeMdPath)) {
176
+ const extracted = await extractVarsFromFile(claudeMdPath);
177
+ Object.assign(vars, extracted);
178
+ }
179
+ // Default values if not found
180
+ const projectDir = path.dirname(claudeDir);
181
+ if (!vars['PROJECT_NAME']) {
182
+ vars['PROJECT_NAME'] = path.basename(projectDir);
183
+ vars['프로젝트명'] = path.basename(projectDir);
184
+ }
185
+ if (!vars['TECH_STACK']) {
186
+ vars['TECH_STACK'] = 'TypeScript';
187
+ vars['기술 스택'] = 'TypeScript';
188
+ }
189
+ if (!vars['GITHUB_USERNAME']) {
190
+ vars['GITHUB_USERNAME'] = 'your-username';
191
+ }
192
+ // Add date
193
+ const today = new Date().toISOString().split('T')[0];
194
+ vars['TODAY'] = today;
195
+ vars['오늘 날짜'] = today;
196
+ return vars;
197
+ }
198
+ /**
199
+ * Format upgrade summary for display
200
+ *
201
+ * @param results - Array of upgrade results
202
+ * @param lang - Language for messages
203
+ * @returns Formatted summary string
204
+ */
205
+ function formatUpgradeSummary(results, lang) {
206
+ const successful = results.filter((r) => r.success);
207
+ const failed = results.filter((r) => !r.success);
208
+ const lines = [];
209
+ if (lang === 'ko') {
210
+ if (successful.length > 0) {
211
+ lines.push(`✅ ${successful.length}개 파일 업그레이드 완료:`);
212
+ successful.forEach((r) => {
213
+ const fileName = path.basename(r.file);
214
+ lines.push(` • ${fileName}`);
215
+ if (r.backupPath) {
216
+ lines.push(` 백업: ${path.basename(r.backupPath)}`);
217
+ }
218
+ });
219
+ }
220
+ if (failed.length > 0) {
221
+ lines.push(`❌ ${failed.length}개 파일 업그레이드 실패:`);
222
+ failed.forEach((r) => {
223
+ const fileName = path.basename(r.file);
224
+ lines.push(` • ${fileName}: ${r.error}`);
225
+ });
226
+ }
227
+ }
228
+ else {
229
+ if (successful.length > 0) {
230
+ lines.push(`✅ ${successful.length} file(s) upgraded:`);
231
+ successful.forEach((r) => {
232
+ const fileName = path.basename(r.file);
233
+ lines.push(` • ${fileName}`);
234
+ if (r.backupPath) {
235
+ lines.push(` Backup: ${path.basename(r.backupPath)}`);
236
+ }
237
+ });
238
+ }
239
+ if (failed.length > 0) {
240
+ lines.push(`❌ ${failed.length} file(s) failed:`);
241
+ failed.forEach((r) => {
242
+ const fileName = path.basename(r.file);
243
+ lines.push(` • ${fileName}: ${r.error}`);
244
+ });
245
+ }
246
+ }
247
+ return lines.join('\n');
248
+ }
249
+ //# sourceMappingURL=template-upgrader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-upgrader.js","sourceRoot":"","sources":["../../src/utils/template-upgrader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Mapping of .claude file names to template names
3
+ */
4
+ export declare const TEMPLATE_FILE_MAP: Record<string, string>;
5
+ /**
6
+ * Template status information for upgrade checks
7
+ */
8
+ export interface TemplateStatus {
9
+ file: string;
10
+ templateName: string;
11
+ currentVersion: string | null;
12
+ latestVersion: string;
13
+ isOutdated: boolean;
14
+ }
15
+ /**
16
+ * Extract template version from file content
17
+ *
18
+ * @param content - File content to extract version from
19
+ * @returns Version string or null if not found
20
+ */
21
+ export declare function extractTemplateVersion(content: string): string | null;
22
+ /**
23
+ * Compare two semantic versions
24
+ *
25
+ * @param v1 - First version string (e.g., "3.0.0")
26
+ * @param v2 - Second version string (e.g., "3.0.1")
27
+ * @returns -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2
28
+ */
29
+ export declare function compareVersions(v1: string, v2: string): number;
30
+ /**
31
+ * Check if a file's template version is outdated compared to current package version
32
+ *
33
+ * @param filePath - Path to the file to check
34
+ * @returns Promise resolving to TemplateStatus
35
+ */
36
+ export declare function checkTemplateVersion(filePath: string): Promise<TemplateStatus>;
37
+ /**
38
+ * Scan a .claude directory for template files and check their versions
39
+ *
40
+ * @param claudeDir - Path to the .claude directory
41
+ * @returns Promise resolving to array of TemplateStatus objects
42
+ */
43
+ export declare function scanTemplateVersions(claudeDir: string): Promise<TemplateStatus[]>;
44
+ /**
45
+ * Get all outdated templates from a .claude directory
46
+ *
47
+ * @param claudeDir - Path to the .claude directory
48
+ * @returns Promise resolving to array of outdated TemplateStatus objects
49
+ */
50
+ export declare function getOutdatedTemplates(claudeDir: string): Promise<TemplateStatus[]>;
51
+ /**
52
+ * Check if any templates in a .claude directory need upgrading
53
+ *
54
+ * @param claudeDir - Path to the .claude directory
55
+ * @returns Promise resolving to boolean
56
+ */
57
+ export declare function hasOutdatedTemplates(claudeDir: string): Promise<boolean>;
58
+ /**
59
+ * Get the current package version (for display purposes)
60
+ *
61
+ * @returns Current package version string
62
+ */
63
+ export declare function getCurrentVersion(): string;
64
+ //# sourceMappingURL=template-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-version.d.ts","sourceRoot":"","sources":["../../src/utils/template-version.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAa9D;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA8BpF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAavF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGvF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,177 @@
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.TEMPLATE_FILE_MAP = void 0;
37
+ exports.extractTemplateVersion = extractTemplateVersion;
38
+ exports.compareVersions = compareVersions;
39
+ exports.checkTemplateVersion = checkTemplateVersion;
40
+ exports.scanTemplateVersions = scanTemplateVersions;
41
+ exports.getOutdatedTemplates = getOutdatedTemplates;
42
+ exports.hasOutdatedTemplates = hasOutdatedTemplates;
43
+ exports.getCurrentVersion = getCurrentVersion;
44
+ const fs = __importStar(require("fs-extra"));
45
+ const path = __importStar(require("path"));
46
+ const version_1 = require("./version");
47
+ /**
48
+ * Template version extraction and comparison utilities
49
+ *
50
+ * @codesyncer-context Supports template upgrade feature in update command
51
+ * @codesyncer-decision [2026-01-17] Using HTML comment format for version metadata
52
+ */
53
+ /**
54
+ * Version metadata regex pattern
55
+ * Matches: <!-- codesyncer-version: X.Y.Z -->
56
+ */
57
+ const VERSION_PATTERN = /<!--\s*codesyncer-version:\s*([\d.]+)\s*-->/;
58
+ /**
59
+ * Mapping of .claude file names to template names
60
+ */
61
+ exports.TEMPLATE_FILE_MAP = {
62
+ 'CLAUDE.md': 'claude',
63
+ 'ARCHITECTURE.md': 'architecture',
64
+ 'COMMENT_GUIDE.md': 'comment_guide',
65
+ 'DECISIONS.md': 'decisions',
66
+ };
67
+ /**
68
+ * Extract template version from file content
69
+ *
70
+ * @param content - File content to extract version from
71
+ * @returns Version string or null if not found
72
+ */
73
+ function extractTemplateVersion(content) {
74
+ const match = content.match(VERSION_PATTERN);
75
+ return match ? match[1] : null;
76
+ }
77
+ /**
78
+ * Compare two semantic versions
79
+ *
80
+ * @param v1 - First version string (e.g., "3.0.0")
81
+ * @param v2 - Second version string (e.g., "3.0.1")
82
+ * @returns -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2
83
+ */
84
+ function compareVersions(v1, v2) {
85
+ const parts1 = v1.split('.').map(Number);
86
+ const parts2 = v2.split('.').map(Number);
87
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
88
+ const p1 = parts1[i] || 0;
89
+ const p2 = parts2[i] || 0;
90
+ if (p1 < p2)
91
+ return -1;
92
+ if (p1 > p2)
93
+ return 1;
94
+ }
95
+ return 0;
96
+ }
97
+ /**
98
+ * Check if a file's template version is outdated compared to current package version
99
+ *
100
+ * @param filePath - Path to the file to check
101
+ * @returns Promise resolving to TemplateStatus
102
+ */
103
+ async function checkTemplateVersion(filePath) {
104
+ const fileName = path.basename(filePath);
105
+ const templateName = exports.TEMPLATE_FILE_MAP[fileName] || fileName.toLowerCase().replace('.md', '');
106
+ let currentVersion = null;
107
+ let isOutdated = false;
108
+ try {
109
+ const content = await fs.readFile(filePath, 'utf-8');
110
+ currentVersion = extractTemplateVersion(content);
111
+ if (currentVersion) {
112
+ isOutdated = compareVersions(currentVersion, version_1.VERSION) < 0;
113
+ }
114
+ else {
115
+ // No version found means it's from before versioning was added
116
+ // Consider it outdated
117
+ isOutdated = true;
118
+ }
119
+ }
120
+ catch (error) {
121
+ // File doesn't exist or can't be read
122
+ isOutdated = false;
123
+ }
124
+ return {
125
+ file: filePath,
126
+ templateName,
127
+ currentVersion,
128
+ latestVersion: version_1.VERSION,
129
+ isOutdated,
130
+ };
131
+ }
132
+ /**
133
+ * Scan a .claude directory for template files and check their versions
134
+ *
135
+ * @param claudeDir - Path to the .claude directory
136
+ * @returns Promise resolving to array of TemplateStatus objects
137
+ */
138
+ async function scanTemplateVersions(claudeDir) {
139
+ const results = [];
140
+ for (const fileName of Object.keys(exports.TEMPLATE_FILE_MAP)) {
141
+ const filePath = path.join(claudeDir, fileName);
142
+ if (await fs.pathExists(filePath)) {
143
+ const status = await checkTemplateVersion(filePath);
144
+ results.push(status);
145
+ }
146
+ }
147
+ return results;
148
+ }
149
+ /**
150
+ * Get all outdated templates from a .claude directory
151
+ *
152
+ * @param claudeDir - Path to the .claude directory
153
+ * @returns Promise resolving to array of outdated TemplateStatus objects
154
+ */
155
+ async function getOutdatedTemplates(claudeDir) {
156
+ const allTemplates = await scanTemplateVersions(claudeDir);
157
+ return allTemplates.filter((t) => t.isOutdated);
158
+ }
159
+ /**
160
+ * Check if any templates in a .claude directory need upgrading
161
+ *
162
+ * @param claudeDir - Path to the .claude directory
163
+ * @returns Promise resolving to boolean
164
+ */
165
+ async function hasOutdatedTemplates(claudeDir) {
166
+ const outdated = await getOutdatedTemplates(claudeDir);
167
+ return outdated.length > 0;
168
+ }
169
+ /**
170
+ * Get the current package version (for display purposes)
171
+ *
172
+ * @returns Current package version string
173
+ */
174
+ function getCurrentVersion() {
175
+ return version_1.VERSION;
176
+ }
177
+ //# sourceMappingURL=template-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-version.js","sourceRoot":"","sources":["../../src/utils/template-version.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codesyncer",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Claude forgets everything when the session ends. CodeSyncer makes it remember.",
5
5
  "keywords": [
6
6
  "ai-collaboration",
@@ -145,3 +145,5 @@ No API endpoints discovered.
145
145
  ---
146
146
 
147
147
  *This document is auto-generated and managed by CodeSyncer.*
148
+
149
+ <!-- codesyncer-version: 3.1.0 -->
@@ -279,3 +279,5 @@ grep -r "@codesyncer-rule" ./
279
279
  ---
280
280
 
281
281
  *This collaboration system is open source. Suggest improvements at [CodeSyncer GitHub](https://github.com/bitjaru/codesyncer)!*
282
+
283
+ <!-- codesyncer-version: 3.1.0 -->
@@ -580,3 +580,5 @@ After writing code:
580
580
  **Last Updated**: [TODAY]
581
581
 
582
582
  *Comments are the documentation. Record all context in code.*
583
+
584
+ <!-- codesyncer-version: 3.1.0 -->
@@ -225,3 +225,5 @@ grep "@codesyncer-decision" src/services/PaymentService.ts
225
225
  **Last Updated**: [TODAY]
226
226
 
227
227
  *All important decisions are permanently recorded. This is your team's knowledge asset.*
228
+
229
+ <!-- codesyncer-version: 3.1.0 -->
@@ -177,3 +177,5 @@ Both formats work identically, so use whichever you prefer!
177
177
 
178
178
  *CodeSyncer - Persistent context, controlled inference, live architecture sync for Claude Code*
179
179
  *Currently Supported: Claude Code | Coming Soon: Cursor, GitHub Copilot, Continue.dev*
180
+
181
+ <!-- codesyncer-version: 3.1.0 -->
@@ -239,3 +239,5 @@ grep -r "payment" ./*/
239
239
  ---
240
240
 
241
241
  *CodeSyncer is open source: https://github.com/bitjaru/codesyncer*
242
+
243
+ <!-- codesyncer-version: 3.1.0 -->
@@ -313,3 +313,5 @@ Setup is successful when:
313
313
  ---
314
314
 
315
315
  *This setup guide is generated by CodeSyncer CLI. For issues or improvements, visit: https://github.com/bitjaru/codesyncer*
316
+
317
+ <!-- codesyncer-version: 3.1.0 -->
@@ -330,3 +330,5 @@ Setup is successful when:
330
330
  ---
331
331
 
332
332
  *This setup guide is generated by CodeSyncer CLI. For issues or improvements, visit: https://github.com/bitjaru/codesyncer*
333
+
334
+ <!-- codesyncer-version: 3.1.0 -->
@@ -322,3 +322,5 @@ rm .claude/SETUP_GUIDE.md
322
322
  ---
323
323
 
324
324
  *This setup guide is generated by CodeSyncer CLI. For issues or improvements, visit: https://github.com/bitjaru/codesyncer*
325
+
326
+ <!-- codesyncer-version: 3.1.0 -->
@@ -145,3 +145,5 @@
145
145
  ---
146
146
 
147
147
  *이 문서는 CodeSyncer에 의해 자동 생성 및 관리됩니다.*
148
+
149
+ <!-- codesyncer-version: 3.1.0 -->
@@ -279,3 +279,5 @@ grep -r "@codesyncer-rule" ./
279
279
  ---
280
280
 
281
281
  *이 협업 시스템은 오픈소스입니다. 개선 아이디어는 [CodeSyncer GitHub](https://github.com/bitjaru/codesyncer)에서 제안해주세요!*
282
+
283
+ <!-- codesyncer-version: 3.1.0 -->
@@ -580,3 +580,5 @@ ARCHITECTURE.md에 자동 집계:
580
580
  **마지막 업데이트**: [TODAY]
581
581
 
582
582
  *주석이 곧 문서입니다. 모든 컨텍스트를 코드에 기록하세요.*
583
+
584
+ <!-- codesyncer-version: 3.1.0 -->
@@ -225,3 +225,5 @@ grep "@codesyncer-decision" src/services/PaymentService.ts
225
225
  **마지막 업데이트**: [TODAY]
226
226
 
227
227
  *모든 중요한 의사결정이 영구 기록됩니다. 팀의 지식 자산입니다.*
228
+
229
+ <!-- codesyncer-version: 3.1.0 -->
@@ -177,3 +177,5 @@ CodeSyncer는 두 가지 태그 형식을 모두 지원합니다:
177
177
 
178
178
  *CodeSyncer - 영구 컨텍스트, 추론 통제, 실시간 아키텍처 동기화 for Claude Code*
179
179
  *현재 지원: Claude Code | 향후 지원 예정: Cursor, GitHub Copilot, Continue.dev*
180
+
181
+ <!-- codesyncer-version: 3.1.0 -->
@@ -239,3 +239,5 @@ grep -r "결제" ./*/
239
239
  ---
240
240
 
241
241
  *CodeSyncer는 오픈소스입니다: https://github.com/bitjaru/codesyncer*
242
+
243
+ <!-- codesyncer-version: 3.1.0 -->
@@ -313,3 +313,5 @@ CodeSyncer 사용 준비 완료!
313
313
  ---
314
314
 
315
315
  *이 설정 가이드는 CodeSyncer CLI에 의해 생성됩니다. 문제나 개선사항은 https://github.com/bitjaru/codesyncer 방문*
316
+
317
+ <!-- codesyncer-version: 3.1.0 -->
@@ -330,3 +330,5 @@ CodeSyncer 사용 준비 완료!
330
330
  ---
331
331
 
332
332
  *이 설정 가이드는 CodeSyncer CLI에 의해 생성됩니다. 문제나 개선사항은 https://github.com/bitjaru/codesyncer 방문*
333
+
334
+ <!-- codesyncer-version: 3.1.0 -->
@@ -322,3 +322,5 @@ rm .claude/SETUP_GUIDE.md
322
322
  ---
323
323
 
324
324
  *이 설정 가이드는 CodeSyncer CLI에 의해 생성됩니다. 문제나 개선사항은 https://github.com/bitjaru/codesyncer 방문*
325
+
326
+ <!-- codesyncer-version: 3.1.0 -->