k0ntext 3.3.1 → 3.6.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 (221) hide show
  1. package/README.md +225 -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/embeddings-refresh.d.ts +11 -0
  16. package/dist/cli/commands/embeddings-refresh.d.ts.map +1 -0
  17. package/dist/cli/commands/embeddings-refresh.js +114 -0
  18. package/dist/cli/commands/embeddings-refresh.js.map +1 -0
  19. package/dist/cli/commands/migrate.d.ts +11 -0
  20. package/dist/cli/commands/migrate.d.ts.map +1 -0
  21. package/dist/cli/commands/migrate.js +195 -0
  22. package/dist/cli/commands/migrate.js.map +1 -0
  23. package/dist/cli/commands/restore.d.ts +12 -0
  24. package/dist/cli/commands/restore.d.ts.map +1 -0
  25. package/dist/cli/commands/restore.js +261 -0
  26. package/dist/cli/commands/restore.js.map +1 -0
  27. package/dist/cli/commands/sync-templates.d.ts +15 -0
  28. package/dist/cli/commands/sync-templates.d.ts.map +1 -0
  29. package/dist/cli/commands/sync-templates.js +181 -0
  30. package/dist/cli/commands/sync-templates.js.map +1 -0
  31. package/dist/cli/commands/version-check.d.ts +12 -0
  32. package/dist/cli/commands/version-check.d.ts.map +1 -0
  33. package/dist/cli/commands/version-check.js +133 -0
  34. package/dist/cli/commands/version-check.js.map +1 -0
  35. package/dist/cli/generate.d.ts +5 -0
  36. package/dist/cli/generate.d.ts.map +1 -1
  37. package/dist/cli/generate.js +80 -16
  38. package/dist/cli/generate.js.map +1 -1
  39. package/dist/cli/index.js +215 -1
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/cli/repl/index.d.ts +1 -0
  42. package/dist/cli/repl/index.d.ts.map +1 -1
  43. package/dist/cli/repl/index.js +18 -6
  44. package/dist/cli/repl/index.js.map +1 -1
  45. package/dist/cli/utils/backup-manager.d.ts +94 -0
  46. package/dist/cli/utils/backup-manager.d.ts.map +1 -0
  47. package/dist/cli/utils/backup-manager.js +230 -0
  48. package/dist/cli/utils/backup-manager.js.map +1 -0
  49. package/dist/cli/utils/db-backup-manager.d.ts +55 -0
  50. package/dist/cli/utils/db-backup-manager.d.ts.map +1 -0
  51. package/dist/cli/utils/db-backup-manager.js +115 -0
  52. package/dist/cli/utils/db-backup-manager.js.map +1 -0
  53. package/dist/cli/utils/file-detector.d.ts +87 -0
  54. package/dist/cli/utils/file-detector.d.ts.map +1 -0
  55. package/dist/cli/utils/file-detector.js +131 -0
  56. package/dist/cli/utils/file-detector.js.map +1 -0
  57. package/dist/cli/utils/index.d.ts +9 -0
  58. package/dist/cli/utils/index.d.ts.map +1 -0
  59. package/dist/cli/utils/index.js +9 -0
  60. package/dist/cli/utils/index.js.map +1 -0
  61. package/dist/cli/utils/modification-prompt.d.ts +41 -0
  62. package/dist/cli/utils/modification-prompt.d.ts.map +1 -0
  63. package/dist/cli/utils/modification-prompt.js +84 -0
  64. package/dist/cli/utils/modification-prompt.js.map +1 -0
  65. package/dist/cli/version/checker.d.ts +47 -0
  66. package/dist/cli/version/checker.d.ts.map +1 -0
  67. package/dist/cli/version/checker.js +143 -0
  68. package/dist/cli/version/checker.js.map +1 -0
  69. package/dist/cli/version/comparator.d.ts +46 -0
  70. package/dist/cli/version/comparator.d.ts.map +1 -0
  71. package/dist/cli/version/comparator.js +99 -0
  72. package/dist/cli/version/comparator.js.map +1 -0
  73. package/dist/cli/version/index.d.ts +11 -0
  74. package/dist/cli/version/index.d.ts.map +1 -0
  75. package/dist/cli/version/index.js +11 -0
  76. package/dist/cli/version/index.js.map +1 -0
  77. package/dist/cli/version/parser.d.ts +38 -0
  78. package/dist/cli/version/parser.d.ts.map +1 -0
  79. package/dist/cli/version/parser.js +90 -0
  80. package/dist/cli/version/parser.js.map +1 -0
  81. package/dist/cli/version/prompt.d.ts +40 -0
  82. package/dist/cli/version/prompt.d.ts.map +1 -0
  83. package/dist/cli/version/prompt.js +162 -0
  84. package/dist/cli/version/prompt.js.map +1 -0
  85. package/dist/cli/version/types.d.ts +89 -0
  86. package/dist/cli/version/types.d.ts.map +1 -0
  87. package/dist/cli/version/types.js +7 -0
  88. package/dist/cli/version/types.js.map +1 -0
  89. package/dist/db/client.d.ts +79 -4
  90. package/dist/db/client.d.ts.map +1 -1
  91. package/dist/db/client.js +207 -12
  92. package/dist/db/client.js.map +1 -1
  93. package/dist/db/migrations/files/0014_add_schema_migrations_table.d.ts +14 -0
  94. package/dist/db/migrations/files/0014_add_schema_migrations_table.d.ts.map +1 -0
  95. package/dist/db/migrations/files/0014_add_schema_migrations_table.js +25 -0
  96. package/dist/db/migrations/files/0014_add_schema_migrations_table.js.map +1 -0
  97. package/dist/db/migrations/index.d.ts +9 -0
  98. package/dist/db/migrations/index.d.ts.map +1 -0
  99. package/dist/db/migrations/index.js +9 -0
  100. package/dist/db/migrations/index.js.map +1 -0
  101. package/dist/db/migrations/loader.d.ts +27 -0
  102. package/dist/db/migrations/loader.d.ts.map +1 -0
  103. package/dist/db/migrations/loader.js +106 -0
  104. package/dist/db/migrations/loader.js.map +1 -0
  105. package/dist/db/migrations/runner.d.ts +56 -0
  106. package/dist/db/migrations/runner.d.ts.map +1 -0
  107. package/dist/db/migrations/runner.js +266 -0
  108. package/dist/db/migrations/runner.js.map +1 -0
  109. package/dist/db/migrations/types.d.ts +71 -0
  110. package/dist/db/migrations/types.d.ts.map +1 -0
  111. package/dist/db/migrations/types.js +7 -0
  112. package/dist/db/migrations/types.js.map +1 -0
  113. package/dist/db/schema.d.ts +41 -2
  114. package/dist/db/schema.d.ts.map +1 -1
  115. package/dist/db/schema.js +77 -2
  116. package/dist/db/schema.js.map +1 -1
  117. package/dist/mcp.js +2 -2
  118. package/dist/mcp.js.map +1 -1
  119. package/dist/template-engine/data-transformer.d.ts +17 -0
  120. package/dist/template-engine/data-transformer.d.ts.map +1 -0
  121. package/dist/template-engine/data-transformer.js +343 -0
  122. package/dist/template-engine/data-transformer.js.map +1 -0
  123. package/dist/template-engine/engine.d.ts +74 -0
  124. package/dist/template-engine/engine.d.ts.map +1 -0
  125. package/dist/template-engine/engine.js +183 -0
  126. package/dist/template-engine/engine.js.map +1 -0
  127. package/dist/template-engine/helpers.d.ts +81 -0
  128. package/dist/template-engine/helpers.d.ts.map +1 -0
  129. package/dist/template-engine/helpers.js +153 -0
  130. package/dist/template-engine/helpers.js.map +1 -0
  131. package/dist/template-engine/index.d.ts +10 -0
  132. package/dist/template-engine/index.d.ts.map +1 -0
  133. package/dist/template-engine/index.js +10 -0
  134. package/dist/template-engine/index.js.map +1 -0
  135. package/dist/template-engine/types.d.ts +147 -0
  136. package/dist/template-engine/types.d.ts.map +1 -0
  137. package/dist/template-engine/types.js +7 -0
  138. package/dist/template-engine/types.js.map +1 -0
  139. package/dist/template-sync/comparator.d.ts +138 -0
  140. package/dist/template-sync/comparator.d.ts.map +1 -0
  141. package/dist/template-sync/comparator.js +353 -0
  142. package/dist/template-sync/comparator.js.map +1 -0
  143. package/dist/template-sync/conflict-resolver.d.ts +112 -0
  144. package/dist/template-sync/conflict-resolver.d.ts.map +1 -0
  145. package/dist/template-sync/conflict-resolver.js +328 -0
  146. package/dist/template-sync/conflict-resolver.js.map +1 -0
  147. package/dist/template-sync/engine.d.ts +93 -0
  148. package/dist/template-sync/engine.d.ts.map +1 -0
  149. package/dist/template-sync/engine.js +350 -0
  150. package/dist/template-sync/engine.js.map +1 -0
  151. package/dist/template-sync/hasher.d.ts +67 -0
  152. package/dist/template-sync/hasher.d.ts.map +1 -0
  153. package/dist/template-sync/hasher.js +94 -0
  154. package/dist/template-sync/hasher.js.map +1 -0
  155. package/dist/template-sync/index.d.ts +20 -0
  156. package/dist/template-sync/index.d.ts.map +1 -0
  157. package/dist/template-sync/index.js +14 -0
  158. package/dist/template-sync/index.js.map +1 -0
  159. package/dist/template-sync/manifest.d.ts +131 -0
  160. package/dist/template-sync/manifest.d.ts.map +1 -0
  161. package/dist/template-sync/manifest.js +309 -0
  162. package/dist/template-sync/manifest.js.map +1 -0
  163. package/dist/template-sync/merger.d.ts +125 -0
  164. package/dist/template-sync/merger.d.ts.map +1 -0
  165. package/dist/template-sync/merger.js +371 -0
  166. package/dist/template-sync/merger.js.map +1 -0
  167. package/dist/template-sync/scanner.d.ts +106 -0
  168. package/dist/template-sync/scanner.d.ts.map +1 -0
  169. package/dist/template-sync/scanner.js +196 -0
  170. package/dist/template-sync/scanner.js.map +1 -0
  171. package/dist/template-sync/types.d.ts +199 -0
  172. package/dist/template-sync/types.d.ts.map +1 -0
  173. package/dist/template-sync/types.js +30 -0
  174. package/dist/template-sync/types.js.map +1 -0
  175. package/package.json +2 -1
  176. package/src/agents/cleanup-agent.ts +21 -6
  177. package/src/agents/drift-agent.ts +31 -8
  178. package/src/cli/commands/cleanup.ts +9 -1
  179. package/src/cli/commands/drift-detect.ts +24 -1
  180. package/src/cli/commands/embeddings-refresh.ts +135 -0
  181. package/src/cli/commands/migrate.ts +231 -0
  182. package/src/cli/commands/restore.ts +318 -0
  183. package/src/cli/commands/sync-templates.ts +210 -0
  184. package/src/cli/commands/version-check.ts +158 -0
  185. package/src/cli/generate.ts +99 -17
  186. package/src/cli/index.ts +246 -1
  187. package/src/cli/repl/index.ts +16 -6
  188. package/src/cli/utils/backup-manager.ts +275 -0
  189. package/src/cli/utils/db-backup-manager.ts +146 -0
  190. package/src/cli/utils/file-detector.ts +181 -0
  191. package/src/cli/utils/index.ts +9 -0
  192. package/src/cli/utils/modification-prompt.ts +112 -0
  193. package/src/cli/version/checker.ts +172 -0
  194. package/src/cli/version/comparator.ts +106 -0
  195. package/src/cli/version/index.ts +11 -0
  196. package/src/cli/version/parser.ts +101 -0
  197. package/src/cli/version/prompt.ts +208 -0
  198. package/src/cli/version/types.ts +95 -0
  199. package/src/db/client.ts +285 -18
  200. package/src/db/migrations/files/0014_add_schema_migrations_table.sql +19 -0
  201. package/src/db/migrations/files/0014_add_schema_migrations_table.ts +30 -0
  202. package/src/db/migrations/index.ts +9 -0
  203. package/src/db/migrations/loader.ts +129 -0
  204. package/src/db/migrations/runner.ts +316 -0
  205. package/src/db/migrations/types.ts +71 -0
  206. package/src/db/schema.ts +109 -2
  207. package/src/mcp.ts +2 -2
  208. package/src/template-engine/data-transformer.ts +367 -0
  209. package/src/template-engine/engine.ts +213 -0
  210. package/src/template-engine/helpers.ts +163 -0
  211. package/src/template-engine/index.ts +10 -0
  212. package/src/template-engine/types.ts +158 -0
  213. package/src/template-sync/comparator.ts +452 -0
  214. package/src/template-sync/conflict-resolver.ts +401 -0
  215. package/src/template-sync/engine.ts +417 -0
  216. package/src/template-sync/hasher.ts +104 -0
  217. package/src/template-sync/index.ts +60 -0
  218. package/src/template-sync/manifest.ts +358 -0
  219. package/src/template-sync/merger.ts +454 -0
  220. package/src/template-sync/scanner.ts +254 -0
  221. package/src/template-sync/types.ts +247 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Embeddings Refresh Command
