Commit Graph

61 Commits

Author SHA1 Message Date
erangel1 366941feb1 Update docker-compose.prod.yml 2026-05-12 23:41:24 +00:00
erangel1 df6d53c12c Update docker-compose.prod.yml 2026-05-12 23:38:11 +00:00
erangel1 d384af0d9c Delete ai_agent_master_prompt_for_building_modern_git_platform.md 2026-05-12 23:30:34 +00:00
erangel1 dea58b85b8 fixed issues from opencode agent dev-fa 2026-05-13 01:08:19 +02:00
erangel1 994570ca74 added ai prompt to gitignore file 2026-05-13 00:56:41 +02:00
erangel1 77268e2302 edited ci file 2026-05-13 00:55:28 +02:00
erangel1 f99f0e0fc5 random edits 2026-05-12 22:51:04 +02:00
erangel1 91462500f0 added artifacts 2026-05-12 22:34:26 +02:00
erangel1 822f723ff1 added signed artifacts and SBOM generation capabilities 2026-05-12 21:31:43 +02:00
erangel1 ab94775162 implemented federation 2026-05-12 20:55:13 +02:00
erangel1 e360f3697e implemented observability 2026-05-12 20:32:30 +02:00
erangel1 c7df53708c implemented gitops controller + drift detection 2026-05-12 19:51:59 +02:00
erangel1 35afa8d8f1 fixed PR issue 2026-05-11 23:56:45 +02:00
erangel1 edf3c9824e Phase 3C — Commit Summary
feat: workspaces — collaborative repo namespaces
Backend
- internal/models/workspace.go — Workspace (handle, displayName,
  description, createdBy) + WorkspaceMember (workspaceId, userId,
  username, role: owner/admin/member)
- internal/models/repo.go — added nullable workspace_id column; existing
  user repos unaffected
- internal/models/migrations/011_workspaces.go — syncs both tables +
  adds column to repository
- internal/api/handlers/workspace.go — ListWorkspaces, CreateWorkspace,
  GetWorkspace, UpdateWorkspace, DeleteWorkspace (blocks if repos
  remain), ListRepos, ListMembers, AddMember, UpdateMember, RemoveMember
- internal/api/handlers/repos.go — lookupRepo resolves workspace
  handles; Create accepts workspace field; List includes workspace
  member repos; withOwnerName uses workspace handle for workspace-owned
  repos
- internal/api/handlers/dashboard.go — recentRuns + repo list include
  workspace repos the user is a member of
- internal/api/router.go — /workspaces, /workspaces/:handle/* routes
  Workspace rules enforced:
- Handle globally unique across usernames + workspace handles (409 on
  collision)
- Creator auto-assigned owner role
- Delete blocked if repos exist
- Last owner cannot be demoted/removed
  ---
  feat: secret management hierarchy (Global → Workspace → Repo → Env)
  Backend
- internal/models/secret.go — Secret struct +
  EncryptSecret/DecryptSecret with AES-256-GCM (key = SHA-256 of
  SESSION_SECRET); values never serialised to JSON
- internal/models/migrations/012_secrets.go — syncs secret table
- internal/api/handlers/secret.go — List/Upsert/Delete for all four
  scopes; ResolveSecretsForRun builds merged env map for CI
- internal/domain/ci/executor.go — JobContext.Secrets field; secrets
  injected as --env KEY=VALUE into docker run; buildJobContext calls
  resolveSecrets(Global < Workspace < Repo < Env)
- internal/domain/ci/runner_manager.go — passes cfg.SessionSecret to
  buildJobContext
- internal/api/router.go — /repos/:owner/:repo/secrets,
  /environments/:envName/secrets, /workspaces/:handle/secrets,
  /admin/secrets
  ---
  feat: workspace + secret management UI
  Frontend
- types/api.ts — Workspace, WorkspaceWithMeta, WorkspaceMember,
  SecretListItem types
- api/queries/workspaces.ts — full CRUD hooks + WorkspaceRepo type
- api/queries/secrets.ts — repo/env/workspace secret hooks
- pages/WorkspacesPage.tsx — list + create modal
- pages/WorkspacePage.tsx — workspace dashboard with repo list
- pages/WorkspaceSettingsPage.tsx — general settings, members CRUD,
  workspace secrets, danger zone
- pages/RepoSecretsPage.tsx — repo secrets + per-environment secret
  sections with priority hierarchy callout
- pages/CreateRepoPage.tsx — ?workspace= query param pre-fills owner
  selector; only admin/owner workspaces shown
- components/layout/Sidebar.tsx — "Workspaces" global nav item +
  workspace quick-links; "Secrets" in RepoSubNav; new SecretsIcon,
  WorkspaceIcon
- App.tsx — routes for /workspaces, /workspaces/:handle,
  /workspaces/:handle/settings, /repos/:owner/:repo/secrets
2026-05-11 23:34:46 +02:00
erangel1 06e96ba16a implemented unified operational timeline. situational awareness 'what changed before it broke?' 2026-05-11 23:02:40 +02:00
erangel1 24bf4706e1 feat: environment model + deployment tracking (phase 3a)
- Environment/Deployment XORM models + migration 010
- Full CRUD API: GET/POST/PATCH/DELETE /environments + /deployments
- Deployment status update endpoint, publishes deployment.* NATS events
- EnvironmentsPage with deploy cards, history accordion, deploy modal
- Sidebar Environments nav item between Pipelines and Settings
- Repo page deployment status badges (env name + SHA pill per
  environment)
- Environment/Deployment types in types/api.ts + environments.ts query
  hooks
2026-05-11 21:20:12 +02:00
erangel1 4f2fb846dd pipeline dag visualization + Dashboard command center upgrade + command palette wiring. fixed repo pipeline page. 2026-05-11 20:49:48 +02:00
erangel1 3838aa1f53 fixed issues 2026-05-11 20:26:27 +02:00
erangel1 4002a3b84d completed phase 2b 2026-05-11 20:10:45 +02:00
erangel1 83d96d0a1e implemented NATS event bus, websocket hub upgrade, and audit log 2026-05-11 19:38:02 +02:00
erangel1 db0f402ab2 implemented agents, readme, and changelog md files for ai-assisted
development.
2026-05-11 19:22:11 +02:00
erangel1 6d5122bc11 fixed yet again... 2026-05-07 23:41:17 +02:00
erangel1 e4364b0c2f fixed problem with '/' causing loading issues with application 2026-05-07 23:33:24 +02:00
erangel1 97a893952f fixed application 2026-05-07 22:57:50 +02:00
erangel1 dc074a5ce7 edited files 2026-05-07 17:49:05 +02:00
erangel1 5486396c91 edited docker compose prod file 2026-05-07 17:41:51 +02:00
erangel1 7354e1309f working state of application 2026-05-07 17:33:50 +02:00
erangel1 0310986644 Backend (prs.go):
Update — PATCH /{prID} edits title and/or body, validates title non-empty, returns prWithReviewers
Reopen — POST /{prID}/reopen transitions closed → open, fires webhook
Close now returns prWithReviewers and fires a webhook
Merge already existed; no changes needed
Frontend — PRDetailPage.tsx full rewrite:

Inline title editing — pencil icon (visible to author/admin when open), Enter to save, Esc to cancel
Inline body editing — same pattern in the description panel
Merge sidebar — radio buttons for allowed strategies (fetched from repo's merge strategy settings), "Merge pull request" button in Bitbucket purple, "Close without merging" below it
Status banner — merged (purple) or closed (grey) with the date, shown below the description
File list — scrollable +N −N table above the diff viewer showing all changed files with addition/deletion counts
Reopen button — appears in the sidebar when the PR is closed
Reviewers panel — lists assigned reviewers with avatars/initials
Details panel — from/into branches, opened date, last updated
Quick links — back to all PRs, open new PR
PRsPage.tsx — now shows real data:

Two tabs: "My pull requests" and "Awaiting my review" (with live counts from dashboard)
Per-repo quick links at the bottom showing open PR count badges
2026-05-07 17:07:16 +02:00
erangel1 7436679eac Backend — GET /api/v1/dashboard (single authenticated request):
Aggregates repos, open PRs, review queue, open issues server-side
Per-repo PR and issue counts computed in one pass
Review queue pulls PRs where the user is an assigned reviewer (from pr_reviewers table), excluding their own PRs
Frontend — complete redesign of DashboardPage.tsx:

Section	What it shows
Stats bar	Repo count · My PRs · Reviews awaiting · Open issues — each a clickable nav pill
⌘K Command palette	Fuzzy search across repos, PRs, issues with keyboard nav (↑↓ / Enter / Esc), quick-nav shortcuts when empty
Needs attention	Only appears when review queue is non-empty; badges each PR as "Review requested"
My pull requests	Open PRs I authored, with source→target branch, repo context, relative timestamp
My open issues	Issues I filed, linked to the repo issue list
Workspaces	My repos, prioritising recently visited (from useRecentRepos), with PR/issue count badges
CI/CD	Honest placeholder until pipeline integration lands
Quick actions	New repo · Import · Explore · Settings — always one click away
Empty state	Shows only when user has zero repos
2026-05-07 16:36:45 +02:00
erangel1 b624337b4a Debounced search bar — queries update 300ms after typing stops, clears with ✕ button
Repositories tab — lists all public repos as cards with owner/name link, description, default branch chip, last-updated time; sort by recently updated / newest / name A–Z; prev/next pagination
Users tab — grid of user cards with avatar/initials, username, join date; pagination
Skeleton loaders while fetching, opacity fade during page transitions
All state (tab, sort, query) reflected in the URL so links are shareable
2026-05-07 16:21:35 +02:00
erangel1 803672a610 Git LFS section is live with:
Enable LFS toggle — turns LFS on/off for the repo; all other controls dim when disabled
File locking toggle — enables the LFS locking protocol for binary assets
Maximum file size — optional per-file size cap in MB (blank = unlimited)
Info callout linking to the git-lfs client install page and noting the .gitattributes requirement
2026-05-07 16:12:25 +02:00
erangel1 39eeccb314 Backend:
Fixed the undefined: prWithReviewers compile error — added prResponse struct and prWithReviewers helper in prs.go, and updated Get to return reviewers alongside the PR
Registered PRSettingsHandler in router.go with routes for /default-reviewers, /default-description, and /excluded-files under /{owner}/{repo}
Frontend (prs.ts):

useDefaultReviewers / useAddDefaultReviewer / useRemoveDefaultReviewer
useDefaultDescription / useUpdateDefaultDescription
useExcludedFiles / useUpdateExcludedFiles
RepoSettingsPage.tsx — three new fully functional sections:

Default reviewers — avatar list with add/remove, auto-assigned on PR creation
Default description — Markdown textarea pre-fills new PR bodies
Excluded files — glob patterns textarea, excludes matched files from PR diffs
2026-05-07 16:05:07 +02:00
erangel1 3b1368e16d initial completion 2026-05-07 15:51:38 +02:00
erangel1 f211cfc7db Branch restrictions — fully enforced:
CRUD rules with pattern (exact or glob like release/*), requirePR, blockForcePush, bypass user list
Enforcement via pkt-line parsing inside the git HTTP handler — before any data reaches git http-backend, each ref update is extracted and checked against stored rules
Direct push to main with requirePR: true → 403 with message; push to unprotected branches still works
Inline checkboxes in the UI update rules immediately
Branching model — stored config:

GET/PUT per repo, defaults to feature/bugfix/release/hotfix prefixes
Toggle enabled/disabled, custom prefix per type with live preview
No enforcement (naming guide only, as Bitbucket does)
Merge strategies — enforced in PR merge endpoint:

GET/PUT per repo, defaults all three allowed
Merge handler now accepts strategy: "merge"|"squash"|"rebase" in request body, checks against stored policy
Disallowed strategy → 409 with clear error; allowed strategy → merges and fires pull_request webhook
Must have at least one strategy enabled (validated server-side)
Webhooks — full delivery with HMAC:

CRUD with title, URL, secret (optional), events (push/pull_request/issue), active toggle
Test button sends live HTTP POST to the configured URL and shows status code in UI
FireWebhooks() fires asynchronously from PR merge and can be called from any handler
X-ForgeBucket-Signature-256: sha256=<hmac> header when secret is set
Last delivery status and timestamp stored on webhook record and shown in list
2026-05-07 15:27:48 +02:00
erangel1 53aa5cbbf5 security sections are fully functional 2026-05-07 15:06:45 +02:00
erangel1 5e60b814ed repo permissions section is not functional 2026-05-07 14:49:47 +02:00
erangel1 8cb918b064 darkmode is now available 2026-05-07 13:42:46 +02:00
erangel1 ec309eb626 repo details page working completely 2026-05-07 13:26:11 +02:00
erangel1 12bcf59bc9 repo details page mostly working 2026-05-07 13:04:13 +02:00
erangel1 00aede9c91 changed layout of repo settings page 2026-05-07 12:32:07 +02:00
erangel1 39dd9ab9eb can now import repos and have more settings for creating new ones. 2026-05-07 12:16:58 +02:00
erangel1 dad82a79de readme file is now rendering in repo. can now view files and edit them. can switch between branches with dropdown menu 2026-05-07 11:28:06 +02:00
erangel1 779a1fdb82 overhaul complete 2026-05-07 11:02:34 +02:00
erangel1 d860d78543 test commit 2026-05-07 10:34:19 +02:00
erangel1 9ad2672a66 init commit 2026-05-07 10:27:16 +02:00
erangel1 dea186c995 making progress 2026-05-07 02:06:54 +02:00
erangel1 7b7e2d399c phase 3 completed 2026-05-07 01:33:58 +02:00
erangel1 44359c1bb0 phase 3 bug repositories fixes 2026-05-07 01:15:32 +02:00
erangel1 200c4f43ea phase 3 bug fixing 2026-05-07 00:55:46 +02:00
erangel1 ce2aa2c776 phase 3 initial completion 2026-05-07 00:22:45 +02:00