feat(forges): forge-agnostic groundwork, no adapter coupling 2 months ago
Authored
grim 8/17/2026, 5:07:32 AM The multi-forge scaffolding, split out from the GitLab PoC so it can land
without an adapter. Everything here works with GitHub as the only live forge.
- FORGE_CATALOG in contracts is the single list; forgeSchema/Forge derive from
its `live` entries, so adding or promoting a forge is one array edit and the
compiler walks you through the rest.
- Login + connect surfaces render straight off the catalog: 2x2 grid, shared
ForgeCell, connect dialog layered over the palette, connections settings tab.
- Rules declare forge support on the catalog entry; unusable rules are inert in
the UI and skip with a named reason instead of a misleading parse error.
- Repo revive on re-import, and disconnect drops the ownership row so repos
can't be orphaned unclaimed-but-unclaimable.
- Windows path fixes (fileURLToPath) that were blocking 71 unit tests and the
web typecheck script.
gitlab stays `planned` here: the grid shows it as an inert cell and the
adapter lives on feat/forge-gitlab-poc, which flips the one status field.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Parent5861847
84 files changed
.env.example +1 −0 .github/workflows/ci.yml +18 −0 .gitignore +3 −0 .oxlintrc.json +50 −0 apps/api/src/routes/webhooks.ts +37 −32 apps/api/src/webhooks.integration.test.ts +9 −4 apps/web/package.json +1 −1 apps/web/scripts/generate-route-tree.ts +4 −1
apps/web/src/components/auth/forge-grid.tsx +62 −0
apps/web/src/components/auth/login-faq.tsx +141 −0
apps/web/src/components/auth/login-page-skeleton.tsx +36 −6
apps/web/src/components/auth/login-page.tsx +25 −46
apps/web/src/components/common/forge-marks.tsx +128 −0
apps/web/src/components/forges/connect-forge-dialog.tsx +42 −0
apps/web/src/components/forges/connect-forge-grid.tsx +107 −0
apps/web/src/components/forges/connections-page.tsx +169 −0
apps/web/src/components/forges/forge-cell.tsx +72 −0
apps/web/src/components/layouts/command-palette.tsx +288 −189
apps/web/src/components/organizations/install-setup-page.tsx +26 −20
apps/web/src/components/organizations/org-general-settings-page.tsx +33 −4
apps/web/src/components/organizations/org-home-page.tsx +24 −35
apps/web/src/components/organizations/org-settings-dialog.tsx +8 −1
apps/web/src/components/organizations/org-settings-tab.ts +9 −4
apps/web/src/components/rules/rule-card.test.tsx +43 −0
apps/web/src/components/rules/rule-card.tsx +23 −5
apps/web/src/lib/activity.functions.ts +2 −2
apps/web/src/lib/connections.functions.ts +120 −0
apps/web/src/lib/connections.query.ts +10 −0
apps/web/src/lib/forge-connect.ts +56 −0
apps/web/src/lib/forge-copy.ts +15 −0
apps/web/src/lib/onboarding.functions.ts +19 −4
apps/web/src/lib/rules.functions.ts +22 −2
apps/web/src/lib/server/run-view.ts +3 −0
apps/web/src/routes/$org.tsx +2 −1
apps/worker/src/forge-runtime.ts +108 −0
apps/worker/src/index.ts +36 −53
apps/worker/src/jobs/pr-surface.ts +5 −1
apps/worker/src/jobs/process-event.ts +40 −22
apps/worker/src/jobs/rerun.ts +8 −4
apps/worker/src/jobs/resume-run.ts +12 −5
apps/worker/src/jobs/run-workflows.ts +6 −1
apps/worker/src/moderation.integration.test.ts +6 −3
apps/worker/src/process-event.integration.test.ts +71 −72
apps/worker/src/rerun.integration.test.ts +8 −3
apps/worker/src/toggles.integration.test.ts +2 −2
bun.lock +39 −20
package.json +4 −0
packages/auth/src/server.ts +34 −12
packages/contracts/src/events.ts +4 −3
packages/contracts/src/forges.ts +81 −0
packages/contracts/src/index.ts +1 −0
packages/contracts/src/rules.ts +46 −0
packages/core/src/rules/ai-review/rule.ts +24 −13
packages/core/src/rules/define.ts +20 −1
packages/core/src/rules/forge-support.test.ts +100 −0
packages/core/src/rules/test-context.ts +6 −1
packages/db/src/index.ts +1 −0
packages/db/src/migrate.ts +5 −1
packages/db/src/pglite.ts +4 −1
packages/db/src/schema/events.ts +2 −1
packages/db/src/schema/repos.ts +2 −1
packages/db/src/services/accounts.ts +180 −0
packages/db/src/services/events.ts +12 −3
packages/db/src/services/onboarding.ts +5 −0
packages/db/src/services/organizations.ts +14 −5
packages/db/src/services/repo-revive.integration.test.ts +165 −0
packages/db/src/services/repos.ts +85 −14
packages/forge-github/src/webhook/webhook.test.ts +6 −1
packages/forge/src/index.ts +14 −4
scripts/check-boundaries.ts +9 −1
scripts/lint-slop-changed.ts +95 −0
scripts/oxlint/anti-slop/index.ts +31 −0
scripts/oxlint/anti-slop/package.json +1 −0
scripts/oxlint/anti-slop/rules/no-chained-type-assertions.ts +77 −0
scripts/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts +49 −0
scripts/oxlint/anti-slop/rules/no-known-value-widening.ts +247 −0
scripts/oxlint/anti-slop/rules/no-object-parameters.ts +112 −0
scripts/oxlint/anti-slop/rules/no-runtime-typeof.ts +25 −0
scripts/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts +39 −0
scripts/oxlint/anti-slop/rules/no-unknown-parameters.ts +83 −0
scripts/oxlint/anti-slop/rules/no-unknown-type-aliases.ts +69 −0
scripts/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts +94 −0
scripts/oxlint/anti-slop/rules/no-widen-then-assert.ts +363 −0
scripts/oxlint/anti-slop/shared/dictionary-types.ts +448 −0