
Overview
Every OpenSail project is a real git repository. You can import from GitHub, GitLab, or Bitbucket; push commits back; open PRs; and watch branches all from inside the studio. The agent has read access to git state through its git tools and write access through the shell, so it can create commits and push on your behalf (with approval).Three providers
GitHub, GitLab, Bitbucket, all with OAuth and a unified API.
Import or init
Clone an existing repo, or start blank and push to a new remote.
Agent-aware git
git_status, git_log, git_blame, git_diff are built-in agent tools.In-container ops
Every git command runs inside the project container, so
.gitignore, LFS, and hooks all work.Connecting a provider
Connect
Click Connect on GitHub, GitLab, or Bitbucket. You’ll be redirected to the provider’s OAuth consent page.
Authorize
OpenSail requests the minimum scopes needed for the provider:
- GitHub:
repo,user:email,read:user - GitLab:
api,read_user - Bitbucket:
repository,account
You can connect more than one provider. OpenSail matches the right credential to the repo based on the host in the clone URL.
Importing a repo
The clone happens in a background task. The UI shows progress while the container initializes.
Branching and committing
- From the UI
- From the terminal
- From the agent
The Git panel shows the current branch, ahead/behind count, uncommitted changes, and remotes. Buttons:
- Create branch
- Commit (stages and commits tracked changes)
- Push
- Pull
- Switch branch
Agent-side git
The agent has four read-only git tools built in:| Tool | Use |
|---|---|
git_status | What’s staged, what’s modified, what’s untracked |
git_log | Commit history for the current branch |
git_blame | Per-line authorship on a file |
git_diff | Unified diff for working tree or between refs |
bash_exec). This means normal git hooks, LFS, and .gitignore rules all apply. The approval system gates destructive commands: git push --force, git reset --hard, and similar are gated in Ask Before Edit mode.
Multi-provider support
OpenSail abstracts the three providers behind a single API:| Provider | Clone URL | OAuth |
|---|---|---|
| GitHub | https://github.com/user/repo.git | GitHub App |
| GitLab | https://gitlab.com/user/repo.git (and self-hosted) | GitLab OAuth |
| Bitbucket | https://bitbucket.org/user/repo.git | Bitbucket OAuth |
git clone or git push, the credential matcher looks at the host and selects the right stored token automatically.
Pushing to a new remote
Starting from a blank template and want to create a new remote?Pull requests
PRs are not created automatically on push. Open them from the provider UI. OpenSail’s Git panel has a Open on GitHub/GitLab/Bitbucket button that takes you straight to the compare view for the current branch.PR automation (creating PRs from the studio, commenting, approving) is on the roadmap. Today you manage PRs on the provider site.
Merging and syncing
Pull before you push
Pull before you push
The Git panel shows behind count when the remote has moved ahead. Click Pull to fast-forward or merge. Conflicts surface in Monaco with inline markers.
Sync a long-running branch
Sync a long-running branch
Open the terminal and run
git fetch origin && git merge origin/main. The agent can also do this on request.Resolve conflicts
Resolve conflicts
Monaco highlights conflict markers. Edit to resolve, save, then commit. The agent can also handle small conflicts: paste the conflict output and ask for help.
.gitignore and large files
Standard.gitignore works. The default template adds node_modules, dist, .env, .tesslate/cache. The Tesslate config file (.tesslate/config.json) is committed so the graph travels with the repo.
For large files, use Git LFS. git lfs install inside the terminal once, then git lfs track normally. The CSI volume has plenty of room for LFS objects; they persist with the workspace snapshot.
Secrets, tokens, and safety
OAuth tokens for connected providers are encrypted at rest and never exposed to the agent. When the agent runs git commands, it sees only pre-populated credential helpers, not the raw token.Revoking a provider
Troubleshooting
Permission denied on push
Permission denied on push
Token likely expired or the repo scopes changed. Reconnect the provider and retry.
Cannot clone a private repo
Cannot clone a private repo
Make sure the OAuth app has access to that org. On GitHub, check the GitHub App installation and grant access to the org.
Commits show up as the OpenSail bot
Commits show up as the OpenSail bot
Configure
git config user.name and git config user.email inside the project terminal. The agent will also ask if the author is missing before committing.Clone hangs on a big monorepo
Clone hangs on a big monorepo
Large repos take longer. You can shallow-clone with
--depth=1 via the terminal. The default clone gets full history.Best practices
Branch per feature
The agent works best with a clean branch. Start a branch per task, PR when done.
Commit the config
Check in
.tesslate/config.json. Teammates and forks get the same graph.Let the agent read, you write
Ask the agent to run
git_diff before writing a commit message. It writes better messages when it sees the diff.Use hooks
Pre-commit hooks run normally (inside the container). Use them to enforce linting and tests.
Related
Creating Projects
Import from git as part of project creation.
Code Editor
Where conflicts get resolved.
Using Agents
Let the agent drive commits and branches.
API Keys
Run git operations through the external agent API.