Skip to content

Commit 9e8e367

Browse files
mabry1985claudeClaude Agent
authored
Phase 1: Spec and User-Facing Copy (#70)
* test: add E2E tests for critical homeMaker cross-service flows (#64) Adds Playwright E2E tests covering four critical integration flows: 1. Sensor lifecycle: register → report reading → query history 2. Maintenance completion: create task → complete → verify XP awarded 3. Inventory + sensor: add asset → link sensor → verify readings 4. Gamification milestone: complete task → achievement unlocked Tests use API-level requests (no UI interaction required) and support both AUTOMAKER_AUTO_LOGIN dev mode and API key auth for CI environments. All four tests pass against the live dev server. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: Phase 1: Remove Dev Routes and Nav Items (#65) * Phase 2: Clean Up Orphaned View Components (#67) (#68) * test: add E2E tests for critical homeMaker cross-service flows (#64) Adds Playwright E2E tests covering four critical integration flows: 1. Sensor lifecycle: register → report reading → query history 2. Maintenance completion: create task → complete → verify XP awarded 3. Inventory + sensor: add asset → link sensor → verify readings 4. Gamification milestone: complete task → achievement unlocked Tests use API-level requests (no UI interaction required) and support both AUTOMAKER_AUTO_LOGIN dev mode and API key auth for CI environments. All four tests pass against the live dev server. * refactor: Phase 1: Remove Dev Routes and Nav Items (#65) * feat: remove orphaned dev platform view components Deletes analytics-view, designs-view, docs-view, file-editor-view, github-issues-view, and project-settings-view — all were unreachable after route removal in the previous phase. Cleans up the lazy import and issues tab from ProjectsView that referenced github-issues-view. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: home-friendly board view presentation (M2 Phase 2) (#69) * homeMaker-completion: rebrand, sensor DB, vendor UI, HA integration * fix: disable express-rate-limit IPv6 validation for custom keyGenerator The sensor rate limiter uses a custom keyGenerator that falls back to req.ip when no sensor ID is available. express-rate-limit v7+ flags this as a potential IPv6 bypass. Disable the validation since our fallback is intentional and the app runs on Tailscale (trusted network). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: clean old automaker data + scaffold homeMaker-completion project Remove 16 legacy automaker project plans and 27 memory files inherited from the protoLabs Studio fork. Create homeMaker-completion project with 4 milestones: rebrand, sensor DB wiring, vendor UI restore, HA client. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove close-external-prs workflow that blocks all PRs homeMaker is a GitHub fork of automaker, so head.repo.fork evaluates to true for ALL pull requests — not just external ones. This causes every PR created by auto-mode agents to be immediately closed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: Update all protoLabs Studio UI references to homeMaker (#47) * feat: wire DB into SensorRegistryService for persistent history (#48) (#49) - Add BetterSqlite3.Database parameter to SensorRegistryService constructor - Add private db property, SensorReadingRow/AggregatedRow types, DEFAULT_RETENTION_DAYS constant - Persist sensor readings to sensor_readings SQLite table in report() - Move homemakerDb instantiation before SensorRegistryService creation in services.ts - Remove duplicate homemakerDb declaration; getHomemakerDb() singleton is now shared earlier Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: restore vendor UI — route, nav item, CRUD view (#53) - Add /vendors route wired to VendorsView - Add Vendors nav item (Store icon) to sidebar - Create vendors-view with search, category filters, grid layout - Create vendor-card, vendor-detail-panel (edit/delete), add-vendor-dialog - Create use-vendors hook with full CRUD against /api/vendors Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: add calendar module docs and expand HA integration docs (#58) - Add docs/modules/calendar.md with full API reference, data model, event types, job scheduling details, and WebSocket events - Expand docs/modules/sensors.md HA section from a stub into a full setup guide covering WebSocket config, ha: namespace, initial state fetch, and auth failure behaviour - Restructure docs/integrations/home-assistant.md to document both the direct WebSocket integration (recommended) and the push-via-REST alternative, with connection behaviour notes Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * epic: M4 Home Assistant Integration Client (#60) * Build HA WebSocket client service (#55) * chore: clean old automaker data + scaffold homeMaker-completion project Remove 16 legacy automaker project plans and 27 memory files inherited from the protoLabs Studio fork. Create homeMaker-completion project with 4 milestones: rebrand, sensor DB wiring, vendor UI restore, HA client. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove close-external-prs workflow that blocks all PRs homeMaker is a GitHub fork of automaker, so head.repo.fork evaluates to true for ALL pull requests — not just external ones. This causes every PR created by auto-mode agents to be immediately closed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: Update all protoLabs Studio UI references to homeMaker (#47) * feat: wire DB into SensorRegistryService for persistent history (#48) (#49) - Add BetterSqlite3.Database parameter to SensorRegistryService constructor - Add private db property, SensorReadingRow/AggregatedRow types, DEFAULT_RETENTION_DAYS constant - Persist sensor readings to sensor_readings SQLite table in report() - Move homemakerDb instantiation before SensorRegistryService creation in services.ts - Remove duplicate homemakerDb declaration; getHomemakerDb() singleton is now shared earlier Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add HAClientService for Home Assistant WebSocket integration Connects to HA via WebSocket API, authenticates with long-lived access token, subscribes to state_changed events, and auto-registers discovered entities as homeMaker sensors. Includes exponential-backoff reconnect and REST endpoints for status, connect, disconnect, and entity listing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add HA configuration UI (#56) * feat: restore vendor UI — route, nav item, CRUD view (#53) - Add /vendors route wired to VendorsView - Add Vendors nav item (Store icon) to sidebar - Create vendors-view with search, category filters, grid layout - Create vendor-card, vendor-detail-panel (edit/delete), add-vendor-dialog - Create use-vendors hook with full CRUD against /api/vendors Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: add Home Assistant configuration section to settings UI - Add HomeAssistantConfig type to GlobalSettings for URL, access token, and per-entity sync state persistence - Add /api/ha/test and /api/ha/entities routes proxying the HA REST API for connection testing and entity discovery - Create HASection settings component with connection status indicator, URL/token form, test connection, and entity sync toggle table - Wire HASection into settings view with 'home-assistant' nav item Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix prettier formatting in 10 files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Agent <agent@protolabsai.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: update board view presentation for home project management Rename board columns to home-friendly terminology (To Do, In Review, On Hold), update empty state descriptions to remove dev jargon, add default home categories (Maintenance, Renovation, Purchase, Research, DIY, Organization) to the category autocomplete, update the new task dialog title/placeholders/button text to use home language, and hide dev-specific card content (git branch name, PR URL). Underlying data model unchanged. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Agent <agent@protolabsai.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: fill in product identity — spec goals, terminology, and home-focused UI strings - spec.md: filled in Product Goals, Target Users (2-4 users across 1-2 households, Tailscale-only), Key Workflows (AI research, maintenance, inventory, budget), and Constraints (self-hosted, SQLite, no public internet exposure) - use-navigation.ts: renamed 'Family Chat' label to 'Household' - welcome-view.tsx: replaced 'Your autonomous AI development studio' with 'Your self-hosted home management hub'; replaced 'AI-powered development' with 'AI-powered research and planning' on the new project card Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove auto-generated TODO preamble from spec.md now that all sections are filled in Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Claude Agent <agent@protolabsai.com>
1 parent d961342 commit 9e8e367

File tree

112 files changed

+415
-12925
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+415
-12925
lines changed

apps/ui/src/components/layout/sidebar.tsx

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ const logger = createLogger('Sidebar');
66
import { cn, isMac } from '@/lib/utils';
77
import { useAppStore } from '@/store/app-store';
88
import { useActionableItemsStore } from '@/store/actionable-items-store';
9-
import { useCeremonyStore } from '@/store/ceremony-store';
109
import { useLoadActionableItems, useActionableItemEvents } from '@/hooks/use-actionable-items';
1110
import { useLoadCeremonyEntries, useCeremonyEventStream } from '@/hooks/use-ceremony-events';
1211
import { useKeyboardShortcuts, useKeyboardShortcutsConfig } from '@/hooks/use-keyboard-shortcuts';
@@ -28,7 +27,6 @@ import {
2827
import { XpBar } from './sidebar/xp-bar';
2928
import { useIsCompact } from '@/hooks/use-media-query';
3029
import { TrashDialog, OnboardingDialog } from './sidebar/dialogs';
31-
import { SIDEBAR_FEATURE_FLAGS } from './sidebar/constants';
3230
import {
3331
useSidebarAutoCollapse,
3432
useSpecRegeneration,
@@ -59,7 +57,6 @@ export function Sidebar() {
5957
moveProjectToTrash,
6058
specCreatingForProject,
6159
setSpecCreatingForProject,
62-
featureFlags,
6360
} = useAppStore();
6461

6562
const isCompact = useIsCompact();
@@ -92,9 +89,6 @@ export function Sidebar() {
9289
}
9390
}, [sidebarOpen, toggleSidebar]);
9491

95-
// Environment variable flags for hiding sidebar items
96-
const { hideSpecEditor } = SIDEBAR_FEATURE_FLAGS;
97-
9892
// Get customizable keyboard shortcuts
9993
const shortcuts = useKeyboardShortcutsConfig();
10094

@@ -108,9 +102,6 @@ export function Sidebar() {
108102
// Get unread actionable items count (drives the inbox badge)
109103
const unreadNotificationsCount = useActionableItemsStore((s) => s.unreadCount);
110104

111-
// Get unread ceremony event count
112-
const unreadCeremonyCount = useCeremonyStore((s) => s.unreadCount);
113-
114105
// State for delete project confirmation dialog
115106
const [showDeleteProjectDialog, setShowDeleteProjectDialog] = useState(false);
116107

@@ -164,9 +155,6 @@ export function Sidebar() {
164155
// Derive isCreatingSpec from store state
165156
const isCreatingSpec = specCreatingForProject !== null;
166157
const creatingSpecProjectPath = specCreatingForProject;
167-
// Check if the current project is specifically the one generating spec
168-
const isCurrentProjectGeneratingSpec =
169-
specCreatingForProject !== null && specCreatingForProject === currentProject?.path;
170158

171159
// Auto-collapse sidebar on small screens and update Electron window minWidth
172160
useSidebarAutoCollapse({ sidebarOpen, toggleSidebar: handleToggleSidebar });
@@ -258,10 +246,6 @@ export function Sidebar() {
258246
// Navigation sections and keyboard shortcuts (defined after handlers)
259247
const { navSections, navigationShortcuts } = useNavigation({
260248
shortcuts,
261-
hideSpecEditor: hideSpecEditor || !featureFlags.specEditor,
262-
hideDesigns: !featureFlags.designs,
263-
hideFileEditor: false,
264-
hideSystemView: !featureFlags.systemView,
265249
currentProject,
266250
projects,
267251
projectHistory,
@@ -271,8 +255,6 @@ export function Sidebar() {
271255
cyclePrevProject,
272256
cycleNextProject,
273257
unreadNotificationsCount,
274-
unreadCeremonyCount,
275-
isSpecGenerating: isCurrentProjectGeneratingSpec,
276258
});
277259

278260
// Register keyboard shortcuts

apps/ui/src/components/layout/sidebar/hooks/use-navigation.ts

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,15 @@ interface UseNavigationProps {
2929
projectPicker: string;
3030
cyclePrevProject: string;
3131
cycleNextProject: string;
32-
spec: string;
3332
notes: string;
34-
docs: string;
3533
board: string;
3634
settings: string;
37-
projectSettings: string;
38-
systemView: string;
3935
inbox: string;
40-
fileEditor: string;
41-
designs: string;
4236
calendar: string;
4337
todo: string;
4438
automations: string;
45-
projects: string;
4639
chat: string;
4740
};
48-
hideSpecEditor: boolean;
49-
hideDesigns: boolean;
50-
hideFileEditor: boolean;
51-
hideSystemView: boolean;
5241
currentProject: Project | null;
5342
projects: Project[];
5443
projectHistory: string[];
@@ -59,18 +48,10 @@ interface UseNavigationProps {
5948
cycleNextProject: () => void;
6049
/** Count of unread notifications to show on Notifications nav item */
6150
unreadNotificationsCount?: number;
62-
/** Count of unread ceremony events */
63-
unreadCeremonyCount?: number;
64-
/** Whether spec generation is currently running for the current project */
65-
isSpecGenerating?: boolean;
6651
}
6752

6853
export function useNavigation({
6954
shortcuts,
70-
hideSpecEditor,
71-
hideDesigns,
72-
hideFileEditor,
73-
hideSystemView,
7455
currentProject,
7556
projects,
7657
projectHistory,
@@ -80,8 +61,6 @@ export function useNavigation({
8061
cyclePrevProject,
8162
cycleNextProject,
8263
unreadNotificationsCount,
83-
unreadCeremonyCount,
84-
isSpecGenerating,
8564
}: UseNavigationProps) {
8665
// Build navigation sections
8766
const navSections: NavSection[] = useMemo(() => {
@@ -91,7 +70,6 @@ export function useNavigation({
9170
id: 'dashboard',
9271
label: 'Dashboard',
9372
icon: Home,
94-
shortcut: shortcuts.systemView,
9573
},
9674
{
9775
id: 'board',
@@ -130,7 +108,7 @@ export function useNavigation({
130108
},
131109
{
132110
id: 'chat-channel',
133-
label: 'Family Chat',
111+
label: 'Household',
134112
icon: MessageCircle,
135113
},
136114
{
@@ -172,8 +150,8 @@ export function useNavigation({
172150
},
173151
];
174152

175-
// Add Inbox and Project Settings as a standalone section (no label for visual separation)
176-
const inboxCount = (unreadNotificationsCount ?? 0) + (unreadCeremonyCount ?? 0);
153+
// Add Inbox and Settings as a standalone section (no label for visual separation)
154+
const inboxCount = unreadNotificationsCount ?? 0;
177155
sections.push({
178156
label: '',
179157
items: [
@@ -185,16 +163,16 @@ export function useNavigation({
185163
count: inboxCount || undefined,
186164
},
187165
{
188-
id: 'project-settings',
166+
id: 'settings',
189167
label: 'Settings',
190168
icon: Settings,
191-
shortcut: shortcuts.projectSettings,
169+
shortcut: shortcuts.settings,
192170
},
193171
],
194172
});
195173

196174
return sections;
197-
}, [shortcuts, unreadNotificationsCount, unreadCeremonyCount]);
175+
}, [shortcuts, unreadNotificationsCount]);
198176

199177
// Build keyboard shortcuts for navigation
200178
const navigationShortcuts: KeyboardShortcut[] = useMemo(() => {

apps/ui/src/components/views/analytics-view.tsx

Lines changed: 0 additions & 144 deletions
This file was deleted.

0 commit comments

Comments
 (0)