Phase 03: Project CRUD - 3 plans created - 6 total tasks defined - Covers M2 milestone (full project management) Plan breakdown: - 03-01: Project service + /projects, /project new - 03-02: /project select, /project info - 03-03: /project models, /project delete Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
3.8 KiB
| phase | plan | type |
|---|---|---|
| 03-project-crud | 01 | execute |
Purpose: Enable users to list existing projects and create new ones via Telegram. Output: Working project service with list/create functions and corresponding handlers.
<execution_context> ~/.claude/get-shit-done/workflows/execute-phase.md ~/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.mdPrior phase context
@.planning/phases/02-bot-core/02-02-SUMMARY.md
Relevant source files
@src/moai/core/models.py @src/moai/core/database.py @src/moai/bot/handlers/init.py @src/moai/bot/handlers/commands.py
Established patterns:
- SQLAlchemy 2.0 async with get_session() context manager
- Handler pattern: async def xxx_command(update, context) -> None
- Markdown parse_mode for formatted output
Constraining decisions:
- String(36) for UUID storage
- JSON type for models list
- expire_on_commit=False for async session usability
Use get_session() context manager for database operations. Return the refreshed objects after commit. Default models list to ["claude", "gpt", "gemini"] if not provided. python -c "from moai.core.services.project import list_projects, create_project, get_project" Service module imports without errors, all three functions defined
Task 2: Implement /projects and /project new handlers src/moai/bot/handlers/projects.py, src/moai/bot/handlers/__init__.py Create projects.py with: - projects_command: List all projects with name and ID, or "No projects yet" message - project_new_command: Parse quoted name from args (e.g., /project new "My Project"), create project, confirm creationHandle edge cases:
- /project new without name: Reply "Usage: /project new "Project Name""
- Empty project list: Reply "No projects yet. Use /project new "Name" to create one."
Register handlers in init.py:
- CommandHandler("projects", projects_command)
- CommandHandler with MessageHandler for "project" + args pattern (use ConversationHandler or simple args parsing)
For /project subcommands, use a single handler that parses context.args[0] to determine action (new/select/delete/models/info). ruff check src/moai/bot/handlers/projects.py && python -c "from moai.bot.handlers.projects import projects_command, project_command" /projects lists projects, /project new "Name" creates project with confirmation message
Before declaring plan complete: - [ ] `ruff check src/moai/core/services/ src/moai/bot/handlers/projects.py` passes - [ ] `python -c "from moai.core.services.project import list_projects, create_project"` succeeds - [ ] `python -c "from moai.bot.handlers.projects import projects_command, project_command"` succeeds<success_criteria>
- All tasks completed
- All verification checks pass
- No TypeScript errors
- Project service provides list/create/get functions
- /projects command lists all projects
- /project new "Name" creates a project and confirms </success_criteria>