goalbuddy 0.3.0 → 0.3.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.
@@ -195,8 +195,8 @@ Usage:
195
195
  Targets: by default, install/update prepares both Codex (~/.codex) and Claude Code (~/.claude). Use --target codex or --target claude to limit the command.
196
196
 
197
197
  Default:
198
- ${canonicalCliName} Installs and enables Codex, then installs Claude Code skill + agents + /goal-prep command.
199
- ${canonicalCliName} --target claude Installs ${canonicalProductName} for Claude Code (skill + agents + /goal-prep command).
198
+ ${canonicalCliName} Installs and enables Codex, then installs Claude Code skill + agents (skill surfaces /goal-prep).
199
+ ${canonicalCliName} --target claude Installs ${canonicalProductName} for Claude Code (skill + agents; skill surfaces /goal-prep).
200
200
  ${canonicalCliName} --target codex Installs and enables the native Codex plugin.
201
201
 
202
202
  Compatibility:
@@ -246,8 +246,8 @@ function claudeAgentsRoot() {
246
246
  return join(claudeHome(), "agents");
247
247
  }
248
248
 
249
- function claudeCommandsRoot() {
250
- return join(claudeHome(), "commands");
249
+ function legacyClaudeCommandPath() {
250
+ return join(claudeHome(), "commands", "goal-prep.md");
251
251
  }
252
252
 
253
253
  function installClaudeSkill({ quiet = false } = {}) {
@@ -311,30 +311,12 @@ function installClaudeAgents({ quiet = false } = {}) {
311
311
  return results;
312
312
  }
313
313
 
314
- function installClaudeCommands({ quiet = false } = {}) {
315
- const source = join(claudePluginSource, "commands");
316
- const target = claudeCommandsRoot();
317
- const force = hasFlag("--force") || command === "update" || command === "install" || command === "default";
318
- mkdirSync(target, { recursive: true });
319
-
320
- const results = [];
321
- if (!existsSync(source)) return results;
322
- for (const file of readdirSync(source)) {
323
- if (!file.endsWith(".md")) continue;
324
- const dest = join(target, file);
325
- if (existsSync(dest) && !force) {
326
- if (!quiet) console.log(`skip existing ${dest} (use --force to overwrite)`);
327
- results.push({ file, status: "skipped", path: dest });
328
- continue;
329
- }
330
- const sourceHash = sha256(readFileSync(join(source, file)));
331
- const previousHash = existsSync(dest) ? sha256(readFileSync(dest)) : "";
332
- cpSync(join(source, file), dest);
333
- const status = previousHash ? previousHash === sourceHash ? "unchanged" : "updated" : "installed";
334
- if (!quiet) console.log(`installed ${dest}`);
335
- results.push({ file, status, path: dest });
336
- }
337
- return results;
314
+ function cleanupLegacyClaudeCommands({ quiet = false } = {}) {
315
+ const legacyPath = legacyClaudeCommandPath();
316
+ if (!existsSync(legacyPath)) return { removed: false, path: legacyPath };
317
+ rmSync(legacyPath, { force: true });
318
+ if (!quiet) console.log(`removed legacy ${legacyPath} (skill now surfaces /goal-prep)`);
319
+ return { removed: true, path: legacyPath };
338
320
  }
339
321
 
340
322
  async function buildClaudeInstallReport() {
@@ -349,7 +331,7 @@ async function buildClaudeInstallReport() {
349
331
  claude_home: claudeHome(),
350
332
  skill: installClaudeSkill({ quiet }),
351
333
  agents: installClaudeAgents({ quiet }),
352
- commands: installClaudeCommands({ quiet }),
334
+ legacy_commands_cleanup: cleanupLegacyClaudeCommands({ quiet }),
353
335
  extensions: await extensionDiscoverySummary(),
354
336
  warnings: [],
355
337
  };
@@ -408,7 +390,6 @@ async function installEverywhere() {
408
390
  function doctorClaude() {
409
391
  const skillPath = join(claudeSkillRoot(), "SKILL.md");
410
392
  const agentsPath = claudeAgentsRoot();
411
- const commandsPath = claudeCommandsRoot();
412
393
  const installed = existsSync(skillPath);
413
394
  const agents = existsSync(agentsPath)
414
395
  ? readdirSync(agentsPath).filter((file) => file.startsWith("goal-") && file.endsWith(".md"))
@@ -420,9 +401,8 @@ function doctorClaude() {
420
401
  if (!existsSync(installedAgent) || !existsSync(bundledAgent)) return false;
421
402
  return sha256(readFileSync(installedAgent)) !== sha256(readFileSync(bundledAgent));
422
403
  });
423
- const commands = existsSync(commandsPath)
424
- ? readdirSync(commandsPath).filter((file) => file === "goal-prep.md")
425
- : [];
404
+ const legacyCommandPath = legacyClaudeCommandPath();
405
+ const legacyCommandPresent = existsSync(legacyCommandPath);
426
406
 
427
407
  console.log(JSON.stringify({
428
408
  target: "claude",
@@ -432,10 +412,11 @@ function doctorClaude() {
432
412
  installed_agents: agents,
433
413
  missing_agents: missingAgents,
434
414
  stale_agents: staleAgents,
435
- installed_commands: commands,
415
+ legacy_command_present: legacyCommandPresent,
416
+ legacy_command_path: legacyCommandPath,
436
417
  }, null, 2));
437
418
 
438
- const installOk = installed && missingAgents.length === 0 && staleAgents.length === 0;
419
+ const installOk = installed && missingAgents.length === 0 && staleAgents.length === 0 && !legacyCommandPresent;
439
420
  process.exit(installOk ? 0 : 1);
440
421
  }
441
422
 
@@ -449,7 +430,9 @@ function printClaudeInstallReport(report) {
449
430
  console.log("");
450
431
  console.log(`Skill: ${report.skill.status} at ${report.skill.path}`);
451
432
  console.log(`Agents: ${summarizeStatuses(report.agents)}`);
452
- console.log(`Commands: ${summarizeStatuses(report.commands)}`);
433
+ if (report.legacy_commands_cleanup?.removed) {
434
+ console.log(`Removed legacy command: ${report.legacy_commands_cleanup.path}`);
435
+ }
453
436
  if (report.skill.preserved_extensions.length) {
454
437
  console.log(`Preserved extensions: ${report.skill.preserved_extensions.join(", ")}`);
455
438
  }
@@ -1593,7 +1576,9 @@ function printEverywhereInstallReport(report) {
1593
1576
  } else if (report.claude) {
1594
1577
  console.log(`Claude Code: skill ${report.claude.skill.status} at ${report.claude.skill.path}`);
1595
1578
  console.log(`Claude Code agents: ${summarizeStatuses(report.claude.agents)}`);
1596
- console.log(`Claude Code commands: ${summarizeStatuses(report.claude.commands)}`);
1579
+ if (report.claude.legacy_commands_cleanup?.removed) {
1580
+ console.log(`Claude Code: removed legacy command at ${report.claude.legacy_commands_cleanup.path}`);
1581
+ }
1597
1582
  }
1598
1583
 
1599
1584
  if (report.errors.length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goalbuddy",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "A /goal operating system for Codex and Claude Code: Scout/Judge/Worker boards with visual board surfaces, receipts, and verification.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goalbuddy",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Turn broad Claude Code work into verified GoalBuddy boards with Scout, Judge, Worker, visual boards, and receipts.",
5
5
  "author": {
6
6
  "name": "tolibear",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goalbuddy",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Turn broad Codex and Claude Code work into verified GoalBuddy boards with Scout, Judge, Worker, visual boards, and receipts.",
5
5
  "author": {
6
6
  "name": "tolibear",
@@ -1,12 +0,0 @@
1
- ---
2
- description: Prepare a GoalBuddy board for a broad, long-running, or ambiguous goal. Compiles intake, writes goal.md/state.yaml, and prints the /goal command to run next. Does not start /goal automatically.
3
- allowed-tools: Read, Write, Edit, Bash, Grep, Glob
4
- ---
5
-
6
- Invoke the GoalBuddy `goal-prep` skill to prepare a board for the user's goal.
7
-
8
- Follow the canonical GoalBuddy invocation boundary: prepare intake, create or repair `docs/goals/<slug>/goal.md`, `state.yaml`, and `notes/`, optionally open a visual board, then print exactly `/goal Follow docs/goals/<slug>/goal.md.` and stop.
9
-
10
- Do not perform the requested work during this turn, even if it looks read-only or obviously useful. Put implementation, research, asset generation, and named-skill loading into Scout, Judge, or Worker tasks for the later `/goal` run.
11
-
12
- User goal: $ARGUMENTS