@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 @@
|
|
|
1
|
+
{"version":3,"file":"python-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/python-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,YAAY,CAAC;AAQvE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,EAAE,CAGhB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync, existsSync } from "fs";
|
|
2
|
+
import { join, relative, resolve, dirname } from "path";
|
|
3
|
+
const IGNORE_DIRS = new Set([
|
|
4
|
+
"node_modules", "__pycache__", ".venv", "venv", "env",
|
|
5
|
+
".git", "dist", "build", ".tox", ".mypy_cache",
|
|
6
|
+
".pytest_cache", ".eggs", "*.egg-info",
|
|
7
|
+
]);
|
|
8
|
+
export function analyzePythonProject(root, exclude = []) {
|
|
9
|
+
const files = discoverPythonFiles(root, exclude);
|
|
10
|
+
return files.map((f) => analyzeFile(f, root));
|
|
11
|
+
}
|
|
12
|
+
function discoverPythonFiles(root, exclude) {
|
|
13
|
+
const results = [];
|
|
14
|
+
function walk(dir) {
|
|
15
|
+
const entries = readdirSync(dir);
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const full = join(dir, entry);
|
|
18
|
+
const stat = statSync(full);
|
|
19
|
+
if (stat.isDirectory()) {
|
|
20
|
+
if (IGNORE_DIRS.has(entry))
|
|
21
|
+
continue;
|
|
22
|
+
if (exclude.some((ex) => entry.includes(ex)))
|
|
23
|
+
continue;
|
|
24
|
+
walk(full);
|
|
25
|
+
}
|
|
26
|
+
else if (entry.endsWith(".py")) {
|
|
27
|
+
const rel = relative(root, full);
|
|
28
|
+
if (!exclude.some((ex) => rel.includes(ex))) {
|
|
29
|
+
results.push(full);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
walk(root);
|
|
35
|
+
return results;
|
|
36
|
+
}
|
|
37
|
+
function analyzeFile(filePath, root) {
|
|
38
|
+
const content = readFileSync(filePath, "utf-8");
|
|
39
|
+
const lines = content.split("\n");
|
|
40
|
+
const exports = [];
|
|
41
|
+
const imports = [];
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
const trimmed = line.trimStart();
|
|
44
|
+
// Top-level class definitions
|
|
45
|
+
const classMatch = trimmed.match(/^class\s+(\w+)/);
|
|
46
|
+
if (classMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
|
|
47
|
+
exports.push({ name: classMatch[1], kind: "class" });
|
|
48
|
+
}
|
|
49
|
+
// Top-level function definitions
|
|
50
|
+
const funcMatch = trimmed.match(/^def\s+(\w+)/);
|
|
51
|
+
if (funcMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
|
|
52
|
+
exports.push({ name: funcMatch[1], kind: "function" });
|
|
53
|
+
}
|
|
54
|
+
// Top-level constants (UPPER_CASE = ...)
|
|
55
|
+
const constMatch = trimmed.match(/^([A-Z][A-Z_0-9]+)\s*=/);
|
|
56
|
+
if (constMatch && !line.startsWith(" ") && !line.startsWith("\t")) {
|
|
57
|
+
exports.push({ name: constMatch[1], kind: "const" });
|
|
58
|
+
}
|
|
59
|
+
// import module
|
|
60
|
+
const importMatch = trimmed.match(/^import\s+([\w.]+)/);
|
|
61
|
+
if (importMatch) {
|
|
62
|
+
const mod = importMatch[1];
|
|
63
|
+
imports.push({
|
|
64
|
+
moduleSpecifier: mod,
|
|
65
|
+
resolvedPath: resolveModule(mod, filePath, root),
|
|
66
|
+
importedNames: [mod.split(".").pop()],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
// from module import names
|
|
70
|
+
const fromMatch = trimmed.match(/^from\s+([\w.]+)\s+import\s+(.+)/);
|
|
71
|
+
if (fromMatch) {
|
|
72
|
+
const mod = fromMatch[1];
|
|
73
|
+
const names = fromMatch[2]
|
|
74
|
+
.split(",")
|
|
75
|
+
.map((n) => n.trim().split(" as ")[0].trim())
|
|
76
|
+
.filter((n) => n && n !== "(");
|
|
77
|
+
imports.push({
|
|
78
|
+
moduleSpecifier: mod,
|
|
79
|
+
resolvedPath: resolveModule(mod, filePath, root),
|
|
80
|
+
importedNames: names,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
relativePath: relative(root, filePath),
|
|
86
|
+
absolutePath: filePath,
|
|
87
|
+
language: "python",
|
|
88
|
+
exports,
|
|
89
|
+
imports,
|
|
90
|
+
linesOfCode: lines.length,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function resolveModule(moduleSpecifier, containingFile, root) {
|
|
94
|
+
// Relative imports (starts with .)
|
|
95
|
+
if (moduleSpecifier.startsWith(".")) {
|
|
96
|
+
const dots = moduleSpecifier.match(/^\.+/)[0].length;
|
|
97
|
+
let base = dirname(containingFile);
|
|
98
|
+
for (let i = 1; i < dots; i++)
|
|
99
|
+
base = dirname(base);
|
|
100
|
+
const rest = moduleSpecifier.slice(dots).replace(/\./g, "/");
|
|
101
|
+
const candidates = [
|
|
102
|
+
join(base, rest + ".py"),
|
|
103
|
+
join(base, rest, "__init__.py"),
|
|
104
|
+
];
|
|
105
|
+
for (const c of candidates) {
|
|
106
|
+
if (existsSync(c) && c.startsWith(resolve(root))) {
|
|
107
|
+
return relative(root, c);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
// Absolute imports — try to resolve within project
|
|
113
|
+
const parts = moduleSpecifier.replace(/\./g, "/");
|
|
114
|
+
const candidates = [
|
|
115
|
+
join(root, parts + ".py"),
|
|
116
|
+
join(root, parts, "__init__.py"),
|
|
117
|
+
join(root, "src", parts + ".py"),
|
|
118
|
+
join(root, "src", parts, "__init__.py"),
|
|
119
|
+
];
|
|
120
|
+
for (const c of candidates) {
|
|
121
|
+
if (existsSync(c)) {
|
|
122
|
+
return relative(root, c);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null; // external package
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=python-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/python-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;IACrD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa;IAC9C,eAAe,EAAE,OAAO,EAAE,YAAY;CACvC,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,UAAoB,EAAE;IAEtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY,EAAE,OAAiB;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,SAAS,IAAI,CAAC,GAAW;QACvB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAAE,SAAS;gBACvD,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,IAAY;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjC,8BAA8B;QAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnD,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,yCAAyC;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3D,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,gBAAgB;QAChB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC;gBACX,eAAe,EAAE,GAAG;gBACpB,YAAY,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;gBAChD,aAAa,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YAEjC,OAAO,CAAC,IAAI,CAAC;gBACX,eAAe,EAAE,GAAG;gBACpB,YAAY,EAAE,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;gBAChD,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACtC,YAAY,EAAE,QAAQ;QACtB,QAAQ,EAAE,QAAQ;QAClB,OAAO;QACP,OAAO;QACP,WAAW,EAAE,KAAK,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,eAAuB,EACvB,cAAsB,EACtB,IAAY;IAEZ,mCAAmC;IACnC,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACtD,IAAI,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC;SAChC,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACjD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC;KACxC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,mBAAmB;AAClC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface ExportInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
kind: "class" | "function" | "interface" | "type" | "const" | "enum" | "variable";
|
|
4
|
+
}
|
|
5
|
+
export interface ImportInfo {
|
|
6
|
+
moduleSpecifier: string;
|
|
7
|
+
resolvedPath: string | null;
|
|
8
|
+
importedNames: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface FileAnalysis {
|
|
11
|
+
relativePath: string;
|
|
12
|
+
absolutePath: string;
|
|
13
|
+
language: "typescript" | "python";
|
|
14
|
+
exports: ExportInfo[];
|
|
15
|
+
imports: ImportInfo[];
|
|
16
|
+
linesOfCode: number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/typescript-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,YAAY,CAAC;AAOvE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,EAAE,CAsChB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { resolve, relative, dirname } from "path";
|
|
4
|
+
const IGNORE_DIRS = new Set([
|
|
5
|
+
"node_modules", "dist", "build", ".git", "coverage",
|
|
6
|
+
".next", ".nuxt", ".turbo", ".cache",
|
|
7
|
+
]);
|
|
8
|
+
export function analyzeTypeScriptProject(root, exclude = []) {
|
|
9
|
+
const tsconfigPath = ts.findConfigFile(root, ts.sys.fileExists, "tsconfig.json");
|
|
10
|
+
if (!tsconfigPath) {
|
|
11
|
+
throw new Error(`No tsconfig.json found in ${root}`);
|
|
12
|
+
}
|
|
13
|
+
const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
|
|
14
|
+
if (configFile.error) {
|
|
15
|
+
throw new Error(`Error reading tsconfig.json: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, "\n")}`);
|
|
16
|
+
}
|
|
17
|
+
const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, dirname(tsconfigPath));
|
|
18
|
+
// Filter files
|
|
19
|
+
const files = parsed.fileNames.filter((f) => {
|
|
20
|
+
const rel = relative(root, f);
|
|
21
|
+
if (rel.includes(".d.ts"))
|
|
22
|
+
return false;
|
|
23
|
+
if (IGNORE_DIRS.has(rel.split("/")[0]))
|
|
24
|
+
return false;
|
|
25
|
+
if (exclude.some((ex) => rel.includes(ex)))
|
|
26
|
+
return false;
|
|
27
|
+
return true;
|
|
28
|
+
});
|
|
29
|
+
const program = ts.createProgram(files, parsed.options);
|
|
30
|
+
const results = [];
|
|
31
|
+
for (const filePath of files) {
|
|
32
|
+
const sourceFile = program.getSourceFile(filePath);
|
|
33
|
+
if (!sourceFile)
|
|
34
|
+
continue;
|
|
35
|
+
const analysis = analyzeFile(sourceFile, program, root);
|
|
36
|
+
if (analysis)
|
|
37
|
+
results.push(analysis);
|
|
38
|
+
}
|
|
39
|
+
return results;
|
|
40
|
+
}
|
|
41
|
+
function analyzeFile(sourceFile, program, root) {
|
|
42
|
+
const exports = [];
|
|
43
|
+
const imports = [];
|
|
44
|
+
const checker = program.getTypeChecker();
|
|
45
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
46
|
+
// Exports
|
|
47
|
+
if (ts.isFunctionDeclaration(node) && isExported(node)) {
|
|
48
|
+
exports.push({ name: node.name?.text ?? "(anonymous)", kind: "function" });
|
|
49
|
+
}
|
|
50
|
+
if (ts.isClassDeclaration(node) && isExported(node)) {
|
|
51
|
+
exports.push({ name: node.name?.text ?? "(anonymous)", kind: "class" });
|
|
52
|
+
}
|
|
53
|
+
if (ts.isInterfaceDeclaration(node) && isExported(node)) {
|
|
54
|
+
exports.push({ name: node.name?.text ?? "unknown", kind: "interface" });
|
|
55
|
+
}
|
|
56
|
+
if (ts.isTypeAliasDeclaration(node) && isExported(node)) {
|
|
57
|
+
exports.push({ name: node.name.text, kind: "type" });
|
|
58
|
+
}
|
|
59
|
+
if (ts.isEnumDeclaration(node) && isExported(node)) {
|
|
60
|
+
exports.push({ name: node.name.text, kind: "enum" });
|
|
61
|
+
}
|
|
62
|
+
if (ts.isVariableStatement(node) && isExported(node)) {
|
|
63
|
+
for (const decl of node.declarationList.declarations) {
|
|
64
|
+
if (ts.isIdentifier(decl.name)) {
|
|
65
|
+
const isConst = (node.declarationList.flags & ts.NodeFlags.Const) !== 0;
|
|
66
|
+
exports.push({ name: decl.name.text, kind: isConst ? "const" : "variable" });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Re-exports: export { Foo } from "./bar"
|
|
71
|
+
if (ts.isExportDeclaration(node) && node.exportClause && node.moduleSpecifier) {
|
|
72
|
+
if (ts.isNamedExports(node.exportClause)) {
|
|
73
|
+
for (const spec of node.exportClause.elements) {
|
|
74
|
+
exports.push({ name: spec.name.text, kind: "const" });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Imports
|
|
79
|
+
if (ts.isImportDeclaration(node) && node.moduleSpecifier) {
|
|
80
|
+
const specifier = node.moduleSpecifier.text;
|
|
81
|
+
const importedNames = [];
|
|
82
|
+
if (node.importClause) {
|
|
83
|
+
if (node.importClause.name) {
|
|
84
|
+
importedNames.push(node.importClause.name.text);
|
|
85
|
+
}
|
|
86
|
+
if (node.importClause.namedBindings) {
|
|
87
|
+
if (ts.isNamedImports(node.importClause.namedBindings)) {
|
|
88
|
+
for (const el of node.importClause.namedBindings.elements) {
|
|
89
|
+
importedNames.push(el.name.text);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (ts.isNamespaceImport(node.importClause.namedBindings)) {
|
|
93
|
+
importedNames.push(`* as ${node.importClause.namedBindings.name.text}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const resolvedPath = resolveImport(specifier, sourceFile.fileName, program.getCompilerOptions(), root);
|
|
98
|
+
imports.push({ moduleSpecifier: specifier, resolvedPath, importedNames });
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const content = readFileSync(sourceFile.fileName, "utf-8");
|
|
102
|
+
const lines = content.split("\n").length;
|
|
103
|
+
return {
|
|
104
|
+
relativePath: relative(root, sourceFile.fileName),
|
|
105
|
+
absolutePath: sourceFile.fileName,
|
|
106
|
+
language: "typescript",
|
|
107
|
+
exports,
|
|
108
|
+
imports,
|
|
109
|
+
linesOfCode: lines,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function isExported(node) {
|
|
113
|
+
return (ts.canHaveModifiers(node) &&
|
|
114
|
+
ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) === true);
|
|
115
|
+
}
|
|
116
|
+
function resolveImport(specifier, containingFile, options, root) {
|
|
117
|
+
// Only resolve relative imports and path-aliased imports
|
|
118
|
+
if (!specifier.startsWith(".") && !specifier.startsWith("@/")) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const resolved = ts.resolveModuleName(specifier, containingFile, options, ts.sys);
|
|
122
|
+
if (resolved.resolvedModule) {
|
|
123
|
+
const resolvedPath = resolved.resolvedModule.resolvedFileName;
|
|
124
|
+
// Only include if it's within the project root
|
|
125
|
+
if (resolvedPath.startsWith(resolve(root)) && !resolvedPath.includes("node_modules")) {
|
|
126
|
+
return relative(root, resolvedPath);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=typescript-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typescript-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/typescript-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-provider.d.ts","sourceRoot":"","sources":["../../src/api-client/api-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU/D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,CAoGrE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { HttpClient } from "./http-client.js";
|
|
2
|
+
export function createApiProvider(creds) {
|
|
3
|
+
const http = new HttpClient(creds);
|
|
4
|
+
return {
|
|
5
|
+
nodes: {
|
|
6
|
+
create: (input) => http.post("/api/nodes", input),
|
|
7
|
+
getById: async (id) => {
|
|
8
|
+
try {
|
|
9
|
+
const result = await http.get(`/api/nodes/${id}`);
|
|
10
|
+
return result.node;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
update: async (id, input) => {
|
|
17
|
+
try {
|
|
18
|
+
return await http.patch(`/api/nodes/${id}`, input);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
delete: async (id) => {
|
|
25
|
+
try {
|
|
26
|
+
await http.delete(`/api/nodes/${id}`);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
setStatus: async (id, status) => {
|
|
34
|
+
try {
|
|
35
|
+
return await http.patch(`/api/nodes/${id}/status`, {
|
|
36
|
+
status,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
listDrafts: (limit) => http.get(`/api/nodes/drafts${limit ? `?limit=${limit}` : ""}`),
|
|
44
|
+
listTypes: () => http.get("/api/nodes/types"),
|
|
45
|
+
},
|
|
46
|
+
edges: {
|
|
47
|
+
create: (input) => http.post("/api/edges", input),
|
|
48
|
+
getByNodeId: async (nodeId) => {
|
|
49
|
+
const result = await http.get(`/api/nodes/${nodeId}`);
|
|
50
|
+
return result.edges;
|
|
51
|
+
},
|
|
52
|
+
delete: async (id) => {
|
|
53
|
+
try {
|
|
54
|
+
await http.delete(`/api/edges/${id}`);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
listRelationshipTypes: () => http.get("/api/edges/types"),
|
|
62
|
+
},
|
|
63
|
+
search: {
|
|
64
|
+
search: (options) => http.post("/api/search", options),
|
|
65
|
+
context: (options) => http.post("/api/context", options),
|
|
66
|
+
},
|
|
67
|
+
domains: {
|
|
68
|
+
getTree: () => http.get("/api/domains"),
|
|
69
|
+
seed: () => http.post("/api/domains/seed"),
|
|
70
|
+
getBySlug: async (slug) => {
|
|
71
|
+
try {
|
|
72
|
+
return await http.get(`/api/domains/${slug}`);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
resolveSlugs: (slugs) => http.post("/api/domains/resolve", { slugs }),
|
|
79
|
+
},
|
|
80
|
+
map: {
|
|
81
|
+
upload: (input) => http.post("/api/map", input),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=api-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-provider.js","sourceRoot":"","sources":["../../src/api-client/api-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Credentials } from "./types.js";
|
|
2
|
+
export declare function loadCredentials(): Credentials | null;
|
|
3
|
+
export declare function saveCredentials(creds: Credentials): void;
|
|
4
|
+
export declare function deleteCredentials(): boolean;
|
|
5
|
+
export declare function getCredentialsPath(): string;
|
|
6
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/api-client/credentials.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAUpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAGxD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, unlinkSync, existsSync, } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { parse, stringify } from "yaml";
|
|
5
|
+
const CREDENTIALS_DIR = join(homedir(), ".apart");
|
|
6
|
+
const CREDENTIALS_PATH = join(CREDENTIALS_DIR, "credentials.yaml");
|
|
7
|
+
export function loadCredentials() {
|
|
8
|
+
if (!existsSync(CREDENTIALS_PATH))
|
|
9
|
+
return null;
|
|
10
|
+
try {
|
|
11
|
+
const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
|
|
12
|
+
const data = parse(raw);
|
|
13
|
+
if (data?.server && data?.apiKey)
|
|
14
|
+
return data;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function saveCredentials(creds) {
|
|
22
|
+
mkdirSync(CREDENTIALS_DIR, { recursive: true });
|
|
23
|
+
writeFileSync(CREDENTIALS_PATH, stringify(creds), { mode: 0o600 });
|
|
24
|
+
}
|
|
25
|
+
export function deleteCredentials() {
|
|
26
|
+
if (!existsSync(CREDENTIALS_PATH))
|
|
27
|
+
return false;
|
|
28
|
+
unlinkSync(CREDENTIALS_PATH);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
export function getCredentialsPath() {
|
|
32
|
+
return CREDENTIALS_PATH;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/api-client/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGxC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAEnE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,MAAM;YAAE,OAAO,IAAmB,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-provider.d.ts","sourceRoot":"","sources":["../../src/api-client/direct-provider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,wBAAgB,oBAAoB,IAAI,eAAe,CAwHtD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { loadConfig, getTenantDb, NodeService, EdgeService, SearchService, ContextService, DomainService, createEmbeddingProvider, } from "@apart-tech/intelligence-core";
|
|
2
|
+
import { resolveTenant } from "../utils.js";
|
|
3
|
+
export function createDirectProvider() {
|
|
4
|
+
const config = loadConfig();
|
|
5
|
+
const tenant = resolveTenant(config);
|
|
6
|
+
const db = getTenantDb(config.database.url, tenant);
|
|
7
|
+
const embeddings = createEmbeddingProvider(config);
|
|
8
|
+
const nodeService = new NodeService(db, embeddings, tenant);
|
|
9
|
+
const edgeService = new EdgeService(db, tenant);
|
|
10
|
+
const searchService = new SearchService(db, embeddings, config, tenant);
|
|
11
|
+
const contextService = new ContextService(nodeService, edgeService, searchService, config);
|
|
12
|
+
const domainService = new DomainService(db, tenant);
|
|
13
|
+
return {
|
|
14
|
+
nodes: {
|
|
15
|
+
create: (input) => nodeService.create(input),
|
|
16
|
+
getById: (id) => nodeService.getById(id),
|
|
17
|
+
update: (id, input) => nodeService.update(id, input),
|
|
18
|
+
delete: (id) => nodeService.delete(id),
|
|
19
|
+
setStatus: (id, status) => nodeService.setStatus(id, status),
|
|
20
|
+
listDrafts: (limit) => nodeService.listDrafts(limit),
|
|
21
|
+
listTypes: () => nodeService.listTypes(),
|
|
22
|
+
},
|
|
23
|
+
edges: {
|
|
24
|
+
create: (input) => edgeService.create(input),
|
|
25
|
+
getByNodeId: (nodeId) => edgeService.getByNodeId(nodeId),
|
|
26
|
+
delete: (id) => edgeService.delete(id),
|
|
27
|
+
listRelationshipTypes: () => edgeService.listRelationshipTypes(),
|
|
28
|
+
},
|
|
29
|
+
search: {
|
|
30
|
+
search: (options) => searchService.search(options),
|
|
31
|
+
context: (options) => contextService.assemble(options),
|
|
32
|
+
},
|
|
33
|
+
domains: {
|
|
34
|
+
getTree: () => domainService.getTree(),
|
|
35
|
+
seed: () => domainService.seed(),
|
|
36
|
+
getBySlug: (slug) => domainService.getBySlug(slug),
|
|
37
|
+
resolveSlugs: (slugs) => domainService.resolveSlugs(slugs),
|
|
38
|
+
},
|
|
39
|
+
map: {
|
|
40
|
+
upload: async (input) => {
|
|
41
|
+
const existingNodes = await db.node.findMany({
|
|
42
|
+
where: { type: "module" },
|
|
43
|
+
select: { id: true, title: true },
|
|
44
|
+
});
|
|
45
|
+
const existingByTitle = new Map(existingNodes.map((n) => [n.title, n.id]));
|
|
46
|
+
const pathToNodeId = new Map();
|
|
47
|
+
let nodesCreated = 0;
|
|
48
|
+
let nodesUpdated = 0;
|
|
49
|
+
for (const file of input.analyses) {
|
|
50
|
+
const title = `${input.projectName}/${file.relativePath}`;
|
|
51
|
+
const content = buildMapNodeContent(file, input.projectName);
|
|
52
|
+
const metadata = {
|
|
53
|
+
language: file.language,
|
|
54
|
+
linesOfCode: file.linesOfCode,
|
|
55
|
+
projectRoot: input.projectName,
|
|
56
|
+
exports: file.exports.map((e) => `${e.kind}:${e.name}`),
|
|
57
|
+
importCount: file.imports.length,
|
|
58
|
+
};
|
|
59
|
+
const existingId = existingByTitle.get(title);
|
|
60
|
+
if (existingId) {
|
|
61
|
+
await nodeService.update(existingId, { content, metadata });
|
|
62
|
+
pathToNodeId.set(file.relativePath, existingId);
|
|
63
|
+
nodesUpdated++;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const node = await nodeService.create({
|
|
67
|
+
type: "module",
|
|
68
|
+
title,
|
|
69
|
+
content,
|
|
70
|
+
metadata,
|
|
71
|
+
createdBy: input.createdBy ?? "tc-map",
|
|
72
|
+
domainId: input.domainId,
|
|
73
|
+
});
|
|
74
|
+
pathToNodeId.set(file.relativePath, node.id);
|
|
75
|
+
nodesCreated++;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Delete old import edges and recreate
|
|
79
|
+
const allNodeIds = [...pathToNodeId.values()];
|
|
80
|
+
if (allNodeIds.length > 0) {
|
|
81
|
+
await db.edge.deleteMany({
|
|
82
|
+
where: {
|
|
83
|
+
relationshipType: "imports",
|
|
84
|
+
sourceNodeId: { in: allNodeIds },
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
let edgesCreated = 0;
|
|
89
|
+
for (const file of input.analyses) {
|
|
90
|
+
const sourceId = pathToNodeId.get(file.relativePath);
|
|
91
|
+
if (!sourceId)
|
|
92
|
+
continue;
|
|
93
|
+
for (const imp of file.imports) {
|
|
94
|
+
if (!imp.resolvedPath)
|
|
95
|
+
continue;
|
|
96
|
+
const targetId = pathToNodeId.get(imp.resolvedPath);
|
|
97
|
+
if (!targetId || targetId === sourceId)
|
|
98
|
+
continue;
|
|
99
|
+
await edgeService.create({
|
|
100
|
+
sourceNodeId: sourceId,
|
|
101
|
+
targetNodeId: targetId,
|
|
102
|
+
relationshipType: "imports",
|
|
103
|
+
metadata: { importedNames: imp.importedNames },
|
|
104
|
+
createdBy: input.createdBy ?? "tc-map",
|
|
105
|
+
});
|
|
106
|
+
edgesCreated++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { nodesCreated, nodesUpdated, edgesCreated };
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function buildMapNodeContent(file, projectName) {
|
|
115
|
+
const sections = [];
|
|
116
|
+
sections.push(`# ${projectName}/${file.relativePath}`);
|
|
117
|
+
sections.push(`Language: ${file.language} | ${file.linesOfCode} lines`);
|
|
118
|
+
if (file.exports.length > 0) {
|
|
119
|
+
sections.push("");
|
|
120
|
+
sections.push("## Exports");
|
|
121
|
+
for (const exp of file.exports) {
|
|
122
|
+
sections.push(`- ${exp.kind} ${exp.name}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const internalImports = file.imports.filter((i) => i.resolvedPath);
|
|
126
|
+
const externalImports = file.imports.filter((i) => !i.resolvedPath);
|
|
127
|
+
if (internalImports.length > 0) {
|
|
128
|
+
sections.push("");
|
|
129
|
+
sections.push("## Internal Dependencies");
|
|
130
|
+
for (const imp of internalImports) {
|
|
131
|
+
const names = imp.importedNames.length > 0
|
|
132
|
+
? ` (${imp.importedNames.join(", ")})`
|
|
133
|
+
: "";
|
|
134
|
+
sections.push(`- ${imp.resolvedPath}${names}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (externalImports.length > 0) {
|
|
138
|
+
sections.push("");
|
|
139
|
+
sections.push("## External Dependencies");
|
|
140
|
+
for (const imp of externalImports) {
|
|
141
|
+
const names = imp.importedNames.length > 0
|
|
142
|
+
? ` (${imp.importedNames.join(", ")})`
|
|
143
|
+
: "";
|
|
144
|
+
sections.push(`- ${imp.moduleSpecifier}${names}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return sections.join("\n");
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=direct-provider.js.map
|