3
+ *
4
+ * Regenerate embeddings with optional dimension validation.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { confirm } from '@inquirer/prompts';
10
+ import { createIntelligentAnalyzer } from '../../analyzer/intelligent-analyzer.js';
11
+ import { hasOpenRouterKey } from '../../embeddings/openrouter.js';
12
+ import { DatabaseClient } from '../../db/client.js';
13
+ /**
14
+ * Embeddings refresh command
15
+ */
16
+ export const embeddingsRefreshCommand = new Command('embeddings:refresh')
17
+ .description('Regenerate embeddings for all indexed content')
18
+ .option('--force', 'Force refresh even if dimensions change')
19
+ .option('--batch-size <n>', 'Process in batches', '50')
20
+ .option('-v, --verbose', 'Show detailed output')
21
+ .action(async (options) => {
22
+ const spinner = ora();
23
+ try {
24
+ // Check for OpenRouter API key
25
+ if (!hasOpenRouterKey()) {
26
+ spinner.fail('OPENROUTER_API_KEY not found');
27
+ console.log(chalk.yellow(' Set OPENROUTER_API_KEY for embeddings generation'));
28
+ console.log(chalk.dim(' Get your key at: https://openrouter.ai/keys\n'));
29
+ process.exit(1);
30
+ }
31
+ const db = await DatabaseClient.create(process.cwd());
32
+ const analyzer = createIntelligentAnalyzer(process.cwd());
33
+ spinner.start('Checking embeddings status...');
34
+ const rawDb = db.getRawDb();
35
+ // Check if embeddings table exists and has data
36
+ const tableExists = rawDb.prepare(`
37
+ SELECT name FROM sqlite_master WHERE type='table' AND name='embeddings'
38
+ `).get();
39
+ let currentDimension = 0;
40
+ if (tableExists) {
41
+ const embedding = rawDb.prepare('SELECT embedding FROM embeddings LIMIT 1').get();
42
+ if (embedding) {
43
+ currentDimension = embedding.embedding.length / 4; // Float32Array
44
+ }
45
+ }
46
+ const expectedDimension = 1536; // OpenRouter text-embedding-3-small
47
+ if (currentDimension > 0 && currentDimension !== expectedDimension && !options.force) {
48
+ spinner.fail('Embedding dimension mismatch');
49
+ console.log(chalk.red(` Current: ${currentDimension}, Expected: ${expectedDimension}`));
50
+ console.log(chalk.dim('\nUse --force to override (requires full re-index)\n'));
51
+ db.close();
52
+ process.exit(1);
53
+ }
54
+ // Get all items
55
+ spinner.text = 'Fetching items...';
56
+ const items = db.getAllItems();
57
+ if (items.length === 0) {
58
+ spinner.succeed('No items to index');
59
+ db.close();
60
+ return;
61
+ }
62
+ spinner.stop();
63
+ console.log('');
64
+ console.log(chalk.bold('Embeddings Refresh:'));
65
+ console.log(` Items to process: ${chalk.cyan(items.length.toString())}`);
66
+ console.log(` Batch size: ${chalk.cyan(options.batchSize)}`);
67
+ console.log('');
68
+ const confirmed = await confirm({
69
+ message: 'Refresh all embeddings?',
70
+ default: true
71
+ });
72
+ if (!confirmed) {
73
+ console.log(chalk.dim('\nRefresh cancelled.\n'));
74
+ db.close();
75
+ return;
76
+ }
77
+ spinner.start('Refreshing embeddings...');
78
+ // Process in batches
79
+ const batchSize = parseInt(options.batchSize, 10);
80
+ let processed = 0;
81
+ for (let i = 0; i < items.length; i += batchSize) {
82
+ const batch = items.slice(i, i + batchSize);
83
+ const batchNum = Math.floor(i / batchSize) + 1;
84
+ const totalBatches = Math.ceil(items.length / batchSize);
85
+ for (const item of batch) {
86
+ if (options.verbose) {
87
+ spinner.stop();
88
+ console.log(chalk.dim(` Embedding: ${item.name}`));
89
+ spinner.start();
90
+ }
91
+ // Generate and store embedding
92
+ try {
93
+ const embedding = await analyzer.embedText(item.content);
94
+ db.storeEmbedding(item.id, embedding);
95
+ processed++;
96
+ }
97
+ catch (error) {
98
+ if (options.verbose) {
99
+ console.log(chalk.yellow(` Warning: Failed to embed ${item.name}`));
100
+ }
101
+ }
102
+ }
103
+ spinner.text = `Processing batch ${batchNum}/${totalBatches} (${processed}/${items.length})...`;
104
+ }
105
+ spinner.succeed(chalk.green(`Refreshed ${processed} embeddings`));
106
+ db.close();
107
+ }
108
+ catch (error) {
109
+ spinner.fail('Embedding refresh failed');
110
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
111
+ process.exit(1);
112
+ }
113
+ });
114
+ //# sourceMappingURL=embeddings-refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-refresh.js","sourceRoot":"","sources":["../../../src/cli/commands/embeddings-refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Migrate Command
3
+ *
4
+ * Database schema migration command with interactive prompts.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Main migrate command
9
+ */
10
+ export declare const migrateCommand: Command;
11
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;GAEG;AACH,eAAO,MAAM,cAAc,SAoNvB,CAAC"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Migrate Command
3
+ *
4
+ * Database schema migration command with interactive prompts.
5
+ */
6
+ import { Command } from 'commander';
7
+ import path from 'path';
8
+ import fs from 'fs/promises';
9
+ import chalk from 'chalk';
10
+ import ora from 'ora';
11
+ import { confirm, select } from '@inquirer/prompts';
12
+ import { DatabaseClient } from '../../db/client.js';
13
+ import { MigrationRunner } from '../../db/migrations/index.js';
14
+ /**
15
+ * Main migrate command
16
+ */
17
+ export const migrateCommand = new Command('migrate')
18
+ .description('Manage database schema migrations')
19
+ // Status subcommand
20
+ .command('status')
21
+ .description('Show migration status')
22
+ .action(async () => {
23
+ const spinner = ora();
24
+ try {
25
+ const db = await DatabaseClient.create(process.cwd());
26
+ const runner = new MigrationRunner(db, process.cwd());
27
+ const status = await runner.getStatus();
28
+ spinner.stop();
29
+ console.log(chalk.bold('\nMigration Status:\n'));
30
+ console.log(` Current: ${chalk.cyan(status.currentVersion || 'none')}`);
31
+ console.log(` Target: ${chalk.cyan(status.targetVersion)}`);
32
+ console.log(` Pending: ${chalk.yellow(status.pending.length)} migration(s)\n`);
33
+ if (status.pending.length > 0) {
34
+ console.log(chalk.bold('Pending Migrations:'));
35
+ for (const migration of status.pending) {
36
+ const breaks = migration.breaks ? chalk.red(' [breaking]') : '';
37
+ console.log(` ${chalk.cyan(migration.version)}: ${migration.description}${breaks}`);
38
+ }
39
+ console.log('');
40
+ }
41
+ if (status.applied.length > 0) {
42
+ console.log(chalk.bold('Applied Migrations:'));
43
+ for (const applied of status.applied.slice(0, 5)) {
44
+ console.log(chalk.dim(` ${applied.version} (${applied.appliedAt})`));
45
+ }
46
+ if (status.applied.length > 5) {
47
+ console.log(chalk.dim(` ... and ${status.applied.length - 5} more`));
48
+ }
49
+ console.log('');
50
+ }
51
+ db.close();
52
+ }
53
+ catch (error) {
54
+ spinner.fail('Status check failed');
55
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
56
+ process.exit(1);
57
+ }
58
+ })
59
+ // Up subcommand
60
+ .command('up')
61
+ .description('Apply pending migrations')
62
+ .option('--dry-run', 'Show what would be done')
63
+ .option('--force', 'Apply even if validation fails')
64
+ .option('--no-backup', 'Skip creating backup')
65
+ .action(async (options) => {
66
+ const spinner = ora();
67
+ try {
68
+ const db = await DatabaseClient.create(process.cwd());
69
+ const runner = new MigrationRunner(db, process.cwd());
70
+ const status = await runner.getStatus();
71
+ if (!status.needsMigration) {
72
+ spinner.succeed('Database is up to date');
73
+ db.close();
74
+ return;
75
+ }
76
+ // Check for breaking changes
77
+ const breaking = status.pending.filter(m => m.breaks);
78
+ if (breaking.length > 0 && !options.force) {
79
+ console.log(chalk.yellow(`\n⚠ ${breaking.length} breaking change(s) detected:\n`));
80
+ for (const m of breaking) {
81
+ console.log(chalk.red(` ${m.version}: ${m.description}`));
82
+ }
83
+ console.log();
84
+ const shouldContinue = await confirm({
85
+ message: 'Continue with breaking changes?',
86
+ default: false
87
+ });
88
+ if (!shouldContinue) {
89
+ console.log(chalk.dim('\nMigration cancelled.\n'));
90
+ db.close();
91
+ return;
92
+ }
93
+ }
94
+ // Summary
95
+ console.log(chalk.bold(`\nApplying ${status.pending.length} migration(s):\n`));
96
+ for (const migration of status.pending) {
97
+ console.log(chalk.dim(` ${migration.version}: ${migration.description}`));
98
+ }
99
+ console.log();
100
+ const confirmed = options.dryRun || await confirm({
101
+ message: 'Proceed?',
102
+ default: true
103
+ });
104
+ if (!confirmed) {
105
+ console.log(chalk.dim('\nMigration cancelled.\n'));
106
+ db.close();
107
+ return;
108
+ }
109
+ spinner.start('Applying migrations...');
110
+ const results = await runner.migrate({
111
+ dryRun: options.dryRun,
112
+ force: options.force,
113
+ backup: options.backup !== false,
114
+ onProgress: (current, total, migration) => {
115
+ spinner.text = `Applying ${current}/${total}: ${migration.description}`;
116
+ }
117
+ });
118
+ spinner.stop();
119
+ // Show results
120
+ const successful = results.filter(r => r.success);
121
+ const failed = results.filter(r => !r.success);
122
+ if (successful.length > 0) {
123
+ console.log(chalk.green(`\n✓ Applied ${successful.length} migration(s)`));
124
+ }
125
+ if (failed.length > 0) {
126
+ console.log(chalk.red(`\n✖ ${failed.length} migration(s) failed:\n`));
127
+ for (const result of failed) {
128
+ console.log(chalk.red(` ${result.version}: ${result.error}`));
129
+ }
130
+ console.log(chalk.dim(`\nRollback using: k0ntext migrate rollback`));
131
+ }
132
+ db.close();
133
+ }
134
+ catch (error) {
135
+ spinner.fail('Migration failed');
136
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
137
+ process.exit(1);
138
+ }
139
+ })
140
+ // Rollback subcommand
141
+ .command('rollback')
142
+ .description('Rollback to a previous backup')
143
+ .option('--backup <path>', 'Specific backup to restore')
144
+ .action(async (options) => {
145
+ const spinner = ora();
146
+ const projectRoot = process.cwd();
147
+ try {
148
+ const db = await DatabaseClient.create(projectRoot);
149
+ const runner = new MigrationRunner(db, projectRoot);
150
+ const backups = await runner.getMigrationBackups();
151
+ if (backups.length === 0) {
152
+ console.log(chalk.yellow('\nNo migration backups found.\n'));
153
+ db.close();
154
+ return;
155
+ }
156
+ let selectedBackup;
157
+ if (options.backup) {
158
+ selectedBackup = options.backup;
159
+ }
160
+ else {
161
+ spinner.stop();
162
+ selectedBackup = await select({
163
+ message: 'Select backup to restore:',
164
+ choices: backups.map(b => ({
165
+ name: b.replace('.k0ntext.db.pre-', '').replace('.bak', ''),
166
+ value: b
167
+ }))
168
+ });
169
+ }
170
+ const confirmed = await confirm({
171
+ message: 'This will replace your current database. Continue?',
172
+ default: false
173
+ });
174
+ if (!confirmed) {
175
+ console.log(chalk.dim('\nRollback cancelled.\n'));
176
+ db.close();
177
+ return;
178
+ }
179
+ spinner.start('Restoring backup...');
180
+ // Close database first
181
+ db.close();
182
+ // Restore from backup
183
+ const backupPath = path.join(projectRoot, '.k0ntext', 'backups', selectedBackup);
184
+ const dbPath = path.join(projectRoot, '.k0ntext.db');
185
+ await fs.copyFile(backupPath, dbPath);
186
+ spinner.succeed(chalk.green('Database restored from backup'));
187
+ console.log(chalk.dim(`\nBackup: ${selectedBackup}\n`));
188
+ }
189
+ catch (error) {
190
+ spinner.fail('Rollback failed');
191
+ console.error(chalk.red(`\nError: ${error instanceof Error ? error.message : error}`));
192
+ process.exit(1);
193
+ }
194
+ });
195
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -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