@know-graph/cli 0.4.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/commands/coverage.d.ts +3 -0
  4. package/dist/commands/coverage.d.ts.map +1 -0
  5. package/dist/commands/coverage.js +98 -0
  6. package/dist/commands/coverage.js.map +1 -0
  7. package/dist/commands/export.d.ts +7 -0
  8. package/dist/commands/export.d.ts.map +1 -0
  9. package/dist/commands/export.js +193 -0
  10. package/dist/commands/export.js.map +1 -0
  11. package/dist/commands/hook.d.ts +30 -0
  12. package/dist/commands/hook.d.ts.map +1 -0
  13. package/dist/commands/hook.js +224 -0
  14. package/dist/commands/hook.js.map +1 -0
  15. package/dist/commands/index-cmd.d.ts +3 -0
  16. package/dist/commands/index-cmd.d.ts.map +1 -0
  17. package/dist/commands/index-cmd.js +96 -0
  18. package/dist/commands/index-cmd.js.map +1 -0
  19. package/dist/commands/index.d.ts +12 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +12 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +105 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/parse.d.ts +3 -0
  28. package/dist/commands/parse.d.ts.map +1 -0
  29. package/dist/commands/parse.js +130 -0
  30. package/dist/commands/parse.js.map +1 -0
  31. package/dist/commands/query.d.ts +3 -0
  32. package/dist/commands/query.d.ts.map +1 -0
  33. package/dist/commands/query.js +74 -0
  34. package/dist/commands/query.js.map +1 -0
  35. package/dist/commands/serve.d.ts +3 -0
  36. package/dist/commands/serve.d.ts.map +1 -0
  37. package/dist/commands/serve.js +56 -0
  38. package/dist/commands/serve.js.map +1 -0
  39. package/dist/commands/suggest.d.ts +3 -0
  40. package/dist/commands/suggest.d.ts.map +1 -0
  41. package/dist/commands/suggest.js +79 -0
  42. package/dist/commands/suggest.js.map +1 -0
  43. package/dist/commands/sync.d.ts +5 -0
  44. package/dist/commands/sync.d.ts.map +1 -0
  45. package/dist/commands/sync.js +151 -0
  46. package/dist/commands/sync.js.map +1 -0
  47. package/dist/commands/validate.d.ts +3 -0
  48. package/dist/commands/validate.d.ts.map +1 -0
  49. package/dist/commands/validate.js +81 -0
  50. package/dist/commands/validate.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +32 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/utils/detect.d.ts +3 -0
  56. package/dist/utils/detect.d.ts.map +1 -0
  57. package/dist/utils/detect.js +153 -0
  58. package/dist/utils/detect.js.map +1 -0
  59. package/dist/utils/format.d.ts +16 -0
  60. package/dist/utils/format.d.ts.map +1 -0
  61. package/dist/utils/format.js +37 -0
  62. package/dist/utils/format.js.map +1 -0
  63. package/dist/utils/index.d.ts +3 -0
  64. package/dist/utils/index.d.ts.map +1 -0
  65. package/dist/utils/index.js +3 -0
  66. package/dist/utils/index.js.map +1 -0
  67. package/package.json +62 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: CLI command that suggests the most impactful files to annotate next
