k0ntext 3.3.0 → 3.5.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 (200) hide show
  1. package/README.md +240 -26
  2. package/dist/agents/cleanup-agent.d.ts.map +1 -1
  3. package/dist/agents/cleanup-agent.js +18 -6
  4. package/dist/agents/cleanup-agent.js.map +1 -1
  5. package/dist/agents/drift-agent.d.ts +7 -0
  6. package/dist/agents/drift-agent.d.ts.map +1 -1
  7. package/dist/agents/drift-agent.js +29 -8
  8. package/dist/agents/drift-agent.js.map +1 -1
  9. package/dist/cli/commands/cleanup.d.ts.map +1 -1
  10. package/dist/cli/commands/cleanup.js +8 -1
  11. package/dist/cli/commands/cleanup.js.map +1 -1
  12. package/dist/cli/commands/drift-detect.d.ts.map +1 -1
  13. package/dist/cli/commands/drift-detect.js +21 -1
  14. package/dist/cli/commands/drift-detect.js.map +1 -1
  15. package/dist/cli/commands/restore.d.ts +12 -0
  16. package/dist/cli/commands/restore.d.ts.map +1 -0
  17. package/dist/cli/commands/restore.js +261 -0
  18. package/dist/cli/commands/restore.js.map +1 -0
  19. package/dist/cli/commands/sync-templates.d.ts +15 -0
  20. package/dist/cli/commands/sync-templates.d.ts.map +1 -0
  21. package/dist/cli/commands/sync-templates.js +181 -0
  22. package/dist/cli/commands/sync-templates.js.map +1 -0
  23. package/dist/cli/commands/version-check.d.ts +12 -0
  24. package/dist/cli/commands/version-check.d.ts.map +1 -0
  25. package/dist/cli/commands/version-check.js +133 -0
  26. package/dist/cli/commands/version-check.js.map +1 -0
  27. package/dist/cli/generate.d.ts +5 -0
  28. package/dist/cli/generate.d.ts.map +1 -1
  29. package/dist/cli/generate.js +80 -16
  30. package/dist/cli/generate.js.map +1 -1
  31. package/dist/cli/index.js +145 -1
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/repl/index.d.ts +4 -0
  34. package/dist/cli/repl/index.d.ts.map +1 -1
  35. package/dist/cli/repl/index.js +113 -95
  36. package/dist/cli/repl/index.js.map +1 -1
  37. package/dist/cli/repl/tui/panels/config.d.ts +71 -0
  38. package/dist/cli/repl/tui/panels/config.d.ts.map +1 -0
  39. package/dist/cli/repl/tui/panels/config.js +392 -0
  40. package/dist/cli/repl/tui/panels/config.js.map +1 -0
  41. package/dist/cli/repl/tui/panels/drift.d.ts +95 -0
  42. package/dist/cli/repl/tui/panels/drift.d.ts.map +1 -0
  43. package/dist/cli/repl/tui/panels/drift.js +353 -0
  44. package/dist/cli/repl/tui/panels/drift.js.map +1 -0
  45. package/dist/cli/repl/tui/panels/indexing.d.ts +86 -0
  46. package/dist/cli/repl/tui/panels/indexing.d.ts.map +1 -0
  47. package/dist/cli/repl/tui/panels/indexing.js +254 -0
  48. package/dist/cli/repl/tui/panels/indexing.js.map +1 -0
  49. package/dist/cli/repl/tui/panels/search.d.ts +66 -0
  50. package/dist/cli/repl/tui/panels/search.d.ts.map +1 -0
  51. package/dist/cli/repl/tui/panels/search.js +215 -0
  52. package/dist/cli/repl/tui/panels/search.js.map +1 -0
  53. package/dist/cli/utils/backup-manager.d.ts +94 -0
  54. package/dist/cli/utils/backup-manager.d.ts.map +1 -0
  55. package/dist/cli/utils/backup-manager.js +230 -0
  56. package/dist/cli/utils/backup-manager.js.map +1 -0
  57. package/dist/cli/utils/file-detector.d.ts +87 -0
  58. package/dist/cli/utils/file-detector.d.ts.map +1 -0
  59. package/dist/cli/utils/file-detector.js +131 -0
  60. package/dist/cli/utils/file-detector.js.map +1 -0
  61. package/dist/cli/utils/index.d.ts +9 -0
  62. package/dist/cli/utils/index.d.ts.map +1 -0
  63. package/dist/cli/utils/index.js +9 -0
  64. package/dist/cli/utils/index.js.map +1 -0
  65. package/dist/cli/utils/modification-prompt.d.ts +41 -0
  66. package/dist/cli/utils/modification-prompt.d.ts.map +1 -0
  67. package/dist/cli/utils/modification-prompt.js +84 -0
  68. package/dist/cli/utils/modification-prompt.js.map +1 -0
  69. package/dist/cli/version/checker.d.ts +47 -0
  70. package/dist/cli/version/checker.d.ts.map +1 -0
  71. package/dist/cli/version/checker.js +143 -0
  72. package/dist/cli/version/checker.js.map +1 -0
  73. package/dist/cli/version/comparator.d.ts +46 -0
  74. package/dist/cli/version/comparator.d.ts.map +1 -0
  75. package/dist/cli/version/comparator.js +99 -0
  76. package/dist/cli/version/comparator.js.map +1 -0
  77. package/dist/cli/version/index.d.ts +11 -0
  78. package/dist/cli/version/index.d.ts.map +1 -0
  79. package/dist/cli/version/index.js +11 -0
  80. package/dist/cli/version/index.js.map +1 -0
  81. package/dist/cli/version/parser.d.ts +38 -0
  82. package/dist/cli/version/parser.d.ts.map +1 -0
  83. package/dist/cli/version/parser.js +90 -0
  84. package/dist/cli/version/parser.js.map +1 -0
  85. package/dist/cli/version/prompt.d.ts +40 -0
  86. package/dist/cli/version/prompt.d.ts.map +1 -0
  87. package/dist/cli/version/prompt.js +162 -0
  88. package/dist/cli/version/prompt.js.map +1 -0
  89. package/dist/cli/version/types.d.ts +89 -0
  90. package/dist/cli/version/types.d.ts.map +1 -0
  91. package/dist/cli/version/types.js +7 -0
  92. package/dist/cli/version/types.js.map +1 -0
  93. package/dist/db/client.d.ts +64 -2
  94. package/dist/db/client.d.ts.map +1 -1
  95. package/dist/db/client.js +148 -2
  96. package/dist/db/client.js.map +1 -1
  97. package/dist/db/schema.d.ts +41 -2
  98. package/dist/db/schema.d.ts.map +1 -1
  99. package/dist/db/schema.js +77 -2
  100. package/dist/db/schema.js.map +1 -1
  101. package/dist/mcp.js +2 -2
  102. package/dist/mcp.js.map +1 -1
  103. package/dist/template-engine/data-transformer.d.ts +17 -0
  104. package/dist/template-engine/data-transformer.d.ts.map +1 -0
  105. package/dist/template-engine/data-transformer.js +343 -0
  106. package/dist/template-engine/data-transformer.js.map +1 -0
  107. package/dist/template-engine/engine.d.ts +74 -0
  108. package/dist/template-engine/engine.d.ts.map +1 -0
  109. package/dist/template-engine/engine.js +183 -0
  110. package/dist/template-engine/engine.js.map +1 -0
  111. package/dist/template-engine/helpers.d.ts +81 -0
  112. package/dist/template-engine/helpers.d.ts.map +1 -0
  113. package/dist/template-engine/helpers.js +153 -0
  114. package/dist/template-engine/helpers.js.map +1 -0
  115. package/dist/template-engine/index.d.ts +10 -0
  116. package/dist/template-engine/index.d.ts.map +1 -0
  117. package/dist/template-engine/index.js +10 -0
  118. package/dist/template-engine/index.js.map +1 -0
  119. package/dist/template-engine/types.d.ts +147 -0
  120. package/dist/template-engine/types.d.ts.map +1 -0
  121. package/dist/template-engine/types.js +7 -0
  122. package/dist/template-engine/types.js.map +1 -0
  123. package/dist/template-sync/comparator.d.ts +138 -0
  124. package/dist/template-sync/comparator.d.ts.map +1 -0
  125. package/dist/template-sync/comparator.js +353 -0
  126. package/dist/template-sync/comparator.js.map +1 -0
  127. package/dist/template-sync/conflict-resolver.d.ts +112 -0
  128. package/dist/template-sync/conflict-resolver.d.ts.map +1 -0
  129. package/dist/template-sync/conflict-resolver.js +328 -0
  130. package/dist/template-sync/conflict-resolver.js.map +1 -0
  131. package/dist/template-sync/engine.d.ts +93 -0
  132. package/dist/template-sync/engine.d.ts.map +1 -0
  133. package/dist/template-sync/engine.js +350 -0
  134. package/dist/template-sync/engine.js.map +1 -0
  135. package/dist/template-sync/hasher.d.ts +67 -0
  136. package/dist/template-sync/hasher.d.ts.map +1 -0
  137. package/dist/template-sync/hasher.js +94 -0
  138. package/dist/template-sync/hasher.js.map +1 -0
  139. package/dist/template-sync/index.d.ts +20 -0
  140. package/dist/template-sync/index.d.ts.map +1 -0
  141. package/dist/template-sync/index.js +14 -0
  142. package/dist/template-sync/index.js.map +1 -0
  143. package/dist/template-sync/manifest.d.ts +131 -0
  144. package/dist/template-sync/manifest.d.ts.map +1 -0
  145. package/dist/template-sync/manifest.js +309 -0
  146. package/dist/template-sync/manifest.js.map +1 -0
  147. package/dist/template-sync/merger.d.ts +125 -0
  148. package/dist/template-sync/merger.d.ts.map +1 -0
  149. package/dist/template-sync/merger.js +371 -0
  150. package/dist/template-sync/merger.js.map +1 -0
  151. package/dist/template-sync/scanner.d.ts +106 -0
  152. package/dist/template-sync/scanner.d.ts.map +1 -0
  153. package/dist/template-sync/scanner.js +196 -0
  154. package/dist/template-sync/scanner.js.map +1 -0
  155. package/dist/template-sync/types.d.ts +199 -0
  156. package/dist/template-sync/types.d.ts.map +1 -0
  157. package/dist/template-sync/types.js +30 -0
  158. package/dist/template-sync/types.js.map +1 -0
  159. package/package.json +2 -1
  160. package/src/agents/cleanup-agent.ts +21 -6
  161. package/src/agents/drift-agent.ts +31 -8
  162. package/src/cli/commands/cleanup.ts +9 -1
  163. package/src/cli/commands/drift-detect.ts +24 -1
  164. package/src/cli/commands/restore.ts +318 -0
  165. package/src/cli/commands/sync-templates.ts +210 -0
  166. package/src/cli/commands/version-check.ts +158 -0
  167. package/src/cli/generate.ts +99 -17
  168. package/src/cli/index.ts +167 -1
  169. package/src/cli/repl/index.ts +118 -105
  170. package/src/cli/repl/tui/panels/config.ts +457 -0
  171. package/src/cli/repl/tui/panels/drift.ts +458 -0
  172. package/src/cli/repl/tui/panels/indexing.ts +324 -0
  173. package/src/cli/repl/tui/panels/search.ts +272 -0
  174. package/src/cli/utils/backup-manager.ts +275 -0
  175. package/src/cli/utils/file-detector.ts +181 -0
  176. package/src/cli/utils/index.ts +9 -0
  177. package/src/cli/utils/modification-prompt.ts +112 -0
  178. package/src/cli/version/checker.ts +172 -0
  179. package/src/cli/version/comparator.ts +106 -0
  180. package/src/cli/version/index.ts +11 -0
  181. package/src/cli/version/parser.ts +101 -0
  182. package/src/cli/version/prompt.ts +208 -0
  183. package/src/cli/version/types.ts +95 -0
  184. package/src/db/client.ts +220 -3
  185. package/src/db/schema.ts +109 -2
  186. package/src/mcp.ts +2 -2
  187. package/src/template-engine/data-transformer.ts +367 -0
  188. package/src/template-engine/engine.ts +213 -0
  189. package/src/template-engine/helpers.ts +163 -0
  190. package/src/template-engine/index.ts +10 -0
  191. package/src/template-engine/types.ts +158 -0
  192. package/src/template-sync/comparator.ts +452 -0
  193. package/src/template-sync/conflict-resolver.ts +401 -0
  194. package/src/template-sync/engine.ts +417 -0
  195. package/src/template-sync/hasher.ts +104 -0
  196. package/src/template-sync/index.ts +60 -0
  197. package/src/template-sync/manifest.ts +358 -0
  198. package/src/template-sync/merger.ts +454 -0
  199. package/src/template-sync/scanner.ts +254 -0
  200. package/src/template-sync/types.ts +247 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Restore Command
