feat(infra): add release versioning system - #337
Merged
Conversation
Remove savedDates/fetchSavedDates, deprecated comment blocks, autoMode(), "This Week" coming-soon box, stale router-view tags in PlanView/KanbanView/CalendarView/DashboardView, Change Password and OAuth Connections coming-soon sections from Settings, and smoke.test.ts.
…ler, system_context)
fix: remove stale SQLite-era Beacon block in message_handler
chore: retire orphaned prompts + fix stale constraint in prompt_sections
chore: backend quick-win dead-code cleanup
perf: eliminate N+1 queries in plan range and meetings
chore: remove confirmed dead code (Phase A)
Add plan_date? to Task interface, remove FollowupConfig re-export, replace all (task as any).plan_date / anchor_id casts in TaskCard.vue, type standaloneTask as Task|null, fix tautological ternary in TaskDetailPanel template, narrow v-else to v-else-if="task" for proper null safety.
Create src/lib/dateUtils.ts with localDateString/localToday/offsetDate. Remove duplicate implementations from plan.ts, DashboardView, PlanView, CalendarView, PlanWeekView, MiniCalendar. Export VOICE from useTheme and remove the duplicate mapping in main.ts. Extract genId() helper in useSlideOver. Rename internal fetch()→load() in useLinks, useDependencies, useSubtasks, useTaskContexts to stop shadowing the global fetch API.
Add scheduleTask, moveToBacklog, createPlanTask to plan store. Add patchEvent to events store. Extend backlog createTask signature. Migrate TaskDetailPanel (scheduleTask, moveToBacklog, deleteTask, linkMilestoneFromSearch), AnchorBlock (onRemove, onAddNewTask), DashboardView (onAddTaskToNow), KanbanView (onAddTask), CalendarView (event-edit recurrence path) to use store actions instead of api().
Update events.ts, events store, AnchorBlock, and App.vue comments to reflect that the backend contract has shipped. Remove references to fixture data and unimplemented stream tags (motif-db-api, is_paid).
fix: type fixes — plan_date on Task, remove any casts (Phase B)
refactor: extract dateUtils, VOICE export, fetch→load rename (Phase C)
refactor: raw SQL extraction, MoveTaskBody, Optional modernization, _validate_motif dedup
refactor: migrate components off direct api() calls (Phase D)
chore: remove stale comments (Phase E)
Without !reset, Docker Compose v2 concatenates sequences from the base file. ports: [] inherited 5432:5432 from base, colliding with production postgres on the same Pi host. volumes: [] merged pgdata and pgdata-dev onto the same container path. Both caused the dev postgres container to fail to start, making the hostname unresolvable to the API container.
fix: reset postgres ports+volumes in dev compose overlay
The per-service CI deploys use --no-deps, which bypasses depends_on. Postgres was never started by any workflow. Adding it to the force-deploy-all dev step ensures it gets started (and kept up via restart: unless-stopped) on full redeploys.
fix: start postgres in dev force-deploy workflow
alembic.ini was not copied into the Docker image, making `docker compose run --rm api alembic upgrade head` silently fail (alembic can't find its config). This also meant fresh dev postgres containers couldn't be initialized. Adds COPY alembic.ini to Dockerfile and a pi-deploy-db-dev.yml workflow that runs migrations against dev postgres on push to dev or manual dispatch.
fix: add alembic.ini to image and dev migration workflow
Alembic's env.py uses SQLAlchemy's synchronous engine_from_config which requires a sync driver. The dev image only had asyncpg. Adding psycopg2-binary>=2.9 gives alembic a sync driver so migrations run without ModuleNotFoundError.
Mirrors the defensive upper-bound pattern already used for cryptography and apscheduler — guards against a future psycopg2-binary 3.x wheel that could stall on the Pi's CDN/MTU path.
Add psycopg2-binary for alembic dev migrations
configure.py reads TETHER_COMPOSE_DIR to decide where to write the compose .env. Without it set, configure-db writes POSTGRES_PASSWORD and TETHER_APP_PASSWORD to ~/tether/.env (production) instead of ~/tether-dev/.env. The dev API then falls back to the tether_app_dev default, causing auth failures when the postgres role was created with a different password. Two fixes: 1. Set TETHER_COMPOSE_DIR=/home/toast/tether-dev on the build job so configure-db writes to the correct file. 2. Add an explicit ALTER ROLE step targeting the dev postgres via the correct compose project flags. This handles the case where tether_app already exists with a stale password. make configure-db also attempts this but omits -p tether-dev so it targets the wrong container.
Fix dev CI: write DB passwords to dev .env, sync tether_app role
In compose v5, !reset tags reset a field to its zero value (empty list for ports) and ignore the value that follows. !override replaces with the tagged value, which is the correct tag for substituting the prod port binding with a different dev port. Postgres keeps !reset [] since it intentionally wants no host ports.
Fix dev overlay ports: !override instead of !reset
sync dev with main
# Conflicts: # bot/message_handler.py
sync dev to main
… endpoint
- Dockerfile: inject TETHER_VERSION=dev ARG+ENV so all services can
read the deployed tag at runtime
- fly-deploy.yml: auto-bump patch from latest vX.Y.Z git tag on each
prod deploy; push new tag after success. Dev builds use same base
version with -dev.{sha7} suffix, no tag pushed. fetch-depth: 0
required so git tag -l sees all existing tags.
- api/main.py: add unauthenticated GET /api/version endpoint
jlunder00
force-pushed
the
feature/release-versioning
branch
from
May 10, 2026 05:44
43ff017 to
7c543c3
Compare
- pyproject.toml: reset version to 0.0.0 (start of proper semver)
- Dockerfile: TETHER_VERSION ARG+ENV baked into image at build time
- fly-deploy.yml: read TETHER_VERSION from pyproject.toml at deploy time;
dev builds append -dev.{sha7} suffix
- api/main.py: GET /api/version returns tether + premium versions
- scripts/release.sh: CLI release script (--patch/--minor/--major/--alpha)
- .github/workflows/release.yml: on tag push, create GitHub Release
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ARG TETHER_VERSION=dev+ENV TETHER_VERSION=${TETHER_VERSION}so every service in the image can read the deployed tag at runtimev{YYYY-MM-DD}-{sha7}(prod) /v{YYYY-MM-DD}-{sha7}-dev(dev) per deploy, passes it as--build-arg TETHER_VERSION, pushes a matching git tag after successful deploy; bumpspermissions: contentstowriteGET /api/version→{"version": "v2026-05-09-abc1234"}for easy runtime verificationNote: Pi build workflows (
pi-build.yml,pi-build-dev.yml) are under.github/workflows/archive/and not active — GitHub Actions ignores subdirectory files. Skipped for now; can be updated if reactivated. See companion PR in tether-premium for__version__wiring.How to verify after deploy
Test plan
maintriggers fly-deploy prod jobflyctlbuild completes withTETHER_VERSIONbaked inGET /api/versionreturns expected tag stringv{date}-{sha7}appears in repo after deployimport tether_premium; tether_premium.__version__returns tag (not "dev") in running container