@centr-ai/cli 0.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 (56) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +275 -0
  4. package/dist/commands/benchmark.d.ts +3 -0
  5. package/dist/commands/benchmark.d.ts.map +1 -0
  6. package/dist/commands/benchmark.js +382 -0
  7. package/dist/commands/benchmark.js.map +1 -0
  8. package/dist/commands/brain.d.ts +3 -0
  9. package/dist/commands/brain.d.ts.map +1 -0
  10. package/dist/commands/brain.js +387 -0
  11. package/dist/commands/brain.js.map +1 -0
  12. package/dist/commands/context.d.ts +3 -0
  13. package/dist/commands/context.d.ts.map +1 -0
  14. package/dist/commands/context.js +52 -0
  15. package/dist/commands/context.js.map +1 -0
  16. package/dist/commands/doctor.d.ts +3 -0
  17. package/dist/commands/doctor.d.ts.map +1 -0
  18. package/dist/commands/doctor.js +116 -0
  19. package/dist/commands/doctor.js.map +1 -0
  20. package/dist/commands/init.d.ts +3 -0
  21. package/dist/commands/init.d.ts.map +1 -0
  22. package/dist/commands/init.js +49 -0
  23. package/dist/commands/init.js.map +1 -0
  24. package/dist/commands/learn.d.ts +3 -0
  25. package/dist/commands/learn.d.ts.map +1 -0
  26. package/dist/commands/learn.js +151 -0
  27. package/dist/commands/learn.js.map +1 -0
  28. package/dist/commands/search.d.ts +3 -0
  29. package/dist/commands/search.d.ts.map +1 -0
  30. package/dist/commands/search.js +48 -0
  31. package/dist/commands/search.js.map +1 -0
  32. package/dist/commands/skills.d.ts +3 -0
  33. package/dist/commands/skills.d.ts.map +1 -0
  34. package/dist/commands/skills.js +123 -0
  35. package/dist/commands/skills.js.map +1 -0
  36. package/dist/commands/status.d.ts +3 -0
  37. package/dist/commands/status.d.ts.map +1 -0
  38. package/dist/commands/status.js +59 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/commands/symbol.d.ts +3 -0
  41. package/dist/commands/symbol.d.ts.map +1 -0
  42. package/dist/commands/symbol.js +48 -0
  43. package/dist/commands/symbol.js.map +1 -0
  44. package/dist/commands/sync.d.ts +3 -0
  45. package/dist/commands/sync.d.ts.map +1 -0
  46. package/dist/commands/sync.js +44 -0
  47. package/dist/commands/sync.js.map +1 -0
  48. package/dist/index.d.ts +3 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +39 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/utils.d.ts +8 -0
  53. package/dist/utils.d.ts.map +1 -0
  54. package/dist/utils.js +50 -0
  55. package/dist/utils.js.map +1 -0
  56. package/package.json +66 -0
