@danielblomma/cortex-mcp 0.4.2 → 0.6.4

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 (61) hide show
  1. package/README.md +64 -16
  2. package/bin/cortex.mjs +32 -60
  3. package/package.json +17 -3
  4. package/scaffold/.context/ontology.cypher +47 -0
  5. package/scaffold/.githooks/post-commit +14 -0
  6. package/scaffold/.githooks/post-rewrite +23 -0
  7. package/scaffold/mcp/package-lock.json +19 -23
  8. package/scaffold/mcp/package.json +3 -1
  9. package/scaffold/mcp/src/contextEntities.ts +311 -0
  10. package/scaffold/mcp/src/defaults.ts +6 -0
  11. package/scaffold/mcp/src/embed.ts +163 -37
  12. package/scaffold/mcp/src/frontmatter.ts +39 -0
  13. package/scaffold/mcp/src/graph.ts +330 -109
  14. package/scaffold/mcp/src/graphMetrics.ts +12 -0
  15. package/scaffold/mcp/src/impactPresentation.ts +202 -0
  16. package/scaffold/mcp/src/impactRanking.ts +237 -0
  17. package/scaffold/mcp/src/impactResponse.ts +47 -0
  18. package/scaffold/mcp/src/impactResults.ts +173 -0
  19. package/scaffold/mcp/src/impactSeed.ts +33 -0
  20. package/scaffold/mcp/src/impactTraversal.ts +83 -0
  21. package/scaffold/mcp/src/jsonl.ts +34 -0
  22. package/scaffold/mcp/src/loadGraph.ts +345 -86
  23. package/scaffold/mcp/src/paths.ts +24 -2
  24. package/scaffold/mcp/src/presets.ts +137 -0
  25. package/scaffold/mcp/src/relatedResponse.ts +30 -0
  26. package/scaffold/mcp/src/relatedTraversal.ts +101 -0
  27. package/scaffold/mcp/src/rules.ts +27 -0
  28. package/scaffold/mcp/src/search.ts +191 -355
  29. package/scaffold/mcp/src/searchCore.ts +274 -0
  30. package/scaffold/mcp/src/searchResults.ts +133 -0
  31. package/scaffold/mcp/src/server.ts +95 -3
  32. package/scaffold/mcp/src/types.ts +99 -3
  33. package/scaffold/scripts/context.sh +12 -46
  34. package/scaffold/scripts/dashboard.mjs +797 -0
  35. package/scaffold/scripts/dashboard.sh +13 -0
  36. package/scaffold/scripts/ingest.mjs +2219 -59
  37. package/scaffold/scripts/install-git-hooks.sh +3 -1
  38. package/scaffold/scripts/memory-compile.mjs +232 -0
  39. package/scaffold/scripts/memory-compile.sh +20 -0
  40. package/scaffold/scripts/memory-lint.mjs +375 -0
  41. package/scaffold/scripts/memory-lint.sh +20 -0
  42. package/scaffold/scripts/parsers/config.mjs +178 -0
  43. package/scaffold/scripts/parsers/cpp.mjs +316 -0
  44. package/scaffold/scripts/parsers/dotnet/VbNetParser/Program.cs +374 -0
  45. package/scaffold/scripts/parsers/dotnet/VbNetParser/VbNetParser.csproj +13 -0
  46. package/scaffold/scripts/parsers/javascript/ast.mjs +61 -0
  47. package/scaffold/scripts/parsers/javascript/calls.mjs +53 -0
  48. package/scaffold/scripts/parsers/javascript/chunks.mjs +388 -0
  49. package/scaffold/scripts/parsers/javascript/imports.mjs +162 -0
  50. package/scaffold/scripts/parsers/javascript/patterns.mjs +82 -0
  51. package/scaffold/scripts/parsers/javascript/scope-analysis.mjs +3 -0
  52. package/scaffold/scripts/parsers/javascript/scope-builder.mjs +305 -0
  53. package/scaffold/scripts/parsers/javascript/scope-resolver.mjs +82 -0
  54. package/scaffold/scripts/parsers/javascript.mjs +27 -350
  55. package/scaffold/scripts/parsers/resources.mjs +166 -0
  56. package/scaffold/scripts/parsers/sql.mjs +137 -0
  57. package/scaffold/scripts/parsers/vbnet.mjs +143 -0
  58. package/scaffold/scripts/status.sh +15 -8
  59. package/scaffold/scripts/capture-note.sh +0 -55
  60. package/scaffold/scripts/plan-state-engine.cjs +0 -310
  61. package/scaffold/scripts/plan-state.sh +0 -71
