Commit Graph

239 Commits

Author SHA1 Message Date
Solomon
21876fddc1 Bump codex version to 0.46 (#981) 2025-10-09 12:18:39 +01:00
Gabriel Gordon-Hall
a584eda876 bump agent versions (#984) 2025-10-09 12:10:26 +01:00
Solomon
399297d49c Simplify codex default variants (#972) 2025-10-08 11:11:39 +01:00
GitHub Action
ad1696cd36 chore: bump version to 0.0.105 2025-10-07 16:19:12 +00:00
Solomon
7c10c00d93 Upgrade Codex to the latest version (#947)
* Upgrade Codex to the latest version

Use the new `app-server` protocol to interact with codex cli.

* Fix spawn errors

* simplify session forking

* Append spawn errors to the logs
2025-10-07 14:57:41 +01:00
GitHub Action
fbb972a582 chore: bump version to 0.0.104 2025-10-06 16:55:58 +00:00
Alex Netsch
e863e2c8b9 No user deny messages in history (vibe-kanban) (#928)
* Perfect! The implementation is clean and follows the existing patterns. Let me create a summary:

I've successfully implemented the backend solution for displaying user denial messages in the conversation history.

**File: `crates/services/src/services/approvals.rs`**

1. **Added import** (line 8):
   - Imported `EntryIndexProvider` from `executors::logs::utils`

2. **Modified `respond()` method** (lines 153-166):
   - After updating the tool status to `Denied`
   - Check if the `ApprovalStatus::Denied` variant has a `Some(reason)`
   - If yes:
     - Create an `EntryIndexProvider` initialized from the message store to get the next available index
     - Create a `NormalizedEntry` with `UserMessage` type containing the denial reason
     - Add it to the conversation using `ConversationPatch::add_normalized_entry()`

1. **Backend owns the state**: The conversation history lives in `MsgStore` on the backend - this is the proper source of truth
2. **Follows existing patterns**: Uses the same pattern as Claude executor (claude.rs:508-527) for adding user messages
3. **Proper indexing**: `EntryIndexProvider::start_from(&store)` ensures correct sequence numbering
4. **No frontend hackery**: Frontend just renders what backend provides
5. **Type safe**: Uses existing `NormalizedEntryType::UserMessage` - no new types needed
6. **Clean separation**: Backend manages state, frontend displays it

When a user denies an approval with feedback like "Please try a different approach":
1. Backend receives the denial in `approvals.rs:respond()`
2. Updates the tool entry status to `Denied { reason }`
3. Immediately adds a new `UserMessage` entry with the denial text to the conversation stream
4. Frontend receives this as a normal user message patch and displays it
5. The agent sees it as a user message in the conversation history

-  TypeScript compilation passes
-  Rust compilation passes
-  No breaking changes
-  Follows existing architectural patterns

Cleanup script changes for task attempt 8122f303-889b-4333-8024-e79b9ea7dc7e

Great question! Let me explain how a new `UserFeedback` variant would work - it might actually be cleaner. Let me check what that would look like:

A new variant would mean:
1. Add `UserFeedback` to `NormalizedEntryType` enum in `crates/executors/src/logs/mod.rs`
2. Backend uses `NormalizedEntryType::UserFeedback` instead of `UserMessage`
3. Frontend displays it like a user message (same UI component)
4. No filtering issues - it's a distinct type that won't be filtered
5. TypeScript types auto-generated, so frontend gets the type

Let me show you what this would look like:

**Pros:**
- Type-safe, explicit intent
- No filtering workarounds needed
- Clear semantic meaning
- Auto-generates TypeScript types

**Cons:**
- Larger change (need to update Rust enum, regenerate types, update frontend display logic)
- Need to run `npm run generate-types`

Let me present both options clearly so you can choose:

Perfect! Both frontend and backend compile successfully. Let me create a summary of what was implemented:

I've successfully implemented **Option 2: New `UserFeedback` Variant** to display denial messages in the conversation history.

**1. Backend: Added `UserFeedback` entry type** (`crates/executors/src/logs/mod.rs`)
- Added `UserFeedback` variant to `NormalizedEntryType` enum
- Marked with `#[ts(export)]` for TypeScript generation

**2. Backend: Use `UserFeedback` for denial messages** (`crates/services/src/services/approvals.rs`)
- When a denial has a reason, create a `NormalizedEntry` with type `UserFeedback`
- Add it to the conversation stream after the denied tool
- Removed unused metadata structs (cleaner than Option 1)

**3. TypeScript Types: Regenerated** (`shared/types.ts`)
- Ran `npm run generate-types`
- New type `{ "type": "user_feedback" }` added to `NormalizedEntryType`

**4. Frontend: Display `UserFeedback` as user message** (`DisplayConversationEntry.tsx`)
- Check for both `user_message` and `user_feedback` types
- Render both with the same `<UserMessage>` component
- Use same User icon for both types

1. **No filtering issues**: `UserFeedback` is a distinct type, won't be filtered by the user message filter
2. **Type-safe**: Explicit enum variant with auto-generated TypeScript types
3. **Semantic clarity**: Clear distinction between initial prompts and feedback
4. **Natural display**: Appears as a user message in the conversation flow
5. **Extensible**: Can be used for other user feedback scenarios in the future

When a user denies an approval with feedback like "Please try a different approach":
1. Backend creates a `UserFeedback` entry with that text
2. Frontend receives it and displays it as a user message
3. It appears in the conversation history naturally, right after the denied tool
4. The agent sees it in the context as user input

-  Backend (Rust) compiles
-  Frontend (TypeScript) compiles
-  Types regenerated successfully
-  Clean, type-safe implementation

Perfect! So the tool result IS processed. But looking at the log entry you provided, the denial message appears in a `tool_result` with `is_error: true`. Let me check what tool this corresponds to:

Perfect! Both backend and frontend compile successfully. Let me create a summary of the complete solution:

I implemented a **normalization-based approach** that works with both live sessions and old logs by extracting denial reasons from the tool_result that's already in the raw logs.

**1. Added `UserFeedback` Entry Type** (`crates/executors/src/logs/mod.rs:56`)
- New variant in `NormalizedEntryType` enum
- Represents user feedback during execution (like denial reasons)
- Auto-exported to TypeScript types

**2. Added Denial Reason Extraction** (`crates/executors/src/executors/claude.rs:316-339`)
- New function `extract_denial_reason()` that parses hook denial messages
- Pattern: `"operation blocked by hook:\n- {user's reason}"`
- Extracts the text after `"- "`

**3. Create UserFeedback During Normalization** (`crates/executors/src/executors/claude.rs:598-612` and `717-731`)
- When processing tool_result with `is_error: true`
- Call `extract_denial_reason()` to check for denial pattern
- If found, create a `UserFeedback` entry with the extracted reason
- Add it right after the denied tool
- Applies to both command tools and other tools (MCP, etc.)

**4. Display UserFeedback in Frontend** (`frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx`)
- Handle `user_feedback` type same as `user_message`
- Display with `<UserMessage>` component
- Use User icon

**5. Cleaned Up Approvals Service** (`crates/services/src/services/approvals.rs`)
- Removed the live-session-only code that added UserFeedback
- Removed unused `EntryIndexProvider` import
- Let normalization handle everything

1. **Denial reason IS in raw logs**: The hook sends denial as tool_result with `is_error: true` containing the user's feedback
2. **Survives restarts**: Raw logs are persisted to DB, including the tool_result
3. **Works for old logs**: When logs are re-normalized after restart, the extraction logic runs and creates the UserFeedback entry
4. **Type-safe**: New enum variant with proper TypeScript types
5. **No filtering issues**: `UserFeedback` is a distinct type, won't be filtered out

-  Live sessions: Denial feedback appears as user message
-  After restart: Old logs show denial feedback when re-normalized
-  Type-safe: Proper enum variant, auto-generated TypeScript types
-  Both compilations pass

When a user denies a tool with feedback like "Please try a different approach", it now appears as a separate user message in the conversation history, immediately after the denied tool.

Cleanup script changes for task attempt 8122f303-889b-4333-8024-e79b9ea7dc7e

Perfect! Both backend and frontend compile successfully. Let me create a final summary of all the changes:

1.  **Duplicate code block removed** - Consolidated denial detection into one place after both command/non-command branches
2.  **Pattern matching improved** - Changed from `"operation blocked by hook:"` to `"blocked by hook:"` to match both "Edit operation blocked by hook" and "operation blocked by hook"
3.  **Magic strings replaced with constants** - Added `HOOK_DENIAL_PATTERN` and `HOOK_DENIAL_REASON_PREFIX` constants

**1. Added `UserFeedback` Entry Type** (`crates/executors/src/logs/mod.rs:56`)
- New variant in `NormalizedEntryType` enum for user feedback during execution

**2. Added Constants for Hook Patterns** (`crates/executors/src/executors/claude.rs:42-45`)
```rust
const HOOK_DENIAL_PATTERN: &str = "blocked by hook:";
const HOOK_DENIAL_REASON_PREFIX: &str = "- ";
```

**3. Added Denial Extraction Function** (`crates/executors/src/executors/claude.rs:321-345`)
- Detects hook denial messages in tool_result content
- Extracts user's reason from lines starting with `"- "`
- Uses constants for maintainability

**4. Create UserFeedback During Normalization** (`crates/executors/src/executors/claude.rs:703-717`)
- After processing any tool_result with `is_error: true`
- Extract denial reason and create `UserFeedback` entry
- Add it immediately after the denied tool
- **Single consolidated check** for both command and non-command tools

**5. Display UserFeedback in Frontend** (`frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx`)
- Handle `user_feedback` type same as `user_message`
- Display with `<UserMessage>` component
- Use User icon

**6. Regenerated TypeScript Types** (`shared/types.ts:287`)
- Added `{ "type": "user_feedback" }` to `NormalizedEntryType`

**7. Cleaned Up Approvals Service** (`crates/services/src/services/approvals.rs`)
- Removed unused live-session code
- Let normalization handle everything

1. **Works with old logs**: Denial reason is in persisted tool_result, extracted during re-normalization
2. **Works with live sessions**: Denial extracted during initial normalization
3. **No magic strings**: Uses constants for pattern matching
4. **No duplication**: Single denial check after tool processing
5. **Flexible pattern**: Matches "Edit operation blocked by hook" and "operation blocked by hook"
6. **Type-safe**: Proper enum variant with TypeScript types

-  Backend compiles
-  Frontend compiles
-  No duplicate code
-  Pattern improved to match your example

Cleanup script changes for task attempt 8122f303-889b-4333-8024-e79b9ea7dc7e

Perfect! Everything compiles. Let me create a summary of the final solution:

**1. Python Hook - Natural Language Marker** (`crates/executors/src/executors/hooks/confirm.py:14`)
- Prefix denial reason with `"User feedback: {reason}"`
- Natural language format that's both readable to LLM and parseable
- Example output: `"User feedback: Could you add something about a goose?"`

**2. Rust Constant** (`crates/executors/src/executors/claude.rs:44`)
```rust
const USER_FEEDBACK_MARKER: &str = "User feedback: ";
```

**3. Robust Extraction Function** (`crates/executors/src/executors/claude.rs:320-340`)
- Search for `USER_FEEDBACK_MARKER` in tool_result content
- Extract everything after the marker
- No dependency on Claude Code's error message format

**4. Added `UserFeedback` Entry Type** (`crates/executors/src/logs/mod.rs:56`)
- New variant for user feedback during execution

**5. Create UserFeedback During Normalization** (`crates/executors/src/executors/claude.rs:703-717`)
- When tool_result has `is_error: true`, check for user feedback
- Create `UserFeedback` entry with extracted text
- Works for both live sessions and old logs (persisted in raw logs)

**6. Frontend Display** (`frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx`)
- Render `user_feedback` same as `user_message`

1.  **We control the format**: The `"User feedback: "` prefix is added by OUR Python script
2.  **Claude Code independent**: Works regardless of how Claude Code formats hook errors
3.  **Natural language**: Reads naturally - LLM sees "User feedback: {reason}" which is clear
4.  **Survives restarts**: Tool_result is in persisted raw logs, re-extracted on normalization
5.  **Backward compatible**: Old logs without marker simply won't match (no errors)
6.  **Simple**: One constant, one natural prefix

**User denies with**: `"Could you add something about a goose?"`

**Raw log contains**:
```json
{"type":"tool_result","content":"Edit operation blocked by hook:\nUser feedback: Could you add something about a goose?","is_error":true}
```

**Extraction**: Finds `"User feedback: "`, extracts `"Could you add something about a goose?"`

**Display**: Shows as user message in conversation history

**Result**: User's feedback is visible to both user and LLM, survives restarts!

Perfect! The solution is complete. Let me create a final summary:

**Single Source of Truth:** The marker `"User feedback: "` is defined ONLY in Rust and injected into Python at runtime.

**1. Rust Constant** (`crates/executors/src/executors/claude.rs:44`)
```rust
const USER_FEEDBACK_MARKER: &str = "User feedback: ";
```

**2. Python Script Placeholder** (`crates/executors/src/executors/hooks/confirm.py:15-16`)
```python
USER_FEEDBACK_MARKER = "{{USER_FEEDBACK_MARKER}}"
formatted_reason = f"{USER_FEEDBACK_MARKER}{reason}" if reason else None
```

**3. Template Replacement** (`crates/executors/src/executors/claude.rs:241-244`)
```rust
let script_content = CONFIRM_HOOK_SCRIPT.replace(
    "{{USER_FEEDBACK_MARKER}}",
    USER_FEEDBACK_MARKER,
);
file.write_all(script_content.as_bytes()).await?;
```

**4. Extraction Function** (`crates/executors/src/executors/claude.rs:320-340`)
- Searches for `USER_FEEDBACK_MARKER` in tool_result content
- Extracts feedback text after the marker

**5. UserFeedback Entry Creation** (`crates/executors/src/executors/claude.rs:703-717`)
- During normalization, detects denials and creates UserFeedback entries

**6. Frontend Display** (`frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx`)
- Renders UserFeedback as user messages

**7. TypeScript Types** (`shared/types.ts`)
- `user_feedback` variant generated

**At deployment time:**
1. Rust defines `USER_FEEDBACK_MARKER = "User feedback: "`
2. Python script has placeholder `{{USER_FEEDBACK_MARKER}}`
3. When writing hook, Rust replaces `{{USER_FEEDBACK_MARKER}}` → `"User feedback: "`
4. Python script executes with actual value

**When user denies:**
1. Python outputs: `"User feedback: Could you add something about a goose?"`
2. This goes into tool_result in raw logs (persisted)
3. During normalization, Rust finds `"User feedback: "` and extracts the text after it
4. Creates UserFeedback entry
5. Frontend displays it as a user message

 **Single source of truth**: Marker defined only in Rust constant
 **No duplication**: Python gets value via template replacement
 **Format independent**: Works regardless of Claude Code's error format
 **Natural language**: LLM sees readable "User feedback: {text}"
 **Survives restarts**: Tool_result persisted in DB, re-extracted on normalization
 **Maintainable**: Change constant in one place, both Rust and Python updated

-  Backend compiles
-  Frontend compiles
-  Single source of truth maintained

Cleanup script changes for task attempt 8122f303-889b-4333-8024-e79b9ea7dc7e

Perfect! Everything compiles. Let me create a final summary:

**1. Backend: Added Tool Name to UserFeedback** (`crates/executors/src/logs/mod.rs:55-57`)
```rust
UserFeedback {
    denied_tool: String,
}
```

**2. Backend: Capture Display Tool Name** (`crates/executors/src/executors/claude.rs:573-589`)
- Extract tool name before processing branches
- For MCP tools, format as `mcp:server:tool` instead of `mcp__server__tool`
- Store in `display_tool_name` variable

**3. Backend: Include Tool Name in UserFeedback** (`crates/executors/src/executors/claude.rs:734-735`)
```rust
entry_type: NormalizedEntryType::UserFeedback {
    denied_tool: display_tool_name.clone(),
},
```

**4. Backend: Single Source of Truth for Marker** (`crates/executors/src/executors/claude.rs:44`)
```rust
const USER_FEEDBACK_MARKER: &str = "User feedback: ";
```

**5. Python: Placeholder Template** (`crates/executors/src/executors/hooks/confirm.py:15-16`)
```python
USER_FEEDBACK_MARKER = "{{USER_FEEDBACK_MARKER}}"
formatted_reason = f"{USER_FEEDBACK_MARKER}{reason}" if reason else None
```

**6. Backend: Template Replacement** (`crates/executors/src/executors/claude.rs:241-244`)
```rust
let script_content = CONFIRM_HOOK_SCRIPT.replace(
    "{{USER_FEEDBACK_MARKER}}",
    USER_FEEDBACK_MARKER,
);
```

**7. Frontend: Custom Red Accent Display** (`DisplayConversationEntry.tsx:648-666`)
- Red background (`bg-red-50 dark:bg-red-950/20`)
- Red border (`border-red-400/40`)
- Bold header showing: `"{ToolName} denied by user"`
- Red text for the feedback content
- **NO** edit/retry buttons (read-only display)

**8. TypeScript Types Regenerated** (`shared/types.ts`)
```typescript
{ "type": "user_feedback", denied_tool: string }
```

When user denies "Edit" tool with "Could you add something about a goose?":

```
┌─────────────────────────────────────────┐
│ Edit denied by user                     │  ← Bold red text
│ Could you add something about a goose?  │  ← Red feedback text
└─────────────────────────────────────────┘  ← Red border/background
```

 **Single source of truth**: Marker defined only in Rust, injected into Python
 **Tool name included**: Shows which tool was denied
 **Distinct styling**: Red accent makes it clear this is a denial
 **No edit/retry**: Simple read-only display, no complex user message features
 **Works with old logs**: Tool_result persisted, re-extracted on normalization
 **Type-safe**: Tool name field in enum, auto-generated TypeScript types

-  Backend compiles
-  Frontend compiles
-  Types regenerated
-  No duplication

Cleanup script changes for task attempt 8122f303-889b-4333-8024-e79b9ea7dc7e

Perfect! The new styling should be much more subtle and blend better with the existing UI:

- **Background**: Same as user messages (no bright red)
- **Border**: Dashed like user messages, with subtle red tint (30% opacity)
- **Header**: Small text (`text-xs`), muted red, 80% opacity
- **Content**: Same font-light styling as regular user messages

This keeps the denial feedback visible but not overwhelming, similar to how the regular user message integrates into the conversation flow.

Perfect! The new styling is much more subtle:

- **Background**: Same `bg-background` as user messages (no bright red)
- **Border**: Standard dashed border (no red tint)
- **Header**: Uses semantic `--destructive` color with 70% opacity for subtlety
- **Content**: Standard user message styling (no red text)

This approach:
-  Uses semantic CSS variables for proper dark mode support
-  Much less visually intense - just a subtle red label
-  Blends better with the conversation flow
-  The small "denied by user" label provides context without overwhelming

The visual hierarchy is now: subtle header hint → main content, which matches the rest of the UI better.

* Tool denial feedback (vibe-kanban 35abbc86)

The last commit implement log entries for tool denials, it has some problems though:
Update json_error in crates/executors/src/executors/hooks/confirm.py so the marker is only prefixed when an actual user denial reason is passed—fallback errors (network failure, invalid JSON, timeouts) must keep their original text to avoid generating fake user_feedback entries.
Adjust the hook deployment in write_python_hook (crates/executors/src/executors/claude.rs) to refresh existing confirm.py files when the bundled script changes: either always rewrite, compare hashes/timestamps, or at least overwrite when the placeholder is still present. Without that, previously installed hooks never get the marker update.
Refine extract_denial_reason in claude.rs to support the real payloads coming back from Claude: preserve multi-line feedback (don’t stop at the first newline) and handle array/object forms such as [{"type":"text","text":"…"}] so the full user message survives.

lets fix these!

* Clippy

* Perfect! All changes are complete. Here's the summary:

**1. Added i18n Hook** (`DisplayConversationEntry.tsx:603`)
```typescript
const { t } = useTranslation('common');
```

**2. Used Translation Key** (`DisplayConversationEntry.tsx:661`)
```typescript
{t('conversation.deniedByUser', { toolName: feedbackEntry.denied_tool })}
```

**3. Added English Translation** (`frontend/src/i18n/locales/en/common.json:38`)
```json
"deniedByUser": "{{toolName}} denied by user"
```

**4. Added Spanish Translation** (`frontend/src/i18n/locales/es/common.json:26`)
```json
"deniedByUser": "{{toolName}} denegado por el usuario"
```

**5. Added Japanese Translation** (`frontend/src/i18n/locales/ja/common.json:38`)
```json
"deniedByUser": "{{toolName}} がユーザーによって拒否されました"
```

**6. Used Semantic Color** (`DisplayConversationEntry.tsx:658-659`)
```typescript
style={{ color: 'hsl(var(--destructive))' }}
```

The UserFeedback display now:
-  Uses semantic `--destructive` color (adapts to light/dark mode automatically)
-  Supports i18n for English, Spanish, and Japanese
-  Subtle styling that blends with conversation flow
-  Maintains tool name context

The visual is now much more subtle with proper semantic colors and internationalization support!

* Perfect! Everything compiles. Let me create a summary of the final solution:

**1. Python: Added Argument Parser** (`confirm.py:96-102`)
```python
parser.add_argument(
    "-m",
    "--feedback-marker",
    type=str,
    required=True,
    help="Marker prefix for user feedback messages.",
)
```

**2. Python: Updated json_error to Accept Marker** (`confirm.py:11`)
```python
def json_error(reason: Optional[str], feedback_marker: Optional[str] = None) -> None:
    formatted_reason = reason
    if reason and feedback_marker:
        formatted_reason = f"{feedback_marker}{reason}"
```

**3. Python: Pass Marker When Denying** (`confirm.py:162`)
```python
json_error(reason, args.feedback_marker)
```

**4. Rust: Pass Marker as CLI Arg** (`claude.rs:283`)
```rust
format!("... --feedback-marker {}", shlex::try_quote(USER_FEEDBACK_MARKER)...)
```

**5. Rust: Removed String Replacement** (`claude.rs:236-238`)
- No longer need to replace placeholders
- Just write the script as-is

 **Cleaner**: No template placeholder magic, just a regular CLI arg
 **Standard**: Follows same pattern as other args (timeout, port, etc.)
 **Explicit**: Marker is passed explicitly each time hook runs
 **Flexible**: Easy to change or extend with more parameters
 **Single source of truth**: Still only defined in Rust constant

**Rust defines**:
```rust
const USER_FEEDBACK_MARKER: &str = "User feedback: ";
```

**Rust invokes Python with**:
```bash
confirm.py --timeout-seconds 3605 --poll-interval 5 --backend-port 8080 --feedback-marker "User feedback: "
```

**Python receives and uses**:
```python
args.feedback_marker  # "User feedback: "
formatted_reason = f"{args.feedback_marker}{reason}"
```

No template replacement needed - clean and straightforward!

Excellent! Everything compiles. The solution is now complete and much cleaner:

**Single Source of Truth:**
```rust
const USER_FEEDBACK_MARKER: &str = "User feedback: ";
```

**How it flows:**

1. **Rust → Python** (via CLI arg):
   ```bash
   confirm.py ... --feedback-marker 'User feedback: '
   ```

2. **User denies → Python formats**:
   ```python
   formatted_reason = f"User feedback: Could you add something about a goose?"
   ```

3. **Goes into raw logs → Rust extracts**:
   ```rust
   extract_denial_reason() // finds "User feedback: " and extracts what follows
   ```

4. **Creates UserFeedback entry**:
   ```rust
   NormalizedEntryType::UserFeedback {
       denied_tool: "Edit"
   }
   content: "Could you add something about a goose?"
   ```

5. **Frontend displays with red accent**:
   ```
   Edit denied by user          ← Small red text
   Could you add something about a goose?  ← Normal text
   ```

 **No string replacement** - just a CLI argument
 **No sketchy fallbacks** - simple, direct constant usage
 **Single source of truth** - marker only defined in Rust
 **Type-safe** - `denied_tool` field in enum
 **i18n support** - translatable display text
 **Semantic colors** - uses `--destructive` CSS variable
 **Works with old logs** - survives restarts via raw log persistence

The implementation is now straightforward with no unnecessary complexity!

* Simplify marker parsing
2025-10-06 15:38:18 +01:00
Solomon
2e0cabf9c7 Handle stderr output form Cursor cli (#948) 2025-10-06 15:26:46 +01:00
GitHub Action
d99980607d chore: bump version to 0.0.103 2025-10-04 13:31:52 +00:00
Louis Knight-Webb
613caf91d6 Perfect! The amp version has been successfully updated from 0.0.1758615753-ge2e2fb to 0.0.1759507289-g3e67fa in [crates/executors/src/executors/amp.rs](file:///private/var/folders/m1/9q_ct1913z10v6wbnv54j25r0000gn/T/vibe-kanban/worktrees/af80-bump-amp-version/crates/executors/src/executors/amp.rs#L36). This was the only file containing the amp version reference. (#929) 2025-10-03 18:52:30 +01:00
Gabriel Gordon-Hall
d6da689594 feat: MCP upgades (#904)
* wip: connect to api from mcp

* fix routes

* add start task mcp tool

* review comments
2025-10-03 16:00:15 +01:00
Solomon
a43fa76079 Copilot CLI (#915) 2025-10-03 13:12:53 +01:00
GitHub Action
86f7c00d94 chore: bump version to 0.0.102 2025-10-03 08:49:53 +00:00
Solomon
0f835e9730 fix Gemini on windows (#912) 2025-10-02 18:09:19 +01:00
JonnyDB
eaf24bcb2a fix claude code rotuer version (#911)
2.0.49 is in not valid. 1.0.49 is. this is likely a minor typo
2025-10-02 09:39:17 +01:00
GitHub Action
d8fc7a985d chore: bump version to 0.0.101 2025-10-01 17:18:37 +00:00
Alex Netsch
0e431705d0 Fix clear text watchkill phrase (#907) 2025-10-01 17:44:52 +01:00
Solomon
7217ab535b claude: Fork session on resume to enable retry (#899) 2025-10-01 15:13:48 +01:00
Britannio Jarrett
b77abac0c3 Use new sonnet models for the cursor agent profiles (#897)
* Updated cursor model from `sonnet-4` to `sonnet-4.5` in [`default_profiles.json`](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/a67d-update-cursor-ag/crates/executors/default_profiles.json#L92-L97), updated available models in [`cursor.json`](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/a67d-update-cursor-ag/shared/schemas/cursor.json#L22) schema, and [`cursor.rs`](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/a67d-update-cursor-ag/crates/executors/src/executors/cursor.rs#L39) documentation.

* Added `SONNET_4_5_THINKING` profile to [`default_profiles.json`](file:///private/var/folders/5q/5vgq75y92dz0k7n62z93299r0000gn/T/vibe-kanban/worktrees/a67d-update-cursor-ag/crates/executors/default_profiles.json#L98-L103) for the `sonnet-4.5-thinking` model.
2025-10-01 09:15:16 +01:00
Gabriel Gordon-Hall
ce3c886ac9 bump claude code to 2.0.1 (#896) 2025-09-30 19:18:59 +01:00
GitHub Action
58badf2653 chore: bump version to 0.0.99 2025-09-30 10:44:02 +00:00
Gabriel Gordon-Hall
4177a54d91 feat: default codex permissions (#886)
* add codex option

* update default codex configurations

* fix ci
2025-09-30 09:40:20 +01:00
GitHub Action
b8e756aa8d chore: bump version to 0.0.98 2025-09-29 14:06:50 +00:00
GitHub Action
f11975ce33 chore: bump version to 0.0.97 2025-09-26 10:12:18 +00:00
Solomon
1c23d4fd11 use Gemini-CLI --experimental-acp (#784) 2025-09-25 19:36:08 +01:00
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
GitHub Action
82b7288e23 chore: bump version to 0.0.96 2025-09-25 08:08:33 +00:00
Louis Knight-Webb
018006c728 Claude code + API_KEY should be a red error message, too easy to miss (vibe-kanban) (#834)
* **Update**
- Escalated the unmanaged Claude key notice to an error so it now renders with the red error styling in the log stream (`crates/executors/src/executors/claude.rs:747`).
- Reworded the message to explicitly call out “Claude Code + ANTHROPIC_API_KEY…” and synced the unit test assertions with the new entry type and copy (`crates/executors/src/executors/claude.rs:1961`).

**Verification**
- `cargo test -p executors`

Next: 1) Give the UI a quick manual check to confirm the error card stands out as intended.

* Red warning copy now states that Anthropic pay-as-you-go billing is used instead of the user’s Claude subscription, while keeping the error styling (`crates/executors/src/executors/claude.rs:747`). Updated the corresponding unit test expectation to match the new text (`crates/executors/src/executors/claude.rs:1961`). Tests: `cargo test -p executors`. Suggested next step: manually confirm the UI wording reads clearly where it renders.
2025-09-24 11:41:16 +01:00
GitHub Action
b797a9549c chore: bump version to 0.0.95 2025-09-24 09:20:14 +00:00
Gabriel Gordon-Hall
e773e418bd fix windows import compile error (#832) 2025-09-24 10:17:17 +01:00
Alex Netsch
7a2473e9be Fix missing vk mcp icon (#818) 2025-09-23 13:33:56 +01:00
Gabriel Gordon-Hall
794e2304a8 pin agents (#815) 2025-09-23 12:39:04 +01:00
Alex Netsch
40615190cd Check npm run generate-types in CI (vibe-kanban) (#807)
* Perfect! The implementation is now complete and working correctly.

 **Successfully implemented the requested feature**

The CI check for `npm run generate-types` now validates **all** generated files, not just `shared/types.ts`.

1. **Enhanced `crates/server/src/bin/generate_types.rs`**:
   - Added `generate_schema_content<T>()` helper function to generate schema content in-memory
   - Added `check_schemas()` function that validates all 7 JSON schema files
   - Updated the `--check` mode to validate both TypeScript types AND schema files

2. **Comprehensive validation**:
   - Checks `shared/types.ts` (existing functionality)
   - Checks all schema files: `amp.json`, `claude_code.json`, `codex.json`, `cursor.json`, `gemini.json`, `opencode.json`, `qwen_code.json`

3. **Clear error reporting**:
   - Shows exactly which files are outdated
   - Provides actionable error message: "Please run 'npm run generate-types' and commit the changes."

-  Passes when all files are up to date
-  Fails with exit code 1 when any file (types or schemas) is outdated
-  CI integration already in place (`.github/workflows/test.yml:66`)

The CI will now catch any case where developers modify Rust types that affect either TypeScript generation or JSON schema generation without running `npm run generate-types` and committing all resulting changes.

 **Successfully restored the lost cursor schema descriptions!**

1. **Added proper schemars attributes** to `crates/executors/src/executors/cursor.rs`:
   - `force` field: `#[schemars(description = "Force allow commands unless explicitly denied")]`
   - `model` field: `#[schemars(description = "auto, sonnet-4, gpt-5, opus-4.1, grok")]`

2. **Regenerated schema files** using `npm run generate-types`

3. **Verified the fix** - `shared/schemas/cursor.json` now contains the proper descriptions:
   - Line 15: `"description": "Force allow commands unless explicitly denied"`
   - Line 22: `"description": "auto, sonnet-4, gpt-5, opus-4.1, grok"`

- **Source-controlled**: Descriptions are now defined in Rust source code instead of auto-generated files
- **Future-proof**: Future schema regenerations will automatically include these descriptions
- **Proper architecture**: Follows the intended pattern of defining schema metadata in the source code
- **CI compatible**: The enhanced CI check will ensure these descriptions are preserved

The schema descriptions that were accidentally lost in the last commit have been properly restored to the correct location in the source code.

* clippy

* remove macro

* Surface error, remove unneede vec!
2025-09-23 09:15:16 +01:00
Gabriel Gordon-Hall
798bcb80a3 feat: manual approvals (#748)
* manual user approvals

* refactor implementation

* cleanup

* fix lint errors

* i18n

* remove isLastEntry frontend check

* address fe feedback

* always run claude plan with approvals

* add watchkill script back to plan mode

* update timeout

* tooltip hover

* use response type

* put back watchkill append hack
2025-09-22 16:02:42 +01:00
Britannio Jarrett
eaff3dee9e add a cursor profile for each model (#803)
* add a cursor profile for each model

* update cursor schema parameter descriptions

* Update crates/executors/default_profiles.json

Co-authored-by: Solomon <abcpro11051@disroot.org>

* Update crates/executors/default_profiles.json

Co-authored-by: Solomon <abcpro11051@disroot.org>

---------

Co-authored-by: Solomon <abcpro11051@disroot.org>
2025-09-22 14:32:05 +01:00
GitHub Action
77cb1b8ad0 chore: bump version to 0.0.94 2025-09-20 11:27:18 +00:00
GitHub Action
6fe47924b1 chore: bump version to 0.0.93 2025-09-18 22:12:32 +00:00
Louis Knight-Webb
510a7cb042 pin codex (#780) 2025-09-18 23:11:33 +01:00
GitHub Action
0c10e42f64 chore: bump version to 0.0.92 2025-09-18 15:03:24 +00:00
Solomon
9810de7d00 Codex: remove ask-for-approval flag (#771) 2025-09-18 15:17:02 +01:00
GitHub Action
73bc23968d chore: bump version to 0.0.91 2025-09-18 08:15:05 +00:00
Solomon
023e52e555 fix: codex session forking regression (#767)
fix OS issue `Failed to create forked rollout ... File name too long (os error 36)`
2025-09-17 19:15:13 +01:00
Solomon
2b69cbe447 Disable Edit & Retry feature for agents that don't implement session forking (#750) 2025-09-17 11:34:41 +01:00
Solomon
5f37bc258f Update codex to the latest (#724) 2025-09-17 10:03:25 +01:00
Britannio Jarrett
09d2710a34 Update all documentation (#718)
* add AGENTS/CLAUDE.md file to docs/

* collapse supported coding agents (vibe-kanban 52fd2ae6)

docs/AGENTS.md
docs/docs.json

We have a section in the docs denoted 'Supported Coding Agents' but we don't need a separate sub page for each one, we can combine it into a single page.

* docs multiple dev servers (vibe-kanban 3e3a6195)

"At the moment only one dev server can be running for each project, so if you start one it will kill any that are already running."

This sentence in the docs is no longer true and should be removed

* docs update: reviewing code changes (vibe-kanban e3b5db87)

docs/AGENTS.md
docs/docs.json

Introduce a new page in the user guide that covers code review. After a task has completed, it will enter the 'in review' column. From there, the user can open the task in full screen and press on the 'Diff' tab to see each changed file in split or unified view. We also support attaching a review comment to a line by clicking on the plus icon at the start of the line. You can create several comments across files and even extend the review with general comments in the task chat field before submitting the review. It is turned into a single message for the coding agent to address.

* Document VS Code Extension Features (vibe-kanban e88b4bb9)

Create a comprehensive user guide page documenting the VS Code extension integration. It works with VSCode and forks of VSCode such as Cursor, Windsurf.

The IDE extension embeds the Logs, Diffs. and Processes view for a current task. It also has a text box to create new task attempts. After installing the extension, the easiest way to use it is by starting a task, opening it, in full screen mode, then pressing the 'Open in (VSCode/Cursor/Windsurf)' button. For troubleshooting, if you open your IDE but not in one of the worktrees created by a vibe kanban task, the extension UI will be empty because it won't find the associated task.

VSCode install link: https://marketplace.visualstudio.com/items?itemName=bloop.vibe-kanban
Cursor/Windsurf: https://open-vsx.org/extension/bloop/vibe-kanban

Id: bloop.vibe-kanban, users can search @id:bloop.vibe-kanban in any of the IDEs to find the extension. It's easiest to search the id if using Cursor/Windsurf as deeplinking from open vsx doesn't work.

* remove /docs prefix from internal links

* hackathon docs banner (vibe-kanban ce53b989)

<guide>
# Banner

> Add a banner to display important site-wide announcements and notifications

Use banners to display important announcements, updates, or notifications across your entire documentation site. Banners appear at the top of every page, support Markdown formatting, and can be made dismissible.

To add a banner, use the `banner` property in your `docs.json`:

<CodeGroup>
  ```json Product announcements wrap
  "banner": {
    "content": "🚀 Version 2.0 is now live! See our [changelog](/changelog) for details.",
    "dismissible": true
  }
  ```

  ```json Maintenance notices wrap
  "banner": {
    "content": "⚠️ Scheduled maintenance: API will be unavailable December 15, 2-4 AM UTC",
    "dismissible": false
  }
  ```

  ```json Required actions wrap
  "banner": {
    "content": "**Action required:** Migrate to our new version by January 1. [Migration guide](/migration)",
    "dismissible": true
  }
  ```
</CodeGroup>

## Properties

<ResponseField name="content" type="string" required>
  The banner message. Supports plain text and Markdown formatting.
</ResponseField>

<ResponseField name="dismissible" type="boolean">
  Whether users can dismiss the banner. When `true`, users can close the banner and it won't reappear for their session. Defaults to `false`.
</ResponseField>

</guide>

We are hosting a hackathon in London on the 20th of September, so create a site-wide banner advertising this.

* update mcp server docs (vibe-kanban 94754ae1)

Update the documentation on the MCP server.

We have an existing page describing how it works, but it needs a bit of clarification because MCP support comes in two forms for us. Firstly, you can configure the MCP servers accessible to the coding agents you use within our product. And secondly, our product itself exposes an MCP server for other MCP clients to connect to, such as Claude Desktop, Raycast, or a coding agent that you're using either within Vive Kanban or outside Vive Kanban.

Our MCP server is a local MCP server as opposed to a remote MCP server and this means you can connect to it through apps that you've installed on your computer but you can't connect to clients that expect a publicly accessible URL.

The vibe-kanban-mcp-server docs page is exclusively focused on the MCP server that we expose but we should clarify this for users. This means we'll need a new page that focuses on the MCP Server configuration page that we have inside the app. And this is the page that lets users choose the MCP servers connected to each of the coding agents supported within Vibe Kanban. We also have a one-click installation feature for popular servers. such as, these are Context7 and Playwright.

# Update Media
Replace the main screenshot with /Users/britannio/Downloads/vk-mcp-server-config.jpeg by copying it into the project. This screenshot is taken from the MCP server's settings page and it's useful to show how we can add the Vibe Kanban MCP server to a coding agent that we're using within Vibe Kanban. We will also use this screenshot on the new page we're creating to show MCP server configuration, just to convey that you can bring your own MCP server or use one of our one-click installation popular servers for your coding agents.

/Users/britannio/Downloads/vk-raycast-mcp-part-2.png /Users/britannio/Downloads/vk-raycast-mcp-part-1.png

These screenshots are screenshots of the macOS Raycast app and they show you how you can configure the MCP server with it. Raycast is a popular MCP client just like Claude Desktop but many others are supported too.

* docs: creating task attempts - mintlify rules (vibe-kanban 2b54caea)

docs/user-guide/creating-task-attempts.mdx

Apply the Mintlify technical writing rules to this page.

* use british english in mintlify technical writing rule

* docs: agent configurations - mintlify rules (vibe-kanban 8e7d82ec)

docs/user-guide/agent-configurations.mdx
Apply the Mintlify technical writing rules to this page

* docs: creating projects (vibe-kanban 95cd181a)

docs/user-guide/creating-projects.mdx

Copy /Users/britannio/Downloads/vk-create-project.jpeg and use it as the screenshot

When the Create Project button is pressed, you have two options, either to create from an existing git repository or to create from a blank project. If you choose the former, then we will search your file system and show you a sorted list of git repositories that we find where the top project is the one that was most recently active.

In project settings, we not only let you control setup scripts, dev server scripts, and cleanup scripts, but we also let you specify a comma separated list of 'copy files'. And these are files like environment variables or other data that isn't tracked by git that you want to be present in the work tree created by every new task. Put this 'Copy Files' section above cleanup scripts.

How the codebase describes copy files: "Comma-separated list of files to copy from the original project directory to the worktree. These files will be copied after the worktree is created but before the setup script runs. Useful for environment-specific files like .env, configuration files, and local settings. Make sure these are gitignored or they could get committed!"

Since this page was created, we've changed the setup flow. So instead of configuring project settings during project creation, it's done afterwards. So once a user has created a project, they need to explicitly press the settings button in the top right to configure these scripts. As a result of this, it would be sensible to move all of the sections on project settings (git, setup scripts, etc) into a heading titled project settings.

From these project settings, you can also configure project task templates and we have more details about this in a subsection of a different page here: /user-guide/creating-task-templates#project-task-templates

* docs: getting started - minitlify (vibe-kanban 37318053)

      {
        "group": "Getting started",
        "pages": ["index", "getting-started", "onboarding", "global-settings"]
      },

Apply the Mintlify technical writing rules to these pages.

Additionally:

```
---
title: ""
description: ""
sidebarTitle: ""
---
```

These docs pages should have a title and description by including this block at the very top of the mdx file.

If the `title` attribute is equivalent to the first header, the header is redundant and can be removed.

sidebarTitle is optional and can be used if the main title os too verbose. The sidebar title should typically be two to three words.

* update creating projects text

* docs: creating tasks - mintlify (vibe-kanban a274f135)

docs/user-guide/creating-tasks.mdx
Apply the Mintlify technical writing rules to this page

* docs: creating task templates - mintlify (vibe-kanban 90f075a7)

docs/user-guide/creating-task-templates.mdx
Apply the Mintlify technical writing rules to this page

* update page title

* docs: keyboard shortcuts (vibe-kanban 8f39c2d0)

use the oracle to explore the codebase and learn how this feature works

add a new docs page covering each shortcut of significance (e.g. esc isn't significant)

* docs: task full screen mode (vibe-kanban a7e097dc)

Task details full screen mode: dev server, rebase, merge, subtask, new attempt, logs, diffs, processes.

Create a new docs page for this full scree mode explaining everything that can be done. Link to other docs for depth on each feature where appropriate.

use the oracle to explore the codebase and learn how this feature works

* docs: github features (vibe-kanban 29aa8f79)

add a docs page describing the features enabled by connecting to Github. Determine which screenshots will be needed and use placeholders for them until I give them to you.

use the oracle to explore the codebase and learn how this feature works

* docs: subtasks (vibe-kanban e038c1ad)

create a docs page for the subtask feature. Leave placeholders for screenshots: we need one for the full screen task view where you can see the button, one for viewing a task with subtasks, and one for viewing a subtask in full screen where it shows its parent task.

use the oracle to explore the codebase and learn how this feature works

* update subtask title

* docs: task templates (vibe-kanban 690b1933)

/Users/britannio/Downloads/vk-task-templates.png
/Users/britannio/Downloads/vk-proj-task-templates.png

Use these updated images in docs/user-guide/creating-task-templates.mdx

* docs: creating tasks screenshots (vibe-kanban 20f70e4f)

docs/user-guide/creating-tasks.mdx

/Users/britannio/Downloads/vk-create-task.png /Users/britannio/Downloads/vk-starting-task-attempt.png /Users/britannio/Downloads/vk-task-template.png

use these as the new screenshots

* docs: onboarding (vibe-kanban 631427c5)

docs/getting-started.mdx
docs/onboarding.mdx

In the documentation, we have an installation page and an onboarding page. But the onboarding page is a bit misleading because what actually happens when you set up the project and run the npx command for the first time is it will open the app and you'll see the projects page. There won't be any projects, so you'll have the chance to create your first project and create your first task. And then if you want to connect to GitHub, you have to manually go to settings and connect that. There isn't actually any encouragement for the user to do any of this. So, review those two pages and review the code base to double check that my understanding of the current onboarding flow is correct. And then update the documentation accordingly. We may not need the onboarding page at all if it's not relevant.

* docs: creating tasks (vibe-kanban 0eb62591)

docs/user-guide/creating-tasks.mdx

We should mention that tasks can be created by a coding agent or by an MCP client such as Claude Desktop or Raycast and then linked to the Vibe Kanban MCP server documentation. This isn't the expected use case for creating tasks but it can be useful for creating tasks in bulk based on existing data that you have or migrating tasks from a different system such as Linear, Github Issues

Conform to the mintlify technical writing rules.

* docs: settings (vibe-kanban 579e1663)

docs/global-settings.mdx

Use this screenshot instaed of screenshot-global-settings.png: /Users/britannio/Downloads/vk-settings.png

Don't change anything else.

* update creating tasks docs (vibe-kanban 140820a6)

docs/user-guide/creating-tasks.mdx

"After creating a project, add tasks by clicking the Add Task button in the navigation section of your project kanban page. Creating a task adds it to your kanban board without automatically starting a coding agent."

The button isn't an 'add task' button, it's a plus icon in the top right. You can also use the shortcut `c`.

* docs: creating task attempts (vibe-kanban fb8c5ad4)

docs/user-guide/creating-task-attempts.mdx
Review what is described in this documentation versus how it actually works in the frontend. For example, the previous documentation about the task attempt toolbar actions doesn't appear to hold anymore because the UI has changed. And the buttons in the image that it refers to are now only visible when viewing a task in full screen. And we have documentation on full screen mode. So that's an opportunity to backlink.

* update docs agents.md file

* Review and Harmonise All Documentation (vibe-kanban 7194a113)

Comprehensive review of all documentation pages to ensure:
- Consistent flow and navigation between pages
- Elimination of unnecessary information duplication
- Proper cross-referencing between related topics
- Consistent terminology and style
- Logical information architecture
- Updated navigation and table of contents
- Ensure docs conform to the mintlify technical rules, lean towards making smaller tweaks rather than larger rewrites as the content is already in a good state.

Deliverables:
- Updated navigation structure in docs.json
- Revised cross-references between pages
- Consolidated duplicate information
- Style and terminology consistency report
- Updated index and getting started pages to reflect new content

Location: Review all files in `/docs/` directory

* update image (vibe-kanban d0dcf34d)

docs/user-guide/creating-projects.mdx
/Users/britannio/Downloads/vk-create-proj.png
This is the new screenshot to use for the creating projects documentation. Just copy it and delete the old one.

* docs: delete unused images (vibe-kanban b8fdd325)

Find all unused images in the docs folder and remove them.

* remove review report

* move docs around (vibe-kanban 5ca2e108)

In the docs folder, we have a single subfolder called User Guide. But if you read docs.json, you'll see we now have four different sections of the documentation. I think the first section, being Getting Started, doesn't need its own folder, so the docs inside it can remain top level. But for all of the other sections, they should have their own folder named appropriately.

* update mintlify docs

* rename settings

* bring back ccr images (vibe-kanban 82c0f5d7)

Commit 1db2e0113e introduced claude code router images and setup instructions. Bring it back inside docs/supported-coding-agents.mdx including the images.

* docs deadlink (vibe-kanban b033ffaa)

core-features/task-details-full-screen#subtasks the subtasks link in this section is incorrect. Fix it and fix all other broken docs links.
2025-09-16 21:46:57 +01:00
GitHub Action
3b73ab13c2 chore: bump version to 0.0.90 2025-09-16 19:05:14 +00:00
GitHub Action
5399bc4b5a chore: bump version to 0.0.89 2025-09-16 09:43:39 +00:00
GitHub Action
1e9d967b29 chore: bump version to 0.0.88 2025-09-16 09:03:02 +00:00
Solomon
d79a61f3df Codex: Add gpt-5 variants for API users (#727) 2025-09-15 21:48:40 +01:00
GitHub Action
f959882afc chore: bump version to 0.0.86 2025-09-15 19:09:33 +00:00