@weavelogic/knowledge-graph-agent 0.6.0 → 0.7.1
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/LICENSE +21 -0
- package/README.md +70 -3
- package/dist/_virtual/__vite-browser-external.js +2 -2
- package/dist/_virtual/__vite-browser-external.js.map +1 -1
- package/dist/_virtual/index12.js +7 -0
- package/dist/_virtual/index12.js.map +1 -0
- package/dist/_virtual/ort-web.min.js +8 -0
- package/dist/_virtual/ort-web.min.js.map +1 -0
- package/dist/_virtual/ort-web.min2.js +5 -0
- package/dist/_virtual/ort-web.min2.js.map +1 -0
- package/dist/agents/base-agent.d.ts +63 -0
- package/dist/agents/base-agent.d.ts.map +1 -1
- package/dist/agents/base-agent.js +139 -0
- package/dist/agents/base-agent.js.map +1 -1
- package/dist/agents/coordinator-agent.d.ts +422 -0
- package/dist/agents/coordinator-agent.d.ts.map +1 -0
- package/dist/agents/documenter-agent.d.ts +298 -0
- package/dist/agents/documenter-agent.d.ts.map +1 -0
- package/dist/agents/index.d.ts +11 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/mixins/index.d.ts +9 -0
- package/dist/agents/mixins/index.d.ts.map +1 -0
- package/dist/agents/mixins/trajectory-mixin.d.ts +112 -0
- package/dist/agents/mixins/trajectory-mixin.d.ts.map +1 -0
- package/dist/agents/optimizer-agent.d.ts +388 -0
- package/dist/agents/optimizer-agent.d.ts.map +1 -0
- package/dist/agents/planner-agent.d.ts +395 -0
- package/dist/agents/planner-agent.d.ts.map +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +5 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/agents/reviewer-agent.d.ts +330 -0
- package/dist/agents/reviewer-agent.d.ts.map +1 -0
- package/dist/agents/types.d.ts +12 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js +1 -0
- package/dist/agents/types.js.map +1 -1
- package/dist/cli/commands/hive-mind/add-frontmatter.d.ts +102 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.js +439 -0
- package/dist/cli/commands/hive-mind/add-frontmatter.js.map +1 -0
- package/dist/cli/commands/hive-mind/analyze-links.d.ts +80 -0
- package/dist/cli/commands/hive-mind/analyze-links.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/analyze-links.js +367 -0
- package/dist/cli/commands/hive-mind/analyze-links.js.map +1 -0
- package/dist/cli/commands/hive-mind/find-connections.d.ts +75 -0
- package/dist/cli/commands/hive-mind/find-connections.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/find-connections.js +347 -0
- package/dist/cli/commands/hive-mind/find-connections.js.map +1 -0
- package/dist/cli/commands/hive-mind/index.d.ts +37 -0
- package/dist/cli/commands/hive-mind/index.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/index.js +33 -0
- package/dist/cli/commands/hive-mind/index.js.map +1 -0
- package/dist/cli/commands/hive-mind/validate-names.d.ts +79 -0
- package/dist/cli/commands/hive-mind/validate-names.d.ts.map +1 -0
- package/dist/cli/commands/hive-mind/validate-names.js +353 -0
- package/dist/cli/commands/hive-mind/validate-names.js.map +1 -0
- package/dist/cli/commands/vector.js +2 -0
- package/dist/cli/commands/vector.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/equilibrium/agent-equilibrium.d.ts +194 -0
- package/dist/equilibrium/agent-equilibrium.d.ts.map +1 -0
- package/dist/equilibrium/agent-equilibrium.js +304 -0
- package/dist/equilibrium/agent-equilibrium.js.map +1 -0
- package/dist/equilibrium/graph-equilibrium.d.ts +177 -0
- package/dist/equilibrium/graph-equilibrium.d.ts.map +1 -0
- package/dist/equilibrium/index.d.ts +11 -0
- package/dist/equilibrium/index.d.ts.map +1 -0
- package/dist/equilibrium/memory-equilibrium.d.ts +153 -0
- package/dist/equilibrium/memory-equilibrium.d.ts.map +1 -0
- package/dist/graphql/resolvers/index.d.ts.map +1 -1
- package/dist/graphql/resolvers/queries.d.ts +11 -0
- package/dist/graphql/resolvers/queries.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/inference/index.d.ts +9 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/model-selection.d.ts +131 -0
- package/dist/inference/model-selection.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agent-booster-adapter.d.ts +265 -0
- package/dist/integrations/agentic-flow/adapters/agent-booster-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-adapter.d.ts +197 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-vector-store.d.ts +249 -0
- package/dist/integrations/agentic-flow/adapters/agentdb-vector-store.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/base-adapter.d.ts +120 -0
- package/dist/integrations/agentic-flow/adapters/base-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/federation-hub-adapter.d.ts +444 -0
- package/dist/integrations/agentic-flow/adapters/federation-hub-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/index.d.ts +17 -0
- package/dist/integrations/agentic-flow/adapters/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/model-router-adapter.d.ts +242 -0
- package/dist/integrations/agentic-flow/adapters/model-router-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/quic-transport-adapter.d.ts +364 -0
- package/dist/integrations/agentic-flow/adapters/quic-transport-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/adapters/reasoning-bank-adapter.d.ts +209 -0
- package/dist/integrations/agentic-flow/adapters/reasoning-bank-adapter.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/benchmark/index.d.ts +9 -0
- package/dist/integrations/agentic-flow/benchmark/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/benchmark/vector-benchmark.d.ts +253 -0
- package/dist/integrations/agentic-flow/benchmark/vector-benchmark.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/config.d.ts +109 -0
- package/dist/integrations/agentic-flow/config.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/feature-flags.d.ts +140 -0
- package/dist/integrations/agentic-flow/feature-flags.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/index.d.ts +22 -0
- package/dist/integrations/agentic-flow/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/migration/index.d.ts +9 -0
- package/dist/integrations/agentic-flow/migration/index.d.ts.map +1 -0
- package/dist/integrations/agentic-flow/migration/migrate-to-agentdb.d.ts +242 -0
- package/dist/integrations/agentic-flow/migration/migrate-to-agentdb.d.ts.map +1 -0
- package/dist/learning/index.d.ts +91 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/learning-loop.d.ts +176 -0
- package/dist/learning/learning-loop.d.ts.map +1 -0
- package/dist/learning/services/ab-testing-framework.d.ts +135 -0
- package/dist/learning/services/ab-testing-framework.d.ts.map +1 -0
- package/dist/learning/services/agent-priming-service.d.ts +207 -0
- package/dist/learning/services/agent-priming-service.d.ts.map +1 -0
- package/dist/learning/services/daily-log-generator.d.ts +113 -0
- package/dist/learning/services/daily-log-generator.d.ts.map +1 -0
- package/dist/learning/services/index.d.ts +14 -0
- package/dist/learning/services/index.d.ts.map +1 -0
- package/dist/learning/services/memory-extraction-service.d.ts +87 -0
- package/dist/learning/services/memory-extraction-service.d.ts.map +1 -0
- package/dist/learning/services/task-completion-consumer.d.ts +162 -0
- package/dist/learning/services/task-completion-consumer.d.ts.map +1 -0
- package/dist/learning/services/trajectory-tracker.d.ts +174 -0
- package/dist/learning/services/trajectory-tracker.d.ts.map +1 -0
- package/dist/learning/types.d.ts +516 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/mcp/clients/claude-flow-memory-client.d.ts +259 -0
- package/dist/mcp/clients/claude-flow-memory-client.d.ts.map +1 -0
- package/dist/mcp/clients/claude-flow-memory-client.js +305 -0
- package/dist/mcp/clients/claude-flow-memory-client.js.map +1 -0
- package/dist/mcp/clients/index.d.ts +11 -0
- package/dist/mcp/clients/index.d.ts.map +1 -0
- package/dist/mcp/clients/mcp-client-adapter.d.ts +146 -0
- package/dist/mcp/clients/mcp-client-adapter.d.ts.map +1 -0
- package/dist/mcp/clients/mcp-client-adapter.js +372 -0
- package/dist/mcp/clients/mcp-client-adapter.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/memory/vault-sync.d.ts +12 -0
- package/dist/memory/vault-sync.d.ts.map +1 -1
- package/dist/memory/vault-sync.js +94 -11
- package/dist/memory/vault-sync.js.map +1 -1
- package/dist/node_modules/@huggingface/jinja/dist/index.js +118 -0
- package/dist/node_modules/@huggingface/jinja/dist/index.js.map +1 -0
- package/dist/node_modules/@typescript-eslint/project-service/dist/index.js +1 -1
- package/dist/node_modules/@xenova/transformers/src/backends/onnx.js +24 -0
- package/dist/node_modules/@xenova/transformers/src/backends/onnx.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/configs.js +52 -0
- package/dist/node_modules/@xenova/transformers/src/configs.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/env.js +35 -0
- package/dist/node_modules/@xenova/transformers/src/env.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/models.js +3852 -0
- package/dist/node_modules/@xenova/transformers/src/models.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/tokenizers.js +144 -0
- package/dist/node_modules/@xenova/transformers/src/tokenizers.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/core.js +52 -0
- package/dist/node_modules/@xenova/transformers/src/utils/core.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/generation.js +623 -0
- package/dist/node_modules/@xenova/transformers/src/utils/generation.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/hub.js +395 -0
- package/dist/node_modules/@xenova/transformers/src/utils/hub.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/image.js +12 -0
- package/dist/node_modules/@xenova/transformers/src/utils/image.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/maths.js +89 -0
- package/dist/node_modules/@xenova/transformers/src/utils/maths.js.map +1 -0
- package/dist/node_modules/@xenova/transformers/src/utils/tensor.js +750 -0
- package/dist/node_modules/@xenova/transformers/src/utils/tensor.js.map +1 -0
- package/dist/node_modules/fdir/dist/index.js +13 -13
- package/dist/node_modules/fdir/dist/index.js.map +1 -1
- package/dist/node_modules/onnxruntime-common/dist/lib/backend-impl.js +67 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/backend-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env-impl.js +24 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/env.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/index.js +11 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/index.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session-impl.js +162 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/inference-session.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor-impl.js +393 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor-impl.js.map +1 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor.js +6 -0
- package/dist/node_modules/onnxruntime-common/dist/lib/tensor.js.map +1 -0
- package/dist/node_modules/onnxruntime-web/dist/ort-web.min.js +12919 -0
- package/dist/node_modules/onnxruntime-web/dist/ort-web.min.js.map +1 -0
- package/dist/node_modules/tinyglobby/dist/index.js +14 -14
- package/dist/node_modules/tinyglobby/dist/index.js.map +1 -1
- package/dist/node_modules/typescript/lib/typescript.js +24 -24
- package/dist/node_modules/typescript/lib/typescript.js.map +1 -1
- package/dist/transport/agent-transport.d.ts +269 -0
- package/dist/transport/agent-transport.d.ts.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/services/embedding-service.d.ts +244 -0
- package/dist/vector/services/embedding-service.d.ts.map +1 -0
- package/dist/vector/services/embedding-service.js +10 -0
- package/dist/vector/services/embedding-service.js.map +1 -0
- package/dist/vector/services/hybrid-search.d.ts +320 -0
- package/dist/vector/services/hybrid-search.d.ts.map +1 -0
- package/dist/vector/services/hybrid-search.js +3 -0
- package/dist/vector/services/hybrid-search.js.map +1 -0
- package/dist/vector/services/index.d.ts +4 -0
- package/dist/vector/services/index.d.ts.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { writeFile, readFile } from "fs/promises";
|
|
5
|
+
import { glob } from "fast-glob";
|
|
6
|
+
import matter from "gray-matter";
|
|
7
|
+
function tokenize(text) {
|
|
8
|
+
const noCode = text.replace(/```[\s\S]*?```/g, "");
|
|
9
|
+
const noInline = noCode.replace(/`[^`]+`/g, "");
|
|
10
|
+
const noUrls = noInline.replace(/https?:\/\/[^\s]+/g, "");
|
|
11
|
+
const noLinks = noUrls.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
|
|
12
|
+
const noWiki = noLinks.replace(/\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g, "$1");
|
|
13
|
+
const words = noWiki.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((word) => word.length > 2 && word.length < 30);
|
|
14
|
+
return words;
|
|
15
|
+
}
|
|
16
|
+
const STOPWORDS = /* @__PURE__ */ new Set([
|
|
17
|
+
"the",
|
|
18
|
+
"and",
|
|
19
|
+
"for",
|
|
20
|
+
"are",
|
|
21
|
+
"but",
|
|
22
|
+
"not",
|
|
23
|
+
"you",
|
|
24
|
+
"all",
|
|
25
|
+
"can",
|
|
26
|
+
"had",
|
|
27
|
+
"her",
|
|
28
|
+
"was",
|
|
29
|
+
"one",
|
|
30
|
+
"our",
|
|
31
|
+
"out",
|
|
32
|
+
"has",
|
|
33
|
+
"have",
|
|
34
|
+
"been",
|
|
35
|
+
"were",
|
|
36
|
+
"some",
|
|
37
|
+
"this",
|
|
38
|
+
"that",
|
|
39
|
+
"what",
|
|
40
|
+
"when",
|
|
41
|
+
"where",
|
|
42
|
+
"which",
|
|
43
|
+
"while",
|
|
44
|
+
"who",
|
|
45
|
+
"will",
|
|
46
|
+
"with",
|
|
47
|
+
"would",
|
|
48
|
+
"there",
|
|
49
|
+
"their",
|
|
50
|
+
"from",
|
|
51
|
+
"they",
|
|
52
|
+
"been",
|
|
53
|
+
"said",
|
|
54
|
+
"each",
|
|
55
|
+
"she",
|
|
56
|
+
"how",
|
|
57
|
+
"its",
|
|
58
|
+
"may",
|
|
59
|
+
"more",
|
|
60
|
+
"than",
|
|
61
|
+
"then",
|
|
62
|
+
"these",
|
|
63
|
+
"into",
|
|
64
|
+
"only",
|
|
65
|
+
"other",
|
|
66
|
+
"also",
|
|
67
|
+
"any",
|
|
68
|
+
"such",
|
|
69
|
+
"because",
|
|
70
|
+
"about",
|
|
71
|
+
"just",
|
|
72
|
+
"could",
|
|
73
|
+
"very"
|
|
74
|
+
]);
|
|
75
|
+
function filterStopwords(words) {
|
|
76
|
+
return words.filter((word) => !STOPWORDS.has(word));
|
|
77
|
+
}
|
|
78
|
+
class ConnectionFinder {
|
|
79
|
+
documents = /* @__PURE__ */ new Map();
|
|
80
|
+
documentVectors = /* @__PURE__ */ new Map();
|
|
81
|
+
documentFrequency = /* @__PURE__ */ new Map();
|
|
82
|
+
totalDocuments = 0;
|
|
83
|
+
/**
|
|
84
|
+
* Build TF-IDF index from vault
|
|
85
|
+
*/
|
|
86
|
+
async buildIndex(vaultPath) {
|
|
87
|
+
const resolvedPath = path.resolve(vaultPath);
|
|
88
|
+
const files = await glob("**/*.md", {
|
|
89
|
+
cwd: resolvedPath,
|
|
90
|
+
ignore: ["node_modules/**", ".git/**", "dist/**"],
|
|
91
|
+
absolute: false
|
|
92
|
+
});
|
|
93
|
+
if (files.length === 0) {
|
|
94
|
+
throw new Error(`No markdown files found in: ${resolvedPath}`);
|
|
95
|
+
}
|
|
96
|
+
this.documents.clear();
|
|
97
|
+
this.documentVectors.clear();
|
|
98
|
+
this.documentFrequency.clear();
|
|
99
|
+
this.totalDocuments = files.length;
|
|
100
|
+
const termDocuments = /* @__PURE__ */ new Map();
|
|
101
|
+
for (const file of files) {
|
|
102
|
+
const filePath = path.join(resolvedPath, file);
|
|
103
|
+
const content = await readFile(filePath, "utf-8");
|
|
104
|
+
const { content: bodyContent, data: frontmatter } = matter(content);
|
|
105
|
+
const fullText = [
|
|
106
|
+
frontmatter.title || "",
|
|
107
|
+
frontmatter.description || "",
|
|
108
|
+
Array.isArray(frontmatter.tags) ? frontmatter.tags.join(" ") : "",
|
|
109
|
+
Array.isArray(frontmatter.aliases) ? frontmatter.aliases.join(" ") : "",
|
|
110
|
+
bodyContent
|
|
111
|
+
].join(" ");
|
|
112
|
+
this.documents.set(file, fullText);
|
|
113
|
+
const tokens = filterStopwords(tokenize(fullText));
|
|
114
|
+
const uniqueTerms = new Set(tokens);
|
|
115
|
+
for (const term of uniqueTerms) {
|
|
116
|
+
if (!termDocuments.has(term)) {
|
|
117
|
+
termDocuments.set(term, /* @__PURE__ */ new Set());
|
|
118
|
+
}
|
|
119
|
+
termDocuments.get(term).add(file);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const [term, docs] of termDocuments) {
|
|
123
|
+
this.documentFrequency.set(term, docs.size);
|
|
124
|
+
}
|
|
125
|
+
for (const file of files) {
|
|
126
|
+
const content = this.documents.get(file);
|
|
127
|
+
const tokens = filterStopwords(tokenize(content));
|
|
128
|
+
const termFreq = /* @__PURE__ */ new Map();
|
|
129
|
+
for (const term of tokens) {
|
|
130
|
+
termFreq.set(term, (termFreq.get(term) || 0) + 1);
|
|
131
|
+
}
|
|
132
|
+
const tfidf = /* @__PURE__ */ new Map();
|
|
133
|
+
const maxFreq = Math.max(...termFreq.values(), 1);
|
|
134
|
+
for (const [term, freq] of termFreq) {
|
|
135
|
+
const tf = freq / maxFreq;
|
|
136
|
+
const df = this.documentFrequency.get(term) || 1;
|
|
137
|
+
const idf = Math.log(this.totalDocuments / df);
|
|
138
|
+
tfidf.set(term, tf * idf);
|
|
139
|
+
}
|
|
140
|
+
let magnitude = 0;
|
|
141
|
+
for (const value of tfidf.values()) {
|
|
142
|
+
magnitude += value * value;
|
|
143
|
+
}
|
|
144
|
+
magnitude = Math.sqrt(magnitude);
|
|
145
|
+
this.documentVectors.set(file, {
|
|
146
|
+
file,
|
|
147
|
+
terms: tfidf,
|
|
148
|
+
magnitude
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Find similar documents to a source file
|
|
154
|
+
*/
|
|
155
|
+
findSimilar(sourceFile, threshold = 0.3, limit = 10) {
|
|
156
|
+
const sourceVector = this.documentVectors.get(sourceFile);
|
|
157
|
+
if (!sourceVector) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
const matches = [];
|
|
161
|
+
for (const [targetFile, targetVector] of this.documentVectors) {
|
|
162
|
+
if (targetFile === sourceFile) continue;
|
|
163
|
+
const similarity = this.cosineSimilarity(sourceVector, targetVector);
|
|
164
|
+
if (similarity >= threshold) {
|
|
165
|
+
const sharedTerms = this.findSharedTerms(sourceVector, targetVector);
|
|
166
|
+
matches.push({
|
|
167
|
+
source: sourceFile,
|
|
168
|
+
target: targetFile,
|
|
169
|
+
similarity: Math.round(similarity * 1e3) / 1e3,
|
|
170
|
+
sharedTerms: sharedTerms.slice(0, 5)
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
matches.sort((a, b) => b.similarity - a.similarity);
|
|
175
|
+
return matches.slice(0, limit);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Calculate cosine similarity between two document vectors
|
|
179
|
+
*/
|
|
180
|
+
cosineSimilarity(a, b) {
|
|
181
|
+
if (a.magnitude === 0 || b.magnitude === 0) return 0;
|
|
182
|
+
let dotProduct = 0;
|
|
183
|
+
for (const [term, aValue] of a.terms) {
|
|
184
|
+
const bValue = b.terms.get(term) || 0;
|
|
185
|
+
dotProduct += aValue * bValue;
|
|
186
|
+
}
|
|
187
|
+
return dotProduct / (a.magnitude * b.magnitude);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Find shared terms between two documents
|
|
191
|
+
*/
|
|
192
|
+
findSharedTerms(a, b) {
|
|
193
|
+
const shared = [];
|
|
194
|
+
for (const [term, aValue] of a.terms) {
|
|
195
|
+
const bValue = b.terms.get(term);
|
|
196
|
+
if (bValue && bValue > 0) {
|
|
197
|
+
shared.push({ term, score: aValue * bValue });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
shared.sort((a2, b2) => b2.score - a2.score);
|
|
201
|
+
return shared.map((s) => s.term);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Suggest connections for orphan files
|
|
205
|
+
*/
|
|
206
|
+
async suggestConnections(vaultPath, orphanFiles, threshold = 0.3, limit = 5) {
|
|
207
|
+
if (this.documentVectors.size === 0) {
|
|
208
|
+
await this.buildIndex(vaultPath);
|
|
209
|
+
}
|
|
210
|
+
const suggestions = [];
|
|
211
|
+
for (const orphan of orphanFiles) {
|
|
212
|
+
const similar = this.findSimilar(orphan, threshold, limit);
|
|
213
|
+
suggestions.push(...similar);
|
|
214
|
+
}
|
|
215
|
+
suggestions.sort((a, b) => b.similarity - a.similarity);
|
|
216
|
+
return suggestions;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Find all potential connections above threshold
|
|
220
|
+
*/
|
|
221
|
+
async findAllConnections(vaultPath, threshold = 0.3, limit = 100) {
|
|
222
|
+
if (this.documentVectors.size === 0) {
|
|
223
|
+
await this.buildIndex(vaultPath);
|
|
224
|
+
}
|
|
225
|
+
const allConnections = [];
|
|
226
|
+
const processed = /* @__PURE__ */ new Set();
|
|
227
|
+
for (const sourceFile of this.documentVectors.keys()) {
|
|
228
|
+
const similar = this.findSimilar(sourceFile, threshold, 10);
|
|
229
|
+
for (const match of similar) {
|
|
230
|
+
const key = [match.source, match.target].sort().join("|");
|
|
231
|
+
if (!processed.has(key)) {
|
|
232
|
+
processed.add(key);
|
|
233
|
+
allConnections.push(match);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
allConnections.sort((a, b) => b.similarity - a.similarity);
|
|
238
|
+
const topConnections = allConnections.slice(0, limit);
|
|
239
|
+
const averageSimilarity = topConnections.length > 0 ? topConnections.reduce((sum, c) => sum + c.similarity, 0) / topConnections.length : 0;
|
|
240
|
+
return {
|
|
241
|
+
totalDocuments: this.totalDocuments,
|
|
242
|
+
suggestedConnections: topConnections,
|
|
243
|
+
orphanConnections: [],
|
|
244
|
+
termCount: this.documentFrequency.size,
|
|
245
|
+
averageSimilarity: Math.round(averageSimilarity * 1e3) / 1e3
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get index statistics
|
|
250
|
+
*/
|
|
251
|
+
getStats() {
|
|
252
|
+
return {
|
|
253
|
+
documents: this.documentVectors.size,
|
|
254
|
+
terms: this.documentFrequency.size
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function createFindConnectionsCommand() {
|
|
259
|
+
const command = new Command("find-connections").description("Find potential connections using TF-IDF similarity").argument("<vault-path>", "Path to Obsidian vault or docs directory").option("-t, --threshold <number>", "Similarity threshold (0-1)", "0.3").option("-l, --limit <number>", "Maximum connections to return", "50").option("--suggest", "Focus on orphan files").option("-o, --output <file>", "Output file for results").option("--json", "Output as JSON").option("-v, --verbose", "Show detailed output").action(async (vaultPath, options) => {
|
|
260
|
+
const finder = new ConnectionFinder();
|
|
261
|
+
const threshold = parseFloat(options.threshold || "0.3");
|
|
262
|
+
const limit = parseInt(options.limit || "50", 10);
|
|
263
|
+
console.log(chalk.cyan("\nBuilding TF-IDF index...\n"));
|
|
264
|
+
try {
|
|
265
|
+
await finder.buildIndex(vaultPath);
|
|
266
|
+
const stats = finder.getStats();
|
|
267
|
+
console.log(chalk.white(` Documents indexed: ${stats.documents}`));
|
|
268
|
+
console.log(chalk.white(` Unique terms: ${stats.terms}`));
|
|
269
|
+
console.log("");
|
|
270
|
+
const result = await finder.findAllConnections(vaultPath, threshold, limit);
|
|
271
|
+
if (options.json) {
|
|
272
|
+
if (options.output) {
|
|
273
|
+
await writeFile(options.output, JSON.stringify(result, null, 2));
|
|
274
|
+
console.log(chalk.green(`Results written to: ${options.output}`));
|
|
275
|
+
} else {
|
|
276
|
+
console.log(JSON.stringify(result, null, 2));
|
|
277
|
+
}
|
|
278
|
+
} else {
|
|
279
|
+
console.log(chalk.bold("Potential Connections Found:\n"));
|
|
280
|
+
if (result.suggestedConnections.length === 0) {
|
|
281
|
+
console.log(chalk.yellow(" No connections found above threshold."));
|
|
282
|
+
console.log(chalk.gray(" Try lowering the threshold with -t option.\n"));
|
|
283
|
+
} else {
|
|
284
|
+
for (const conn of result.suggestedConnections.slice(0, options.verbose ? 50 : 20)) {
|
|
285
|
+
const simColor = conn.similarity >= 0.5 ? chalk.green : conn.similarity >= 0.3 ? chalk.yellow : chalk.gray;
|
|
286
|
+
console.log(
|
|
287
|
+
simColor(` [${(conn.similarity * 100).toFixed(1)}%]`),
|
|
288
|
+
chalk.white(conn.source),
|
|
289
|
+
chalk.gray("->"),
|
|
290
|
+
chalk.cyan(conn.target)
|
|
291
|
+
);
|
|
292
|
+
if (options.verbose && conn.sharedTerms.length > 0) {
|
|
293
|
+
console.log(chalk.gray(` Terms: ${conn.sharedTerms.join(", ")}`));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (result.suggestedConnections.length > (options.verbose ? 50 : 20)) {
|
|
297
|
+
console.log(
|
|
298
|
+
chalk.gray(`
|
|
299
|
+
... and ${result.suggestedConnections.length - (options.verbose ? 50 : 20)} more`)
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
console.log("");
|
|
303
|
+
console.log(chalk.bold("Summary:"));
|
|
304
|
+
console.log(chalk.white(` Total Documents: ${result.totalDocuments}`));
|
|
305
|
+
console.log(chalk.white(` Connections Found: ${result.suggestedConnections.length}`));
|
|
306
|
+
console.log(chalk.white(` Average Similarity: ${(result.averageSimilarity * 100).toFixed(1)}%`));
|
|
307
|
+
console.log("");
|
|
308
|
+
}
|
|
309
|
+
if (options.output) {
|
|
310
|
+
const reportLines = [
|
|
311
|
+
"# Connection Suggestions\n",
|
|
312
|
+
`Generated: ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
313
|
+
`,
|
|
314
|
+
`Threshold: ${threshold}
|
|
315
|
+
`,
|
|
316
|
+
"",
|
|
317
|
+
"## Suggested Links\n"
|
|
318
|
+
];
|
|
319
|
+
for (const conn of result.suggestedConnections) {
|
|
320
|
+
reportLines.push(`- **${conn.source}** -> [[${conn.target}]]`);
|
|
321
|
+
reportLines.push(` - Similarity: ${(conn.similarity * 100).toFixed(1)}%`);
|
|
322
|
+
if (conn.sharedTerms.length > 0) {
|
|
323
|
+
reportLines.push(` - Shared terms: ${conn.sharedTerms.join(", ")}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
await writeFile(options.output, reportLines.join("\n"));
|
|
327
|
+
console.log(chalk.green(`Report written to: ${options.output}`));
|
|
328
|
+
}
|
|
329
|
+
console.log(chalk.bold("Next Steps:"));
|
|
330
|
+
console.log(chalk.gray(" 1. Review suggested connections"));
|
|
331
|
+
console.log(chalk.gray(" 2. Add [[wiki-links]] to connect related documents"));
|
|
332
|
+
console.log(chalk.gray(" 3. Run kg analyze-links to verify improvement"));
|
|
333
|
+
console.log("");
|
|
334
|
+
}
|
|
335
|
+
} catch (error) {
|
|
336
|
+
console.error(chalk.red("Error:"), error instanceof Error ? error.message : "Unknown error");
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
return command;
|
|
341
|
+
}
|
|
342
|
+
export {
|
|
343
|
+
ConnectionFinder,
|
|
344
|
+
createFindConnectionsCommand,
|
|
345
|
+
createFindConnectionsCommand as default
|
|
346
|
+
};
|
|
347
|
+
//# sourceMappingURL=find-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-connections.js","sources":["../../../../src/cli/commands/hive-mind/find-connections.ts"],"sourcesContent":["/**\n * Hive Mind - Connection Finder\n *\n * Uses TF-IDF similarity to find potential connections between documents.\n * Suggests links for orphan files to reconnect the knowledge graph.\n *\n * SPEC-003: Hive Mind Reconnection Tools\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as path from 'path';\nimport { readFile, writeFile } from 'fs/promises';\nimport { glob } from 'fast-glob';\nimport matter from 'gray-matter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FindConnectionsOptions {\n threshold?: string;\n suggest?: boolean;\n limit?: string;\n output?: string;\n json?: boolean;\n verbose?: boolean;\n}\n\nexport interface SimilarityMatch {\n source: string;\n target: string;\n similarity: number;\n sharedTerms: string[];\n}\n\nexport interface DocumentVector {\n file: string;\n terms: Map<string, number>;\n magnitude: number;\n}\n\nexport interface ConnectionFinderResult {\n totalDocuments: number;\n suggestedConnections: SimilarityMatch[];\n orphanConnections: SimilarityMatch[];\n termCount: number;\n averageSimilarity: number;\n}\n\n// ============================================================================\n// TF-IDF Implementation\n// ============================================================================\n\n/**\n * Simple tokenizer - splits text into words\n */\nfunction tokenize(text: string): string[] {\n // Remove code blocks\n const noCode = text.replace(/```[\\s\\S]*?```/g, '');\n // Remove inline code\n const noInline = noCode.replace(/`[^`]+`/g, '');\n // Remove URLs\n const noUrls = noInline.replace(/https?:\\/\\/[^\\s]+/g, '');\n // Remove markdown links but keep text\n const noLinks = noUrls.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n // Remove wiki links but keep text\n const noWiki = noLinks.replace(/\\[\\[([^\\]|]+)(?:\\|[^\\]]+)?\\]\\]/g, '$1');\n // Remove special characters and split\n const words = noWiki\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 2 && word.length < 30);\n\n return words;\n}\n\n/**\n * Stopwords to filter out\n */\nconst STOPWORDS = new Set([\n 'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can', 'had', 'her',\n 'was', 'one', 'our', 'out', 'has', 'have', 'been', 'were', 'some', 'this',\n 'that', 'what', 'when', 'where', 'which', 'while', 'who', 'will', 'with',\n 'would', 'there', 'their', 'from', 'they', 'been', 'said', 'each', 'she',\n 'how', 'its', 'may', 'more', 'than', 'then', 'these', 'into', 'only',\n 'other', 'also', 'any', 'such', 'because', 'about', 'just', 'could', 'very',\n]);\n\n/**\n * Filter stopwords\n */\nfunction filterStopwords(words: string[]): string[] {\n return words.filter(word => !STOPWORDS.has(word));\n}\n\n// ============================================================================\n// Connection Finder Class\n// ============================================================================\n\nexport class ConnectionFinder {\n private documents: Map<string, string> = new Map();\n private documentVectors: Map<string, DocumentVector> = new Map();\n private documentFrequency: Map<string, number> = new Map();\n private totalDocuments = 0;\n\n /**\n * Build TF-IDF index from vault\n */\n async buildIndex(vaultPath: string): Promise<void> {\n const resolvedPath = path.resolve(vaultPath);\n\n // Find all markdown files\n const files = await glob('**/*.md', {\n cwd: resolvedPath,\n ignore: ['node_modules/**', '.git/**', 'dist/**'],\n absolute: false,\n });\n\n if (files.length === 0) {\n throw new Error(`No markdown files found in: ${resolvedPath}`);\n }\n\n this.documents.clear();\n this.documentVectors.clear();\n this.documentFrequency.clear();\n this.totalDocuments = files.length;\n\n // First pass: calculate document frequency\n const termDocuments = new Map<string, Set<string>>();\n\n for (const file of files) {\n const filePath = path.join(resolvedPath, file);\n const content = await readFile(filePath, 'utf-8');\n const { content: bodyContent, data: frontmatter } = matter(content);\n\n // Combine content with frontmatter fields\n const fullText = [\n frontmatter.title || '',\n frontmatter.description || '',\n Array.isArray(frontmatter.tags) ? frontmatter.tags.join(' ') : '',\n Array.isArray(frontmatter.aliases) ? frontmatter.aliases.join(' ') : '',\n bodyContent,\n ].join(' ');\n\n this.documents.set(file, fullText);\n\n const tokens = filterStopwords(tokenize(fullText));\n const uniqueTerms = new Set(tokens);\n\n for (const term of uniqueTerms) {\n if (!termDocuments.has(term)) {\n termDocuments.set(term, new Set());\n }\n termDocuments.get(term)!.add(file);\n }\n }\n\n // Store document frequency\n for (const [term, docs] of termDocuments) {\n this.documentFrequency.set(term, docs.size);\n }\n\n // Second pass: calculate TF-IDF vectors\n for (const file of files) {\n const content = this.documents.get(file)!;\n const tokens = filterStopwords(tokenize(content));\n\n // Calculate term frequency\n const termFreq = new Map<string, number>();\n for (const term of tokens) {\n termFreq.set(term, (termFreq.get(term) || 0) + 1);\n }\n\n // Calculate TF-IDF\n const tfidf = new Map<string, number>();\n const maxFreq = Math.max(...termFreq.values(), 1);\n\n for (const [term, freq] of termFreq) {\n const tf = freq / maxFreq; // Normalized TF\n const df = this.documentFrequency.get(term) || 1;\n const idf = Math.log(this.totalDocuments / df);\n tfidf.set(term, tf * idf);\n }\n\n // Calculate magnitude\n let magnitude = 0;\n for (const value of tfidf.values()) {\n magnitude += value * value;\n }\n magnitude = Math.sqrt(magnitude);\n\n this.documentVectors.set(file, {\n file,\n terms: tfidf,\n magnitude,\n });\n }\n }\n\n /**\n * Find similar documents to a source file\n */\n findSimilar(sourceFile: string, threshold = 0.3, limit = 10): SimilarityMatch[] {\n const sourceVector = this.documentVectors.get(sourceFile);\n if (!sourceVector) {\n return [];\n }\n\n const matches: SimilarityMatch[] = [];\n\n for (const [targetFile, targetVector] of this.documentVectors) {\n if (targetFile === sourceFile) continue;\n\n const similarity = this.cosineSimilarity(sourceVector, targetVector);\n\n if (similarity >= threshold) {\n const sharedTerms = this.findSharedTerms(sourceVector, targetVector);\n matches.push({\n source: sourceFile,\n target: targetFile,\n similarity: Math.round(similarity * 1000) / 1000,\n sharedTerms: sharedTerms.slice(0, 5),\n });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.similarity - a.similarity);\n\n return matches.slice(0, limit);\n }\n\n /**\n * Calculate cosine similarity between two document vectors\n */\n private cosineSimilarity(a: DocumentVector, b: DocumentVector): number {\n if (a.magnitude === 0 || b.magnitude === 0) return 0;\n\n let dotProduct = 0;\n for (const [term, aValue] of a.terms) {\n const bValue = b.terms.get(term) || 0;\n dotProduct += aValue * bValue;\n }\n\n return dotProduct / (a.magnitude * b.magnitude);\n }\n\n /**\n * Find shared terms between two documents\n */\n private findSharedTerms(a: DocumentVector, b: DocumentVector): string[] {\n const shared: Array<{ term: string; score: number }> = [];\n\n for (const [term, aValue] of a.terms) {\n const bValue = b.terms.get(term);\n if (bValue && bValue > 0) {\n shared.push({ term, score: aValue * bValue });\n }\n }\n\n // Sort by combined score\n shared.sort((a, b) => b.score - a.score);\n\n return shared.map(s => s.term);\n }\n\n /**\n * Suggest connections for orphan files\n */\n async suggestConnections(\n vaultPath: string,\n orphanFiles: string[],\n threshold = 0.3,\n limit = 5\n ): Promise<SimilarityMatch[]> {\n // Build index if not already built\n if (this.documentVectors.size === 0) {\n await this.buildIndex(vaultPath);\n }\n\n const suggestions: SimilarityMatch[] = [];\n\n for (const orphan of orphanFiles) {\n const similar = this.findSimilar(orphan, threshold, limit);\n suggestions.push(...similar);\n }\n\n // Sort by similarity descending\n suggestions.sort((a, b) => b.similarity - a.similarity);\n\n return suggestions;\n }\n\n /**\n * Find all potential connections above threshold\n */\n async findAllConnections(\n vaultPath: string,\n threshold = 0.3,\n limit = 100\n ): Promise<ConnectionFinderResult> {\n // Build index if not already built\n if (this.documentVectors.size === 0) {\n await this.buildIndex(vaultPath);\n }\n\n const allConnections: SimilarityMatch[] = [];\n const processed = new Set<string>();\n\n for (const sourceFile of this.documentVectors.keys()) {\n const similar = this.findSimilar(sourceFile, threshold, 10);\n for (const match of similar) {\n // Avoid duplicates (A-B and B-A)\n const key = [match.source, match.target].sort().join('|');\n if (!processed.has(key)) {\n processed.add(key);\n allConnections.push(match);\n }\n }\n }\n\n // Sort by similarity descending\n allConnections.sort((a, b) => b.similarity - a.similarity);\n\n const topConnections = allConnections.slice(0, limit);\n const averageSimilarity = topConnections.length > 0\n ? topConnections.reduce((sum, c) => sum + c.similarity, 0) / topConnections.length\n : 0;\n\n return {\n totalDocuments: this.totalDocuments,\n suggestedConnections: topConnections,\n orphanConnections: [],\n termCount: this.documentFrequency.size,\n averageSimilarity: Math.round(averageSimilarity * 1000) / 1000,\n };\n }\n\n /**\n * Get index statistics\n */\n getStats(): { documents: number; terms: number } {\n return {\n documents: this.documentVectors.size,\n terms: this.documentFrequency.size,\n };\n }\n}\n\n// ============================================================================\n// CLI Command\n// ============================================================================\n\nexport function createFindConnectionsCommand(): Command {\n const command = new Command('find-connections')\n .description('Find potential connections using TF-IDF similarity')\n .argument('<vault-path>', 'Path to Obsidian vault or docs directory')\n .option('-t, --threshold <number>', 'Similarity threshold (0-1)', '0.3')\n .option('-l, --limit <number>', 'Maximum connections to return', '50')\n .option('--suggest', 'Focus on orphan files')\n .option('-o, --output <file>', 'Output file for results')\n .option('--json', 'Output as JSON')\n .option('-v, --verbose', 'Show detailed output')\n .action(async (vaultPath: string, options: FindConnectionsOptions) => {\n const finder = new ConnectionFinder();\n const threshold = parseFloat(options.threshold || '0.3');\n const limit = parseInt(options.limit || '50', 10);\n\n console.log(chalk.cyan('\\nBuilding TF-IDF index...\\n'));\n\n try {\n await finder.buildIndex(vaultPath);\n const stats = finder.getStats();\n\n console.log(chalk.white(` Documents indexed: ${stats.documents}`));\n console.log(chalk.white(` Unique terms: ${stats.terms}`));\n console.log('');\n\n const result = await finder.findAllConnections(vaultPath, threshold, limit);\n\n if (options.json) {\n if (options.output) {\n await writeFile(options.output, JSON.stringify(result, null, 2));\n console.log(chalk.green(`Results written to: ${options.output}`));\n } else {\n console.log(JSON.stringify(result, null, 2));\n }\n } else {\n console.log(chalk.bold('Potential Connections Found:\\n'));\n\n if (result.suggestedConnections.length === 0) {\n console.log(chalk.yellow(' No connections found above threshold.'));\n console.log(chalk.gray(' Try lowering the threshold with -t option.\\n'));\n } else {\n for (const conn of result.suggestedConnections.slice(0, options.verbose ? 50 : 20)) {\n const simColor = conn.similarity >= 0.5 ? chalk.green : conn.similarity >= 0.3 ? chalk.yellow : chalk.gray;\n console.log(\n simColor(` [${(conn.similarity * 100).toFixed(1)}%]`),\n chalk.white(conn.source),\n chalk.gray('->'),\n chalk.cyan(conn.target)\n );\n if (options.verbose && conn.sharedTerms.length > 0) {\n console.log(chalk.gray(` Terms: ${conn.sharedTerms.join(', ')}`));\n }\n }\n\n if (result.suggestedConnections.length > (options.verbose ? 50 : 20)) {\n console.log(\n chalk.gray(`\\n ... and ${result.suggestedConnections.length - (options.verbose ? 50 : 20)} more`)\n );\n }\n\n console.log('');\n console.log(chalk.bold('Summary:'));\n console.log(chalk.white(` Total Documents: ${result.totalDocuments}`));\n console.log(chalk.white(` Connections Found: ${result.suggestedConnections.length}`));\n console.log(chalk.white(` Average Similarity: ${(result.averageSimilarity * 100).toFixed(1)}%`));\n console.log('');\n }\n\n // Write to output file if specified\n if (options.output) {\n const reportLines = [\n '# Connection Suggestions\\n',\n `Generated: ${new Date().toISOString()}\\n`,\n `Threshold: ${threshold}\\n`,\n '',\n '## Suggested Links\\n',\n ];\n\n for (const conn of result.suggestedConnections) {\n reportLines.push(`- **${conn.source}** -> [[${conn.target}]]`);\n reportLines.push(` - Similarity: ${(conn.similarity * 100).toFixed(1)}%`);\n if (conn.sharedTerms.length > 0) {\n reportLines.push(` - Shared terms: ${conn.sharedTerms.join(', ')}`);\n }\n }\n\n await writeFile(options.output, reportLines.join('\\n'));\n console.log(chalk.green(`Report written to: ${options.output}`));\n }\n\n // Show next steps\n console.log(chalk.bold('Next Steps:'));\n console.log(chalk.gray(' 1. Review suggested connections'));\n console.log(chalk.gray(' 2. Add [[wiki-links]] to connect related documents'));\n console.log(chalk.gray(' 3. Run kg analyze-links to verify improvement'));\n console.log('');\n }\n } catch (error) {\n console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n return command;\n}\n\nexport default createFindConnectionsCommand;\n"],"names":["a","b"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive Mind - Knowledge Graph Reconnection Tools
|
|
3
|
+
*
|
|
4
|
+
* A suite of CLI tools for analyzing and reconnecting knowledge graphs
|
|
5
|
+
* to reduce orphan rates and increase link density.
|
|
6
|
+
*
|
|
7
|
+
* SPEC-003: Hive Mind Reconnection Tools
|
|
8
|
+
*
|
|
9
|
+
* Target Metrics:
|
|
10
|
+
* - Orphan rate: 88.1% -> < 10%
|
|
11
|
+
* - Link density: 1.08 -> > 5.0
|
|
12
|
+
*/
|
|
13
|
+
export { LinkAnalyzer } from './analyze-links.js';
|
|
14
|
+
export type { LinkAnalysisResult, BrokenLink, AnalyzeOptions } from './analyze-links.js';
|
|
15
|
+
export { ConnectionFinder } from './find-connections.js';
|
|
16
|
+
export type { ConnectionFinderResult, SimilarityMatch, FindConnectionsOptions } from './find-connections.js';
|
|
17
|
+
export { NameValidator } from './validate-names.js';
|
|
18
|
+
export type { ValidationResult, InvalidFile, NamingSchema, ValidateNamesOptions } from './validate-names.js';
|
|
19
|
+
export { FrontmatterEnricher } from './add-frontmatter.js';
|
|
20
|
+
export type { EnrichResult, EnrichedFile, FrontmatterTemplate, EnrichOptions } from './add-frontmatter.js';
|
|
21
|
+
export { createAnalyzeLinksCommand } from './analyze-links.js';
|
|
22
|
+
export { createFindConnectionsCommand } from './find-connections.js';
|
|
23
|
+
export { createValidateNamesCommand } from './validate-names.js';
|
|
24
|
+
export { createAddFrontmatterCommand } from './add-frontmatter.js';
|
|
25
|
+
import { Command } from 'commander';
|
|
26
|
+
/**
|
|
27
|
+
* Create the hive-mind command group
|
|
28
|
+
*
|
|
29
|
+
* Groups all Hive Mind reconnection tools under a single command namespace:
|
|
30
|
+
* - kg hive-mind analyze-links <vault>
|
|
31
|
+
* - kg hive-mind find-connections <vault>
|
|
32
|
+
* - kg hive-mind validate-names <vault>
|
|
33
|
+
* - kg hive-mind add-frontmatter <vault>
|
|
34
|
+
*/
|
|
35
|
+
export declare function createHiveMindCommand(): Command;
|
|
36
|
+
export default createHiveMindCommand;
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/hive-mind/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE7G,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG3G,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAiB/C;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createAnalyzeLinksCommand } from "./analyze-links.js";
|
|
2
|
+
import { LinkAnalyzer } from "./analyze-links.js";
|
|
3
|
+
import { createFindConnectionsCommand } from "./find-connections.js";
|
|
4
|
+
import { ConnectionFinder } from "./find-connections.js";
|
|
5
|
+
import { createValidateNamesCommand } from "./validate-names.js";
|
|
6
|
+
import { NameValidator } from "./validate-names.js";
|
|
7
|
+
import { createAddFrontmatterCommand } from "./add-frontmatter.js";
|
|
8
|
+
import { FrontmatterEnricher } from "./add-frontmatter.js";
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
function createHiveMindCommand() {
|
|
11
|
+
const command = new Command("hive-mind").description("Knowledge graph reconnection tools - reduce orphan rate and increase link density").alias("hm");
|
|
12
|
+
command.addCommand(createAnalyzeLinksCommand());
|
|
13
|
+
command.addCommand(createFindConnectionsCommand());
|
|
14
|
+
command.addCommand(createValidateNamesCommand());
|
|
15
|
+
command.addCommand(createAddFrontmatterCommand());
|
|
16
|
+
command.action(() => {
|
|
17
|
+
command.help();
|
|
18
|
+
});
|
|
19
|
+
return command;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
ConnectionFinder,
|
|
23
|
+
FrontmatterEnricher,
|
|
24
|
+
LinkAnalyzer,
|
|
25
|
+
NameValidator,
|
|
26
|
+
createAddFrontmatterCommand,
|
|
27
|
+
createAnalyzeLinksCommand,
|
|
28
|
+
createFindConnectionsCommand,
|
|
29
|
+
createHiveMindCommand,
|
|
30
|
+
createValidateNamesCommand,
|
|
31
|
+
createHiveMindCommand as default
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/cli/commands/hive-mind/index.ts"],"sourcesContent":["/**\n * Hive Mind - Knowledge Graph Reconnection Tools\n *\n * A suite of CLI tools for analyzing and reconnecting knowledge graphs\n * to reduce orphan rates and increase link density.\n *\n * SPEC-003: Hive Mind Reconnection Tools\n *\n * Target Metrics:\n * - Orphan rate: 88.1% -> < 10%\n * - Link density: 1.08 -> > 5.0\n */\n\n// Re-export classes for programmatic use\nexport { LinkAnalyzer } from './analyze-links.js';\nexport type { LinkAnalysisResult, BrokenLink, AnalyzeOptions } from './analyze-links.js';\n\nexport { ConnectionFinder } from './find-connections.js';\nexport type { ConnectionFinderResult, SimilarityMatch, FindConnectionsOptions } from './find-connections.js';\n\nexport { NameValidator } from './validate-names.js';\nexport type { ValidationResult, InvalidFile, NamingSchema, ValidateNamesOptions } from './validate-names.js';\n\nexport { FrontmatterEnricher } from './add-frontmatter.js';\nexport type { EnrichResult, EnrichedFile, FrontmatterTemplate, EnrichOptions } from './add-frontmatter.js';\n\n// Re-export CLI command creators\nexport { createAnalyzeLinksCommand } from './analyze-links.js';\nexport { createFindConnectionsCommand } from './find-connections.js';\nexport { createValidateNamesCommand } from './validate-names.js';\nexport { createAddFrontmatterCommand } from './add-frontmatter.js';\n\nimport { Command } from 'commander';\nimport { createAnalyzeLinksCommand } from './analyze-links.js';\nimport { createFindConnectionsCommand } from './find-connections.js';\nimport { createValidateNamesCommand } from './validate-names.js';\nimport { createAddFrontmatterCommand } from './add-frontmatter.js';\n\n/**\n * Create the hive-mind command group\n *\n * Groups all Hive Mind reconnection tools under a single command namespace:\n * - kg hive-mind analyze-links <vault>\n * - kg hive-mind find-connections <vault>\n * - kg hive-mind validate-names <vault>\n * - kg hive-mind add-frontmatter <vault>\n */\nexport function createHiveMindCommand(): Command {\n const command = new Command('hive-mind')\n .description('Knowledge graph reconnection tools - reduce orphan rate and increase link density')\n .alias('hm');\n\n // Add subcommands\n command.addCommand(createAnalyzeLinksCommand());\n command.addCommand(createFindConnectionsCommand());\n command.addCommand(createValidateNamesCommand());\n command.addCommand(createAddFrontmatterCommand());\n\n // Default action - show help\n command.action(() => {\n command.help();\n });\n\n return command;\n}\n\nexport default createHiveMindCommand;\n"],"names":["createAnalyzeLinksCommand","createFindConnectionsCommand","createValidateNamesCommand","createAddFrontmatterCommand"],"mappings":";;;;;;;;;AA+CO,SAAS,wBAAiC;AAC/C,QAAM,UAAU,IAAI,QAAQ,WAAW,EACpC,YAAY,mFAAmF,EAC/F,MAAM,IAAI;AAGb,UAAQ,WAAWA,2BAA2B;AAC9C,UAAQ,WAAWC,8BAA8B;AACjD,UAAQ,WAAWC,4BAA4B;AAC/C,UAAQ,WAAWC,6BAA6B;AAGhD,UAAQ,OAAO,MAAM;AACnB,YAAQ,KAAA;AAAA,EACV,CAAC;AAED,SAAO;AACT;"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hive Mind - Name Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates file naming schema in a vault to ensure consistent, linkable names.
|
|
5
|
+
* Supports kebab-case, lowercase, and other naming conventions.
|
|
6
|
+
*
|
|
7
|
+
* SPEC-003: Hive Mind Reconnection Tools
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export interface ValidateNamesOptions {
|
|
11
|
+
fix?: boolean;
|
|
12
|
+
dryRun?: boolean;
|
|
13
|
+
schema?: string;
|
|
14
|
+
output?: string;
|
|
15
|
+
json?: boolean;
|
|
16
|
+
verbose?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface InvalidFile {
|
|
19
|
+
file: string;
|
|
20
|
+
issues: string[];
|
|
21
|
+
suggested: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ValidationResult {
|
|
24
|
+
valid: string[];
|
|
25
|
+
invalid: InvalidFile[];
|
|
26
|
+
statistics: {
|
|
27
|
+
totalFiles: number;
|
|
28
|
+
validCount: number;
|
|
29
|
+
invalidCount: number;
|
|
30
|
+
commonIssues: Map<string, number>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface NamingSchema {
|
|
34
|
+
name: string;
|
|
35
|
+
patterns: {
|
|
36
|
+
lowercase: boolean;
|
|
37
|
+
separator: '-' | '_' | '.';
|
|
38
|
+
maxLength: number;
|
|
39
|
+
allowedChars: RegExp;
|
|
40
|
+
reservedNames: string[];
|
|
41
|
+
allowMixedSeparators?: boolean;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export declare class NameValidator {
|
|
45
|
+
private schema;
|
|
46
|
+
constructor(schemaName?: string);
|
|
47
|
+
/**
|
|
48
|
+
* Validate all files in a vault
|
|
49
|
+
*/
|
|
50
|
+
validateVault(vaultPath: string, options?: ValidateNamesOptions): Promise<ValidationResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Validate a single filename
|
|
53
|
+
*/
|
|
54
|
+
validateFilename(filename: string): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Suggest a valid filename
|
|
57
|
+
*/
|
|
58
|
+
suggestRename(filename: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Rename files (with safety checks)
|
|
61
|
+
*/
|
|
62
|
+
renameFiles(vaultPath: string, invalidFiles: InvalidFile[], dryRun?: boolean): Promise<Array<{
|
|
63
|
+
from: string;
|
|
64
|
+
to: string;
|
|
65
|
+
success: boolean;
|
|
66
|
+
error?: string;
|
|
67
|
+
}>>;
|
|
68
|
+
/**
|
|
69
|
+
* Get current schema
|
|
70
|
+
*/
|
|
71
|
+
getSchema(): NamingSchema;
|
|
72
|
+
/**
|
|
73
|
+
* Generate report
|
|
74
|
+
*/
|
|
75
|
+
generateReport(result: ValidationResult): string;
|
|
76
|
+
}
|
|
77
|
+
export declare function createValidateNamesCommand(): Command;
|
|
78
|
+
export default createValidateNamesCommand;
|
|
79
|
+
//# sourceMappingURL=validate-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-names.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/hive-mind/validate-names.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;KAChC,CAAC;CACH;AA4CD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;gBAEjB,UAAU,SAAU;IAIhC;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDrG;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAyD5C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IA2CvC;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,WAAW,EAAE,EAC3B,MAAM,UAAQ,GACb,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAoDjF;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM;CAyCjD;AAMD,wBAAgB,0BAA0B,IAAI,OAAO,CA6HpD;AAED,eAAe,0BAA0B,CAAC"}
|