Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
60a5249
Docs: Community all-stars and page update (#7483)
taniacryptid Feb 25, 2026
5b8b2cf
chore(release): release version 1.25.0 (minor) (#7263)
github-actions[bot] Feb 25, 2026
785818b
feat: self-signed HTTPS for goosed server (#7126)
aharvard Feb 25, 2026
ca34455
gpt 5-3-Codex model support in databricks (#7516)
katzdave Feb 25, 2026
a010327
Flip on developer extension in compaction smoke test (#7514)
katzdave Feb 25, 2026
fc292c7
Fix Windows MSVC linking issues (#7511)
jh-block Feb 25, 2026
86186a9
feat: add goose-powered release notes generator workflow (#7503)
blackgirlbytes Feb 26, 2026
ced5c1b
feat: simplify developer extension (#7466)
baxen Feb 26, 2026
b7bb6b4
fix(acp): don't fail session creation when model listing is unavailab…
idosavion Feb 26, 2026
835a1af
copilot instructions: reword no prerelease docs (#7101)
dianed-square Feb 26, 2026
08e95b2
feat: support Anthropic adaptive thinking (#7356)
rabi Feb 26, 2026
5477754
The client is not the source of truth (#7438)
DOsinga Feb 26, 2026
d74c836
fix: New Recipe Warning does not close on cancel (#7524)
github-actions[bot] Feb 26, 2026
b542af5
Disable tool pair summarization (#7481)
baxen Feb 26, 2026
460e324
fix: prevent crashes in long-running Electron sessions
zanesq Feb 26, 2026
8c2b6f9
feat(ui): implement fullscreen and pip display modes for MCP Apps (#7…
aharvard Feb 26, 2026
1abf05d
Use the correct Goose emoji 🪿 instead of Swan in README.md (#7485)
apetersson Feb 26, 2026
4082285
fix(openai): preserve order in Responses API history (#7500)
rabi Feb 26, 2026
2f64309
fix(desktop): make bundle and updater asset naming configurable (#7337)
bavadim Feb 26, 2026
7240341
fix(acp): Use ACP schema types for session/list (#7409)
rabi Feb 26, 2026
5dfd626
fix: Dictation API error message shows incorrect limit (#7423)
Abhijay007 Feb 26, 2026
dc8e36f
fix: replace unwrap() with graceful error in scheduler execute_job (#…
marlonbarreto-git Feb 26, 2026
3b03518
Merge branch 'main' of github.com:block/goose into evict-sessions-fro…
zanesq Feb 26, 2026
2ad6488
Revert "fix: prevent crashes in long-running Electron sessions"
zanesq Feb 26, 2026
9d0897a
Reapply "fix: prevent crashes in long-running Electron sessions"
zanesq Feb 26, 2026
8b79e81
Revert "Reapply "fix: prevent crashes in long-running Electron sessio…
zanesq Feb 26, 2026
85c7f97
feat: allow goose askai bot to search goose codebase (#7508)
The-Best-Codes Feb 26, 2026
e37ac4a
chore(release): release version 1.26.0 (minor) (#7512)
github-actions[bot] Feb 27, 2026
69ad519
feat: make pctx/Code Mode an optional dependency via 'code-mode' feat…
jh-block Feb 27, 2026
83ac417
Handle Bedrock 'prompt is too long' error (#7550)
u35tpus Feb 27, 2026
6e630f6
Add snapshot test with platform extensions (#7573)
jamadeo Feb 27, 2026
b43302a
Update CODEOWNERS for team restructuring (#7574)
blackgirlbytes Feb 27, 2026
c8a7189
Restore old system prompt behavior around subagents (#7576)
jamadeo Feb 27, 2026
bec0f58
fix: makes the Apps page look better (#7579)
alexhancock Feb 27, 2026
16be0cc
feat: add analyze platform extension with tree-sitter AST parsing (#7…
tlongwell-block Feb 27, 2026
d653c6a
Allow GOOSE_NODE_DIR override in batch file (#7422)
God-damnit-all Feb 28, 2026
79db503
fix(openai): handle null reasoning effort in Responses API (#7469)
rabi Feb 28, 2026
b77b959
fix: panic on corrupted permission.yaml instead of silently allowing …
michaelneale Feb 28, 2026
6e4d6fe
fix(cli): avoid debug logging by default in CLI (#7569)
WhiskerSage Feb 28, 2026
d1fe375
Add base_path field to custom provider config (#7558)
dprince Feb 28, 2026
53c9812
fix(claude-code): Permission routing for smart-approve (#7501)
rabi Feb 28, 2026
a0ae173
Dockerfile: add missing build/runtime dependencies (#7546)
dprince Feb 28, 2026
fa1cad3
fix: validate configure probe for streaming providers (#7564)
rabi Feb 28, 2026
371067e
chore(deps): bump minimatch in /ui/desktop (#7572)
dependabot[bot] Feb 28, 2026
e7b39cc
chore(deps-dev): bump rollup from 4.57.1 to 4.59.0 in /ui/desktop (#7…
dependabot[bot] Feb 28, 2026
bba8f5d
chore(deps): bump hono from 4.12.0 to 4.12.2 in /ui/desktop (#7515)
dependabot[bot] Feb 28, 2026
952562b
chore(deps): bump ajv from 8.17.1 to 8.18.0 in /evals/open-model-gym/…
dependabot[bot] Feb 28, 2026
a0910bb
chore(deps-dev): bump ajv from 6.12.6 to 6.14.0 in /ui/desktop (#7437)
dependabot[bot] Feb 28, 2026
72bdc95
chore(deps): bump hono from 4.11.7 to 4.12.1 in /evals/open-model-gym…
dependabot[bot] Feb 28, 2026
19f6017
fix: outdated clippy command in goosehints (#7590)
rabi Feb 28, 2026
bb37434
feat: make the text bar persistent and add a queue for messages (#7560)
alexhancock Mar 2, 2026
9c54eb7
Better network failure error & antrhopic retry (#7595)
DOsinga Mar 2, 2026
5abefbb
chore(deps): bump swiper from 11.2.10 to 12.1.2 in /documentation (#7…
dependabot[bot] Mar 2, 2026
495855d
chore(deps): bump minimatch from 10.1.1 to 10.2.3 in /evals/open-mode…
dependabot[bot] Mar 2, 2026
1350542
chore(deps): bump hono from 4.12.1 to 4.12.3 in /evals/open-model-gym…
dependabot[bot] Mar 2, 2026
82facd4
chore: openai reasoning model cleanup (#7529)
lifeizhou-ap Mar 2, 2026
568ec98
fix(scheduler): schedules added via CLI showing up in UI (#7594)
Abhijay007 Mar 2, 2026
858c1b6
Improve custom provider creation experience (#7541)
katzdave Mar 2, 2026
6702936
feat: return structured {stdout, stderr} from shell tool with output …
jh-block Mar 2, 2026
e727cea
Restore goosed logging (#7622)
jh-block Mar 3, 2026
d883e6e
fix: restore provider and extensions for LRU-evicted sessions (#7616)
wpfleger96 Mar 4, 2026
a525813
docs: update Claude Code approve behavior and model list in cli-provi…
codefromthecrypt Mar 4, 2026
a14152e
docs: add guide for customizing the sidebar (#7638)
blackgirlbytes Mar 4, 2026
3ea573a
docs: update recipe usage step to reflect auto-submit behavior (#7639)
blackgirlbytes Mar 4, 2026
1285b31
Revert git patch for llama-cpp-2 (#7642)
r0x0d Mar 4, 2026
dafc4db
fix: prevent abort in local inference (#7633)
KubeCat Mar 4, 2026
c65cfa6
fix: scope empty session reuse to current window to prevent session m…
fresh3nough Mar 4, 2026
7dca516
Clean up stale references to removed components (#7644)
r0x0d Mar 4, 2026
3152191
Merge platform/builtin extensions (#7630)
jamadeo Mar 4, 2026
3fed5fc
docs: add GOOSE_INPUT_LIMIT environment variable documentation (#7299)
jh-block Mar 4, 2026
03b5bbb
fix: add analyzer extension in recipe to maintain backwards compatibi…
lifeizhou-ap Mar 4, 2026
aebf59a
Relax the assertion for the model list ACP test (#7653)
jamadeo Mar 4, 2026
cf50e1e
fix: this should not be blocked (#7656)
michaelneale Mar 4, 2026
7b71b38
fix: resolve parameters in initial message with autosubmit (#7659)
lifeizhou-ap Mar 4, 2026
6d4eb93
chore(deps): bump hono from 4.12.2 to 4.12.5 in /ui/desktop (#7660)
dependabot[bot] Mar 4, 2026
f5e72df
chore(deps): bump hono from 4.12.3 to 4.12.5 in /evals/open-model-gym…
dependabot[bot] Mar 4, 2026
f34dea6
chore(deps): bump @hono/node-server from 1.19.9 to 1.19.10 in /ui/des…
dependabot[bot] Mar 4, 2026
b6a3ab5
opt: remove timestamped config file backup (#7618)
lsytj0413 Mar 4, 2026
42fc515
fix(shell): replace global static output buffer with per-instance Tem…
codefromthecrypt Mar 4, 2026
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
5 changes: 5 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "link-args=/FORCE:MULTIPLE"]

[target.aarch64-pc-windows-msvc]
rustflags = ["-C", "link-args=/FORCE:MULTIPLE"]
4 changes: 2 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CODEOWNERS file for block/goose repository
# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners

# Documentation owned by DevRel team
/documentation/ @block/goose-devrel
# Documentation owned by DevRel
/documentation/ @blackgirlbytes

4 changes: 2 additions & 2 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
- Async/await misuse or blocking operations in async contexts
- Improper trait implementations

### No Prerelease Docs
- If the PR contains both code changes to features/functionality AND updates in `/documentation`: Documentation updates must be separated to keep public docs in sync with released versions. Either mark new topics with `unlisted: true` or remove/hide the documentation.
### No Doc Updates with Code Changes
- PRs with code changes shouldn't update `/documentation` - docs deploy on merge, code on release. Use `unlisted: true` or remove/hide docs.

## Project-Specific Context

Expand Down
350 changes: 350 additions & 0 deletions .github/workflows/goose-release-notes.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,350 @@
# goose Release Notes Generator
#
# Automatically generates release notes using goose AI agent when a new release is published.
# Updates the GitHub release with AI-generated categorized notes and posts to Discord.
#
# Uses workflow_run instead of release:published because GitHub doesn't trigger
# workflows for events created by GITHUB_TOKEN (to prevent infinite loops).

name: goose Release Notes Generator

on:
# Trigger when Release workflow completes (works around GITHUB_TOKEN limitation)
workflow_run:
workflows:
- Release
types:
- completed

# Allow manual trigger for testing
workflow_dispatch:
inputs:
tag:
description: 'Release tag to generate notes for (e.g., v1.25.0)'
required: true
type: string

env:
GOOSE_RECIPE: |
version: "1.0.0"
title: "Release Notes Generator"
description: "Generate release notes for ${RELEASE_TAG}"

extensions:
- type: builtin
name: developer

instructions: |
Generate release notes for the goose release.

## Process
1. You are already in the goose repository. Do NOT clone or checkout anything.
2. Get the previous release tag by running: git describe --tags --abbrev=0 ${RELEASE_TAG}^
3. Get commits between tags: git log <previous_tag>..${RELEASE_TAG} --oneline --no-merges
4. Analyze the commits and categorize changes

## Output Format
Categorize changes into these sections (skip empty sections):
- ✨ **Features** - New functionality
- 🐛 **Bug Fixes** - Bug fixes
- 🔧 **Improvements** - Enhancements to existing features
- 📚 **Documentation** - Documentation updates

Format each item as:
- Concise description [#XXXX](https://github.com/block/goose/pull/XXXX)

Rules:
- Extract PR numbers from commit messages (look for (#XXXX) pattern)
- Remove redundant words like "Added", "Fixed", "Documented" - the category headers make these clear
- Keep descriptions user-friendly and concise
- Order: Features → Bug Fixes → Improvements → Documentation

## Final Step
Write ONLY the release notes content to /tmp/release_notes.md (no extra commentary)

prompt: |
Generate release notes for ${RELEASE_TAG} in the goose repository.

permissions:
contents: write

concurrency:
group: release-notes-${{ github.event.workflow_run.head_branch || inputs.tag }}
cancel-in-progress: true

jobs:
generate-release-notes:
name: Generate Release Notes
runs-on: ubuntu-latest
# For workflow_run: only run if Release succeeded and tag is not 'stable'
# For workflow_dispatch: only run if tag is not 'stable'
if: |
(github.event_name == 'workflow_dispatch' && inputs.tag != 'stable') ||
(github.event_name == 'workflow_run' &&
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.head_branch != 'stable')

container:
image: ghcr.io/block/goose:latest
options: --user root
env:
GOOSE_PROVIDER: ${{ vars.GOOSE_PROVIDER || 'anthropic' }}
GOOSE_MODEL: ${{ vars.GOOSE_MODEL || 'claude-opus-4-5' }}
ANTHROPIC_API_KEY: ${{ secrets.RELEASE_BOT_ANTHROPIC_KEY }}
HOME: /tmp/goose-home

outputs:
release_notes: ${{ steps.read-notes.outputs.notes }}
notes_length: ${{ steps.read-notes.outputs.length }}
release_tag: ${{ steps.get-tag.outputs.tag }}

steps:
- name: Get release tag
id: get-tag
env:
EVENT_NAME: ${{ github.event_name }}
INPUT_TAG: ${{ inputs.tag }}
WORKFLOW_RUN_BRANCH: ${{ github.event.workflow_run.head_branch }}
run: |
if [ "$EVENT_NAME" = "workflow_dispatch" ]; then
echo "tag=$INPUT_TAG" >> $GITHUB_OUTPUT
else
echo "tag=$WORKFLOW_RUN_BRANCH" >> $GITHUB_OUTPUT
fi

- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
fetch-tags: true

- name: Install tools
run: |
apt-get update
apt-get install -y gettext curl ripgrep git jq

- name: Run goose to generate release notes
env:
RELEASE_TAG: ${{ steps.get-tag.outputs.tag }}
run: |
mkdir -p $HOME/.local/share/goose/sessions
mkdir -p $HOME/.config/goose
git config --global --add safe.directory "$GITHUB_WORKSPACE"

# Checkout the release tag
git checkout "${RELEASE_TAG}"

# Create recipe from env var with variable substitution
echo "$GOOSE_RECIPE" | envsubst '$RELEASE_TAG' > /tmp/recipe.yaml

goose run --recipe /tmp/recipe.yaml

- name: Read release notes
id: read-notes
run: |
if [ -f /tmp/release_notes.md ]; then
# Use random delimiter to prevent injection
DELIMITER="EOF_$(openssl rand -hex 8)"
echo "notes<<$DELIMITER" >> $GITHUB_OUTPUT
cat /tmp/release_notes.md >> $GITHUB_OUTPUT
echo "" >> $GITHUB_OUTPUT
echo "$DELIMITER" >> $GITHUB_OUTPUT

LENGTH=$(wc -c < /tmp/release_notes.md)
echo "length=$LENGTH" >> $GITHUB_OUTPUT

echo "::notice::Release notes generated successfully (${LENGTH} chars)"
else
echo "::error::Release notes file not found at /tmp/release_notes.md"
echo "notes=Release notes generation failed." >> $GITHUB_OUTPUT
echo "length=0" >> $GITHUB_OUTPUT
exit 1
fi

update-github-release:
name: Update GitHub Release
runs-on: ubuntu-latest
needs: generate-release-notes
permissions:
contents: write

steps:
- name: Update release body
uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0
with:
tag: ${{ needs.generate-release-notes.outputs.release_tag }}
token: ${{ secrets.GITHUB_TOKEN }}
body: ${{ needs.generate-release-notes.outputs.release_notes }}
allowUpdates: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true

post-to-discord:
name: Post to Discord
runs-on: ubuntu-latest
needs: generate-release-notes

steps:
- name: Post release announcement
env:
DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_RELEASE_BOT_TOKEN }}
DISCORD_CHANNEL_ID: ${{ secrets.DISCORD_RELEASE_BOT_CHANNEL_ID }}
RELEASE_TAG: ${{ needs.generate-release-notes.outputs.release_tag }}
RELEASE_URL: https://github.com/block/goose/releases/tag/${{ needs.generate-release-notes.outputs.release_tag }}
RELEASE_NOTES: ${{ needs.generate-release-notes.outputs.release_notes }}
NOTES_LENGTH: ${{ needs.generate-release-notes.outputs.notes_length }}
shell: bash
run: |
# Skip if Discord is not configured
if [ -z "$DISCORD_CHANNEL_ID" ] || [ -z "$DISCORD_BOT_TOKEN" ]; then
echo "::notice::Discord not configured, skipping"
exit 0
fi

# Discord message character limit is ~2000 for regular messages
SAFE_LIMIT=1800

# Function to send Discord message via bot API, returns message ID
send_discord() {
local content="$1"
local channel="$2"

content=$(echo "$content" | jq -Rs .)

response=$(curl -s -X POST "https://discord.com/api/v10/channels/${channel}/messages" \
-H "Authorization: Bot ${DISCORD_BOT_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"content\": $content, \"flags\": 4}")

# Debug: show response if there's an error
if echo "$response" | jq -e '.code' > /dev/null 2>&1; then
echo "::warning::Discord API error: $(echo "$response" | jq -c '.')" >&2
fi

echo "$response" | jq -r '.id // empty'
}

# Function to create a thread from a message
create_thread() {
local channel="$1"
local message_id="$2"
local thread_name="$3"

response=$(curl -s -X POST "https://discord.com/api/v10/channels/${channel}/messages/${message_id}/threads" \
-H "Authorization: Bot ${DISCORD_BOT_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"name\": \"${thread_name}\"}")

echo "$response" | jq -r '.id // empty'
}

# Build the announcement header
HEADER="## 🎉 goose ${RELEASE_TAG} is here!

📦 **Release:** ${RELEASE_URL}"

FOOTER="

@everyone
📝 *More in thread...*"
HEADER_LEN=${#HEADER}
FOOTER_LEN=${#FOOTER}
AVAILABLE=$((SAFE_LIMIT - HEADER_LEN - FOOTER_LEN - 10))

# Check if everything fits in one message (no thread needed)
FULL_MSG="${HEADER}

${RELEASE_NOTES}"
if [ ${#FULL_MSG} -le "$SAFE_LIMIT" ]; then
send_discord "$FULL_MSG" "$DISCORD_CHANNEL_ID"
echo "::notice::Discord notification sent successfully"
exit 0
fi

# Need to split - use awk to fit complete lines in main vs thread
echo "$RELEASE_NOTES" > /tmp/release_notes_full.txt

awk -v avail="$AVAILABLE" '
BEGIN { main_len = 0; in_thread = 0 }
{
line_len = length($0) + 1 # +1 for newline
if (!in_thread && (main_len + line_len) <= avail) {
print > "/tmp/main_content.txt"
main_len += line_len
} else {
in_thread = 1
print > "/tmp/thread_content.txt"
}
}
' /tmp/release_notes_full.txt

# Read the split content
MAIN_CONTENT=""
[ -f /tmp/main_content.txt ] && MAIN_CONTENT=$(cat /tmp/main_content.txt)

THREAD_CONTENT=""
[ -f /tmp/thread_content.txt ] && THREAD_CONTENT=$(cat /tmp/thread_content.txt)

# Build and send main message
MAIN_MESSAGE="${HEADER}

${MAIN_CONTENT}
${FOOTER}"

MESSAGE_ID=$(send_discord "$MAIN_MESSAGE" "$DISCORD_CHANNEL_ID")

if [ -z "$MESSAGE_ID" ]; then
echo "::error::Failed to send Discord message"
exit 1
fi

echo "Created message $MESSAGE_ID, creating thread..."
sleep 1

# Create thread
THREAD_ID=$(create_thread "$DISCORD_CHANNEL_ID" "$MESSAGE_ID" "Release Notes ${RELEASE_TAG}")
if [ -z "$THREAD_ID" ]; then
echo "::warning::Failed to create thread"
THREAD_ID="$DISCORD_CHANNEL_ID"
fi
sleep 1

# Post thread content in chunks (by complete lines)
if [ -n "$THREAD_CONTENT" ]; then
# Split thread content into chunks using awk
awk -v limit="$SAFE_LIMIT" '
BEGIN { chunk = ""; chunk_len = 0; chunk_num = 0 }
{
line_len = length($0) + 1
if (chunk_len + line_len > limit && chunk_len > 0) {
# Save current chunk and start new one
print chunk > "/tmp/chunk_" chunk_num ".txt"
chunk_num++
chunk = $0 "\n"
chunk_len = line_len
} else {
chunk = chunk $0 "\n"
chunk_len += line_len
}
}
END {
if (chunk_len > 0) {
print chunk > "/tmp/chunk_" chunk_num ".txt"
}
}
' /tmp/thread_content.txt

# Send each chunk
for chunk_file in /tmp/chunk_*.txt; do
[ -f "$chunk_file" ] || continue
CHUNK=$(cat "$chunk_file")
[ -n "$CHUNK" ] && send_discord "$CHUNK" "$THREAD_ID"
sleep 1
rm -f "$chunk_file"
done
fi

# Cleanup
rm -f /tmp/release_notes_full.txt /tmp/main_content.txt /tmp/thread_content.txt

echo "::notice::Discord notification sent successfully"
2 changes: 1 addition & 1 deletion .goosehints
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ that you can call the functionality from the server from the typescript.

tips:
- can look at unstaged changes for what is being worked on if starting
- always check rust compiles, cargo fmt etc and `./scripts/clippy-lint.sh` (as well as run tests in files you are working on)
- always check rust compiles, cargo fmt etc and `cargo clippy --all-targets -- -D warnings` (as well as run tests in files you are working on)
- in ui/desktop, look at how you can run lint checks and if other tests can run
Loading
Loading