3
+ *
4
+ * CLI command to restore AI tool config files from backups.
5
+ * Supports listing backups and restoring from specific backups.
6
+ */
7
+ import { Command } from 'commander';
8
+ /**
9
+ * Restore command
10
+ */
11
+ export declare const restoreCommand: Command;
12
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC;;GAEG;AACH,eAAO,MAAM,cAAc,SAsLvB,CAAC"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Restore Command
3
+ *
4
+ * CLI command to restore AI tool config files from backups.
5
+ * Supports listing backups and restoring from specific backups.
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import path from 'path';
11
+ import fs from 'fs/promises';
12
+ import { select, confirm } from '@inquirer/prompts';
13
+ import { BackupManager } from '../utils/backup-manager.js';
14
+ /**
15
+ * Parse git stash reference from backup path
16
+ */
17
+ function parseGitStashRef(backupPath) {
18
+ if (backupPath.startsWith('git-stash:')) {
19
+ return { stashRef: backupPath.replace('git-stash:', '') };
20
+ }
21
+ return null;
22
+ }
23
+ /**
24
+ * Restore from git stash
25
+ */
26
+ async function restoreFromGitStash(stashRef, projectRoot, filePath) {
27
+ try {
28
+ const { execSync } = await import('child_process');
29
+ const relativePath = path.relative(projectRoot, filePath);
30
+ // Try to apply the stash
31
+ execSync(`git stash apply ${stashRef} -- "${relativePath}"`, {
32
+ cwd: projectRoot,
33
+ stdio: 'pipe'
34
+ });
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Format backup info for display
43
+ */
44
+ function formatBackupInfo(backupPath, tool) {
45
+ const gitStash = parseGitStashRef(backupPath);
46
+ if (gitStash) {
47
+ return `${chalk.cyan(tool.padEnd(12))} ${chalk.dim('Git stash:')} ${chalk.yellow(gitStash.stashRef)}`;
48
+ }
49
+ const fileName = path.basename(backupPath);
50
+ const dateMatch = fileName.match(/\.(\d{4}-\d{2}-\d{2}T[\d:.-]+)\.bak$/);
51
+ if (dateMatch) {
52
+ const date = new Date(dateMatch[1].replace(/-/g, ':'));
53
+ const formatted = date.toLocaleString();
54
+ return `${chalk.cyan(tool.padEnd(12))} ${chalk.dim('File:')} ${chalk.yellow(fileName)} ${chalk.dim(`(${formatted})`)}`;
55
+ }
56
+ return `${chalk.cyan(tool.padEnd(12))} ${chalk.yellow(backupPath)}`;
57
+ }
58
+ /**
59
+ * List available backups for a tool
60
+ */
61
+ async function listBackupsForTool(db, projectRoot, tool) {
62
+ const generatedFiles = db.getGeneratedFiles(tool);
63
+ return generatedFiles
64
+ .filter(f => f.backupPath)
65
+ .map(f => ({
66
+ tool,
67
+ backupPath: f.backupPath,
68
+ filePath: f.filePath,
69
+ generatedAt: f.generatedAt
70
+ }));
71
+ }
72
+ /**
73
+ * Restore command
74
+ */
75
+ export const restoreCommand = new Command('restore')
76
+ .description('Restore AI tool config files from backups')
77
+ .option('--list', 'List available backups')
78
+ .option('--backup <path>', 'Restore from specific backup path')
79
+ .option('--tool <name>', 'Filter by tool name')
80
+ .option('--force', 'Restore without confirmation')
81
+ .action(async (options) => {
82
+ const spinner = ora();
83
+ const projectRoot = process.cwd();
84
+ try {
85
+ // Load database
86
+ const { DatabaseClient } = await import('../../db/client.js');
87
+ const db = new DatabaseClient(projectRoot);
88
+ const backupManager = new BackupManager(db, projectRoot);
89
+ // List mode
90
+ if (options.list) {
91
+ spinner.start('Finding backups...');
92
+ const tools = options.tool
93
+ ? [options.tool]
94
+ : ['claude', 'copilot', 'cline', 'antigravity', 'windsurf', 'aider', 'continue', 'cursor', 'gemini'];
95
+ const allBackups = [];
96
+ for (const tool of tools) {
97
+ const backups = await listBackupsForTool(db, projectRoot, tool);
98
+ allBackups.push(...backups);
99
+ }
100
+ spinner.stop();
101
+ if (allBackups.length === 0) {
102
+ console.log(chalk.yellow('\nNo backups found.'));
103
+ console.log(chalk.dim('Generate context files first to create backups.\n'));
104
+ return;
105
+ }
106
+ console.log(chalk.bold('\nAvailable Backups'));
107
+ console.log(chalk.dim('─'.repeat(60)));
108
+ for (const backup of allBackups) {
109
+ console.log(formatBackupInfo(backup.backupPath, backup.tool));
110
+ console.log(chalk.dim(` Target: ${backup.filePath}\n`));
111
+ }
112
+ console.log(chalk.dim(`Run ${chalk.white('k0ntext restore --backup <path>')} to restore from a backup.\n`));
113
+ db.close();
114
+ return;
115
+ }
116
+ // Restore from specific backup
117
+ if (options.backup) {
118
+ const backupPath = options.backup;
119
+ const targetPath = await findTargetForBackup(db, backupPath, options.tool);
120
+ if (!targetPath) {
121
+ spinner.fail(chalk.red('Backup not found in database'));
122
+ console.log(chalk.dim('\nUse --list to see available backups.\n'));
123
+ db.close();
124
+ return;
125
+ }
126
+ // Confirm unless --force
127
+ if (!options.force) {
128
+ const confirmed = await confirm({
129
+ message: `Restore ${targetPath.filePath} from backup?`,
130
+ default: false
131
+ });
132
+ if (!confirmed) {
133
+ console.log(chalk.dim('\nRestore cancelled.\n'));
134
+ db.close();
135
+ return;
136
+ }
137
+ }
138
+ spinner.start('Restoring from backup...');
139
+ const success = await restoreFromBackup(backupPath, targetPath.filePath, projectRoot);
140
+ if (success) {
141
+ spinner.succeed(chalk.green('File restored successfully!'));
142
+ // Clear the user_modified flag since we restored the generated version
143
+ const tool = targetPath.tool;
144
+ db.upsertGeneratedFile({
145
+ tool,
146
+ filePath: targetPath.filePath,
147
+ contentHash: db.hashContent(await fs.readFile(targetPath.filePath, 'utf-8')),
148
+ backupPath: undefined // Clear backup after restore
149
+ });
150
+ }
151
+ else {
152
+ spinner.fail(chalk.red('Restore failed'));
153
+ }
154
+ db.close();
155
+ return;
156
+ }
157
+ // Interactive mode
158
+ spinner.start('Loading backups...');
159
+ const tools = ['claude', 'copilot', 'cline', 'antigravity', 'windsurf', 'aider', 'continue', 'cursor', 'gemini'];
160
+ const allBackups = [];
161
+ for (const tool of tools) {
162
+ const backups = await listBackupsForTool(db, projectRoot, tool);
163
+ for (const backup of backups) {
164
+ allBackups.push({
165
+ ...backup,
166
+ label: `${tool}: ${path.basename(backup.filePath)} (${backup.backupPath.split(':').pop()})`
167
+ });
168
+ }
169
+ }
170
+ spinner.stop();
171
+ if (allBackups.length === 0) {
172
+ console.log(chalk.yellow('\nNo backups found.'));
173
+ console.log(chalk.dim('Generate context files first to create backups.\n'));
174
+ db.close();
175
+ return;
176
+ }
177
+ // Prompt user to select backup
178
+ const selected = await select({
179
+ message: 'Select a backup to restore:',
180
+ choices: [
181
+ ...allBackups.map(b => ({
182
+ name: b.label,
183
+ value: b
184
+ })),
185
+ { name: 'Cancel', value: null }
186
+ ]
187
+ });
188
+ if (!selected) {
189
+ console.log(chalk.dim('\nRestore cancelled.\n'));
190
+ db.close();
191
+ return;
192
+ }
193
+ // Confirm restore
194
+ const confirmed = await confirm({
195
+ message: `Restore ${selected.filePath} from backup?`,
196
+ default: true
197
+ });
198
+ if (!confirmed) {
199
+ console.log(chalk.dim('\nRestore cancelled.\n'));
200
+ db.close();
201
+ return;
202
+ }
203
+ spinner.start('Restoring from backup...');
204
+ const success = await restoreFromBackup(selected.backupPath, selected.filePath, projectRoot);
205
+ if (success) {
206
+ spinner.succeed(chalk.green('File restored successfully!'));
207
+ // Clear the user_modified flag
208
+ const content = await fs.readFile(selected.filePath, 'utf-8');
209
+ db.upsertGeneratedFile({
210
+ tool: selected.tool,
211
+ filePath: selected.filePath,
212
+ contentHash: db.hashContent(content),
213
+ backupPath: undefined
214
+ });
215
+ }
216
+ else {
217
+ spinner.fail(chalk.red('Restore failed'));
218
+ }
219
+ db.close();
220
+ }
221
+ catch (error) {
222
+ spinner.fail('Restore failed');
223
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
224
+ process.exit(1);
225
+ }
226
+ });
227
+ /**
228
+ * Find the target file path for a backup
229
+ */
230
+ async function findTargetForBackup(db, backupPath, toolFilter) {
231
+ const tools = toolFilter
232
+ ? [toolFilter]
233
+ : ['claude', 'copilot', 'cline', 'antigravity', 'windsurf', 'aider', 'continue', 'cursor', 'gemini'];
234
+ for (const tool of tools) {
235
+ const files = db.getGeneratedFiles(tool);
236
+ for (const file of files) {
237
+ if (file.backupPath === backupPath) {
238
+ return { tool, filePath: file.filePath };
239
+ }
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Restore from a backup (file or git stash)
246
+ */
247
+ async function restoreFromBackup(backupPath, targetPath, projectRoot) {
248
+ const gitStash = parseGitStashRef(backupPath);
249
+ if (gitStash) {
250
+ return await restoreFromGitStash(gitStash.stashRef, projectRoot, targetPath);
251
+ }
252
+ // File copy restore
253
+ try {
254
+ await fs.copyFile(backupPath, targetPath);
255
+ return true;
256
+ }
257
+ catch {
258
+ return false;
259
+ }
260
+ }
261
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/cli/commands/restore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Template Sync Command
3
+ *
4
+ * CLI command for syncing .claude/ templates from package templates/base/
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Sync templates command
9
+ */
10
+ export declare const syncTemplatesCommand: Command;
11
+ /**
12
+ * Template status command (shows current sync status)
13
+ */
14
+ export declare const templateStatusCommand: Command;
15
+ //# sourceMappingURL=sync-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-templates.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync-templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,eAAO,MAAM,oBAAoB,SAqI7B,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,qBAAqB,SAiD9B,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Template Sync Command
3
+ *
4
+ * CLI command for syncing .claude/ templates from package templates/base/
5
+ */
6
+ import { Command } from 'commander';
7
+ import { DatabaseClient } from '../../db/client.js';
8
+ import { TemplateSyncEngine } from '../../template-sync/index.js';
9
+ import { TEMPLATE_SUBDIRS } from '../../template-sync/types.js';
10
+ import ora from 'ora';
11
+ import chalk from 'chalk';
12
+ import path from 'path';
13
+ import { fileURLToPath } from 'url';
14
+ // ES module __dirname equivalent
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = path.dirname(__filename);
17
+ /**
18
+ * Sync templates command
19
+ */
20
+ export const syncTemplatesCommand = new Command('sync-templates')
21
+ .description('Sync .claude/ templates from package templates/base/')
22
+ .option('--dry-run', 'Show changes without applying them')
23
+ .option('--force', 'Auto-overwrite conflicts without prompting')
24
+ .option('--subdirs <dirs>', 'Comma-separated subdirectories to sync (commands,agents,schemas,standards,tools,automation)')
25
+ .option('-v, --verbose', 'Show detailed output including diffs')
26
+ .option('--no-archive', 'Skip archiving removed files')
27
+ .action(async (options) => {
28
+ const spinner = ora({ spinner: 'dots' }).start();
29
+ try {
30
+ // Parse subdirectories if provided
31
+ let subdirectories;
32
+ if (options.subdirs) {
33
+ const requestedDirs = options.subdirs.split(',').map((s) => s.trim().toLowerCase());
34
+ subdirectories = requestedDirs.filter((d) => TEMPLATE_SUBDIRS.includes(d));
35
+ if (subdirectories.length === 0) {
36
+ spinner.stop();
37
+ console.error(chalk.red(`\n✖ Error: No valid subdirectories provided`));
38
+ console.error(chalk.gray(` Valid options: ${TEMPLATE_SUBDIRS.join(', ')}`));
39
+ process.exit(1);
40
+ }
41
+ if (subdirectories.length !== requestedDirs.length) {
42
+ const invalid = requestedDirs.filter((d) => !TEMPLATE_SUBDIRS.includes(d));
43
+ console.warn(chalk.yellow(`\n⚠ Warning: Invalid subdirectories ignored: ${invalid.join(', ')}`));
44
+ }
45
+ }
46
+ // Initialize database and engine
47
+ const db = new DatabaseClient(process.cwd());
48
+ // Path needs to go up from dist/cli/commands to the project root, then to templates/base
49
+ const templateRoot = path.resolve(__dirname, '../../../templates/base');
50
+ const engine = new TemplateSyncEngine(db, process.cwd(), templateRoot);
51
+ // Check status
52
+ spinner.text = 'Checking template sync status...';
53
+ const status = await engine.getStatusSummary();
54
+ spinner.stop();
55
+ if (status.manifestExists && status.templateVersion) {
56
+ console.log(chalk.gray(`\nCurrent template version: ${status.templateVersion}`));
57
+ console.log(chalk.gray(`Package version: ${status.currentVersion}`));
58
+ }
59
+ if (status.userModifiedFiles.length > 0) {
60
+ console.log(chalk.yellow(`\n⚠ ${status.userModifiedFiles.length} user-modified file(s) detected:`));
61
+ for (const file of status.userModifiedFiles.slice(0, 5)) {
62
+ console.log(chalk.dim(` • ${file}`));
63
+ }
64
+ if (status.userModifiedFiles.length > 5) {
65
+ console.log(chalk.dim(` ... and ${status.userModifiedFiles.length - 5} more`));
66
+ }
67
+ }
68
+ // Check if sync is actually needed (has files to sync)
69
+ if (!options.force) {
70
+ const { TemplateComparator } = await import('../../template-sync/index.js');
71
+ const comparator = new TemplateComparator(db, process.cwd(), path.resolve(__dirname, '../../../templates/base'), options.verbose);
72
+ const comparisonResult = await comparator.compare();
73
+ const actionableFiles = TemplateComparator.getActionableComparisons(comparisonResult.comparisons);
74
+ if (actionableFiles.length === 0 && status.manifestExists) {
75
+ console.log(chalk.green('\n✓ Templates are already up to date'));
76
+ db.close();
77
+ return;
78
+ }
79
+ if (actionableFiles.length > 0) {
80
+ console.log(chalk.cyan(`\n${actionableFiles.length} file(s) need syncing:`));
81
+ actionableFiles.slice(0, 5).forEach(f => console.log(chalk.dim(` • ${f.path}`)));
82
+ if (actionableFiles.length > 5) {
83
+ console.log(chalk.dim(` ... and ${actionableFiles.length - 5} more`));
84
+ }
85
+ }
86
+ }
87
+ console.log('');
88
+ // Configure sync options
89
+ const syncOptions = {
90
+ dryRun: options.dryRun ?? false,
91
+ force: options.force ?? false,
92
+ subdirectories: subdirectories,
93
+ verbose: options.verbose ?? false,
94
+ archiveRemoved: options.archive !== false
95
+ };
96
+ // Execute sync
97
+ const result = await engine.sync(syncOptions);
98
+ // Display results
99
+ if (!options.dryRun) {
100
+ console.log('');
101
+ console.log(chalk.bold('Sync Summary:'));
102
+ console.log(chalk.cyan(` Total files: ${result.total}`));
103
+ console.log(chalk.green(` Updated: ${result.updated}`));
104
+ console.log(chalk.cyan(` Created: ${result.created}`));
105
+ console.log(chalk.yellow(` Skipped: ${result.skipped.length}`));
106
+ if (result.conflicts.length > 0) {
107
+ console.log(chalk.red(` Conflicts: ${result.conflicts.length}`));
108
+ for (const conflict of result.conflicts.slice(0, 3)) {
109
+ console.log(chalk.dim(` - ${conflict.path}`));
110
+ }
111
+ if (result.conflicts.length > 3) {
112
+ console.log(chalk.dim(` ... and ${result.conflicts.length - 3} more`));
113
+ }
114
+ console.log(chalk.gray('\n Run again to resolve conflicts individually'));
115
+ }
116
+ if (result.userOnly.length > 0 && options.archive !== false) {
117
+ console.log(chalk.gray(` Archived: ${result.userOnly.length} removed file(s)`));
118
+ }
119
+ console.log(chalk.gray(` Duration: ${result.durationMs}ms`));
120
+ if (result.conflicts.length === 0) {
121
+ console.log(chalk.green('\n✓ Template sync complete!'));
122
+ }
123
+ else {
124
+ console.log(chalk.yellow('\n⚠ Template sync complete with unresolved conflicts'));
125
+ }
126
+ }
127
+ db.close();
128
+ }
129
+ catch (error) {
130
+ spinner.fail(chalk.red('Sync failed'));
131
+ console.error(chalk.dim(error instanceof Error ? error.message : String(error)));
132
+ process.exit(1);
133
+ }
134
+ });
135
+ /**
136
+ * Template status command (shows current sync status)
137
+ */
138
+ export const templateStatusCommand = new Command('template-status')
139
+ .description('Show template sync status')
140
+ .option('-v, --verbose', 'Show detailed status')
141
+ .action(async (options) => {
142
+ const spinner = ora({ spinner: 'dots' }).start();
143
+ try {
144
+ const db = new DatabaseClient(process.cwd());
145
+ const templateRoot = path.resolve(__dirname, '../../templates/base');
146
+ const engine = new TemplateSyncEngine(db, process.cwd(), templateRoot);
147
+ const status = await engine.getStatusSummary();
148
+ spinner.stop();
149
+ console.log('');
150
+ console.log(chalk.bold('Template Sync Status:\n'));
151
+ console.log(`${chalk.cyan('Package Version:')} ${status.currentVersion}`);
152
+ if (status.manifestExists) {
153
+ console.log(`${chalk.cyan('Template Version:')} ${status.templateVersion || 'unknown'}`);
154
+ if (status.needsUpdate) {
155
+ console.log(chalk.yellow(' ⚠ Templates are outdated'));
156
+ }
157
+ else {
158
+ console.log(chalk.green(' ✓ Templates are up to date'));
159
+ }
160
+ }
161
+ else {
162
+ console.log(chalk.yellow(' No manifest found - run sync to initialize'));
163
+ }
164
+ if (status.userModifiedFiles.length > 0) {
165
+ console.log(`\n${chalk.cyan('User-Modified Files:')} ${status.userModifiedFiles.length}`);
166
+ if (options.verbose) {
167
+ for (const file of status.userModifiedFiles) {
168
+ console.log(chalk.dim(` • ${file}`));
169
+ }
170
+ }
171
+ }
172
+ console.log('');
173
+ db.close();
174
+ }
175
+ catch (error) {
176
+ spinner.fail(chalk.red('Status check failed'));
177
+ console.error(chalk.dim(error instanceof Error ? error.message : String(error)));
178
+ process.exit(1);
179
+ }
180
+ });
181
+ //# sourceMappingURL=sync-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-templates.js","sourceRoot":"","sources":["../../../src/cli/commands/sync-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Version Check Command
3
+ *
4
+ * CLI command to check if context files are outdated.
5
+ * Users can run this independently or it will be integrated into `init`.
6
+ */
7
+ import { Command } from 'commander';
8
+ /**
9
+ * Version check command
10
+ */
11
+ export declare const versionCheckCommand: Command;
12
+ //# sourceMappingURL=version-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/version-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC;;GAEG;AACH,eAAO,MAAM,mBAAmB,SAqF5B,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Version Check Command
3
+ *
4
+ * CLI command to check if context files are outdated.
5
+ * Users can run this independently or it will be integrated into `init`.
6
+ */
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ const packageJsonPath = path.join(__dirname, '../../../package.json');
16
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
17
+ const K0NTEXT_VERSION = packageJson.version;
18
+ import { checkContextFiles, showVersionSummary, promptRegeneration } from '../version/index.js';
19
+ /**
20
+ * Perform regeneration of outdated files
21
+ *
22
+ * @param outdatedFiles - Files to regenerate
23
+ * @param projectRoot - Project root directory
24
+ */
25
+ async function regenerateFiles(outdatedFiles, projectRoot) {
26
+ const { DatabaseClient } = await import('../../db/client.js');
27
+ const db = new DatabaseClient(projectRoot);
28
+ // Check database has content
29
+ const stats = db.getStats();
30
+ if (stats.items === 0) {
31
+ console.log(chalk.yellow('⚠ No context in database. Run `k0ntext index` first.'));
32
+ return;
33
+ }
34
+ const { generateForTool } = await import('../generate.js');
35
+ const spinner = ora('Regenerating context files...');
36
+ for (const file of outdatedFiles) {
37
+ spinner.text = `Regenerating ${file.tool} context...`;
38
+ try {
39
+ const resultPath = await generateForTool(file.tool, db, true, false, { verbose: false });
40
+ if (resultPath) {
41
+ spinner.succeed(chalk.green(`✓ Regenerated ${file.tool} context`));
42
+ }
43
+ }
44
+ catch (error) {
45
+ spinner.fail(chalk.red(`✗ Failed to regenerate ${file.tool}`));
46
+ if (error instanceof Error) {
47
+ console.error(chalk.dim(error.message));
48
+ }
49
+ }
50
+ spinner.start();
51
+ }
52
+ spinner.stop();
53
+ db.close();
54
+ }
55
+ /**
56
+ * Version check command
57
+ */
58
+ export const versionCheckCommand = new Command('check')
59
+ .description('Check if context files are outdated')
60
+ .option('--update', 'Prompt to update outdated files')
61
+ .option('--force', 'Update without prompting')
62
+ .option('-v, --verbose', 'Show detailed output')
63
+ .action(async (options) => {
64
+ const spinner = ora();
65
+ const projectRoot = process.cwd();
66
+ const verbose = options.verbose || false;
67
+ try {
68
+ spinner.start('Checking context file versions...');
69
+ // Load database for modification detection
70
+ let db;
71
+ try {
72
+ const { DatabaseClient } = await import('../../db/client.js');
73
+ db = new DatabaseClient(projectRoot);
74
+ }
75
+ catch {
76
+ // Database might not exist, that's okay
77
+ }
78
+ // Check versions
79
+ const result = await checkContextFiles({
80
+ projectRoot,
81
+ currentVersion: K0NTEXT_VERSION,
82
+ checkModifications: !!db
83
+ }, db);
84
+ spinner.stop();
85
+ // Show summary
86
+ showVersionSummary(result);
87
+ // Close database if opened
88
+ if (db) {
89
+ db.close();
90
+ }
91
+ // Handle updates
92
+ if (result.outdated.length > 0 && options.update) {
93
+ if (options.force) {
94
+ // Update without prompting
95
+ console.log(chalk.bold('\nRegenerating files...'));
96
+ await regenerateFiles(result.outdated, projectRoot);
97
+ console.log(chalk.green('\n✓ All files regenerated successfully!'));
98
+ }
99
+ else {
100
+ // Prompt user
101
+ const promptResult = await promptRegeneration(result.outdated);
102
+ if (promptResult.choice === 'skip') {
103
+ console.log(chalk.dim('\nSkipped. Run `k0ntext check --update` later.'));
104
+ return;
105
+ }
106
+ let filesToRegenerate = result.outdated;
107
+ // Filter by user selection if needed
108
+ if (promptResult.choice === 'select' && promptResult.selectedTools) {
109
+ filesToRegenerate = result.outdated.filter(f => promptResult.selectedTools?.includes(f.tool));
110
+ }
111
+ // Skip modified files if user chose not to include them
112
+ if (!promptResult.includeModified) {
113
+ filesToRegenerate = filesToRegenerate.filter(f => !f.userModified);
114
+ }
115
+ console.log(chalk.bold('\nRegenerating files...'));
116
+ await regenerateFiles(filesToRegenerate, projectRoot);
117
+ console.log(chalk.green('\n✓ Files regenerated successfully!'));
118
+ }
119
+ }
120
+ else if (result.outdated.length > 0) {
121
+ console.log(chalk.dim(`\nRun ${chalk.white('k0ntext check --update')} to update outdated files.`));
122
+ }
123
+ }
124
+ catch (error) {
125
+ spinner.fail('Version check failed');
126
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
127
+ if (verbose && error instanceof Error) {
128
+ console.error(chalk.dim(error.stack));
129
+ }
130
+ process.exit(1);
131
+ }
132
+ });
133
+ //# sourceMappingURL=version-check.js.map