@apart-tech/apart-intelligence 1.1.5 → 1.1.7
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/commands/duplicates.js +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +76 -33
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/normalize.js +1 -1
- package/dist/commands/orphans.js +1 -1
- package/dist/commands/suggest-links.js +1 -1
- package/dist/commands/validate.js +1 -1
- package/package.json +1 -1
|
@@ -28,7 +28,7 @@ export function duplicatesCommand(program) {
|
|
|
28
28
|
console.log(` B: ${chalk.dim(nodeB.id.slice(0, 8))} ${chalk.cyan(nodeB.type)} ${nodeB.title}`);
|
|
29
29
|
console.log();
|
|
30
30
|
}
|
|
31
|
-
console.log(chalk.dim("Review pairs and use '
|
|
31
|
+
console.log(chalk.dim("Review pairs and use 'ai delete <id>' to remove duplicates.\n"));
|
|
32
32
|
process.exit(0);
|
|
33
33
|
});
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,QAgH7C"}
|
package/dist/commands/health.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { loadServiceProvider } from "../api-client/index.js";
|
|
3
|
+
const CODE_TYPES = new Set(["method", "function", "module", "class", "interface", "enum", "type", "variable", "constant"]);
|
|
4
|
+
const TOP_EDGE_TYPES = 10;
|
|
3
5
|
export function healthCommand(program) {
|
|
4
6
|
program
|
|
5
7
|
.command("health")
|
|
@@ -13,44 +15,85 @@ export function healthCommand(program) {
|
|
|
13
15
|
console.log(JSON.stringify(report, null, 2));
|
|
14
16
|
process.exit(0);
|
|
15
17
|
}
|
|
16
|
-
// ──
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
// ── Score ──────────────────────────────────────────
|
|
19
|
+
const codeNodeCount = report.nodes.byType
|
|
20
|
+
.filter((t) => CODE_TYPES.has(t.type))
|
|
21
|
+
.reduce((sum, t) => sum + t.count, 0);
|
|
22
|
+
const knowledgeNodeCount = report.nodes.total - codeNodeCount;
|
|
23
|
+
const undomainedKnowledge = Math.max(0, report.nodes.undomainedCount - codeNodeCount);
|
|
24
|
+
const issues = [];
|
|
25
|
+
if (report.nodes.orphanCount > 0)
|
|
26
|
+
issues.push({ severity: "warn", label: "Orphan nodes (no edges)", count: report.nodes.orphanCount, hint: "ai orphans" });
|
|
27
|
+
if (undomainedKnowledge > 0)
|
|
28
|
+
issues.push({ severity: "info", label: "Knowledge nodes without a domain", count: undomainedKnowledge, hint: "ai domains" });
|
|
29
|
+
if (report.nodes.staleCount > 0)
|
|
30
|
+
issues.push({ severity: "info", label: `Stale nodes (>${opts.staleDays} days)`, count: report.nodes.staleCount, hint: "ai search --status approved" });
|
|
31
|
+
if (report.edges.selfLoopCount > 0)
|
|
32
|
+
issues.push({ severity: "warn", label: "Self-loop edges", count: report.edges.selfLoopCount, hint: "ai validate" });
|
|
33
|
+
if (report.edges.duplicateCount > 0)
|
|
34
|
+
issues.push({ severity: "warn", label: "Duplicate edges", count: report.edges.duplicateCount, hint: "ai validate" });
|
|
35
|
+
if (report.duplicateCandidates > 0)
|
|
36
|
+
issues.push({ severity: "warn", label: "Possible duplicate nodes", count: report.duplicateCandidates, hint: "ai duplicates" });
|
|
37
|
+
// Count rare edge types (1-2 uses) that might need normalizing
|
|
38
|
+
const rareEdgeTypes = report.edges.byRelationshipType.filter((r) => r.count <= 2);
|
|
39
|
+
if (rareEdgeTypes.length > 3)
|
|
40
|
+
issues.push({ severity: "info", label: "Rare edge types (possible typos)", count: rareEdgeTypes.length, hint: "ai normalize" });
|
|
41
|
+
// Score relative to graph size — a handful of issues in a large graph is fine
|
|
42
|
+
const totalItems = report.nodes.total + report.edges.total;
|
|
43
|
+
const warnItems = issues
|
|
44
|
+
.filter((i) => i.severity === "warn")
|
|
45
|
+
.reduce((sum, i) => sum + i.count, 0);
|
|
46
|
+
const warnRatio = totalItems > 0 ? warnItems / totalItems : 0;
|
|
47
|
+
const grade = warnRatio === 0 ? "Healthy" : warnRatio < 0.01 ? "Good" : warnRatio < 0.05 ? "Needs attention" : "Unhealthy";
|
|
48
|
+
const gradeColor = warnRatio < 0.01 ? chalk.green : warnRatio < 0.05 ? chalk.yellow : chalk.red;
|
|
49
|
+
const gradeIcon = warnRatio < 0.01 ? "✔" : warnRatio < 0.05 ? "●" : "✘";
|
|
50
|
+
// ── Header ─────────────────────────────────────────
|
|
51
|
+
console.log(chalk.bold.underline("\nGraph Health Report"));
|
|
52
|
+
console.log(`\n ${gradeColor(gradeIcon)} ${gradeColor.bold(grade)}`);
|
|
53
|
+
console.log();
|
|
54
|
+
// ── Nodes ──────────────────────────────────────────
|
|
55
|
+
console.log(chalk.bold(" Nodes"));
|
|
56
|
+
console.log(` Total ${chalk.cyan(report.nodes.total)}`);
|
|
57
|
+
if (codeNodeCount > 0)
|
|
58
|
+
console.log(` Code ${chalk.cyan(codeNodeCount)} ${chalk.dim("(mapped from codebase)")}`);
|
|
59
|
+
if (knowledgeNodeCount > 0)
|
|
60
|
+
console.log(` Knowledge ${chalk.cyan(knowledgeNodeCount)}`);
|
|
20
61
|
for (const s of report.nodes.byStatus) {
|
|
21
62
|
const color = s.status === "approved" ? chalk.green : s.status === "archived" ? chalk.dim : chalk.yellow;
|
|
22
|
-
console.log(`
|
|
63
|
+
console.log(` ${color(s.status)} ${chalk.dim(String(s.count))}`);
|
|
23
64
|
}
|
|
24
|
-
|
|
25
|
-
console.log(
|
|
26
|
-
|
|
27
|
-
|
|
65
|
+
// ── Edges ──────────────────────────────────────────
|
|
66
|
+
console.log(chalk.bold("\n Edges"));
|
|
67
|
+
console.log(` Total ${chalk.cyan(report.edges.total)}`);
|
|
68
|
+
const sortedEdges = [...report.edges.byRelationshipType].sort((a, b) => b.count - a.count);
|
|
69
|
+
const topEdges = sortedEdges.slice(0, TOP_EDGE_TYPES);
|
|
70
|
+
const restEdges = sortedEdges.slice(TOP_EDGE_TYPES);
|
|
71
|
+
const restCount = restEdges.reduce((sum, r) => sum + r.count, 0);
|
|
72
|
+
for (const r of topEdges) {
|
|
73
|
+
const bar = "█".repeat(Math.min(Math.ceil(r.count / Math.max(1, sortedEdges[0].count) * 20), 20));
|
|
74
|
+
console.log(` ${chalk.cyan(r.relationshipType.padEnd(18))} ${String(r.count).padStart(5)} ${chalk.dim(bar)}`);
|
|
75
|
+
}
|
|
76
|
+
if (restEdges.length > 0) {
|
|
77
|
+
console.log(` ${chalk.dim(`+ ${restEdges.length} more types`.padEnd(18))} ${chalk.dim(String(restCount).padStart(5))}`);
|
|
28
78
|
}
|
|
29
|
-
// ──
|
|
30
|
-
console.log(chalk.bold("\
|
|
31
|
-
console.log(`
|
|
32
|
-
|
|
33
|
-
|
|
79
|
+
// ── Structure ──────────────────────────────────────
|
|
80
|
+
console.log(chalk.bold("\n Structure"));
|
|
81
|
+
console.log(` Avg edges/node ${chalk.cyan(report.graph.avgEdgesPerNode)}`);
|
|
82
|
+
console.log(` Components ${chalk.cyan(report.graph.connectedComponents)}`);
|
|
83
|
+
console.log(` Largest ${chalk.cyan(report.graph.largestComponentSize)} nodes`);
|
|
84
|
+
// ── Issues ─────────────────────────────────────────
|
|
85
|
+
if (issues.length === 0) {
|
|
86
|
+
console.log(chalk.green("\n No issues found — your graph is in great shape.\n"));
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
console.log(chalk.bold("\n Issues\n"));
|
|
90
|
+
for (const issue of issues) {
|
|
91
|
+
const color = issue.severity === "warn" ? chalk.yellow : chalk.dim;
|
|
92
|
+
const icon = issue.severity === "warn" ? chalk.yellow("▲") : chalk.dim("○");
|
|
93
|
+
console.log(` ${icon} ${color(`${issue.label}:`)} ${issue.count}`);
|
|
94
|
+
console.log(` ${chalk.dim(`→ ${issue.hint}`)}`);
|
|
34
95
|
}
|
|
35
|
-
|
|
36
|
-
console.log(chalk.bold("\nGraph Structure"));
|
|
37
|
-
console.log(` Avg edges/node: ${chalk.cyan(report.graph.avgEdgesPerNode)}`);
|
|
38
|
-
console.log(` Connected components: ${chalk.cyan(report.graph.connectedComponents)}`);
|
|
39
|
-
console.log(` Largest component: ${chalk.cyan(report.graph.largestComponentSize)} nodes`);
|
|
40
|
-
// ── Issues ──────────────────────────────────────
|
|
41
|
-
console.log(chalk.bold("\nIssues"));
|
|
42
|
-
const warn = (label, count) => {
|
|
43
|
-
const color = count > 0 ? chalk.red : chalk.green;
|
|
44
|
-
const icon = count > 0 ? "!" : "✓";
|
|
45
|
-
console.log(` ${color(icon)} ${label}: ${color(count)}`);
|
|
46
|
-
};
|
|
47
|
-
warn("Orphan nodes (no edges)", report.nodes.orphanCount);
|
|
48
|
-
warn("Undomained nodes", report.nodes.undomainedCount);
|
|
49
|
-
warn(`Stale nodes (>${opts.staleDays} days)`, report.nodes.staleCount);
|
|
50
|
-
warn("Self-loop edges", report.edges.selfLoopCount);
|
|
51
|
-
warn("Duplicate edges", report.edges.duplicateCount);
|
|
52
|
-
warn("Duplicate node candidates", report.duplicateCandidates);
|
|
53
|
-
console.log(chalk.dim("\nRun 'tc orphans' or 'tc duplicates' to investigate issues.\n"));
|
|
96
|
+
console.log();
|
|
54
97
|
process.exit(0);
|
|
55
98
|
});
|
|
56
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.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,0CAA0C,CAAC;SACvD,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,IAAI,CAAC;SAC1E,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,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAEjF,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,7 +54,7 @@ export function normalizeCommand(program) {
|
|
|
54
54
|
const pct = (s.similarity * 100).toFixed(0);
|
|
55
55
|
console.log(` ${chalk.magenta(`${pct}%`)} similar: ${chalk.yellow(s.fromType)} (${s.fromCount}) → ${chalk.green(s.toType)} (${s.toCount})`);
|
|
56
56
|
}
|
|
57
|
-
console.log(chalk.dim('\nTo apply:
|
|
57
|
+
console.log(chalk.dim('\nTo apply: ai normalize --apply "old-type:new-type"\n'));
|
|
58
58
|
process.exit(0);
|
|
59
59
|
});
|
|
60
60
|
}
|
package/dist/commands/orphans.js
CHANGED
|
@@ -22,7 +22,7 @@ export function orphansCommand(program) {
|
|
|
22
22
|
const age = daysSince(node.createdAt);
|
|
23
23
|
console.log(` ${chalk.dim(node.id.slice(0, 8))} ${statusColor(`[${node.status}]`)} ${chalk.cyan(node.type)} ${node.title} ${chalk.dim(`${age}d ago`)}`);
|
|
24
24
|
}
|
|
25
|
-
console.log(chalk.dim("\nUse '
|
|
25
|
+
console.log(chalk.dim("\nUse 'ai delete <id>' to remove or 'ai link <source> <target>' to connect.\n"));
|
|
26
26
|
process.exit(0);
|
|
27
27
|
});
|
|
28
28
|
}
|
|
@@ -35,7 +35,7 @@ export function suggestLinksCommand(program) {
|
|
|
35
35
|
console.log(` → ${chalk.dim(target.id.slice(0, 8))} ${chalk.cyan(target.type)} ${target.title}`);
|
|
36
36
|
console.log();
|
|
37
37
|
}
|
|
38
|
-
console.log(chalk.dim("Use '
|
|
38
|
+
console.log(chalk.dim("Use 'ai link <source-id> <target-id> -r relates-to' to create a link.\n"));
|
|
39
39
|
process.exit(0);
|
|
40
40
|
});
|
|
41
41
|
}
|
|
@@ -68,7 +68,7 @@ export function validateCommand(program) {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
console.log(chalk.dim("\nUse '
|
|
71
|
+
console.log(chalk.dim("\nUse 'ai delete <id>' on edge IDs to remove problematic edges.\n"));
|
|
72
72
|
process.exit(0);
|
|
73
73
|
});
|
|
74
74
|
}
|