Commit Graph

67 Commits

Author SHA1 Message Date
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
Paul Huliganga 2c85b80004 feat(frontend): initialize React + Vite project with TypeScript
- Created frontend/ directory using Vite with React + TypeScript template
- Installed React Router 7 for client-side routing
- Set up project structure: components/, hooks/, pages/, services/, types/
- Created Recipe and Tag TypeScript interfaces matching backend schema
- Added basic App.tsx with project status display
- Verified dev server starts successfully on port 5173
- Added frontend README with development instructions
- Updated TODO.md to mark task as complete
2026-03-24 00:27:17 -04:00
Paul Huliganga 8bec840330 docs: update TODO.md to mark recipe CRUD API tasks as complete 2026-03-24 00:14:21 -04:00
Paul Huliganga e2599b81f4 feat(api): implement recipe CRUD API endpoints
- Add Recipe type definitions (Recipe, CreateRecipeInput, UpdateRecipeInput)
- Implement RecipeRepository for database operations (CRUD + search)
- Implement RecipeService with business logic validation
- Create Express routes with Zod validation schemas
- Add database initialization module with auto-save functionality
- Implement comprehensive integration tests (16 tests, all passing)
- Support pagination, search filtering, and proper error handling
- Follow layered architecture pattern (Routes → Services → Repositories)

All tests passing (16/16). TypeScript strict mode enabled.
2026-03-24 00:13:58 -04:00
Paul Huliganga 394aa22df1 feat(db): enable schema migration using sql.js and export to data/recipes.db 2026-03-24 00:01:41 -04:00
Paul Huliganga 88acb93068 fix(deps): switch to sql.js to resolve Node v22 compatibility
- better-sqlite3 incompatible with Node.js v22.22.0 (V8 API changes)
- Switched to sql.js (pure JavaScript SQLite, zero native deps)
- Updated ARCHITECTURE.md to reflect new choice
- Added ADR-001 documenting decision rationale
- Enables autonomous development on WSL2/Node v22

Per agent-harness methodology: unblock environment issues pragmatically.
2026-03-24 00:00:59 -04:00
Paul Huliganga 07b9be50b9 build(backend): set up TypeScript with strict mode and build script 2026-03-23 23:45:09 -04:00
Paul Huliganga ed1f4f88be feat(backend): initialize Node.js project with Express 2026-03-23 23:40:36 -04:00
Paul Huliganga 84648bf0fa fix(harness): improve task clarity and error signaling per agent-harness methodology
- TODO.md: Split vague tasks into explicit, atomic steps with verification criteria
- AGENT_INSTRUCTIONS.md: Add STUCK/ERROR/ALL_TASKS_COMPLETE signals per harness docs
- AGENT_INSTRUCTIONS.md: Add OpenClaw environment notes (absolute paths, exit signals)

Fixes stuck agent issue by following canonical agent-harness pattern from docs/agent-harness/.
2026-03-23 23:39:02 -04:00
Paul Huliganga c86402f0ed docs: finalize project decisions and AI features vision
- Domain: recipes.paje.ca
- Users: Whole Huliganga family (Anne, Elizabeth, Paul, Joseph)
- Data migration: Export from CopyMeThat (if free tier allows)
- v1 priority: Recipe scraping first
- v2+ AI features: Ingredient substitutions, meal planning, shopping lists, nutrition tracking, Fintrove cost integration, voice/OCR input

Ready for agent kickoff.
2026-03-23 22:12:58 -04:00
Paul Huliganga 6552640cfa chore: initialize recipe-manager project with agentic harness
- PROJECT.md: Product vision, success criteria, constraints
- ARCHITECTURE.md: Tech stack, patterns, deployment strategy
- ROADMAP.md: MVP → v1 → v2 milestone planning
- AGENT_INSTRUCTIONS.md: Development workflow for autonomous agents
- README.md: Project overview and quick start
- TODO.md: Task tracking
- .gitignore: Standard Node.js/Docker exclusions

Project ready for first agent sprint (MVP development).
2026-03-23 22:03:14 -04:00