Louis Knight-Webb fde7ae3efe Parse amp errors (vibe-kanban) (#852)
* ##  Implementation Complete!

I've successfully implemented the amp error parsing functionality. Here's a summary of what was accomplished:

### **Changes Made:**

1. **Extended ClaudeJson::Result** with amp-specific fields:
   - Added `error`, `num_turns`, `session_id` fields with proper serde aliases
   - Used `#[serde(default)]` for backward compatibility

2. **Updated normalize_entries method** to handle amp errors:
   - Only processes Result messages for `HistoryStrategy::AmpResume`
   - Detects errors through multiple criteria: `is_error`, subtype containing "error", error field presence, or result field containing error/message
   - Creates user-friendly ErrorMessage entries with timing and turn information
   - Preserves existing behavior for Claude Code (Default strategy)

3. **Updated extract_session_id** to handle Result messages:
   - Now extracts session_id from Result messages when present

4. **Added comprehensive tests**:
   - `test_amp_result_error_is_surfaced` - Tests the original error case from your example
   - `test_amp_result_error_with_subtype_only` - Tests subtype-only error detection
   - `test_amp_result_error_from_result_field` - Tests error extraction from result field
   - `test_amp_result_success_still_ignored` - Ensures success results remain ignored
   - `test_amp_result_session_id_extraction` - Tests session ID extraction
   - `test_claude_result_still_ignored_for_default_strategy` - Ensures Claude Code behavior unchanged

### **Example Output:**
When amp emits the error JSON you provided:
```json
{"type":"result","subtype":"error_during_execution","duration_ms":456090,"is_error":true,"num_turns":24,"error":"terminated","session_id":"T-efa72d99-3436-467b-a2d2-872546ad6f3c"}
```

It will now appear in the UI as:
> **AMP error (error_during_execution) after 24 turns / 456.1s: terminated**

The execution will correctly show as failed instead of "ended normally", and users will get clear information about what went wrong, how long it took, and how many turns were attempted.

* Cleanup script changes for task attempt daa967fc-b0a1-4c02-966f-ca3435e20a56

* Perfect!

##  Simplified Implementation Complete!

I've successfully simplified the error output as requested. Here's what changed:

### **Key Changes Made:**
1. **Simplified error content** - Now uses `serde_json::to_string(claude_json)` to JSON stringify the entire error object
2. **Removed complex formatting** - No more "AMP error (subtype) after X turns / Y.Ys: message" formatting
3. **Updated tests** - All test assertions now check for the raw JSON fields instead of formatted text
4. **Clean compilation** - Fixed unused variable warnings

### **Example Output:**
When amp emits the error JSON you provided:
```json
{"type":"result","subtype":"error_during_execution","duration_ms":456090,"is_error":true,"num_turns":24,"error":"terminated","session_id":"T-efa72d99-3436-467b-a2d2-872546ad6f3c"}
```

The UI will now show this exact JSON string as the error content, making it simple and giving users direct access to all the error information without interpretation.

### **Benefits:**
-  Simpler, cleaner output
-  No loss of information - all fields are preserved in the JSON
-  Maintains backward compatibility with Claude Code
-  All tests passing
-  Clean compilation with no warnings

The execution will still correctly show as failed instead of "ended normally", and the raw JSON error provides all the context users need to understand what went wrong.

* Cleanup script changes for task attempt daa967fc-b0a1-4c02-966f-ca3435e20a56

* Perfect!

##  Changes Complete!

I've made the requested modifications:

### **Changes Made:**

1. **Changed "AMP error" to "error"** in the fallback case:
   ```rust
   content: serde_json::to_string(claude_json)
       .unwrap_or_else(|_| "error".to_string()),
   ```

2. **Removed all amp result tests** that I added earlier:
   - `test_amp_result_error_is_surfaced`
   - `test_amp_result_error_with_subtype_only`
   - `test_amp_result_error_from_result_field`
   - `test_amp_result_success_still_ignored`
   - `test_amp_result_session_id_extraction`
   - `test_claude_result_still_ignored_for_default_strategy`

### **Final Implementation:**

The core functionality remains: when amp emits error result JSON logs like:
```json
{"type":"result","subtype":"error_during_execution","duration_ms":456090,"is_error":true,"num_turns":24,"error":"terminated","session_id":"T-efa72d99-3436-467b-a2d2-872546ad6f3c"}
```

This exact JSON string will be shown as the error content in the UI, and the execution will correctly be marked as failed instead of "ended normally".

The implementation is now minimal and clean, with only the original `test_result_message_ignored` test remaining to ensure Claude Code compatibility is preserved.

* Excellent!

##  Simplified Error Detection Complete!

I've updated the error detection logic to only trigger when `is_error: true`, making it much simpler and more explicit.

### **Changes Made:**

1. **Simplified error detection** - Now only checks `is_error.unwrap_or(false)`
2. **Removed complex error detection logic** that previously checked:
   - Subtype containing "error"
   - Error field presence/non-empty
   - Result field containing error/message objects
3. **Cleaned up unused variables** - Marked unused fields with `_`

### **Final Behavior:**

The implementation now only creates an ErrorMessage entry when:
- `HistoryStrategy::AmpResume` is used (amp execution)
- `is_error: true` in the JSON result

When your original error case occurs:
```json
{"type":"result","subtype":"error_during_execution","duration_ms":456090,"is_error":true,"num_turns":24,"error":"terminated","session_id":"T-efa72d99-3436-467b-a2d2-872546ad6f3c"}
```

This will be displayed as the raw JSON content since `is_error: true`, and the execution will be marked as failed.

The logic is now clean, explicit, and relies solely on amp's `is_error` flag to determine when to surface errors in the UI.
2025-09-25 17:55:34 +01:00
2025-09-19 13:57:03 +01:00
2025-08-08 13:53:27 +01:00
2025-08-08 13:53:27 +01:00
2025-09-25 08:08:33 +00:00
2025-09-04 10:52:18 +01:00
2025-09-04 15:11:41 +01:00
2025-09-22 16:02:42 +01:00
2025-08-08 13:53:27 +01:00
2025-08-08 13:53:27 +01:00
2025-07-11 15:57:30 +01:00
2025-09-04 10:52:18 +01:00
2025-07-11 16:31:08 +01:00
2025-06-14 15:14:08 -04:00
2025-06-25 09:27:29 +01:00
2025-06-25 09:27:29 +01:00
2025-07-04 11:11:45 +02:00

Vibe Kanban Logo

Get 10X more out of Claude Code, Gemini CLI, Codex, Amp and other coding agents...

npm Build status Ask DeepWiki

Overview

AI coding agents are increasingly writing the world's code and human engineers now spend the majority of their time planning, reviewing, and orchestrating tasks. Vibe Kanban streamlines this process, enabling you to:

  • Easily switch between different coding agents
  • Orchestrate the execution of multiple coding agents in parallel or in sequence
  • Quickly review work and start dev servers
  • Track the status of tasks that your coding agents are working on
  • Centralise configuration of coding agent MCP configs

You can watch a video overview here.

Installation

Make sure you have authenticated with your favourite coding agent. A full list of supported coding agents can be found in the docs. Then in your terminal run:

npx vibe-kanban

Documentation

Please head to the website for the latest documentation and user guides.

Support

Please open an issue on this repo if you find any bugs or have any feature requests.

Contributing

We would prefer that ideas and changes are raised with the core team via GitHub issues, where we can discuss implementation details and alignment with the existing roadmap. Please do not open PRs without first discussing your proposal with the team.

Development

Prerequisites

Additional development tools:

cargo install cargo-watch
cargo install sqlx-cli

Install dependencies:

pnpm i

Running the dev server

pnpm run dev

This will start the backend. A blank DB will be copied from the dev_assets_seed folder.

Building the frontend

To build just the frontend:

cd frontend
pnpm build

Build from source

  1. Run build-npm-package.sh
  2. In the npx-cli folder run npm pack
  3. You can run your build with npx [GENERATED FILE].tgz

Environment Variables

The following environment variables can be configured at build time or runtime:

Variable Type Default Description
GITHUB_CLIENT_ID Build-time Ov23li9bxz3kKfPOIsGm GitHub OAuth app client ID for authentication
POSTHOG_API_KEY Build-time Empty PostHog analytics API key (disables analytics if empty)
POSTHOG_API_ENDPOINT Build-time Empty PostHog analytics endpoint (disables analytics if empty)
BACKEND_PORT Runtime 0 (auto-assign) Backend server port
FRONTEND_PORT Runtime 3000 Frontend development server port
HOST Runtime 127.0.0.1 Backend server host
DISABLE_WORKTREE_ORPHAN_CLEANUP Runtime Not set Disable git worktree cleanup (for debugging)

Build-time variables must be set when running pnpm run build. Runtime variables are read when the application starts.

Custom GitHub OAuth App (Optional)

By default, Vibe Kanban uses Bloop AI's GitHub OAuth app for authentication. To use your own GitHub app for self-hosting or custom branding:

  1. Create a GitHub OAuth App at GitHub Developer Settings
  2. Enable "Device Flow" in the app settings
  3. Set scopes to include user:email,repo
  4. Build with your client ID:
    GITHUB_CLIENT_ID=your_client_id_here pnpm run build
    
Description
Get 10X more out of Claude Code, Codex or any coding agent
https://www.vibekanban.com/
Readme Apache-2.0 48 MiB
Languages
Rust 51.1%
TypeScript 46.6%
CSS 1.1%
JavaScript 0.7%
PLpgSQL 0.2%
Other 0.2%