moai/.planning/phases/03-project-crud/03-03-PLAN.md
Mikkel Georgsen afab4f84e2 docs(03-03): complete project models/delete plan
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 18:55:52 +00:00

104 lines
3.3 KiB
Markdown

---
phase: 03-project-crud
plan: 03
type: execute
status: complete
completed: 2026-01-16
---
<objective>
Implement project model configuration and deletion commands to complete M2 milestone.
Purpose: Enable users to configure which AI models a project uses and delete unwanted projects.
Output: Working /project models and /project delete commands, completing full Project CRUD.
</objective>
<execution_context>
~/.claude/get-shit-done/workflows/execute-phase.md
~/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
# Prior plan context
@.planning/phases/03-project-crud/03-02-SUMMARY.md
# Relevant source files
@src/moai/core/services/project.py
@src/moai/bot/handlers/projects.py
**Established patterns:**
- Service layer handles database operations
- Handlers are thin, delegate to services
- user_data["selected_project_id"] for current project
</context>
<tasks>
<task type="auto">
<name>Task 1: Add update_models and delete_project to service</name>
<files>src/moai/core/services/project.py</files>
<action>
Add functions to project service:
- update_project_models(project_id: str, models: list[str]) -> Project | None:
Update project's models list, return updated project or None if not found.
- delete_project(project_id: str) -> bool:
Delete project by ID, return True if deleted, False if not found.
Cascade delete will handle discussions/rounds/messages via SQLAlchemy relationship config.
</action>
<verify>python -c "from moai.core.services.project import update_project_models, delete_project"</verify>
<done>Both functions exist and are importable</done>
</task>
<task type="auto">
<name>Task 2: Implement /project models and /project delete handlers</name>
<files>src/moai/bot/handlers/projects.py</files>
<action>
Extend project_command handler to support:
/project models claude,gpt,gemini:
- Require project to be selected first
- Parse comma-separated model names from args
- Update via service, confirm: "Models updated: claude, gpt, gemini"
- If no args: show current models list
/project delete <id>:
- Require explicit project ID (not name) for safety
- Delete via service, confirm: "Deleted project: {name}"
- If deleted project was selected, clear user_data["selected_project_id"]
- If not found: "Project not found."
Update /status handler (if exists) to show selected project info now that project CRUD is complete.
</action>
<verify>ruff check src/moai/bot/handlers/projects.py</verify>
<done>/project models updates models, /project delete removes project, M2 milestone complete</done>
</task>
</tasks>
<verification>
Before declaring plan complete:
- [ ] `ruff check src/moai/core/services/ src/moai/bot/handlers/` passes
- [ ] All service functions importable
- [ ] Full CRUD cycle works: new → select → info → models → delete
</verification>
<success_criteria>
- All tasks completed
- All verification checks pass
- /project models configures AI models for project
- /project delete removes project with confirmation
- M2 milestone complete (full project CRUD via Telegram)
</success_criteria>
<output>
After completion, create `.planning/phases/03-project-crud/03-03-SUMMARY.md`
Summary should note M2 milestone completion and readiness for Phase 4 (Single Model Q&A).
</output>