feat: add GitHub project rooms - #131
Conversation
|
Codex review: found issues before merge. Reviewed August 1, 2026, 7:47 PM ET / 23:47 UTC. ClawSweeper reviewWhat this changesThis PR adds GitHub-linked workspace project rooms, with OAuth and manual setup, signed webhook ingestion, durable project data, project APIs, and a Projects web interface. Merge readinessKeep this PR open: its live proof is credible, but the current branch still accepts GitHub repository metadata marked private while creating a workspace-public collaboration channel. Current channel reads require only workspace membership, so unrelated members can read imported private-repository activity; this needs a security-boundary decision and repair before merge. Priority: P1 Review scores
Verification
How this fits togetherProject rooms turn selected GitHub repositories into a ClickClack collaboration channel, then route signed GitHub pull-request, issue, review, comment, and check events into threads. Workspace members enter through normal channel and project APIs, while setup persists the repository mapping and webhook configuration. flowchart LR
A[Workspace manager] --> B[GitHub or manual setup]
B --> C[Project record]
C --> D[Public collaboration channel]
E[Signed GitHub webhook] --> F[Delivery validation]
F --> G[Project event router]
G --> H[Channel thread updates]
Decision needed
Why: Both paths change the promised feature boundary: rejecting unknown/private repositories preserves the existing public-channel model, while supporting them requires a new authorization model across every channel-read surface. Before merge
Findings
Agent review detailsSecurityNeeds attention: The PR can route private GitHub repository content into workspace-public channels without an enforced project-specific audience. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Keep project rooms workspace-public only for repositories whose visibility is authoritatively verified as public; disable or redesign the manual path for unknown/private visibility, or implement a project audience that is enforced across channel listing, direct reads, embeds, realtime delivery, search, and event replay before allowing private repositories. Do we have a high-confidence way to reproduce the issue? Yes—at source level, select a private repository through the picker, create its project room, then use a separate ordinary workspace-member account to list or open channels. Current main’s channel checks require workspace membership only, and the supplied branch diff declares the project room public. Is this the best way to solve the issue? No—the current approach is not safe for private repositories. A public-only, provider-verified MVP is the narrowest immediate solution; private-repository support needs an explicit, enforced project-audience design rather than participant metadata. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 4843afe2e8eb. LabelsLabel justifications:
EvidenceSecurity concerns:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (33 earlier review cycles; latest 8 shown)
|
|
@clawsweeper re-review Added the requested webhook and upgrade evidence at docs/proof/github-project-rooms/webhook-runtime-proof.md, and linked it from the PR body. The redacted live proof now covers:
Automated coverage at head |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
What Problem This Solves
ClickClack workspaces have channels and integrations, but no durable project boundary that links repositories, collaborators, and GitHub activity. Teams must manually reconstruct project context across GitHub and chat, while pull requests, issues, reviews, comments, and checks do not form shared collaboration threads.
Why This Change Was Made
This adds GitHub-linked project rooms: workspace managers can group one or more repositories and participants into a project, with a public collaboration channel created automatically. Signed GitHub webhooks turn pull requests and issues into channel threads, then route reviews, comments, updates, and checks into replies with delivery deduplication and retry-safe processing.
Repository setup now has two paths:
The project context API is intentionally read-only. This is a communications and context layer, not an agent harness, and it does not write project activity back to GitHub.
User Impact
Visibility Boundary
Project collaboration channels are visible to authenticated workspace members. GitHub permissions continue to control repository access, so a member who follows a repository link still needs access in GitHub. Project participant selection describes collaboration ownership in this MVP; it does not create a separate channel ACL.
Security And Failure Handling
Evidence
These are unannotated runtime screenshots from the live ClickClack deployment.
Pull request activity grouped into one collaboration thread
Project list with linked repositories and participants
Project creation with multiple repositories and human or bot participants
Live validation used real GitHub webhook deliveries. ClickClack created the rich PR root and added review and CI activity as thread replies. After deploying the issue handler, redelivering issue #2 returned
202 Acceptedwithupdates: 1and created a rich issue root in the project channel. Issue comments and delivery idempotency are covered by the same end-to-end webhook test.Webhook failure and redelivery proof
Inspect the redacted runtime evidence for existing-database migration, invalid-signature rejection, explicit failed-delivery recovery, duplicate suppression, and single-thread preservation on the live deployment.
Retry coverage includes SQLite and Postgres lifecycle and upgrade tests, stale-processing lease reclaim in both backends, and an HTTP handler test that injects a failure after claim and successfully processes the same delivery ID on redelivery.
Verification
go test ./apps/api/internal/httpapi ./apps/api/internal/store/sqlite ./apps/api/internal/store/postgresgo vet ./apps/api/internal/httpapi ./apps/api/internal/store/sqlite ./apps/api/internal/store/postgrespnpm --filter @clickclack/web testpnpm --filter @clickclack/web typecheckpnpm --filter @clickclack/sdk-ts typecheckpnpm typecheckpnpm lintpnpm generate:sqlcgo test ./...passes all feature API and store packages. The aggregate Windows run still reports the repository's existing platform-specificcmd/clickclackfile-mode andfile://C:\...URL assertions; this change does not touch those tests.