Commit Graph
70 Commits
Author SHA1 Message Date
bot-hermes 8975aeb870 fix(deploy): atomic deploys — build in builds/<sha-stamp>, verify fresh dist, swap, health-check + auto-rollback
- Stage to timestamped builds/ dir; live custom-build untouched during install+build
- Verify dist exists, non-empty, newer than stage start (stale/partial fails)
- Symlink swap stays single atomic op; previous target saved for rollback
- Post-restart health-check on / (24x5s); on failure flip back, restart, notify, exit 1
- Prune to 2 newest builds on success; notify on failure (if: failure())
- Root cause: rm -rf custom-build destroyed the live dir mid-deploy; UI 404'd until build finished
2026-09-07 17:48:29 -04:00
bot-hermes b464500310 fix: PWA improvements — clean up SW, fix chin bar, add shortcuts, improve mobile support
- Remove dead precache manifest from SW (no fetch handler to consume it)
- Set empty globPatterns in vite-plugin-pwa config
- Fix bottom chin bar padding: use scaled safe-area token instead of raw inset
- Add 'New Session' PWA shortcut (client + server manifest)
- Add PWA meta tags to mobile.html (manifest, Apple icons, theme-color)
- Fix static site.webmanifest: add id/scope, correct description
- Remove duplicate apple-mobile-web-app-title from index.html
- Move SW registration to module scope (earlier, no window.load delay)
- Update manifest route tests for new shortcut order
2026-09-07 21:37:06 +00:00
bot-hermes 4b95b327dd fix: forward agent/model/variant to session creation
createSession() only sent { directory, title } to the OpenCode server,
dropping the agent field. The create() function read payload.agent but
never forwarded it, so every session was created with the OpenCode
default (build) and the agent was only applied later at prompt time.

