João Salavisa a1013342a3 feat: Real-time Git Status Integration (#8)
* feat: implement real-time git status integration

- Add workspace tracker to monitor git changes every 2 seconds
- Implement WebSocket streaming for git status updates
- Add database persistence for git status in agent session metadata
- Compute diffs backend-side with additions/deletions per file
- Integrate git status into frontend UI (top bar, files panel, changes panel)
- Display real-time ahead/behind commits and line changes
- Show file diffs with syntax highlighting in task view
- Add retry logic for WebSocket connections during reconciliation
- Fix context lifecycle issue in workspace tracker

* refactor: remove debug and unnecessary logging

- Remove debug logs from workspace tracker
- Remove info logs from WebSocket handlers
- Remove verbose git status update logs
- Keep only essential error logs

* fix: compare git diff against remote branch instead of HEAD

- Changed git diff comparison from HEAD to remote tracking branch
- Now shows all changes including committed files that haven't been pushed
- Files committed locally but not pushed will appear in the diff
- Falls back to HEAD if no remote branch is configured

* fix: prevent stale git status when switching tasks

- Clear git status when switching to a new task
- Only accept git.status WebSocket updates for the current task
- Prevents showing git data from previous task when switching

* refactor: remove unused diff stream client code

- Remove diffConn field from agentctl Client struct
- Remove StreamDiff() method (never called)
- Remove CloseDiffStream() method
- Remove DiffUpdate type from client.go
- All diff data is already included in GitStatusUpdate.Files
- Keep server-side diff endpoint in agentctl for potential future use

* refactor: remove unused diff stream server-side code

- Remove /workspace/diff/stream endpoint from agentctl API
- Remove handleDiffStreamWS handler
- Remove DiffUpdate type from workspace_tracker.go
- Remove DiffSubscriber type
- Remove updateDiff() and getDiff() methods
- Remove SubscribeDiff(), UnsubscribeDiff() methods
- Remove notifyDiffSubscribers() method
- Remove GetCurrentDiff() method
- Remove currentDiff field and diffSubscribers map
- All diff data is already included in GitStatusUpdate.Files

* refactor: remove unused output stream code

- Remove /output and /output/stream endpoints from agentctl API
- Remove handleGetOutput and handleOutputStreamWS handlers
- Delete output.go file entirely
- Remove OutputBuffer and related code (buffer.go deleted)
- Remove outputConn field from agentctl Client
- Remove StreamOutput() and CloseOutputStream() methods
- Remove OutputLine type from client.go
- Remove OutputBufferSize config option
- Update readStderr to just log instead of buffering

Output data flows through ACP stream (StreamUpdates) which includes
all session notifications. The separate output stream was never used.
2026-01-12 23:44:29 +00:00

Kandev - Kanban Board with AI Agent Orchestration

A Kanban board system that integrates AI agent orchestration capabilities with real-time Agent Communication Protocol (ACP) streaming, allowing tasks to be automatically executed by AI agents running in isolated Docker containers.

Overview

Kandev combines traditional Kanban task management with automated AI agent execution and real-time feedback streaming. Users create tasks on a Kanban board, and when configured with an AI agent type, the system automatically launches Docker containers to execute those tasks against specified code repositories. Real-time progress, logs, and results are streamed from agents to the frontend via WebSocket connections.

Key Features

  • Kanban Board Management: Create and manage tasks across multiple boards with columns
  • AI Agent Orchestration: Launch AI agents (Augment Agent) to execute tasks
  • Real-Time ACP Streaming: Live progress updates, logs, and results streamed from agents
  • Session Resumption: Agents can resume previous conversations using session IDs
  • Docker Isolation: Each agent runs in an isolated Docker container with resource limits
  • Repository Integration: Agents can work on code repositories with host credentials
  • Host Credential Mounting: Secure read-only mounting of SSH keys and Git credentials
  • SQLite Persistence: Lightweight file-based database for task and board storage
  • Local Deployment: Designed for client machines with minimal dependencies

Architecture

The system runs as a unified Go binary that includes:

  • Task Service: Manages tasks, boards, and columns with SQLite persistence
  • Agent Manager: Manages Docker container lifecycle and ACP message streaming
  • Orchestrator: Coordinates agent launches and monitors execution
  • WebSocket API: Real-time bidirectional communication for all operations (Port 8080)

Agent Communication Protocol (ACP)

ACP is a JSON-based streaming protocol that enables real-time communication between AI agents and the backend:

Agent Container (stdout) → Agent Manager → Event Bus → API

Message Types: progress, log, result, error, status, heartbeat

See docs/ARCHITECTURE.md for detailed architecture documentation.

Supported Agent Types

  1. Augment Agent (augment-agent)
    • Uses Auggie CLI for code analysis, generation, debugging, refactoring
    • Native ACP support via stdout JSON streaming
    • Session resumption for multi-turn conversations

Technology Stack

  • Backend: Go 1.21+
  • Database: SQLite (with WAL mode)
  • Container Runtime: Docker
  • Web Framework: Gin
  • Logging: Zap (structured logging)
  • Deployment: Single binary for client machines

Quick Start

Prerequisites

  • Go 1.21 or higher
  • Docker
  • Augment CLI credentials (~/.augment/session.json)

Build and Run

cd apps/backend

# Build the binary
make build

# Run the server (creates kandev.db in current directory)
./bin/kandev

# Or specify a custom database path
KANDEV_DB_PATH=/path/to/kandev.db ./bin/kandev

WebSocket API Usage

Connection: ws://localhost:8080/ws

Message Envelope

{
  "id": "correlation-uuid",
  "type": "request|response|notification|error",
  "action": "action.name",
  "payload": {},
  "timestamp": "2026-01-10T10:30:00Z"
}

Key Message Actions

  • board.create - Create board
  • board.list - List boards
  • column.create - Create column
  • task.create - Create task
  • agent.launch - Launch agent
  • agent.status - Get agent status
  • orchestrator.start - Start task execution

Example Usage (JavaScript)

const ws = new WebSocket('ws://localhost:8080/ws');

// Create a board
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'board.create',
  payload: { name: 'My Project', description: 'Project tasks' }
}));

