bajaclaw 0.10.1
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/LICENSE +21 -0
- package/README.md +639 -0
- package/bin/bajaclaw.js +35 -0
- package/bin/create-bajaclaw.js +17 -0
- package/dist/agent.d.ts +29 -0
- package/dist/agent.js +231 -0
- package/dist/agent.js.map +1 -0
- package/dist/api/server.d.ts +15 -0
- package/dist/api/server.js +215 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/translate.d.ts +61 -0
- package/dist/api/translate.js +109 -0
- package/dist/api/translate.js.map +1 -0
- package/dist/banner.d.ts +7 -0
- package/dist/banner.js +31 -0
- package/dist/banner.js.map +1 -0
- package/dist/channels/gateway.d.ts +1 -0
- package/dist/channels/gateway.js +76 -0
- package/dist/channels/gateway.js.map +1 -0
- package/dist/claude.d.ts +9 -0
- package/dist/claude.js +170 -0
- package/dist/claude.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +303 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/channel.d.ts +3 -0
- package/dist/commands/channel.js +27 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/compact.d.ts +8 -0
- package/dist/commands/compact.js +60 -0
- package/dist/commands/compact.js.map +1 -0
- package/dist/commands/daemon.d.ts +7 -0
- package/dist/commands/daemon.js +129 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/dashboard.d.ts +1 -0
- package/dist/commands/dashboard.js +78 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/dry-run.d.ts +1 -0
- package/dist/commands/dry-run.js +5 -0
- package/dist/commands/dry-run.js.map +1 -0
- package/dist/commands/effort.d.ts +6 -0
- package/dist/commands/effort.js +33 -0
- package/dist/commands/effort.js.map +1 -0
- package/dist/commands/guide.d.ts +4 -0
- package/dist/commands/guide.js +52 -0
- package/dist/commands/guide.js.map +1 -0
- package/dist/commands/health.d.ts +1 -0
- package/dist/commands/health.js +20 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.js +114 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.js +63 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrate.d.ts +1 -0
- package/dist/commands/migrate.js +58 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/model.d.ts +5 -0
- package/dist/commands/model.js +31 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/persona.d.ts +6 -0
- package/dist/commands/persona.js +67 -0
- package/dist/commands/persona.js.map +1 -0
- package/dist/commands/port.d.ts +15 -0
- package/dist/commands/port.js +88 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/profile.d.ts +4 -0
- package/dist/commands/profile.js +41 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.js +62 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/setup.d.ts +17 -0
- package/dist/commands/setup.js +228 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/skill.d.ts +7 -0
- package/dist/commands/skill.js +137 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/start.d.ts +6 -0
- package/dist/commands/start.js +25 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +35 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/subagent.d.ts +14 -0
- package/dist/commands/subagent.js +173 -0
- package/dist/commands/subagent.js.map +1 -0
- package/dist/commands/trigger.d.ts +1 -0
- package/dist/commands/trigger.js +13 -0
- package/dist/commands/trigger.js.map +1 -0
- package/dist/commands/uninstall.d.ts +5 -0
- package/dist/commands/uninstall.js +165 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.js +49 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/concurrency.d.ts +1 -0
- package/dist/concurrency.js +17 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +3 -0
- package/dist/db.js +124 -0
- package/dist/db.js.map +1 -0
- package/dist/delegation.d.ts +6 -0
- package/dist/delegation.js +21 -0
- package/dist/delegation.js.map +1 -0
- package/dist/health-check.d.ts +6 -0
- package/dist/health-check.js +38 -0
- package/dist/health-check.js.map +1 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.js +53 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/consumer.d.ts +15 -0
- package/dist/mcp/consumer.js +74 -0
- package/dist/mcp/consumer.js.map +1 -0
- package/dist/mcp/server.d.ts +6 -0
- package/dist/mcp/server.js +260 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/memory/claude-compat.d.ts +4 -0
- package/dist/memory/claude-compat.js +56 -0
- package/dist/memory/claude-compat.js.map +1 -0
- package/dist/memory/compact.d.ts +25 -0
- package/dist/memory/compact.js +195 -0
- package/dist/memory/compact.js.map +1 -0
- package/dist/memory/extract.d.ts +3 -0
- package/dist/memory/extract.js +56 -0
- package/dist/memory/extract.js.map +1 -0
- package/dist/memory/recall.d.ts +5 -0
- package/dist/memory/recall.js +47 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/model-picker.d.ts +33 -0
- package/dist/model-picker.js +104 -0
- package/dist/model-picker.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -0
- package/dist/persona-io.d.ts +5 -0
- package/dist/persona-io.js +29 -0
- package/dist/persona-io.js.map +1 -0
- package/dist/persona.d.ts +12 -0
- package/dist/persona.js +54 -0
- package/dist/persona.js.map +1 -0
- package/dist/prompt.d.ts +5 -0
- package/dist/prompt.js +56 -0
- package/dist/prompt.js.map +1 -0
- package/dist/safety.d.ts +17 -0
- package/dist/safety.js +47 -0
- package/dist/safety.js.map +1 -0
- package/dist/scheduler/cron.d.ts +4 -0
- package/dist/scheduler/cron.js +44 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -0
- package/dist/scheduler/index.js +15 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/launchd.d.ts +4 -0
- package/dist/scheduler/launchd.js +73 -0
- package/dist/scheduler/launchd.js.map +1 -0
- package/dist/scheduler/schtasks.d.ts +4 -0
- package/dist/scheduler/schtasks.js +45 -0
- package/dist/scheduler/schtasks.js.map +1 -0
- package/dist/scheduler/systemd.d.ts +5 -0
- package/dist/scheduler/systemd.js +86 -0
- package/dist/scheduler/systemd.js.map +1 -0
- package/dist/self-improve.d.ts +4 -0
- package/dist/self-improve.js +48 -0
- package/dist/self-improve.js.map +1 -0
- package/dist/skills/auto-skiller.d.ts +21 -0
- package/dist/skills/auto-skiller.js +156 -0
- package/dist/skills/auto-skiller.js.map +1 -0
- package/dist/skills/loader.d.ts +3 -0
- package/dist/skills/loader.js +127 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/matcher.d.ts +2 -0
- package/dist/skills/matcher.js +27 -0
- package/dist/skills/matcher.js.map +1 -0
- package/dist/skills/porter.d.ts +27 -0
- package/dist/skills/porter.js +109 -0
- package/dist/skills/porter.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +25 -0
- package/dist/updater.js +185 -0
- package/dist/updater.js.map +1 -0
- package/package.json +53 -0
- package/scripts/postinstall.js +33 -0
- package/skills/configure-effort/SKILL.md +36 -0
- package/skills/configure-model/SKILL.md +41 -0
- package/skills/configure-tools/SKILL.md +51 -0
- package/skills/daily-briefing/SKILL.md +19 -0
- package/skills/delegate-to-subagent/SKILL.md +63 -0
- package/skills/email-triage/SKILL.md +21 -0
- package/skills/setup-api/SKILL.md +115 -0
- package/skills/setup-compaction/SKILL.md +102 -0
- package/skills/setup-daemon/SKILL.md +49 -0
- package/skills/setup-dashboard/SKILL.md +39 -0
- package/skills/setup-discord/SKILL.md +54 -0
- package/skills/setup-heartbeat/SKILL.md +51 -0
- package/skills/setup-mcp-port/SKILL.md +54 -0
- package/skills/setup-memory-sync/SKILL.md +45 -0
- package/skills/setup-profile/SKILL.md +44 -0
- package/skills/setup-self-update/SKILL.md +45 -0
- package/skills/setup-subagent/SKILL.md +102 -0
- package/skills/setup-telegram/SKILL.md +54 -0
- package/skills/setup-uninstall/SKILL.md +55 -0
- package/skills/web-research/SKILL.md +20 -0
- package/templates/code/AGENT.md +15 -0
- package/templates/code/HEARTBEAT.md +11 -0
- package/templates/code/SOUL.md +10 -0
- package/templates/code/bajaclaw.config.json +5 -0
- package/templates/code/scripts/launch.bat +4 -0
- package/templates/code/scripts/launch.sh +4 -0
- package/templates/custom/AGENT.md +14 -0
- package/templates/custom/HEARTBEAT.md +11 -0
- package/templates/custom/SOUL.md +10 -0
- package/templates/custom/bajaclaw.config.json +5 -0
- package/templates/custom/scripts/launch.bat +4 -0
- package/templates/custom/scripts/launch.sh +4 -0
- package/templates/outreach/AGENT.md +11 -0
- package/templates/outreach/HEARTBEAT.md +11 -0
- package/templates/outreach/SOUL.md +10 -0
- package/templates/outreach/bajaclaw.config.json +5 -0
- package/templates/outreach/scripts/launch.bat +4 -0
- package/templates/outreach/scripts/launch.sh +4 -0
- package/templates/research/AGENT.md +27 -0
- package/templates/research/HEARTBEAT.md +11 -0
- package/templates/research/SOUL.md +10 -0
- package/templates/research/bajaclaw.config.json +5 -0
- package/templates/research/scripts/launch.bat +4 -0
- package/templates/research/scripts/launch.sh +4 -0
- package/templates/social/AGENT.md +10 -0
- package/templates/social/HEARTBEAT.md +11 -0
- package/templates/social/SOUL.md +10 -0
- package/templates/social/bajaclaw.config.json +5 -0
- package/templates/social/scripts/launch.bat +4 -0
- package/templates/social/scripts/launch.sh +4 -0
- package/templates/support/AGENT.md +10 -0
- package/templates/support/HEARTBEAT.md +11 -0
- package/templates/support/SOUL.md +10 -0
- package/templates/support/bajaclaw.config.json +5 -0
- package/templates/support/scripts/launch.bat +4 -0
- package/templates/support/scripts/launch.sh +4 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync, renameSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { loadAllSkills, parseSkill } from "../skills/loader.js";
|
|
5
|
+
import { bajaclawHome } from "../paths.js";
|
|
6
|
+
export async function cmdList(profile) {
|
|
7
|
+
const skills = loadAllSkills(profile);
|
|
8
|
+
if (skills.length === 0) {
|
|
9
|
+
console.log(chalk.dim("no skills found. try `bajaclaw skill new <name>`."));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const s of skills) {
|
|
13
|
+
console.log(`${chalk.bold(s.name.padEnd(28))} ${chalk.dim(`[${s.scope}]`)} ${s.description}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function cmdNew(name, scope = "user", profile) {
|
|
17
|
+
const root = scope === "profile"
|
|
18
|
+
? join(bajaclawHome(), "profiles", profile, "skills")
|
|
19
|
+
: join(bajaclawHome(), "skills");
|
|
20
|
+
const dir = join(root, name);
|
|
21
|
+
if (existsSync(dir))
|
|
22
|
+
throw new Error(`skill already exists: ${dir}`);
|
|
23
|
+
mkdirSync(dir, { recursive: true });
|
|
24
|
+
const body = `---
|
|
25
|
+
name: ${name}
|
|
26
|
+
description: Describe what this skill does in one sentence
|
|
27
|
+
version: 0.1.0
|
|
28
|
+
tools: [Read]
|
|
29
|
+
triggers: ["${name.replace(/-/g, " ")}"]
|
|
30
|
+
effort: medium
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Instructions
|
|
34
|
+
|
|
35
|
+
Write detailed instructions here. These are injected verbatim into the agent's
|
|
36
|
+
system prompt whenever this skill is matched.
|
|
37
|
+
`;
|
|
38
|
+
writeFileSync(join(dir, "SKILL.md"), body);
|
|
39
|
+
console.log(chalk.green(`✓ created ${join(dir, "SKILL.md")}`));
|
|
40
|
+
}
|
|
41
|
+
export async function cmdInstall(source, scope = "user", profile) {
|
|
42
|
+
let raw;
|
|
43
|
+
let srcPath;
|
|
44
|
+
if (/^https?:/.test(source)) {
|
|
45
|
+
const r = await fetch(source);
|
|
46
|
+
if (!r.ok)
|
|
47
|
+
throw new Error(`fetch failed: ${r.status}`);
|
|
48
|
+
raw = await r.text();
|
|
49
|
+
srcPath = source;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const target = existsSync(source) && statSync(source).isDirectory() ? join(source, "SKILL.md") : source;
|
|
53
|
+
raw = readFileSync(target, "utf8");
|
|
54
|
+
srcPath = target;
|
|
55
|
+
}
|
|
56
|
+
const parsed = parseSkill(raw, srcPath, "bajaclaw-user");
|
|
57
|
+
if (!parsed)
|
|
58
|
+
throw new Error("could not parse SKILL.md — missing frontmatter or name");
|
|
59
|
+
console.log(chalk.bold(`About to install: ${parsed.name}`));
|
|
60
|
+
console.log(chalk.dim(parsed.description));
|
|
61
|
+
console.log("");
|
|
62
|
+
console.log(raw.slice(0, 2000));
|
|
63
|
+
if (raw.length > 2000)
|
|
64
|
+
console.log(chalk.dim(`… (${raw.length - 2000} more chars)`));
|
|
65
|
+
if (process.env.BAJACLAW_CONFIRM !== "yes") {
|
|
66
|
+
console.log("");
|
|
67
|
+
console.log(chalk.yellow("Set BAJACLAW_CONFIRM=yes to install, or run again with that env var."));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const root = scope === "profile"
|
|
71
|
+
? join(bajaclawHome(), "profiles", profile, "skills")
|
|
72
|
+
: join(bajaclawHome(), "skills");
|
|
73
|
+
const dir = join(root, parsed.name);
|
|
74
|
+
if (!existsSync(dir))
|
|
75
|
+
mkdirSync(dir, { recursive: true });
|
|
76
|
+
writeFileSync(join(dir, "SKILL.md"), raw);
|
|
77
|
+
console.log(chalk.green(`✓ installed ${parsed.name} to ${dir}`));
|
|
78
|
+
}
|
|
79
|
+
export async function cmdReview() {
|
|
80
|
+
const auto = join(bajaclawHome(), "skills", "auto");
|
|
81
|
+
if (!existsSync(auto)) {
|
|
82
|
+
console.log(chalk.dim("no auto-generated skills to review."));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const names = readdirSync(auto).filter((n) => {
|
|
86
|
+
try {
|
|
87
|
+
return statSync(join(auto, n, "SKILL.md")).isFile();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
if (names.length === 0) {
|
|
94
|
+
console.log(chalk.dim("no auto-generated skills to review."));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
for (const name of names) {
|
|
98
|
+
const path = join(auto, name, "SKILL.md");
|
|
99
|
+
console.log(chalk.bold(`── ${name} ──`));
|
|
100
|
+
console.log(readFileSync(path, "utf8").slice(0, 3000));
|
|
101
|
+
console.log("");
|
|
102
|
+
}
|
|
103
|
+
console.log(chalk.dim(`To promote: bajaclaw skill promote <name>`));
|
|
104
|
+
console.log(chalk.dim(`To discard: rm -rf ${auto}/<name>`));
|
|
105
|
+
}
|
|
106
|
+
export async function cmdPromote(name, opts = {}) {
|
|
107
|
+
const from = join(bajaclawHome(), "skills", "auto", name);
|
|
108
|
+
const to = join(bajaclawHome(), "skills", name);
|
|
109
|
+
if (!existsSync(from))
|
|
110
|
+
throw new Error(`no auto-skill named ${name} (looked in ${from})`);
|
|
111
|
+
if (existsSync(to) && !opts.force)
|
|
112
|
+
throw new Error(`user skill ${name} already exists. Use --force to overwrite.`);
|
|
113
|
+
if (existsSync(to) && opts.force) {
|
|
114
|
+
// Replace the existing directory.
|
|
115
|
+
removeRecursive(to);
|
|
116
|
+
}
|
|
117
|
+
renameSync(from, to);
|
|
118
|
+
console.log(chalk.green(`✓ promoted ${name} -> ${to}`));
|
|
119
|
+
}
|
|
120
|
+
function removeRecursive(path) {
|
|
121
|
+
try {
|
|
122
|
+
const s = statSync(path);
|
|
123
|
+
if (s.isDirectory()) {
|
|
124
|
+
for (const entry of readdirSync(path))
|
|
125
|
+
removeRecursive(join(path, entry));
|
|
126
|
+
try {
|
|
127
|
+
require("node:fs").rmdirSync(path);
|
|
128
|
+
}
|
|
129
|
+
catch { /* ignore */ }
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
require("node:fs").unlinkSync(path);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch { /* swallow */ }
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { runCycle } from "../agent.js";
|
|
3
|
+
export async function runStart(opts) {
|
|
4
|
+
const r = await runCycle({ profile: opts.profile, task: opts.task, dryRun: opts.dryRun });
|
|
5
|
+
if (opts.dryRun || r.dryRun) {
|
|
6
|
+
console.log(chalk.yellow("── dry-run ──"));
|
|
7
|
+
console.log(chalk.dim("command:"), (r.command ?? []).join(" "));
|
|
8
|
+
console.log(chalk.dim("prompt:"));
|
|
9
|
+
console.log(r.prompt);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (!r.ok) {
|
|
13
|
+
console.error(chalk.red(`cycle ${r.cycleId} failed: ${r.error ?? "unknown"}`));
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk.green(`✓ cycle ${r.cycleId} ok`), chalk.dim(`(${r.durationMs}ms${r.costUsd ? `, $${r.costUsd.toFixed(4)}` : ""})`));
|
|
18
|
+
if (r.text) {
|
|
19
|
+
console.log("");
|
|
20
|
+
console.log(r.text.slice(0, 2000));
|
|
21
|
+
if (r.text.length > 2000)
|
|
22
|
+
console.log(chalk.dim(`… (${r.text.length - 2000} more chars)`));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAkB;IAC/C,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACtI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runStatus(profile?: string): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { bajaclawHome } from "../paths.js";
|
|
5
|
+
import { openDb } from "../db.js";
|
|
6
|
+
export async function runStatus(profile) {
|
|
7
|
+
const profiles = profile ? [profile] : listProfiles();
|
|
8
|
+
if (profiles.length === 0) {
|
|
9
|
+
console.log(chalk.dim("no profiles yet. run `bajaclaw init <name>`."));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
for (const p of profiles) {
|
|
13
|
+
const db = openDb(p);
|
|
14
|
+
try {
|
|
15
|
+
const c = db.prepare("SELECT COUNT(*) c FROM cycles").get();
|
|
16
|
+
const last = db.prepare("SELECT started_at FROM cycles ORDER BY id DESC LIMIT 1").get();
|
|
17
|
+
const mem = db.prepare("SELECT COUNT(*) c FROM memories").get();
|
|
18
|
+
const tasks = db.prepare("SELECT COUNT(*) c FROM tasks WHERE status='pending'").get();
|
|
19
|
+
console.log(chalk.bold(p));
|
|
20
|
+
console.log(` cycles: ${c.c}${last ? ` last=${last.started_at}` : ""}`);
|
|
21
|
+
console.log(` memories: ${mem.c}`);
|
|
22
|
+
console.log(` pending tasks: ${tasks.c}`);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
db.close();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function listProfiles() {
|
|
30
|
+
const dir = join(bajaclawHome(), "profiles");
|
|
31
|
+
if (!existsSync(dir))
|
|
32
|
+
return [];
|
|
33
|
+
return readdirSync(dir).filter((n) => existsSync(join(dir, n, "config.json")));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC,GAAG,EAAmB,CAAC;YAC7E,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,EAAwC,CAAC;YAC9H,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAmB,CAAC;YACjF,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAmB,CAAC;YACvG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;gBAAS,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SubAgentSpec {
|
|
2
|
+
name: string;
|
|
3
|
+
parent: string;
|
|
4
|
+
template?: "outreach" | "research" | "support" | "social" | "code" | "custom";
|
|
5
|
+
model?: string;
|
|
6
|
+
allowedTools?: string[];
|
|
7
|
+
disallowedTools?: string[];
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function cmdCreate(spec: SubAgentSpec): Promise<void>;
|
|
11
|
+
export declare function cmdList(parent?: string): Promise<void>;
|
|
12
|
+
export declare function cmdDelegate(sub: string, task: string, opts?: {
|
|
13
|
+
json?: boolean;
|
|
14
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Sub-agent system.
|
|
2
|
+
//
|
|
3
|
+
// A sub-agent is a separate BajaClaw profile owned by an orchestrator.
|
|
4
|
+
// Each has its own config, tools, memory, and skill scopes. Permissions
|
|
5
|
+
// isolate naturally: if the orchestrator doesn't have the Read tool on
|
|
6
|
+
// the emails MCP but its `mail` sub-agent does, the orchestrator
|
|
7
|
+
// physically cannot read emails — it must delegate.
|
|
8
|
+
//
|
|
9
|
+
// Wiring:
|
|
10
|
+
// - The parent profile's config.json gets `subAgents: ["mail", ...]`
|
|
11
|
+
// - The child profile's config.json gets `parent: "<orchestrator>"`
|
|
12
|
+
// - Commands: `bajaclaw subagent create`, `bajaclaw subagent list`,
|
|
13
|
+
// `bajaclaw delegate <name> "<task>"`
|
|
14
|
+
// - Built-in skill `delegate-to-subagent` teaches the orchestrator
|
|
15
|
+
// when + how to delegate.
|
|
16
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync } from "node:fs";
|
|
17
|
+
import chalk from "chalk";
|
|
18
|
+
import { loadConfig, saveConfig } from "../config.js";
|
|
19
|
+
import { runCycle } from "../agent.js";
|
|
20
|
+
import { runInit } from "./init.js";
|
|
21
|
+
import { profileDir, bajaclawHome } from "../paths.js";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
export async function cmdCreate(spec) {
|
|
24
|
+
if (!profileExists(spec.parent)) {
|
|
25
|
+
throw new Error(`parent profile "${spec.parent}" not found. Run \`bajaclaw init ${spec.parent}\` or \`bajaclaw setup\` first.`);
|
|
26
|
+
}
|
|
27
|
+
if (profileExists(spec.name)) {
|
|
28
|
+
throw new Error(`profile "${spec.name}" already exists. Pick a different name or run \`bajaclaw profile delete ${spec.name} --yes\` first.`);
|
|
29
|
+
}
|
|
30
|
+
await runInit({
|
|
31
|
+
name: spec.name,
|
|
32
|
+
template: (spec.template ?? "custom"),
|
|
33
|
+
model: spec.model,
|
|
34
|
+
});
|
|
35
|
+
// Wire the child to its parent.
|
|
36
|
+
const child = loadConfig(spec.name);
|
|
37
|
+
child.parent = spec.parent;
|
|
38
|
+
if (spec.allowedTools)
|
|
39
|
+
child.allowedTools = spec.allowedTools;
|
|
40
|
+
if (spec.disallowedTools)
|
|
41
|
+
child.disallowedTools = spec.disallowedTools;
|
|
42
|
+
saveConfig(child);
|
|
43
|
+
// Register on the parent.
|
|
44
|
+
const parent = loadConfig(spec.parent);
|
|
45
|
+
parent.subAgents = Array.from(new Set([...(parent.subAgents ?? []), spec.name]));
|
|
46
|
+
saveConfig(parent);
|
|
47
|
+
if (spec.description) {
|
|
48
|
+
// Seed a purpose line in the sub-agent's SOUL.md so it knows why it
|
|
49
|
+
// exists.
|
|
50
|
+
const soul = join(profileDir(spec.name), "SOUL.md");
|
|
51
|
+
try {
|
|
52
|
+
const current = existsSync(soul) ? readFileSync(soul, "utf8") : "";
|
|
53
|
+
const appended = current +
|
|
54
|
+
`\n\n## Purpose (as sub-agent of ${spec.parent})\n${spec.description}\n`;
|
|
55
|
+
writeFileSync(soul, appended);
|
|
56
|
+
}
|
|
57
|
+
catch { /* non-fatal */ }
|
|
58
|
+
}
|
|
59
|
+
console.log(chalk.green(`✓ sub-agent ${chalk.bold(spec.name)} created under parent ${chalk.bold(spec.parent)}`));
|
|
60
|
+
if (spec.allowedTools)
|
|
61
|
+
console.log(chalk.dim(` allowedTools: ${spec.allowedTools.join(", ")}`));
|
|
62
|
+
if (spec.disallowedTools)
|
|
63
|
+
console.log(chalk.dim(` disallowedTools: ${spec.disallowedTools.join(", ")}`));
|
|
64
|
+
console.log("");
|
|
65
|
+
console.log(chalk.dim("Try it:"));
|
|
66
|
+
console.log(` bajaclaw delegate ${spec.name} "say hi"`);
|
|
67
|
+
console.log(` bajaclaw start ${spec.name} ${chalk.dim("# run the sub-agent directly")}`);
|
|
68
|
+
}
|
|
69
|
+
export async function cmdList(parent) {
|
|
70
|
+
if (parent) {
|
|
71
|
+
const cfg = loadConfig(parent);
|
|
72
|
+
const subs = cfg.subAgents ?? [];
|
|
73
|
+
if (subs.length === 0) {
|
|
74
|
+
console.log(chalk.dim(`no sub-agents registered on ${parent}.`));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log(chalk.bold(`sub-agents of ${parent}:`));
|
|
78
|
+
for (const s of subs) {
|
|
79
|
+
const row = summaryLine(s);
|
|
80
|
+
console.log(` ${row}`);
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Show the whole tree across all profiles.
|
|
85
|
+
const all = listAllProfiles();
|
|
86
|
+
const orchestrators = all.filter((p) => (safeLoad(p)?.subAgents ?? []).length > 0);
|
|
87
|
+
const orphans = all.filter((p) => {
|
|
88
|
+
const c = safeLoad(p);
|
|
89
|
+
return c && !c.parent && !(c.subAgents ?? []).length;
|
|
90
|
+
});
|
|
91
|
+
if (orchestrators.length === 0 && orphans.length === all.length) {
|
|
92
|
+
console.log(chalk.dim("no sub-agent relationships. run `bajaclaw subagent create <name> --parent <main>` to start."));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const o of orchestrators) {
|
|
96
|
+
console.log(chalk.bold(o));
|
|
97
|
+
for (const s of safeLoad(o)?.subAgents ?? []) {
|
|
98
|
+
console.log(" └─ " + summaryLine(s));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const stray = all.filter((p) => {
|
|
102
|
+
const c = safeLoad(p);
|
|
103
|
+
if (!c)
|
|
104
|
+
return false;
|
|
105
|
+
if (c.parent && !profileExists(c.parent))
|
|
106
|
+
return true;
|
|
107
|
+
return false;
|
|
108
|
+
});
|
|
109
|
+
if (stray.length > 0) {
|
|
110
|
+
console.log("");
|
|
111
|
+
console.log(chalk.yellow("orphaned (parent missing):"));
|
|
112
|
+
for (const s of stray)
|
|
113
|
+
console.log(` ${s} -> ${safeLoad(s)?.parent}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export async function cmdDelegate(sub, task, opts = {}) {
|
|
117
|
+
if (!profileExists(sub)) {
|
|
118
|
+
throw new Error(`sub-agent "${sub}" not found`);
|
|
119
|
+
}
|
|
120
|
+
if (!task || !task.trim()) {
|
|
121
|
+
throw new Error("task is required");
|
|
122
|
+
}
|
|
123
|
+
const r = await runCycle({ profile: sub, task });
|
|
124
|
+
if (opts.json) {
|
|
125
|
+
process.stdout.write(JSON.stringify({
|
|
126
|
+
ok: r.ok,
|
|
127
|
+
cycleId: r.cycleId,
|
|
128
|
+
text: r.text,
|
|
129
|
+
costUsd: r.costUsd,
|
|
130
|
+
durationMs: r.durationMs,
|
|
131
|
+
error: r.error,
|
|
132
|
+
}) + "\n");
|
|
133
|
+
if (!r.ok)
|
|
134
|
+
process.exitCode = 1;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (!r.ok) {
|
|
138
|
+
console.error(chalk.red(`sub-agent ${sub} failed: ${r.error ?? "unknown"}`));
|
|
139
|
+
process.exitCode = 1;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
// Print just the text so a parent agent capturing this with Bash gets a
|
|
143
|
+
// clean pipe.
|
|
144
|
+
process.stdout.write(r.text);
|
|
145
|
+
if (!r.text.endsWith("\n"))
|
|
146
|
+
process.stdout.write("\n");
|
|
147
|
+
}
|
|
148
|
+
function summaryLine(name) {
|
|
149
|
+
const c = safeLoad(name);
|
|
150
|
+
if (!c)
|
|
151
|
+
return `${name} ${chalk.red("(missing)")}`;
|
|
152
|
+
const tools = c.allowedTools?.length ? `allowed=${c.allowedTools.join(",")}` : "";
|
|
153
|
+
const denied = c.disallowedTools?.length ? `denied=${c.disallowedTools.join(",")}` : "";
|
|
154
|
+
return `${chalk.cyan(name.padEnd(20))} ${chalk.dim(`template=${c.template} model=${c.model}`)} ${chalk.dim(tools)} ${chalk.dim(denied)}`.trim();
|
|
155
|
+
}
|
|
156
|
+
function safeLoad(name) {
|
|
157
|
+
try {
|
|
158
|
+
return loadConfig(name);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function profileExists(name) {
|
|
165
|
+
return safeLoad(name) !== null;
|
|
166
|
+
}
|
|
167
|
+
function listAllProfiles() {
|
|
168
|
+
const dir = join(bajaclawHome(), "profiles");
|
|
169
|
+
if (!existsSync(dir))
|
|
170
|
+
return [];
|
|
171
|
+
return readdirSync(dir).filter((n) => existsSync(join(dir, n, "config.json")));
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=subagent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/commands/subagent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runTrigger(profile: string, event: string, body?: string): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { openDb } from "../db.js";
|
|
3
|
+
export async function runTrigger(profile, event, body) {
|
|
4
|
+
const db = openDb(profile);
|
|
5
|
+
try {
|
|
6
|
+
db.prepare("INSERT INTO tasks(created_at, priority, status, body, source) VALUES(?,?,?,?,?)").run(new Date().toISOString(), "normal", "pending", body ?? event, `trigger:${event}`);
|
|
7
|
+
console.log(chalk.green(`✓ enqueued ${event}`));
|
|
8
|
+
}
|
|
9
|
+
finally {
|
|
10
|
+
db.close();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa,EAAE,IAAa;IAC5E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,iFAAiF,CAAC,CAAC,GAAG,CAC/F,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,KAAK,EAAE,WAAW,KAAK,EAAE,CACjF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Full teardown: stop daemons, remove scheduler entries, delete ~/.bajaclaw/,
|
|
2
|
+
// remove agent descriptors, remove MCP desktop entry, remove memory sync files.
|
|
3
|
+
// Requires --yes to execute. Idempotent.
|
|
4
|
+
import { existsSync, readdirSync, readFileSync, rmSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { bajaclawHome, claudeAgentsDir, claudeDesktopConfigPath, claudeMemoryDir, } from "../paths.js";
|
|
8
|
+
import { pickAdapter } from "../scheduler/index.js";
|
|
9
|
+
export async function runUninstall(opts = {}) {
|
|
10
|
+
const profiles = listProfiles();
|
|
11
|
+
const plan = buildPlan(profiles, !!opts.keepData);
|
|
12
|
+
console.log(chalk.bold("Uninstall plan:"));
|
|
13
|
+
for (const line of plan.description)
|
|
14
|
+
console.log(` ${line}`);
|
|
15
|
+
console.log("");
|
|
16
|
+
if (!opts.yes) {
|
|
17
|
+
console.log(chalk.yellow("Re-run with --yes to apply. Nothing has been changed."));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const errors = [];
|
|
21
|
+
// 1. Stop running daemons by SIGTERM via pid files.
|
|
22
|
+
for (const p of profiles) {
|
|
23
|
+
const pidFile = join(bajaclawHome(), "profiles", p, "daemon.pid");
|
|
24
|
+
if (!existsSync(pidFile))
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
const pid = Number(readFileSync(pidFile, "utf8").trim());
|
|
28
|
+
if (pid) {
|
|
29
|
+
try {
|
|
30
|
+
process.kill(pid, "SIGTERM");
|
|
31
|
+
}
|
|
32
|
+
catch { /* already gone */ }
|
|
33
|
+
}
|
|
34
|
+
unlinkSync(pidFile);
|
|
35
|
+
console.log(chalk.green(`✓ stopped daemon for ${p} (pid ${pid})`));
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
errors.push(`daemon stop (${p}): ${e.message}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 2. Remove OS scheduler entries.
|
|
42
|
+
const adapter = pickAdapter();
|
|
43
|
+
for (const p of profiles) {
|
|
44
|
+
try {
|
|
45
|
+
await adapter.uninstall(p, "heartbeat");
|
|
46
|
+
console.log(chalk.green(`✓ removed scheduler entry for ${p}`));
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
errors.push(`scheduler (${p}): ${e.message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 3. Remove MCP entry from desktop config.
|
|
53
|
+
try {
|
|
54
|
+
const removed = removeMcpRegistration();
|
|
55
|
+
if (removed.length > 0) {
|
|
56
|
+
for (const path of removed)
|
|
57
|
+
console.log(chalk.green(`✓ removed bajaclaw MCP entry from ${path}`));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
errors.push(`mcp unregister: ${e.message}`);
|
|
62
|
+
}
|
|
63
|
+
// 4. Remove agent descriptors.
|
|
64
|
+
for (const p of profiles) {
|
|
65
|
+
const dir = claudeAgentsDir(p);
|
|
66
|
+
if (existsSync(dir)) {
|
|
67
|
+
try {
|
|
68
|
+
rmSync(dir, { recursive: true, force: true });
|
|
69
|
+
console.log(chalk.green(`✓ removed agent descriptor dir ${dir}`));
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
errors.push(`agent dir (${p}): ${e.message}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 5. Remove memory sync files.
|
|
77
|
+
const memDir = claudeMemoryDir();
|
|
78
|
+
if (existsSync(memDir)) {
|
|
79
|
+
for (const f of readdirSync(memDir)) {
|
|
80
|
+
if (!f.startsWith("bajaclaw-") || !f.endsWith(".md"))
|
|
81
|
+
continue;
|
|
82
|
+
try {
|
|
83
|
+
unlinkSync(join(memDir, f));
|
|
84
|
+
console.log(chalk.green(`✓ removed sync file ${f}`));
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
errors.push(`memory file (${f}): ${e.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 6. Remove ~/.bajaclaw/ (unless --keep-data).
|
|
92
|
+
if (!opts.keepData) {
|
|
93
|
+
const home = bajaclawHome();
|
|
94
|
+
if (existsSync(home)) {
|
|
95
|
+
try {
|
|
96
|
+
rmSync(home, { recursive: true, force: true });
|
|
97
|
+
console.log(chalk.green(`✓ removed ${home}`));
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
errors.push(`bajaclaw home: ${e.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(chalk.dim(`kept data dir ${bajaclawHome()} (--keep-data)`));
|
|
106
|
+
}
|
|
107
|
+
if (errors.length > 0) {
|
|
108
|
+
console.log("");
|
|
109
|
+
console.log(chalk.yellow("Completed with warnings:"));
|
|
110
|
+
for (const e of errors)
|
|
111
|
+
console.log(chalk.yellow(` ! ${e}`));
|
|
112
|
+
}
|
|
113
|
+
console.log("");
|
|
114
|
+
console.log(chalk.green.bold("Uninstall complete."));
|
|
115
|
+
console.log("");
|
|
116
|
+
console.log(chalk.dim("To remove the bajaclaw command itself:"));
|
|
117
|
+
console.log(chalk.dim(" npm uninstall -g bajaclaw"));
|
|
118
|
+
console.log(chalk.dim(" (or `rm -rf` your git clone, if installed that way)"));
|
|
119
|
+
}
|
|
120
|
+
function listProfiles() {
|
|
121
|
+
const dir = join(bajaclawHome(), "profiles");
|
|
122
|
+
if (!existsSync(dir))
|
|
123
|
+
return [];
|
|
124
|
+
return readdirSync(dir).filter((n) => existsSync(join(dir, n, "config.json")));
|
|
125
|
+
}
|
|
126
|
+
function buildPlan(profiles, keepData) {
|
|
127
|
+
const desc = [];
|
|
128
|
+
if (profiles.length === 0) {
|
|
129
|
+
desc.push(chalk.dim("no profiles found — nothing to tear down"));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
desc.push(`${profiles.length} profile(s): ${profiles.join(", ")}`);
|
|
133
|
+
desc.push(" · stop any running daemon");
|
|
134
|
+
desc.push(" · remove OS scheduler entries (launchd/systemd/cron/schtasks)");
|
|
135
|
+
desc.push(" · remove agent descriptor dir at ~/.claude/agents/<profile>/");
|
|
136
|
+
}
|
|
137
|
+
desc.push("remove bajaclaw MCP entry from desktop config");
|
|
138
|
+
desc.push("remove memory sync files at ~/.claude/memory/bajaclaw-*.md");
|
|
139
|
+
desc.push(keepData
|
|
140
|
+
? chalk.dim(`KEEP ~/.bajaclaw/ (data preserved)`)
|
|
141
|
+
: chalk.yellow(`DELETE ~/.bajaclaw/ (irreversible: removes DBs, logs, skills, auto-candidates)`));
|
|
142
|
+
return { description: desc };
|
|
143
|
+
}
|
|
144
|
+
function removeMcpRegistration() {
|
|
145
|
+
const paths = [
|
|
146
|
+
claudeDesktopConfigPath(),
|
|
147
|
+
join(process.env.HOME ?? "", ".claude", "claude_desktop_config.json"),
|
|
148
|
+
];
|
|
149
|
+
const removed = [];
|
|
150
|
+
for (const p of paths) {
|
|
151
|
+
if (!existsSync(p))
|
|
152
|
+
continue;
|
|
153
|
+
try {
|
|
154
|
+
const cfg = JSON.parse(readFileSync(p, "utf8"));
|
|
155
|
+
if (cfg.mcpServers && "bajaclaw" in cfg.mcpServers) {
|
|
156
|
+
delete cfg.mcpServers.bajaclaw;
|
|
157
|
+
writeFileSync(p, JSON.stringify(cfg, null, 2));
|
|
158
|
+
removed.push(p);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch { /* ignore unparseable configs */ }
|
|
162
|
+
}
|
|
163
|
+
return removed;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|