Rip out Theia, ship P5.1 attach E2E + Justine UI work-in-progress

Theia rip-out:
- Delete app/api/theia-auth/route.ts (Traefik ForwardAuth shim)
- Delete app/api/projects/[projectId]/workspace/route.ts and
  app/api/projects/prewarm/route.ts (Cloud Run Theia provisioning)
- Delete lib/cloud-run-workspace.ts and lib/coolify-workspace.ts
- Strip provisionTheiaWorkspace + theiaWorkspaceUrl/theiaAppUuid/
  theiaError from app/api/projects/create/route.ts response
- Remove Theia callbackUrl branch in app/auth/page.tsx
- Drop "Open in Theia" button + xterm/Theia PTY copy in build/page.tsx
- Drop theiaWorkspaceUrl from deployment/page.tsx Project type
- Strip Theia IDE line + theia-code-os from advisor + agent-chat
  context strings
- Scrub Theia mention from lib/auth/workspace-auth.ts comment

P5.1 (custom apex domains + DNS):
- lib/coolify.ts + lib/opensrs.ts: nameserver normalization, OpenSRS
  XML auth, Cloud DNS plumbing
- scripts/smoke-attach-e2e.ts: full prod GCP + sandbox OpenSRS +
  prod Coolify smoke covering register/zone/A/NS/PATCH/cleanup

In-progress (Justine onboarding/build, MVP setup, agent telemetry):
- New (justine)/stories, project (home) layouts, mvp-setup, run, tasks
  routes + supporting components
- Project shell + sidebar + nav refactor for the Stackless palette
- Agent session API hardening (sessions, events, stream, approve,
  retry, stop) + atlas-chat, advisor, design-surfaces refresh
- New scripts/sync-db-url-from-coolify.mjs +
  scripts/prisma-db-push.mjs + docker-compose.local-db.yml for
  local Prisma workflows
- lib/dev-bypass.ts, lib/chat-context-refs.ts, lib/prd-sections.ts
- Misc: stories CSS, debug/prisma route, modal-theme, BuildLivePlanPanel

Made-with: Cursor
This commit is contained in:
2026-04-22 18:05:01 -07:00
parent d6c87a052e
commit 651ddf1e11
105 changed files with 7509 additions and 2319 deletions

33
lib/prd-sections.ts Normal file
View File

@@ -0,0 +1,33 @@
/** Shared PRD plan sections (discovery phases → document headings). */
export const DISCOVERY_PHASE_ORDER = [
"big_picture",
"users_personas",
"features_scope",
"business_model",
"screens_data",
"risks_questions",
] as const;
export type DiscoveryPhaseId = (typeof DISCOVERY_PHASE_ORDER)[number];
export const PRD_PLAN_SECTIONS = [
{ id: "executive_summary", label: "Executive Summary", phaseId: "big_picture" as const },
{ id: "problem_statement", label: "Problem Statement", phaseId: "big_picture" as const },
{ id: "vision_metrics", label: "Vision & Success Metrics", phaseId: "big_picture" as const },
{ id: "users_personas", label: "Users & Personas", phaseId: "users_personas" as const },
{ id: "user_flows", label: "User Flows", phaseId: "users_personas" as const },
{ id: "feature_requirements", label: "Feature Requirements", phaseId: "features_scope" as const },
{ id: "screen_specs", label: "Screen Specs", phaseId: "screens_data" as const },
{ id: "business_model", label: "Business Model", phaseId: "business_model" as const },
{ id: "integrations", label: "Integrations & Dependencies", phaseId: "features_scope" as const },
{ id: "non_functional", label: "Non-Functional Reqs", phaseId: null },
{ id: "risks", label: "Risks & Mitigations", phaseId: "risks_questions" as const },
{ id: "open_questions", label: "Open Questions", phaseId: "risks_questions" as const },
] as const;
/** Matches legacy PrdContent: sections without a phase are never marked done in the checklist. */
export function isSectionFilled(phaseId: string | null, savedPhaseIds: Set<string>): boolean {
if (phaseId === null) return false;
return savedPhaseIds.has(phaseId);
}