Now forwards agent/model/variant in the session create POST body so the
session is created with the requested agent from the start.
2026-09-06 17:25:40 +00:00
bot-hermes d2547b71bc Merge pull request 'chore: bring upstream v1.22.2 into custom' (#11) from release/v1.22.2 into custom 2026-09-06 06:56:27 -04:00
bot-hermes 4db78662d8 merge: resolve v1.22.2 conflicts with custom
Per Q4 resolution (documented on kanban t_83741c53):
- .github/workflows/*: KEEP custom deletion (fork uses Gitea Actions under .gitea/workflows)
- ChatInput.tsx: KEEP custom forge picker states + provider-aware linkedPr
- WorkStatusContextSection.tsx: combine imports (WorkStatusPill + useConfigStore)
- WorkStatusPrimaryGroup.tsx: upstream nested-git/bootstrap-gate base + custom GitLab/Gitea forge rows
- NewWorktreeDialog.tsx: combine dialogs; keep custom MR/PR branch resolution
- SettingsView.tsx: custom deps minus undefined openThirdPartyProviderSetup
- search.ts + search.test.ts: KEEP upstream (enter-to-send, large-text-paste, first-party integrations)
- tr.ts: drop 4 auto-merge duplicate gitView.empty.* keys
2026-09-06 10:55:54 +00:00
bot-hermes 0742aa959c docs: add fork banner for public release 2026-09-05 21:50:51 +00:00
bot-hermes 50b7fa976e chore: public polish — remove .env, update deploy workflow to BuzzbeeSCD org 2026-09-05 21:48:03 +00:00
bot-hermes f9fc8aa680 ci(deploy): notify on successful deploy only (moved from push webhook) 2026-09-05 20:42:43 +00:00
bot-hermes 75687dc9b0 fix: return page as object {page, next, total, hasMore, nextUrl} for routes.js compat
routes.js reads resp.page?.hasMore and resp.page?.nextUrl — the old
HTTP client returned page as an object from parsePageInfo. The CLI
pivot accidentally returned page as a number, making hasMore always
undefined in routes.js. Restore the object shape in both gitea and
gitlab clients. Update tests to assert the object shape.
2026-09-05 20:36:46 +00:00
bot-hermes 9032c9245a fix: forge CLI pivot bugs against real tea/glab binaries
Fix critical bugs in the CLI transport layer that were masked by
idealized unit test mocks. All fixes verified against live binaries.

Server (gitea/client.js):
- C1: Remove --paginate flag (tea rejects it with exit 1)
- C2: Pass auth via -H 'Authorization: token' header instead of
  GITEA_SERVER_TOKEN env (tea ignores that env var)
- C3: Parse --include output from stderr (tea writes headers to
  stderr, not stdout)
- H2: Parse Link header for hasMore/pagination

Server (gitlab/client.js):
- C4: Remove /api/v4 prefix (glab adds it automatically; double
  prefix caused every call to 404)
- H2: Parse Link header for hasMore/pagination

Tests (both client.test.js):
- H1: Rewrite mocks to match real CLI behavior: headers on stderr
  for tea, no --paginate, auth via -H header, Link header parsing
- Add C3, C1, C4 specific regression tests

UI (GiteaSettings, GitLabSettings):
- U4: Replace return null loading state with animated skeleton
  (prevents blank flash)
- U2: Surface actual error message in connect failure toast
- U5: Add CLI transport hint below connect form
- U6 (GitLab): Add transport hint for unconnected state

UI (GiteaIssuePickerDialog, GitLabIssuePickerDialog):
- U3: Add retry button when error state is displayed

Live smoke tests passed:
- tea api -H 'Authorization: token WRONG' /user → 401
- tea api /repos/Vibing/openchamber/issues?state=open&limit=2 → 200
- glab api user with GITLAB_TOKEN=dummy → 401 (not 404)
2026-09-05 20:26:35 +00:00
bot-hermes c03fbda7a9 Merge pull request 'forge CLI pivot: rewrite gitea+gitlab clients to tea/glab transports' (#9) from feat/forge-cli-pivot into custom 2026-09-05 10:15:22 -04:00
bot-hermes 77e7dd1127 forge CLI pivot: rewrite gitea+gitlab clients to tea/glab transports
Replace raw fetch transport with CLI subprocess calls:
- Gitea: spawn 'tea api --include' with GITEA_SERVER_TOKEN env var
- GitLab: spawn 'glab api --include' with GITLAB_TOKEN env var

Binary paths env-overridable (TEA_BIN / GLAB_BIN).
8s request timeout via AbortSignal on spawned process.
ETag cache and rate-limit cooldown dropped (tradeoff documented).
Pagination via --paginate for list endpoints.
Tests mock child_process.spawn instead of globalThis.fetch.
2026-09-05 14:06:04 +00:00
bot-hermes aa0e3a222c ci: retrigger deploy (ssh config fixed) 2026-09-05 09:05:02 -04:00
bot-hermes b3c24935c0 ci(deploy): use SSH URL for checkout clone
The https://gitea@giteassh.buzzbee.dev:Vibing/... URL parsed the colon as a
port. Use the SSH form gitea@giteassh.buzzbee.dev:Vibing/openchamber.git
which the runner's deploy key authenticates.
2026-09-05 09:00:04 -04:00
bot-hermes cd6b24d9b0 ci(deploy): clone into subdir, don't rm the runner cwd
rm -rf $GITHUB_WORKSPACE deleted the runner's own working directory,
breaking git clone (fatal: Unable to read current working directory).
Clone into $GITHUB_WORKSPACE/repo instead.
2026-09-05 08:58:53 -04:00
bot-hermes 75e81211ea ci(deploy): add checkout step to deploy workflow
The workflow assumed $GITHUB_WORKSPACE was already a git repo, but the
host-mode runner doesn't auto-checkout. Added an explicit clone step using
the runner's deploy key (gitea@giteassh.buzzbee.dev).
2026-09-05 08:57:27 -04:00
bot-hermes 69ee51abc7 Merge pull request 'ci: deploy custom branch to OpenChamber-CUSTOM' (#7) from ci/deploy-custom into custom 2026-09-05 08:54:21 -04:00
bot-hermes 99edcbb24c chore(ci): remove upstream .github workflows from fork
The fork only needs its own deploy pipeline (.gitea/workflows/deploy-custom.yml).
All 17 upstream workflows (bot-help, pr-review, oc-review, mobile-ci, release,
stale, vscode-extension, etc.) are noise on this fork — they target upstream's
bot accounts, macOS/mobile release machinery, and comment triggers that don't
apply here. They were also failing with 'Resolve pull request context' errors
because they're designed for upstream's environment, not our fork.
2026-09-05 08:53:56 -04:00
bot-hermes e67987533e ci: add deploy workflow for custom branch (OpenChamber-CUSTOM) 2026-09-03 11:36:34 +00:00
bot-hermes 057e451068 Merge pull request 'fix: remove stray v1.22.0 merge marker in ContextPanelRail.tsx' (#6) from fix/v1.22.0-marker into custom 2026-09-03 07:19:42 -04:00
bot-hermes 12e36f9f7f fix(ui): remove stray v1.22.0 merge-conflict marker from ContextPanelRail.tsx 2026-09-03 11:17:49 +00:00
bot-hermes e70af9ae1f merge: resolve v1.21.1 conflicts with custom
Resolve all 10 upstream v1.21.1 merge conflicts into custom, keeping
custom's GitLab/Gitea forge customizations layered on upstream while
lifting upstream improvements. Restored tr.ts i18n key parity with the
custom en.ts dictionary (471 custom forge keys added, en fallback) so the
upstream-introduced locale stays in parity.

Also stage bun.lock version alignment (1.21.0 -> 1.21.1) that matches the
staged package.json bump.

Verification: ui + web type-check pass; ui/web tests pass except
pre-existing failures on the custom baseline (forge.test.ts, session-actions,
issue-1637-2270, routes.test.js fs-stat directory scope).
2026-08-30 06:56:43 -04:00
bot-hermes 6b2b12382e Merge pull request 'chore: bring upstream v1.20.0 into custom' (#2) from release/v1.20.0 into custom 2026-08-28 22:05:23 -04:00
bot-hermes 404b417d10 revert: exclude workflow file change (no workflow scope on fork token) 2026-08-20 14:49:26 +00:00
bot-hermes 285f551cd5 Merge remote-tracking branch 'origin/main' into feat/gitlab-issues-mrs
# Conflicts:
#	packages/ui/src/components/chat/work-status/WorkStatusContextSection.tsx
#	packages/ui/src/components/chat/work-status/WorkStatusPrimaryGroup.tsx
2026-08-20 14:47:33 +00:00
bot-hermes d8bcd40e2c docs: add forge view and work-status evidence screenshots 2026-08-20 14:27:41 +00:00
bot-hermes 1f03b83db1 fix(walkthrough): thread directory into GitLab diff client and fix tests
- Add directory parameter to getGitLabMergeRequestDiff for per-project
  API base URL override resolution
- Mock getGitLabAuth/getEffectiveProviderApiBaseUrl in walkthrough tests
- Update auth-check test to mock null auth instead of null client
2026-08-18 20:47:36 +00:00
bot-hermes 4ce02ee569 fix: address bot review findings
- Add codeberg.org to deriveLinkedIssueProvider built-in Gitea check
- Fix Gitea PR review prompt: !N → #N (GitLab vs Gitea syntax)
- Update gitlab.mdx: remove 'read-only' claim (write support ships)
- Gate walkthrough Gitea PR source (server can't fulfill yet)
- Thread per-project API base URL override into walkthrough GitLab diff
- Stop following cross-origin redirects in GitLab/Gitea clients (auth leak prevention)
2026-08-18 20:35:46 +00:00
bot-hermes 707991665a Merge remote-tracking branch 'origin/main' into feat/gitlab-issues-mrs
# Conflicts:
#	packages/ui/src/components/chat/work-status/WorkStatusContextSection.tsx
#	packages/ui/src/lib/i18n/messages/de.ts
#	packages/ui/src/lib/i18n/messages/en.ts
#	packages/ui/src/lib/i18n/messages/es.ts
#	packages/ui/src/lib/i18n/messages/fr.ts
#	packages/ui/src/lib/i18n/messages/ja.ts
#	packages/ui/src/lib/i18n/messages/ko.ts
#	packages/ui/src/lib/i18n/messages/pl.ts
#	packages/ui/src/lib/i18n/messages/pt-BR.ts
#	packages/ui/src/lib/i18n/messages/uk.ts
#	packages/ui/src/lib/i18n/messages/zh-CN.ts
#	packages/ui/src/lib/i18n/messages/zh-TW.ts
#	packages/web/server/lib/opencode/settings-helpers.js
2026-08-18 20:22:15 +00:00
bot-hermes 623b422a07 docs: add Gitea connected-state screenshot 2026-08-18 20:10:40 +00:00
bot-hermes bf8893f3c5 chore(ui): remove dead forge exports and unused useForgeProvider hook
- Remove useForgeProvider React hook (dead; only imperative
  getForgeProviderForDirectory was used, by tests)
- Remove toLookupOptions export from useForgeLookup (only used
  within file)
- Remove ForgeEditForm barrel re-export from forge/actions/index
  (imported directly by ForgeEntityActions)
- Strip forge/index.ts barrel to only actually-consumed exports
  (buildForgeProvider, ForgeIssue, ForgeCommit, ForgeFileChange,
  mapGithubPr)
- Remove ForgeTimelineSection/ForgeChecksSection from views barrel
  (imported directly by ForgeEntityDetailView)
2026-08-18 19:26:49 +00:00
bot-hermes 0bd532afbc docs: add visual evidence screenshots for PR 2026-08-18 18:09:11 +00:00
bot-hermes 5481e19069 test(ui): include gitProvidersConnected in settings search fixture 2026-08-17 10:08:31 +00:00
bot-hermes 45437a4221 feat(web,ui): per-project forced git provider and settings gating
Adds a per-project forced provider (github|gitlab|gitea) on top of the
per-project API base URL overrides: stored under gitProviders.provider in
projects/<projectId>.json, sanitized server-side, and winning over remote-host
detection both in useGitProvider and in server repo resolution
(parseGitLabRemoteUrl/parseGiteaRemoteUrl accept any host when the provider
is forced). The Projects settings page replaces the three always-visible URL
fields with a provider selector (auto-detect + the three forges) and one URL
override for the active provider. Global provider override fields on the
GitHub/GitLab/Gitea settings tabs now render only once an account is
connected, and Settings search availability matches that gating.

Also fixes the useConfigStore/useDirectoryStore circular-import TDZ in the
bundled chunk via the window-registered store handle and defers the directory
subscription to a microtask; fixes the Gitea PR merge payload (Do carries the
merge-style string enum, not a boolean + MergeMethod); and adds a documented
Gitea client live-test harness (scripts/gitea-live-test.ts + client.d.ts).
2026-08-17 09:57:54 +00:00
bot-hermes 66edc74fac feat(web,ui): per-project git provider API base URL overrides
Per provider (github|gitlab|gitea) a project override stored in
~/.config/openchamber/projects/<projectId>.json under gitProviders wins
over the global settings.json value (precedence: project override > global
> built-in default). Server forge routes resolve the override per request
directory (worktree-aware via git-common-dir + containment + path fallback,
60s TTL cache); the override host is also accepted for remote parsing and
client detection. New GET/PUT /api/projects/:projectId/git-providers route;
client openchamberConfig preserves the server-owned gitProviders key;
Projects page gains a Git provider API base URLs section; detection store
hydrates per-project overrides (memory-only, server-authoritative).
2026-08-17 09:57:54 +00:00
bot-hermes 697925ee0d feat(web,ui): built-in codeberg.org gitea host and provider detectUrls 2026-08-17 09:56:59 +00:00
bot-hermes a30c7bce0a feat(ui): tabbed git provider settings with search auto-reveal 2026-08-17 09:56:59 +00:00
bot-hermes 0fc857959e feat(web,ui): per-provider git forge API base URL and detection URLs
Configure a default API base URL per git provider (github/gitlab/gitea)
in settings.json gitProviders, with GitHub Enterprise support (Octokit
baseUrl + device-flow web origin derived from the API base), and replace
the client-side custom-domains list with server-persisted detection URL
chips (SSH/HTTPS forms normalized to hosts). The configured API base host
auto-counts as a detection host. Settings round-trip through the existing
/api/config/settings sanitizer; the UI store hydrates from server settings
with a one-time localStorage migration.
2026-08-17 09:55:11 +00:00
bot-hermes a87b3fd228 fix(ui): render forge lookup dropdowns in a portal
The assignee/label/milestone combobox and @-mention list were inline
absolute-positioned inside the ContextPanel rail (overflow-hidden) and the
PR-view scroll container, so the panels were clipped and invisible. Render
both via createPortal to document.body with fixed positioning computed from
the trigger's viewport rect (viewport-edge clamping, flip to the other side
when there is no room), close on outside pointerdown/scroll/resize while
still allowing interaction inside the panel, and keep the panel inside the
outside-click check.

Also show the loading spinner until the first lookup completes instead of a
brief 'No matches' flash (useForgeLookup now reports 'initialized').
2026-08-16 16:29:25 +00:00
bot-hermes 66adb65377 test(web): gitea issue creation — wire api coverage, module docs, section comment
The Gitea create-issue path (server route, client, wire api, facade, UI
button/dialog) landed with the forge user-lookup work; close the remaining
verification/documentation gaps:

- wire: gitea.test.ts covers issueCreate (POST /api/gitea/issues/create,
  full/optional body, error throw)
- docs: DOCUMENTATION.md lists createIssue client method and the
  POST /repos/{owner}/{repo}/issues endpoint (labels as names)
- ui: fix stale 'read-only by design' JSDoc in GiteaIssuesSection — creation
  is offered here and the detail view provides edit/close/reopen
2026-08-16 16:29:25 +00:00
bot-hermes 3b3799f79e fix(web): optional fs stat outside workspace returns exists:false
Graceful probe: an optional stat of a config/backup path outside the active
workspace now reports exists:false instead of 400, so boot-time probes don't
surface console errors for a check that was never mandatory.
2026-08-16 16:29:25 +00:00
bot-hermes 3800c84948 feat(ui): forge user lookup — assignee combobox, @-mentions, repo-scoped user search
Repo-scoped assignable-user search for GitHub, GitLab, and Gitea, surfaced as
an assignee combobox in the metadata editor and @-mention autocomplete in
forge comment/reply/review surfaces.

- server: GET /api/{provider}/users/search (assignees / project members),
  query + directory/override repo resolution, 429 -> 503, connected:false
  degradation; GitLab assignee writes resolve login -> ID server-side
- wire: searchUsers (+ searchLabels/milestones/branches/tags) on the three
  API clients with tests
- facade: userSearch capability (all three), searchUsers adapters,
  mapGithubAssignee/mapGitlabMember/mapGiteaAssignee -> ForgeUser
- ui: ForgeLookupCombobox (keyboard nav, debounced 30s-TTL cache,
  connected-only caching), ForgeMentionTextarea (@ token parsing, caret
  restore), free-text fallback when lookup is unavailable; i18n in 12 locales
- extras sharing the same infrastructure: GitLab create-issue dialog and
  label/milestone/branch/tag lookups in the metadata editor
2026-08-16 16:29:25 +00:00
bot-hermes 1f28b61c5a feat(ui): chat-entity linking — live linked-entity cards, manual link/unlink, session cross-listing
- linkedIssues: provider/repo/host fields (backward-compatible), gitea id generation fix, parseLinkedIssueRef/parseForgeEntityUrl
- work-status panel: live state cards (TTL-cached), link-by-URL dialog, per-row unlink
- forge entity view: 'Chats working on this' section derived from the session store
2026-08-16 16:29:25 +00:00
bot-hermes 8f5cfdcd62 feat(ui): forge write operations — comments, replies, close/reopen, edit, reviews, draft, metadata
- server: write routes for all three providers (issue/PR comments, inline review-comment replies, issue/MR updates w/ labels-assignees-milestone, review submit, draft toggle)
- ui: ForgeProvider gains six write ops; shared action components (composer, thread reply, state/review/draft/metadata/edit) wired into ForgeEntityDetailView and GitHub PR Overview
2026-08-16 16:29:24 +00:00
bot-hermes 92f0eced34 feat(ui): rich forge entity views — commits, files/diff, timeline, checks, metadata chips
- server: new read routes for PR/MR commits, timeline, reviews, commit-statuses across github/gitlab/gitea; enrich PR/issue summaries with labels/assignees/milestone/commentsCount
- ui: forge facade gains getCommits/getTimeline/getChecks; shared ForgeEntityDetailView + section components; mounted into PR/MR views and issue sections
2026-08-16 16:29:24 +00:00
bot-hermes f02c33700b feat(ui): forge facade foundation — normalized types, capability flags, three adapters 2026-08-16 16:27:50 +00:00
bot-hermes bb46866879 feat(ui): add Gitea brand icon and use it for detected Gitea providers
Add the Gitea teapot mark (Simple Icons, 24x24) to the icon sprite as a
custom icon, and swap the gitea fallback icons for it wherever the
provider brand is shown: context rail PR surface, context panel PR tab,
GitHeader PR chip, and the work-status Gitea PR row.
2026-08-16 16:27:50 +00:00
bot-hermes b772f5dad9 fix(ui): support bare scp and IPv6 host forms in git provider detection
Extract a single shared parseGitHost (packages/ui/src/lib/gitHost.ts) used
by both the custom-domain registry (normalizeProviderDomain) and remote
detection (gitProvider). Previously both parsers required a user@ prefix,
rejecting valid bare scp remotes like codeberg.org:owner/repo.git, and
mangled IPv6 hosts. Now scp forms with or without a user, ssh:// URLs with
ports, git+ssh scheme, and bracketed/unbracketed IPv6 all normalize to a
bare hostname; Windows-path-like input is rejected.
2026-08-16 16:27:50 +00:00
bot-hermes ca91fd7e2d feat(gitea): add Gitea/Forgejo as a git provider
Full parity with the existing GitLab provider:
- Server module packages/web/server/lib/gitea (auth/client/repo/routes + docs + tests)
  with Gitea REST v1 API, PAT + base URL auth, multi-account storage
- Shared GiteaAPI types and web API client
- Provider detection generalized with user-configurable custom domains
  per provider (github/gitlab/gitea), additive with built-in defaults
  (github.com, gitlab.com) and connected-account hosts; precedence
  github -> gitlab -> gitea
- Gitea PR view, issues section, pickers, integration dialog, branch
  PR status helper, settings UI (PAT + base URL + custom domains)
- Magic prompts (gitea.pr.review, gitea.issue.review) and full 11-locale
  i18n parity
2026-08-16 16:27:49 +00:00
bot-hermes be13272eb1 feat(ui): issues tabs in GitLab MR and GitHub PR views
Add an Issues tab alongside the merge-request / pull-request content in the
context panel's PR surface for both providers. The tab lists open issues
lazily and expands a selected issue into an inline detail view (body, labels,
assignees, comments) with a back action. Read-only: no issue create, update,
or close actions. Adds 15 i18n keys across all 11 locales.
2026-08-16 16:27:49 +00:00
bot-hermes 7c8c2bba3f feat(ui): head branch selector in the GitHub pull request create form 2026-08-16 16:27:49 +00:00
bot-hermes d5dea0c004 feat(ui): branch selectors in the GitLab merge request create form 2026-08-16 16:27:48 +00:00
bot-hermes c25e16d093 feat(ui): GitLab brand icons in GitLab surfaces 2026-08-16 16:27:48 +00:00
bot-hermes 51ffe54788 fix(ui): provider-aware context tab icon 2026-08-16 16:26:02 +00:00
bot-hermes 7bf07f0dd9 fix(ui): provider-aware context rail branding for GitLab 2026-08-16 16:24:40 +00:00
bot-hermes 06a5dd63bb fix(ui): label GitLab merge requests as MR in the composer 2026-08-16 16:23:40 +00:00
bot-hermes 324dca9057 feat(ui): create, update and merge GitLab merge requests from the MR view 2026-08-16 16:23:39 +00:00
bot-hermes 28d992ac78 feat(web): create, update and merge GitLab merge requests 2026-08-16 16:23:39 +00:00
bot-hermes b8a0aa0242 feat(web): resolve walkthrough diffs for GitLab merge requests 2026-08-16 16:23:38 +00:00
bot-hermes 89db325168 feat(ui): show GitLab merge request status in walkthrough, git view and work status 2026-08-16 16:23:38 +00:00
bot-hermes 2c4ba78ae5 feat(ui): GitLab merge request view in the context panel 2026-08-16 16:23:37 +00:00
bot-hermes 454b3591e5 feat(ui): attach GitLab issues and merge requests to sessions 2026-08-16 16:23:36 +00:00
bot-hermes 267db3fb9d feat(web): filter GitLab merge requests by source branch 2026-08-16 16:23:36 +00:00
bot-hermes 6868a58359 fix(ui): hide GitHub surfaces in non-GitHub repositories 2026-08-16 16:23:36 +00:00
bot-hermes e83bd2bc08 fix(ui): refresh GitLab auth status on worktree dialog mount 2026-08-16 15:42:26 +00:00
bot-hermes a05056a871 feat(ui): start worktree sessions from GitLab issues and merge requests 2026-08-16 15:42:26 +00:00
bot-hermes a42eec5c9c feat(ui): add GitLab connect settings 2026-08-16 15:42:26 +00:00
bot-hermes d798b3f479 feat(web): add GitLab issues/MRs server module
Add a server-side GitLab integration mirroring the GitHub module:
- auth.js: PAT auth storage with multi-account support and configurable
  base URL (gitlab.com default, self-hosted instances supported)
- client.js: raw-fetch GitLab REST v4 client with per-request timeout,
  ETag conditional-GET cache, own rate-limit cooldown, pagination, and
  single-follow redirect handling
- repo.js: GitLab remote URL parser + directory resolution
- routes.js: read-only /api/gitlab/* routes (auth, issues, MRs, branches)
- index.js + DOCUMENTATION.md + unit tests for auth, client, repo, routes
- Wire registerGitLabRoutes into feature-routes-runtime
2026-08-16 15:42:26 +00:00
bot-hermes b5ddb6f3a1 feat(web): add GitLab API client wrapper and types 2026-08-16 15:42:26 +00:00
bot-hermes f16a5bab6b docs: add GitLab issues/MRs page 2026-08-16 15:42:26 +00:00