@@ -0,0 +1,83 @@
1
+ import type { JsonObject, RelationRecord } from "./types.js";
2
+ import type { ImpactTraversalStep } from "./impactPresentation.js";
3
+
4
+ export function traverseImpactGraph(params: {
5
+ seedId: string;
6
+ relations: RelationRecord[];
7
+ depth: number;
8
+ }): {
9
+ visited: Map<string, ImpactTraversalStep>;
10
+ traversedEdges: JsonObject[];
11
+ } {
12
+ const outgoing = new Map<string, RelationRecord[]>();
13
+ const incoming = new Map<string, RelationRecord[]>();
14
+
15
+ for (const relation of params.relations) {
16
+ const outList = outgoing.get(relation.from) ?? [];
17
+ outList.push(relation);
18
+ outgoing.set(relation.from, outList);
19
+
20
+ const inList = incoming.get(relation.to) ?? [];
21
+ inList.push(relation);
22
+ incoming.set(relation.to, inList);
23
+ }
24
+
25
+ const seen = new Set<string>([params.seedId]);
26
+ const queue: Array<{ id: string; hop: number }> = [{ id: params.seedId, hop: 0 }];
27
+ const visited = new Map<string, ImpactTraversalStep>();
28
+ const traversedEdges: JsonObject[] = [];
29
+ const traversedEdgeKeys = new Set<string>();
30
+
31
+ while (queue.length > 0) {
32
+ const current = queue.shift() as { id: string; hop: number };
33
+ if (current.hop >= params.depth) {
34
+ continue;
35
+ }
36
+
37
+ const neighbors = [
38
+ ...(outgoing.get(current.id) ?? []).map((edge) => ({
39
+ edge,
40
+ next: edge.to,
41
+ direction: "outgoing"
42
+ })),
43
+ ...(incoming.get(current.id) ?? []).map((edge) => ({
44
+ edge,
45
+ next: edge.from,
46
+ direction: "incoming"
47
+ }))
48
+ ];
49
+
50
+ for (const neighbor of neighbors) {
51
+ const target = neighbor.next;
52
+ const nextHop = current.hop + 1;
53
+
54
+ if (!seen.has(target)) {
55
+ seen.add(target);
56
+ queue.push({ id: target, hop: nextHop });
57
+ visited.set(target, {
58
+ hops: nextHop,
59
+ via_relation: neighbor.edge.relation,
60
+ direction: neighbor.direction,
61
+ via_entity: current.id,
62
+ via_note: neighbor.edge.note
63
+ });
64
+ }
65
+
66
+ const edgeKey = `${neighbor.edge.from}|${neighbor.edge.relation}|${neighbor.edge.to}|${neighbor.edge.note}`;
67
+ if (!traversedEdgeKeys.has(edgeKey)) {
68
+ traversedEdgeKeys.add(edgeKey);
69
+ traversedEdges.push({
70
+ from: neighbor.edge.from,
71
+ to: neighbor.edge.to,
72
+ relation: neighbor.edge.relation,
73
+ note: neighbor.edge.note
74
+ });
75
+ }
76
+ }
77
+ }
78
+
79
+ return {
80
+ visited,
81
+ traversedEdges
82
+ };
83
+ }
@@ -0,0 +1,34 @@
1
+ import fs from "node:fs";
2
+ import type { JsonObject, JsonValue } from "./types.js";
3
+
4
+ export function readJsonl(filePath: string): JsonObject[] {
5
+ if (!fs.existsSync(filePath)) {
6
+ return [];
7
+ }
8
+
9
+ return fs
10
+ .readFileSync(filePath, "utf8")
11
+ .split(/\r?\n/)
12
+ .map((line) => line.trim())
13
+ .filter(Boolean)
14
+ .map((line) => {
15
+ try {
16
+ return JSON.parse(line) as JsonObject;
17
+ } catch {
18
+ return null;
19
+ }
20
+ })
21
+ .filter((value): value is JsonObject => value !== null);
22
+ }
23
+
24
+ export function asString(value: JsonValue | undefined, fallback = ""): string {
25
+ return typeof value === "string" ? value : fallback;
26
+ }
27
+
28
+ export function asNumber(value: JsonValue | undefined, fallback = 0): number {
29
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
30
+ }
31
+
32
+ export function asBoolean(value: JsonValue | undefined, fallback = false): boolean {
33
+ return typeof value === "boolean" ? value : fallback;
34
+ }