@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.
- package/dist/index.js +52 -8
- 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
|
|
553
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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?",
|