Vue 3 + TypeScript ChurchTools extension for dashboard functionality with modular card-based architecture.
npm run dev- Start development server (use with exec_preview)npm run build- Build for productionnpm run lint- Type check and format validationnpm run format- Auto-format codenpm run clean- Clean build artifacts
src/components/- Modular dashboard componentssrc/components/common/BaseCard.vue- Reusable card componentsrc/components/common/AdminTable.vue- Data table component.tmp/- Screenshots and temporary files (not versioned)
ALWAYS use correct ChurchTools API pattern:
✅ Correct:
churchtoolsClient.get("/api/endpoint", { param1: "value1", param2: "value2" })❌ Wrong:
churchtoolsClient.get("/api/endpoint", { params: { param1: "value1" } })API Response Structure:
- ChurchTools client returns the content of
datadirectly - OpenAPI spec shows
{ data: [...], meta: {...} }but client unwraps this - Use
responsedirectly, notresponse.data
Always use centralized getChurchtoolsBaseUrl() function for URL building:
✅ Correct (in src/services/churchtools.ts):
import { getChurchtoolsBaseUrl } from "../../services/churchtools"
const baseUrl = getChurchtoolsBaseUrl()
const url = new URL(baseUrl)
url.searchParams.set("q", "churchcal")
// ... build URL❌ Wrong (repeating logic):
const baseUrl = import.meta.env.DEV ? import.meta.env.VITE_BASE_URL : window.location.originWhy: Centralized function ensures consistency across dev/prod and avoids duplication. Works with npm run dev (VITE_BASE_URL) and production (window.location.origin).
Follow this pattern for new modules:
src/components/[module-name]/
├── [Module]Card.vue # Dashboard card using BaseCard
├── [Module]Admin.vue # Admin panel using AdminTable
└── use[Module].ts # Vue 3 composable with API logic
See working examples:
src/components/expiring-appointments/ExpiringAppointmentsCard.vuesrc/components/automatic-groups/AutomaticGroupsCard.vuesrc/components/tags/TagsCard.vue
See working examples:
src/components/tags/TagsAdmin.vuesrc/components/expiring-appointments/ExpiringAppointmentsAdmin.vuesrc/components/automatic-groups/AutomaticGroupsAdmin.vue
See working examples:
src/components/tags/useTags.tssrc/components/expiring-appointments/useExpiringAppointments.tssrc/components/automatic-groups/useAutomaticGroups.ts
- Examine existing components for patterns
- Use BaseCard + AdminTable for consistent UI
- Follow TypeScript interfaces for data structures
- Use ChurchTools design classes (ct-btn, ct-card, ct-select)
- Test with exec_preview on port 5173
- Run npm run lint before completion
- NEVER run the development server when expecting the user to test manually. Only use exec_preview for agent testing.
- NEVER make commits on your own behalf. Always ask the user before committing changes.
- CREATE session documentation at start of significant work, UPDATE throughout with timestamps.
- FINALIZE session docs and extract key insights to LESSONS-LEARNED.md when user indicates work is complete.
Proactive Commit Suggestions:
- Suggest commits after completing logical units of work
- Remind user to commit before starting new features
- Propose commits when tests pass and code is stable
- Recommend commits at end of development phases
- Create module directory in
src/components/ - Implement Card component using BaseCard
- Implement Admin component using AdminTable
- Create composable for data logic
- Add route to App.vue
For significant development work, create session documentation:
Naming: docs/DEVELOPMENT_SESSION_YYYY-MM-DD[_Feature_Name].md
Template:
# Development Session - YYYY-MM-DD
## Session Overview
**Started**: HH:MM
**Branch**: `feature/branch-name`
**Focus**: Brief description
## Major Accomplishments
### Phase 1: Feature Implementation (HH:MM-HH:MM)
- **Goal**: What was intended
- **Result**: What was achieved
- **Code Changes**: Key files modified
_Add more phases as needed with timestamps_
## Technical Decisions
### Decision: Title (HH:MM)
**Context**: Why needed
**Decision**: What was chosen and why
**Impact**: Effect on codebase
## Next Steps
- [ ] Follow-up tasks
- [ ] Future improvements
## Lessons Learned
- Session-specific insights
- What worked/didn't work in this session
- Immediate takeaways
_Keep brief - detailed lessons go to LESSONS-LEARNED.md_Session Workflow:
- Create session documentation when starting significant development work
- Update session doc throughout the work with timestamps
- When user indicates session is complete, finalize documentation and extract key insights to
docs/LESSONS-LEARNED.md:
# 🎓 Lessons Learned YYYY-MM-DD
### 1. Lesson Title
**Problem**: What challenge was faced
**Solution**: How it was solved
**Application**: When to use this knowledge
_Extract only significant, reusable insights from session docs_- API calls failing: Check ChurchTools session and permissions
- Build errors: Run
npm run clean && npm run reinstall - Type errors: Run
npm run type-check - Format errors: Run
npm run format