5
+ * owner: knowgraph-cli
6
+ * status: experimental
7
+ * tags: [cli, command, suggest, prioritization]
8
+ * context:
9
+ * business_goal: Help developers prioritize which files to annotate first
10
+ * domain: cli
11
+ */
12
+ import { resolve } from 'node:path';
13
+ import { statSync } from 'node:fs';
14
+ import chalk from 'chalk';
15
+ import { createDefaultRegistry, createSuggestionEngine } from '@know-graph/core';
16
+ function formatTextOutput(result) {
17
+ const lines = [];
18
+ if (result.suggestions.length === 0) {
19
+ lines.push(chalk.green('No unannotated files found. Great job!'));
20
+ return lines.join('\n');
21
+ }
22
+ lines.push(chalk.bold(`${result.totalUnannotated} unannotated files found, showing top ${result.suggestions.length}`));
23
+ lines.push('');
24
+ for (let i = 0; i < result.suggestions.length; i++) {
25
+ const suggestion = result.suggestions[i];
26
+ const rank = chalk.cyan(`${i + 1}.`);
27
+ const filePath = chalk.white(suggestion.filePath);
28
+ const score = chalk.yellow(`(score: ${suggestion.score})`);
29
+ const reasons = chalk.gray(`- ${suggestion.reasons.join(', ')}`);
30
+ lines.push(`${rank} ${filePath} ${score} ${reasons}`);
31
+ }
32
+ return lines.join('\n');
33
+ }
34
+ function formatJsonOutput(result) {
35
+ return JSON.stringify(result, null, 2);
36
+ }
37
+ function runSuggest(targetPath, options) {
38
+ const absPath = resolve(targetPath);
39
+ try {
40
+ statSync(absPath);
41
+ }
42
+ catch {
43
+ console.error(chalk.red(`Error: Path not found: ${absPath}`));
44
+ process.exitCode = 1;
45
+ return;
46
+ }
47
+ try {
48
+ const registry = createDefaultRegistry();
49
+ const engine = createSuggestionEngine(registry);
50
+ const limit = parseInt(options.limit, 10);
51
+ if (Number.isNaN(limit) || limit < 1) {
52
+ console.error(chalk.red('Error: --limit must be a positive integer'));
53
+ process.exitCode = 1;
54
+ return;
55
+ }
56
+ const result = engine.suggest({ rootDir: absPath, limit });
57
+ if (options.format === 'json') {
58
+ console.log(formatJsonOutput(result));
59
+ }
60
+ else {
61
+ console.log(formatTextOutput(result));
62
+ }
63
+ }
64
+ catch (err) {
65
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
66
+ process.exitCode = 1;
67
+ }
68
+ }
69
+ export function registerSuggestCommand(program) {
70
+ program
71
+ .command('suggest [path]')
72
+ .description('Suggest the most impactful files to annotate next')
73
+ .option('--limit <n>', 'Number of suggestions to show', '10')
74
+ .option('--format <format>', 'Output format (text|json)', 'text')
75
+ .action((path, options) => {
76
+ runSuggest(path ?? '.', options);
77
+ });
78
+ }
79
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/commands/suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { ConnectorSyncResult } from '@know-graph/core';
3
+ export declare function formatResult(result: ConnectorSyncResult, verbose: boolean): string;
4
+ export declare function registerSyncCommand(program: Command): void;
5
+ //# 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,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAEV,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAkB1B,wBAAgB,YAAY,CAC1B,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,OAAO,GACf,MAAM,CAsBR;AA8JD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB1D"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: CLI command that syncs external knowledge connectors (Notion, Jira) with the code graph
5
+ * owner: knowgraph-cli
6
+ * status: experimental
7
+ * tags: [cli, command, sync, connectors]
8
+ * context:
9
+ * business_goal: Let developers enrich their code knowledge graph with external tool metadata
10
+ * domain: cli
11
+ */
12
+ import { readFileSync, existsSync } from 'node:fs';
13
+ import { resolve, join } from 'node:path';
14
+ import chalk from 'chalk';
15
+ import ora from 'ora';
16
+ import { parse as parseYaml } from 'yaml';
17
+ import { createDefaultConnectorRegistry, createDatabaseManager, ManifestSchema, } from '@know-graph/core';
18
+ function loadManifest(configPath) {
19
+ const raw = readFileSync(configPath, 'utf-8');
20
+ const parsed = parseYaml(raw);
21
+ return ManifestSchema.safeParse(parsed);
22
+ }
23
+ export function formatResult(result, verbose) {
24
+ const lines = [];
25
+ const hasErrors = result.errors.length > 0;
26
+ const icon = hasErrors ? chalk.yellow('!') : chalk.green('\u2714');
27
+ lines.push(`${icon} ${chalk.bold(result.connector)} connector`);
28
+ lines.push(` Processed ${chalk.cyan(String(result.entitiesProcessed))} entities, ` +
29
+ `added ${chalk.cyan(String(result.linksAdded))} links, ` +
30
+ `updated ${chalk.cyan(String(result.linksUpdated))} links ` +
31
+ `(${result.duration}ms)`);
32
+ if (hasErrors && verbose) {
33
+ for (const err of result.errors) {
34
+ lines.push(chalk.yellow(` Error: ${err.message}`));
35
+ }
36
+ }
37
+ else if (hasErrors) {
38
+ lines.push(chalk.yellow(` ${result.errors.length} error(s) occurred`));
39
+ }
40
+ return lines.join('\n');
41
+ }
42
+ async function runSync(connectorNames, options) {
43
+ const configPath = resolve(options.config ?? '.knowgraph.yml');
44
+ if (!existsSync(configPath)) {
45
+ console.error(chalk.red(`Error: Config not found: ${configPath}\nRun ${chalk.cyan('knowgraph init')} to create one.`));
46
+ process.exitCode = 1;
47
+ return;
48
+ }
49
+ const manifestResult = loadManifest(configPath);
50
+ if (!manifestResult.success) {
51
+ console.error(chalk.red(`Error: Invalid config: ${manifestResult.error.message}`));
52
+ process.exitCode = 1;
53
+ return;
54
+ }
55
+ const manifest = manifestResult.data;
56
+ const connectorConfigs = manifest.connectors ?? {};
57
+ // Determine which connectors to sync
58
+ const availableConnectors = Object.entries(connectorConfigs)
59
+ .filter(([, config]) => config && 'enabled' in config)
60
+ .map(([name]) => name)
61
+ .filter((name) => name !== 'webhook');
62
+ const requestedConnectors = connectorNames.length > 0
63
+ ? connectorNames.filter((n) => availableConnectors.includes(n))
64
+ : availableConnectors;
65
+ if (requestedConnectors.length === 0) {
66
+ console.log(chalk.yellow('No connectors configured. Add connectors to your .knowgraph.yml:'));
67
+ console.log(chalk.dim(`\nconnectors:\n notion:\n enabled: true\n api_key_env: NOTION_API_KEY\n jira:\n enabled: true\n api_key_env: JIRA_API_KEY\n base_url: https://your-team.atlassian.net`));
68
+ return;
69
+ }
70
+ // Load database
71
+ const outputDir = resolve(manifest.index?.output_dir ?? '.knowgraph');
72
+ const dbPath = join(outputDir, 'knowgraph.db');
73
+ if (!existsSync(dbPath)) {
74
+ console.error(chalk.red(`Error: Database not found at ${dbPath}\nRun ${chalk.cyan('knowgraph index')} first.`));
75
+ process.exitCode = 1;
76
+ return;
77
+ }
78
+ const dbManager = createDatabaseManager(dbPath);
79
+ dbManager.initialize();
80
+ const spinner = ora(options.dryRun ? 'Previewing sync (dry run)...' : 'Syncing connectors...').start();
81
+ try {
82
+ const registry = createDefaultConnectorRegistry();
83
+ // Build configs map — only include requested connectors
84
+ const configs = {};
85
+ for (const name of requestedConnectors) {
86
+ const raw = connectorConfigs[name];
87
+ if (raw) {
88
+ configs[name] = raw;
89
+ }
90
+ }
91
+ // Build entity filter
92
+ const entityFilter = options.owner || options.tags
93
+ ? {
94
+ owner: options.owner,
95
+ tags: options.tags
96
+ ?.split(',')
97
+ .map((t) => t.trim())
98
+ .filter(Boolean),
99
+ }
100
+ : undefined;
101
+ const results = await registry.syncAll({
102
+ dbManager,
103
+ configs,
104
+ entityFilter,
105
+ dryRun: options.dryRun ?? false,
106
+ onProgress: (name, result) => {
107
+ spinner.text = `Syncing ${name}... (${result.entitiesProcessed} entities)`;
108
+ },
109
+ });
110
+ spinner.stop();
111
+ // Print results
112
+ const dryRunLabel = options.dryRun ? chalk.dim(' [dry run]') : '';
113
+ console.log('');
114
+ for (const result of results) {
115
+ console.log(formatResult(result, options.verbose ?? false));
116
+ }
117
+ // Summary
118
+ const totalAdded = results.reduce((sum, r) => sum + r.linksAdded, 0);
119
+ const totalUpdated = results.reduce((sum, r) => sum + r.linksUpdated, 0);
120
+ const totalErrors = results.reduce((sum, r) => sum + r.errors.length, 0);
121
+ console.log('');
122
+ if (totalErrors > 0) {
123
+ console.log(chalk.yellow(`Sync complete${dryRunLabel}: ${totalAdded} new links, ${totalUpdated} updated links, ${totalErrors} error(s)`));
124
+ }
125
+ else {
126
+ console.log(chalk.green(`\u2714 Sync complete!${dryRunLabel} ${totalAdded} new links, ${totalUpdated} updated links`));
127
+ }
128
+ }
129
+ catch (err) {
130
+ spinner.fail(chalk.red('Sync failed'));
131
+ console.error(chalk.red(err instanceof Error ? err.message : String(err)));
132
+ process.exitCode = 1;
133
+ }
134
+ finally {
135
+ dbManager.close();
136
+ }
137
+ }
138
+ export function registerSyncCommand(program) {
139
+ program
140
+ .command('sync [connectors...]')
141
+ .description('Sync external knowledge connectors (e.g. Notion, Jira) with the code graph')
142
+ .option('--dry-run', 'Preview changes without writing to database')
143
+ .option('--owner <owner>', 'Only sync entities owned by this team/person')
144
+ .option('--tags <tags>', 'Only sync entities with these tags (comma-separated)')
145
+ .option('--verbose', 'Show detailed progress and errors')
146
+ .option('--config <path>', 'Path to .knowgraph.yml config file', '.knowgraph.yml')
147
+ .action(async (connectors, options) => {
148
+ await runSync(connectors, options);
149
+ });
150
+ }
151
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerValidateCommand(program: Command): void;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsFzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU9D"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: CLI command that validates knowgraph annotations and reports issues
5
+ * owner: knowgraph-cli
6
+ * status: experimental
7
+ * tags: [cli, command, validate, quality]
8
+ * context:
9
+ * business_goal: Help developers find and fix annotation issues before committing
10
+ * domain: cli
11
+ */
12
+ import { resolve } from 'node:path';
13
+ import { statSync } from 'node:fs';
14
+ import chalk from 'chalk';
15
+ import { createValidator } from '@know-graph/core';
16
+ function formatIssueText(issue) {
17
+ const severity = issue.severity === 'error'
18
+ ? chalk.red('[ERROR]')
19
+ : chalk.yellow('[WARN]');
20
+ const location = chalk.cyan(`${issue.filePath}:${issue.line}`);
21
+ const ruleName = chalk.dim(issue.rule);
22
+ return `${location} ${severity} ${ruleName}: ${issue.message}`;
23
+ }
24
+ function printTextOutput(result, strict) {
25
+ for (const issue of result.issues) {
26
+ console.log(formatIssueText(issue));
27
+ }
28
+ console.log('');
29
+ const isFailure = strict
30
+ ? result.errorCount > 0 || result.warningCount > 0
31
+ : result.errorCount > 0;
32
+ const summaryColor = isFailure ? chalk.red : chalk.green;
33
+ console.log(summaryColor(`${result.errorCount} error(s), ${result.warningCount} warning(s) in ${result.fileCount} file(s)`));
34
+ }
35
+ function printJsonOutput(result) {
36
+ console.log(JSON.stringify(result, null, 2));
37
+ }
38
+ function runValidate(targetPath, options) {
39
+ const absPath = resolve(targetPath);
40
+ try {
41
+ statSync(absPath);
42
+ }
43
+ catch {
44
+ console.error(chalk.red(`Error: Path not found: ${absPath}`));
45
+ process.exitCode = 1;
46
+ return;
47
+ }
48
+ try {
49
+ const validator = createValidator();
50
+ const result = validator.validate(absPath, {
51
+ ruleName: options.rule,
52
+ });
53
+ if (options.format === 'json') {
54
+ printJsonOutput(result);
55
+ }
56
+ else {
57
+ printTextOutput(result, options.strict ?? false);
58
+ }
59
+ const hasErrors = result.errorCount > 0;
60
+ const hasWarnings = result.warningCount > 0;
61
+ if (hasErrors || (options.strict && hasWarnings)) {
62
+ process.exitCode = 1;
63
+ }
64
+ }
65
+ catch (err) {
66
+ console.error(chalk.red(`Validation failed: ${err instanceof Error ? err.message : String(err)}`));
67
+ process.exitCode = 1;
68
+ }
69
+ }
70
+ export function registerValidateCommand(program) {
71
+ program
72
+ .command('validate [path]')
73
+ .description('Validate @knowgraph annotations for correctness')
74
+ .option('--strict', 'Treat warnings as errors')
75
+ .option('--format <format>', 'Output format (text|json)', 'text')
76
+ .option('--rule <name>', 'Run only a specific validation rule')
77
+ .action((path, options) => {
78
+ runValidate(path ?? '.', options);
79
+ });
80
+ }
81
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -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":""}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @knowgraph
4
+ * type: module
5
+ * description: CLI entrypoint that registers all commands and parses arguments
6
+ * owner: knowgraph-cli
7
+ * status: stable
8
+ * tags: [cli, entrypoint, commander]
9
+ * context:
10
+ * business_goal: Provide the main knowgraph command-line interface
11
+ * domain: cli
12
+ */
13
+ import { Command } from 'commander';
14
+ import { registerParseCommand, registerIndexCommand, registerQueryCommand, registerServeCommand, registerInitCommand, registerValidateCommand, registerCoverageCommand, registerSuggestCommand, registerHookCommand, registerExportCommand, registerSyncCommand, } from './commands/index.js';
15
+ const program = new Command();
16
+ program
17
+ .name('knowgraph')
18
+ .description('AI-navigable code documentation tool')
19
+ .version('0.4.0');
20
+ registerParseCommand(program);
21
+ registerIndexCommand(program);
22
+ registerQueryCommand(program);
23
+ registerServeCommand(program);
24
+ registerInitCommand(program);
25
+ registerValidateCommand(program);
26
+ registerCoverageCommand(program);
27
+ registerSuggestCommand(program);
28
+ registerHookCommand(program);
29
+ registerExportCommand(program);
30
+ registerSyncCommand(program);
31
+ program.parse();
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function detectLanguages(dir: string): readonly string[];
2
+ export declare function suggestFiles(dir: string): readonly string[];
3
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"AAgFA,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAe9D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CA+D3D"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: Language detection and file suggestion utilities for project initialization
5
+ * owner: knowgraph-cli
6
+ * status: stable
7
+ * tags: [cli, detection, languages, init]
8
+ * context:
9
+ * business_goal: Automatically detect project languages during setup
10
+ * domain: cli
11
+ */
12
+ import { readdirSync, statSync } from 'node:fs';
13
+ import { join, extname } from 'node:path';
14
+ const EXTENSION_TO_LANGUAGE = {
15
+ '.py': 'python',
16
+ '.ts': 'typescript',
17
+ '.tsx': 'typescript',
18
+ '.js': 'javascript',
19
+ '.jsx': 'javascript',
20
+ '.java': 'java',
21
+ '.go': 'go',
22
+ '.rs': 'rust',
23
+ '.rb': 'ruby',
24
+ '.php': 'php',
25
+ '.cs': 'csharp',
26
+ '.cpp': 'cpp',
27
+ '.c': 'c',
28
+ '.swift': 'swift',
29
+ '.kt': 'kotlin',
30
+ };
31
+ const SKIP_DIRS = new Set([
32
+ 'node_modules',
33
+ '.git',
34
+ 'dist',
35
+ 'build',
36
+ '__pycache__',
37
+ '.venv',
38
+ 'venv',
39
+ '.tox',
40
+ 'coverage',
41
+ '.next',
42
+ ]);
43
+ function scanDirectory(dir, extCounts, depth) {
44
+ if (depth > 4)
45
+ return;
46
+ let entries;
47
+ try {
48
+ entries = readdirSync(dir);
49
+ }
50
+ catch {
51
+ return;
52
+ }
53
+ for (const entry of entries) {
54
+ if (entry.startsWith('.') && depth > 0)
55
+ continue;
56
+ if (SKIP_DIRS.has(entry))
57
+ continue;
58
+ const fullPath = join(dir, entry);
59
+ try {
60
+ const stat = statSync(fullPath);
61
+ if (stat.isDirectory()) {
62
+ scanDirectory(fullPath, extCounts, depth + 1);
63
+ }
64
+ else if (stat.isFile()) {
65
+ const ext = extname(entry);
66
+ if (ext && EXTENSION_TO_LANGUAGE[ext]) {
67
+ extCounts.set(ext, (extCounts.get(ext) ?? 0) + 1);
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Skip inaccessible files
73
+ }
74
+ }
75
+ }
76
+ export function detectLanguages(dir) {
77
+ const extCounts = new Map();
78
+ scanDirectory(dir, extCounts, 0);
79
+ const languageCounts = new Map();
80
+ for (const [ext, count] of extCounts) {
81
+ const lang = EXTENSION_TO_LANGUAGE[ext];
82
+ if (lang) {
83
+ languageCounts.set(lang, (languageCounts.get(lang) ?? 0) + count);
84
+ }
85
+ }
86
+ return [...languageCounts.entries()]
87
+ .sort((a, b) => b[1] - a[1])
88
+ .map(([lang]) => lang);
89
+ }
90
+ export function suggestFiles(dir) {
91
+ const suggestions = [];
92
+ const entryPointNames = new Set([
93
+ 'index.ts',
94
+ 'index.js',
95
+ 'main.ts',
96
+ 'main.js',
97
+ 'app.ts',
98
+ 'app.js',
99
+ 'main.py',
100
+ 'app.py',
101
+ '__init__.py',
102
+ 'server.ts',
103
+ 'server.js',
104
+ ]);
105
+ let entries;
106
+ try {
107
+ entries = readdirSync(dir);
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ for (const entry of entries) {
113
+ if (SKIP_DIRS.has(entry) || entry.startsWith('.'))
114
+ continue;
115
+ const fullPath = join(dir, entry);
116
+ try {
117
+ const stat = statSync(fullPath);
118
+ if (stat.isFile()) {
119
+ const ext = extname(entry);
120
+ if (EXTENSION_TO_LANGUAGE[ext]) {
121
+ const isEntryPoint = entryPointNames.has(entry);
122
+ const priority = isEntryPoint ? stat.size + 1_000_000 : stat.size;
123
+ suggestions.push({ path: entry, size: priority });
124
+ }
125
+ }
126
+ else if (stat.isDirectory()) {
127
+ const subEntries = readdirSync(fullPath);
128
+ for (const sub of subEntries) {
129
+ const subExt = extname(sub);
130
+ if (EXTENSION_TO_LANGUAGE[subExt]) {
131
+ const subPath = `${entry}/${sub}`;
132
+ const subStat = statSync(join(fullPath, sub));
133
+ if (subStat.isFile()) {
134
+ const isEntryPoint = entryPointNames.has(sub);
135
+ const priority = isEntryPoint
136
+ ? subStat.size + 1_000_000
137
+ : subStat.size;
138
+ suggestions.push({ path: subPath, size: priority });
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ catch {
145
+ // Skip inaccessible
146
+ }
147
+ }
148
+ return suggestions
149
+ .sort((a, b) => b.size - a.size)
150
+ .slice(0, 10)
151
+ .map((s) => s.path);
152
+ }
153
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @knowgraph
3
+ * type: module
4
+ * description: Output formatting utilities for table and JSON display of query results
5
+ * owner: knowgraph-cli
6
+ * status: stable
7
+ * tags: [cli, formatting, output, table]
8
+ * context:
9
+ * business_goal: Present code graph data in human-readable formats
10
+ * domain: cli
11
+ */
12
+ import type { StoredEntity } from '@know-graph/core';
13
+ export declare function truncate(str: string, maxLen: number): string;
14
+ export declare function formatTable(entities: readonly StoredEntity[]): string;
15
+ export declare function formatJson(data: unknown, pretty: boolean): string;
16
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAOD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CA4BrE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,37 @@
1
+ export function truncate(str, maxLen) {
2
+ if (str.length <= maxLen)
3
+ return str;
4
+ return `${str.slice(0, maxLen - 3)}...`;
5
+ }
6
+ function padRight(str, len) {
7
+ if (str.length >= len)
8
+ return str;
9
+ return str + ' '.repeat(len - str.length);
10
+ }
11
+ export function formatTable(entities) {
12
+ if (entities.length === 0) {
13
+ return 'No results found.';
14
+ }
15
+ const headers = ['Name', 'Type', 'Owner', 'File', 'Description'];
16
+ const rows = entities.map((e) => [
17
+ truncate(e.name, 30),
18
+ e.entityType,
19
+ e.owner ?? '-',
20
+ truncate(e.filePath, 40),
21
+ truncate(e.description, 50),
22
+ ]);
23
+ const colWidths = headers.map((h, i) => {
24
+ const maxData = rows.reduce((max, row) => Math.max(max, row[i].length), 0);
25
+ return Math.max(h.length, maxData);
26
+ });
27
+ const headerLine = headers
28
+ .map((h, i) => padRight(h, colWidths[i]))
29
+ .join(' ');
30
+ const separator = colWidths.map((w) => '-'.repeat(w)).join(' ');
31
+ const dataLines = rows.map((row) => row.map((cell, i) => padRight(cell, colWidths[i])).join(' '));
32
+ return [headerLine, separator, ...dataLines].join('\n');
33
+ }
34
+ export function formatJson(data, pretty) {
35
+ return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
36
+ }
37
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAc;IAClD,IAAI,GAAG,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,GAAG,CAAC;IACrC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAiC;IAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/B,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACpB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,KAAK,IAAI,GAAG;QACd,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACxB,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;KAC5B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SACxC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACjC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9D,CAAC;IAEF,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,MAAe;IACvD,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { formatTable, formatJson, truncate } from './format.js';
2
+ export { detectLanguages, suggestFiles } from './detect.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}