- Extract tool instance lifecycle endpoints (start/stop/restart/delete) from
api/tool/tool_instances.py into new api/tool/tool_lifecycle.py.
- Register tool_lifecycle_router in main.py and api/tool/__init__.py.
- Extract inline WorkspaceDetailPage components into
components/features/workspace/: detail header, tab bars, file/git/tools/settings
panels. Slim page from ~446 to ~62 lines.
- Update OpenSpec reorganize-long-files tasks to reflect completed work and
current source state; mark change completed.
- Regenerate project maps.
Quality gates: python3 -m py_compile (backend clean), npm run typecheck,
npm run lint, npm test -- --run (87 passed), pytest workspace integration
and unit tests (27 passed, 1 skipped).
Tracks and manages specification changes, versions, and changelog entries for the OpenAPI specification.
Manages and tracks specification changes, versioning, and changelog generation for the OpenAPI specification.
## files
## arch
Simple data model package using immutable value objects with builder pattern for constructing change records and version metadata.
Event-sourced or diff-based architecture with structured change records, likely supporting incremental versioning and audit trails for specification evolution.
Contains planning and specification documents for a structural refactoring initiative to modularize monolithic frontend pages and backend routers into thinner, more maintainable components.
Tracks a completed structural refactoring initiative to decompose monolithic frontend pages and backend routers into smaller, focused components and services.
Contains planning and specification documents for a structural refactoring initiative to modularize monolithic frontend pages and backend routers into thinner, more maintainable components.
Tracks a completed structural refactoring initiative to decompose monolithic frontend pages and backend routers into smaller, focused components and services.
## files
- .openspec.yaml | Defines an OpenSpec configuration file with schema type and creation date metadata
- .openspec.yaml | Configuration file tracking a completed project task for reorganizing long files
- proposal.md | Proposes a structural refactoring to split monolithic frontend pages and backend routers into thinner orchestrators with extracted components/services, restoring a thin-page/thin-router/fat-component pattern. | dep: React components, FastAPI routers, WebSocket, Docker, git services
- spec.md | A specification document defining a pure structural refactoring to split monolithic frontend pages/backend routers and CSS into smaller, focused components and services without changing any behavior or API contracts. | dep: React, CSS Modules, WebSocket, FastAPI/Flask routers, TypeScript, Vite
- tasks.md | A phased task list for refactoring a full-stack application by extracting monolithic backend routers and frontend pages/components into modular structures, plus reorganizing CSS into a maintainable architecture. | dep: FastAPI, React, TypeScript, Vite, CSS Modules, WebSocket, py_compile, tsc, npm
- tasks.md | Tracks the completion status of a codebase reorganization initiative to slim long files by extracting components and services into dedicated modules.
## arch
Documentation-driven refactoring approach using OpenSpec configuration, phased task planning, and pattern restoration (thin-page/thin-router/fat-component) with strict behavioral preservation (no API contract changes).
Documentation-driven refactoring using spec/proposal/task tracking files with a thin-page/thin-router/fat-component pattern, preserving all API contracts and behavior while extracting dedicated component/service modules.
- [ ] 1.1.1 Create `api/tool/terminal.py` from terminal WebSocket handlers in `api/tool/tool_instances.py`
- [ ] 1.1.2 Move `_handle_terminal_websocket`, `_get_user_from_websocket`, `SessionRef` class
- [ ] 1.1.3 Update `main.py` to include `terminal_router` from `api.tool.terminal`
- [ ] 1.1.4 Remove terminal routes from `api/tool/tool_instances.py`
- [ ] 1.1.5 Verify `py_compile` passes
## Summary of Work
### 1.2 Instance Lifecycle Extraction
- [ ] 1.2.1 Create `api/tool/tool_lifecycle.py` for start/stop/restart/delete endpoints
- [ ] 1.2.2 Extract lifecycle endpoints from `api/tool/tool_instances.py`
- [ ] 1.2.3 Update `main.py` to include lifecycle router
- [ ] 1.2.4 Verify `py_compile` passes
This change was partially implemented incrementally across other features (`workspace-first-ui`, `tool-session-progress-and-updates`, etc.). This final pass completes the remaining high-value extractions and updates the spec to reflect the current codebase.
### 1.3 Git Repository Router
- [ ] 1.3.1 Create `services/git/operations.py` for git command orchestration
| 2.2 | Page-specific CSS files | Already done; `styles.css`monolith does not exist |
| 2.3 | CSS Modules for every component | Deferred — global CSS files are already split by page/feature; converting every component to CSS Modules is a large, risky visual refactor beyond the current scope |
| 2.4 | Delete `styles.css`| Already done |
### 2.4 Verify and Delete Monolith
- [ ] 2.4.1 Confirm `styles.css` is empty (or only has truly unclassifiable styles)
- [ ] 2.4.2 Delete `styles.css`
- [ ] 2.4.3 Verify build passes
- [ ] 2.4.4 Verify no visual regressions
## Completed This Pass
## Phase 3: Frontend — Tool Workshop Page
- [x] Extract start/stop/restart/delete lifecycle endpoints from `api/tool/tool_instances.py` into `api/tool/tool_lifecycle.py`
- [x] Register `tool_lifecycle_router` in `main.py`
- [x] Extract `WorkspaceDetailPage` inline components into `components/features/workspace/`
- Several originally planned extractions were already completed in earlier feature branches or became obsolete when `RepoWorkspacePage` and its related components were removed during `workspace-first-ui`.
- The remaining meaningful structural win was extracting the monolithic `WorkspaceDetailPage` and the backend lifecycle endpoints.
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.