major-domo-v2/CLAUDE.md
Cal Corum 2c6cc499fa
Some checks failed
Build Docker Image / build (pull_request) Failing after 15s
Audit and compress CLAUDE.md from 775 to 67 lines
Remove historical changelogs, redundant documentation references,
and content already covered by parent/sub-directory CLAUDE.md files.
Update deployment section to reflect Gitea Actions workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:24:22 -06:00

68 lines
2.3 KiB
Markdown

# Discord Bot v2.0
SBA fantasy league Discord bot. discord.py with async Python, Pydantic models, FastAPI backend.
## Commands
- Run: `python bot.py`
- Test: `python -m pytest --tb=short -q`
- Test specific: `python -m pytest tests/test_services.py -v`
## IMPORTANT: Patterns That Prevent Real Bugs
### Docker Hub Repository Name
```
manticorum67/major-domo-discordapp
```
There is NO DASH between "discord" and "app". Not `discord-app`, not `discordapp-v2`.
### Git Workflow
NEVER commit directly to `main`. Always use feature branches:
```bash
git checkout -b feature/name # or fix/name
```
### Double Emoji in Embeds
`EmbedTemplate.success/error/warning/info/loading()` auto-add emoji prefixes.
- Do NOT put emoji in the `title` parameter of these methods (causes double emoji)
- Use `EmbedTemplate.create_base_embed()` when you want custom emoji in titles
### Autocomplete Functions
Define autocomplete as standalone functions OUTSIDE the class, not as methods.
- See `commands/players/info.py:20-67` for canonical example
### Model Requirements
- Database entities require `id` fields: `Player(id=123, ...)`, `Team(id=456, ...)`
- Use explicit None checks (`if obj is None:`) not `if not obj:`
- Use "Raise or Return" pattern - don't return Optional unless specifically required
### New Commands Must Use
```python
from utils.decorators import logged_command
from utils.logging import get_contextual_logger
class MyCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.logger = get_contextual_logger(f'{__name__}.MyCog') # Required
@discord.app_commands.command(name="example")
@logged_command("/example")
async def example(self, interaction, param: str):
# Business logic only - decorator handles logging, timing, errors
```
## Deployment
Builds and deploys are handled by Gitea Actions. Just create a PR to `main`:
```bash
/home/cal/.claude/scripts/gitea-create-pr.sh cal/major-domo-bot <branch> main "title" "description"
```
Gitea validates the version, builds the Docker image, and deploys on merge.
## API Reference
- OpenAPI spec: https://sba.manticorum.com/api/openapi.json (use WebFetch for current endpoints)
## Sub-directory Documentation
Each package has its own CLAUDE.md with detailed patterns:
`commands/`, `services/`, `models/`, `views/`, `tasks/`, `tests/`, `utils/`