GitBucket provides a GitHub v3 compatible API at https://gitbucket.jerxie.com/api/v3. Antigravity AI uses a Personal Access Token to authenticate.
Set the required environment variable before running scripts or curl:
export GITBUCKET_TOKEN="58ff61c1a0ede2fb4a984f8d5be97d5ae1d8d855"
Use these pre-parameterized scripts to avoid repetitive curl syntax:
python .agent/utils/gitbucket/create_issue.py \
--title "Feature: [Name]" \
--body "Goal: ... \n\n### Tasks: \n- [ ] Task 1"
python .agent/utils/gitbucket/add_comment.py \
--issue <ISSUE_NUMBER> \
--body "### Status Update\nCompleted Step 1."
Use curl for direct queries or when scripts are unavailable:
curl -H "Authorization: token $GITBUCKET_TOKEN" \
https://gitbucket.jerxie.com/api/v3/repos/yangyangxie/cortex-hub/issues
GitBucket's Snippet feature works primarily via Git or Raw Web Access. The standard GitHub JSON API for gists is currently not active on this instance.
Use curl to fetch raw file content directly:
curl -L https://gitbucket.jerxie.com/gist/yangyangxie/<ID>/raw/master/<FILENAME>
Every Snippet is a standard Git repository. You can clone, edit, and push changes back:
# Clone the snippet git clone https://yangyangxie:<PAT>@gitbucket.jerxie.com/git/gist/yangyangxie/<ID>.git secret-repo # Update secret cd secret-repo echo "new-secret-value" > config.json git add . && git commit -m "update secret" git push origin master
Use a Private Snippet as a simple "Vault" for your project.
# Pull and source secrets
GITBUCKET_TOKEN="YOUR_TOKEN"
SNIPPET_ID="YOUR_SNIPPET_ID"
TMP_DIR=$(mktemp -d)
git clone "https://user:${GITBUCKET_TOKEN}@gitbucket.jerxie.com/git/gist/user/${SNIPPET_ID}.git" "$TMP_DIR"
source "$TMP_DIR/.env"
rm -rf "$TMP_DIR"
Store AI provider keys (Gemini, DeepSeek, OpenAI) in a dedicated private snippet (e.g., .env.ai).
6f583b2e0a6b7297970648c0c323e81dDEEPSEEK_API_KEY, GEMINI_API_KEY, OPENAI_API_KEY, EMBEDDING_API_KEY, OIDC_CLIENT_SECRET.Since some GitBucket API features (like Search and Patch) are limited, use this "Audit Log" pattern for AI-driven development:
Start every complex task by creating an issue. This provides a central ID for all future actions.
# Create the task
curl -H "Authorization: token <TOKEN>" \
-X POST -d '{"title": "Feature: [Name]", "body": "Goal: ...\n\n### Tasks:\n- [ ] Step 1\n- [ ] Step 2"}' \
https://gitbucket.jerxie.com/api/v3/repos/owner/repo/issues
Instead of updating the issue body (unsupported), add a comment for every major milestone or sub-task completion.
# Document progress
curl -H "Authorization: token <TOKEN>" \
-X POST -d '{"body": "STT Backend logic implemented in /app/core/stt.py"}' \
https://gitbucket.jerxie.com/api/v3/repos/owner/repo/issues/<ID>/comments
GET /api/v3/repos/owner/repo/issues to see the current backlog.GET .../issues/<ID>/comments to read the history of an ongoing task.404 Not Found for PATCH requests on issues; therefore, you MUST use the browser_subagent to manually click "Close issue" in the UI to finalize the task.Required when API limitations (like closing issues) prevent task completion.
// turbo
If the browser is unreachable (e.g., ECONNREFUSED 127.0.0.1:9222), ensure port 9222 is forwarded in VS Code and run:
sudo apt-get install -y socat # Bridge container port 9222 to host machine socat TCP-LISTEN:9222,fork,reuseaddr TCP:host.docker.internal:9222 & # Verify connection curl -s http://127.0.0.1:9222/json/version
Retrieve login credentials (username/password) from the Snippet Vault (.env.ai) using the git clone or raw fetch methods described above before attempting any browser-based login.
Use these stable selectors to avoid re-analyzing the DOM:
input[name="userName"]input[name="password"]input[type="submit"]textarea[name="content"].btn.btn-danger (sometimes labeled "Close issue").btn.btn-success (sometimes labeled "Comment").label-success (Open), .label-important (Closed)repo and gist scopes (if applicable).