@kabirlikestocode/engram 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/commands/index-cmd.d.ts +4 -0
  2. package/dist/commands/index-cmd.d.ts.map +1 -0
  3. package/dist/commands/index-cmd.js +123 -0
  4. package/dist/commands/index-cmd.js.map +1 -0
  5. package/dist/commands/init.d.ts +2 -0
  6. package/dist/commands/init.d.ts.map +1 -0
  7. package/dist/commands/init.js +154 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/commands/login.d.ts +2 -0
  10. package/dist/commands/login.d.ts.map +1 -0
  11. package/dist/commands/login.js +88 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/serve.d.ts +4 -0
  14. package/dist/commands/serve.d.ts.map +1 -0
  15. package/dist/commands/serve.js +45 -0
  16. package/dist/commands/serve.js.map +1 -0
  17. package/dist/commands/status.d.ts +4 -0
  18. package/dist/commands/status.d.ts.map +1 -0
  19. package/dist/commands/status.js +85 -0
  20. package/dist/commands/status.js.map +1 -0
  21. package/dist/commands/sync.d.ts +10 -0
  22. package/dist/commands/sync.d.ts.map +1 -0
  23. package/dist/commands/sync.js +106 -0
  24. package/dist/commands/sync.js.map +1 -0
  25. package/dist/commands/team.d.ts +9 -0
  26. package/dist/commands/team.d.ts.map +1 -0
  27. package/dist/commands/team.js +85 -0
  28. package/dist/commands/team.js.map +1 -0
  29. package/dist/config.d.ts +29 -0
  30. package/dist/config.d.ts.map +1 -0
  31. package/dist/config.js +81 -0
  32. package/dist/config.js.map +1 -0
  33. package/dist/daemon.d.ts +8 -0
  34. package/dist/daemon.d.ts.map +1 -0
  35. package/dist/daemon.js +124 -0
  36. package/dist/daemon.js.map +1 -0
  37. package/dist/index.d.ts +21 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +123 -0
  40. package/dist/index.js.map +1 -0
  41. package/package.json +39 -0
