@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.
@@ -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}/knowledge-base:/data/knowledge-repo:rw
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}/sse` },
1180
- vault: { url: `http://${host}:${config.ports.vault_mcp}/sse` },
1181
- forge: { url: `http://${host}:${config.ports.forge}/sse` }
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, stdioServers);
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkhera30/cli",
3
- "version": "0.3.12",
3
+ "version": "0.3.16",
4
4
  "description": "CLI for managing the Horus AI development stack",
5
5
  "type": "module",
6
6
  "bin": {