Skip to content

Add GitHub and CLI crates, update dependencies#2

Merged
souky-byte merged 1 commit into
masterfrom
phase-1-4
Dec 30, 2025
Merged

Add GitHub and CLI crates, update dependencies#2
souky-byte merged 1 commit into
masterfrom
phase-1-4

Conversation

@souky-byte
Copy link
Copy Markdown
Owner

@souky-byte souky-byte commented Dec 30, 2025

Introduces new crates for GitHub integration and CLI functionality. Updates dependencies and versions across multiple backend crates, adds new server routes and API tests, and scaffolds a comprehensive frontend with generated API types, UI components, and hooks.

Summary by CodeRabbit

Release Notes

  • New Features

    • Added CLI tool for project initialization, server management, and status monitoring
    • Implemented GitHub integration for pull request and issue management
    • Built frontend application with Kanban board, roadmap planning, and live sessions tracking
    • Added OpenAPI documentation and auto-generated TypeScript type definitions
    • Introduced WebSocket support for real-time updates
    • Added file management for storing generated plans and reviews
  • Infrastructure

    • Expanded workspace with new CLI and GitHub modules
    • Integrated OpenAPI and TypeScript tooling across backend and frontend

✏️ Tip: You can customize this high-level summary in your review settings.

Introduces new crates for GitHub integration and CLI functionality. Updates dependencies and versions across multiple backend crates, adds new server routes and API tests, and scaffolds a comprehensive frontend with generated API types, UI components, and hooks.
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented Dec 30, 2025

Skipped: This PR changes more files than the configured file change limit: (203 files found, 100 file limit)

@souky-byte souky-byte merged commit 1f74380 into master Dec 30, 2025
1 check was pending
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Dec 30, 2025

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

This pull request adds a complete GitHub integration layer with API client support, introduces a CLI tool for project initialization and management, expands the backend with OpenAPI documentation, and delivers a comprehensive React-based frontend with UI components and WebSocket connectivity for real-time session management.

Changes

