@damper/cli 0.5.4 → 0.5.6

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 CHANGED
@@ -5,7 +5,7 @@ import { statusCommand } from './commands/status.js';
5
5
  import { cleanupCommand } from './commands/cleanup.js';
6
6
  import { setupCommand } from './commands/setup.js';
7
7
  import { releaseCommand } from './commands/release.js';
8
- const VERSION = '0.5.4';
8
+ const VERSION = '0.5.6';
9
9
  function showHelp() {
10
10
  console.log(`
11
11
  ${pc.bold('@damper/cli')} - Agent orchestration for Damper tasks
@@ -126,12 +126,10 @@ export async function launchClaude(options) {
126
126
  '--mcp-config', mcpConfigPath,
127
127
  initialPrompt,
128
128
  ];
129
- // Launch Claude Code - just use execa which handles this well
129
+ // Launch Claude Code using spawnSync for reliable TTY handling
130
130
  try {
131
- console.log(pc.dim('Launching Claude...'));
132
- // Simple approach: just launch claude in the directory
133
- // MCP config is passed, prompt is simple
134
- await execa('claude', [
131
+ const { spawnSync } = await import('node:child_process');
132
+ const result = spawnSync('claude', [
135
133
  '--mcp-config', mcpConfigPath,
136
134
  initialPrompt
137
135
  ], {
@@ -142,14 +140,17 @@ export async function launchClaude(options) {
142
140
  DAMPER_API_KEY: apiKey,
143
141
  },
144
142
  });
145
- }
146
- catch (err) {
147
- const error = err;
148
- if (error.code === 'ENOENT') {
149
- console.log(pc.red('\nError: Claude Code CLI not found.'));
150
- console.log(pc.dim('Install it with: npm install -g @anthropic-ai/claude-code\n'));
151
- process.exit(1);
143
+ if (result.error) {
144
+ const error = result.error;
145
+ if (error.code === 'ENOENT') {
146
+ console.log(pc.red('\nError: Claude Code CLI not found.'));
147
+ console.log(pc.dim('Install it with: npm install -g @anthropic-ai/claude-code\n'));
148
+ process.exit(1);
149
+ }
150
+ throw result.error;
152
151
  }
152
+ }
153
+ catch {
153
154
  // Claude exited with error - still continue to post-task flow
154
155
  }
155
156
  finally {
@@ -305,8 +306,38 @@ export async function postTaskFlow(options) {
305
306
  }
306
307
  }
307
308
  else if (taskStatus === 'in_progress') {
308
- console.log(pc.dim('Task is still in progress. Run `npx @damper/cli` to resume later.'));
309
- console.log(pc.dim('Run `npx @damper/cli cleanup` when ready to remove the worktree.\n'));
309
+ // Task not completed - offer options
310
+ const action = await select({
311
+ message: 'Task is still in progress. What would you like to do?',
312
+ choices: [
313
+ { name: 'Keep for later (resume with npx @damper/cli)', value: 'keep' },
314
+ { name: 'Release task and remove worktree', value: 'release' },
315
+ ],
316
+ });
317
+ if (action === 'release') {
318
+ // Release the task back to planned
319
+ try {
320
+ const api = createDamperApi(apiKey);
321
+ await api.abandonTask(taskId, 'Released via CLI');
322
+ console.log(pc.green(`✓ Task released back to planned status`));
323
+ }
324
+ catch (err) {
325
+ const error = err;
326
+ console.log(pc.yellow(`Could not release task: ${error.message}`));
327
+ }
328
+ // Remove worktree
329
+ try {
330
+ await removeWorktreeDir(cwd, projectRoot);
331
+ console.log(pc.green('✓ Worktree and branch removed\n'));
332
+ }
333
+ catch (err) {
334
+ const error = err;
335
+ console.log(pc.red(`Failed to remove worktree: ${error.message}\n`));
336
+ }
337
+ }
338
+ else {
339
+ console.log(pc.dim('\nRun `npx @damper/cli` to resume later.\n'));
340
+ }
310
341
  }
311
342
  }
312
343
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/cli",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "CLI tool for orchestrating Damper task workflows with Claude Code",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {