@arkhera30/cli 0.3.12 → 0.3.16
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/compose/docker-compose.yml +1 -1
- package/dist/index.js +28 -25
- package/package.json +1 -1
|
@@ -60,7 +60,7 @@ services:
|
|
|
60
60
|
- "${VAULT_PORT:-8000}:8000"
|
|
61
61
|
volumes:
|
|
62
62
|
# Knowledge-base repo — read/write; Vault clones on first boot if empty
|
|
63
|
-
- ${HORUS_DATA_PATH}/
|
|
63
|
+
- ${HORUS_DATA_PATH}/vaults/default:/data/knowledge-repo:rw
|
|
64
64
|
# Write-path workspace: staging area for draft pages before PR
|
|
65
65
|
- vault-workspace:/data/workspace
|
|
66
66
|
environment:
|
package/dist/index.js
CHANGED
|
@@ -613,9 +613,14 @@ var ANVIL_SERVICE = ` # \u2500\u2500 Anvil \u2500\u2500\u2500\u2500\u2500\u2500
|
|
|
613
613
|
- TYPESENSE_HOST=typesense
|
|
614
614
|
- TYPESENSE_PORT=8108
|
|
615
615
|
- TYPESENSE_API_KEY=\${TYPESENSE_API_KEY:-horus-local-key}
|
|
616
|
+
- NEO4J_URI=bolt://neo4j:7687
|
|
617
|
+
- NEO4J_USER=neo4j
|
|
618
|
+
- NEO4J_PASSWORD=horus-neo4j
|
|
616
619
|
depends_on:
|
|
617
620
|
typesense:
|
|
618
621
|
condition: service_healthy
|
|
622
|
+
neo4j:
|
|
623
|
+
condition: service_healthy
|
|
619
624
|
networks:
|
|
620
625
|
- horus-net
|
|
621
626
|
restart: unless-stopped
|
|
@@ -667,6 +672,11 @@ var FORGE_SERVICE = ` # \u2500\u2500 Forge \u2500\u2500\u2500\u2500\u2500\u2500
|
|
|
667
672
|
- FORGE_SCAN_PATHS=\${FORGE_SCAN_PATHS:-/data/repos}
|
|
668
673
|
- FORGE_SESSION_TTL_MS=\${FORGE_SESSION_TTL_MS:-1800000}
|
|
669
674
|
- GITHUB_TOKEN=\${GITHUB_TOKEN:-}
|
|
675
|
+
# Fix git "dubious ownership" on bind-mounted repos (bug 4a32728f).
|
|
676
|
+
# Container UID differs from host UID that owns mounted repos.
|
|
677
|
+
- GIT_CONFIG_COUNT=1
|
|
678
|
+
- GIT_CONFIG_KEY_0=safe.directory
|
|
679
|
+
- GIT_CONFIG_VALUE_0=*
|
|
670
680
|
- TYPESENSE_HOST=typesense
|
|
671
681
|
- TYPESENSE_PORT=8108
|
|
672
682
|
- TYPESENSE_API_KEY=\${TYPESENSE_API_KEY:-horus-local-key}
|
|
@@ -1078,16 +1088,6 @@ function mergeAndWriteConfig(configPath, mcpServers) {
|
|
|
1078
1088
|
mkdirSync2(dir, { recursive: true });
|
|
1079
1089
|
writeFileSync3(configPath, JSON.stringify(existing, null, 2) + "\n", "utf-8");
|
|
1080
1090
|
}
|
|
1081
|
-
function getMcpRemoteWrapperPath() {
|
|
1082
|
-
return join2(homedir3(), ".forge", "bin", "mcp-remote-wrapper");
|
|
1083
|
-
}
|
|
1084
|
-
function buildStdioServers(config, wrapperPath, host) {
|
|
1085
|
-
return {
|
|
1086
|
-
anvil: { command: wrapperPath, args: [`http://${host}:${config.ports.anvil}/mcp`, "--transport", "http-only"] },
|
|
1087
|
-
vault: { command: wrapperPath, args: [`http://${host}:${config.ports.vault_mcp}/mcp`, "--transport", "http-only"] },
|
|
1088
|
-
forge: { command: wrapperPath, args: [`http://${host}:${config.ports.forge}/mcp`, "--transport", "http-only"] }
|
|
1089
|
-
};
|
|
1090
|
-
}
|
|
1091
1091
|
async function isClaudeCliAvailable() {
|
|
1092
1092
|
try {
|
|
1093
1093
|
const result = await execa2("claude", ["--version"], { reject: false });
|
|
@@ -1100,7 +1100,7 @@ async function registerWithClaudeCode(mcpServers) {
|
|
|
1100
1100
|
const registered = [];
|
|
1101
1101
|
const failed = [];
|
|
1102
1102
|
for (const [name, entry] of Object.entries(mcpServers)) {
|
|
1103
|
-
const baseUrl = entry.url.replace(/\/sse$/, "");
|
|
1103
|
+
const baseUrl = entry.url.replace(/\/(mcp|sse)$/, "");
|
|
1104
1104
|
await execa2("claude", ["mcp", "remove", "--scope", "user", name], { reject: false });
|
|
1105
1105
|
const result = await execa2(
|
|
1106
1106
|
"claude",
|
|
@@ -1176,26 +1176,17 @@ function printNextSteps(targets) {
|
|
|
1176
1176
|
}
|
|
1177
1177
|
async function runConnect(config, runtime, targets, host = "localhost") {
|
|
1178
1178
|
const httpServers = {
|
|
1179
|
-
anvil: { url: `http://${host}:${config.ports.anvil}/
|
|
1180
|
-
vault: { url: `http://${host}:${config.ports.vault_mcp}/
|
|
1181
|
-
forge: { url: `http://${host}:${config.ports.forge}/
|
|
1179
|
+
anvil: { url: `http://${host}:${config.ports.anvil}/mcp` },
|
|
1180
|
+
vault: { url: `http://${host}:${config.ports.vault_mcp}/mcp` },
|
|
1181
|
+
forge: { url: `http://${host}:${config.ports.forge}/mcp` }
|
|
1182
1182
|
};
|
|
1183
1183
|
const configured = [];
|
|
1184
1184
|
for (const target of targets) {
|
|
1185
1185
|
if (target === "claude-desktop") {
|
|
1186
1186
|
const desktopSpinner = ora(`Configuring ${chalk.cyan("claude-desktop")}...`).start();
|
|
1187
|
-
const wrapperPath = getMcpRemoteWrapperPath();
|
|
1188
|
-
if (!existsSync4(wrapperPath)) {
|
|
1189
|
-
desktopSpinner.fail("mcp-remote-wrapper not found");
|
|
1190
|
-
console.log(chalk.dim(`Expected at: ${wrapperPath}`));
|
|
1191
|
-
console.log(chalk.dim("Install it with: npx --yes mcp-remote --help"));
|
|
1192
|
-
console.log(chalk.dim("Then place the wrapper script at the path above."));
|
|
1193
|
-
continue;
|
|
1194
|
-
}
|
|
1195
1187
|
try {
|
|
1196
|
-
const stdioServers = buildStdioServers(config, wrapperPath, host);
|
|
1197
1188
|
const configPath = getConfigPath(target);
|
|
1198
|
-
mergeAndWriteConfig(configPath,
|
|
1189
|
+
mergeAndWriteConfig(configPath, httpServers);
|
|
1199
1190
|
desktopSpinner.succeed(`Configured ${chalk.cyan("claude-desktop")} \u2014 ${chalk.dim(configPath)}`);
|
|
1200
1191
|
configured.push(target);
|
|
1201
1192
|
} catch (error) {
|
|
@@ -1223,7 +1214,7 @@ async function runConnect(config, runtime, targets, host = "localhost") {
|
|
|
1223
1214
|
} else {
|
|
1224
1215
|
cliSpinner.warn("claude CLI not found on PATH \u2014 register manually:");
|
|
1225
1216
|
for (const [name, entry] of Object.entries(httpServers)) {
|
|
1226
|
-
const baseUrl = entry.url.replace(/\/sse$/, "");
|
|
1217
|
+
const baseUrl = entry.url.replace(/\/(mcp|sse)$/, "");
|
|
1227
1218
|
console.log(
|
|
1228
1219
|
chalk.dim(` claude mcp add --transport http --scope user ${name} ${baseUrl}`)
|
|
1229
1220
|
);
|
|
@@ -2475,6 +2466,16 @@ function checkDataDir(dataDir) {
|
|
|
2475
2466
|
};
|
|
2476
2467
|
}
|
|
2477
2468
|
}
|
|
2469
|
+
function checkGhostDataDir() {
|
|
2470
|
+
const ghostDir = join5(HORUS_DIR, "horus-data");
|
|
2471
|
+
if (!existsSync7(ghostDir)) return null;
|
|
2472
|
+
return {
|
|
2473
|
+
status: "warn",
|
|
2474
|
+
label: "Ghost data directory",
|
|
2475
|
+
message: `Legacy directory ~/Horus/horus-data/ exists \u2014 this is not used by Horus`,
|
|
2476
|
+
hint: `Delete it: rm -rf "${ghostDir}"`
|
|
2477
|
+
};
|
|
2478
|
+
}
|
|
2478
2479
|
function checkDiskSpace(dataDir) {
|
|
2479
2480
|
const checkDir = existsSync7(dataDir) ? dataDir : join5(dataDir, "..");
|
|
2480
2481
|
try {
|
|
@@ -2599,6 +2600,8 @@ var doctorCommand = new Command8("doctor").description("Diagnose common Horus is
|
|
|
2599
2600
|
allResults.push(checkPort(ports.forge, "Forge"));
|
|
2600
2601
|
allResults.push(checkDataDir(dataDir));
|
|
2601
2602
|
allResults.push(checkDiskSpace(dataDir));
|
|
2603
|
+
const ghostCheck = checkGhostDataDir();
|
|
2604
|
+
if (ghostCheck) allResults.push(ghostCheck);
|
|
2602
2605
|
const runtimeOk = allResults[0].status !== "fail";
|
|
2603
2606
|
const composeOk = allResults[1].status !== "fail";
|
|
2604
2607
|
if (runtimeOk && composeOk) {
|