From e44759d7fef7be250597f1d2e639da0e62c829de Mon Sep 17 00:00:00 2001 From: -Puter <22245429+puterhimself@users.noreply.github.com> Date: Thu, 23 Jul 2026 18:31:48 +0530 Subject: [PATCH] feat: generic project UI, branding fix, context/artifact separation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Web: - Replace GitHub-specific import with generic public Git URL import - Update project workspace page to use ProjectView shape (name, sources) - Migrate use-project-workspace hook to importPublicGit action - Fix status key needsInput → needs-input Branding: - Correct Zopo/zopo → Zopu/zopu in docs/PRODUCT.md, docs/DESIGN.md, docs/TECH.md Artifacts: - Cut to 8 operational artifacts (removed project/business/design.md) - Update artifact seeds with generic context scaffolding --- .../projects/project-workspace-page.tsx | 286 +++++++----------- apps/web/src/hooks/use-project-workspace.ts | 12 +- docs/DESIGN.md | 6 +- docs/PRODUCT.md | 10 +- docs/TECH.md | 4 +- packages/backend/convex/projectIssues.ts | 1 - packages/backend/convex/projectStore.ts | 2 +- packages/backend/convex/projects.ts | 3 - 8 files changed, 133 insertions(+), 191 deletions(-) diff --git a/apps/web/src/components/projects/project-workspace-page.tsx b/apps/web/src/components/projects/project-workspace-page.tsx index 8aa7ed7..d639736 100644 --- a/apps/web/src/components/projects/project-workspace-page.tsx +++ b/apps/web/src/components/projects/project-workspace-page.tsx @@ -18,19 +18,20 @@ import { useProjectWorkspace } from "@/hooks/use-project-workspace"; const statusStyle: Record["status"], string> = { completed: "border-emerald-500/40 bg-emerald-500/10 text-emerald-700 dark:text-emerald-300", - failed: "border-destructive/40 bg-destructive/10 text-destructive", + failed: + "border-destructive/40 bg-destructive/10 text-destructive", "needs-input": - "border-orange-500/40 bg-orange-500/10 text-orange-700 dark:text-orange-300", - open: "border-border text-muted-foreground", - queued: "border-amber-500/40 bg-amber-500/10 text-amber-700 dark:text-amber-300", - working: "border-blue-500/40 bg-blue-500/10 text-blue-700 dark:text-blue-300", + open: "border-border bg-muted/40 text-muted-foreground", + queued: "border-blue-500/40 bg-blue-500/10 text-blue-700 dark:text-blue-300", + working: + "border-blue-500/40 bg-blue-500/10 text-blue-700 dark:text-blue-300", }; interface RepositoryFormProps { readonly busy: boolean; readonly onChange: (value: string) => void; - readonly onSubmit: () => Promise; + readonly onSubmit: () => void; readonly value: string; } @@ -41,36 +42,44 @@ const RepositoryForm = ({ value, }: RepositoryFormProps) => (
{ event.preventDefault(); - void onSubmit(); + onSubmit(); }} >
-
onChange(event.target.value)} - placeholder="rivet-dev/rivet" + placeholder="https://github.com/owner/repo" required value={value} /> -
); interface ProjectListProps { - readonly projects: readonly Doc<"projects">[] | undefined; + readonly projects: readonly { + readonly id: string; + readonly name: string; + readonly sources: readonly { + readonly host: string; + readonly repositoryPath: string; + readonly url: string; + }[]; + }[] | undefined; readonly selectedId: Id<"projects"> | null; readonly onSelect: (projectId: Id<"projects">) => void; } @@ -85,7 +94,7 @@ const ProjectList = ({ projects, selectedId, onSelect }: ProjectListProps) => { if (projects.length === 0) { return (

- Connect a repository to create its project artifacts and issue queue. + Import a repository to create its project artifacts and issue queue.

); } @@ -94,19 +103,20 @@ const ProjectList = ({ projects, selectedId, onSelect }: ProjectListProps) => { {projects.map((project) => ( ))} @@ -130,35 +140,26 @@ interface ArtifactGridProps { const ArtifactGrid = ({ artifacts }: ArtifactGridProps) => (
-
-

- Project artifacts -

-

- Canonical context staged into every issue workspace. -

-
+

+ Project artifacts +

{artifacts === undefined ? ( -

Loading artifacts...

+

Loading artifacts...

+ ) : artifacts.length === 0 ? ( +

No artifacts yet.

) : ( -
+
{artifacts.map((artifact) => ( -
-
-
- -

- {artifact.path} -

-
- - r{artifact.revision} - -
-

- {artifact.content} +

+ +

{artifact.path}

+

+ rev {artifact.revision}

-
+
))}
)} @@ -169,7 +170,7 @@ interface IssueComposerProps { readonly body: string; readonly busy: boolean; readonly onBodyChange: (value: string) => void; - readonly onSubmit: () => Promise; + readonly onSubmit: () => void; readonly onTitleChange: (value: string) => void; readonly title: string; } @@ -183,47 +184,27 @@ const IssueComposer = ({ title, }: IssueComposerProps) => (
{ event.preventDefault(); - void onSubmit(); + onSubmit(); }} > -
-

Raise an issue

-

- The issue becomes the identity for one Flue agent and AgentOS workspace. -

-
-
- - onTitleChange(event.target.value)} - required - value={title} - /> -
-
- -