fix: enforce alpha versioning (0.0.x), delete erroneous 0.1.x releases (#526)
Some checks failed
ci/woodpecker/push/api Pipeline failed
ci/woodpecker/push/web Pipeline failed
ci/woodpecker/push/orchestrator Pipeline failed

Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
This commit was merged in pull request #526.
This commit is contained in:
2026-02-27 01:22:12 +00:00
committed by jason.woltje
parent ad99cb9a03
commit bf299bb672
12 changed files with 108 additions and 24 deletions

View File

@@ -8,7 +8,7 @@
"status": "active",
"task_prefix": "",
"quality_gates": "",
"milestone_version": "0.0.1",
"milestone_version": "0.0.20",
"milestones": [],
"sessions": []
}

View File

@@ -46,6 +46,21 @@ pnpm lint
pnpm build
```
## Versioning Protocol (HARD GATE)
**This project is ALPHA. All versions MUST be `0.0.x`.**
- The `0.1.0` release is FORBIDDEN until Jason explicitly authorizes it.
- Every milestone bump increments the patch: `0.0.20``0.0.21``0.0.22`, etc.
- ALL package.json files in the monorepo MUST stay in sync at the same version.
- Use `scripts/version-bump.sh <version>` to bump — it enforces the alpha constraint and updates all packages atomically.
- The script rejects any version >= `0.1.0`.
- When creating a release tag, the tag MUST match the package version: `v0.0.x`.
**Milestone-to-version mapping** is defined in the PRD (`docs/PRD.md`) under "Delivery/Milestone Intent". Agents MUST use the version from that table when tagging a milestone release.
**Violation of this protocol is a blocking error.** If an agent attempts to set a version >= `0.1.0`, stop and escalate.
## Standards and Quality
- Enforce strict typing and no unsafe shortcuts.

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/api",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"scripts": {
"build": "nest build",

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/orchestrator",
"version": "0.0.6",
"version": "0.0.20",
"private": true,
"scripts": {
"dev": "nest start --watch",

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/web",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"scripts": {
"build": "next build",

View File

@@ -40,7 +40,7 @@ Design system + app shell + dashboard page. PRs #451-454.
- Dashboard page: metrics strip, orchestrator sessions, quick actions, activity feed, token budget
- Grain overlay texture
### Go-Live MVP (v0.1.0) — Complete
### Go-Live MVP (v0.0.16) — Complete
Dashboard polish, task ingestion pipeline, agent cycle visibility, deploy + smoke test. PRs #458, #460, #462, #464.
@@ -51,9 +51,9 @@ Dashboard polish, task ingestion pipeline, agent cycle visibility, deploy + smok
- WebSocket emits for job status/progress/step events
- Dashboard auto-refresh with polling + progress bars + step status indicators
- Deployed to mosaic.woltje.com, auth working via Authentik
- Release tag v0.1.0
- Release tag v0.0.16
### MS16+MS17-PagesDataIntegration (v0.1.1) — Complete
### MS16+MS17-PagesDataIntegration (v0.0.17) — Complete
All pages built + wired to real API data. PRs #470-484 (15 PRs). Issues #466-469.
@@ -69,7 +69,7 @@ All pages built + wired to real API data. PRs #470-484 (15 PRs). Issues #466-469
- All 5125 tests passing, CI pipeline #585 green
- Deployed and smoke-tested at mosaic.woltje.com
### MS18-ThemeWidgets (v0.1.2) — Complete
### MS18-ThemeWidgets (v0.0.18) — Complete
Theme package system, widget registry, WYSIWYG editor, Kanban filtering. PRs #493-505. Issues #487-491.
@@ -86,7 +86,7 @@ Theme package system, widget registry, WYSIWYG editor, Kanban filtering. PRs #49
- Kanban board filtering by project, assignee, priority, search with URL persistence
- 1,195 web tests, 3,243 API tests passing
### MS19-ChatTerminal (v0.1.3) — In Progress
### MS19-ChatTerminal (v0.0.19) — Complete
Real terminal with PTY backend, chat streaming, orchestrator integration. PRs #515-522. Issues #508-512.
@@ -100,7 +100,7 @@ Real terminal with PTY backend, chat streaming, orchestrator integration. PRs #5
- Agent output terminal: SSE streaming from orchestrator, lifecycle indicators, read-only view
- Command autocomplete with keyboard navigation in chat input
- 328 MS19-specific tests (268 web + 60 API), 4744 total passing
- Pending: deployment and smoke testing
- Deployed and smoke-tested at mosaic.woltje.com (CI #635 green)
### Bugfix: API Global Prefix (post-MS18) — Complete
@@ -363,7 +363,7 @@ This is the active mission scope. MS16 (Pages) and MS17 (Backend Integration) ar
9. ~~Lint, typecheck, and existing tests pass~~ DONE
10. ~~Grain overlay texture from reference is applied~~ DONE
### Go-Live MVP (v0.1.0) — COMPLETE
### Go-Live MVP (v0.0.16) — COMPLETE
11. ~~Dashboard widgets wired to real API data~~ DONE
12. ~~WebSocket emits for agent job lifecycle~~ DONE
@@ -492,14 +492,14 @@ These 19 NestJS modules are already implemented with Prisma and available for fr
| Milestone | Version | Focus | Status |
| ------------------------------ | ------- | ----------------------------------------------------------------- | ----------- |
| MS15-DashboardShell | 0.0.15 | Design system + app shell + dashboard page | COMPLETE |
| Go-Live MVP | 0.1.0 | Dashboard polish, ingestion, agent visibility, deploy | COMPLETE |
| MS16+MS17-PagesDataIntegration | 0.1.1 | All pages built + wired to real API data | COMPLETE |
| MS18-ThemeWidgets | 0.1.2 | Theme package system, widget registry, WYSIWYG, Kanban filtering | COMPLETE |
| MS19-ChatTerminal | 0.1.3 | Global terminal, project chat, master chat session | COMPLETE |
| MS20-MultiTenant | 0.2.0 | Multi-tenant, teams, RBAC, RLS enforcement, break-glass auth | NOT STARTED |
| MS21-Federation | 0.2.x | Federation (M-M, M-S), 3 instances, key exchange, data separation | NOT STARTED |
| MS22-AgentTelemetry | 0.2.x | Agent task mapping, telemetry, wide-event logging | NOT STARTED |
| MS23-Testing | 0.2.x | Playwright E2E, federation tests, documentation finalization | NOT STARTED |
| Go-Live MVP | 0.0.16 | Dashboard polish, ingestion, agent visibility, deploy | COMPLETE |
| MS16+MS17-PagesDataIntegration | 0.0.17 | All pages built + wired to real API data | COMPLETE |
| MS18-ThemeWidgets | 0.0.18 | Theme package system, widget registry, WYSIWYG, Kanban filtering | COMPLETE |
| MS19-ChatTerminal | 0.0.19 | Global terminal, project chat, master chat session | COMPLETE |
| MS20-MultiTenant | 0.0.20 | Multi-tenant, teams, RBAC, RLS enforcement, break-glass auth | NOT STARTED |
| MS21-Federation | 0.0.21 | Federation (M-M, M-S), 3 instances, key exchange, data separation | NOT STARTED |
| MS22-AgentTelemetry | 0.0.22 | Agent task mapping, telemetry, wide-event logging | NOT STARTED |
| MS23-Testing | 0.0.23 | Playwright E2E, federation tests, documentation finalization | NOT STARTED |
## Assumptions

View File

@@ -1,6 +1,6 @@
{
"name": "mosaic-stack",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"type": "module",
"packageManager": "pnpm@10.19.0",

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/cli-tools",
"version": "0.0.1",
"version": "0.0.20",
"description": "CLI tools for Mosaic Stack orchestration - git operations for Gitea/GitHub",
"private": true,
"bin": {

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/config",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"type": "module",
"exports": {

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/shared",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"main": "./dist/index.js",
"types": "./dist/index.d.ts",

View File

@@ -1,6 +1,6 @@
{
"name": "@mosaic/ui",
"version": "0.0.1",
"version": "0.0.20",
"private": true,
"type": "module",
"exports": {

69
scripts/version-bump.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/usr/bin/env bash
# version-bump.sh — Bump version across all workspace packages
#
# Usage:
# scripts/version-bump.sh <new-version>
# scripts/version-bump.sh 0.0.21
#
# Enforces:
# - Version MUST be 0.0.x (alpha constraint)
# - All package.json files are updated atomically
# - Rejects 0.1.0+ until explicitly unlocked
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
if [[ $# -ne 1 ]]; then
echo "Usage: $0 <version>"
echo "Example: $0 0.0.21"
exit 1
fi
NEW_VERSION="$1"
# Hard gate: alpha constraint (0.0.x only)
if [[ ! "$NEW_VERSION" =~ ^0\.0\.[0-9]+$ ]]; then
echo "ERROR: Version must be 0.0.x (alpha). Got: $NEW_VERSION"
echo ""
echo "This project is in ALPHA. Versions >= 0.1.0 are not allowed."
echo "If this constraint needs to change, update AGENTS.md and this script."
exit 1
fi
# Patch number must be > 0
PATCH="${NEW_VERSION##0.0.}"
if [[ "$PATCH" -lt 1 ]]; then
echo "ERROR: Patch version must be >= 1. Got: $NEW_VERSION"
exit 1
fi
# Find all package.json files in the monorepo
PACKAGE_FILES=(
"$REPO_ROOT/package.json"
)
for dir in "$REPO_ROOT"/apps/*/package.json "$REPO_ROOT"/packages/*/package.json; do
[[ -f "$dir" ]] && PACKAGE_FILES+=("$dir")
done
echo "Bumping all packages to $NEW_VERSION"
echo ""
for pkg in "${PACKAGE_FILES[@]}"; do
REL_PATH="${pkg#"$REPO_ROOT"/}"
OLD_VERSION=$(grep -o '"version": "[^"]*"' "$pkg" | head -1 | cut -d'"' -f4)
# Use node for reliable JSON editing (preserves formatting better than sed)
node -e "
const fs = require('fs');
const path = '$pkg';
const raw = fs.readFileSync(path, 'utf8');
const updated = raw.replace(/\"version\": \"[^\"]*\"/, '\"version\": \"$NEW_VERSION\"');
fs.writeFileSync(path, updated);
"
echo " $REL_PATH: $OLD_VERSION -> $NEW_VERSION"
done
echo ""
echo "Done. $NEW_VERSION applied to ${#PACKAGE_FILES[@]} packages."
echo "Next steps: commit, tag (v$NEW_VERSION), push."