Cohort / File(s) Summary
Workspace Dependencies
Cargo.toml, Cargo.lock
Added workspace members (crates/cli, crates/github); introduced TypeScript/OpenAPI tooling (ts-rs, utoipa, utoipa-axum, utoipa-swagger-ui) as workspace dependencies for cross-crate reuse.
CLI Application
crates/cli/Cargo.toml, crates/cli/src/main.rs
New CLI binary with init, serve, and status subcommands; manages project initialization, server startup, and status reporting; integrates with database migrations and workspace setup.
GitHub Integration
crates/github/*
New github crate providing GitHubClient for PR/issue management, CI status polling, and data conversion; includes types (PullRequest, Issue, CiStatus) and comprehensive error handling via GitHubError.
Core & Events Type Annotations
crates/core/src/domain/*, crates/events/src/types.rs, crates/core/Cargo.toml, crates/events/Cargo.toml
Added ToSchema derives and TypeScript bindings (ts-rs) to domain types (SessionPhase, Task, Event) for OpenAPI schema generation and frontend type generation; added TypeScript feature flags.
VCS & Workspace Types
crates/vcs/src/*, crates/orchestrator/src/*
Enhanced Workspace with created_at; expanded MergeResult with Conflicts variant; added ConflictType variants; introduced FileManager and expanded TaskExecutor with lifecycle management and event emission.
Server Routes & OpenAPI
crates/server/src/routes/*, crates/server/src/lib.rs, crates/server/Cargo.toml
Consolidated router construction into create_router function; added routes for project info, sessions, tasks (CRUD + transitions), workspaces (create, diff, merge, delete); integrated utoipa for OpenAPI schema generation.
Server State & Initialization
crates/server/src/state.rs, crates/server/src/main.rs
Added GitHub client initialization via OnceCell; expanded AppState with repo_path and session/event bus wiring; configured ExecutorConfig with plan approval and iteration limits.
Server Integration Tests
crates/server/tests/api_tests.rs
Comprehensive integration test suite covering health, task CRUD, workspace lifecycle, session management, and end-to-end execution flows with temporary git/jj repos and wiremock mocking.
Frontend App Structure
frontend/app/, frontend/package.json, frontend/components.json, frontend/orval.config.ts
Replaced Next 15 project with modern Next.js 16 + React 19 setup; added Orval configuration for OpenAPI code generation; removed Prisma and TRPC in favor of direct API integration; updated metadata and layout.
Frontend UI Components
frontend/src/components/ui/*
Implemented 60+ reusable UI components wrapping Radix UI, Recharts, and Embla Carousel; includes buttons, dialogs, forms, navigation, data display, and layout primitives with comprehensive theming and accessibility support.
Frontend App Components
frontend/src/components/*.tsx
Built application-level components: AppShell (layout orchestration), Sidebar, Header, kanban/roadmap/sessions views, TaskDetailPanel with tab-based content (plan, diff, review, server logs, sessions), project selector.
Frontend Styling & Config
frontend/app/globals.css
Added Tailwind CSS foundation with OKLCH color space, CSS variable theming, base layer utilities, and responsive design tokens.
Frontend Utilities & Hooks
frontend/src/lib/utils.ts, frontend/src/lib/mock-data.tsx, frontend/src/hooks/*
Added cn className utility; created comprehensive mock data (tasks, roadmap, sessions, projects); implemented useIsMobile and useStudioWebSocket hooks for responsive UI and real-time event management.
Frontend API Integration
frontend/src/api/mutator/custom-instance.ts
Implemented custom fetch-based API instance with query parameter building, JSON serialization, AbortSignal support, and 204 No Content handling.

Sequence Diagram(s)

sequenceDiagram
    participant CLI as CLI/User
    participant Init as init_project
    participant FS as File System
    participant DB as SQLite
    participant Migrations as Migrations
    participant Config as Config

    CLI->>Init: opencode init
    Init->>FS: Create .opencode-studio dir
    FS-->>Init: ✓ dirs created
    Init->>Config: Derive project name
    Config-->>Init: project name
    Init->>Config: Create config.toml
    Config->>FS: Write config
    FS-->>Config: ✓ written
    Init->>DB: Create/open database
    DB-->>Init: pool ready
    Init->>Migrations: Run migrations
    Migrations->>DB: Apply schema
    DB-->>Migrations: ✓ complete
    Migrations-->>Init: ✓ done
    Init->>CLI: Print setup summary
Loading
sequenceDiagram
    participant Client as Frontend Client
    participant Server as Server/create_router
    participant State as AppState
    participant Tasks as Task Routes
    participant Executor as TaskExecutor
    participant Events as Event Bus
    participant Session as Session Repo

    Client->>Server: POST /api/tasks/{id}/execute
    Server->>Tasks: execute_task(state, id)
    Tasks->>State: Extract AppState
    Tasks->>Executor: run_full_cycle(task)
    Executor->>Executor: Plan phase
    Executor->>Events: Emit SessionStarted
    Events->>Session: Store session
    Executor->>Executor: Implementation phase
    Executor->>Events: Emit TaskStatusChanged
    Executor->>Executor: AI Review phase
    alt Review passed
        Executor->>State: Transition task to DONE
        Executor->>Events: Emit ReviewPassed
    else Review failed
        Executor->>Executor: Iterate (if iterations < max)
        Executor->>Events: Emit ReviewFailed
    end
    Executor->>Tasks: Return PhaseResult
    Tasks->>Client: Json<ExecuteResponse>
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

This PR introduces substantial new functionality across the entire stack: a production-grade GitHub client, CLI tooling, OpenAPI integration, 60+ UI components, and extensive backend route expansion. The changes span heterogeneous domains (Rust backend, TypeScript frontend, database schema enhancements) with intricate interdependencies, particularly around executor lifecycle management, event emission, and API contract changes. High-density logic in GitHub client (CI polling, data conversion), session/workspace orchestration, and comprehensive test coverage requiring careful validation.

Poem

🐰 whispers to the code
From cargo to components bright,
GitHub's doors now open wide,
CLI commands pave the road,
WebSockets sing through the night!
twitches nose ✨🚀

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b1dbe7b and 2704ae3.

⛔ Files ignored due to path filters (80)
  • Cargo.lock is excluded by !**/*.lock
  • frontend/src/api/generated/health/health.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/createTaskRequest.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/createTaskRequestRoadmapItemId.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/diffResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/executeResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/healthResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/index.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeRequest.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeResponseOneOf.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeResponseOneOfResult.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeResponseOneOfThree.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/mergeResponseOneOfThreeResult.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDto.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOf.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfFive.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfFiveType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfNine.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfNineType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfOneone.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfOneoneType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfOnethree.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfOnethreeType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfSeven.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfSevenType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfThree.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfThreeType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/phaseResultDtoOneOfType.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/session.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/sessionCompletedAt.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/sessionOpencodeSessionId.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/sessionPhase.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/sessionStartedAt.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/sessionStatus.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/task.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/taskRoadmapItemId.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/taskStatus.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/taskWorkspacePath.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/transitionRequest.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/transitionResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/updateTaskRequest.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/updateTaskRequestDescription.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/updateTaskRequestStatus.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/updateTaskRequestTitle.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/updateTaskRequestWorkspacePath.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/workspaceResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/model/workspaceStatusResponse.ts is excluded by !**/generated/**
  • frontend/src/api/generated/sessions/sessions.ts is excluded by !**/generated/**
  • frontend/src/api/generated/tasks/tasks.ts is excluded by !**/generated/**
  • frontend/src/api/generated/workspaces/workspaces.ts is excluded by !**/generated/**
  • frontend/src/types/generated/AgentMessageData.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ClientMessage.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ConflictFile.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ConflictType.ts is excluded by !**/generated/**
  • frontend/src/types/generated/CreateTaskRequest.ts is excluded by !**/generated/**
  • frontend/src/types/generated/DiffResponse.ts is excluded by !**/generated/**
  • frontend/src/types/generated/Event.ts is excluded by !**/generated/**
  • frontend/src/types/generated/EventEnvelope.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ExecuteResponse.ts is excluded by !**/generated/**
  • frontend/src/types/generated/MergeRequest.ts is excluded by !**/generated/**
  • frontend/src/types/generated/MergeResponse.ts is excluded by !**/generated/**
  • frontend/src/types/generated/MergeResult.ts is excluded by !**/generated/**
  • frontend/src/types/generated/PhaseResultDto.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ServerMessage.ts is excluded by !**/generated/**
  • frontend/src/types/generated/Session.ts is excluded by !**/generated/**
  • frontend/src/types/generated/SessionPhase.ts is excluded by !**/generated/**
  • frontend/src/types/generated/SessionStatus.ts is excluded by !**/generated/**
  • frontend/src/types/generated/SubscriptionFilter.ts is excluded by !**/generated/**
  • frontend/src/types/generated/Task.ts is excluded by !**/generated/**
  • frontend/src/types/generated/TaskStatus.ts is excluded by !**/generated/**
  • frontend/src/types/generated/ToolExecutionData.ts is excluded by !**/generated/**
  • frontend/src/types/generated/TransitionRequest.ts is excluded by !**/generated/**
  • frontend/src/types/generated/TransitionResponse.ts is excluded by !**/generated/**
  • frontend/src/types/generated/UpdateTaskRequest.ts is excluded by !**/generated/**
  • frontend/src/types/generated/Workspace.ts is excluded by !**/generated/**
  • frontend/src/types/generated/WorkspaceResponse.ts is excluded by !**/generated/**
  • frontend/src/types/generated/WorkspaceStatus.ts is excluded by !**/generated/**
  • frontend/src/types/generated/index.ts is excluded by !**/generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (123)
  • Cargo.toml
  • agents.md
  • crates/cli/Cargo.toml
  • crates/cli/src/main.rs
  • crates/core/Cargo.toml
  • crates/core/src/domain/session.rs
  • crates/core/src/domain/task.rs
  • crates/events/Cargo.toml
  • crates/events/src/types.rs
  • crates/github/Cargo.toml
  • crates/github/src/client.rs
  • crates/github/src/error.rs
  • crates/github/src/lib.rs
  • crates/github/src/types.rs
  • crates/orchestrator/Cargo.toml
  • crates/orchestrator/src/executor.rs
  • crates/orchestrator/src/files.rs
  • crates/orchestrator/src/lib.rs
  • crates/orchestrator/src/prompts.rs
  • crates/server/Cargo.toml
  • crates/server/src/bin/generate_types.rs
  • crates/server/src/lib.rs
  • crates/server/src/main.rs
  • crates/server/src/routes/health.rs
  • crates/server/src/routes/mod.rs
  • crates/server/src/routes/project.rs
  • crates/server/src/routes/sessions.rs
  • crates/server/src/routes/tasks.rs
  • crates/server/src/routes/workspaces.rs
  • crates/server/src/state.rs
  • crates/server/tests/api_tests.rs
  • crates/vcs/Cargo.toml
  • crates/vcs/src/jj.rs
  • crates/vcs/src/lib.rs
  • crates/vcs/src/traits.rs
  • crates/websocket/Cargo.toml
  • crates/websocket/src/messages.rs
  • frontend/app/globals.css
  • frontend/components.json
  • frontend/orval.config.ts
  • frontend/package.json
  • frontend/src/api/mutator/custom-instance.ts
  • frontend/src/app/layout.tsx
  • frontend/src/app/page.tsx
  • frontend/src/components/app-shell.tsx
  • frontend/src/components/example.tsx
  • frontend/src/components/header.tsx
  • frontend/src/components/kanban/kanban-column.tsx
  • frontend/src/components/kanban/kanban-view.tsx
  • frontend/src/components/kanban/task-card.tsx
  • frontend/src/components/markdown-renderer.tsx
  • frontend/src/components/project-selector.tsx
  • frontend/src/components/roadmap/roadmap-card.tsx
  • frontend/src/components/roadmap/roadmap-detail-panel.tsx
  • frontend/src/components/roadmap/roadmap-view.tsx
  • frontend/src/components/sessions/sessions-view.tsx
  • frontend/src/components/settings/settings-view.tsx
  • frontend/src/components/sidebar.tsx
  • frontend/src/components/task-detail/dev-server-tab.tsx
  • frontend/src/components/task-detail/diff-tab.tsx
  • frontend/src/components/task-detail/plan-tab.tsx
  • frontend/src/components/task-detail/review-tab.tsx
  • frontend/src/components/task-detail/session-tab.tsx
  • frontend/src/components/task-detail/task-detail-panel.tsx
  • frontend/src/components/ui/accordion.tsx
  • frontend/src/components/ui/alert-dialog.tsx
  • frontend/src/components/ui/alert.tsx
  • frontend/src/components/ui/aspect-ratio.tsx
  • frontend/src/components/ui/avatar.tsx
  • frontend/src/components/ui/badge.tsx
  • frontend/src/components/ui/breadcrumb.tsx
  • frontend/src/components/ui/button-group.tsx
  • frontend/src/components/ui/button.tsx
  • frontend/src/components/ui/calendar.tsx
  • frontend/src/components/ui/card.tsx
  • frontend/src/components/ui/carousel.tsx
  • frontend/src/components/ui/chart.tsx
  • frontend/src/components/ui/checkbox.tsx
  • frontend/src/components/ui/collapsible.tsx
  • frontend/src/components/ui/combobox.tsx
  • frontend/src/components/ui/command.tsx
  • frontend/src/components/ui/context-menu.tsx
  • frontend/src/components/ui/dialog.tsx
  • frontend/src/components/ui/drawer.tsx
  • frontend/src/components/ui/dropdown-menu.tsx
  • frontend/src/components/ui/empty.tsx
  • frontend/src/components/ui/field.tsx
  • frontend/src/components/ui/hover-card.tsx
  • frontend/src/components/ui/input-group.tsx
  • frontend/src/components/ui/input-otp.tsx
  • frontend/src/components/ui/input.tsx
  • frontend/src/components/ui/item.tsx
  • frontend/src/components/ui/kbd.tsx
  • frontend/src/components/ui/label.tsx
  • frontend/src/components/ui/menubar.tsx
  • frontend/src/components/ui/native-select.tsx
  • frontend/src/components/ui/navigation-menu.tsx
  • frontend/src/components/ui/pagination.tsx
  • frontend/src/components/ui/popover.tsx
  • frontend/src/components/ui/progress.tsx
  • frontend/src/components/ui/radio-group.tsx
  • frontend/src/components/ui/resizable.tsx
  • frontend/src/components/ui/scroll-area.tsx
  • frontend/src/components/ui/select.tsx
  • frontend/src/components/ui/separator.tsx
  • frontend/src/components/ui/sheet.tsx
  • frontend/src/components/ui/sidebar.tsx
  • frontend/src/components/ui/skeleton.tsx
  • frontend/src/components/ui/slider.tsx
  • frontend/src/components/ui/sonner.tsx
  • frontend/src/components/ui/spinner.tsx
  • frontend/src/components/ui/switch.tsx
  • frontend/src/components/ui/table.tsx
  • frontend/src/components/ui/tabs.tsx
  • frontend/src/components/ui/textarea.tsx
  • frontend/src/components/ui/toggle-group.tsx
  • frontend/src/components/ui/toggle.tsx
  • frontend/src/components/ui/tooltip.tsx
  • frontend/src/components/vercel.tsx
  • frontend/src/hooks/use-mobile.ts
  • frontend/src/hooks/useStudioWebSocket.ts
  • frontend/src/lib/mock-data.tsx
  • frontend/src/lib/utils.ts

Comment @coderabbitai help to get the list of available commands and usage tips.

@souky-byte souky-byte deleted the phase-1-4 branch December 30, 2025 20:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant