Home

boring / v2

publicBoring-Software-Inc/v2
Overview Code History Branches Pull requestsIssuesInsights Campfire Docs
main
HomeOverview Code PRsIssues

feat(forges): forge-agnostic groundwork, no adapter coupling

2 months ago

bb640fd
Authored
grim8/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