- Add notify job that runs when test or build fails
- Use curl to Slack webhook for Gitea compatibility
- Notify job depends on both test and build jobs
- Add test job with type checking, unit tests, and E2E tests
- Install Playwright browsers for E2E testing
- Upload coverage and playwright reports as artifacts
- Build job now depends on test job (fail-fast)
- Set global thresholds: statements 10%, branches 5%, functions 20%, lines 8%
- Current coverage: statements ~12%, branches ~7%, functions ~24%, lines ~10%
- Thresholds prevent regression, target is 80% (CI-01 decision)
- Thresholds will be increased incrementally as more tests are added
- CompletedToggle: 5 tests for checkbox rendering, state, and interaction
- SearchBar: 7 tests for input, placeholder, recent searches dropdown
- TagInput: 6 tests for rendering with various tag configurations
- Update vitest-setup-client.ts with $app/state, preferences, recentSearches mocks
- All component tests run in real Chromium browser via Playwright
- Add test fixture with seededDb for predictable test data
- Include 5 entries: tasks and thoughts with various states
- Include 3 tags with entry-tag relationships
- Export extended test with fixtures from tests/e2e/index.ts
- Install drizzle-seed dependency
- Set testDir to './tests/e2e' for E2E tests
- Configure single worker for database safety
- Add desktop and mobile viewports (Desktop Chrome, Pixel 5)
- Enable screenshots on failure, disable video
- Add webServer to auto-build and preview app
- Create separate docker config for deployment tests
- Test empty input handling
- Test query filter (min 2 chars, case insensitive, title OR content)
- Test tag filter (AND logic, case insensitive)
- Test type filter (task/thought/all)
- Test date range filter (start, end, both)
- Test combined filters
- Test generic type preservation
17 tests covering filterEntries.ts with 100% coverage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 2/2
- Deploy Grafana Alloy via Helm (DaemonSet on all 5 nodes)
- Verify log flow and remove Promtail
SUMMARY: .planning/phases/08-observability-stack/08-02-SUMMARY.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add helm/alloy Chart.yaml as umbrella chart for grafana/alloy
- Configure Alloy River config for Kubernetes pod log discovery
- Set up loki.write endpoint to forward logs to Loki
- Configure DaemonSet with control-plane tolerations for all 5 nodes
Replaces Promtail (EOL March 2026) with Grafana Alloy
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create ServiceMonitor template for Prometheus Operator discovery
- Add metrics.enabled and metrics.interval to values.yaml
- ServiceMonitor selects TaskPlanner pods via selectorLabels
- Scrapes /metrics endpoint every 30s by default
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- Test auto-sync by pushing a helm change
- Test self-heal by deleting a pod
- Checkpoint - Human verification (approved)
Phase 7 (GitOps Foundation) complete.
SUMMARY: .planning/phases/07-gitops-foundation/07-02-SUMMARY.md
- Change repo URL to admin/taskplaner (repo created under admin user)
- Update CI workflow image name to admin/taskplaner
- Update repo secret documentation with correct path
- Change repoURL to internal Gitea cluster service
- Remove inline registry secret placeholder (created via kubectl)
- Registry secret created separately for security
- Document taskplaner-repo secret structure for ArgoCD
- Secret created via kubectl (not committed) for security
- Uses internal cluster URL for Gitea access
- Add Gitea Actions workflow for building and pushing Docker images
- Configure ArgoCD Application for auto-sync deployment
- Update Helm values to use Gitea container registry
- Add setup documentation for GitOps configuration
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When a tag is deleted as orphaned, it's now automatically removed
from the active filter selection.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tags that are no longer associated with any entry are automatically
deleted from the database when a tag is removed from an entry.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove auto-parsing on collapse
- Add "Scan for #tags" button that parses from current textarea content
- Always show tags section with delete buttons
- Show help text when no tags exist
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move tag parsing from textarea blur to entry collapse action.
This prevents incomplete tags from being created while editing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Parse hashtags when content textarea loses focus (blur)
- Parse hashtags when QuickCapture form is submitted
- Add tag display with delete buttons in expanded entry view
- Remove automatic hashtag parsing during typing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tags are now automatically extracted from #hashtags in content text.
Removed TagInput from entry editing, keeping it only in FilterBar.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add basicAuth.enabled and basicAuth.htpasswd values
- Create middleware.yaml template for Secret and Traefik Middleware
- Update ingress to include middleware annotation when enabled
Usage:
helm upgrade taskplaner ./helm/taskplaner \
--set basicAuth.enabled=true \
--set basicAuth.htpasswd='admin:$apr1$...'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
SvelteKit adapter-node uses TASKPLANER_ envPrefix for config.
Kubernetes creates SERVICENAME_* env vars for each service.
Service named "taskplaner" creates TASKPLANER_PORT_* which conflicts.
Changes:
- Add service.name option (default: "tp-app")
- Update ingress to reference configured service name
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Includes:
- Deployment with health checks and resource limits
- Service (ClusterIP by default)
- PersistentVolumeClaim for data storage
- Optional Ingress with TLS support
- Configurable via values.yaml
Usage: helm install taskplaner ./helm/taskplaner
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>