Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
0d2a9b3
feat: rebase MCP server on upstream v0.22.1
shigechika Mar 25, 2026
7b9df11
docs: cargo workspace構成に合わせてインストール手順を更新
shigechika Mar 25, 2026
1e63246
docs: CLAUDE.mdにworkspace構成とリベース手法を追記
shigechika Mar 25, 2026
a49fffa
Merge upstream/main (v0.22.3): keychain統合、script service修正
shigechika Mar 29, 2026
cc08dbc
Merge upstream/main (v0.22.5): serde_yaml→toml migration, cargo-deny,…
shigechika Apr 6, 2026
4907fc0
chore: remove stale TODO-upstream-rebase.md
shigechika Apr 6, 2026
7c10f40
docs: add precise dates to MCP timeline in FORK.md
shigechika Apr 6, 2026
be8a4fd
style: cargo fmt mcp_server.rs
shigechika Apr 6, 2026
f7019fb
feat: add gmail_reply MCP helper tool with façade architecture
shigechika Apr 7, 2026
e21a49f
docs: add façade architecture docs and gmail_reply to tool tables
shigechika Apr 7, 2026
1eb0ad2
feat: embed git describe in --version output for fork identification
shigechika Apr 7, 2026
22c3302
chore: reconcile upstream/main history (no content change)
shigechika Apr 13, 2026
82075d3
ci(sync): auto-resolve modify/delete conflicts for fork-deleted files
shigechika Apr 13, 2026
d565277
docs: update repo name from gws-cli to gws-mcp in FORK docs
shigechika Apr 13, 2026
733232c
style: cargo fmt main.rs
shigechika Apr 13, 2026
51e363d
feat(mcp): port fixes from upstream MCP issues #162, #170, #260
shigechika Apr 14, 2026
2b207a6
fix(gmail): case-insensitive header matching (upstream #642)
shigechika Apr 14, 2026
9406dee
chore(deps): bump rustls-webpki to 0.103.12 for RUSTSEC-2026-0098/0099
shigechika Apr 18, 2026
1b8588f
docs(fork): mark upstream #573, #625, #717 as addressed (#1)
shigechika Apr 18, 2026
2f8f60b
chore(clippy): collapse nested if in script.rs match arm (#3)
shigechika Apr 18, 2026
a5fd7e3
fix(auth): stop auto-injecting cloud-platform scope in TUI (upstream …
shigechika Apr 18, 2026
b529991
fix(gmail): use OIDC userinfo for display name lookup (upstream #644)…
shigechika Apr 18, 2026
6bd99b8
ci: add release workflow and Homebrew tap support
shigechika Apr 28, 2026
d051282
chore(deps): bump rustls-webpki to 0.103.13 for RUSTSEC-2026-0104
shigechika Apr 28, 2026
ba63f2c
fix(release): exclude branch pushes and fix sha256sum for macOS
shigechika Apr 28, 2026
1e182ee
ci: add auto-tag workflow to version fork releases automatically
shigechika Apr 28, 2026
6707399
chore(deps): update dependencies
shigechika Apr 28, 2026
2a70fd0
fix(ci): use PAT for tag push so release workflow is triggered
shigechika Apr 28, 2026
f7ffb44
chore(deps): update dependencies
shigechika Apr 28, 2026
fa0c0dd
fix(ci): use correct secret name GH_PAT for tag push
shigechika Apr 28, 2026
42d4804
ci: add workflow_dispatch to auto-tag for manual testing
shigechika Apr 28, 2026
6525d83
ci: rename release workflow to force GitHub re-registration
shigechika Apr 28, 2026
2adc983
ci: add minimal test workflow for dispatch verification
shigechika Apr 28, 2026
efe78e6
fix(ci): fix YAML parse error in release-fork.yml
shigechika Apr 28, 2026
e2052b1
fix(ci): check GH_PAT in shell instead of if condition
shigechika Apr 28, 2026
a24a25c
ci: remove test workflow
shigechika Apr 28, 2026
60badb5
fix(ci): use HOMEBREW_TAP_TOKEN for homebrew-tap write access
shigechika Apr 28, 2026
b463381
fix: meet scope mapping and reply QP soft-wrap corruption
shigechika May 2, 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
7 changes: 7 additions & 0 deletions .changeset/auth-tui-no-cloud-platform-inject.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@googleworkspace/cli": patch
---

fix(auth): stop auto-injecting cloud-platform scope after TUI scope picker selection. This scope is restricted by Google and blocked by some Workspace admin policies, which caused `admin_policy_enforced` login failures for users who picked narrower, permitted scopes (upstream #562). Users who need cloud-platform (e.g. for the modelarmor helper) can tick it in the picker or pass `--full` / `--scopes https://www.googleapis.com/auth/cloud-platform`.

Behavior change: existing users who relied on the silent cloud-platform injection to run the modelarmor helper must re-authenticate with one of the explicit paths above on their next `gws auth login`.
5 changes: 5 additions & 0 deletions .changeset/clippy-script-collapsible-match.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@googleworkspace/cli": patch
---

chore(clippy): collapse nested `if` inside the `"json"` arm of the Apps Script file classifier into a match guard. No behavior change — only satisfies `clippy::collapsible_match` which is now enforced in CI.
5 changes: 5 additions & 0 deletions .changeset/gmail-profile-userinfo-endpoint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@googleworkspace/cli": patch
---

fix(gmail): switch display-name lookup in `gmail +send` from People API to the OIDC userinfo endpoint (`https://openidconnect.googleapis.com/v1/userinfo`). The People API path returned 403 on some personal Gmail accounts even when `userinfo.profile` was granted, which made the "grant the profile scope" tip fire for users who already had the scope, and sent messages with a null From display name (upstream #644). The userinfo endpoint accepts the same `userinfo.profile` scope and behaves uniformly across Workspace and personal accounts. The 401/403 fallback message was also reworded so it no longer misdiagnoses transient permission denials as a missing scope.
5 changes: 5 additions & 0 deletions .changeset/mcp-helper-tools.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@googleworkspace/cli": minor
---

Add MCP helper tools: gmail_send convenience wrapper that reuses CLI helper logic for RFC 2822 formatting and base64 encoding
45 changes: 45 additions & 0 deletions .github/workflows/auto-tag.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Auto Tag

on:
push:
branches:
- main
paths:
- 'crates/**/*.rs'
- 'crates/**/Cargo.toml'
- 'Cargo.lock'
workflow_dispatch:

permissions:
contents: write

jobs:
tag:
name: Create fork tag
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0
token: ${{ secrets.GH_PAT }}

- name: Compute and push next tag
run: |
VERSION=$(grep '^version' crates/google-workspace-cli/Cargo.toml \
| head -1 | grep -oP '[\d]+\.[\d]+\.[\d]+')

LAST=$(git tag -l "fork/v${VERSION}-mcp.*" | sort -V | tail -1)
if [ -z "$LAST" ]; then
N=1
else
N=$(echo "$LAST" | grep -oP '\d+$')
N=$((N + 1))
fi

NEW_TAG="fork/v${VERSION}-mcp.${N}"
echo "Creating tag: $NEW_TAG"

git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag "$NEW_TAG"
git push origin "$NEW_TAG"
142 changes: 0 additions & 142 deletions .github/workflows/automation.yml

This file was deleted.

90 changes: 1 addition & 89 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ jobs:

build:
name: Build
needs: [smoketest, changes]
needs: [build-linux, changes]
if: |
always() && !cancelled() && !failure()
&& (needs.changes.outputs.rust == 'true' || github.event_name == 'push')
Expand Down Expand Up @@ -339,91 +339,3 @@ jobs:
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc

smoketest:
name: API Smoketest
needs: build-linux
if: github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Download binary
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: gws-linux-x86_64
path: ./bin

- name: Make binary executable
run: chmod +x ./bin/gws

- name: Decode credentials
env:
GOOGLE_CREDENTIALS_JSON: ${{ secrets.GOOGLE_CREDENTIALS_JSON }}
run: |
if [ -z "$GOOGLE_CREDENTIALS_JSON" ]; then
echo "::error::GOOGLE_CREDENTIALS_JSON secret is not set"
exit 1
fi
echo "$GOOGLE_CREDENTIALS_JSON" | base64 -d > /tmp/credentials.json

- name: Smoketest — help
run: ./bin/gws --help

- name: Smoketest — schema introspection
run: ./bin/gws schema drive.files.list | jq -e '.httpMethod'

- name: Smoketest — Drive files list
env:
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /tmp/credentials.json
run: |
./bin/gws drive files list \
--params '{"pageSize": 1, "fields": "files(id,mimeType)"}' \
| jq -e '.files'

- name: Smoketest — Gmail messages
env:
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /tmp/credentials.json
run: |
./bin/gws gmail users messages list \
--params '{"userId": "me", "maxResults": 1, "fields": "messages(id)"}' \
| jq -e '.messages'

- name: Smoketest — Calendar events
env:
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /tmp/credentials.json
run: |
./bin/gws calendar events list \
--params '{"calendarId": "primary", "maxResults": 1, "fields": "kind,items(id,status)"}' \
| jq -e '.kind'

- name: Smoketest — Slides presentation
env:
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /tmp/credentials.json
run: |
./bin/gws slides presentations get \
--params '{"presentationId": "1knOKD_87JWE4qsEbO4r5O91IxTER5ybBBhOJgZ1yLFI", "fields": "presentationId,slides(objectId)"}' \
| jq -e '.presentationId'

- name: Smoketest — pagination
env:
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: /tmp/credentials.json
run: |
LINES=$(./bin/gws drive files list \
--params '{"pageSize": 1, "fields": "nextPageToken,files(id)"}' \
--page-all --page-limit 2 \
| wc -l)
if [ "$LINES" -lt 2 ]; then
echo "::error::Expected at least 2 NDJSON lines from pagination, got $LINES"
exit 1
fi

- name: Smoketest — error handling
run: |
if ./bin/gws fakeservice list 2>&1; then
echo "::error::Expected exit code 1 for unknown service"
exit 1
fi

- name: Cleanup credentials
if: always()
run: rm -f /tmp/credentials.json
60 changes: 0 additions & 60 deletions .github/workflows/cla.yml

This file was deleted.

Loading
Loading