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.
- package/README.md +225 -26
- package/dist/agents/cleanup-agent.d.ts.map +1 -1
- package/dist/agents/cleanup-agent.js +18 -6
- package/dist/agents/cleanup-agent.js.map +1 -1
- package/dist/agents/drift-agent.d.ts +7 -0
- package/dist/agents/drift-agent.d.ts.map +1 -1
- package/dist/agents/drift-agent.js +29 -8
- package/dist/agents/drift-agent.js.map +1 -1
- package/dist/cli/commands/cleanup.d.ts.map +1 -1
- package/dist/cli/commands/cleanup.js +8 -1
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/drift-detect.d.ts.map +1 -1
- package/dist/cli/commands/drift-detect.js +21 -1
- package/dist/cli/commands/drift-detect.js.map +1 -1
- package/dist/cli/commands/embeddings-refresh.d.ts +11 -0
- package/dist/cli/commands/embeddings-refresh.d.ts.map +1 -0
- package/dist/cli/commands/embeddings-refresh.js +114 -0
- package/dist/cli/commands/embeddings-refresh.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +11 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +195 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +12 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +261 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/sync-templates.d.ts +15 -0
- package/dist/cli/commands/sync-templates.d.ts.map +1 -0
- package/dist/cli/commands/sync-templates.js +181 -0
- package/dist/cli/commands/sync-templates.js.map +1 -0
- package/dist/cli/commands/version-check.d.ts +12 -0
- package/dist/cli/commands/version-check.d.ts.map +1 -0
- package/dist/cli/commands/version-check.js +133 -0
- package/dist/cli/commands/version-check.js.map +1 -0
- package/dist/cli/generate.d.ts +5 -0
- package/dist/cli/generate.d.ts.map +1 -1
- package/dist/cli/generate.js +80 -16
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/index.js +215 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/repl/index.d.ts +1 -0
- package/dist/cli/repl/index.d.ts.map +1 -1
- package/dist/cli/repl/index.js +18 -6
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/utils/backup-manager.d.ts +94 -0
- package/dist/cli/utils/backup-manager.d.ts.map +1 -0
- package/dist/cli/utils/backup-manager.js +230 -0
- package/dist/cli/utils/backup-manager.js.map +1 -0
- package/dist/cli/utils/db-backup-manager.d.ts +55 -0
- package/dist/cli/utils/db-backup-manager.d.ts.map +1 -0
- package/dist/cli/utils/db-backup-manager.js +115 -0
- package/dist/cli/utils/db-backup-manager.js.map +1 -0
- package/dist/cli/utils/file-detector.d.ts +87 -0
- package/dist/cli/utils/file-detector.d.ts.map +1 -0
- package/dist/cli/utils/file-detector.js +131 -0
- package/dist/cli/utils/file-detector.js.map +1 -0
- package/dist/cli/utils/index.d.ts +9 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +9 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/modification-prompt.d.ts +41 -0
- package/dist/cli/utils/modification-prompt.d.ts.map +1 -0
- package/dist/cli/utils/modification-prompt.js +84 -0
- package/dist/cli/utils/modification-prompt.js.map +1 -0
- package/dist/cli/version/checker.d.ts +47 -0
- package/dist/cli/version/checker.d.ts.map +1 -0
- package/dist/cli/version/checker.js +143 -0
- package/dist/cli/version/checker.js.map +1 -0
- package/dist/cli/version/comparator.d.ts +46 -0
- package/dist/cli/version/comparator.d.ts.map +1 -0
- package/dist/cli/version/comparator.js +99 -0
- package/dist/cli/version/comparator.js.map +1 -0
- package/dist/cli/version/index.d.ts +11 -0
- package/dist/cli/version/index.d.ts.map +1 -0
- package/dist/cli/version/index.js +11 -0
- package/dist/cli/version/index.js.map +1 -0
- package/dist/cli/version/parser.d.ts +38 -0
- package/dist/cli/version/parser.d.ts.map +1 -0
- package/dist/cli/version/parser.js +90 -0
- package/dist/cli/version/parser.js.map +1 -0
- package/dist/cli/version/prompt.d.ts +40 -0
- package/dist/cli/version/prompt.d.ts.map +1 -0
- package/dist/cli/version/prompt.js +162 -0
- package/dist/cli/version/prompt.js.map +1 -0
- package/dist/cli/version/types.d.ts +89 -0
- package/dist/cli/version/types.d.ts.map +1 -0
- package/dist/cli/version/types.js +7 -0
- package/dist/cli/version/types.js.map +1 -0
- package/dist/db/client.d.ts +79 -4
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +207 -12
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrations/files/0014_add_schema_migrations_table.d.ts +14 -0
- package/dist/db/migrations/files/0014_add_schema_migrations_table.d.ts.map +1 -0
- package/dist/db/migrations/files/0014_add_schema_migrations_table.js +25 -0
- package/dist/db/migrations/files/0014_add_schema_migrations_table.js.map +1 -0
- package/dist/db/migrations/index.d.ts +9 -0
- package/dist/db/migrations/index.d.ts.map +1 -0
- package/dist/db/migrations/index.js +9 -0
- package/dist/db/migrations/index.js.map +1 -0
- package/dist/db/migrations/loader.d.ts +27 -0
- package/dist/db/migrations/loader.d.ts.map +1 -0
- package/dist/db/migrations/loader.js +106 -0
- package/dist/db/migrations/loader.js.map +1 -0
- package/dist/db/migrations/runner.d.ts +56 -0
- package/dist/db/migrations/runner.d.ts.map +1 -0
- package/dist/db/migrations/runner.js +266 -0
- package/dist/db/migrations/runner.js.map +1 -0
- package/dist/db/migrations/types.d.ts +71 -0
- package/dist/db/migrations/types.d.ts.map +1 -0
- package/dist/db/migrations/types.js +7 -0
- package/dist/db/migrations/types.js.map +1 -0
- package/dist/db/schema.d.ts +41 -2
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +77 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/mcp.js +2 -2
- package/dist/mcp.js.map +1 -1
- package/dist/template-engine/data-transformer.d.ts +17 -0
- package/dist/template-engine/data-transformer.d.ts.map +1 -0
- package/dist/template-engine/data-transformer.js +343 -0
- package/dist/template-engine/data-transformer.js.map +1 -0
- package/dist/template-engine/engine.d.ts +74 -0
- package/dist/template-engine/engine.d.ts.map +1 -0
- package/dist/template-engine/engine.js +183 -0
- package/dist/template-engine/engine.js.map +1 -0
- package/dist/template-engine/helpers.d.ts +81 -0
- package/dist/template-engine/helpers.d.ts.map +1 -0
- package/dist/template-engine/helpers.js +153 -0
- package/dist/template-engine/helpers.js.map +1 -0
- package/dist/template-engine/index.d.ts +10 -0
- package/dist/template-engine/index.d.ts.map +1 -0
- package/dist/template-engine/index.js +10 -0
- package/dist/template-engine/index.js.map +1 -0
- package/dist/template-engine/types.d.ts +147 -0
- package/dist/template-engine/types.d.ts.map +1 -0
- package/dist/template-engine/types.js +7 -0
- package/dist/template-engine/types.js.map +1 -0
- package/dist/template-sync/comparator.d.ts +138 -0
- package/dist/template-sync/comparator.d.ts.map +1 -0
- package/dist/template-sync/comparator.js +353 -0
- package/dist/template-sync/comparator.js.map +1 -0
- package/dist/template-sync/conflict-resolver.d.ts +112 -0
- package/dist/template-sync/conflict-resolver.d.ts.map +1 -0
- package/dist/template-sync/conflict-resolver.js +328 -0
- package/dist/template-sync/conflict-resolver.js.map +1 -0
- package/dist/template-sync/engine.d.ts +93 -0
- package/dist/template-sync/engine.d.ts.map +1 -0
- package/dist/template-sync/engine.js +350 -0
- package/dist/template-sync/engine.js.map +1 -0
- package/dist/template-sync/hasher.d.ts +67 -0
- package/dist/template-sync/hasher.d.ts.map +1 -0
- package/dist/template-sync/hasher.js +94 -0
- package/dist/template-sync/hasher.js.map +1 -0
- package/dist/template-sync/index.d.ts +20 -0
- package/dist/template-sync/index.d.ts.map +1 -0
- package/dist/template-sync/index.js +14 -0
- package/dist/template-sync/index.js.map +1 -0
- package/dist/template-sync/manifest.d.ts +131 -0
- package/dist/template-sync/manifest.d.ts.map +1 -0
- package/dist/template-sync/manifest.js +309 -0
- package/dist/template-sync/manifest.js.map +1 -0
- package/dist/template-sync/merger.d.ts +125 -0
- package/dist/template-sync/merger.d.ts.map +1 -0
- package/dist/template-sync/merger.js +371 -0
- package/dist/template-sync/merger.js.map +1 -0
- package/dist/template-sync/scanner.d.ts +106 -0
- package/dist/template-sync/scanner.d.ts.map +1 -0
- package/dist/template-sync/scanner.js +196 -0
- package/dist/template-sync/scanner.js.map +1 -0
- package/dist/template-sync/types.d.ts +199 -0
- package/dist/template-sync/types.d.ts.map +1 -0
- package/dist/template-sync/types.js +30 -0
- package/dist/template-sync/types.js.map +1 -0
- package/package.json +2 -1
- package/src/agents/cleanup-agent.ts +21 -6
- package/src/agents/drift-agent.ts +31 -8
- package/src/cli/commands/cleanup.ts +9 -1
- package/src/cli/commands/drift-detect.ts +24 -1
- package/src/cli/commands/embeddings-refresh.ts +135 -0
- package/src/cli/commands/migrate.ts +231 -0
- package/src/cli/commands/restore.ts +318 -0
- package/src/cli/commands/sync-templates.ts +210 -0
- package/src/cli/commands/version-check.ts +158 -0
- package/src/cli/generate.ts +99 -17
- package/src/cli/index.ts +246 -1
- package/src/cli/repl/index.ts +16 -6
- package/src/cli/utils/backup-manager.ts +275 -0
- package/src/cli/utils/db-backup-manager.ts +146 -0
- package/src/cli/utils/file-detector.ts +181 -0
- package/src/cli/utils/index.ts +9 -0
- package/src/cli/utils/modification-prompt.ts +112 -0
- package/src/cli/version/checker.ts +172 -0
- package/src/cli/version/comparator.ts +106 -0
- package/src/cli/version/index.ts +11 -0
- package/src/cli/version/parser.ts +101 -0
- package/src/cli/version/prompt.ts +208 -0
- package/src/cli/version/types.ts +95 -0
- package/src/db/client.ts +285 -18
- package/src/db/migrations/files/0014_add_schema_migrations_table.sql +19 -0
- package/src/db/migrations/files/0014_add_schema_migrations_table.ts +30 -0
- package/src/db/migrations/index.ts +9 -0
- package/src/db/migrations/loader.ts +129 -0
- package/src/db/migrations/runner.ts +316 -0
- package/src/db/migrations/types.ts +71 -0
- package/src/db/schema.ts +109 -2
- package/src/mcp.ts +2 -2
- package/src/template-engine/data-transformer.ts +367 -0
- package/src/template-engine/engine.ts +213 -0
- package/src/template-engine/helpers.ts +163 -0
- package/src/template-engine/index.ts +10 -0
- package/src/template-engine/types.ts +158 -0
- package/src/template-sync/comparator.ts +452 -0
- package/src/template-sync/conflict-resolver.ts +401 -0
- package/src/template-sync/engine.ts +417 -0
- package/src/template-sync/hasher.ts +104 -0
- package/src/template-sync/index.ts +60 -0
- package/src/template-sync/manifest.ts +358 -0
- package/src/template-sync/merger.ts +454 -0
- package/src/template-sync/scanner.ts +254 -0
- 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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,mCAAmC,CAAC;IAEjD,oBAAoB;KACnB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAExC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEjF,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;IAEF,gBAAgB;KACf,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,SAAS,EAAE,gCAAgC,CAAC;KACnD,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,QAAQ,CAAC,MAAM,iCAAiC,CAAC,CAAC,CAAC;YACnF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;gBACnC,OAAO,EAAE,iCAAiC;gBAC1C,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBACnD,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;QACH,CAAC;QAED,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC;QAC/E,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,OAAO,CAAC;YAChD,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACnD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK;YAChC,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;gBACxC,OAAO,CAAC,IAAI,GAAG,YAAY,OAAO,IAAI,KAAK,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;YAC1E,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,eAAe;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAE/C,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAC,CAAC;YACtE,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;IAEF,sBAAsB;KACrB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAEnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC7D,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,cAAsB,CAAC;QAE3B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,cAAc,GAAG,MAAM,MAAM,CAAC;gBAC5B,OAAO,EAAE,2BAA2B;gBACpC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC3D,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;YAC9B,OAAO,EAAE,oDAAoD;YAC7D,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAClD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAErC,uBAAuB;QACvB,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,sBAAsB;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAErD,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEtC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,cAAc,IAAI,CAAC,CAAC,CAAC;IAE1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;GAEG;AACH,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,WAAmB,EAAE,QAAgB;IACxF,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE1D,yBAAyB;QACzB,QAAQ,CAAC,mBAAmB,QAAQ,QAAQ,YAAY,GAAG,EAAE;YAC3D,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,UAAkB,EAAE,IAAY;IACxD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxG,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAEzE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;IACzH,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,EAAkB,EAClB,WAAmB,EACnB,IAAY;IAEZ,MAAM,cAAc,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAElD,OAAO,cAAc;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,IAAI;QACJ,UAAU,EAAE,CAAC,CAAC,UAAW;QACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;KAC9C,MAAM,CAAC,SAAS,EAAE,8BAA8B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,gBAAgB;QAChB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAEzD,YAAY;QACZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI;gBACxB,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;gBAChB,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEvG,MAAM,UAAU,GAAkE,EAAE,CAAC;YAErF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;gBAChE,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAC9B,CAAC;YAED,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;gBAC5E,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEvC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAC5G,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAE3E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACnE,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;oBAC9B,OAAO,EAAE,WAAW,UAAU,CAAC,QAAQ,eAAe;oBACtD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;oBACjD,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;YACH,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAE1C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAEtF,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBAE5D,uEAAuE;gBACvE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;gBAC7B,EAAE,CAAC,mBAAmB,CAAC;oBACrB,IAAI;oBACJ,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC5E,UAAU,EAAE,SAAS,CAAC,6BAA6B;iBACpD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAEpC,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjH,MAAM,UAAU,GAAiF,EAAE,CAAC;QAEpG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAChE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,MAAM;oBACT,KAAK,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG;iBAC5F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC5E,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;YAC5B,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE;gBACP,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACtB,IAAI,EAAE,CAAC,CAAC,KAAK;oBACb,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;aAChC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACjD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;YAC9B,OAAO,EAAE,WAAW,QAAQ,CAAC,QAAQ,eAAe;YACpD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACjD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE7F,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAE5D,+BAA+B;YAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9D,EAAE,CAAC,mBAAmB,CAAC;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC;gBACpC,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,EAAE,CAAC,KAAK,EAAE,CAAC;IAEb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,EAAkB,EAClB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC,CAAC,UAAU,CAAC;QACd,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEvG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACnC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,UAAkB,EAAE,WAAmB;IAC1F,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,MAAM,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC/E,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -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
|