@@ -0,0 +1,4 @@
1
+ export declare function indexCommand(options: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=index-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AA0GA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEhB"}
@@ -0,0 +1,123 @@
1
+ import { resolve, join } from 'node:path';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
+ import { relative } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { isProjectInitialized, getProjectDbPath, } from '../config.js';
7
+ import { CodeGraph, getParserForFile, isSupportedFile } from '@kabirlikestocode/engram-core';
8
+ /** Concurrency limit for file I/O + parsing */
9
+ const IO_CONCURRENCY = 64;
10
+ /** Number of parsed results to batch into a single DB transaction */
11
+ const DB_BATCH_SIZE = 200;
12
+ async function collectFiles(dir) {
13
+ const IGNORED = new Set([
14
+ 'node_modules', '.git', 'dist', 'build', '.next', '__pycache__',
15
+ '.turbo', '.vercel', '.engram', 'coverage', '.nyc_output',
16
+ 'vendor', '.venv', 'venv', 'env', '.tox', '.mypy_cache', '.pytest_cache',
17
+ ]);
18
+ const files = [];
19
+ const entries = await readdir(dir, { withFileTypes: true });
20
+ for (const entry of entries) {
21
+ const fullPath = join(dir, entry.name);
22
+ if (entry.isDirectory()) {
23
+ if (IGNORED.has(entry.name))
24
+ continue;
25
+ files.push(...await collectFiles(fullPath));
26
+ }
27
+ else if (isSupportedFile(entry.name)) {
28
+ files.push(fullPath);
29
+ }
30
+ }
31
+ return files;
32
+ }
33
+ /**
34
+ * Read + parse a single file, returning the ParseResult or null on failure.
35
+ */
36
+ async function parseOne(filePath, projectRoot) {
37
+ try {
38
+ const parser = getParserForFile(filePath);
39
+ if (!parser)
40
+ return null;
41
+ const content = await readFile(filePath, 'utf-8');
42
+ const relPath = relative(projectRoot, filePath);
43
+ return await parser.parseFile(relPath, content);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /**
50
+ * Process files in concurrent batches: read + parse in parallel,
51
+ * then flush to DB as a single batch transaction.
52
+ */
53
+ async function indexBatch(files, projectRoot, graph, onProgress) {
54
+ let indexed = 0;
55
+ let errors = 0;
56
+ // Process IO_CONCURRENCY files at a time, accumulating parse results
57
+ // and flushing to DB every DB_BATCH_SIZE results.
58
+ const pendingResults = [];
59
+ for (let i = 0; i < files.length; i += IO_CONCURRENCY) {
60
+ const chunk = files.slice(i, i + IO_CONCURRENCY);
61
+ // Concurrent file reads + AST parsing
62
+ const settled = await Promise.allSettled(chunk.map((f) => parseOne(f, projectRoot)));
63
+ for (const outcome of settled) {
64
+ if (outcome.status === 'fulfilled' && outcome.value) {
65
+ pendingResults.push(outcome.value);
66
+ indexed++;
67
+ }
68
+ else {
69
+ errors++;
70
+ }
71
+ }
72
+ // Flush accumulated results to DB when batch is full
73
+ if (pendingResults.length >= DB_BATCH_SIZE) {
74
+ graph.upsertBatchResults(pendingResults.splice(0));
75
+ }
76
+ onProgress(indexed, errors);
77
+ }
78
+ // Flush remaining
79
+ if (pendingResults.length > 0) {
80
+ graph.upsertBatchResults(pendingResults);
81
+ }
82
+ return { indexed, errors };
83
+ }
84
+ export async function indexCommand(options) {
85
+ const projectRoot = resolve(options.project ?? process.cwd());
86
+ console.log(chalk.bold.green('\n ⬡ Engram') + chalk.dim(' — Force reindex\n'));
87
+ if (!isProjectInitialized(projectRoot)) {
88
+ console.log(chalk.yellow(' ⚠ Not initialized.') +
89
+ chalk.dim(' Run `engram init` first.\n'));
90
+ return;
91
+ }
92
+ const dbPath = getProjectDbPath(projectRoot);
93
+ const spinner = ora({
94
+ text: chalk.dim(' Scanning files...'),
95
+ color: 'green',
96
+ }).start();
97
+ const graph = new CodeGraph(dbPath);
98
+ try {
99
+ const files = await collectFiles(projectRoot);
100
+ spinner.text = chalk.dim(` Reindexing ${files.length} files...`);
101
+ const { indexed, errors } = await indexBatch(files, projectRoot, graph, (done) => {
102
+ spinner.text = chalk.dim(` Reindexing... ${done}/${files.length}`);
103
+ });
104
+ const stats = graph.getStats();
105
+ spinner.succeed(chalk.green(' Reindex complete'));
106
+ console.log(chalk.green(' ✓ ') +
107
+ chalk.bold.white(String(stats.totalSymbols)) +
108
+ chalk.green(' symbols across ') +
109
+ chalk.bold.white(String(stats.totalFiles)) +
110
+ chalk.green(' files'));
111
+ if (errors > 0) {
112
+ console.log(chalk.yellow(` ⚠ ${errors} files skipped due to errors`));
113
+ }
114
+ const langs = Object.entries(stats.languages)
115
+ .map(([lang, count]) => `${lang} (${count})`)
116
+ .join(', ');
117
+ console.log(chalk.dim(` Languages: ${langs}\n`));
118
+ }
119
+ finally {
120
+ graph.close();
121
+ }
122
+ }
123
+ //# sourceMappingURL=index-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAG7F,+CAA+C;AAC/C,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,qEAAqE;AACrE,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;QACtB,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa;QAC/D,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa;QACzD,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe;KACzE,CAAC,CAAC;IACH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,QAAgB,EAChB,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAChD,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,UAAU,CACvB,KAAe,EACf,WAAmB,EACnB,KAAgB,EAChB,UAAqD;IAErD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,qEAAqE;IACrE,kDAAkD;IAClD,MAAM,cAAc,GAAkB,EAAE,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC;QAEjD,sCAAsC;QACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAC3C,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACpD,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,cAAc,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;YAC3C,KAAK,CAAC,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,kBAAkB;IAClB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAElC;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CACnE,CAAC;IAEF,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAC3C,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC;QACtC,KAAK,EAAE,OAAO;KACf,CAAC,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAE9C,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;QAElE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC1C,KAAK,EACL,WAAW,EACX,KAAK,EACL,CAAC,IAAI,EAAE,EAAE;YACP,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE/B,OAAO,CAAC,OAAO,CACb,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAClC,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5C,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC1C,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CACxB,CAAC;QAEF,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,OAAO,MAAM,8BAA8B,CAAC,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;aAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(projectPath?: string): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAsCA,wBAAsB,WAAW,CAC/B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAkKf"}
@@ -0,0 +1,154 @@
1
+ import { resolve, join } from 'node:path';
2
+ import { mkdir, readdir, readFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { relative } from 'node:path';
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import { isProjectInitialized, writeProjectConfig, getProjectConfigDir, getProjectDbPath, readCredentials, getEngramToken, } from '../config.js';
8
+ import { CodeGraph, getParserForFile, isSupportedFile } from '@kabirlikestocode/engram-core';
9
+ async function collectFiles(dir) {
10
+ const IGNORED = new Set([
11
+ 'node_modules', '.git', 'dist', 'build', '.next', '__pycache__',
12
+ '.turbo', '.vercel', '.engram', 'coverage', '.nyc_output',
13
+ 'vendor', '.venv', 'venv', 'env', '.tox', '.mypy_cache', '.pytest_cache',
14
+ ]);
15
+ const files = [];
16
+ const entries = await readdir(dir, { withFileTypes: true });
17
+ for (const entry of entries) {
18
+ const fullPath = join(dir, entry.name);
19
+ if (entry.isDirectory()) {
20
+ if (IGNORED.has(entry.name))
21
+ continue;
22
+ files.push(...await collectFiles(fullPath));
23
+ }
24
+ else if (isSupportedFile(entry.name)) {
25
+ files.push(fullPath);
26
+ }
27
+ }
28
+ return files;
29
+ }
30
+ export async function initCommand(projectPath) {
31
+ const projectRoot = resolve(projectPath ?? process.cwd());
32
+ console.log(chalk.bold.green('\n ⬡ Engram') +
33
+ chalk.dim(' — Your codebase, remembered.\n'));
34
+ // Check if already initialized
35
+ if (isProjectInitialized(projectRoot)) {
36
+ console.log(chalk.yellow(' ⚠ Already initialized at') +
37
+ chalk.dim(` ${projectRoot}`));
38
+ console.log(chalk.dim(' Run `engram index` to force a reindex.\n'));
39
+ return;
40
+ }
41
+ // Create .engram directory
42
+ const configDir = getProjectConfigDir(projectRoot);
43
+ if (!existsSync(configDir)) {
44
+ await mkdir(configDir, { recursive: true });
45
+ }
46
+ // Get token if available
47
+ const envToken = getEngramToken();
48
+ const creds = await readCredentials();
49
+ const token = envToken ?? creds?.token;
50
+ // Write project config
51
+ const config = {
52
+ projectRoot,
53
+ ignorePaths: [
54
+ 'node_modules',
55
+ '.git',
56
+ 'dist',
57
+ 'build',
58
+ '.next',
59
+ '__pycache__',
60
+ '.engram',
61
+ ],
62
+ languages: ['typescript', 'python'],
63
+ dbPath: getProjectDbPath(projectRoot),
64
+ };
65
+ if (creds?.userId) {
66
+ config.teamId = undefined; // solo by default
67
+ }
68
+ await writeProjectConfig(config);
69
+ // Perform initial index
70
+ const spinner = ora({
71
+ text: chalk.dim(' Indexing project...'),
72
+ color: 'green',
73
+ }).start();
74
+ const graph = new CodeGraph(config.dbPath);
75
+ try {
76
+ const files = await collectFiles(projectRoot);
77
+ const IO_CONCURRENCY = 64;
78
+ const DB_BATCH_SIZE = 200;
79
+ let indexed = 0;
80
+ let errors = 0;
81
+ const pendingResults = [];
82
+ for (let i = 0; i < files.length; i += IO_CONCURRENCY) {
83
+ const chunk = files.slice(i, i + IO_CONCURRENCY);
84
+ const settled = await Promise.allSettled(chunk.map(async (filePath) => {
85
+ const parser = getParserForFile(filePath);
86
+ if (!parser)
87
+ return null;
88
+ const content = await readFile(filePath, 'utf-8');
89
+ const relPath = relative(projectRoot, filePath);
90
+ return parser.parseFile(relPath, content);
91
+ }));
92
+ for (const outcome of settled) {
93
+ if (outcome.status === 'fulfilled' && outcome.value) {
94
+ pendingResults.push(outcome.value);
95
+ indexed++;
96
+ }
97
+ else if (outcome.status === 'rejected') {
98
+ errors++;
99
+ }
100
+ }
101
+ if (pendingResults.length >= DB_BATCH_SIZE) {
102
+ graph.upsertBatchResults(pendingResults.splice(0));
103
+ }
104
+ if (indexed % 50 === 0) {
105
+ spinner.text = chalk.dim(` Indexing... ${indexed}/${files.length}`);
106
+ }
107
+ }
108
+ if (pendingResults.length > 0) {
109
+ graph.upsertBatchResults(pendingResults);
110
+ }
111
+ const stats = graph.getStats();
112
+ spinner.succeed(chalk.green(' Engram initialized for ') + chalk.bold(projectRoot));
113
+ console.log(chalk.green(' ✓ Indexed ') +
114
+ chalk.bold.white(String(stats.totalSymbols)) +
115
+ chalk.green(' symbols across ') +
116
+ chalk.bold.white(String(stats.totalFiles)) +
117
+ chalk.green(' files'));
118
+ if (errors > 0) {
119
+ console.log(chalk.yellow(` ⚠ ${errors} files skipped due to parse errors`));
120
+ }
121
+ // Show language breakdown
122
+ const langs = Object.entries(stats.languages)
123
+ .map(([lang, count]) => `${lang} (${count})`)
124
+ .join(', ');
125
+ console.log(chalk.dim(` Languages: ${langs}`));
126
+ }
127
+ finally {
128
+ graph.close();
129
+ }
130
+ // Output MCP config snippet
131
+ const mcpConfig = {
132
+ mcpServers: {
133
+ engram: {
134
+ command: 'engram',
135
+ args: ['serve', '--project', projectRoot],
136
+ ...(token ? { env: { ENGRAM_TOKEN: token } } : {}),
137
+ },
138
+ },
139
+ };
140
+ console.log(chalk.dim('\n Add this to your ') +
141
+ chalk.bold('claude_desktop_config.json') +
142
+ chalk.dim(':'));
143
+ console.log();
144
+ console.log(chalk
145
+ .green(JSON.stringify(mcpConfig, null, 2))
146
+ .split('\n')
147
+ .map((l) => ' ' + l)
148
+ .join('\n'));
149
+ console.log();
150
+ console.log(chalk.dim(' Run ') +
151
+ chalk.bold('engram serve') +
152
+ chalk.dim(' to start the MCP server manually.\n'));
153
+ }
154
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAaA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8HlD"}
@@ -0,0 +1,88 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import open from 'open';
4
+ import { writeCredentials, readCredentials, getApiUrl, } from '../config.js';
5
+ const POLL_INTERVAL_MS = 2000;
6
+ const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
7
+ export async function loginCommand() {
8
+ console.log(chalk.bold.green('\n ⬡ Engram') + chalk.dim(' — Login\n'));
9
+ // Check if already logged in
10
+ const existing = await readCredentials();
11
+ if (existing && existing.expiresAt > Date.now()) {
12
+ console.log(chalk.green(' ✓ Already logged in as ') +
13
+ chalk.bold(existing.email));
14
+ console.log(chalk.dim(` Tier: ${existing.tier} | Token: ${existing.token.slice(0, 12)}...`));
15
+ console.log(chalk.dim(' Run `engram login --force` to re-authenticate.\n'));
16
+ return;
17
+ }
18
+ const apiUrl = getApiUrl();
19
+ // Step 1: POST to initiate a CLI session (server generates the state token)
20
+ let stateToken;
21
+ let authUrl;
22
+ let pollUrl;
23
+ try {
24
+ const initRes = await fetch(`${apiUrl}/api/auth/cli`, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ });
28
+ if (!initRes.ok) {
29
+ const errBody = await initRes.text();
30
+ console.error(chalk.red(` ✗ Failed to initiate login: ${initRes.status} ${errBody}\n`));
31
+ process.exit(1);
32
+ }
33
+ const initData = (await initRes.json());
34
+ stateToken = initData.state;
35
+ authUrl = initData.authUrl;
36
+ pollUrl = initData.pollUrl;
37
+ }
38
+ catch (err) {
39
+ console.error(chalk.red(` ✗ Could not reach the Engram API at ${apiUrl}\n`));
40
+ process.exit(1);
41
+ }
42
+ console.log(chalk.dim(' Opening browser for authentication...\n'));
43
+ // Step 2: Open the browser approval page
44
+ try {
45
+ await open(authUrl);
46
+ console.log(chalk.dim(' If the browser didn\'t open, visit:\n'));
47
+ }
48
+ catch {
49
+ console.log(chalk.dim(' Could not open browser. Visit this URL:\n'));
50
+ }
51
+ console.log(chalk.blue(` ${authUrl}\n`));
52
+ // Step 3: Poll for completion
53
+ const spinner = ora({
54
+ text: chalk.dim(' Waiting for authentication...'),
55
+ color: 'green',
56
+ }).start();
57
+ const startTime = Date.now();
58
+ while (Date.now() - startTime < TIMEOUT_MS) {
59
+ try {
60
+ const response = await fetch(pollUrl);
61
+ if (response.status === 200) {
62
+ const data = (await response.json());
63
+ if (data.status === 'complete' && data.token) {
64
+ const creds = {
65
+ token: data.token,
66
+ userId: data.userId ?? 'unknown',
67
+ email: data.email ?? 'unknown',
68
+ tier: data.tier ?? 'free',
69
+ expiresAt: data.expiresAt ?? Date.now() + 365 * 24 * 60 * 60 * 1000,
70
+ };
71
+ await writeCredentials(creds);
72
+ spinner.succeed(chalk.green(' Logged in as ') + chalk.bold(creds.email));
73
+ console.log(chalk.dim(` Tier: ${creds.tier}\n`));
74
+ return;
75
+ }
76
+ }
77
+ // 202 or other — still pending
78
+ }
79
+ catch {
80
+ // Network error — keep trying
81
+ }
82
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
83
+ }
84
+ spinner.fail(chalk.red(' Authentication timed out.'));
85
+ console.log(chalk.dim(' Please try again with `engram login`.\n'));
86
+ process.exit(1);
87
+ }
88
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function serveCommand(options: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDhB"}
@@ -0,0 +1,45 @@
1
+ import { resolve } from 'node:path';
2
+ import { createConnection } from 'node:net';
3
+ import chalk from 'chalk';
4
+ import { readProjectConfig, isProjectInitialized, getSocketPath, } from '../config.js';
5
+ import { startDaemon, isDaemonRunning } from '../daemon.js';
6
+ export async function serveCommand(options) {
7
+ const projectRoot = resolve(options.project ?? process.cwd());
8
+ if (!isProjectInitialized(projectRoot)) {
9
+ process.stderr.write(chalk.red(`\nError: Not initialized. Run \`engram init\` first in ${projectRoot}\n`));
10
+ process.exit(1);
11
+ }
12
+ const config = await readProjectConfig(projectRoot);
13
+ if (!config) {
14
+ process.stderr.write(chalk.red('\nError: Could not read config.\n'));
15
+ process.exit(1);
16
+ }
17
+ const socketPath = getSocketPath(projectRoot);
18
+ // Ensure daemon is running (starts it if not)
19
+ if (!(await isDaemonRunning(projectRoot))) {
20
+ process.stderr.write(chalk.dim('Starting Engram daemon...\n'));
21
+ await startDaemon(projectRoot);
22
+ }
23
+ // Connect to daemon socket and proxy stdio ↔ socket
24
+ const sock = createConnection(socketPath);
25
+ sock.on('connect', () => {
26
+ process.stderr.write(chalk.green('Connected to Engram daemon\n'));
27
+ // Proxy stdin → socket, socket → stdout (MCP protocol)
28
+ process.stdin.pipe(sock);
29
+ sock.pipe(process.stdout);
30
+ });
31
+ sock.on('error', (err) => {
32
+ process.stderr.write(chalk.red(`\nDaemon connection error: ${err.message}\n`));
33
+ process.exit(1);
34
+ });
35
+ sock.on('close', () => {
36
+ process.exit(0);
37
+ });
38
+ // Forward SIGINT/SIGTERM to clean disconnect
39
+ const cleanup = () => {
40
+ sock.end();
41
+ };
42
+ process.on('SIGINT', cleanup);
43
+ process.on('SIGTERM', cleanup);
44
+ }
45
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAElC;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9D,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,GAAG,CACP,0DAA0D,WAAW,IAAI,CAC1E,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,8CAA8C;IAC9C,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAED,oDAAoD;IACpD,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAClE,uDAAuD;QACvD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,GAAG,CAAC,8BAA8B,GAAG,CAAC,OAAO,IAAI,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function statusCommand(options: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAoBA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGhB"}
@@ -0,0 +1,85 @@
1
+ import { resolve } from 'node:path';
2
+ import chalk from 'chalk';
3
+ import { isProjectInitialized, readCredentials, getEngramToken, getProjectDbPath, } from '../config.js';
4
+ import { getDaemonPid } from '../daemon.js';
5
+ import { CodeGraph } from '@kabirlikestocode/engram-core';
6
+ function timeAgo(ms) {
7
+ const seconds = Math.floor(ms / 1000);
8
+ if (seconds < 60)
9
+ return `${seconds} seconds ago`;
10
+ const minutes = Math.floor(seconds / 60);
11
+ if (minutes < 60)
12
+ return `${minutes} minute${minutes !== 1 ? 's' : ''} ago`;
13
+ const hours = Math.floor(minutes / 60);
14
+ return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
15
+ }
16
+ export async function statusCommand(options) {
17
+ const projectRoot = resolve(options.project ?? process.cwd());
18
+ console.log(chalk.bold.green('\n ⬡ Engram') +
19
+ chalk.dim(' status for ') +
20
+ chalk.bold(projectRoot) +
21
+ '\n');
22
+ if (!isProjectInitialized(projectRoot)) {
23
+ console.log(chalk.yellow(' ⚠ Not initialized.') +
24
+ chalk.dim(' Run `engram init` first.\n'));
25
+ return;
26
+ }
27
+ const dbPath = getProjectDbPath(projectRoot);
28
+ let graph = null;
29
+ try {
30
+ graph = new CodeGraph(dbPath);
31
+ const stats = graph.getStats();
32
+ // Symbol count
33
+ console.log(chalk.dim(' Symbols indexed: ') +
34
+ chalk.bold.white(String(stats.totalSymbols)));
35
+ // File count
36
+ console.log(chalk.dim(' Files tracked: ') +
37
+ chalk.bold.white(String(stats.totalFiles)));
38
+ // Languages
39
+ const langStr = Object.entries(stats.languages)
40
+ .map(([lang, count]) => `${lang} (${count})`)
41
+ .join(', ');
42
+ console.log(chalk.dim(' Languages: ') + chalk.white(langStr || 'none'));
43
+ // Last update
44
+ if (stats.lastIndexed) {
45
+ const ago = timeAgo(Date.now() - stats.lastIndexed);
46
+ const fresh = Date.now() - stats.lastIndexed < 60000;
47
+ console.log(chalk.dim(' Last update: ') +
48
+ (fresh ? chalk.green(ago) : chalk.yellow(ago)));
49
+ console.log(chalk.dim(' Index age: ') +
50
+ (fresh ? chalk.green('fresh') : chalk.yellow('stale')));
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.log(chalk.red(` ✗ Could not read database: ${error instanceof Error ? error.message : String(error)}`));
55
+ }
56
+ finally {
57
+ graph?.close();
58
+ }
59
+ // Daemon status
60
+ const pid = await getDaemonPid(projectRoot);
61
+ if (pid !== null) {
62
+ console.log(chalk.dim(' MCP server: ') +
63
+ chalk.green(`running (PID ${pid})`));
64
+ }
65
+ else {
66
+ console.log(chalk.dim(' MCP server: ') + chalk.yellow('not running'));
67
+ }
68
+ // Token status
69
+ const envToken = getEngramToken();
70
+ const creds = await readCredentials();
71
+ const token = envToken ?? creds?.token;
72
+ if (token) {
73
+ const masked = token.slice(0, 12) + '...' + token.slice(-4);
74
+ const valid = !creds || creds.expiresAt > Date.now();
75
+ console.log(chalk.dim(' Token: ') +
76
+ chalk.white(masked) +
77
+ (valid ? chalk.green(' (valid)') : chalk.red(' (expired)')));
78
+ }
79
+ else {
80
+ console.log(chalk.dim(' Token: ') +
81
+ chalk.yellow('none (local mode)'));
82
+ }
83
+ console.log();
84
+ }
85
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,SAAS,OAAO,CAAC,EAAU;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,cAAc,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACvB,IAAI,CACP,CAAC;IAEF,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAC3C,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAqB,IAAI,CAAC;IAEnC,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE/B,eAAe;QACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAC/C,CAAC;QAEF,aAAa;QACb,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAC7C,CAAC;QAEF,YAAY;QACZ,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;aAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,CACnE,CAAC;QAEF,cAAc;QACd,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;YACrD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;gBAC/B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACjD,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;gBAC/B,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACzD,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzF,CACF,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,KAAK,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,gBAAgB;IAChB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAC,CACtC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAChE,CAAC;IACJ,CAAC;IAED,eAAe;IACf,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,IAAI,KAAK,EAAE,KAAK,CAAC;IAEvC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC/B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YACnB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;YAC/B,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CACpC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function syncPushCommand(opts: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ export declare function syncPullCommand(opts: {
5
+ project?: string;
6
+ }): Promise<void>;
7
+ export declare function syncStatusCommand(opts: {
8
+ project?: string;
9
+ }): Promise<void>;
10
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAsCA,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/E;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B/E;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCjF"}