@@ -0,0 +1,49 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { initializeProject } from '@centr-ai/core';
4
+ import { getProjectRoot, getDatabase, formatNumber, formatDuration, handleError } from '../utils.js';
5
+ export default function (program) {
6
+ program
7
+ .command('init')
8
+ .description('Initialize CentR for the current project')
9
+ .action(async () => {
10
+ const options = program.opts();
11
+ let db;
12
+ try {
13
+ const root = getProjectRoot();
14
+ db = getDatabase(root);
15
+ const spinner = ora('Initializing project...').start();
16
+ if (options.json)
17
+ spinner.stop();
18
+ const result = await initializeProject(root, db);
19
+ if (!options.json) {
20
+ spinner.succeed(chalk.green('CentR initialized'));
21
+ console.log('');
22
+ console.log(`Project: ${chalk.cyan(result.project.name)}`);
23
+ console.log(`Language: ${chalk.cyan(result.project.language)}`);
24
+ if (result.project.framework) {
25
+ console.log(`Framework: ${chalk.cyan(result.project.framework)}`);
26
+ }
27
+ console.log(`Files indexed: ${chalk.cyan(formatNumber(result.filesIndexed))}`);
28
+ console.log(`Symbols indexed: ${chalk.cyan(formatNumber(result.symbolsIndexed))}`);
29
+ console.log(`Dependencies: ${chalk.cyan(formatNumber(result.dependenciesCount))}`);
30
+ console.log(`Tests detected: ${chalk.cyan(formatNumber(result.testsDetected))}`);
31
+ console.log('');
32
+ console.log(`Index time: ${chalk.cyan(formatDuration(result.timeTaken))}`);
33
+ console.log('');
34
+ console.log(chalk.green('Project intelligence is ready.'));
35
+ }
36
+ else {
37
+ console.log(JSON.stringify(result, null, 2));
38
+ }
39
+ }
40
+ catch (error) {
41
+ handleError(error);
42
+ }
43
+ finally {
44
+ if (db)
45
+ db.close();
46
+ }
47
+ });
48
+ }
49
+ //# 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,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=learn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,OAAO,QA6JxC"}
@@ -0,0 +1,151 @@
1
+ import { LearningService } from '@centr-ai/core';
2
+ import chalk from 'chalk';
3
+ import * as readline from 'node:readline';
4
+ import { getDatabase, getProjectRoot, handleError } from '../utils.js';
5
+ export default function (program) {
6
+ const learn = program.command('learn').description('Manage learning and lessons');
7
+ learn
8
+ .command('list')
9
+ .description('List existing lessons')
10
+ .action(async () => {
11
+ const options = program.opts();
12
+ let db;
13
+ try {
14
+ const root = getProjectRoot();
15
+ db = getDatabase(root);
16
+ const learningService = new LearningService(db);
17
+ const lessons = db.all('SELECT id, lesson, category, status, confidence FROM learning ORDER BY confidence DESC');
18
+ if (options.json) {
19
+ console.log(JSON.stringify(lessons, null, 2));
20
+ }
21
+ else {
22
+ if (lessons.length === 0) {
23
+ console.log(chalk.yellow('No lessons found.'));
24
+ return;
25
+ }
26
+ console.table(lessons.map((l) => ({
27
+ ID: l.id,
28
+ Lesson: l.lesson.substring(0, 50) + (l.lesson.length > 50 ? '...' : ''),
29
+ Category: l.category,
30
+ Status: l.status,
31
+ Confidence: l.confidence.toFixed(2),
32
+ })));
33
+ }
34
+ }
35
+ catch (error) {
36
+ handleError(error);
37
+ }
38
+ finally {
39
+ if (db)
40
+ db.close();
41
+ }
42
+ });
43
+ learn
44
+ .command('add')
45
+ .description('Add a new lesson interactively')
46
+ .action(async () => {
47
+ const options = program.opts();
48
+ let db;
49
+ try {
50
+ const root = getProjectRoot();
51
+ db = getDatabase(root);
52
+ const learningService = new LearningService(db);
53
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
54
+ const question = (query) => new Promise((resolve) => rl.question(query, resolve));
55
+ console.log(chalk.bold('Add New Lesson'));
56
+ const lesson = await question('Lesson: ');
57
+ const category = await question('Category: ');
58
+ const trigger = await question('Trigger (when is it relevant): ');
59
+ const action = await question('Recommended action: ');
60
+ const experience = await question('Source experience: ');
61
+ rl.close();
62
+ const created = learningService.record({
63
+ lesson,
64
+ category,
65
+ trigger,
66
+ recommendedAction: action,
67
+ scope: 'global',
68
+ sourceExperience: experience,
69
+ });
70
+ if (options.json) {
71
+ console.log(JSON.stringify(created, null, 2));
72
+ }
73
+ else {
74
+ console.log(chalk.green(`Lesson #${created.id} added successfully.`));
75
+ }
76
+ }
77
+ catch (error) {
78
+ handleError(error);
79
+ }
80
+ finally {
81
+ if (db)
82
+ db.close();
83
+ }
84
+ });
85
+ learn
86
+ .command('promote <id>')
87
+ .description('Promote a candidate lesson to validated')
88
+ .action(async (idStr) => {
89
+ const options = program.opts();
90
+ let db;
91
+ try {
92
+ const root = getProjectRoot();
93
+ db = getDatabase(root);
94
+ const learningService = new LearningService(db);
95
+ const id = parseInt(idStr, 10);
96
+ const promoted = learningService.promote(id);
97
+ if (!promoted) {
98
+ console.log(chalk.yellow(`Could not promote lesson #${id}. Confidence may be below threshold.`));
99
+ return;
100
+ }
101
+ if (options.json) {
102
+ console.log(JSON.stringify(promoted, null, 2));
103
+ }
104
+ else {
105
+ console.log(chalk.green(`Lesson #${id} promoted to validated.`));
106
+ }
107
+ }
108
+ catch (error) {
109
+ handleError(error);
110
+ }
111
+ finally {
112
+ if (db)
113
+ db.close();
114
+ }
115
+ });
116
+ learn
117
+ .command('reject <id>')
118
+ .description('Reject a candidate lesson')
119
+ .action(async (idStr) => {
120
+ const options = program.opts();
121
+ let db;
122
+ try {
123
+ const root = getProjectRoot();
124
+ db = getDatabase(root);
125
+ const learningService = new LearningService(db);
126
+ const id = parseInt(idStr, 10);
127
+ const rejected = learningService.reject(id);
128
+ if (!rejected) {
129
+ console.log(chalk.yellow(`Could not find lesson #${id}.`));
130
+ return;
131
+ }
132
+ if (options.json) {
133
+ console.log(JSON.stringify(rejected, null, 2));
134
+ }
135
+ else {
136
+ console.log(chalk.green(`Lesson #${id} rejected.`));
137
+ }
138
+ }
139
+ catch (error) {
140
+ handleError(error);
141
+ }
142
+ finally {
143
+ if (db)
144
+ db.close();
145
+ }
146
+ });
147
+ learn.action(() => {
148
+ console.log(chalk.yellow('Please specify a subcommand: list, add, promote, reject'));
149
+ });
150
+ }
151
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/commands/learn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,CAAC,OAAO,WAAU,OAAO,EAAE,OAAO,QA2CvC"}
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import { SearchEngine } from '@centr-ai/core';
3
+ import { getProjectRoot, getDatabase, getProjectId, handleError } from '../utils.js';
4
+ export default function (program) {
5
+ program
6
+ .command('search <query>')
7
+ .description('Search across project files and symbols')
8
+ .option('-l, --limit <number>', 'Maximum number of results', '10')
9
+ .action(async (query, cmdOptions) => {
10
+ const options = program.opts();
11
+ let db;
12
+ try {
13
+ const root = getProjectRoot();
14
+ db = getDatabase(root);
15
+ const projectId = getProjectId(db, root);
16
+ const searchEngine = new SearchEngine(db);
17
+ const results = await searchEngine.search({
18
+ query,
19
+ projectId,
20
+ limit: parseInt(cmdOptions.limit, 10),
21
+ json: options.json
22
+ });
23
+ if (options.json) {
24
+ console.log(JSON.stringify(results, null, 2));
25
+ }
26
+ else {
27
+ if (results.length === 0) {
28
+ console.log(chalk.yellow('No results found.'));
29
+ return;
30
+ }
31
+ console.table(results.map((r) => ({
32
+ File: r.file,
33
+ Symbol: r.symbol || '',
34
+ Type: r.type,
35
+ Score: r.relevance.toFixed(2)
36
+ })));
37
+ }
38
+ }
39
+ catch (error) {
40
+ handleError(error);
41
+ }
42
+ finally {
43
+ if (db)
44
+ db.close();
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,CAAC,OAAO,WAAU,OAAgB;IACtC,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,IAAI,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEzC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC;gBACxC,KAAK;gBACL,SAAS;gBACT,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;gBACrC,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;oBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC9B,CAAC,CAAC,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,OAAO,QA0HxC"}
@@ -0,0 +1,123 @@
1
+ import { SkillsService } from '@centr-ai/core';
2
+ import chalk from 'chalk';
3
+ import * as readline from 'node:readline';
4
+ import { getDatabase, getProjectRoot, handleError } from '../utils.js';
5
+ export default function (program) {
6
+ const skills = program.command('skills').description('Manage agent skills');
7
+ skills
8
+ .command('list')
9
+ .description('List available skills')
10
+ .action(async () => {
11
+ const options = program.opts();
12
+ let db;
13
+ try {
14
+ const root = getProjectRoot();
15
+ db = getDatabase(root);
16
+ const skillsService = new SkillsService(db);
17
+ const skillList = skillsService.getAll();
18
+ if (options.json) {
19
+ console.log(JSON.stringify(skillList, null, 2));
20
+ }
21
+ else {
22
+ if (skillList.length === 0) {
23
+ console.log(chalk.yellow('No skills found.'));
24
+ return;
25
+ }
26
+ console.table(skillList.map((s) => ({
27
+ ID: s.id,
28
+ Name: s.name,
29
+ Category: s.category,
30
+ Confidence: s.confidence.toFixed(2),
31
+ })));
32
+ }
33
+ }
34
+ catch (error) {
35
+ handleError(error);
36
+ }
37
+ finally {
38
+ if (db)
39
+ db.close();
40
+ }
41
+ });
42
+ skills
43
+ .command('add')
44
+ .description('Add a new skill interactively')
45
+ .action(async () => {
46
+ const options = program.opts();
47
+ let db;
48
+ try {
49
+ const root = getProjectRoot();
50
+ db = getDatabase(root);
51
+ const skillsService = new SkillsService(db);
52
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
53
+ const question = (query) => new Promise((resolve) => rl.question(query, resolve));
54
+ console.log(chalk.bold('Add New Skill'));
55
+ const name = await question('Name: ');
56
+ const description = await question('Description: ');
57
+ const trigger = await question('Trigger (regex/keywords): ');
58
+ const instructions = await question('Instructions: ');
59
+ const category = await question('Category: ');
60
+ rl.close();
61
+ const skill = skillsService.record({
62
+ name,
63
+ description,
64
+ trigger,
65
+ instructions,
66
+ category,
67
+ source: 'cli',
68
+ });
69
+ if (options.json) {
70
+ console.log(JSON.stringify(skill, null, 2));
71
+ }
72
+ else {
73
+ console.log(chalk.green(`Skill '${skill.name}' added successfully.`));
74
+ }
75
+ }
76
+ catch (error) {
77
+ handleError(error);
78
+ }
79
+ finally {
80
+ if (db)
81
+ db.close();
82
+ }
83
+ });
84
+ skills
85
+ .command('search <query>')
86
+ .description('Search skills')
87
+ .action(async (query) => {
88
+ const options = program.opts();
89
+ let db;
90
+ try {
91
+ const root = getProjectRoot();
92
+ db = getDatabase(root);
93
+ const skillsService = new SkillsService(db);
94
+ const searchResults = skillsService.search(query);
95
+ if (options.json) {
96
+ console.log(JSON.stringify(searchResults, null, 2));
97
+ }
98
+ else {
99
+ if (searchResults.length === 0) {
100
+ console.log(chalk.yellow('No skills found matching query.'));
101
+ return;
102
+ }
103
+ console.table(searchResults.map((s) => ({
104
+ ID: s.id,
105
+ Name: s.name,
106
+ Category: s.category,
107
+ Confidence: s.confidence.toFixed(2),
108
+ })));
109
+ }
110
+ }
111
+ catch (error) {
112
+ handleError(error);
113
+ }
114
+ finally {
115
+ if (db)
116
+ db.close();
117
+ }
118
+ });
119
+ skills.action(() => {
120
+ console.log(chalk.yellow('Please specify a subcommand: list, add, search'));
121
+ });
122
+ }
123
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,CAAC,OAAO,WAAU,OAAO,EAAE,OAAO,QAsDvC"}
@@ -0,0 +1,59 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { getProjectRoot, getDatabase, getProjectId, formatNumber, handleError } from '../utils.js';
5
+ export default function (program) {
6
+ program
7
+ .command('status')
8
+ .description('Show project intelligence status')
9
+ .action(async () => {
10
+ const options = program.opts();
11
+ let db;
12
+ try {
13
+ const root = getProjectRoot();
14
+ db = getDatabase(root);
15
+ const projectId = getProjectId(db, root);
16
+ const project = db.getDb().prepare('SELECT * FROM projects WHERE id = ?').get(projectId);
17
+ const fileCount = db.getDb().prepare('SELECT COUNT(*) as c FROM files WHERE projectId = ?').get(projectId).c;
18
+ const symbolCount = db.getDb().prepare('SELECT COUNT(*) as c FROM symbols WHERE projectId = ?').get(projectId).c;
19
+ const depCount = db.getDb().prepare('SELECT COUNT(*) as c FROM dependencies WHERE projectId = ?').get(projectId).c;
20
+ const lastSync = db.getDb().prepare('SELECT MAX(lastIndexed) as maxSync FROM files WHERE projectId = ?').get(projectId).maxSync;
21
+ const dbPath = path.join(root, '.centr', 'centr.db');
22
+ let dbSize = 0;
23
+ if (fs.existsSync(dbPath)) {
24
+ dbSize = fs.statSync(dbPath).size;
25
+ }
26
+ const statusData = {
27
+ project: project.name,
28
+ language: project.language,
29
+ files: fileCount,
30
+ symbols: symbolCount,
31
+ dependencies: depCount,
32
+ lastSync: lastSync || 'Never',
33
+ databaseSize: dbSize
34
+ };
35
+ if (options.json) {
36
+ console.log(JSON.stringify(statusData, null, 2));
37
+ }
38
+ else {
39
+ console.log(chalk.bold('Project Intelligence Status'));
40
+ console.log('');
41
+ console.log(`Project: ${chalk.cyan(statusData.project)}`);
42
+ console.log(`Language: ${chalk.cyan(statusData.language)}`);
43
+ console.log(`Files indexed: ${chalk.cyan(formatNumber(statusData.files))}`);
44
+ console.log(`Symbols indexed: ${chalk.cyan(formatNumber(statusData.symbols))}`);
45
+ console.log(`Dependencies: ${chalk.cyan(formatNumber(statusData.dependencies))}`);
46
+ console.log(`Last sync: ${chalk.cyan(statusData.lastSync)}`);
47
+ console.log(`Database size: ${chalk.cyan((statusData.databaseSize / (1024 * 1024)).toFixed(2) + ' MB')}`);
48
+ }
49
+ }
50
+ catch (error) {
51
+ handleError(error);
52
+ }
53
+ finally {
54
+ if (db)
55
+ db.close();
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEnG,MAAM,CAAC,OAAO,WAAU,OAAgB;IACtC,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAQ,CAAC;YAChG,MAAM,SAAS,GAAI,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAS,CAAC,CAAC,CAAC;YACtH,MAAM,WAAW,GAAI,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,SAAS,CAAS,CAAC,CAAC,CAAC;YAC1H,MAAM,QAAQ,GAAI,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,CAAC,SAAS,CAAS,CAAC,CAAC,CAAC;YAE5H,MAAM,QAAQ,GAAI,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAS,CAAC,OAAO,CAAC;YAEzI,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACpC,CAAC;YAED,MAAM,UAAU,GAAG;gBACjB,OAAO,EAAE,OAAO,CAAC,IAAI;gBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,QAAQ;gBACtB,QAAQ,EAAE,QAAQ,IAAI,OAAO;gBAC7B,YAAY,EAAE,MAAM;aACrB,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClF,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=symbol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.d.ts","sourceRoot":"","sources":["../../src/commands/symbol.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,OAAO,WAAW,OAAO,EAAE,OAAO,QAuCxC"}
@@ -0,0 +1,48 @@
1
+ import { SearchEngine } from '@centr-ai/core';
2
+ import chalk from 'chalk';
3
+ import { getDatabase, getProjectId, getProjectRoot, handleError } from '../utils.js';
4
+ export default function (program) {
5
+ program
6
+ .command('symbol <name>')
7
+ .description('Lookup symbol details')
8
+ .action(async (name) => {
9
+ const options = program.opts();
10
+ let db;
11
+ try {
12
+ const root = getProjectRoot();
13
+ db = getDatabase(root);
14
+ const projectId = getProjectId(db, root);
15
+ const searchEngine = new SearchEngine(db);
16
+ const result = searchEngine.lookupSymbol(projectId, name);
17
+ if (options.json) {
18
+ console.log(JSON.stringify(result, null, 2));
19
+ }
20
+ else {
21
+ if (!result) {
22
+ console.log(chalk.yellow(`Symbol '${name}' not found.`));
23
+ return;
24
+ }
25
+ console.log(chalk.bold('Symbol Details\n'));
26
+ console.log(`Name: ${chalk.cyan(result.symbol.name)}`);
27
+ console.log(`Kind: ${chalk.cyan(result.symbol.kind)}`);
28
+ if (result.file)
29
+ console.log(`File: ${chalk.cyan(result.file.relativePath)}`);
30
+ if (result.symbol.line)
31
+ console.log(`Line: ${chalk.cyan(result.symbol.line)}`);
32
+ if (result.symbol.signature)
33
+ console.log(`Signature: ${chalk.cyan(result.symbol.signature)}`);
34
+ if (result.references.length > 0) {
35
+ console.log(`References: ${chalk.cyan(result.references.length)}`);
36
+ }
37
+ }
38
+ }
39
+ catch (error) {
40
+ handleError(error);
41
+ }
42
+ finally {
43
+ if (db)
44
+ db.close();
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=symbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../src/commands/symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,CAAC,OAAO,WAAW,OAAgB;IACvC,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEzC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAE1D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC;oBACzD,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,IAAI,MAAM,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC9E,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS;oBACzB,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACnE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function (program: Command): void;
3
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,MAAM,CAAC,OAAO,WAAU,OAAO,EAAE,OAAO,QAoCvC"}
@@ -0,0 +1,44 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { syncProject } from '@centr-ai/core';
4
+ import { getProjectRoot, getDatabase, getProjectId, formatNumber, formatDuration, handleError } from '../utils.js';
5
+ export default function (program) {
6
+ program
7
+ .command('sync')
8
+ .description('Sync project index with filesystem changes')
9
+ .action(async () => {
10
+ const options = program.opts();
11
+ let db;
12
+ try {
13
+ const root = getProjectRoot();
14
+ db = getDatabase(root);
15
+ const projectId = getProjectId(db, root);
16
+ const spinner = ora('Syncing project...').start();
17
+ if (options.json)
18
+ spinner.stop();
19
+ const result = await syncProject(projectId, root, db);
20
+ if (!options.json) {
21
+ spinner.succeed(chalk.green('Sync complete'));
22
+ console.log('');
23
+ console.log(`Files added: ${chalk.cyan(formatNumber(result.filesAdded))}`);
24
+ console.log(`Files changed: ${chalk.cyan(formatNumber(result.filesChanged))}`);
25
+ console.log(`Files deleted: ${chalk.cyan(formatNumber(result.filesDeleted))}`);
26
+ console.log(`Files unchanged: ${chalk.cyan(formatNumber(result.filesUnchanged))}`);
27
+ console.log(`Symbols updated: ${chalk.cyan(formatNumber(result.symbolsUpdated))}`);
28
+ console.log('');
29
+ console.log(`Time: ${chalk.cyan(formatDuration(result.timeTaken))}`);
30
+ }
31
+ else {
32
+ console.log(JSON.stringify(result, null, 2));
33
+ }
34
+ }
35
+ catch (error) {
36
+ handleError(error);
37
+ }
38
+ finally {
39
+ if (db)
40
+ db.close();
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEnH,MAAM,CAAC,OAAO,WAAU,OAAgB;IACtC,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;YAC9B,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,EAAE,CAAC;YAEjC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnF,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}