Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,18 @@ the resolved app appearance automatically.

## Features

- **More hosting providers** — GitLab merge requests and Bitbucket Cloud pull
requests use the review workspace, with paged lists, comments, inline threads
and supported review decisions. GitHub Enterprise/custom hosts use their own
CLI authentication scope; select custom adapters in Settings → Hosting.
GitLab merges guard the reviewed head and follow project settings. Bitbucket
merge, GitLab request-changes and Bitbucket draft transitions remain
provider-site actions. Bitbucket Server is not supported.
- **Publish repository** — create an empty GitHub/Enterprise, GitLab or Bitbucket
Cloud repository after reviewing its account, destination and visibility.
Add the remote, then explicitly choose whether to push the reviewed commit.
Interrupted creation and remote setup can be resumed from the same dialog.

- **Personal user actions** — define repository, ref, and working-tree file
commands in Settings → Integrations. Menu and palette entries open an exact
executable/argument/working-directory preview, with bounded output and cancellation.
Expand Down
16 changes: 16 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2200,6 +2200,8 @@ and Store certification remain external gates.
- ◐ Hosted-review expansion — GitLab/Bitbucket adapters, deeper pagination,
merge queue/auto-complete, and review-evolution
comparisons build on the completed GitHub/Azure 1.0 workspace.
GitLab, Bitbucket Cloud and custom GitHub host adapters are complete;
the remaining expansion items stay open.

**AI commit messages (2026-07-01):** Subscription-first suggestions prefer the
staged diff, and fall back to all unstaged changes when no staged diff exists —
Expand Down Expand Up @@ -2833,6 +2835,20 @@ as did the frontend typecheck and five focused frontend tests.

---

**Hosted adapters shipped (2026-09-06):** GitLab merge requests and Bitbucket
Cloud pull requests share the existing review workspace, with paged collections,
provider-specific inline coordinates, permission-gated controls and explicit
fallbacks for unsupported writes. Custom GitHub hosts use host-scoped CLI
authentication and per-remote adapter selection. GitHub.com and Azure routing
remain intact. Bitbucket merge stays on the provider because its API cannot
atomically guard the reviewed head.

**Hosted repository publication shipped (2026-09-06):** Publish repository
reviews an authenticated GitHub/Enterprise, GitLab or Bitbucket Cloud destination,
creates an empty repository, adds its remote, then separately offers an explicit
push of the reviewed commit. A local recovery record survives partial failures;
uncertain creation checks the destination without repeating the create request.

