claude-task-worker 0.88.0 → 0.90.0
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 +152 -159
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -583,6 +583,8 @@ __export(herdr_runner_exports, {
|
|
|
583
583
|
PANE_OUTPUT_LINES: () => PANE_OUTPUT_LINES,
|
|
584
584
|
PANE_READY_POLL_INTERVAL_MS: () => PANE_READY_POLL_INTERVAL_MS,
|
|
585
585
|
PANE_READY_TIMEOUT_MS: () => PANE_READY_TIMEOUT_MS,
|
|
586
|
+
PROMPT_ACCEPT_POLL_INTERVAL_MS: () => PROMPT_ACCEPT_POLL_INTERVAL_MS,
|
|
587
|
+
PROMPT_ACCEPT_TIMEOUT_MS: () => PROMPT_ACCEPT_TIMEOUT_MS,
|
|
586
588
|
buildHerdrTaskResult: () => buildHerdrTaskResult,
|
|
587
589
|
createCompletionTracker: () => createCompletionTracker,
|
|
588
590
|
observeAgentStatus: () => observeAgentStatus,
|
|
@@ -657,13 +659,43 @@ async function startHerdrTask({
|
|
|
657
659
|
}
|
|
658
660
|
await mod.agentStart(paneId, { name: toAgentName(label), args, readyTimeoutMs: timing?.agentStartReadyTimeoutMs });
|
|
659
661
|
await mod.agentPrompt(paneId, prompt);
|
|
662
|
+
await ensurePromptAccepted(paneId, prompt, mod, timing);
|
|
660
663
|
} catch (err) {
|
|
664
|
+
console.error(`[herdr-runner] failed to start task in pane ${paneId}: ${err}`);
|
|
661
665
|
await mod.tabClose(tabId).catch(() => {
|
|
662
666
|
});
|
|
663
667
|
throw err;
|
|
664
668
|
}
|
|
665
669
|
return { paneId, tabId };
|
|
666
670
|
}
|
|
671
|
+
async function ensurePromptAccepted(paneId, prompt, mod, timing) {
|
|
672
|
+
if (await waitForPromptAccepted(paneId, mod, timing)) return;
|
|
673
|
+
console.warn(`[herdr-runner] the prompt was not accepted in pane ${paneId} (claude stayed idle); resending it`);
|
|
674
|
+
await mod.agentPrompt(paneId, prompt);
|
|
675
|
+
if (await waitForPromptAccepted(paneId, mod, timing)) return;
|
|
676
|
+
throw new Error(
|
|
677
|
+
`the claude session in pane ${paneId} did not start the task after the prompt was submitted twice (a startup dialog most likely swallowed it)`
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
async function waitForPromptAccepted(paneId, mod, timing) {
|
|
681
|
+
const timeoutMs = timing?.promptAcceptTimeoutMs ?? PROMPT_ACCEPT_TIMEOUT_MS;
|
|
682
|
+
const pollIntervalMs = timing?.promptAcceptPollIntervalMs ?? PROMPT_ACCEPT_POLL_INTERVAL_MS;
|
|
683
|
+
const deadline = Date.now() + timeoutMs;
|
|
684
|
+
let loggedError = false;
|
|
685
|
+
for (; ; ) {
|
|
686
|
+
try {
|
|
687
|
+
const { agentStatus } = await mod.agentGet(paneId);
|
|
688
|
+
if (agentStatus === "working" || agentStatus === "done") return true;
|
|
689
|
+
} catch (err) {
|
|
690
|
+
if (!loggedError) {
|
|
691
|
+
console.error(`[herdr-runner] failed to read agent status for pane ${paneId} after the prompt: ${err}`);
|
|
692
|
+
loggedError = true;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
if (Date.now() >= deadline) return false;
|
|
696
|
+
await sleep(pollIntervalMs);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
667
699
|
async function waitForPaneReady(paneId, mod, options) {
|
|
668
700
|
const timeoutMs = options?.timeoutMs ?? PANE_READY_TIMEOUT_MS;
|
|
669
701
|
const pollIntervalMs = options?.pollIntervalMs ?? PANE_READY_POLL_INTERVAL_MS;
|
|
@@ -769,7 +801,7 @@ async function stopHerdrTask(task, herdr, options) {
|
|
|
769
801
|
function sleep(ms) {
|
|
770
802
|
return new Promise((resolve3) => setTimeout(resolve3, ms));
|
|
771
803
|
}
|
|
772
|
-
var AGENT_POLL_INTERVAL_MS, PANE_OUTPUT_LINES, PANE_READY_TIMEOUT_MS, PANE_READY_POLL_INTERVAL_MS, CLAUDE_EXIT_TIMEOUT_MS, CLAUDE_EXIT_POLL_INTERVAL_MS;
|
|
804
|
+
var AGENT_POLL_INTERVAL_MS, PANE_OUTPUT_LINES, PANE_READY_TIMEOUT_MS, PANE_READY_POLL_INTERVAL_MS, PROMPT_ACCEPT_TIMEOUT_MS, PROMPT_ACCEPT_POLL_INTERVAL_MS, CLAUDE_EXIT_TIMEOUT_MS, CLAUDE_EXIT_POLL_INTERVAL_MS;
|
|
773
805
|
var init_herdr_runner = __esm({
|
|
774
806
|
"src/herdr-runner.ts"() {
|
|
775
807
|
"use strict";
|
|
@@ -778,6 +810,8 @@ var init_herdr_runner = __esm({
|
|
|
778
810
|
PANE_OUTPUT_LINES = 300;
|
|
779
811
|
PANE_READY_TIMEOUT_MS = 30 * 1e3;
|
|
780
812
|
PANE_READY_POLL_INTERVAL_MS = 200;
|
|
813
|
+
PROMPT_ACCEPT_TIMEOUT_MS = 20 * 1e3;
|
|
814
|
+
PROMPT_ACCEPT_POLL_INTERVAL_MS = 500;
|
|
781
815
|
CLAUDE_EXIT_TIMEOUT_MS = 15 * 1e3;
|
|
782
816
|
CLAUDE_EXIT_POLL_INTERVAL_MS = 200;
|
|
783
817
|
}
|
|
@@ -4107,7 +4141,7 @@ var updateDesignMdWorker = createScheduledWorker({
|
|
|
4107
4141
|
init_table();
|
|
4108
4142
|
|
|
4109
4143
|
// src/commands/init.ts
|
|
4110
|
-
import { mkdir as mkdir2, writeFile as writeFile2,
|
|
4144
|
+
import { mkdir as mkdir2, writeFile as writeFile2, access } from "node:fs/promises";
|
|
4111
4145
|
|
|
4112
4146
|
// src/commands/codegraph.ts
|
|
4113
4147
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
@@ -4195,122 +4229,6 @@ async function ensureCodegraphGitIgnore(logPrefix) {
|
|
|
4195
4229
|
}
|
|
4196
4230
|
}
|
|
4197
4231
|
|
|
4198
|
-
// src/commands/design-md.ts
|
|
4199
|
-
async function loadRunCommand2() {
|
|
4200
|
-
return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
|
|
4201
|
-
}
|
|
4202
|
-
var DESIGN_MD_PACKAGE = "@google/design.md";
|
|
4203
|
-
async function installDesignMdCli(logPrefix) {
|
|
4204
|
-
console.log(`[${logPrefix}] Installing DESIGN.md CLI (npm install -g ${DESIGN_MD_PACKAGE}@latest)...`);
|
|
4205
|
-
try {
|
|
4206
|
-
const { runCommand: runCommand2 } = await loadRunCommand2();
|
|
4207
|
-
await runCommand2("npm", ["install", "-g", `${DESIGN_MD_PACKAGE}@latest`]);
|
|
4208
|
-
console.log(`[${logPrefix}] DESIGN.md CLI installed.`);
|
|
4209
|
-
return true;
|
|
4210
|
-
} catch (err) {
|
|
4211
|
-
console.error(`[${logPrefix}] Failed to install DESIGN.md CLI: ${err.message}`);
|
|
4212
|
-
return false;
|
|
4213
|
-
}
|
|
4214
|
-
}
|
|
4215
|
-
|
|
4216
|
-
// src/commands/pen.ts
|
|
4217
|
-
async function loadRunCommand3() {
|
|
4218
|
-
return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
|
|
4219
|
-
}
|
|
4220
|
-
var PEN_PACKAGE = "@pen.dev/cli";
|
|
4221
|
-
var LEGACY_PEN_PACKAGE = "@pencil.dev/cli";
|
|
4222
|
-
async function installPenCli(logPrefix) {
|
|
4223
|
-
console.log(`[${logPrefix}] Removing legacy Pen CLI (npm uninstall -g ${LEGACY_PEN_PACKAGE})...`);
|
|
4224
|
-
const { runCommand: runCommand2 } = await loadRunCommand3();
|
|
4225
|
-
try {
|
|
4226
|
-
await runCommand2("npm", ["uninstall", "-g", LEGACY_PEN_PACKAGE]);
|
|
4227
|
-
} catch (err) {
|
|
4228
|
-
console.error(`[${logPrefix}] Skipped removing legacy Pen CLI: ${err.message}`);
|
|
4229
|
-
}
|
|
4230
|
-
console.log(`[${logPrefix}] Installing Pen CLI (npm install -g ${PEN_PACKAGE}@latest)...`);
|
|
4231
|
-
try {
|
|
4232
|
-
await runCommand2("npm", ["install", "-g", `${PEN_PACKAGE}@latest`]);
|
|
4233
|
-
console.log(`[${logPrefix}] Pen CLI installed.`);
|
|
4234
|
-
} catch (err) {
|
|
4235
|
-
console.error(`[${logPrefix}] Failed to install Pen CLI: ${err.message}`);
|
|
4236
|
-
return false;
|
|
4237
|
-
}
|
|
4238
|
-
await warnIfPenLoggedOut(logPrefix);
|
|
4239
|
-
return true;
|
|
4240
|
-
}
|
|
4241
|
-
async function warnIfPenLoggedOut(logPrefix) {
|
|
4242
|
-
const { runCommand: runCommand2 } = await loadRunCommand3();
|
|
4243
|
-
try {
|
|
4244
|
-
await runCommand2("pencil", ["status"]);
|
|
4245
|
-
} catch {
|
|
4246
|
-
console.log(
|
|
4247
|
-
`[${logPrefix}] Pen CLI is not authenticated. Run \`pencil login\` (or set PEN_CLI_KEY) before using .pen designs.`
|
|
4248
|
-
);
|
|
4249
|
-
}
|
|
4250
|
-
}
|
|
4251
|
-
|
|
4252
|
-
// src/commands/install.ts
|
|
4253
|
-
init_run_command();
|
|
4254
|
-
var PLUGIN_NAME = "claude-task-worker";
|
|
4255
|
-
var MARKETPLACE_NAME = "claude-task-worker";
|
|
4256
|
-
var MARKETPLACE_SOURCE = "getty104/claude-task-worker";
|
|
4257
|
-
var GLOBAL_NPM_PACKAGES = [PLUGIN_NAME, CODEGRAPH_PACKAGE, DESIGN_MD_PACKAGE, PEN_PACKAGE];
|
|
4258
|
-
async function printGlobalPackageVersions(logPrefix) {
|
|
4259
|
-
console.log(`[${logPrefix}] Installed versions:`);
|
|
4260
|
-
try {
|
|
4261
|
-
await runCommand("npm", ["ls", "-g", "--depth=0", ...GLOBAL_NPM_PACKAGES]);
|
|
4262
|
-
} catch (err) {
|
|
4263
|
-
console.error(`[${logPrefix}] Some packages are missing from the global install: ${err.message}`);
|
|
4264
|
-
}
|
|
4265
|
-
}
|
|
4266
|
-
async function addMarketplace() {
|
|
4267
|
-
console.log(`[install] Adding marketplace: ${MARKETPLACE_SOURCE}...`);
|
|
4268
|
-
try {
|
|
4269
|
-
await runCommand("claude", ["plugin", "marketplace", "add", MARKETPLACE_SOURCE]);
|
|
4270
|
-
console.log("[install] Marketplace added.");
|
|
4271
|
-
} catch (err) {
|
|
4272
|
-
console.error(
|
|
4273
|
-
`[install] Failed to add marketplace (already added is expected and safe to ignore): ${err.message}`
|
|
4274
|
-
);
|
|
4275
|
-
}
|
|
4276
|
-
}
|
|
4277
|
-
async function installPlugin() {
|
|
4278
|
-
console.log(`[install] Installing plugin: ${PLUGIN_NAME}@${MARKETPLACE_NAME}...`);
|
|
4279
|
-
try {
|
|
4280
|
-
await runCommand("claude", ["plugin", "install", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`]);
|
|
4281
|
-
console.log("[install] Plugin installed. Restart your Claude Code session to apply.");
|
|
4282
|
-
return true;
|
|
4283
|
-
} catch (err) {
|
|
4284
|
-
console.error(`[install] Failed to install plugin: ${err.message}`);
|
|
4285
|
-
return false;
|
|
4286
|
-
}
|
|
4287
|
-
}
|
|
4288
|
-
async function installCli() {
|
|
4289
|
-
console.log("[install] Installing claude-task-worker CLI (npm install -g claude-task-worker@latest)...");
|
|
4290
|
-
try {
|
|
4291
|
-
await runCommand("npm", ["install", "-g", "claude-task-worker@latest"]);
|
|
4292
|
-
console.log("[install] claude-task-worker CLI installed.");
|
|
4293
|
-
return true;
|
|
4294
|
-
} catch (err) {
|
|
4295
|
-
console.error(`[install] Failed to install claude-task-worker CLI: ${err.message}`);
|
|
4296
|
-
return false;
|
|
4297
|
-
}
|
|
4298
|
-
}
|
|
4299
|
-
async function install() {
|
|
4300
|
-
console.log("[install] Starting install...");
|
|
4301
|
-
await addMarketplace();
|
|
4302
|
-
const pluginOk = await installPlugin();
|
|
4303
|
-
const cliOk = await installCli();
|
|
4304
|
-
const codegraphOk = await installCodegraphCli("install");
|
|
4305
|
-
const designMdOk = await installDesignMdCli("install");
|
|
4306
|
-
const penOk = await installPenCli("install");
|
|
4307
|
-
await printGlobalPackageVersions("install");
|
|
4308
|
-
if (!pluginOk || !cliOk || !codegraphOk || !designMdOk || !penOk) {
|
|
4309
|
-
process.exitCode = 1;
|
|
4310
|
-
}
|
|
4311
|
-
console.log("[install] Done.");
|
|
4312
|
-
}
|
|
4313
|
-
|
|
4314
4232
|
// src/commands/init.ts
|
|
4315
4233
|
var LABELS = [
|
|
4316
4234
|
{ name: "cc-need-human-check", color: "eb1700" },
|
|
@@ -4410,45 +4328,6 @@ async function createConfig(force) {
|
|
|
4410
4328
|
const result = await writeFileWithMode(CONFIG_PATH, JSON.stringify(initialConfig, null, 2), force);
|
|
4411
4329
|
logWriteResult(result, CONFIG_PATH);
|
|
4412
4330
|
}
|
|
4413
|
-
var PROJECT_SETTINGS_PATH = ".claude/settings.json";
|
|
4414
|
-
function mergePluginSettings(current) {
|
|
4415
|
-
const marketplaces = { ...current.extraKnownMarketplaces ?? {} };
|
|
4416
|
-
marketplaces[MARKETPLACE_NAME] = { source: { source: "github", repo: MARKETPLACE_SOURCE } };
|
|
4417
|
-
const plugins = { ...current.enabledPlugins ?? {} };
|
|
4418
|
-
plugins[`${PLUGIN_NAME}@${MARKETPLACE_NAME}`] = true;
|
|
4419
|
-
return { ...current, extraKnownMarketplaces: marketplaces, enabledPlugins: plugins };
|
|
4420
|
-
}
|
|
4421
|
-
async function registerPluginInSettings() {
|
|
4422
|
-
let current = {};
|
|
4423
|
-
try {
|
|
4424
|
-
const raw = await readFile2(PROJECT_SETTINGS_PATH, "utf-8");
|
|
4425
|
-
const parsed = JSON.parse(raw);
|
|
4426
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
4427
|
-
console.log(`[init] Skipped: ${PROJECT_SETTINGS_PATH} is not a JSON object`);
|
|
4428
|
-
return;
|
|
4429
|
-
}
|
|
4430
|
-
current = parsed;
|
|
4431
|
-
} catch (err) {
|
|
4432
|
-
if (err.code !== "ENOENT") {
|
|
4433
|
-
console.log(`[init] Skipped: failed to read ${PROJECT_SETTINGS_PATH}: ${err.message}`);
|
|
4434
|
-
return;
|
|
4435
|
-
}
|
|
4436
|
-
}
|
|
4437
|
-
const merged = mergePluginSettings(current);
|
|
4438
|
-
if (JSON.stringify(merged) === JSON.stringify(current)) {
|
|
4439
|
-
console.log(`[init] Already registered: ${PLUGIN_NAME}@${MARKETPLACE_NAME} in ${PROJECT_SETTINGS_PATH}`);
|
|
4440
|
-
return;
|
|
4441
|
-
}
|
|
4442
|
-
try {
|
|
4443
|
-
await mkdir2(".claude", { recursive: true });
|
|
4444
|
-
await writeFile2(PROJECT_SETTINGS_PATH, `${JSON.stringify(merged, null, 2)}
|
|
4445
|
-
`, "utf-8");
|
|
4446
|
-
} catch (err) {
|
|
4447
|
-
console.log(`[init] Skipped: failed to write ${PROJECT_SETTINGS_PATH}: ${err.message}`);
|
|
4448
|
-
return;
|
|
4449
|
-
}
|
|
4450
|
-
console.log(`[init] Registered ${PLUGIN_NAME}@${MARKETPLACE_NAME} in ${PROJECT_SETTINGS_PATH}`);
|
|
4451
|
-
}
|
|
4452
4331
|
async function init(options = {}) {
|
|
4453
4332
|
const force = options.force ?? false;
|
|
4454
4333
|
console.log(`[init] Creating labels...${force ? " (force mode)" : ""}`);
|
|
@@ -4468,8 +4347,6 @@ async function init(options = {}) {
|
|
|
4468
4347
|
await mkdir2(".github/workflows", { recursive: true });
|
|
4469
4348
|
const workflowPath = ".github/workflows/assign-creator-on-cc-triage-scope.yml";
|
|
4470
4349
|
logWriteResult(await writeFileWithMode(workflowPath, ASSIGN_CREATOR_WORKFLOW, force), workflowPath);
|
|
4471
|
-
console.log("[init] Registering the plugin in project settings...");
|
|
4472
|
-
await registerPluginInSettings();
|
|
4473
4350
|
console.log("[init] Creating config file...");
|
|
4474
4351
|
await createConfig(force);
|
|
4475
4352
|
console.log("[init] Setting up CodeGraph...");
|
|
@@ -4478,6 +4355,122 @@ async function init(options = {}) {
|
|
|
4478
4355
|
console.log("[init] Done.");
|
|
4479
4356
|
}
|
|
4480
4357
|
|
|
4358
|
+
// src/commands/design-md.ts
|
|
4359
|
+
async function loadRunCommand2() {
|
|
4360
|
+
return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
|
|
4361
|
+
}
|
|
4362
|
+
var DESIGN_MD_PACKAGE = "@google/design.md";
|
|
4363
|
+
async function installDesignMdCli(logPrefix) {
|
|
4364
|
+
console.log(`[${logPrefix}] Installing DESIGN.md CLI (npm install -g ${DESIGN_MD_PACKAGE}@latest)...`);
|
|
4365
|
+
try {
|
|
4366
|
+
const { runCommand: runCommand2 } = await loadRunCommand2();
|
|
4367
|
+
await runCommand2("npm", ["install", "-g", `${DESIGN_MD_PACKAGE}@latest`]);
|
|
4368
|
+
console.log(`[${logPrefix}] DESIGN.md CLI installed.`);
|
|
4369
|
+
return true;
|
|
4370
|
+
} catch (err) {
|
|
4371
|
+
console.error(`[${logPrefix}] Failed to install DESIGN.md CLI: ${err.message}`);
|
|
4372
|
+
return false;
|
|
4373
|
+
}
|
|
4374
|
+
}
|
|
4375
|
+
|
|
4376
|
+
// src/commands/pen.ts
|
|
4377
|
+
async function loadRunCommand3() {
|
|
4378
|
+
return await Promise.resolve().then(() => (init_run_command(), run_command_exports));
|
|
4379
|
+
}
|
|
4380
|
+
var PEN_PACKAGE = "@pen.dev/cli";
|
|
4381
|
+
var LEGACY_PEN_PACKAGE = "@pencil.dev/cli";
|
|
4382
|
+
async function installPenCli(logPrefix) {
|
|
4383
|
+
console.log(`[${logPrefix}] Removing legacy Pen CLI (npm uninstall -g ${LEGACY_PEN_PACKAGE})...`);
|
|
4384
|
+
const { runCommand: runCommand2 } = await loadRunCommand3();
|
|
4385
|
+
try {
|
|
4386
|
+
await runCommand2("npm", ["uninstall", "-g", LEGACY_PEN_PACKAGE]);
|
|
4387
|
+
} catch (err) {
|
|
4388
|
+
console.error(`[${logPrefix}] Skipped removing legacy Pen CLI: ${err.message}`);
|
|
4389
|
+
}
|
|
4390
|
+
console.log(`[${logPrefix}] Installing Pen CLI (npm install -g ${PEN_PACKAGE}@latest)...`);
|
|
4391
|
+
try {
|
|
4392
|
+
await runCommand2("npm", ["install", "-g", `${PEN_PACKAGE}@latest`]);
|
|
4393
|
+
console.log(`[${logPrefix}] Pen CLI installed.`);
|
|
4394
|
+
} catch (err) {
|
|
4395
|
+
console.error(`[${logPrefix}] Failed to install Pen CLI: ${err.message}`);
|
|
4396
|
+
return false;
|
|
4397
|
+
}
|
|
4398
|
+
await warnIfPenLoggedOut(logPrefix);
|
|
4399
|
+
return true;
|
|
4400
|
+
}
|
|
4401
|
+
async function warnIfPenLoggedOut(logPrefix) {
|
|
4402
|
+
const { runCommand: runCommand2 } = await loadRunCommand3();
|
|
4403
|
+
try {
|
|
4404
|
+
await runCommand2("pencil", ["status"]);
|
|
4405
|
+
} catch {
|
|
4406
|
+
console.log(
|
|
4407
|
+
`[${logPrefix}] Pen CLI is not authenticated. Run \`pencil login\` (or set PEN_CLI_KEY) before using .pen designs.`
|
|
4408
|
+
);
|
|
4409
|
+
}
|
|
4410
|
+
}
|
|
4411
|
+
|
|
4412
|
+
// src/commands/install.ts
|
|
4413
|
+
init_run_command();
|
|
4414
|
+
var PLUGIN_NAME = "claude-task-worker";
|
|
4415
|
+
var MARKETPLACE_NAME = "claude-task-worker";
|
|
4416
|
+
var MARKETPLACE_SOURCE = "getty104/claude-task-worker";
|
|
4417
|
+
var GLOBAL_NPM_PACKAGES = [PLUGIN_NAME, CODEGRAPH_PACKAGE, DESIGN_MD_PACKAGE, PEN_PACKAGE];
|
|
4418
|
+
async function printGlobalPackageVersions(logPrefix) {
|
|
4419
|
+
console.log(`[${logPrefix}] Installed versions:`);
|
|
4420
|
+
try {
|
|
4421
|
+
await runCommand("npm", ["ls", "-g", "--depth=0", ...GLOBAL_NPM_PACKAGES]);
|
|
4422
|
+
} catch (err) {
|
|
4423
|
+
console.error(`[${logPrefix}] Some packages are missing from the global install: ${err.message}`);
|
|
4424
|
+
}
|
|
4425
|
+
}
|
|
4426
|
+
async function addMarketplace() {
|
|
4427
|
+
console.log(`[install] Adding marketplace: ${MARKETPLACE_SOURCE}...`);
|
|
4428
|
+
try {
|
|
4429
|
+
await runCommand("claude", ["plugin", "marketplace", "add", MARKETPLACE_SOURCE]);
|
|
4430
|
+
console.log("[install] Marketplace added.");
|
|
4431
|
+
} catch (err) {
|
|
4432
|
+
console.error(
|
|
4433
|
+
`[install] Failed to add marketplace (already added is expected and safe to ignore): ${err.message}`
|
|
4434
|
+
);
|
|
4435
|
+
}
|
|
4436
|
+
}
|
|
4437
|
+
async function installPlugin() {
|
|
4438
|
+
console.log(`[install] Installing plugin: ${PLUGIN_NAME}@${MARKETPLACE_NAME}...`);
|
|
4439
|
+
try {
|
|
4440
|
+
await runCommand("claude", ["plugin", "install", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`]);
|
|
4441
|
+
console.log("[install] Plugin installed. Restart your Claude Code session to apply.");
|
|
4442
|
+
return true;
|
|
4443
|
+
} catch (err) {
|
|
4444
|
+
console.error(`[install] Failed to install plugin: ${err.message}`);
|
|
4445
|
+
return false;
|
|
4446
|
+
}
|
|
4447
|
+
}
|
|
4448
|
+
async function installCli() {
|
|
4449
|
+
console.log("[install] Installing claude-task-worker CLI (npm install -g claude-task-worker@latest)...");
|
|
4450
|
+
try {
|
|
4451
|
+
await runCommand("npm", ["install", "-g", "claude-task-worker@latest"]);
|
|
4452
|
+
console.log("[install] claude-task-worker CLI installed.");
|
|
4453
|
+
return true;
|
|
4454
|
+
} catch (err) {
|
|
4455
|
+
console.error(`[install] Failed to install claude-task-worker CLI: ${err.message}`);
|
|
4456
|
+
return false;
|
|
4457
|
+
}
|
|
4458
|
+
}
|
|
4459
|
+
async function install() {
|
|
4460
|
+
console.log("[install] Starting install...");
|
|
4461
|
+
await addMarketplace();
|
|
4462
|
+
const pluginOk = await installPlugin();
|
|
4463
|
+
const cliOk = await installCli();
|
|
4464
|
+
const codegraphOk = await installCodegraphCli("install");
|
|
4465
|
+
const designMdOk = await installDesignMdCli("install");
|
|
4466
|
+
const penOk = await installPenCli("install");
|
|
4467
|
+
await printGlobalPackageVersions("install");
|
|
4468
|
+
if (!pluginOk || !cliOk || !codegraphOk || !designMdOk || !penOk) {
|
|
4469
|
+
process.exitCode = 1;
|
|
4470
|
+
}
|
|
4471
|
+
console.log("[install] Done.");
|
|
4472
|
+
}
|
|
4473
|
+
|
|
4481
4474
|
// src/commands/update.ts
|
|
4482
4475
|
init_run_command();
|
|
4483
4476
|
var PLUGIN_NAME2 = "claude-task-worker";
|