// Create a task
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'task.create',
  payload: {
    board_id: '{board_id}',
    column_id: '{column_id}',
    title: 'Fix login bug',
    description: 'Users cannot login'
  }
}));

// Launch an agent
ws.send(JSON.stringify({
  id: crypto.randomUUID(),
  type: 'request',
  action: 'agent.launch',
  payload: {
    task_id: '{task_id}',
    agent_type: 'augment-agent',
    workspace_path: '/path/to/project',
    env: {
      AUGMENT_SESSION_AUTH: '...',
      TASK_DESCRIPTION: 'What is 2+2?'
    }
  }
}));

// Handle responses and notifications
ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === 'response') {
    console.log('Response:', msg.payload);
  } else if (msg.type === 'notification') {
    // Real-time updates: acp.progress, acp.log, task.updated, etc.
    console.log('Notification:', msg.action, msg.payload);
  }
};

See apps/backend/NEXT_STEPS.md for detailed API reference and next steps.

Project Structure

kandev/
├── apps/
│   ├── backend/              # Go backend services
│   │   ├── cmd/kandev/       # Unified binary entry point
│   │   ├── internal/
│   │   │   ├── agent/        # Agent manager (docker, lifecycle, registry, api)
│   │   │   ├── task/         # Task service (models, repository, service, api)
│   │   │   ├── orchestrator/ # Orchestrator service
│   │   │   ├── events/       # In-memory event bus
│   │   │   └── common/       # Shared utilities (logger, config)
│   │   ├── pkg/acp/          # ACP protocol types
│   │   ├── dockerfiles/      # Agent container Dockerfiles
│   │   └── Makefile
│   └── web/                  # Frontend application
├── docs/                     # Architecture and planning docs
├── migrations/               # Database migrations (future)
├── deployments/              # Deployment configs
└── scripts/                  # Utility scripts (including e2e-test.sh)

Configuration

Environment Variable Default Description
KANDEV_DB_PATH ./kandev.db SQLite database file path
PORT 8080 HTTP server port

Development

cd apps/backend

# Build
make build

# Run tests
make test

# Format code
go fmt ./...

# Lint
go vet ./...

Project Status

✅ Core Features Working

  • SQLite persistence for boards, columns, and tasks
  • Agent lifecycle management with Docker
  • ACP message streaming from containers
  • Session resumption for multi-turn agent conversations
  • WebSocket-first API for all operations
  • Real-time bidirectional communication

🚧 In Progress

  • Authentication and authorization
  • Frontend UI

See apps/backend/NEXT_STEPS.md for the complete roadmap.

License

[To be determined]

Acknowledgments

Built with Go and inspired by modern DevOps practices and AI-assisted development workflows.

S
Description
Upstream mirror of https://github.com/kdlbs/kandev (main). Internal development and testing.
Readme 371 MiB
Languages
Go 58.3%
TypeScript 37.6%
HTML 1.9%
JavaScript 0.8%
Python 0.7%
Other 0.5%