@arkhera30/cli 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +52 -8
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -123,7 +123,7 @@ function generateEnv(config) {
123
123
  `VAULT_MCP_PORT=${config.ports.vault_mcp}`,
124
124
  `FORGE_PORT=${config.ports.forge}`,
125
125
  "",
126
- "# Repository URLs",
126
+ "# Repository URLs (must be HTTPS \u2014 container services do not have SSH keys)",
127
127
  `ANVIL_REPO_URL=${config.repos.anvil_notes}`,
128
128
  `VAULT_KNOWLEDGE_REPO_URL=${config.repos.vault_knowledge}`,
129
129
  `FORGE_REGISTRY_REPO_URL=${config.repos.forge_registry}`,
@@ -545,24 +545,33 @@ var setupCommand = new Command("setup").description("Interactive first-run setup
545
545
  console.log(chalk.dim("Horus stores notes and knowledge in Git repos you own."));
546
546
  console.log(chalk.dim("Create empty repos on your Git server, then paste the URLs below."));
547
547
  console.log("");
548
+ console.log(chalk.yellow(" Use HTTPS URLs \u2014 container services do not have SSH keys."));
549
+ console.log(chalk.dim(" SSH URLs (git@github.com:...) will fail at runtime inside Docker/Podman."));
550
+ console.log(chalk.dim(" Set GITHUB_TOKEN for private repos."));
551
+ console.log("");
548
552
  const git_host = await input({
549
553
  message: "Git server hostname:",
550
554
  default: "github.com"
551
555
  });
552
- const examplePrefix = `git@${git_host}:<owner>`;
553
- console.log("");
554
- console.log(chalk.dim(` Example: ${examplePrefix}/my-repo.git`));
556
+ const host = git_host.trim();
557
+ const example = (repo) => chalk.dim(` e.g., https://${host}/<owner>/${repo}`);
555
558
  console.log("");
556
559
  const anvil_notes = await input({
557
- message: "Anvil notes repo URL (required):",
560
+ message: `Anvil notes repo URL:
561
+ ${example("horus-notes")}
562
+ `,
558
563
  validate: (v) => v.trim().length > 0 || "Anvil needs a notes repo to store your data."
559
564
  });
560
565
  const vault_knowledge = await input({
561
- message: "Vault knowledge-base repo URL (required):",
566
+ message: `Vault knowledge-base repo URL:
567
+ ${example("knowledge-base")}
568
+ `,
562
569
  validate: (v) => v.trim().length > 0 || "Vault needs a knowledge-base repo."
563
570
  });
564
571
  const forge_registry = await input({
565
- message: "Forge registry repo URL (required):",
572
+ message: `Forge registry repo URL:
573
+ ${example("forge-registry")}
574
+ `,
566
575
  validate: (v) => v.trim().length > 0 || "Forge needs a registry repo."
567
576
  });
568
577
  config = {
@@ -1051,6 +1060,27 @@ async function syncSkills(runtime) {
1051
1060
  }
1052
1061
  }
1053
1062
  }
1063
+ async function syncSkillsForCursor(runtime) {
1064
+ const home = homedir3();
1065
+ const rulesDir = join4(home, ".cursor", "rules");
1066
+ const skills = ["horus-anvil", "horus-vault", "horus-forge"];
1067
+ const forgeContainer = "horus-forge-1";
1068
+ mkdirSync3(rulesDir, { recursive: true });
1069
+ for (const skill of skills) {
1070
+ const src = `/home/forge/.claude/skills/${skill}/SKILL.md`;
1071
+ const dest = join4(rulesDir, `${skill}.mdc`);
1072
+ const result = await runtime.exec(forgeContainer, "cat", src);
1073
+ if (result.exitCode === 0 && result.stdout.trim()) {
1074
+ const frontmatter = `---
1075
+ description: Horus ${skill} reference
1076
+ alwaysApply: true
1077
+ ---
1078
+
1079
+ `;
1080
+ writeFileSync3(dest, frontmatter + result.stdout, "utf-8");
1081
+ }
1082
+ }
1083
+ }
1054
1084
  function printNextSteps(targets) {
1055
1085
  console.log("");
1056
1086
  console.log(chalk6.bold("Next steps:"));
@@ -1063,7 +1093,7 @@ function printNextSteps(targets) {
1063
1093
  console.log(` ${chalk6.cyan("Claude Code")} Start a new Claude Code session`);
1064
1094
  break;
1065
1095
  case "cursor":
1066
- console.log(` ${chalk6.cyan("Cursor")} Restart Cursor`);
1096
+ console.log(` ${chalk6.cyan("Cursor")} Restart Cursor to pick up the new MCP configuration and rules`);
1067
1097
  break;
1068
1098
  }
1069
1099
  }
@@ -1154,6 +1184,16 @@ var connectCommand = new Command6("connect").description("Configure Claude/Curso
1154
1184
  console.log(chalk6.dim(error.message));
1155
1185
  }
1156
1186
  }
1187
+ if (targets.includes("cursor")) {
1188
+ const cursorRulesSpinner = ora5("Syncing horus-core rules for Cursor...").start();
1189
+ try {
1190
+ await syncSkillsForCursor(runtime);
1191
+ cursorRulesSpinner.succeed("horus-core rules synced to ~/.cursor/rules/");
1192
+ } catch (error) {
1193
+ cursorRulesSpinner.warn("Could not sync Cursor rules (Forge container may not be running)");
1194
+ console.log(chalk6.dim(error.message));
1195
+ }
1196
+ }
1157
1197
  printNextSteps(targets);
1158
1198
  });
1159
1199
 
@@ -1330,6 +1370,10 @@ var updateCommand = new Command7("update").description("Update Horus to the late
1330
1370
  console.log(chalk7.dim(" Could not reach GitHub to check latest version."));
1331
1371
  }
1332
1372
  console.log("");
1373
+ console.log(chalk7.dim(" Note: this updates the Horus container services only."));
1374
+ console.log(chalk7.dim(" To update the Horus CLI itself, run:"));
1375
+ console.log(` ${chalk7.cyan("npm install -g @arkhera30/cli@latest")}`);
1376
+ console.log("");
1333
1377
  if (!opts.yes) {
1334
1378
  const confirmed = await confirm3({
1335
1379
  message: "Pull latest images and restart services?",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkhera30/cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "CLI for managing the Horus AI development stack",
5
5
  "type": "module",
6
6
  "bin": {