@goondocks/myco 0.2.6 → 0.2.8
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/.claude-plugin/plugin.json +1 -1
- package/CONTRIBUTING.md +1 -1
- package/commands/init.md +10 -26
- package/dist/chunk-4JML636J.js +52 -0
- package/dist/chunk-4JML636J.js.map +1 -0
- package/dist/chunk-AOMX45LH.js +8974 -0
- package/dist/chunk-AOMX45LH.js.map +1 -0
- package/dist/chunk-I7PMGO6S.js +58 -0
- package/dist/chunk-I7PMGO6S.js.map +1 -0
- package/dist/chunk-N33KUCFP.js +33 -0
- package/dist/chunk-N33KUCFP.js.map +1 -0
- package/dist/chunk-NYNEJ5QY.js +71 -0
- package/dist/chunk-NYNEJ5QY.js.map +1 -0
- package/dist/chunk-PA3VMINE.js +111 -0
- package/dist/chunk-PA3VMINE.js.map +1 -0
- package/dist/chunk-PZUWP5VK.js +44 -0
- package/dist/chunk-PZUWP5VK.js.map +1 -0
- package/dist/chunk-SVUINMDD.js +104 -0
- package/dist/chunk-SVUINMDD.js.map +1 -0
- package/dist/chunk-TH6GIBXG.js +91 -0
- package/dist/chunk-TH6GIBXG.js.map +1 -0
- package/dist/chunk-TWDS6MSU.js +354 -0
- package/dist/chunk-TWDS6MSU.js.map +1 -0
- package/dist/chunk-UIIZRTJU.js +21172 -0
- package/dist/chunk-UIIZRTJU.js.map +1 -0
- package/dist/chunk-YMYJ7FNH.js +19 -0
- package/dist/chunk-YMYJ7FNH.js.map +1 -0
- package/dist/chunk-ZJQ5G637.js +21 -0
- package/dist/chunk-ZJQ5G637.js.map +1 -0
- package/dist/chunk-ZTZVX5E6.js +421 -0
- package/dist/chunk-ZTZVX5E6.js.map +1 -0
- package/dist/cli-K5FSKLQC.js +625 -0
- package/dist/cli-K5FSKLQC.js.map +1 -0
- package/dist/client-4JMOYNKK.js +11 -0
- package/dist/client-4JMOYNKK.js.map +1 -0
- package/dist/main-5W4ADOBG.js +3224 -0
- package/dist/main-5W4ADOBG.js.map +1 -0
- package/dist/server-PIEPVUUH.js +14725 -0
- package/dist/server-PIEPVUUH.js.map +1 -0
- package/dist/session-start-2NNQHT5S.js +189 -0
- package/dist/session-start-2NNQHT5S.js.map +1 -0
- package/dist/src/cli.js +9 -582
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon/main.js +9 -737
- package/dist/src/daemon/main.js.map +1 -1
- package/dist/src/hooks/post-tool-use.js +47 -35
- package/dist/src/hooks/post-tool-use.js.map +1 -1
- package/dist/src/hooks/session-end.js +29 -18
- package/dist/src/hooks/session-end.js.map +1 -1
- package/dist/src/hooks/session-start.js +9 -48
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/stop.js +39 -30
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/hooks/user-prompt-submit.js +48 -40
- package/dist/src/hooks/user-prompt-submit.js.map +1 -1
- package/dist/src/mcp/server.js +9 -304
- package/dist/src/mcp/server.js.map +1 -1
- package/package.json +3 -2
- package/dist/src/agents/adapter.d.ts +0 -76
- package/dist/src/agents/adapter.d.ts.map +0 -1
- package/dist/src/agents/adapter.js +0 -124
- package/dist/src/agents/adapter.js.map +0 -1
- package/dist/src/agents/claude-code.d.ts +0 -3
- package/dist/src/agents/claude-code.d.ts.map +0 -1
- package/dist/src/agents/claude-code.js +0 -22
- package/dist/src/agents/claude-code.js.map +0 -1
- package/dist/src/agents/cursor.d.ts +0 -3
- package/dist/src/agents/cursor.d.ts.map +0 -1
- package/dist/src/agents/cursor.js +0 -154
- package/dist/src/agents/cursor.js.map +0 -1
- package/dist/src/agents/index.d.ts +0 -6
- package/dist/src/agents/index.d.ts.map +0 -1
- package/dist/src/agents/index.js +0 -5
- package/dist/src/agents/index.js.map +0 -1
- package/dist/src/agents/registry.d.ts +0 -34
- package/dist/src/agents/registry.d.ts.map +0 -1
- package/dist/src/agents/registry.js +0 -95
- package/dist/src/agents/registry.js.map +0 -1
- package/dist/src/artifacts/candidates.d.ts +0 -20
- package/dist/src/artifacts/candidates.d.ts.map +0 -1
- package/dist/src/artifacts/candidates.js +0 -84
- package/dist/src/artifacts/candidates.js.map +0 -1
- package/dist/src/artifacts/slugify.d.ts +0 -2
- package/dist/src/artifacts/slugify.d.ts.map +0 -1
- package/dist/src/artifacts/slugify.js +0 -22
- package/dist/src/artifacts/slugify.js.map +0 -1
- package/dist/src/capture/buffer.d.ts +0 -20
- package/dist/src/capture/buffer.d.ts.map +0 -1
- package/dist/src/capture/buffer.js +0 -55
- package/dist/src/capture/buffer.js.map +0 -1
- package/dist/src/capture/transcript-miner.d.ts +0 -31
- package/dist/src/capture/transcript-miner.d.ts.map +0 -1
- package/dist/src/capture/transcript-miner.js +0 -61
- package/dist/src/capture/transcript-miner.js.map +0 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/config/loader.d.ts +0 -4
- package/dist/src/config/loader.d.ts.map +0 -1
- package/dist/src/config/loader.js +0 -32
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/config/schema.d.ts +0 -83
- package/dist/src/config/schema.d.ts.map +0 -1
- package/dist/src/config/schema.js +0 -55
- package/dist/src/config/schema.js.map +0 -1
- package/dist/src/constants.d.ts +0 -73
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -86
- package/dist/src/constants.js.map +0 -1
- package/dist/src/context/injector.d.ts +0 -18
- package/dist/src/context/injector.d.ts.map +0 -1
- package/dist/src/context/injector.js +0 -71
- package/dist/src/context/injector.js.map +0 -1
- package/dist/src/context/relevance.d.ts +0 -13
- package/dist/src/context/relevance.d.ts.map +0 -1
- package/dist/src/context/relevance.js +0 -44
- package/dist/src/context/relevance.js.map +0 -1
- package/dist/src/daemon/batch.d.ts +0 -22
- package/dist/src/daemon/batch.d.ts.map +0 -1
- package/dist/src/daemon/batch.js +0 -38
- package/dist/src/daemon/batch.js.map +0 -1
- package/dist/src/daemon/lifecycle.d.ts +0 -27
- package/dist/src/daemon/lifecycle.d.ts.map +0 -1
- package/dist/src/daemon/lifecycle.js +0 -50
- package/dist/src/daemon/lifecycle.js.map +0 -1
- package/dist/src/daemon/lineage.d.ts +0 -42
- package/dist/src/daemon/lineage.d.ts.map +0 -1
- package/dist/src/daemon/lineage.js +0 -116
- package/dist/src/daemon/lineage.js.map +0 -1
- package/dist/src/daemon/logger.d.ts +0 -33
- package/dist/src/daemon/logger.d.ts.map +0 -1
- package/dist/src/daemon/logger.js +0 -88
- package/dist/src/daemon/logger.js.map +0 -1
- package/dist/src/daemon/main.d.ts +0 -2
- package/dist/src/daemon/main.d.ts.map +0 -1
- package/dist/src/daemon/processor.d.ts +0 -44
- package/dist/src/daemon/processor.d.ts.map +0 -1
- package/dist/src/daemon/processor.js +0 -142
- package/dist/src/daemon/processor.js.map +0 -1
- package/dist/src/daemon/server.d.ts +0 -24
- package/dist/src/daemon/server.d.ts.map +0 -1
- package/dist/src/daemon/server.js +0 -117
- package/dist/src/daemon/server.js.map +0 -1
- package/dist/src/daemon/watcher.d.ts +0 -29
- package/dist/src/daemon/watcher.d.ts.map +0 -1
- package/dist/src/daemon/watcher.js +0 -67
- package/dist/src/daemon/watcher.js.map +0 -1
- package/dist/src/hooks/client.d.ts +0 -20
- package/dist/src/hooks/client.d.ts.map +0 -1
- package/dist/src/hooks/client.js +0 -111
- package/dist/src/hooks/client.js.map +0 -1
- package/dist/src/hooks/post-tool-use.d.ts +0 -2
- package/dist/src/hooks/post-tool-use.d.ts.map +0 -1
- package/dist/src/hooks/read-stdin.d.ts +0 -2
- package/dist/src/hooks/read-stdin.d.ts.map +0 -1
- package/dist/src/hooks/read-stdin.js +0 -10
- package/dist/src/hooks/read-stdin.js.map +0 -1
- package/dist/src/hooks/session-end.d.ts +0 -2
- package/dist/src/hooks/session-end.d.ts.map +0 -1
- package/dist/src/hooks/session-start.d.ts +0 -2
- package/dist/src/hooks/session-start.d.ts.map +0 -1
- package/dist/src/hooks/stop.d.ts +0 -2
- package/dist/src/hooks/stop.d.ts.map +0 -1
- package/dist/src/hooks/user-prompt-submit.d.ts +0 -2
- package/dist/src/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/src/index/fts.d.ts +0 -16
- package/dist/src/index/fts.d.ts.map +0 -1
- package/dist/src/index/fts.js +0 -53
- package/dist/src/index/fts.js.map +0 -1
- package/dist/src/index/rebuild.d.ts +0 -4
- package/dist/src/index/rebuild.d.ts.map +0 -1
- package/dist/src/index/rebuild.js +0 -40
- package/dist/src/index/rebuild.js.map +0 -1
- package/dist/src/index/sqlite.d.ts +0 -33
- package/dist/src/index/sqlite.d.ts.map +0 -1
- package/dist/src/index/sqlite.js +0 -99
- package/dist/src/index/sqlite.js.map +0 -1
- package/dist/src/index/vectors.d.ts +0 -24
- package/dist/src/index/vectors.d.ts.map +0 -1
- package/dist/src/index/vectors.js +0 -97
- package/dist/src/index/vectors.js.map +0 -1
- package/dist/src/intelligence/anthropic.d.ts +0 -17
- package/dist/src/intelligence/anthropic.d.ts.map +0 -1
- package/dist/src/intelligence/anthropic.js +0 -36
- package/dist/src/intelligence/anthropic.js.map +0 -1
- package/dist/src/intelligence/embeddings.d.ts +0 -3
- package/dist/src/intelligence/embeddings.d.ts.map +0 -1
- package/dist/src/intelligence/embeddings.js +0 -15
- package/dist/src/intelligence/embeddings.js.map +0 -1
- package/dist/src/intelligence/llm.d.ts +0 -33
- package/dist/src/intelligence/llm.d.ts.map +0 -1
- package/dist/src/intelligence/llm.js +0 -26
- package/dist/src/intelligence/llm.js.map +0 -1
- package/dist/src/intelligence/lm-studio.d.ts +0 -20
- package/dist/src/intelligence/lm-studio.d.ts.map +0 -1
- package/dist/src/intelligence/lm-studio.js +0 -59
- package/dist/src/intelligence/lm-studio.js.map +0 -1
- package/dist/src/intelligence/ollama.d.ts +0 -22
- package/dist/src/intelligence/ollama.d.ts.map +0 -1
- package/dist/src/intelligence/ollama.js +0 -64
- package/dist/src/intelligence/ollama.js.map +0 -1
- package/dist/src/intelligence/response.d.ts +0 -29
- package/dist/src/intelligence/response.d.ts.map +0 -1
- package/dist/src/intelligence/response.js +0 -71
- package/dist/src/intelligence/response.js.map +0 -1
- package/dist/src/logs/format.d.ts +0 -6
- package/dist/src/logs/format.d.ts.map +0 -1
- package/dist/src/logs/format.js +0 -46
- package/dist/src/logs/format.js.map +0 -1
- package/dist/src/logs/reader.d.ts +0 -28
- package/dist/src/logs/reader.d.ts.map +0 -1
- package/dist/src/logs/reader.js +0 -106
- package/dist/src/logs/reader.js.map +0 -1
- package/dist/src/mcp/server.d.ts +0 -16
- package/dist/src/mcp/server.d.ts.map +0 -1
- package/dist/src/mcp/tools/consolidate.d.ts +0 -15
- package/dist/src/mcp/tools/consolidate.d.ts.map +0 -1
- package/dist/src/mcp/tools/consolidate.js +0 -49
- package/dist/src/mcp/tools/consolidate.js.map +0 -1
- package/dist/src/mcp/tools/graph.d.ts +0 -30
- package/dist/src/mcp/tools/graph.d.ts.map +0 -1
- package/dist/src/mcp/tools/graph.js +0 -106
- package/dist/src/mcp/tools/graph.js.map +0 -1
- package/dist/src/mcp/tools/logs.d.ts +0 -3
- package/dist/src/mcp/tools/logs.d.ts.map +0 -1
- package/dist/src/mcp/tools/logs.js +0 -7
- package/dist/src/mcp/tools/logs.js.map +0 -1
- package/dist/src/mcp/tools/plans.d.ts +0 -23
- package/dist/src/mcp/tools/plans.d.ts.map +0 -1
- package/dist/src/mcp/tools/plans.js +0 -63
- package/dist/src/mcp/tools/plans.js.map +0 -1
- package/dist/src/mcp/tools/recall.d.ts +0 -30
- package/dist/src/mcp/tools/recall.d.ts.map +0 -1
- package/dist/src/mcp/tools/recall.js +0 -34
- package/dist/src/mcp/tools/recall.js.map +0 -1
- package/dist/src/mcp/tools/remember.d.ts +0 -15
- package/dist/src/mcp/tools/remember.d.ts.map +0 -1
- package/dist/src/mcp/tools/remember.js +0 -18
- package/dist/src/mcp/tools/remember.js.map +0 -1
- package/dist/src/mcp/tools/search.d.ts +0 -19
- package/dist/src/mcp/tools/search.d.ts.map +0 -1
- package/dist/src/mcp/tools/search.js +0 -59
- package/dist/src/mcp/tools/search.js.map +0 -1
- package/dist/src/mcp/tools/sessions.d.ts +0 -21
- package/dist/src/mcp/tools/sessions.d.ts.map +0 -1
- package/dist/src/mcp/tools/sessions.js +0 -36
- package/dist/src/mcp/tools/sessions.js.map +0 -1
- package/dist/src/mcp/tools/supersede.d.ts +0 -14
- package/dist/src/mcp/tools/supersede.d.ts.map +0 -1
- package/dist/src/mcp/tools/supersede.js +0 -30
- package/dist/src/mcp/tools/supersede.js.map +0 -1
- package/dist/src/mcp/tools/team.d.ts +0 -16
- package/dist/src/mcp/tools/team.d.ts.map +0 -1
- package/dist/src/mcp/tools/team.js +0 -32
- package/dist/src/mcp/tools/team.js.map +0 -1
- package/dist/src/obsidian/formatter.d.ts +0 -80
- package/dist/src/obsidian/formatter.d.ts.map +0 -1
- package/dist/src/obsidian/formatter.js +0 -227
- package/dist/src/obsidian/formatter.js.map +0 -1
- package/dist/src/prompts/index.d.ts +0 -13
- package/dist/src/prompts/index.d.ts.map +0 -1
- package/dist/src/prompts/index.js +0 -75
- package/dist/src/prompts/index.js.map +0 -1
- package/dist/src/vault/frontmatter.d.ts +0 -6
- package/dist/src/vault/frontmatter.d.ts.map +0 -1
- package/dist/src/vault/frontmatter.js +0 -10
- package/dist/src/vault/frontmatter.js.map +0 -1
- package/dist/src/vault/observations.d.ts +0 -10
- package/dist/src/vault/observations.d.ts.map +0 -1
- package/dist/src/vault/observations.js +0 -33
- package/dist/src/vault/observations.js.map +0 -1
- package/dist/src/vault/reader.d.ts +0 -10
- package/dist/src/vault/reader.d.ts.map +0 -1
- package/dist/src/vault/reader.js +0 -48
- package/dist/src/vault/reader.js.map +0 -1
- package/dist/src/vault/resolve.d.ts +0 -18
- package/dist/src/vault/resolve.d.ts.map +0 -1
- package/dist/src/vault/resolve.js +0 -51
- package/dist/src/vault/resolve.js.map +0 -1
- package/dist/src/vault/session-id.d.ts +0 -16
- package/dist/src/vault/session-id.d.ts.map +0 -1
- package/dist/src/vault/session-id.js +0 -29
- package/dist/src/vault/session-id.js.map +0 -1
- package/dist/src/vault/types.d.ts +0 -88
- package/dist/src/vault/types.d.ts.map +0 -1
- package/dist/src/vault/types.js +0 -94
- package/dist/src/vault/types.js.map +0 -1
- package/dist/src/vault/writer.d.ts +0 -66
- package/dist/src/vault/writer.d.ts.map +0 -1
- package/dist/src/vault/writer.js +0 -217
- package/dist/src/vault/writer.js.map +0 -1
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
DEFAULT_LOG_TAIL,
|
|
5
|
+
matchesFilter,
|
|
6
|
+
queryLogs
|
|
7
|
+
} from "./chunk-TH6GIBXG.js";
|
|
8
|
+
import {
|
|
9
|
+
LEVEL_ORDER,
|
|
10
|
+
VectorIndex,
|
|
11
|
+
createEmbeddingProvider,
|
|
12
|
+
generateEmbedding,
|
|
13
|
+
initFts,
|
|
14
|
+
rebuildIndex,
|
|
15
|
+
searchFts
|
|
16
|
+
} from "./chunk-AOMX45LH.js";
|
|
17
|
+
import {
|
|
18
|
+
MycoIndex
|
|
19
|
+
} from "./chunk-PA3VMINE.js";
|
|
20
|
+
import {
|
|
21
|
+
loadConfig,
|
|
22
|
+
require_dist
|
|
23
|
+
} from "./chunk-UIIZRTJU.js";
|
|
24
|
+
import {
|
|
25
|
+
resolveVaultDir
|
|
26
|
+
} from "./chunk-N33KUCFP.js";
|
|
27
|
+
import {
|
|
28
|
+
AgentRegistry
|
|
29
|
+
} from "./chunk-TWDS6MSU.js";
|
|
30
|
+
import {
|
|
31
|
+
EMBEDDING_INPUT_LIMIT
|
|
32
|
+
} from "./chunk-NYNEJ5QY.js";
|
|
33
|
+
import {
|
|
34
|
+
__toESM
|
|
35
|
+
} from "./chunk-PZUWP5VK.js";
|
|
36
|
+
|
|
37
|
+
// src/cli.ts
|
|
38
|
+
import fs from "fs";
|
|
39
|
+
import path from "path";
|
|
40
|
+
import os from "os";
|
|
41
|
+
|
|
42
|
+
// src/logs/format.ts
|
|
43
|
+
var LOG_VALUE_MAX_DISPLAY = 80;
|
|
44
|
+
var CORE_FIELDS = ["timestamp", "level", "component", "message"];
|
|
45
|
+
function formatLogLine(entry) {
|
|
46
|
+
const time = formatLocalTime(entry.timestamp);
|
|
47
|
+
const lvl = entry.level.toUpperCase().padEnd(5);
|
|
48
|
+
const comp = `[${entry.component}]`.padEnd(14);
|
|
49
|
+
const extras = [];
|
|
50
|
+
for (const [key, value] of Object.entries(entry)) {
|
|
51
|
+
if (CORE_FIELDS.includes(key)) continue;
|
|
52
|
+
const str = String(value);
|
|
53
|
+
const display = str.length > LOG_VALUE_MAX_DISPLAY ? str.slice(0, LOG_VALUE_MAX_DISPLAY) + "..." : str;
|
|
54
|
+
extras.push(`${key}=${display}`);
|
|
55
|
+
}
|
|
56
|
+
const extraStr = extras.length > 0 ? " " + extras.join(" ") : "";
|
|
57
|
+
return `${time} ${lvl} ${comp} ${entry.message}${extraStr}`;
|
|
58
|
+
}
|
|
59
|
+
function formatLocalTime(iso) {
|
|
60
|
+
const d = new Date(iso);
|
|
61
|
+
const hh = String(d.getHours()).padStart(2, "0");
|
|
62
|
+
const mm = String(d.getMinutes()).padStart(2, "0");
|
|
63
|
+
const ss = String(d.getSeconds()).padStart(2, "0");
|
|
64
|
+
return `${hh}:${mm}:${ss}`;
|
|
65
|
+
}
|
|
66
|
+
function parseIntFlag(args, long, short) {
|
|
67
|
+
for (let i = 0; i < args.length; i++) {
|
|
68
|
+
if (args[i] === long || short && args[i] === short) {
|
|
69
|
+
const val = parseInt(args[i + 1], 10);
|
|
70
|
+
return isNaN(val) ? void 0 : val;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
function parseStringFlag(args, long, short) {
|
|
76
|
+
for (let i = 0; i < args.length; i++) {
|
|
77
|
+
if (args[i] === long || short && args[i] === short) {
|
|
78
|
+
return args[i + 1];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return void 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/cli.ts
|
|
85
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
86
|
+
function loadEnv() {
|
|
87
|
+
const envPath = path.resolve(process.cwd(), ".env");
|
|
88
|
+
if (!fs.existsSync(envPath)) return;
|
|
89
|
+
for (const line of fs.readFileSync(envPath, "utf-8").split("\n")) {
|
|
90
|
+
const match = line.match(/^\s*([^#=]+?)\s*=\s*(.*?)\s*$/);
|
|
91
|
+
if (match && !process.env[match[1]]) {
|
|
92
|
+
process.env[match[1]] = match[2];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
loadEnv();
|
|
97
|
+
var USAGE = `Usage: myco <command> [args]
|
|
98
|
+
|
|
99
|
+
Commands:
|
|
100
|
+
init [options] Initialize a new vault
|
|
101
|
+
stats Vault health, index counts, vector count
|
|
102
|
+
search <query> Combined FTS + vector search with scores
|
|
103
|
+
vectors <query> Raw vector search with similarity scores
|
|
104
|
+
session [id|latest] Show a session note
|
|
105
|
+
logs [options] View daemon logs (--tail N, --follow, --level, --component)
|
|
106
|
+
restart Restart the daemon with current code
|
|
107
|
+
rebuild Reindex the entire vault
|
|
108
|
+
|
|
109
|
+
Init options:
|
|
110
|
+
--vault <path> Vault directory (default: .myco/ in project root)
|
|
111
|
+
--llm-provider <name> LLM provider: ollama, lm-studio, anthropic
|
|
112
|
+
--llm-model <name> LLM model name (e.g., gpt-oss)
|
|
113
|
+
--llm-url <url> LLM base URL (default per provider)
|
|
114
|
+
--embedding-provider <name> Embedding provider: ollama, lm-studio
|
|
115
|
+
--embedding-model <name> Embedding model name (e.g., bge-m3)
|
|
116
|
+
--embedding-url <url> Embedding base URL (default per provider)
|
|
117
|
+
--user <name> Team username
|
|
118
|
+
--team Enable team mode
|
|
119
|
+
`;
|
|
120
|
+
async function main() {
|
|
121
|
+
const [cmd, ...args] = process.argv.slice(2);
|
|
122
|
+
if (!cmd || cmd === "--help" || cmd === "-h") {
|
|
123
|
+
process.stdout.write(USAGE);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (cmd === "init") return initVault(args);
|
|
127
|
+
const vaultDir = resolveVaultDir();
|
|
128
|
+
if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
|
|
129
|
+
console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
switch (cmd) {
|
|
133
|
+
case "stats":
|
|
134
|
+
return stats(vaultDir);
|
|
135
|
+
case "search":
|
|
136
|
+
return search(vaultDir, args.join(" "));
|
|
137
|
+
case "vectors":
|
|
138
|
+
return vectors(vaultDir, args.join(" "));
|
|
139
|
+
case "session":
|
|
140
|
+
return session(vaultDir, args[0]);
|
|
141
|
+
case "restart":
|
|
142
|
+
return restart(vaultDir);
|
|
143
|
+
case "rebuild":
|
|
144
|
+
return rebuild(vaultDir);
|
|
145
|
+
case "logs":
|
|
146
|
+
return logs(vaultDir, args);
|
|
147
|
+
default:
|
|
148
|
+
console.error(`Unknown command: ${cmd}`);
|
|
149
|
+
process.stdout.write(USAGE);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function stats(vaultDir) {
|
|
154
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
155
|
+
const sessions = index.query({ type: "session" });
|
|
156
|
+
const memories = index.query({ type: "memory" });
|
|
157
|
+
const plans = index.query({ type: "plan" });
|
|
158
|
+
console.log("=== Myco Vault ===");
|
|
159
|
+
console.log(`Path: ${vaultDir}`);
|
|
160
|
+
console.log();
|
|
161
|
+
console.log("--- Index ---");
|
|
162
|
+
console.log(`Sessions: ${sessions.length}`);
|
|
163
|
+
console.log(`Memories: ${memories.length}`);
|
|
164
|
+
console.log(`Plans: ${plans.length}`);
|
|
165
|
+
const types = {};
|
|
166
|
+
for (const m of memories) {
|
|
167
|
+
const t = m.frontmatter?.observation_type || "unknown";
|
|
168
|
+
types[t] = (types[t] || 0) + 1;
|
|
169
|
+
}
|
|
170
|
+
if (Object.keys(types).length > 0) {
|
|
171
|
+
console.log("\n--- Memories by Type ---");
|
|
172
|
+
for (const [t, c] of Object.entries(types).sort((a, b) => b[1] - a[1])) {
|
|
173
|
+
console.log(` ${t}: ${c}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const vecDb = path.join(vaultDir, "vectors.db");
|
|
177
|
+
if (fs.existsSync(vecDb)) {
|
|
178
|
+
try {
|
|
179
|
+
const vec = new VectorIndex(vecDb, 1024);
|
|
180
|
+
console.log(`
|
|
181
|
+
--- Vectors ---`);
|
|
182
|
+
console.log(`Embeddings: ${vec.count()}`);
|
|
183
|
+
vec.close();
|
|
184
|
+
} catch (e) {
|
|
185
|
+
console.log(`
|
|
186
|
+
Vectors: error \u2014 ${e.message}`);
|
|
187
|
+
}
|
|
188
|
+
} else {
|
|
189
|
+
console.log("\nVectors: not initialized");
|
|
190
|
+
}
|
|
191
|
+
const daemonPath = path.join(vaultDir, "daemon.json");
|
|
192
|
+
if (fs.existsSync(daemonPath)) {
|
|
193
|
+
try {
|
|
194
|
+
const daemon = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
|
|
195
|
+
const alive = isProcessAlive(daemon.pid);
|
|
196
|
+
console.log(`
|
|
197
|
+
--- Daemon ---`);
|
|
198
|
+
console.log(`PID: ${daemon.pid} (${alive ? "running" : "dead"})`);
|
|
199
|
+
console.log(`Port: ${daemon.port}`);
|
|
200
|
+
console.log(`Started: ${daemon.started}`);
|
|
201
|
+
console.log(`Sessions: ${(daemon.sessions || []).length}`);
|
|
202
|
+
} catch {
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
index.close();
|
|
206
|
+
}
|
|
207
|
+
async function search(vaultDir, query) {
|
|
208
|
+
if (!query) {
|
|
209
|
+
console.error("Usage: myco search <query>");
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
213
|
+
const vecDb = path.join(vaultDir, "vectors.db");
|
|
214
|
+
if (fs.existsSync(vecDb)) {
|
|
215
|
+
try {
|
|
216
|
+
const config = loadConfig(vaultDir);
|
|
217
|
+
const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
|
|
218
|
+
const emb = await generateEmbedding(embeddingProvider, query);
|
|
219
|
+
const vec = new VectorIndex(vecDb, emb.dimensions);
|
|
220
|
+
console.log(`=== Semantic Search: "${query}" ===`);
|
|
221
|
+
const results = vec.search(emb.embedding, { limit: 10 });
|
|
222
|
+
if (results.length === 0) {
|
|
223
|
+
console.log(" (no results)");
|
|
224
|
+
} else {
|
|
225
|
+
const noteMap = new Map(
|
|
226
|
+
index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
|
|
227
|
+
);
|
|
228
|
+
for (const r of results) {
|
|
229
|
+
const title = noteMap.get(r.id)?.title || r.id;
|
|
230
|
+
console.log(` sim: ${r.similarity.toFixed(3)} | [${r.metadata.type}] ${title.slice(0, 60)}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
vec.close();
|
|
234
|
+
} catch (e) {
|
|
235
|
+
console.log(`Semantic search unavailable: ${e.message}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
console.log(`
|
|
239
|
+
=== FTS Search: "${query}" ===`);
|
|
240
|
+
const ftsResults = searchFts(index, query, { limit: 10 });
|
|
241
|
+
if (ftsResults.length === 0) {
|
|
242
|
+
console.log(" (no results)");
|
|
243
|
+
} else {
|
|
244
|
+
for (const r of ftsResults) {
|
|
245
|
+
console.log(` [${r.type}] ${r.title?.slice(0, 70)}`);
|
|
246
|
+
if (r.snippet) console.log(` ${r.snippet.slice(0, 100)}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
index.close();
|
|
250
|
+
}
|
|
251
|
+
async function vectors(vaultDir, query) {
|
|
252
|
+
if (!query) {
|
|
253
|
+
console.error("Usage: myco vectors <query>");
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
const config = loadConfig(vaultDir);
|
|
257
|
+
const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
|
|
258
|
+
const emb = await generateEmbedding(embeddingProvider, query);
|
|
259
|
+
const vecDb = path.join(vaultDir, "vectors.db");
|
|
260
|
+
if (!fs.existsSync(vecDb)) {
|
|
261
|
+
console.error("No vector index found");
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
const vec = new VectorIndex(vecDb, emb.dimensions);
|
|
265
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
266
|
+
const results = vec.search(emb.embedding, { limit: 20, relativeThreshold: 0 });
|
|
267
|
+
console.log(`Query: "${query}"`);
|
|
268
|
+
console.log(`Dimensions: ${emb.dimensions}`);
|
|
269
|
+
console.log(`Total vectors: ${vec.count()}`);
|
|
270
|
+
console.log();
|
|
271
|
+
if (results.length === 0) {
|
|
272
|
+
console.log("(no results)");
|
|
273
|
+
} else {
|
|
274
|
+
const noteMap = new Map(
|
|
275
|
+
index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
|
|
276
|
+
);
|
|
277
|
+
const topScore = results[0].similarity;
|
|
278
|
+
console.log(`Top score: ${topScore.toFixed(4)}`);
|
|
279
|
+
console.log(`Default threshold (0.5x): ${(topScore * 0.5).toFixed(4)}`);
|
|
280
|
+
console.log();
|
|
281
|
+
console.log(" Sim Ratio Type ID / Title");
|
|
282
|
+
console.log(" ------ ----- --------- " + "-".repeat(50));
|
|
283
|
+
for (const r of results) {
|
|
284
|
+
const title = noteMap.get(r.id)?.title || r.id;
|
|
285
|
+
const ratio = (r.similarity / topScore).toFixed(2);
|
|
286
|
+
const pass = r.similarity >= topScore * 0.5 ? "\u2713" : " ";
|
|
287
|
+
console.log(`${pass} ${r.similarity.toFixed(4)} ${ratio} ${r.metadata.type.padEnd(9)} ${title.slice(0, 50)}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
vec.close();
|
|
291
|
+
index.close();
|
|
292
|
+
}
|
|
293
|
+
function session(vaultDir, idOrLatest) {
|
|
294
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
295
|
+
const sessions = index.query({ type: "session" });
|
|
296
|
+
if (sessions.length === 0) {
|
|
297
|
+
console.log("No sessions found");
|
|
298
|
+
index.close();
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
let target;
|
|
302
|
+
if (!idOrLatest || idOrLatest === "latest") {
|
|
303
|
+
target = sessions[sessions.length - 1];
|
|
304
|
+
} else {
|
|
305
|
+
target = sessions.find((s) => s.id.includes(idOrLatest));
|
|
306
|
+
}
|
|
307
|
+
if (!target) {
|
|
308
|
+
console.error(`Session not found: ${idOrLatest}`);
|
|
309
|
+
console.log("Available:", sessions.map((s) => s.id).join(", "));
|
|
310
|
+
index.close();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const fullPath = path.join(vaultDir, target.path);
|
|
314
|
+
if (fs.existsSync(fullPath)) {
|
|
315
|
+
console.log(fs.readFileSync(fullPath, "utf-8"));
|
|
316
|
+
} else {
|
|
317
|
+
console.log(`Title: ${target.title}`);
|
|
318
|
+
console.log(`Content:
|
|
319
|
+
${target.content?.slice(0, 2e3)}`);
|
|
320
|
+
}
|
|
321
|
+
index.close();
|
|
322
|
+
}
|
|
323
|
+
async function restart(vaultDir) {
|
|
324
|
+
const daemonPath = path.join(vaultDir, "daemon.json");
|
|
325
|
+
if (fs.existsSync(daemonPath)) {
|
|
326
|
+
try {
|
|
327
|
+
const daemon = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
|
|
328
|
+
if (isProcessAlive(daemon.pid)) {
|
|
329
|
+
process.kill(daemon.pid, "SIGTERM");
|
|
330
|
+
console.log(`Stopped daemon (pid ${daemon.pid})`);
|
|
331
|
+
} else {
|
|
332
|
+
console.log(`Daemon pid ${daemon.pid} was already dead`);
|
|
333
|
+
}
|
|
334
|
+
} catch {
|
|
335
|
+
}
|
|
336
|
+
try {
|
|
337
|
+
fs.unlinkSync(daemonPath);
|
|
338
|
+
} catch {
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const { DaemonClient } = await import("./client-4JMOYNKK.js");
|
|
342
|
+
const client = new DaemonClient(vaultDir);
|
|
343
|
+
console.log("Waiting for health check...");
|
|
344
|
+
const healthy = await client.ensureRunning();
|
|
345
|
+
if (healthy) {
|
|
346
|
+
try {
|
|
347
|
+
const info = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
|
|
348
|
+
console.log(`Daemon healthy on port ${info.port}`);
|
|
349
|
+
} catch {
|
|
350
|
+
console.log("Daemon healthy");
|
|
351
|
+
}
|
|
352
|
+
} else {
|
|
353
|
+
console.error("Daemon failed to become healthy");
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
async function rebuild(vaultDir) {
|
|
357
|
+
console.log(`Rebuilding index for ${vaultDir}...`);
|
|
358
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
359
|
+
initFts(index);
|
|
360
|
+
const count = rebuildIndex(index, vaultDir);
|
|
361
|
+
console.log(`Indexed ${count} notes (FTS)`);
|
|
362
|
+
const vecDb = path.join(vaultDir, "vectors.db");
|
|
363
|
+
try {
|
|
364
|
+
const config = loadConfig(vaultDir);
|
|
365
|
+
const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
|
|
366
|
+
const testEmbed = await embeddingProvider.embed("test");
|
|
367
|
+
const vec = new VectorIndex(vecDb, testEmbed.dimensions);
|
|
368
|
+
const allNotes = index.query({});
|
|
369
|
+
const activeNotes = allNotes.filter((n) => {
|
|
370
|
+
const status = n.frontmatter?.status;
|
|
371
|
+
return status !== "superseded" && status !== "archived";
|
|
372
|
+
});
|
|
373
|
+
let embedded = 0;
|
|
374
|
+
for (const note of activeNotes) {
|
|
375
|
+
const text = `${note.title}
|
|
376
|
+
${note.content}`.slice(0, EMBEDDING_INPUT_LIMIT);
|
|
377
|
+
try {
|
|
378
|
+
const emb = await generateEmbedding(embeddingProvider, text);
|
|
379
|
+
vec.upsert(note.id, emb.embedding, {
|
|
380
|
+
type: note.type,
|
|
381
|
+
session_id: note.frontmatter?.session ?? ""
|
|
382
|
+
});
|
|
383
|
+
embedded++;
|
|
384
|
+
process.stdout.write(`\rEmbedded ${embedded}/${activeNotes.length}`);
|
|
385
|
+
} catch (e) {
|
|
386
|
+
console.error(`
|
|
387
|
+
Failed to embed ${note.id}: ${e.message}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
console.log(`
|
|
391
|
+
Embedded ${embedded} notes (vectors)
|
|
392
|
+
Skipped ${allNotes.length - activeNotes.length} superseded/archived`);
|
|
393
|
+
vec.close();
|
|
394
|
+
} catch (e) {
|
|
395
|
+
console.log(`Vector rebuild skipped: ${e.message}`);
|
|
396
|
+
}
|
|
397
|
+
index.close();
|
|
398
|
+
}
|
|
399
|
+
var FOLLOW_POLL_INTERVAL_MS = 500;
|
|
400
|
+
function logs(vaultDir, args) {
|
|
401
|
+
const logDir = path.join(vaultDir, "logs");
|
|
402
|
+
const follow = args.includes("--follow") || args.includes("-f");
|
|
403
|
+
const limit = parseIntFlag(args, "--tail", "-n") ?? DEFAULT_LOG_TAIL;
|
|
404
|
+
const rawLevel = parseStringFlag(args, "--level", "-l");
|
|
405
|
+
if (rawLevel && !(rawLevel in LEVEL_ORDER)) {
|
|
406
|
+
console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(", ")}`);
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
const level = rawLevel;
|
|
410
|
+
const component = parseStringFlag(args, "--component", "-c");
|
|
411
|
+
const since = parseStringFlag(args, "--since");
|
|
412
|
+
const until = parseStringFlag(args, "--until");
|
|
413
|
+
const result = queryLogs(logDir, { limit, level, component, since, until });
|
|
414
|
+
for (const e of result.entries) {
|
|
415
|
+
process.stdout.write(formatLogLine(e) + "\n");
|
|
416
|
+
}
|
|
417
|
+
if (result.truncated) {
|
|
418
|
+
process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted
|
|
419
|
+
`);
|
|
420
|
+
}
|
|
421
|
+
if (!follow) return;
|
|
422
|
+
const followFilter = { level, component, until };
|
|
423
|
+
const logPath = path.join(logDir, "daemon.log");
|
|
424
|
+
let offset = 0;
|
|
425
|
+
try {
|
|
426
|
+
offset = fs.statSync(logPath).size;
|
|
427
|
+
} catch {
|
|
428
|
+
}
|
|
429
|
+
fs.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {
|
|
430
|
+
if (curr.size < prev.size || curr.ino !== prev.ino) {
|
|
431
|
+
offset = 0;
|
|
432
|
+
}
|
|
433
|
+
if (curr.size <= offset) return;
|
|
434
|
+
try {
|
|
435
|
+
const fd = fs.openSync(logPath, "r");
|
|
436
|
+
const buf = Buffer.alloc(curr.size - offset);
|
|
437
|
+
fs.readSync(fd, buf, 0, buf.length, offset);
|
|
438
|
+
fs.closeSync(fd);
|
|
439
|
+
const text = buf.toString("utf-8");
|
|
440
|
+
const lastNewline = text.lastIndexOf("\n");
|
|
441
|
+
if (lastNewline < 0) return;
|
|
442
|
+
offset += Buffer.byteLength(text.slice(0, lastNewline + 1));
|
|
443
|
+
for (const line of text.slice(0, lastNewline).split("\n")) {
|
|
444
|
+
if (!line.trim()) continue;
|
|
445
|
+
try {
|
|
446
|
+
const e = JSON.parse(line);
|
|
447
|
+
if (!matchesFilter(e, followFilter)) continue;
|
|
448
|
+
process.stdout.write(formatLogLine(e) + "\n");
|
|
449
|
+
} catch {
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
} catch {
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
process.on("SIGINT", () => {
|
|
456
|
+
fs.unwatchFile(logPath);
|
|
457
|
+
process.exit(0);
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
function isProcessAlive(pid) {
|
|
461
|
+
try {
|
|
462
|
+
process.kill(pid, 0);
|
|
463
|
+
return true;
|
|
464
|
+
} catch {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
var PROVIDER_DEFAULTS = {
|
|
469
|
+
ollama: { base_url: "http://localhost:11434" },
|
|
470
|
+
"lm-studio": { base_url: "http://localhost:1234" }
|
|
471
|
+
};
|
|
472
|
+
var DASHBOARD_CONTENT = `# Myco Vault
|
|
473
|
+
|
|
474
|
+
## Active Plans
|
|
475
|
+
\`\`\`dataview
|
|
476
|
+
TABLE status, tags FROM #type/plan
|
|
477
|
+
WHERE status = "active" OR status = "in_progress"
|
|
478
|
+
SORT created DESC
|
|
479
|
+
\`\`\`
|
|
480
|
+
|
|
481
|
+
## Recent Sessions
|
|
482
|
+
\`\`\`dataview
|
|
483
|
+
TABLE user, started, tools_used FROM #type/session
|
|
484
|
+
SORT started DESC LIMIT 10
|
|
485
|
+
\`\`\`
|
|
486
|
+
|
|
487
|
+
## Recent Memories
|
|
488
|
+
\`\`\`dataview
|
|
489
|
+
TABLE observation_type AS "Type", created FROM #type/memory
|
|
490
|
+
SORT created DESC LIMIT 15
|
|
491
|
+
\`\`\`
|
|
492
|
+
|
|
493
|
+
## Memories by Type
|
|
494
|
+
\`\`\`dataview
|
|
495
|
+
TABLE WITHOUT ID observation_type AS "Type", length(rows) AS "Count"
|
|
496
|
+
FROM #type/memory GROUP BY observation_type
|
|
497
|
+
SORT length(rows) DESC
|
|
498
|
+
\`\`\`
|
|
499
|
+
|
|
500
|
+
## Gotchas
|
|
501
|
+
\`\`\`dataview
|
|
502
|
+
LIST FROM #memory/gotcha SORT created DESC LIMIT 10
|
|
503
|
+
\`\`\`
|
|
504
|
+
`;
|
|
505
|
+
var VAULT_GITIGNORE = `# Runtime \u2014 rebuilt on daemon startup
|
|
506
|
+
index.db
|
|
507
|
+
index.db-wal
|
|
508
|
+
index.db-shm
|
|
509
|
+
vectors.db
|
|
510
|
+
|
|
511
|
+
# Daemon state \u2014 per-machine, ephemeral
|
|
512
|
+
daemon.json
|
|
513
|
+
buffer/
|
|
514
|
+
logs/
|
|
515
|
+
|
|
516
|
+
# Obsidian \u2014 per-user workspace config
|
|
517
|
+
.obsidian/
|
|
518
|
+
`;
|
|
519
|
+
function configureVaultEnv(projectRoot, vaultDir) {
|
|
520
|
+
const registry = new AgentRegistry();
|
|
521
|
+
const active = registry.detectActiveAgent();
|
|
522
|
+
if (active) {
|
|
523
|
+
if (active.configureVaultEnv(projectRoot, vaultDir)) {
|
|
524
|
+
console.log(`Set MYCO_VAULT_DIR for ${active.displayName}`);
|
|
525
|
+
}
|
|
526
|
+
} else {
|
|
527
|
+
for (const name of registry.adapterNames) {
|
|
528
|
+
const adapter = registry.getAdapter(name);
|
|
529
|
+
if (adapter?.configureVaultEnv(projectRoot, vaultDir)) {
|
|
530
|
+
console.log(`Set MYCO_VAULT_DIR for ${adapter.displayName}`);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
console.log(`
|
|
535
|
+
For other agents, add to your shell profile:`);
|
|
536
|
+
console.log(` export MYCO_VAULT_DIR="${vaultDir}"
|
|
537
|
+
`);
|
|
538
|
+
}
|
|
539
|
+
async function initVault(args) {
|
|
540
|
+
const vaultPath = parseStringFlag(args, "--vault");
|
|
541
|
+
const llmProvider = parseStringFlag(args, "--llm-provider") ?? "ollama";
|
|
542
|
+
const llmModel = parseStringFlag(args, "--llm-model") ?? "gpt-oss";
|
|
543
|
+
const llmUrl = parseStringFlag(args, "--llm-url") ?? PROVIDER_DEFAULTS[llmProvider]?.base_url;
|
|
544
|
+
const embeddingProvider = parseStringFlag(args, "--embedding-provider") ?? "ollama";
|
|
545
|
+
const embeddingModel = parseStringFlag(args, "--embedding-model") ?? "bge-m3";
|
|
546
|
+
const embeddingUrl = parseStringFlag(args, "--embedding-url") ?? PROVIDER_DEFAULTS[embeddingProvider]?.base_url;
|
|
547
|
+
const user = parseStringFlag(args, "--user") ?? "";
|
|
548
|
+
const teamEnabled = args.includes("--team");
|
|
549
|
+
const vaultDir = vaultPath ? vaultPath.startsWith("~/") ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath) : path.join(resolveVaultDir());
|
|
550
|
+
if (fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
|
|
551
|
+
console.log(`Vault already initialized at ${vaultDir}`);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
console.log(`Initializing Myco vault at ${vaultDir}`);
|
|
555
|
+
const dirs = ["sessions", "plans", "memories", "artifacts", "team", "buffer", "logs"];
|
|
556
|
+
for (const dir of dirs) {
|
|
557
|
+
fs.mkdirSync(path.join(vaultDir, dir), { recursive: true });
|
|
558
|
+
}
|
|
559
|
+
const config = {
|
|
560
|
+
version: 2,
|
|
561
|
+
intelligence: {
|
|
562
|
+
llm: {
|
|
563
|
+
provider: llmProvider,
|
|
564
|
+
model: llmModel,
|
|
565
|
+
...llmUrl ? { base_url: llmUrl } : {},
|
|
566
|
+
context_window: 8192,
|
|
567
|
+
max_tokens: 1024
|
|
568
|
+
},
|
|
569
|
+
embedding: {
|
|
570
|
+
provider: embeddingProvider,
|
|
571
|
+
model: embeddingModel,
|
|
572
|
+
...embeddingUrl ? { base_url: embeddingUrl } : {}
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
daemon: {
|
|
576
|
+
log_level: "info",
|
|
577
|
+
grace_period: 30,
|
|
578
|
+
max_log_size: 5242880
|
|
579
|
+
},
|
|
580
|
+
capture: {
|
|
581
|
+
transcript_paths: [],
|
|
582
|
+
artifact_watch: [".claude/plans/", ".cursor/plans/"],
|
|
583
|
+
artifact_extensions: [".md"],
|
|
584
|
+
buffer_max_events: 500
|
|
585
|
+
},
|
|
586
|
+
context: {
|
|
587
|
+
max_tokens: 1200,
|
|
588
|
+
layers: { plans: 200, sessions: 500, memories: 300, team: 200 }
|
|
589
|
+
},
|
|
590
|
+
team: {
|
|
591
|
+
enabled: teamEnabled,
|
|
592
|
+
user,
|
|
593
|
+
sync: "git"
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
fs.writeFileSync(
|
|
597
|
+
path.join(vaultDir, "myco.yaml"),
|
|
598
|
+
import_yaml.default.stringify(config),
|
|
599
|
+
"utf-8"
|
|
600
|
+
);
|
|
601
|
+
fs.writeFileSync(path.join(vaultDir, ".gitignore"), VAULT_GITIGNORE, "utf-8");
|
|
602
|
+
fs.writeFileSync(path.join(vaultDir, "_dashboard.md"), DASHBOARD_CONTENT, "utf-8");
|
|
603
|
+
const index = new MycoIndex(path.join(vaultDir, "index.db"));
|
|
604
|
+
initFts(index);
|
|
605
|
+
index.close();
|
|
606
|
+
console.log("");
|
|
607
|
+
console.log("=== Myco Vault Initialized ===");
|
|
608
|
+
console.log(`Path: ${vaultDir}`);
|
|
609
|
+
console.log(`LLM provider: ${llmProvider} / ${llmModel}`);
|
|
610
|
+
console.log(`Embedding provider: ${embeddingProvider} / ${embeddingModel}`);
|
|
611
|
+
console.log(`Team mode: ${teamEnabled ? "enabled" : "disabled"}`);
|
|
612
|
+
if (user) console.log(`User: ${user}`);
|
|
613
|
+
console.log("");
|
|
614
|
+
const projectRoot = path.resolve(".");
|
|
615
|
+
const isProjectLocal = vaultDir.startsWith(projectRoot);
|
|
616
|
+
if (!isProjectLocal) {
|
|
617
|
+
configureVaultEnv(projectRoot, vaultDir);
|
|
618
|
+
}
|
|
619
|
+
console.log("Next: start a coding session \u2014 Myco will begin capturing automatically.");
|
|
620
|
+
}
|
|
621
|
+
main().catch((err) => {
|
|
622
|
+
console.error(`myco: ${err.message}`);
|
|
623
|
+
process.exit(1);
|
|
624
|
+
});
|
|
625
|
+
//# sourceMappingURL=cli-K5FSKLQC.js.map
|