Commit Graph

60 Commits

Author SHA1 Message Date
Paul Huliganga 8afac385b0 Fix resume test: assert orchestrator checkpoint and retry semantics correctly for mid-run resumes (Task 1 remediation) 2026-03-26 13:31:06 -04:00
Paul Huliganga c434733f0c feat(harness): sequential orchestrator with checkpoint/retry/restart, tests + docs
- Add SequentialOrchestrator service for ordered phase execution, per-phase retry/backoff, and restart-safe checkpointing
- Persist phase attempt metadata (success/fail, attempts, timestamp, error)
- Expose importable callable interface
- Add full coverage unit tests for execution order, retry, checkpoint, and resume scenarios
- Update docs and README for usage and dev guidance
2026-03-26 13:28:19 -04:00
Paul Huliganga edc5ce03ad Visual polish: CookModePage + ImportUrlPage, global header/nav consistency, theme token styling, improved states (spacing, cards, buttons, empty/error/complete) 2026-03-25 18:38:50 -04:00
Paul Huliganga 855dc62207 feat(ui): visually polish RecipeDetailPage and RecipeForm with consistent theme tokens, improved layout, card sections, and input styling for UX parity with RecipeList 2026-03-25 18:31:07 -04:00
Paul Huliganga b7e7e9955e UI polish: Introduce visual theme tokens, refreshed RecipeList page & cards, improved empty/loading states 2026-03-25 18:25:37 -04:00
Paul Huliganga 2ffb1da919 Fix ImportUrlPage.tsx ingredient draft-edit type bridging: safe conversion between string[] UI state and RecipeDraft object[] shape. Preserves step 4 search+tag. 2026-03-25 16:59:41 -04:00
Paul Huliganga 14c0cbb94c Unify backend/frontend recipe search+tag filtering: backend search matches title, ingredient, tag; frontend list page has unified search input and tag filter bar wired to backend; tests for combined/ingredient/tag search; preserves existing features. 2026-03-25 14:17:45 -04:00
Paul Huliganga 055c7ddd1f fix(recipe-repo): normalize SQL params to avoid undefined binds 2026-03-25 11:09:25 -04:00
Paul Huliganga 3248e52057 Refactor backend to normalized ingredients/steps schema, remove tag color, update types/routes/services/tests. Blocking TS build error: all SQL params must be string|null; remaining bug is undefined may leak in RecipeRepository ingredient/step creation. See code for status. In-progress commit to checkpoint work. 2026-03-25 10:33:37 -04:00
Paul Huliganga fa2cceddc3 [migration] Normalize schema to MVP target: split recipes into ingredients and steps tables, drop JSON columns, adjust tags, update migration docs. WARNING: Tests fail until API and tests are refactored for new structure. 2026-03-25 10:25:45 -04:00
Paul Huliganga 23aa097458 feat(extension): add configurable Recipe Manager base URL settings 2026-03-25 04:42:25 -04:00
Paul Huliganga 272ce1d2f0 feat(mission-control): add live harness progress status panel 2026-03-25 00:46:21 -04:00
Paul Huliganga feb10fdb8b feat(extension): send page URL to import API from context menu 2026-03-25 00:37:18 -04:00
Paul Huliganga 97e55ab6c2 feat(extension): scaffold Manifest v3 browser extension 2026-03-25 00:22:33 -04:00
Paul Huliganga 9f49223df3 Add import telemetry logging for success and failure reasons 2026-03-25 00:07:38 -04:00
Paul Huliganga 1ca21889ca Add URL import retry/timeout handling and friendly failure messaging 2026-03-24 23:54:23 -04:00
Paul Huliganga d3eeeb2833 feat(import): add heuristic fallback parser for recipe URL imports 2026-03-24 23:43:41 -04:00
Paul Huliganga 3d07ff6a49 chore(harness): update recipe iteration keepalive status 2026-03-24 23:35:50 -04:00
Paul Huliganga 15ada9cb52 feat(frontend): add URL import error states 2026-03-24 23:24:30 -04:00
Paul Huliganga e1f5019006 feat(frontend): add edit-before-save flow for URL imports 2026-03-24 23:20:42 -04:00
Paul Huliganga 4c512a5161 docs(ops): add INCIDENT_LOG and link from RUNBOOK 2026-03-24 22:41:49 -04:00
Paul Huliganga 3e269a4d4c docs(runbook): add agent harness failure modes and recovery guide 2026-03-24 22:39:05 -04:00
Paul Huliganga d4aed475a2 feat(frontend): show parsed recipe preview on URL import 2026-03-24 22:34:47 -04:00
Paul Huliganga 276e03cc87 feat(frontend): add import from URL page and form 2026-03-24 22:07:36 -04:00
Paul Huliganga 87e9181e11 test(import): add malformed JSON-LD endpoint case 2026-03-24 22:02:10 -04:00
Paul Huliganga 37b17f7284 chore(harness): add mandatory pre-flight guard for working directory
- Require absolute-path existence check for AGENT_INSTRUCTIONS.md and TODO.md
- Fail fast with STUCK if harness files missing
- Prevent repeated bad-working-dir iterations
2026-03-24 21:50:33 -04:00
Paul Huliganga 3987083e46 feat(import): normalize parsed recipe into internal draft format 2026-03-24 21:47:27 -04:00
Paul Huliganga 64a1229ff0 feat(import): implement Schema.org Recipe JSON-LD parser and draft normalization for import endpoint 2026-03-24 20:37:46 -04:00
Paul Huliganga 146dc3325a feat(backend): add URL import endpoint foundation 2026-03-24 20:25:35 -04:00
Paul Huliganga 0653107f62 docs(harness): transition to v1 recipe-import phase
- Set current milestone to v1.0 Recipe Import
- Rebuilt TODO queue for phased import work (API -> UI -> fallback -> extension)
- Marked MVP as functionally complete with manual Docker host validation deferred
- Clarified agent task-selection rules to use TODO as authoritative queue
2026-03-24 20:23:54 -04:00
Paul Huliganga afdc915aa2 fix(backend): remove require() usage in ESM database saver
Use writeFileSync import instead of require('fs') to avoid runtime
ReferenceError in Node ESM mode during periodic DB saves.
2026-03-24 20:04:28 -04:00
Paul Huliganga e6d6d3f776 docs(readme): add setup and production deployment instructions for MVP 2026-03-24 18:51:59 -04:00
Paul Huliganga c885381d3a docs(user-guide): add MVP user guide and mark task complete 2026-03-24 18:41:43 -04:00
Paul Huliganga ce839e3ce1 docs(api): add initial API documentation for all endpoints (MVP) 2026-03-24 18:06:35 -04:00
Paul Huliganga 1a4b984d2c chore(devops): mark 'Test local deployment' as blocked (no Docker in environment) 2026-03-24 17:52:50 -04:00
Paul Huliganga 2497747e8b docs: update TODO.md - mark docker-compose task complete (iteration 16) 2026-03-24 08:14:11 -04:00
Paul Huliganga 853374f060 feat(devops): add docker-compose orchestration with nginx API proxy
- Created docker-compose.yml with backend and frontend services
- Backend: Node.js API on port 3000 with SQLite volume persistence
- Frontend: nginx on port 8080 with health checks and restart policies
- Configured nginx to proxy /api/* requests to backend service
- Updated frontend API client to use relative URLs (/api instead of http://localhost:3000/api)
- Added Vite dev server proxy for local development workflow
- Implemented health checks for both services with service dependency
- Created comprehensive documentation in docs/docker-compose.md
- Verified: docker-compose.yml syntax is valid YAML

Next step: Test local deployment (docker compose up)
2026-03-24 08:12:55 -04:00
Paul Huliganga 210514fc1f docs: update TODO.md for iteration 15 completion 2026-03-24 07:58:16 -04:00
Paul Huliganga 1504986d0b feat(docker): add frontend Dockerfile with nginx configuration
- Created multi-stage Dockerfile for frontend build and deployment
- Builder stage: npm ci, TypeScript compilation, Vite build
- Production stage: nginx Alpine serving static assets
- Added nginx.conf with SPA routing, gzip compression, security headers
- Created frontend/.dockerignore to optimize build context
- Added health check endpoint at /health for container orchestration
- Documented build strategy, optimization, and deployment in docs/docker-frontend.md
- Verified: npm build succeeds (Docker build pending availability)
2026-03-24 07:57:11 -04:00
Paul Huliganga 4bce1d3bf1 feat(devops): add backend Dockerfile with multi-stage build
- Created production-ready Dockerfile for Node.js 22 backend
- Implemented multi-stage build for optimized image size
- Added .dockerignore to exclude unnecessary files from build
- Included database migration on container startup
- Created docker-backend.md documentation
- Verified: npm build and npm test pass (34/34 tests)
2026-03-24 07:42:13 -04:00
Paul Huliganga 56ef7e0457 docs: mark error handling task complete in TODO.md 2026-03-24 04:28:55 -04:00
Paul Huliganga 6b0f2e10c6 feat(frontend): add comprehensive error handling and toast notifications
- Created Toast component with slide-in animation for success/error/info/warning messages
- Created useToast hook for managing toast notifications globally
- Added ToastContext to App.tsx for sharing toast functionality across components
- Implemented ErrorBoundary component to catch and display React errors gracefully
- Updated RecipeDetailPage to show toast notifications for all operations (create, update, delete, tag management)
- Updated TagSelector to use toast notifications instead of alert()
- Added proper error handling for all API operations with user-friendly messages
- Added loading states for delete operation
- Verified: All 34 backend tests passing, frontend builds successfully
2026-03-24 04:28:28 -04:00
Paul Huliganga 9b6d4d50e2 docs(todo): verify and mark text search as complete
Text search functionality was already implemented in previous iterations:
- Backend: RecipeRepository searches title, description, and ingredients
- API: Zod validation accepts search parameter
- Tests: Integration test confirms search works (34/34 passing)
- Frontend: useRecipes hook passes search to API, UI has search input
- Feature verified working end-to-end
2026-03-24 04:11:49 -04:00
Paul Huliganga dbdbcf43fa feat(tags): implement tag management with create, assign, and display functionality
Backend:
- Add Tag type definitions (Tag, CreateTagInput, UpdateTagInput)
- Implement TagRepository with CRUD and recipe assignment methods
- Implement TagService with business logic and validation
- Create tag API routes (GET, POST, PUT, DELETE /api/tags)
- Add recipe-tag assignment endpoints (POST/DELETE /api/tags/recipes/:id/tags)
- Write 18 integration tests for tag functionality (all passing)
- Mount tag routes in main Express app

Frontend:
- Extend API client with tag CRUD and assignment methods
- Create useTags hook for tag state management
- Create TagSelector component for tag selection with inline tag creation
- Update RecipeForm to accept initialTags and pass selected tags to onSubmit
- Update RecipeDetailPage to fetch, display, and manage recipe tags
- Update RecipeCard to display tags with custom colors
- Add tag filter UI to RecipeListPage (note: backend filtering pending)
- Display tags in recipe detail view with color styling

Testing:
- All 34 backend tests passing (16 recipe + 18 tag tests)
- Frontend builds successfully with TypeScript strict mode
- Tag assignment and removal working end-to-end

Note: Tag filtering in recipe list shows UI but doesn't filter results yet.
Backend support for tag-based filtering can be added in future iteration.
2026-03-24 04:02:51 -04:00
Paul Huliganga 36489a3f85 feat(frontend): implement cook mode UI with wake lock and progress tracking 2026-03-24 03:41:58 -04:00
Paul Huliganga 67a9a8ce16 feat(frontend): implement recipe detail/edit page with full CRUD functionality
- Created useRecipe hook for fetching single recipe with loading/error states
- Created RecipeForm component with comprehensive validation
  - Title, ingredients, and instructions marked as required fields
  - One ingredient/instruction per line with textarea inputs
  - Optional metadata: servings, prep time, cook time, source URL, notes
  - Real-time form validation with error messaging
- Implemented RecipeDetailPage with three modes:
  - Create mode: /recipe/new route for adding new recipes
  - View mode: Display recipe with formatted ingredients and instructions
  - Edit mode: Toggle to edit existing recipe with pre-populated form
- Added delete functionality with two-step confirmation
- Included metadata cards for servings, prep time, and cook time
- Added navigation: Cook Mode button, back to list link
- Styled with Tailwind CSS for consistent UI/UX
- Verified TypeScript compilation and Vite build succeed
- Updated TODO.md to mark task complete
2026-03-24 03:27:51 -04:00
Paul Huliganga c6c5d0e3f4 feat(frontend): implement recipe list page with search and pagination
- Create API client service (src/services/api.ts) with all CRUD operations
- Create useRecipes hook for data fetching with search and pagination
- Create RecipeCard component for displaying individual recipes
- Implement RecipeListPage with search bar, empty state, and error handling
- Add grid layout with responsive design (1-3 columns)
- Implement 'Load More' button for pagination
- Add recipe metadata display (servings, time, last cooked)
- Update TODO.md to mark task as complete
2026-03-24 03:12:27 -04:00
Paul Huliganga 94c061a850 feat(frontend): set up React Router with page components and navigation
- Updated main.tsx to wrap App in BrowserRouter
- Configured routes in App.tsx with header navigation
- Created page components: RecipeListPage, RecipeDetailPage, CookModePage, NotFoundPage
- Added active link highlighting for current route
- Defined routes: / (list), /recipe/new, /recipe/:id, /recipe/:id/cook, * (404)
- Updated TODO.md to mark React Router task as complete
- Verified build and dev server work correctly
2026-03-24 02:56:49 -04:00
Paul Huliganga 427fa46cf0 feat(frontend): configure Tailwind CSS v4 with PostCSS
- Install tailwindcss, postcss, autoprefixer, and @tailwindcss/postcss
- Create tailwind.config.js with content paths for all source files
- Create postcss.config.js with Tailwind and Autoprefixer plugins
- Update index.css with Tailwind directives (@tailwind base/components/utilities)
- Update App.tsx to demonstrate Tailwind utility classes
- Verify both build and dev server work correctly
- Update TODO.md to mark task as complete
2026-03-24 00:42:34 -04:00
Paul Huliganga 63c77d226a docs: add Gitea repository URL to README 2026-03-24 00:39:25 -04:00