**Patch interchange shipped (2026-09-06):** Added affected-path previews,
explicit index/worktree targets, validated import, original-author mailboxes
with Continue/Skip/Abort, and bundle verification/import/export with
Expand Down
21 changes: 15 additions & 6 deletions TASKS.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,11 @@ Detailed comparison and sequencing: [`docs/git-client-1.0-audit.md`](./docs/git-
execution (`bisect.rs`, `BisectDialog`, Repository menu/palette and banner;
three native fixtures, two frontend tests and native WebView2 keyboard,
external-resume, dirty-reset and original-target checks).
- **F14 / P2 — Publish a new hosted repository.** Provider/account/visibility
- **F14 / P2 — Publish a new hosted repository.** Provider/account/visibility
selection, concrete destination review, remote configuration and explicit
initial push, with recovery from partial failure.
initial push, with recovery from partial failure (GitHub/Enterprise, GitLab
and Bitbucket Cloud; `PublishRepoDialog`, `hosted_publish_*`, persisted
recovery stages and exact-reviewed-commit push).
- ☑ **F15 / P2 — User-defined repository/ref/file actions.** Safe executable/
argv templates, exact context, palette/menu discovery, preview, bounded output
and cancellation. (`UserActionsEditor`, `UserActionDialog`,
Expand Down Expand Up @@ -1945,11 +1947,18 @@ tree: watch the agent work, review fast, accept or reject safely.
- ☑ Close/reopen the PR (`repo_pull_request_lifecycle`; GitHub `gh pr`,
Azure Services `az repos pr update`, and Azure Server helper protocol v2
`Operation::SetStatus`; keyboard-operable confirmed overflow action).
- ☐ 1.1: GitLab merge-request adapter.
- ☐ 1.1: Bitbucket Cloud pull-request adapter; scope Bitbucket Server separately.
- ☐ **F11 / P2 — GitHub enterprise/custom-host adapter.** Model host/API/auth
- ☑ 1.1: GitLab merge-request adapter (`HostedRepo`, paged collections,
versioned inline coordinates, approvals, lifecycle and SHA-guarded merge).
- ☑ 1.1: Bitbucket Cloud pull-request adapter (`HostedRepo`, opaque pagination,
replies/ranges, approval/request-changes and capability-gated actions).
- ☐ Bitbucket Server adapter; Cloud merge remains a provider-site action
until an atomic expected-head guard is available. GitLab request-changes
and Bitbucket discussion resolution/draft transitions also remain
provider-site actions.
- ☑ **F11 / P2 — GitHub enterprise/custom-host adapter.** Model host/API/auth
scope instead of hardcoding GitHub.com; keep the GitLab/Bitbucket adapter
rows above as the other F11 deliverables.
rows above as the other F11 deliverables (`GitHubContext`, host-scoped CLI
routing and per-remote adapter selection in Settings → Hosting).
- ☐ 1.1: Direct OAuth + OS-keychain credentials if/when Strand stops delegating auth
to provider CLIs (blocked on Platform → per-platform credential storage).

Expand Down
1 change: 1 addition & 0 deletions crates/strand-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ tauri-plugin-sql = { version = "2", features = ["sqlite"] }
# tauri-plugin-sql, so these direct deps add ~no build cost.
sqlx = { version = "0.8", default-features = false, features = ["sqlite", "runtime-tokio"] }
sha2 = "0.10"
sha1_smol = "1"
base64 = "0.22"
flate2 = "1"
minisign-verify = "0.2.5"
Expand Down
29 changes: 29 additions & 0 deletions crates/strand-tauri/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2477,3 +2477,32 @@ mod tests {
std::fs::remove_dir_all(&dir).ok();
}
}

#[tauri::command(async)]
pub async fn repo_hosting_providers(path: String) -> CmdResult<Vec<pull_requests::RemoteHostingProvider>> {
run_blocking("remote hosting providers", move || pull_requests::hosting_providers(&path).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn repo_set_hosting_provider(path: String, remote: String, provider: String) -> CmdResult<()> {
run_blocking("configure remote provider", move || pull_requests::set_hosting_provider(&path, &remote, &provider).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn hosted_publish_accounts(path: String, provider: String, host: String) -> CmdResult<pull_requests::publish::PublishAccount> {
run_blocking("publish destinations", move || pull_requests::publish::accounts(&path, &provider, &host).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn hosted_publish_state(path: String) -> CmdResult<Option<pull_requests::publish::PublishState>> {
run_blocking("publish recovery", move || pull_requests::publish::state(&path).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn hosted_publish_preview(path: String, request: pull_requests::publish::PublishRequest) -> CmdResult<pull_requests::publish::PublishState> {
run_blocking("review publish destination", move || pull_requests::publish::preview(&path, request).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn hosted_publish_advance(path: String, id: String, action: String) -> CmdResult<pull_requests::publish::PublishState> {
run_blocking("publish repository", move || pull_requests::publish::advance(&path, &id, &action).map_err(|message| CmdError { message })).await
}
#[tauri::command(async)]
pub async fn hosted_publish_forget(path: String) -> CmdResult<()> {
run_blocking("dismiss publish recovery", move || pull_requests::publish::forget(&path).map_err(|message| CmdError { message })).await
}
7 changes: 7 additions & 0 deletions crates/strand-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,13 @@ fn main() {
commands::repo_refs,
commands::azdo_helper_status,
commands::hosting_connection_status,
commands::repo_hosting_providers,
commands::repo_set_hosting_provider,
commands::hosted_publish_accounts,
commands::hosted_publish_state,
commands::hosted_publish_preview,
commands::hosted_publish_advance,
commands::hosted_publish_forget,
commands::azdo_helper_enable,
commands::azdo_helper_disable,
commands::azdo_helper_remove,
Expand Down
Loading
Loading