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.
Files changed (248) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +639 -0
  3. package/bin/bajaclaw.js +35 -0
  4. package/bin/create-bajaclaw.js +17 -0
  5. package/dist/agent.d.ts +29 -0
  6. package/dist/agent.js +231 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/api/server.d.ts +15 -0
  9. package/dist/api/server.js +215 -0
  10. package/dist/api/server.js.map +1 -0
  11. package/dist/api/translate.d.ts +61 -0
  12. package/dist/api/translate.js +109 -0
  13. package/dist/api/translate.js.map +1 -0
  14. package/dist/banner.d.ts +7 -0
  15. package/dist/banner.js +31 -0
  16. package/dist/banner.js.map +1 -0
  17. package/dist/channels/gateway.d.ts +1 -0
  18. package/dist/channels/gateway.js +76 -0
  19. package/dist/channels/gateway.js.map +1 -0
  20. package/dist/claude.d.ts +9 -0
  21. package/dist/claude.js +170 -0
  22. package/dist/claude.js.map +1 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.js +303 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/commands/channel.d.ts +3 -0
  27. package/dist/commands/channel.js +27 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/compact.d.ts +8 -0
  30. package/dist/commands/compact.js +60 -0
  31. package/dist/commands/compact.js.map +1 -0
  32. package/dist/commands/daemon.d.ts +7 -0
  33. package/dist/commands/daemon.js +129 -0
  34. package/dist/commands/daemon.js.map +1 -0
  35. package/dist/commands/dashboard.d.ts +1 -0
  36. package/dist/commands/dashboard.js +78 -0
  37. package/dist/commands/dashboard.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +1 -0
  39. package/dist/commands/doctor.js +25 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/dry-run.d.ts +1 -0
  42. package/dist/commands/dry-run.js +5 -0
  43. package/dist/commands/dry-run.js.map +1 -0
  44. package/dist/commands/effort.d.ts +6 -0
  45. package/dist/commands/effort.js +33 -0
  46. package/dist/commands/effort.js.map +1 -0
  47. package/dist/commands/guide.d.ts +4 -0
  48. package/dist/commands/guide.js +52 -0
  49. package/dist/commands/guide.js.map +1 -0
  50. package/dist/commands/health.d.ts +1 -0
  51. package/dist/commands/health.js +20 -0
  52. package/dist/commands/health.js.map +1 -0
  53. package/dist/commands/init.d.ts +12 -0
  54. package/dist/commands/init.js +114 -0
  55. package/dist/commands/init.js.map +1 -0
  56. package/dist/commands/mcp.d.ts +9 -0
  57. package/dist/commands/mcp.js +63 -0
  58. package/dist/commands/mcp.js.map +1 -0
  59. package/dist/commands/migrate.d.ts +1 -0
  60. package/dist/commands/migrate.js +58 -0
  61. package/dist/commands/migrate.js.map +1 -0
  62. package/dist/commands/model.d.ts +5 -0
  63. package/dist/commands/model.js +31 -0
  64. package/dist/commands/model.js.map +1 -0
  65. package/dist/commands/persona.d.ts +6 -0
  66. package/dist/commands/persona.js +67 -0
  67. package/dist/commands/persona.js.map +1 -0
  68. package/dist/commands/port.d.ts +15 -0
  69. package/dist/commands/port.js +88 -0
  70. package/dist/commands/port.js.map +1 -0
  71. package/dist/commands/profile.d.ts +4 -0
  72. package/dist/commands/profile.js +41 -0
  73. package/dist/commands/profile.js.map +1 -0
  74. package/dist/commands/serve.d.ts +14 -0
  75. package/dist/commands/serve.js +62 -0
  76. package/dist/commands/serve.js.map +1 -0
  77. package/dist/commands/setup.d.ts +17 -0
  78. package/dist/commands/setup.js +228 -0
  79. package/dist/commands/setup.js.map +1 -0
  80. package/dist/commands/skill.d.ts +7 -0
  81. package/dist/commands/skill.js +137 -0
  82. package/dist/commands/skill.js.map +1 -0
  83. package/dist/commands/start.d.ts +6 -0
  84. package/dist/commands/start.js +25 -0
  85. package/dist/commands/start.js.map +1 -0
  86. package/dist/commands/status.d.ts +1 -0
  87. package/dist/commands/status.js +35 -0
  88. package/dist/commands/status.js.map +1 -0
  89. package/dist/commands/subagent.d.ts +14 -0
  90. package/dist/commands/subagent.js +173 -0
  91. package/dist/commands/subagent.js.map +1 -0
  92. package/dist/commands/trigger.d.ts +1 -0
  93. package/dist/commands/trigger.js +13 -0
  94. package/dist/commands/trigger.js.map +1 -0
  95. package/dist/commands/uninstall.d.ts +5 -0
  96. package/dist/commands/uninstall.js +165 -0
  97. package/dist/commands/uninstall.js.map +1 -0
  98. package/dist/commands/update.d.ts +7 -0
  99. package/dist/commands/update.js +49 -0
  100. package/dist/commands/update.js.map +1 -0
  101. package/dist/concurrency.d.ts +1 -0
  102. package/dist/concurrency.js +17 -0
  103. package/dist/concurrency.js.map +1 -0
  104. package/dist/config.d.ts +5 -0
  105. package/dist/config.js +42 -0
  106. package/dist/config.js.map +1 -0
  107. package/dist/db.d.ts +3 -0
  108. package/dist/db.js +124 -0
  109. package/dist/db.js.map +1 -0
  110. package/dist/delegation.d.ts +6 -0
  111. package/dist/delegation.js +21 -0
  112. package/dist/delegation.js.map +1 -0
  113. package/dist/health-check.d.ts +6 -0
  114. package/dist/health-check.js +38 -0
  115. package/dist/health-check.js.map +1 -0
  116. package/dist/logger.d.ts +11 -0
  117. package/dist/logger.js +53 -0
  118. package/dist/logger.js.map +1 -0
  119. package/dist/mcp/consumer.d.ts +15 -0
  120. package/dist/mcp/consumer.js +74 -0
  121. package/dist/mcp/consumer.js.map +1 -0
  122. package/dist/mcp/server.d.ts +6 -0
  123. package/dist/mcp/server.js +260 -0
  124. package/dist/mcp/server.js.map +1 -0
  125. package/dist/memory/claude-compat.d.ts +4 -0
  126. package/dist/memory/claude-compat.js +56 -0
  127. package/dist/memory/claude-compat.js.map +1 -0
  128. package/dist/memory/compact.d.ts +25 -0
  129. package/dist/memory/compact.js +195 -0
  130. package/dist/memory/compact.js.map +1 -0
  131. package/dist/memory/extract.d.ts +3 -0
  132. package/dist/memory/extract.js +56 -0
  133. package/dist/memory/extract.js.map +1 -0
  134. package/dist/memory/recall.d.ts +5 -0
  135. package/dist/memory/recall.js +47 -0
  136. package/dist/memory/recall.js.map +1 -0
  137. package/dist/model-picker.d.ts +33 -0
  138. package/dist/model-picker.js +104 -0
  139. package/dist/model-picker.js.map +1 -0
  140. package/dist/paths.d.ts +12 -0
  141. package/dist/paths.js +49 -0
  142. package/dist/paths.js.map +1 -0
  143. package/dist/persona-io.d.ts +5 -0
  144. package/dist/persona-io.js +29 -0
  145. package/dist/persona-io.js.map +1 -0
  146. package/dist/persona.d.ts +12 -0
  147. package/dist/persona.js +54 -0
  148. package/dist/persona.js.map +1 -0
  149. package/dist/prompt.d.ts +5 -0
  150. package/dist/prompt.js +56 -0
  151. package/dist/prompt.js.map +1 -0
  152. package/dist/safety.d.ts +17 -0
  153. package/dist/safety.js +47 -0
  154. package/dist/safety.js.map +1 -0
  155. package/dist/scheduler/cron.d.ts +4 -0
  156. package/dist/scheduler/cron.js +44 -0
  157. package/dist/scheduler/cron.js.map +1 -0
  158. package/dist/scheduler/index.d.ts +7 -0
  159. package/dist/scheduler/index.js +15 -0
  160. package/dist/scheduler/index.js.map +1 -0
  161. package/dist/scheduler/launchd.d.ts +4 -0
  162. package/dist/scheduler/launchd.js +73 -0
  163. package/dist/scheduler/launchd.js.map +1 -0
  164. package/dist/scheduler/schtasks.d.ts +4 -0
  165. package/dist/scheduler/schtasks.js +45 -0
  166. package/dist/scheduler/schtasks.js.map +1 -0
  167. package/dist/scheduler/systemd.d.ts +5 -0
  168. package/dist/scheduler/systemd.js +86 -0
  169. package/dist/scheduler/systemd.js.map +1 -0
  170. package/dist/self-improve.d.ts +4 -0
  171. package/dist/self-improve.js +48 -0
  172. package/dist/self-improve.js.map +1 -0
  173. package/dist/skills/auto-skiller.d.ts +21 -0
  174. package/dist/skills/auto-skiller.js +156 -0
  175. package/dist/skills/auto-skiller.js.map +1 -0
  176. package/dist/skills/loader.d.ts +3 -0
  177. package/dist/skills/loader.js +127 -0
  178. package/dist/skills/loader.js.map +1 -0
  179. package/dist/skills/matcher.d.ts +2 -0
  180. package/dist/skills/matcher.js +27 -0
  181. package/dist/skills/matcher.js.map +1 -0
  182. package/dist/skills/porter.d.ts +27 -0
  183. package/dist/skills/porter.js +109 -0
  184. package/dist/skills/porter.js.map +1 -0
  185. package/dist/types.d.ts +110 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/updater.d.ts +25 -0
  189. package/dist/updater.js +185 -0
  190. package/dist/updater.js.map +1 -0
  191. package/package.json +53 -0
  192. package/scripts/postinstall.js +33 -0
  193. package/skills/configure-effort/SKILL.md +36 -0
  194. package/skills/configure-model/SKILL.md +41 -0
  195. package/skills/configure-tools/SKILL.md +51 -0
  196. package/skills/daily-briefing/SKILL.md +19 -0
  197. package/skills/delegate-to-subagent/SKILL.md +63 -0
  198. package/skills/email-triage/SKILL.md +21 -0
  199. package/skills/setup-api/SKILL.md +115 -0
  200. package/skills/setup-compaction/SKILL.md +102 -0
  201. package/skills/setup-daemon/SKILL.md +49 -0
  202. package/skills/setup-dashboard/SKILL.md +39 -0
  203. package/skills/setup-discord/SKILL.md +54 -0
  204. package/skills/setup-heartbeat/SKILL.md +51 -0
  205. package/skills/setup-mcp-port/SKILL.md +54 -0
  206. package/skills/setup-memory-sync/SKILL.md +45 -0
  207. package/skills/setup-profile/SKILL.md +44 -0
  208. package/skills/setup-self-update/SKILL.md +45 -0
  209. package/skills/setup-subagent/SKILL.md +102 -0
  210. package/skills/setup-telegram/SKILL.md +54 -0
  211. package/skills/setup-uninstall/SKILL.md +55 -0
  212. package/skills/web-research/SKILL.md +20 -0
  213. package/templates/code/AGENT.md +15 -0
  214. package/templates/code/HEARTBEAT.md +11 -0
  215. package/templates/code/SOUL.md +10 -0
  216. package/templates/code/bajaclaw.config.json +5 -0
  217. package/templates/code/scripts/launch.bat +4 -0
  218. package/templates/code/scripts/launch.sh +4 -0
  219. package/templates/custom/AGENT.md +14 -0
  220. package/templates/custom/HEARTBEAT.md +11 -0
  221. package/templates/custom/SOUL.md +10 -0
  222. package/templates/custom/bajaclaw.config.json +5 -0
  223. package/templates/custom/scripts/launch.bat +4 -0
  224. package/templates/custom/scripts/launch.sh +4 -0
  225. package/templates/outreach/AGENT.md +11 -0
  226. package/templates/outreach/HEARTBEAT.md +11 -0
  227. package/templates/outreach/SOUL.md +10 -0
  228. package/templates/outreach/bajaclaw.config.json +5 -0
  229. package/templates/outreach/scripts/launch.bat +4 -0
  230. package/templates/outreach/scripts/launch.sh +4 -0
  231. package/templates/research/AGENT.md +27 -0
  232. package/templates/research/HEARTBEAT.md +11 -0
  233. package/templates/research/SOUL.md +10 -0
  234. package/templates/research/bajaclaw.config.json +5 -0
  235. package/templates/research/scripts/launch.bat +4 -0
  236. package/templates/research/scripts/launch.sh +4 -0
  237. package/templates/social/AGENT.md +10 -0
  238. package/templates/social/HEARTBEAT.md +11 -0
  239. package/templates/social/SOUL.md +10 -0
  240. package/templates/social/bajaclaw.config.json +5 -0
  241. package/templates/social/scripts/launch.bat +4 -0
  242. package/templates/social/scripts/launch.sh +4 -0
  243. package/templates/support/AGENT.md +10 -0
  244. package/templates/support/HEARTBEAT.md +11 -0
  245. package/templates/support/SOUL.md +10 -0
  246. package/templates/support/bajaclaw.config.json +5 -0
  247. package/templates/support/scripts/launch.bat +4 -0
  248. 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,6 @@
1
+ export interface StartOptions {
2
+ profile: string;
3
+ task?: string;
4
+ dryRun?: boolean;
5
+ }
6
+ export declare function runStart(opts: StartOptions): Promise<void>;
@@ -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,5 @@
1
+ export interface UninstallOptions {
2
+ yes?: boolean;
3
+ keepData?: boolean;
4
+ }
5
+ export declare function runUninstall(opts?: UninstallOptions): Promise<void>;
@@ -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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"}
@@ -0,0 +1,7 @@
1
+ export interface UpdateCmdOptions {
2
+ check?: boolean;
3
+ force?: boolean;
4
+ yes?: boolean;
5
+ }
6
+ export declare function runUpdate(opts?: UpdateCmdOptions): Promise<void>;
7
+ export declare function maybeNoticeAtExit(): Promise<void>;