- 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>
- Archive roadmap, requirements, and audit to .planning/milestones/
- Update PROJECT.md with validated requirements and decisions
- Reset STATE.md for next milestone cycle
- Create MILESTONES.md for project history
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All 31 requirements satisfied, 6/6 phases verified, 96% integration score.
Ready for milestone completion.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Quick Start with docker-compose commands
- Configuration with key environment variables
- Reverse proxy setup instructions
- Data persistence and volume info
- Backup and restore procedures
- Health check verification
- .env.example documents all configuration options
- backup.sh creates timestamped archive of Docker volume
- Supports custom volume name via VOLUME_NAME env var
- Update db/index.ts to read data directory from env var
- Update storage.ts to read data directory from env var
- Both default to ./data for local development
- Create Dockerfile with multi-stage build using node:22-alpine
- Run as non-root 'nodejs' user for security
- Add HEALTHCHECK for container orchestration
- Create docker-compose.yml with taskplaner_data named volume
- Add .dockerignore to optimize build context
- Install @sveltejs/adapter-node as dev dependency
- Configure adapter with out: 'build', precompress: true
- Set envPrefix to 'TASKPLANER_' for environment variables
Tasks completed: 3/3
- Create recent searches store and add dropdown UI
- Integrate filtering into EntryList with flat list mode
- Add highlighting to EntryCard and integrate search UI
SUMMARY: .planning/phases/05-search/05-03-SUMMARY.md
- Add searchQuery prop to EntryCard for text highlighting
- Use {@html highlightText()} for title and content in collapsed view
- Integrate SearchBar and FilterBar in +page.svelte
- Add search/filter state with reactive sync to filters.query
- Pass recentSearches store to SearchBar
- Update filterEntries to use generics for type preservation
- Add filters and searchQuery props to EntryList
- Apply filterEntries via $derived for reactive filtering
- Display flat list (no pinned separation) when filtering
- Show search-specific empty state when no matches
- Pass searchQuery to EntryCard for highlighting
- Add recentSearches persisted store with 5-item limit
- Add addRecentSearch() function for deduplication
- Update SearchBar with recentSearches dropdown
- Show dropdown on focus when input empty
- Use onmousedown to handle selection before blur
- Add to recent searches on blur with >= 2 chars