generated from nhcarrigan/template
e6e9f7ae59
## Summary A large productivity-focused feature branch delivering a suite of improvements across automation, project management, theming, performance, and documentation. ### Features - **Guided Project Workflow** (#189) — Four-phase workflow panel (Discuss → Plan → Execute → Verify) to keep projects structured from idea to completion - **Automated Task Loop** (#179) — Per-task conversation orchestration with wave-based parallel execution, blocked-task detection, and concurrency control - **Wave-Based Parallel Execution** (#191) — Tasks run in dependency-aware waves with configurable concurrency; independent tasks execute in parallel - **Auto-Commit After Task Completion** (#192) — Task Loop optionally commits after each completed task so progress is never lost - **PRD Creator** (#180) — AI-assisted PRD and task list panel that outputs `hikari-tasks.json` for the Task Loop to consume - **Project Context Panel** (#188) — Persistent `PROJECT.md`, `REQUIREMENTS.md`, `ROADMAP.md`, and `STATE.md` files injected into Claude's context automatically - **Codebase Mapper** (#190) — Generates a `CODEBASE.md` architectural summary so Claude always understands the project structure - **Community Preset Themes** (#181) — Six built-in community themes: Dracula, Catppuccin Mocha, Nord, Solarized Dark, Gruvbox Dark, and Rosé Pine - **In-App Changelog Panel** (#193) — Fetches release notes from GitHub at runtime and displays them inside the app - **Full Embedded Documentation** (#196) — Replaced the single-page help modal with a 12-page paginated docs browser featuring a sidebar TOC, prev/next navigation, keyboard navigation (arrow keys, `?` shortcut), and comprehensive coverage of every feature ### Performance & Fixes - **Lazy Loading & Virtualisation** (#194) — Virtual windowing for conversation history, markdown memoisation, and debounced search for smooth rendering of large sessions - **Ctrl+C Copy Fix** (#195) — `Ctrl+C` now copies selected text as expected; interrupt-Claude behaviour only fires when no text is selected ### UX - Back-to-workflow button in PRD Creator and Task Loop panels for easy navigation - Navigation icon cluster replaced with a single clean dropdown menu ## Closes Closes #179 Closes #180 Closes #181 Closes #188 Closes #189 Closes #190 Closes #191 Closes #192 Closes #193 Closes #194 Closes #195 Closes #196 --- ✨ This PR was created with help from Hikari~ 🌸 Reviewed-on: #197 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
91 lines
2.7 KiB
TypeScript
91 lines
2.7 KiB
TypeScript
/**
|
|
* StatusBar Component Tests
|
|
*
|
|
* Tests the connection status colour and text helpers used by the
|
|
* StatusBar component to display the current Claude connection state.
|
|
*
|
|
* What this component does:
|
|
* - Shows a coloured indicator dot for the connection state
|
|
* - Shows a text label for the connection state
|
|
* - Provides connect/disconnect buttons
|
|
* - Contains the working directory input and browse button
|
|
* - Renders the NavMenu component for all toolbar actions
|
|
*
|
|
* Manual testing checklist:
|
|
* - [ ] Green dot and "Connected" label when Claude is running
|
|
* - [ ] Animated yellow dot and "Connecting..." label whilst connecting
|
|
* - [ ] Red dot and "Error" label on connection error
|
|
* - [ ] Grey dot and "Disconnected" label when not connected
|
|
* - [ ] Directory input is hidden when connected, visible when disconnected
|
|
* - [ ] Connect button transitions to Disconnect button on connection
|
|
* - [ ] NavMenu trigger button visible in the status bar
|
|
*/
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
|
|
type ConnectionStatus = "connected" | "connecting" | "disconnected" | "error";
|
|
|
|
function getStatusColor(connectionStatus: ConnectionStatus): string {
|
|
switch (connectionStatus) {
|
|
case "connected":
|
|
return "bg-green-500";
|
|
case "connecting":
|
|
return "bg-yellow-500 animate-pulse";
|
|
case "error":
|
|
return "bg-red-500";
|
|
default:
|
|
return "bg-gray-500";
|
|
}
|
|
}
|
|
|
|
function getStatusText(connectionStatus: ConnectionStatus): string {
|
|
switch (connectionStatus) {
|
|
case "connected":
|
|
return "Connected";
|
|
case "connecting":
|
|
return "Connecting...";
|
|
case "error":
|
|
return "Error";
|
|
default:
|
|
return "Disconnected";
|
|
}
|
|
}
|
|
|
|
// ---
|
|
|
|
describe("getStatusColor", () => {
|
|
it("returns green for connected status", () => {
|
|
expect(getStatusColor("connected")).toBe("bg-green-500");
|
|
});
|
|
|
|
it("returns animated yellow for connecting status", () => {
|
|
expect(getStatusColor("connecting")).toBe("bg-yellow-500 animate-pulse");
|
|
});
|
|
|
|
it("returns red for error status", () => {
|
|
expect(getStatusColor("error")).toBe("bg-red-500");
|
|
});
|
|
|
|
it("returns grey for disconnected status", () => {
|
|
expect(getStatusColor("disconnected")).toBe("bg-gray-500");
|
|
});
|
|
});
|
|
|
|
describe("getStatusText", () => {
|
|
it("returns 'Connected' for connected status", () => {
|
|
expect(getStatusText("connected")).toBe("Connected");
|
|
});
|
|
|
|
it("returns 'Connecting...' for connecting status", () => {
|
|
expect(getStatusText("connecting")).toBe("Connecting...");
|
|
});
|
|
|
|
it("returns 'Error' for error status", () => {
|
|
expect(getStatusText("error")).toBe("Error");
|
|
});
|
|
|
|
it("returns 'Disconnected' for disconnected status", () => {
|
|
expect(getStatusText("disconnected")).toBe("Disconnected");
|
|
});
|
|
});
|