@apart-tech/apart-intelligence 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.
- package/dist/analyzers/python-analyzer.d.ts +3 -0
- package/dist/analyzers/python-analyzer.d.ts.map +1 -0
- package/dist/analyzers/python-analyzer.js +127 -0
- package/dist/analyzers/python-analyzer.js.map +1 -0
- package/dist/analyzers/types.d.ts +18 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +2 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/analyzers/typescript-analyzer.d.ts +3 -0
- package/dist/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/analyzers/typescript-analyzer.js +131 -0
- package/dist/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/api-client/api-provider.d.ts +3 -0
- package/dist/api-client/api-provider.d.ts.map +1 -0
- package/dist/api-client/api-provider.js +85 -0
- package/dist/api-client/api-provider.js.map +1 -0
- package/dist/api-client/credentials.d.ts +6 -0
- package/dist/api-client/credentials.d.ts.map +1 -0
- package/dist/api-client/credentials.js +34 -0
- package/dist/api-client/credentials.js.map +1 -0
- package/dist/api-client/direct-provider.d.ts +3 -0
- package/dist/api-client/direct-provider.d.ts.map +1 -0
- package/dist/api-client/direct-provider.js +149 -0
- package/dist/api-client/direct-provider.js.map +1 -0
- package/dist/api-client/http-client.d.ts +11 -0
- package/dist/api-client/http-client.d.ts.map +1 -0
- package/dist/api-client/http-client.js +37 -0
- package/dist/api-client/http-client.js.map +1 -0
- package/dist/api-client/index.d.ts +5 -0
- package/dist/api-client/index.d.ts.map +1 -0
- package/dist/api-client/index.js +12 -0
- package/dist/api-client/index.js.map +1 -0
- package/dist/api-client/types.d.ts +93 -0
- package/dist/api-client/types.d.ts.map +1 -0
- package/dist/api-client/types.js +2 -0
- package/dist/api-client/types.js.map +1 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +50 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +40 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +45 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/domains.d.ts +3 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +61 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/drafts.d.ts +3 -0
- package/dist/commands/drafts.d.ts.map +1 -0
- package/dist/commands/drafts.js +29 -0
- package/dist/commands/drafts.js.map +1 -0
- package/dist/commands/duplicates.d.ts +3 -0
- package/dist/commands/duplicates.d.ts.map +1 -0
- package/dist/commands/duplicates.js +39 -0
- package/dist/commands/duplicates.js.map +1 -0
- package/dist/commands/get.d.ts +3 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +43 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +368 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +61 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +336 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/islands.d.ts +3 -0
- package/dist/commands/islands.d.ts.map +1 -0
- package/dist/commands/islands.js +70 -0
- package/dist/commands/islands.js.map +1 -0
- package/dist/commands/link.d.ts +3 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +40 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +72 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +18 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/map.d.ts +3 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +127 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/normalize.d.ts +3 -0
- package/dist/commands/normalize.d.ts.map +1 -0
- package/dist/commands/normalize.js +67 -0
- package/dist/commands/normalize.js.map +1 -0
- package/dist/commands/orphans.d.ts +3 -0
- package/dist/commands/orphans.d.ts.map +1 -0
- package/dist/commands/orphans.js +36 -0
- package/dist/commands/orphans.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +44 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +25 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/suggest-links.d.ts +3 -0
- package/dist/commands/suggest-links.d.ts.map +1 -0
- package/dist/commands/suggest-links.js +44 -0
- package/dist/commands/suggest-links.js.map +1 -0
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +30 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +55 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +79 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +21 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { resolve, basename } from "path";
|
|
2
|
+
import { existsSync } from "fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
5
|
+
import { analyzeTypeScriptProject } from "../analyzers/typescript-analyzer.js";
|
|
6
|
+
import { analyzePythonProject } from "../analyzers/python-analyzer.js";
|
|
7
|
+
export function mapCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command("map")
|
|
10
|
+
.description("Map a codebase into the knowledge graph")
|
|
11
|
+
.argument("[directory]", "Project root directory", ".")
|
|
12
|
+
.option("--by <creator>", "Creator identifier", "tc-map")
|
|
13
|
+
.option("-d, --domain <slug>", "Domain slug to assign nodes to")
|
|
14
|
+
.option("--dry-run", "Analyze without creating nodes")
|
|
15
|
+
.option("--exclude <patterns>", "Comma-separated patterns to exclude")
|
|
16
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
17
|
+
.action(async (directory, opts) => {
|
|
18
|
+
const projectRoot = resolve(directory);
|
|
19
|
+
if (!existsSync(projectRoot)) {
|
|
20
|
+
console.error(chalk.red(`Directory not found: ${projectRoot}`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const services = loadServiceProvider();
|
|
24
|
+
// Resolve domain
|
|
25
|
+
let domainId;
|
|
26
|
+
if (opts.domain) {
|
|
27
|
+
const domain = await services.domains.getBySlug(opts.domain);
|
|
28
|
+
if (!domain) {
|
|
29
|
+
console.error(chalk.red(`Domain not found: ${opts.domain}`));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
domainId = domain.id;
|
|
33
|
+
}
|
|
34
|
+
const exclude = opts.exclude?.split(",").map((s) => s.trim()) ?? [];
|
|
35
|
+
// Detect language and analyze
|
|
36
|
+
const language = detectLanguage(projectRoot);
|
|
37
|
+
console.log(chalk.dim(`Detected: ${language}`));
|
|
38
|
+
let analyses;
|
|
39
|
+
try {
|
|
40
|
+
if (language === "typescript") {
|
|
41
|
+
analyses = analyzeTypeScriptProject(projectRoot, exclude);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
analyses = analyzePythonProject(projectRoot, exclude);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error(chalk.red(`Analysis failed: ${err.message}`));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
console.log(chalk.dim(`Found ${analyses.length} source files`));
|
|
52
|
+
if (analyses.length === 0) {
|
|
53
|
+
console.log(chalk.yellow("No source files found."));
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
// Dry run — just print the analysis
|
|
57
|
+
if (opts.dryRun) {
|
|
58
|
+
printDryRun(analyses, opts.format);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
// Upload analysis results
|
|
62
|
+
const projectName = basename(projectRoot);
|
|
63
|
+
const result = await services.map.upload({
|
|
64
|
+
analyses,
|
|
65
|
+
projectName,
|
|
66
|
+
createdBy: opts.by,
|
|
67
|
+
domainId,
|
|
68
|
+
});
|
|
69
|
+
// Summary
|
|
70
|
+
if (opts.format === "json") {
|
|
71
|
+
console.log(JSON.stringify({
|
|
72
|
+
language,
|
|
73
|
+
projectRoot,
|
|
74
|
+
filesAnalyzed: analyses.length,
|
|
75
|
+
nodesCreated: result.nodesCreated,
|
|
76
|
+
nodesUpdated: result.nodesUpdated,
|
|
77
|
+
edgesCreated: result.edgesCreated,
|
|
78
|
+
}, null, 2));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
console.log();
|
|
82
|
+
console.log(chalk.green("✓ Project mapped"));
|
|
83
|
+
console.log(` Language: ${chalk.cyan(language)}`);
|
|
84
|
+
console.log(` Files: ${chalk.cyan(String(analyses.length))}`);
|
|
85
|
+
console.log(` Nodes: ${chalk.cyan(String(result.nodesCreated))} created, ${chalk.cyan(String(result.nodesUpdated))} updated`);
|
|
86
|
+
console.log(` Edges: ${chalk.cyan(String(result.edgesCreated))} import relationships`);
|
|
87
|
+
}
|
|
88
|
+
process.exit(0);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function detectLanguage(root) {
|
|
92
|
+
if (existsSync(resolve(root, "tsconfig.json")))
|
|
93
|
+
return "typescript";
|
|
94
|
+
if (existsSync(resolve(root, "setup.py")) || existsSync(resolve(root, "pyproject.toml")))
|
|
95
|
+
return "python";
|
|
96
|
+
// Fallback: check for .py or .ts files
|
|
97
|
+
if (existsSync(resolve(root, "requirements.txt")))
|
|
98
|
+
return "python";
|
|
99
|
+
return "typescript";
|
|
100
|
+
}
|
|
101
|
+
function printDryRun(analyses, format) {
|
|
102
|
+
if (format === "json") {
|
|
103
|
+
console.log(JSON.stringify(analyses, null, 2));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
console.log();
|
|
107
|
+
for (const file of analyses) {
|
|
108
|
+
console.log(chalk.bold(file.relativePath));
|
|
109
|
+
if (file.exports.length > 0) {
|
|
110
|
+
console.log(chalk.dim(" exports: ") +
|
|
111
|
+
file.exports.map((e) => `${e.kind} ${e.name}`).join(", "));
|
|
112
|
+
}
|
|
113
|
+
const internal = file.imports.filter((i) => i.resolvedPath);
|
|
114
|
+
if (internal.length > 0) {
|
|
115
|
+
console.log(chalk.dim(" imports: ") +
|
|
116
|
+
internal.map((i) => i.resolvedPath).join(", "));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const totalExports = analyses.reduce((n, a) => n + a.exports.length, 0);
|
|
120
|
+
const totalEdges = analyses.reduce((n, a) => n + a.imports.filter((i) => i.resolvedPath).length, 0);
|
|
121
|
+
console.log();
|
|
122
|
+
console.log(chalk.dim("Dry run summary:"));
|
|
123
|
+
console.log(` ${analyses.length} files → ${analyses.length} nodes`);
|
|
124
|
+
console.log(` ${totalExports} exports`);
|
|
125
|
+
console.log(` ${totalEdges} internal import edges`);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/commands/map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAiGhD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, getTenantDb, CleaningService, EdgeService, createEmbeddingProvider, } from "@apart-tech/intelligence-core";
|
|
3
|
+
import { resolveTenant } from "../utils.js";
|
|
4
|
+
export function normalizeCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("normalize")
|
|
7
|
+
.description("Analyze and normalize relationship types")
|
|
8
|
+
.option("-s, --min-similarity <n>", "Minimum similarity to suggest merge", "0.7")
|
|
9
|
+
.option("--apply <mapping>", 'Apply a rename: "old-type:new-type"')
|
|
10
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
const tenant = resolveTenant(config);
|
|
14
|
+
const db = getTenantDb(config.database.url, tenant);
|
|
15
|
+
const edgeService = new EdgeService(db);
|
|
16
|
+
// Apply mode: rename a relationship type
|
|
17
|
+
if (opts.apply) {
|
|
18
|
+
const [fromType, toType] = opts.apply.split(":");
|
|
19
|
+
if (!fromType || !toType) {
|
|
20
|
+
console.error(chalk.red('Invalid mapping format. Use "old-type:new-type"'));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const count = await edgeService.retypeMany(fromType, toType);
|
|
24
|
+
if (opts.format === "json") {
|
|
25
|
+
console.log(JSON.stringify({ fromType, toType, count }));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (count === 0) {
|
|
29
|
+
console.log(chalk.yellow(`No edges found with type "${fromType}".`));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(chalk.green(`✓ Renamed ${count} edge(s): "${fromType}" → "${toType}"`));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
// Analysis mode: suggest normalizations
|
|
38
|
+
const cleaning = new CleaningService(db, tenant);
|
|
39
|
+
const embeddings = createEmbeddingProvider(config);
|
|
40
|
+
const report = await cleaning.analyzeRelationshipTypes(embeddings, {
|
|
41
|
+
minSimilarity: parseFloat(opts.minSimilarity),
|
|
42
|
+
});
|
|
43
|
+
if (opts.format === "json") {
|
|
44
|
+
console.log(JSON.stringify(report, null, 2));
|
|
45
|
+
process.exit(0);
|
|
46
|
+
}
|
|
47
|
+
// Show current vocabulary
|
|
48
|
+
console.log(chalk.bold.underline("\nRelationship Type Vocabulary\n"));
|
|
49
|
+
for (const t of report.allTypes) {
|
|
50
|
+
const bar = "█".repeat(Math.min(t.count, 40));
|
|
51
|
+
console.log(` ${chalk.cyan(t.relationshipType.padEnd(20))} ${String(t.count).padStart(4)} ${chalk.dim(bar)}`);
|
|
52
|
+
}
|
|
53
|
+
// Show suggestions
|
|
54
|
+
if (report.suggestions.length === 0) {
|
|
55
|
+
console.log(chalk.green("\nNo merge suggestions — vocabulary looks clean.\n"));
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
console.log(chalk.bold("\nSuggested merges:\n"));
|
|
59
|
+
for (const s of report.suggestions) {
|
|
60
|
+
const pct = (s.similarity * 100).toFixed(0);
|
|
61
|
+
console.log(` ${chalk.magenta(`${pct}%`)} similar: ${chalk.yellow(s.fromType)} (${s.fromCount}) → ${chalk.green(s.toType)} (${s.toCount})`);
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk.dim('\nTo apply: tc normalize --apply "old-type:new-type"\n'));
|
|
64
|
+
process.exit(0);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/commands/normalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphans.d.ts","sourceRoot":"","sources":["../../src/commands/orphans.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QA4C9C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, getTenantDb, CleaningService } from "@apart-tech/intelligence-core";
|
|
3
|
+
import { resolveTenant } from "../utils.js";
|
|
4
|
+
export function orphansCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("orphans")
|
|
7
|
+
.description("Find nodes with no connections")
|
|
8
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
9
|
+
.action(async (opts) => {
|
|
10
|
+
const config = loadConfig();
|
|
11
|
+
const tenant = resolveTenant(config);
|
|
12
|
+
const db = getTenantDb(config.database.url, tenant);
|
|
13
|
+
const cleaning = new CleaningService(db, tenant);
|
|
14
|
+
const orphans = await cleaning.findOrphans();
|
|
15
|
+
if (opts.format === "json") {
|
|
16
|
+
console.log(JSON.stringify(orphans, null, 2));
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
if (orphans.length === 0) {
|
|
20
|
+
console.log(chalk.green("No orphan nodes found. All nodes are connected."));
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
console.log(chalk.bold(`Found ${chalk.red(orphans.length)} orphan node(s):\n`));
|
|
24
|
+
for (const { node } of orphans) {
|
|
25
|
+
const statusColor = node.status === "approved" ? chalk.green : chalk.yellow;
|
|
26
|
+
const age = daysSince(node.createdAt);
|
|
27
|
+
console.log(` ${chalk.dim(node.id.slice(0, 8))} ${statusColor(`[${node.status}]`)} ${chalk.cyan(node.type)} ${node.title} ${chalk.dim(`${age}d ago`)}`);
|
|
28
|
+
}
|
|
29
|
+
console.log(chalk.dim("\nUse 'tc delete <id>' to remove or 'tc link <source> <target>' to connect.\n"));
|
|
30
|
+
process.exit(0);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function daysSince(date) {
|
|
34
|
+
return Math.floor((Date.now() - new Date(date).getTime()) / (1000 * 60 * 60 * 24));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=orphans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orphans.js","sourceRoot":"","sources":["../../src/commands/orphans.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE7C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CACnE,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,WAAW,GACf,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAC1D,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE,CAChJ,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,+EAA+E,CAChF,CACF,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,SAAS,CAAC,IAAU;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -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;AAIpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QA6C7C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
export function searchCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("search")
|
|
6
|
+
.description("Search the knowledge graph")
|
|
7
|
+
.argument("<query>", "Search query")
|
|
8
|
+
.option("-l, --limit <n>", "Max results", "10")
|
|
9
|
+
.option("-t, --type <type>", "Filter by node type")
|
|
10
|
+
.option("--include-drafts", "Include draft nodes")
|
|
11
|
+
.option("-d, --domain <slug>", "Filter by domain slug")
|
|
12
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
13
|
+
.action(async (query, opts) => {
|
|
14
|
+
const services = loadServiceProvider();
|
|
15
|
+
let domainIds;
|
|
16
|
+
if (opts.domain) {
|
|
17
|
+
domainIds = await services.domains.resolveSlugs([opts.domain]);
|
|
18
|
+
}
|
|
19
|
+
const results = await services.search.search({
|
|
20
|
+
query,
|
|
21
|
+
limit: parseInt(opts.limit),
|
|
22
|
+
types: opts.type ? [opts.type] : undefined,
|
|
23
|
+
includeDrafts: opts.includeDrafts,
|
|
24
|
+
domainIds,
|
|
25
|
+
});
|
|
26
|
+
if (opts.format === "json") {
|
|
27
|
+
console.log(JSON.stringify(results, null, 2));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
if (results.length === 0) {
|
|
31
|
+
console.log(chalk.yellow("No results found."));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(chalk.bold(`Found ${results.length} results:\n`));
|
|
35
|
+
for (const r of results) {
|
|
36
|
+
const statusColor = r.node.status === "approved" ? chalk.green : chalk.yellow;
|
|
37
|
+
console.log(` ${chalk.dim(r.node.id.slice(0, 8))} ${statusColor(`[${r.node.status}]`)} ${chalk.cyan(r.node.type)} ${r.node.title}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
process.exit(0);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# 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,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;SACjD,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;SACtD,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QAEvC,IAAI,SAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3C,KAAK;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;gBAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,MAAM,WAAW,GACf,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC5D,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAC3H,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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;AAKpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QA0B7C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
export function statusCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("status")
|
|
6
|
+
.description("Update a node's status")
|
|
7
|
+
.argument("<id>", "Node ID")
|
|
8
|
+
.argument("<status>", "New status: draft, reviewed, approved, archived")
|
|
9
|
+
.action(async (id, status) => {
|
|
10
|
+
const validStatuses = ["draft", "reviewed", "approved", "archived"];
|
|
11
|
+
if (!validStatuses.includes(status)) {
|
|
12
|
+
console.error(chalk.red(`Invalid status. Must be one of: ${validStatuses.join(", ")}`));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const services = loadServiceProvider();
|
|
16
|
+
const node = await services.nodes.setStatus(id, status);
|
|
17
|
+
if (!node) {
|
|
18
|
+
console.error(chalk.red(`Node not found: ${id}`));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.green(`✓ ${node.title} → ${status}`));
|
|
22
|
+
process.exit(0);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# 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;AAE1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC3B,QAAQ,CAAC,UAAU,EAAE,iDAAiD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,MAAc,EAAE,EAAE;QAC3C,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,mCAAmC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACzE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QAEvC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,MAAoB,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-links.d.ts","sourceRoot":"","sources":["../../src/commands/suggest-links.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QAkEnD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, getTenantDb, CleaningService } from "@apart-tech/intelligence-core";
|
|
3
|
+
import { resolveTenant } from "../utils.js";
|
|
4
|
+
export function suggestLinksCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("suggest-links")
|
|
7
|
+
.description("Suggest missing links based on embedding similarity")
|
|
8
|
+
.argument("[nodeId]", "Node ID to suggest links for (omit for global scan)")
|
|
9
|
+
.option("-s, --min-similarity <n>", "Minimum cosine similarity", "0.8")
|
|
10
|
+
.option("-l, --limit <n>", "Max suggestions", "10")
|
|
11
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
12
|
+
.action(async (nodeId, opts) => {
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
const tenant = resolveTenant(config);
|
|
15
|
+
const db = getTenantDb(config.database.url, tenant);
|
|
16
|
+
const cleaning = new CleaningService(db, tenant);
|
|
17
|
+
const minSimilarity = parseFloat(opts.minSimilarity);
|
|
18
|
+
const limit = parseInt(opts.limit);
|
|
19
|
+
const suggestions = nodeId
|
|
20
|
+
? await cleaning.suggestLinksForNode(nodeId, { limit, minSimilarity })
|
|
21
|
+
: await cleaning.suggestLinksGlobal({ limit, minSimilarity });
|
|
22
|
+
if (opts.format === "json") {
|
|
23
|
+
console.log(JSON.stringify(suggestions, null, 2));
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
if (suggestions.length === 0) {
|
|
27
|
+
console.log(chalk.green(`No link suggestions found above ${minSimilarity} similarity.`));
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
const label = nodeId
|
|
31
|
+
? `Suggested links for ${chalk.cyan(nodeId.slice(0, 8))}`
|
|
32
|
+
: "Suggested links (global scan)";
|
|
33
|
+
console.log(chalk.bold(`\n${label} — ${suggestions.length} suggestion(s):\n`));
|
|
34
|
+
for (const { source, target, similarity } of suggestions) {
|
|
35
|
+
const pct = (similarity * 100).toFixed(1);
|
|
36
|
+
console.log(` ${chalk.magenta(`${pct}%`)} ${chalk.dim(source.id.slice(0, 8))} ${chalk.cyan(source.type)} ${source.title}`);
|
|
37
|
+
console.log(` → ${chalk.dim(target.id.slice(0, 8))} ${chalk.cyan(target.type)} ${target.title}`);
|
|
38
|
+
console.log();
|
|
39
|
+
}
|
|
40
|
+
console.log(chalk.dim("Use 'tc link <source-id> <target-id> -r relates-to' to create a link.\n"));
|
|
41
|
+
process.exit(0);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=suggest-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-links.js","sourceRoot":"","sources":["../../src/commands/suggest-links.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,qDAAqD,CAAC;SAClE,QAAQ,CAAC,UAAU,EAAE,qDAAqD,CAAC;SAC3E,MAAM,CACL,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,CACN;SACA,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;SAClD,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAI,EAAE,EAAE;QACjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,MAAM,WAAW,GAAG,MAAM;YACxB,CAAC,CAAC,MAAM,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YACtE,CAAC,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,mCAAmC,aAAa,cAAc,CAC/D,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM;YAClB,CAAC,CAAC,uBAAuB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACzD,CAAC,CAAC,+BAA+B,CAAC;QAEpC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,WAAW,CAAC,MAAM,mBAAmB,CAAC,CAClE,CAAC;QAEF,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,WAAW,EAAE,CAAC;YACzD,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAChH,CAAC;YACF,OAAO,CAAC,GAAG,CACT,SAAS,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CACvF,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,yEAAyE,CAC1E,CACF,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,QA8B5C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
export function typesCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("types")
|
|
6
|
+
.description("List all node types and relationship types in use")
|
|
7
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
const services = loadServiceProvider();
|
|
10
|
+
const [nodeTypes, edgeTypes] = await Promise.all([
|
|
11
|
+
services.nodes.listTypes(),
|
|
12
|
+
services.edges.listRelationshipTypes(),
|
|
13
|
+
]);
|
|
14
|
+
if (opts.format === "json") {
|
|
15
|
+
console.log(JSON.stringify({ nodeTypes, edgeTypes }, null, 2));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.log(chalk.bold("Node types:"));
|
|
19
|
+
for (const t of nodeTypes) {
|
|
20
|
+
console.log(` ${chalk.cyan(t.type)} ${chalk.dim(`(${t.count})`)}`);
|
|
21
|
+
}
|
|
22
|
+
console.log(chalk.bold("\nRelationship types:"));
|
|
23
|
+
for (const t of edgeTypes) {
|
|
24
|
+
console.log(` ${chalk.cyan(t.relationshipType)} ${chalk.dim(`(${t.count})`)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
process.exit(0);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;QAEvC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/C,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE;YAC1B,QAAQ,CAAC,KAAK,CAAC,qBAAqB,EAAE;SACvC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CACpE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QAqD7C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
export function updateCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("update")
|
|
6
|
+
.description("Update an existing node")
|
|
7
|
+
.argument("<id>", "Node ID")
|
|
8
|
+
.option("--title <title>", "New title")
|
|
9
|
+
.option("--content <content>", "New content")
|
|
10
|
+
.option("-t, --type <type>", "New node type")
|
|
11
|
+
.option("-m, --metadata <json>", "New JSON metadata (replaces existing)")
|
|
12
|
+
.option("-d, --domain <slug>", "New domain slug")
|
|
13
|
+
.option("-f, --format <format>", "Output format: text, json", "text")
|
|
14
|
+
.action(async (id, opts) => {
|
|
15
|
+
if (!opts.title && !opts.content && !opts.type && !opts.metadata && !opts.domain) {
|
|
16
|
+
console.error(chalk.red("Nothing to update. Provide at least one of: --title, --content, -t, -m, -d"));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const services = loadServiceProvider();
|
|
20
|
+
const input = {};
|
|
21
|
+
if (opts.title)
|
|
22
|
+
input.title = opts.title;
|
|
23
|
+
if (opts.content)
|
|
24
|
+
input.content = opts.content;
|
|
25
|
+
if (opts.type)
|
|
26
|
+
input.type = opts.type;
|
|
27
|
+
if (opts.metadata)
|
|
28
|
+
input.metadata = JSON.parse(opts.metadata);
|
|
29
|
+
if (opts.domain) {
|
|
30
|
+
const domain = await services.domains.getBySlug(opts.domain);
|
|
31
|
+
if (!domain) {
|
|
32
|
+
console.error(chalk.red(`Domain not found: ${opts.domain}`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
input.domainId = domain.id;
|
|
36
|
+
}
|
|
37
|
+
const node = await services.nodes.update(id, input);
|
|
38
|
+
if (!node) {
|
|
39
|
+
console.error(chalk.red(`Node not found: ${id}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
if (opts.format === "json") {
|
|
43
|
+
console.log(JSON.stringify(node, null, 2));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(chalk.green("✓ Node updated"));
|
|
47
|
+
console.log(` ID: ${node.id}`);
|
|
48
|
+
console.log(` Title: ${node.title}`);
|
|
49
|
+
console.log(` Type: ${node.type}`);
|
|
50
|
+
console.log(` Version: ${node.version}`);
|
|
51
|
+
}
|
|
52
|
+
process.exit(0);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAwH/C"}
|