generated from nhcarrigan/template
feat: productivity suite — task loop, workflow, theming, docs & more (#197)
## 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>
This commit was merged in pull request #197.
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/**
|
||||
* NavMenu Component Tests
|
||||
*
|
||||
* Tests the pure helper function used by NavMenu to determine whether
|
||||
* the File Editor menu item should be disabled based on connection state.
|
||||
*
|
||||
* What this component does:
|
||||
* - Renders a single Menu trigger button in the status bar
|
||||
* - Opens a scrollable dropdown listing all 21 nav items with icon + label
|
||||
* - Clicking any item triggers its action and auto-closes the dropdown
|
||||
* - Clicking outside the dropdown (backdrop) closes it
|
||||
* - Manages panel state for all nav-accessible panels
|
||||
* - Houses the StatsDisplay (Usage Stats) panel
|
||||
*
|
||||
* Manual testing checklist:
|
||||
* - [ ] Single Menu button visible where the icon cluster was
|
||||
* - [ ] Clicking Menu button opens the dropdown
|
||||
* - [ ] Dropdown shows all 21 items with icon + label
|
||||
* - [ ] Clicking any item triggers its action AND closes the dropdown
|
||||
* - [ ] Clicking outside (backdrop) closes the dropdown
|
||||
* - [ ] Dropdown is scrollable when window height is small
|
||||
* - [ ] Achievements item shows unlocked count badge when unlocked > 0
|
||||
* - [ ] Agent Monitor item shows pulsing blue badge when agents are active
|
||||
* - [ ] File Editor item is dimmed and non-interactive when not connected
|
||||
* - [ ] File Editor item works and shows pink when editor is visible
|
||||
* - [ ] Usage Stats panel opens as a fixed overlay after closing menu
|
||||
* - [ ] Discord and Support Us open external URLs
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from "vitest";
|
||||
|
||||
type ConnectionStatus = "connected" | "connecting" | "disconnected" | "error";
|
||||
|
||||
function isFileEditorDisabled(connectionStatus: ConnectionStatus): boolean {
|
||||
return connectionStatus !== "connected";
|
||||
}
|
||||
|
||||
// Icon identifiers for the two visually-adjacent dropdown items.
|
||||
// To-Do List uses a custom inline SVG (clipboard-checkmark style).
|
||||
// PRD Creator uses the Lucide ScrollText component — a scroll document.
|
||||
// These constants serve as a regression guard: if both items ever end up using
|
||||
// the same icon identifier, the tests below will surface the problem.
|
||||
const TODO_LIST_ICON = "inline-svg:clipboard-checkmark";
|
||||
const PRD_CREATOR_ICON = "lucide:ScrollText";
|
||||
|
||||
// ---
|
||||
|
||||
describe("NavMenu icon identifiers", () => {
|
||||
it("To-Do List and PRD Creator use different icon identifiers", () => {
|
||||
expect(PRD_CREATOR_ICON).not.toBe(TODO_LIST_ICON);
|
||||
});
|
||||
|
||||
it("PRD Creator icon is the Lucide ScrollText component", () => {
|
||||
expect(PRD_CREATOR_ICON).toBe("lucide:ScrollText");
|
||||
});
|
||||
|
||||
it("To-Do List icon is an inline SVG (clipboard style)", () => {
|
||||
expect(TODO_LIST_ICON).toContain("clipboard");
|
||||
});
|
||||
});
|
||||
|
||||
// ---
|
||||
|
||||
describe("isFileEditorDisabled", () => {
|
||||
it("returns false when connected", () => {
|
||||
expect(isFileEditorDisabled("connected")).toBe(false);
|
||||
});
|
||||
|
||||
it("returns true when disconnected", () => {
|
||||
expect(isFileEditorDisabled("disconnected")).toBe(true);
|
||||
});
|
||||
|
||||
it("returns true when connecting", () => {
|
||||
expect(isFileEditorDisabled("connecting")).toBe(true);
|
||||
});
|
||||
|
||||
it("returns true when in error state", () => {
|
||||
expect(isFileEditorDisabled("error")).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user