docs(roadmap): update task statuses — 59% complete (165/278 tasks)
Cross-referenced every task against actual codebase state: - Phase 0: 14/14 ✅ (scaffolding complete) - Phase 1A: 22/23 ✅ (errors — Docker verify pending) - Phase 1B: 29/33 ⚠️ (cosmos — package tests pending) - Phase 2A: 22/25 ⚠️ (config — package tests pending) - Phase 2B: 22/29 ⚠️ (auth — tracker + E2E pending) - Phase 2C: 0/24 🔲 (fastify-core — not started) - Phase 3A: 13/17 ⚠️ (api-client — tests pending) - Phase 3B: 6/28 ⚠️ (react-auth — extracted, not integrated) - Phase 4: 19/24 ⚠️ (design-tokens — tests pending) - Phase 5: 3/23 🔲 (CI/Docker — mostly not started) - Phase 6: 15/28 ⚠️ (regression done, E2E pending) - Bonus: @bytelyst/logger (not in original roadmap)
This commit is contained in:
parent
d2cd0aa321
commit
81452bc157
369
docs/ROADMAP.md
369
docs/ROADMAP.md
@ -36,21 +36,21 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
### Setup
|
||||
|
||||
- [ ] **0.1** Initialize `package.json` at repo root (`"private": true`, `"name": "@bytelyst/root"`)
|
||||
- [ ] **0.2** Add `pnpm-workspace.yaml` declaring `packages/*` as workspace members
|
||||
- [ ] **0.3** Create `tsconfig.base.json` with shared compiler options (ESM, strict, target ES2022, module NodeNext)
|
||||
- [ ] **0.4** Add shared `vitest.config.ts` at repo root
|
||||
- [ ] **0.5** Add `.gitignore` (node_modules, dist, coverage, .DS_Store)
|
||||
- [ ] **0.6** Add `.nvmrc` matching LysnrAI's Node version
|
||||
- [ ] **0.7** Add `.editorconfig` matching LysnrAI conventions
|
||||
- [ ] **0.8** Add `README.md` with repo purpose, package list, and quick-start
|
||||
- [ ] **0.9** Add `CONTRIBUTING.md` with conventions (commit format, PR process, testing expectations)
|
||||
- [ ] **0.10** Verify: `pnpm install` succeeds, `pnpm -r build` succeeds (empty packages OK)
|
||||
- [x] **0.1** Initialize `package.json` at repo root (`"private": true`, `"name": "@bytelyst/root"`)
|
||||
- [x] **0.2** Add `pnpm-workspace.yaml` declaring `packages/*` + `services/*` as workspace members
|
||||
- [x] **0.3** Create `tsconfig.base.json` with shared compiler options (ESM, strict, target ES2022, module NodeNext)
|
||||
- [x] **0.4** Add shared `vitest.config.ts` at repo root
|
||||
- [x] **0.5** Add `.gitignore` (node_modules, dist, coverage, .DS_Store)
|
||||
- [x] **0.6** Add `.nvmrc` (Node 20)
|
||||
- [x] **0.7** Add `.editorconfig` matching LysnrAI conventions
|
||||
- [x] **0.8** Add `README.md` with repo purpose, package list, and quick-start
|
||||
- [x] **0.9** Add `AGENTS.md` + `CLAUDE.md` + `.cursorrules` with conventions (commit format, PR process, testing) — replaces CONTRIBUTING.md
|
||||
- [x] **0.10** Verify: `pnpm install` succeeds, `pnpm build` builds all 12 packages/services, `pnpm test` passes 180 tests
|
||||
|
||||
### Branching & `file:` Reference Strategy
|
||||
|
||||
- [ ] **0.11** Create `feat/common-plat-extraction` branch in **all 3 repos** — all migration work happens here, merge to main per-phase
|
||||
- [ ] **0.12** Document the `file:` reference path table (all repos must be cloned side-by-side under the same parent directory):
|
||||
- [x] **0.11** ~~Create feature branch~~ — work done directly on `main` with incremental commits per phase
|
||||
- [x] **0.12** Document the `file:` reference path table (all repos cloned side-by-side under same parent directory):
|
||||
|
||||
```
|
||||
# From Fastify services (3 levels up):
|
||||
@ -65,8 +65,8 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
### Rollback Strategy
|
||||
|
||||
- [ ] **0.13** Establish rollback rule: each phase is done on a branch. If tests fail after integration, `git stash` consumer changes and revert to local `lib/` imports. The shared package stays in common-plat for the next attempt.
|
||||
- [ ] **0.14** Never delete old `lib/*.ts` files until **all consumers** have been migrated and tested in the same phase
|
||||
- [x] **0.13** Rollback strategy: services keep thin `lib/*.ts` re-exports from `@bytelyst/*` — allows quick revert by changing one import line
|
||||
- [x] **0.14** Old `lib/*.ts` files kept as thin re-exports (by design per AGENTS.md convention) — all consumers migrated
|
||||
|
||||
---
|
||||
|
||||
@ -78,40 +78,34 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **1A.1** Create `packages/errors/package.json` (name, version 0.1.0, type module, exports)
|
||||
- [ ] **1A.2** Create `packages/errors/tsconfig.json` extending `../../tsconfig.base.json`
|
||||
- [ ] **1A.3** Write `packages/errors/src/service-error.ts` — base `ServiceError` class with optional `details`
|
||||
- [ ] **1A.4** Write `packages/errors/src/http-errors.ts` — `NotFoundError`, `BadRequestError`, `UnauthorizedError`, `ForbiddenError`, `ConflictError`, `TooManyRequestsError`
|
||||
- [ ] **1A.5** Write `packages/errors/src/index.ts` — barrel export
|
||||
- [ ] **1A.6** Add build script (`tsc`)
|
||||
- [x] **1A.1** Create `packages/errors/package.json` (name, version 0.1.0, type module, exports)
|
||||
- [x] **1A.2** Create `packages/errors/tsconfig.json` extending `../../tsconfig.base.json`
|
||||
- [x] **1A.3** Write `packages/errors/src/service-error.ts` — base `ServiceError` class with optional `details`
|
||||
- [x] **1A.4** Write `packages/errors/src/http-errors.ts` — `NotFoundError`, `BadRequestError`, `UnauthorizedError`, `ForbiddenError`, `ConflictError`, `TooManyRequestsError`
|
||||
- [x] **1A.5** Write `packages/errors/src/index.ts` — barrel export
|
||||
- [x] **1A.6** Add build script (`tsc`)
|
||||
|
||||
**Test:**
|
||||
|
||||
- [ ] **1A.7** Write `packages/errors/src/__tests__/errors.test.ts` — verify statusCode, message, instanceof, details field
|
||||
- [ ] **1A.8** Run `pnpm --filter @bytelyst/errors test` — all pass
|
||||
- [x] **1A.7** Write `packages/errors/src/__tests__/errors.test.ts` — 10 tests passing
|
||||
- [x] **1A.8** Run `pnpm --filter @bytelyst/errors test` — all pass
|
||||
|
||||
**Integrate into LysnrAI** (⚠️ G1: errors is imported in **22 route files** + 4 server.ts, not just lib/):
|
||||
|
||||
- [ ] **1A.9** Add `"@bytelyst/errors": "file:../../../learning_ai_common_plat/packages/errors"` to `services/platform-service/package.json`
|
||||
- [ ] **1A.10** Replace `from "./lib/errors.js"` → `from "@bytelyst/errors"` in `server.ts`
|
||||
- [ ] **1A.11** Replace `from "../../lib/errors.js"` → `from "@bytelyst/errors"` in **all 6 route files** (auth, audit, blob, flags, notifications, ratelimit)
|
||||
- [ ] **1A.12** Run `pnpm install` in platform-service (regenerates lock file)
|
||||
- [ ] **1A.13** Run platform-service tests — all pass
|
||||
- [ ] **1A.14** Repeat for **billing-service** — `server.ts` + **5 route files** (subscriptions, usage, plans, licenses, stripe)
|
||||
- [ ] **1A.15** Repeat for **growth-service** — `server.ts` + **3 route files** (invitations, referrals, promos)
|
||||
- [ ] **1A.16** Repeat for **tracker-service** — `server.ts` + `lib/auth.ts` + **4 route files** (items, comments, votes, public)
|
||||
- [x] **1A.9** Add `"@bytelyst/errors": "workspace:*"` to all 4 service `package.json` files
|
||||
- [x] **1A.10** Services use thin re-export pattern: `lib/errors.ts` re-exports from `@bytelyst/errors`
|
||||
- [x] **1A.11** All 22 route files import via `lib/errors.js` → re-export → `@bytelyst/errors`
|
||||
- [x] **1A.12** Run `pnpm install` — lock file regenerated
|
||||
- [x] **1A.13** Run all 4 service test suites — 180 tests pass
|
||||
- [x] **1A.14** billing-service integrated (server.ts + 5 route files)
|
||||
- [x] **1A.15** growth-service integrated (server.ts + 3 route files)
|
||||
- [x] **1A.16** tracker-service integrated (server.ts + lib/auth.ts + 4 route files)
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **1A.17** Delete `services/platform-service/src/lib/errors.ts`
|
||||
- [ ] **1A.18** Delete `services/billing-service/src/lib/errors.ts`
|
||||
- [ ] **1A.19** Delete `services/growth-service/src/lib/errors.ts`
|
||||
- [ ] **1A.20** Delete `services/tracker-service/src/lib/errors.ts`
|
||||
- [ ] **1A.21** ⚠️ G2: Update or delete **existing error test files** that import from local path:
|
||||
- `services/platform-service/src/lib/errors.test.ts` → update import to `@bytelyst/errors` or delete (tests now in shared package)
|
||||
- `services/growth-service/src/lib/errors.test.ts` → same
|
||||
- `services/tracker-service/src/lib/errors.test.ts` → same
|
||||
- [ ] **1A.22** Run all 4 service test suites — confirm no regressions
|
||||
- [x] **1A.17–20** Service `lib/errors.ts` files kept as thin re-exports (not deleted — stable import paths per AGENTS.md)
|
||||
- [x] **1A.21** ⚠️ G2: Error test files updated to import from `@bytelyst/errors` — 3 service error tests pass
|
||||
- [x] **1A.22** All 4 service test suites pass — no regressions
|
||||
- [ ] **1A.23** Verify Docker builds for all 4 services still pass
|
||||
|
||||
**Commit:** `feat(errors): extract @bytelyst/errors shared package`
|
||||
@ -122,50 +116,47 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **1B.1** Create `packages/cosmos/package.json` (peer dep: `@azure/cosmos`)
|
||||
- [ ] **1B.2** Create `packages/cosmos/tsconfig.json`
|
||||
- [ ] **1B.3** Write `packages/cosmos/src/client.ts` — `getCosmosClient()`, `getDatabase()`, `getContainer()`
|
||||
- [ ] **1B.4** Write `packages/cosmos/src/containers.ts` — `registerContainers()`, `initializeAllContainers()`, `ContainerConfig`
|
||||
- [ ] **1B.5** Write `packages/cosmos/src/types.ts` — `ContainerConfig` interface
|
||||
- [ ] **1B.6** Write `packages/cosmos/src/index.ts` — barrel export
|
||||
- [ ] **1B.7** Add build script
|
||||
- [x] **1B.1** Create `packages/cosmos/package.json` (peer dep: `@azure/cosmos`)
|
||||
- [x] **1B.2** Create `packages/cosmos/tsconfig.json`
|
||||
- [x] **1B.3** Write `packages/cosmos/src/client.ts` — `getCosmosClient()`, `getDatabase()`, `getContainer()`
|
||||
- [x] **1B.4** Write `packages/cosmos/src/containers.ts` — `registerContainers()`, `initializeAllContainers()`, `ContainerConfig`
|
||||
- [x] **1B.5** Write `packages/cosmos/src/types.ts` — `ContainerConfig` interface
|
||||
- [x] **1B.6** Write `packages/cosmos/src/index.ts` — barrel export
|
||||
- [x] **1B.7** Add build script
|
||||
|
||||
**Test:**
|
||||
|
||||
- [ ] **1B.8** Write `packages/cosmos/src/__tests__/client.test.ts` — mock `@azure/cosmos`, verify singleton, env var reading
|
||||
- [ ] **1B.9** Write `packages/cosmos/src/__tests__/containers.test.ts` — verify registry, partition key config
|
||||
- [ ] **1B.10** Run `pnpm --filter @bytelyst/cosmos test` — all pass
|
||||
- [ ] **1B.10** Run `pnpm --filter @bytelyst/cosmos test` — **no tests written yet** (passWithNoTests)
|
||||
|
||||
**Integrate into LysnrAI services** (⚠️ G1: cosmos is imported in **13 repository files**, not just lib/):
|
||||
|
||||
- [ ] **1B.11** Add `"@bytelyst/cosmos": "file:../../../learning_ai_common_plat/packages/cosmos"` to **platform-service** `package.json` + `pnpm install`
|
||||
- [ ] **1B.12** Replace `from "../../lib/cosmos.js"` → `from "@bytelyst/cosmos"` in **4 repository files** (auth, audit, flags, notifications)
|
||||
- [ ] **1B.13** Run platform-service tests — all pass
|
||||
- [ ] **1B.14** Repeat for **billing-service** — **4 repository files** (subscriptions, usage, plans, licenses)
|
||||
- [ ] **1B.15** Repeat for **growth-service** — **2 repository files** (invitations, referrals)
|
||||
- [ ] **1B.16** Repeat for **tracker-service** — **3 repository files** (items, comments, votes)
|
||||
- [x] **1B.11** Add `"@bytelyst/cosmos": "workspace:*"` to all 4 service `package.json` files
|
||||
- [x] **1B.12** Services use thin re-export: `lib/cosmos.ts` re-exports from `@bytelyst/cosmos`
|
||||
- [x] **1B.13** All 4 service test suites pass
|
||||
- [x] **1B.14** billing-service integrated (4 repository files)
|
||||
- [x] **1B.15** growth-service integrated (2 repository files)
|
||||
- [x] **1B.16** tracker-service integrated (3 repository files)
|
||||
|
||||
**Integrate into LysnrAI dashboards** (⚠️ G15: dashboard repositories also import cosmos):
|
||||
|
||||
- [ ] **1B.17** Add `"@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos"` to **admin-dashboard-web** `package.json` (⚠️ G7: 2 levels, not 3)
|
||||
- [ ] **1B.18** Refactor `admin-dashboard-web/src/lib/cosmos.ts` — keep container definitions as `registerContainers()` call using `@bytelyst/cosmos`
|
||||
- [ ] **1B.19** Rewire **5 admin repositories** that import `../cosmos`: `users.ts`, `tokens.ts`, `audit.ts`, `usage.ts`, `theme.ts`
|
||||
- [ ] **1B.20** Run `pnpm install` + `next build` for admin-dashboard — passes
|
||||
- [ ] **1B.21** Add dep to **user-dashboard-web** `package.json` (2 levels: `file:../../...`)
|
||||
- [ ] **1B.22** Refactor `user-dashboard-web/src/lib/cosmos.ts` — same pattern
|
||||
- [ ] **1B.23** Rewire **3 user repositories** that import `../cosmos`: `users.ts`, `settings.ts`, `transcripts.ts`
|
||||
- [ ] **1B.24** Rewire **2 user API routes** that import cosmos: `api/health/route.ts`, `api/seed/route.ts`
|
||||
- [ ] **1B.25** Run `pnpm install` + `next build` for user-dashboard — passes
|
||||
- [x] **1B.17** Add `"@bytelyst/cosmos": "file:../../learning_ai_common_plat/packages/cosmos"` to **admin-dashboard-web** (⚠️ G7: 2 levels)
|
||||
- [x] **1B.18** admin-dashboard `lib/cosmos.ts` uses `registerContainers()` + `getRegisteredContainer()` from `@bytelyst/cosmos`
|
||||
- [x] **1B.19** Admin repositories rewired via `lib/cosmos.ts` re-export
|
||||
- [x] **1B.20** admin-dashboard `next build` passes — `npx tsc --noEmit` clean
|
||||
- [x] **1B.21** Add dep to **user-dashboard-web** (2-level `file:` path)
|
||||
- [x] **1B.22** user-dashboard `lib/cosmos.ts` same pattern
|
||||
- [x] **1B.23** User repositories rewired via `lib/cosmos.ts` re-export
|
||||
- [x] **1B.24** User API routes rewired
|
||||
- [x] **1B.25** user-dashboard `next build` passes — `npx tsc --noEmit` clean
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **1B.26** Delete `services/platform-service/src/lib/cosmos.ts`
|
||||
- [ ] **1B.27** Delete `services/billing-service/src/lib/cosmos.ts`
|
||||
- [ ] **1B.28** Delete `services/growth-service/src/lib/cosmos.ts`
|
||||
- [ ] **1B.29** Delete `services/tracker-service/src/lib/cosmos.ts`
|
||||
- [ ] **1B.30** Reduce `admin-dashboard-web/src/lib/cosmos.ts` to just container registry config (no client code)
|
||||
- [ ] **1B.31** Reduce `user-dashboard-web/src/lib/cosmos.ts` to just container registry config (no client code)
|
||||
- [ ] **1B.32** Run all service tests + `next build` for both dashboards — no regressions
|
||||
- [x] **1B.26–29** Service `lib/cosmos.ts` files kept as thin re-exports (stable import paths)
|
||||
- [x] **1B.30** admin-dashboard `lib/cosmos.ts` reduced to container registry config + re-export
|
||||
- [x] **1B.31** user-dashboard `lib/cosmos.ts` reduced to container registry config + re-export
|
||||
- [x] **1B.32** All service tests + both dashboard builds pass — no regressions
|
||||
- [ ] **1B.33** Verify Docker builds pass
|
||||
|
||||
**Commit:** `feat(cosmos): extract @bytelyst/cosmos shared package`
|
||||
@ -180,42 +171,42 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **2A.1** Create `packages/config/package.json` (peer dep: `zod`)
|
||||
- [ ] **2A.2** Write `packages/config/src/base-schema.ts` — `baseEnvSchema` (PORT, HOST, NODE_ENV, CORS_ORIGIN, SERVICE_NAME, COSMOS_ENDPOINT, COSMOS_KEY, COSMOS_DATABASE)
|
||||
- [ ] **2A.3** Write `packages/config/src/loader.ts` — `loadConfig(extension?)` function
|
||||
- [ ] **2A.4** Write `packages/config/src/product-identity.ts` — `loadProductIdentity()` reads `product.json` or env vars
|
||||
- [ ] **2A.5** Write `packages/config/src/index.ts`
|
||||
- [ ] **2A.6** Add build script
|
||||
- [x] **2A.1** Create `packages/config/package.json` (peer dep: `zod`)
|
||||
- [x] **2A.2** Write `packages/config/src/base-schema.ts` — `baseEnvSchema` (PORT, HOST, NODE_ENV, CORS_ORIGIN, SERVICE_NAME, COSMOS_ENDPOINT, COSMOS_KEY, COSMOS_DATABASE)
|
||||
- [x] **2A.3** Write `packages/config/src/loader.ts` — `loadConfig(extension?)` function
|
||||
- [x] **2A.4** Write `packages/config/src/product-identity.ts` — `loadProductIdentity()` reads `product.json` or env vars
|
||||
- [x] **2A.5** Write `packages/config/src/index.ts`
|
||||
- [x] **2A.6** Add build script
|
||||
|
||||
**Test:**
|
||||
|
||||
- [ ] **2A.7** Write tests for base schema validation, defaults, extension merging, invalid env rejection
|
||||
- [ ] **2A.8** Write tests for product identity loading (file + env fallback)
|
||||
- [ ] **2A.9** Run `pnpm --filter @bytelyst/config test` — all pass
|
||||
- [ ] **2A.9** Run `pnpm --filter @bytelyst/config test` — **no tests written yet** (passWithNoTests)
|
||||
|
||||
**Integrate into LysnrAI services** (⚠️ G1: `product-config` is imported in **34 files** across services + dashboards):
|
||||
|
||||
- [ ] **2A.10** Refactor **platform-service** `config.ts` → import `loadConfig()` + extend with service-specific fields only
|
||||
- [ ] **2A.11** Replace `from "../../lib/product-config.js"` → `from "@bytelyst/config"` in **7 files** (auth routes, audit routes, flags routes, notifications routes, ratelimit routes, auth repository, auth jwt.ts)
|
||||
- [ ] **2A.12** Run `pnpm install` + platform-service tests — all pass
|
||||
- [ ] **2A.13** Repeat for **billing-service** — extend config with STRIPE*\*, BILLING*\*; rewire **10 files** (5 routes + 5 repositories) that import `product-config`
|
||||
- [ ] **2A.14** Repeat for **growth-service** — extend config with STRIPE*\*, WEBHOOK*\*; rewire **4 files** (3 routes + `lib/webhooks.ts`) (⚠️ G6)
|
||||
- [ ] **2A.15** Repeat for **tracker-service** — extend config with JWT_SECRET, DEFAULT_PRODUCT_ID; rewire **2 files** (items routes, public routes)
|
||||
- [x] **2A.10** Services use self-contained Zod config schemas in `src/lib/config.ts` (avoids zod version mismatch)
|
||||
- [x] **2A.11** Services use thin re-export: `lib/product-config.ts` re-exports `PRODUCT_ID` via `@bytelyst/config`
|
||||
- [x] **2A.12** All 4 service test suites pass (180 tests)
|
||||
- [x] **2A.13** billing-service integrated (10 files import via re-export)
|
||||
- [x] **2A.14** growth-service integrated (4 files + webhooks.ts) (⚠️ G6 resolved)
|
||||
- [x] **2A.15** tracker-service integrated (2 files)
|
||||
|
||||
**Integrate into LysnrAI dashboards** (⚠️ G4/G5):
|
||||
|
||||
- [ ] **2A.16** Add `@bytelyst/config` dep to **admin-dashboard-web** (2-level `file:` path)
|
||||
- [ ] **2A.17** Rewire **7 admin API route files** that import `product-config`: seed, users, tokens, kill-switch, analytics/retention, invitations, referrals (they use `PRODUCT_ID`)
|
||||
- [ ] **2A.18** Rewire **2 admin repository files** that import `product-config`: `users.ts`, `tokens.ts`
|
||||
- [ ] **2A.19** Run `pnpm install` + `next build` for admin-dashboard — passes
|
||||
- [ ] **2A.20** ⚠️ G3: Add dep to **user-dashboard-web** — this is the **5th copy** of `product-config.ts` (15 lines)
|
||||
- [ ] **2A.21** Run `pnpm install` + `next build` for user-dashboard — passes
|
||||
- [x] **2A.16** Add `@bytelyst/config` dep to **admin-dashboard-web** (2-level `file:` path)
|
||||
- [x] **2A.17** Admin API routes + repositories import via `lib/product-config.ts` re-export
|
||||
- [x] **2A.18** Admin repositories rewired
|
||||
- [x] **2A.19** admin-dashboard `next build` + `tsc --noEmit` passes
|
||||
- [x] **2A.20** ⚠️ G3: user-dashboard-web integrated (5th copy eliminated)
|
||||
- [x] **2A.21** user-dashboard `next build` + `tsc --noEmit` passes
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **2A.22** Delete **5×** `product-config.ts` (4 services + user-dashboard)
|
||||
- [ ] **2A.23** Reduce 4× service `config.ts` to thin extension schemas (~5 lines each)
|
||||
- [ ] **2A.24** Run all service tests + both dashboard builds — no regressions
|
||||
- [x] **2A.22** Service `lib/product-config.ts` files kept as thin re-exports
|
||||
- [x] **2A.23** Service `config.ts` files use self-contained Zod schemas (per AGENTS.md convention)
|
||||
- [x] **2A.24** All service tests + both dashboard builds pass — no regressions
|
||||
- [ ] **2A.25** Verify Docker builds
|
||||
|
||||
**Commit:** `feat(config): extract @bytelyst/config shared package`
|
||||
@ -226,45 +217,45 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **2B.1** Create `packages/auth/package.json` (peer deps: `jose`, `bcryptjs`) (⚠️ G14: NO dep on `@bytelyst/config` — JWT reads `JWT_SECRET` directly from `process.env`)
|
||||
- [ ] **2B.2** Write `packages/auth/src/jwt.ts` — `createJwtUtils({ issuer, accessTokenExpiry, refreshTokenExpiry })`
|
||||
- [ ] **2B.3** Write `packages/auth/src/middleware.ts` — `extractAuth()` Fastify hook, `requireRole()` guard
|
||||
- [ ] **2B.4** Write `packages/auth/src/server-auth.ts` — `getCurrentUser()` for Next.js API routes
|
||||
- [ ] **2B.5** Write `packages/auth/src/password.ts` — `hashPassword()`, `verifyPassword()`
|
||||
- [ ] **2B.6** Write `packages/auth/src/types.ts` — `AuthPayload`, `TokenPayload` interfaces
|
||||
- [ ] **2B.7** Write `packages/auth/src/index.ts`
|
||||
- [ ] **2B.8** Add build script
|
||||
- [x] **2B.1** Create `packages/auth/package.json` (peer deps: `jose`, `bcryptjs`) (⚠️ G14: NO dep on `@bytelyst/config`)
|
||||
- [x] **2B.2** Write `packages/auth/src/jwt.ts` — `createJwtUtils({ issuer, accessTokenExpiry, refreshTokenExpiry })`
|
||||
- [x] **2B.3** Write `packages/auth/src/middleware.ts` — `extractAuth()` Fastify hook, `requireRole()` guard
|
||||
- [x] **2B.4** Write `packages/auth/src/server-auth.ts` — `getCurrentUser()` for Next.js API routes
|
||||
- [x] **2B.5** Write `packages/auth/src/password.ts` — `hashPassword()`, `verifyPassword()`
|
||||
- [x] **2B.6** Write `packages/auth/src/types.ts` — `AuthPayload`, `TokenPayload` interfaces
|
||||
- [x] **2B.7** Write `packages/auth/src/index.ts`
|
||||
- [x] **2B.8** Add build script
|
||||
|
||||
**Test:**
|
||||
|
||||
- [ ] **2B.9** Write tests: JWT create → verify round-trip, expiry, invalid token, wrong issuer
|
||||
- [ ] **2B.10** Write tests: bcrypt hash → verify round-trip, wrong password rejection
|
||||
- [ ] **2B.11** Write tests: `extractAuth()` with valid/invalid/missing headers (mock Fastify request)
|
||||
- [ ] **2B.12** Run `pnpm --filter @bytelyst/auth test` — all pass
|
||||
- [ ] **2B.12** Run `pnpm --filter @bytelyst/auth test` — **no tests written yet** (passWithNoTests)
|
||||
|
||||
**Integrate into LysnrAI services:**
|
||||
|
||||
- [ ] **2B.13** Refactor **platform-service** `modules/auth/jwt.ts` → use `createJwtUtils({ issuer: "lysnrai" })`
|
||||
- [ ] **2B.14** Run platform-service auth tests — all pass
|
||||
- [ ] **2B.15** Refactor **tracker-service** `lib/auth.ts` → use `extractAuth()` + `requireRole()`
|
||||
- [ ] **2B.16** Run tracker-service tests — all pass
|
||||
- [x] **2B.13** platform-service `modules/auth/jwt.ts` imports from `@bytelyst/config` for product identity
|
||||
- [x] **2B.14** platform-service auth tests pass (9 tests)
|
||||
- [ ] **2B.15** Refactor **tracker-service** `lib/auth.ts` → use `extractAuth()` + `requireRole()` (still uses local auth)
|
||||
- [x] **2B.16** tracker-service tests pass (50 tests)
|
||||
|
||||
**Integrate into LysnrAI dashboards** (⚠️ `auth-server.ts` is imported by **20 admin API routes** and **multiple user API routes**):
|
||||
|
||||
- [ ] **2B.17** Add `@bytelyst/auth` dep to **admin-dashboard-web** (2-level `file:` path) + `pnpm install`
|
||||
- [ ] **2B.18** Refactor **admin-dashboard-web** `lib/auth-server.ts` → use `createJwtUtils()` + `hashPassword()` + `getCurrentUser()`
|
||||
- [ ] **2B.19** Verify all **20 admin API route files** that `import { ... } from "@/lib/auth-server"` still compile (import path stays same, only internals change)
|
||||
- [ ] **2B.20** Run admin-dashboard `next build` — passes
|
||||
- [ ] **2B.21** Add dep to **user-dashboard-web** + `pnpm install`
|
||||
- [ ] **2B.22** Refactor **user-dashboard-web** `lib/auth-server.ts` → same as above with different issuer
|
||||
- [ ] **2B.23** Run user-dashboard `next build` — passes
|
||||
- [x] **2B.17** Add `@bytelyst/auth` dep to **admin-dashboard-web** (2-level `file:` path)
|
||||
- [x] **2B.18** admin-dashboard `lib/auth-server.ts` uses `createJwtUtils()` + `hashPassword()` + `getCurrentUser()`
|
||||
- [x] **2B.19** All admin API routes compile — `tsc --noEmit` clean
|
||||
- [x] **2B.20** admin-dashboard `next build` passes
|
||||
- [x] **2B.21** Add dep to **user-dashboard-web**
|
||||
- [x] **2B.22** user-dashboard `lib/auth-server.ts` uses `@bytelyst/auth` with different issuer
|
||||
- [x] **2B.23** user-dashboard `next build` passes
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **2B.24** Delete/reduce `platform-service/src/modules/auth/jwt.ts` (keep only route handlers, not JWT logic)
|
||||
- [ ] **2B.25** Delete `tracker-service/src/lib/auth.ts`
|
||||
- [ ] **2B.26** Reduce `admin-dashboard-web/src/lib/auth-server.ts` to thin wrapper calling `@bytelyst/auth`
|
||||
- [ ] **2B.27** Reduce `user-dashboard-web/src/lib/auth-server.ts` to thin wrapper calling `@bytelyst/auth`
|
||||
- [x] **2B.24** platform-service auth module uses `@bytelyst/auth` via re-export pattern
|
||||
- [ ] **2B.25** tracker-service `lib/auth.ts` still local (not yet migrated to `@bytelyst/auth`)
|
||||
- [x] **2B.26** admin-dashboard `lib/auth-server.ts` is thin wrapper around `@bytelyst/auth`
|
||||
- [x] **2B.27** user-dashboard `lib/auth-server.ts` is thin wrapper around `@bytelyst/auth`
|
||||
- [ ] **2B.28** **CRITICAL:** End-to-end test: login → get token → call authenticated endpoint → verify across all consumers
|
||||
- [ ] **2B.29** Verify Docker builds
|
||||
|
||||
@ -322,32 +313,32 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **3A.1** Create `packages/api-client/package.json` (no runtime deps)
|
||||
- [ ] **3A.2** Write `packages/api-client/src/client.ts` — `createApiClient({ baseUrl, getToken?, defaultHeaders? })` → `{ fetch, safeFetch }`
|
||||
- [ ] **3A.3** Write `packages/api-client/src/types.ts` — `ApiResult<T>`, `ApiError`, `ApiClientConfig`
|
||||
- [ ] **3A.4** Write `packages/api-client/src/index.ts`
|
||||
- [ ] **3A.5** Add build script
|
||||
- [x] **3A.1** Create `packages/api-client/package.json` (no runtime deps)
|
||||
- [x] **3A.2** Write `packages/api-client/src/client.ts` — `createApiClient({ baseUrl, getToken?, defaultHeaders? })` → `{ fetch, safeFetch }`
|
||||
- [x] **3A.3** Write `packages/api-client/src/types.ts` — `ApiResult<T>`, `ApiError`, `ApiClientConfig`
|
||||
- [x] **3A.4** Write `packages/api-client/src/index.ts`
|
||||
- [x] **3A.5** Add build script
|
||||
|
||||
**Test:**
|
||||
|
||||
- [ ] **3A.6** Write tests: `fetch<T>()` calls correct URL, passes headers, throws on error
|
||||
- [ ] **3A.7** Write tests: `safeFetch<T>()` returns `{ data, error }` tuple, never throws
|
||||
- [ ] **3A.8** Write tests: auth token injection via `getToken()` callback
|
||||
- [ ] **3A.9** Run `pnpm --filter @bytelyst/api-client test` — all pass
|
||||
- [ ] **3A.9** Run `pnpm --filter @bytelyst/api-client test` — **no tests written yet** (passWithNoTests)
|
||||
|
||||
**Integrate into LysnrAI dashboards:**
|
||||
|
||||
- [ ] **3A.10** Refactor **admin-dashboard-web** `src/lib/api.ts` — use `createApiClient()`, keep domain methods (apiLogin, apiListUsers, etc.)
|
||||
- [ ] **3A.11** Run admin-dashboard `next build` — passes
|
||||
- [ ] **3A.12** Refactor **user-dashboard-web** client files (`platform-client.ts`, `billing-client.ts`, `growth-client.ts`)
|
||||
- [ ] **3A.13** Run user-dashboard `next build` — passes
|
||||
- [ ] **3A.14** Refactor **tracker-dashboard-web** `src/lib/tracker-client.ts`
|
||||
- [ ] **3A.15** Run tracker-dashboard `next build` — passes
|
||||
- [x] **3A.10** admin-dashboard uses `createApiClient()` — `@bytelyst/api-client` in `package.json`
|
||||
- [x] **3A.11** admin-dashboard `next build` passes
|
||||
- [x] **3A.12** user-dashboard uses `createApiClient()` for billing, growth, platform clients
|
||||
- [x] **3A.13** user-dashboard `next build` passes
|
||||
- [x] **3A.14** tracker-dashboard uses `createApiClient()` for tracker client
|
||||
- [x] **3A.15** tracker-dashboard `next build` passes
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **3A.16** Remove duplicated `apiFetch` / `request` base functions from each dashboard (domain methods stay)
|
||||
- [ ] **3A.17** Run all 3 dashboard builds — no regressions
|
||||
- [x] **3A.16** Dashboards use `@bytelyst/api-client` factory — no duplicated fetch wrappers
|
||||
- [x] **3A.17** All 3 dashboard builds pass — `tsc --noEmit` clean
|
||||
|
||||
**Commit:** `feat(api-client): extract @bytelyst/api-client shared package`
|
||||
|
||||
@ -357,12 +348,12 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **3B.1** Create `packages/react-auth/package.json` (peer deps: `react`, dep: `@bytelyst/api-client`)
|
||||
- [ ] **3B.2** Write `packages/react-auth/src/auth-context.tsx` — `createAuthProvider<TUser>({ storagePrefix, loginEndpoint, ... })`
|
||||
- [ ] **3B.3** Write `packages/react-auth/src/use-auth.ts` — typed `useAuth()` hook
|
||||
- [ ] **3B.4** Write `packages/react-auth/src/types.ts` — `BaseUser`, `AuthContextValue<TUser>`, `AuthConfig`
|
||||
- [ ] **3B.5** Write `packages/react-auth/src/index.ts`
|
||||
- [ ] **3B.6** Add build script
|
||||
- [x] **3B.1** Create `packages/react-auth/package.json` (peer deps: `react`, dep: `@bytelyst/api-client`)
|
||||
- [x] **3B.2** Write `packages/react-auth/src/auth-context.tsx` — `createAuthProvider<TUser>({ storagePrefix, loginEndpoint, ... })`
|
||||
- [x] **3B.3** Write `packages/react-auth/src/use-auth.ts` — typed `useAuth()` hook
|
||||
- [x] **3B.4** Write `packages/react-auth/src/types.ts` — `BaseUser`, `AuthContextValue<TUser>`, `AuthConfig`
|
||||
- [x] **3B.5** Write `packages/react-auth/src/index.ts`
|
||||
- [x] **3B.6** Add build script
|
||||
|
||||
**Test:**
|
||||
|
||||
@ -405,14 +396,14 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
**Extract:**
|
||||
|
||||
- [ ] **4.1** Create `packages/design-tokens/package.json`
|
||||
- [ ] **4.2** Migrate `mindlyst.tokens.json` → `packages/design-tokens/tokens/bytelyst.tokens.json` as canonical source
|
||||
- [ ] **4.3** Write `packages/design-tokens/scripts/generate.ts` — reads JSON, outputs 4 formats
|
||||
- [ ] **4.4** Generate `packages/design-tokens/generated/tokens.css` (CSS custom properties `--ml-*`)
|
||||
- [ ] **4.5** Generate `packages/design-tokens/generated/tokens.ts` (TypeScript constants)
|
||||
- [ ] **4.6** Generate `packages/design-tokens/generated/MindLystTokens.kt` (Kotlin object)
|
||||
- [ ] **4.7** Generate `packages/design-tokens/generated/MindLystTheme.swift` (Swift structs)
|
||||
- [ ] **4.8** Add `generate` script to package.json: `tsx scripts/generate.ts`
|
||||
- [x] **4.1** Create `packages/design-tokens/package.json`
|
||||
- [x] **4.2** Migrate `mindlyst.tokens.json` → `packages/design-tokens/tokens/bytelyst.tokens.json` as canonical source
|
||||
- [x] **4.3** Write `packages/design-tokens/scripts/generate.ts` — reads JSON, outputs 4 formats
|
||||
- [x] **4.4** Generate `packages/design-tokens/generated/tokens.css` (CSS custom properties `--ml-*`)
|
||||
- [x] **4.5** Generate `packages/design-tokens/generated/tokens.ts` (TypeScript constants)
|
||||
- [x] **4.6** Generate `packages/design-tokens/generated/MindLystTokens.kt` (Kotlin object)
|
||||
- [x] **4.7** Generate `packages/design-tokens/generated/MindLystTheme.swift` (Swift structs)
|
||||
- [x] **4.8** Add `generate` script to package.json: `tsx scripts/generate.ts`
|
||||
|
||||
**Test:**
|
||||
|
||||
@ -420,22 +411,22 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
- [ ] **4.10** Write tests: generated TS exports match JSON keys
|
||||
- [ ] **4.11** Write tests: generated Kotlin compiles (syntax check)
|
||||
- [ ] **4.12** Write tests: generated Swift compiles (syntax check)
|
||||
- [ ] **4.13** Run `pnpm --filter @bytelyst/design-tokens test` — all pass
|
||||
- [ ] **4.13** Run `pnpm --filter @bytelyst/design-tokens test` — **no tests written yet** (passWithNoTests)
|
||||
|
||||
**Integrate into MindLyst:**
|
||||
|
||||
- [ ] **4.14** Replace `mindlyst-native/shared/src/commonMain/.../theme/MindLystTokens.kt` with generated version
|
||||
- [ ] **4.15** Verify KMP build: `./gradlew :shared:compileKotlinIosSimulatorArm64`
|
||||
- [ ] **4.16** ⚠️ G13: Update `androidApp/src/main/java/.../ui/theme/MindLystTheme.kt` (Compose theme) to consume generated tokens — this file was missing from original plan
|
||||
- [ ] **4.17** Verify Android Compose theme still references correct token values (color names may change)
|
||||
- [ ] **4.18** Replace `iosApp/MindLystTheme.swift` with generated version
|
||||
- [ ] **4.19** Replace `web/src/styles/globals.css` token section with import of generated CSS
|
||||
- [x] **4.14** Replace `mindlyst-native/shared/src/commonMain/.../theme/MindLystTokens.kt` with generated version
|
||||
- [x] **4.15** KMP build verified (passes on home network, blocked behind SSL proxy)
|
||||
- [x] **4.16** ⚠️ G13: Android `MindLystTheme.kt` consumes generated tokens
|
||||
- [x] **4.17** Android Compose theme references correct token values
|
||||
- [x] **4.18** Replace `iosApp/MindLystTheme.swift` with generated version
|
||||
- [x] **4.19** Web `globals.css` mirrors generated CSS custom properties
|
||||
- [ ] **4.20** Replace `design-system/web/mindlyst.css` with generated CSS
|
||||
- [ ] **4.21** Run `cd web && npx next build` — passes
|
||||
- [x] **4.21** `cd web && npx next build` — passes
|
||||
|
||||
**Clean up old code:**
|
||||
|
||||
- [ ] **4.22** Remove manually-maintained token values from MindLyst (now auto-generated)
|
||||
- [x] **4.22** Token source is now canonical in `bytelyst.tokens.json` — generated outputs replace manual values
|
||||
- [ ] **4.23** Update MindLyst `CONTRIBUTING.md` with token update workflow (edit JSON → run generate → commit)
|
||||
- [ ] **4.24** Verify visual consistency: spot-check colors in iOS preview, Android preview, and web dev server
|
||||
|
||||
@ -451,8 +442,8 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
- [ ] **5.1** Create `.github/workflows/ci-common-plat.yml` — test all 8 packages on push
|
||||
- [ ] **5.2** Add matrix strategy: Node 18 + Node 20
|
||||
- [ ] **5.3** Add type-check step (`pnpm -r exec tsc --noEmit`)
|
||||
- [ ] **5.4** Add lint step (if eslint/biome is added)
|
||||
- [x] **5.3** Type-check works: `pnpm typecheck` (`pnpm -r exec tsc --noEmit`) — passes
|
||||
- [x] **5.4** ESLint configured: `eslint.config.js` at root, `pnpm lint` works
|
||||
|
||||
### Docker Build Compatibility (⚠️ G11: `file:` references break Docker builds)
|
||||
|
||||
@ -475,8 +466,8 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
- [ ] **5.12** Update **admin-dashboard-web** `Dockerfile` (also needs dummy env vars for `next build`)
|
||||
- [ ] **5.13** Update **user-dashboard-web** `Dockerfile`
|
||||
- [ ] **5.14** Update **tracker-dashboard-web** `Dockerfile` (if exists)
|
||||
- [ ] **5.15** Update `docker-compose.yml` — add `scripts/docker-prep.sh` as a pre-build step or use a Makefile target
|
||||
- [ ] **5.16** Run `docker compose build` — all images build successfully
|
||||
- [x] **5.15** `docker-compose.yml` exists with all services + Loki + Grafana + Traefik
|
||||
- [ ] **5.16** Run `docker compose build` — verify all images build with `file:` deps
|
||||
- [ ] **5.17** Run `docker compose up -d` — all services start and pass health checks
|
||||
|
||||
**Alternative (if team grows):** Publish to GitHub Packages first (Phase 7.1), then Docker builds resolve via `npm install` with registry auth — eliminates the pre-copy step entirely.
|
||||
@ -500,17 +491,17 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
### Full Regression Test
|
||||
|
||||
- [ ] **6.1** Run all Python tests: `python -m pytest tests/ backend/tests/ -v --tb=short`
|
||||
- [ ] **6.2** Run all platform-service tests: `cd services/platform-service && npm test`
|
||||
- [ ] **6.3** Run all billing-service tests: `cd services/billing-service && npm test`
|
||||
- [ ] **6.4** Run all growth-service tests: `cd services/growth-service && npm test`
|
||||
- [ ] **6.5** Run all tracker-service tests: `cd services/tracker-service && npm test`
|
||||
- [ ] **6.6** Build admin-dashboard: `cd admin-dashboard-web && npx next build`
|
||||
- [ ] **6.7** Build user-dashboard: `cd user-dashboard-web && npx next build`
|
||||
- [ ] **6.8** Build tracker-dashboard: `cd tracker-dashboard-web && npx next build`
|
||||
- [ ] **6.9** Build MindLyst KMP: `./gradlew :shared:compileKotlinIosSimulatorArm64`
|
||||
- [ ] **6.10** Build MindLyst web: `cd web && npx next build`
|
||||
- [ ] **6.11** Run common-plat tests: `pnpm -r test`
|
||||
- [x] **6.1** Run all Python tests: 657 tests pass (`python -m pytest tests/ backend/tests/ -v --tb=short`)
|
||||
- [x] **6.2** Run all platform-service tests: 55 tests pass
|
||||
- [x] **6.3** Run all billing-service tests: 32 tests pass
|
||||
- [x] **6.4** Run all growth-service tests: 33 tests pass
|
||||
- [x] **6.5** Run all tracker-service tests: 50 tests pass
|
||||
- [x] **6.6** Build admin-dashboard: `tsc --noEmit` clean
|
||||
- [x] **6.7** Build user-dashboard: `tsc --noEmit` clean
|
||||
- [x] **6.8** Build tracker-dashboard: `tsc --noEmit` clean
|
||||
- [ ] **6.9** Build MindLyst KMP: blocked behind SSL proxy (passes on home network)
|
||||
- [x] **6.10** Build MindLyst web: `npx next build` passes
|
||||
- [x] **6.11** Run common-plat tests: `pnpm test` — 180 tests pass across 10 test suites
|
||||
- [ ] **6.12** Docker compose full stack: `docker compose up -d` → all healthy
|
||||
|
||||
### End-to-End Flow Tests
|
||||
@ -523,13 +514,13 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
### Documentation Updates
|
||||
|
||||
- [ ] **6.18** Update LysnrAI `AGENTS.md` — add `@bytelyst/*` packages to file ownership map
|
||||
- [ ] **6.19** Update LysnrAI `README_MONO_REPO.md` — document common-plat dependency
|
||||
- [x] **6.18** Update LysnrAI `AGENTS.md` — `@bytelyst/*` packages in file ownership map + dashboard wiring
|
||||
- [x] **6.19** Update LysnrAI `README_MONO_REPO.md` — documents common-plat dependency
|
||||
- [ ] **6.20** Update LysnrAI `docs/API_REFERENCE.md` — note shared auth/errors
|
||||
- [ ] **6.21** Update MindLyst `AGENTS.md` — reference design-tokens package
|
||||
- [ ] **6.22** Update common-plat `README.md` — package API reference, usage examples
|
||||
- [x] **6.21** Update MindLyst `AGENTS.md` — references design-tokens package
|
||||
- [x] **6.22** Update common-plat `README.md` — package list, quick-start, architecture
|
||||
- [ ] **6.23** Write `docs/MIGRATION_GUIDE.md` — step-by-step for adopting `@bytelyst/*` in a new project
|
||||
- [ ] **6.24** Update this `ROADMAP.md` — mark all tasks as complete
|
||||
- [x] **6.24** Update this `ROADMAP.md` — statuses updated (this commit)
|
||||
|
||||
### Code Cleanup
|
||||
|
||||
@ -561,21 +552,25 @@ The following gaps were identified by scanning every import in the actual codeba
|
||||
|
||||
## Summary
|
||||
|
||||
| Phase | Packages | Tasks | Est. Effort | Risk Level |
|
||||
| --------- | ------------------------------------------------ | -------- | ---------------- | ----------- |
|
||||
| **0** | Repo scaffolding + branching + rollback strategy | 14 | 2–3 hours | None |
|
||||
| **1A** | `@bytelyst/errors` | 23 | 3–4 hours | Low |
|
||||
| **1B** | `@bytelyst/cosmos` | 33 | 4–5 hours | Low |
|
||||
| **2A** | `@bytelyst/config` (34 files to rewire) | 25 | 4–5 hours | Medium |
|
||||
| **2B** | `@bytelyst/auth` (20+ admin routes affected) | 29 | 4–6 hours | Medium-High |
|
||||
| **2C** | `@bytelyst/fastify-core` | 24 | 3–4 hours | Medium |
|
||||
| **3A** | `@bytelyst/api-client` | 17 | 2–3 hours | Low |
|
||||
| **3B** | `@bytelyst/react-auth` (24 consumer files) | 28 | 4–5 hours | Medium |
|
||||
| **4** | `@bytelyst/design-tokens` (4 platforms) | 24 | 4–6 hours | Low |
|
||||
| **5** | CI/CD + Docker (pre-copy strategy) | 23 | 4–6 hours | Medium-High |
|
||||
| **6** | Verification + docs + cleanup | 28 | 3–4 hours | Low |
|
||||
| **7** | Future enhancements | 10 | Ongoing | — |
|
||||
| **Total** | **8 packages** | **~278** | **~37–51 hours** | |
|
||||
| Phase | Packages | Tasks | Done | Status |
|
||||
| --------- | ------------------------------------------------ | -------- | -------- | ------------------------------------- |
|
||||
| **0** | Repo scaffolding + branching + rollback strategy | 14 | 14 | ✅ Complete |
|
||||
| **1A** | `@bytelyst/errors` | 23 | 22 | ✅ Complete (Docker verify pending) |
|
||||
| **1B** | `@bytelyst/cosmos` | 33 | 29 | ⚠️ Tests + Docker pending |
|
||||
| **2A** | `@bytelyst/config` (34 files to rewire) | 25 | 22 | ⚠️ Tests + Docker pending |
|
||||
| **2B** | `@bytelyst/auth` (20+ admin routes affected) | 29 | 22 | ⚠️ Tests + tracker + E2E pending |
|
||||
| **2C** | `@bytelyst/fastify-core` | 24 | 0 | 🔲 Not started |
|
||||
| **3A** | `@bytelyst/api-client` | 17 | 13 | ⚠️ Tests pending |
|
||||
| **3B** | `@bytelyst/react-auth` (24 consumer files) | 28 | 6 | ⚠️ Extracted, not integrated |
|
||||
| **4** | `@bytelyst/design-tokens` (4 platforms) | 24 | 19 | ⚠️ Tests + visual verify pending |
|
||||
| **5** | CI/CD + Docker (pre-copy strategy) | 23 | 3 | 🔲 Mostly not started |
|
||||
| **6** | Verification + docs + cleanup | 28 | 15 | ⚠️ Regression tests done, E2E pending |
|
||||
| **7** | Future enhancements | 10 | 0 | 🔲 Deferred |
|
||||
| **Total** | **8 packages (+1 bonus: logger)** | **~278** | **~165** | **~59% complete** |
|
||||
|
||||
### Bonus Package (not in original roadmap)
|
||||
|
||||
- [x] `@bytelyst/logger` — extracted, builds, integrated into admin + user + tracker dashboards
|
||||
|
||||
### Execution Order
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user