Not in the top 1,000 by GitHub stars

gmickel/sheets-cli

Composable Google Sheets CLI for humans and agents. Read, write, update cells by key—with Agent Skills for Claude Code and OpenAI Codex.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

1c0e3dc0aa7d → 1c0e3dc0aa7d

Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 1c0e3dc0aa7d

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 1c0e3dc0aa7d158ca06ba45f412cb32a372e657b

git clone --filter=blob:none --no-checkout https://github.com/gmickel/sheets-cli.git .hotskills/gmickel-sheets-cli && git -C .hotskills/gmickel-sheets-cli checkout --detach 1c0e3dc0aa7d158ca06ba45f412cb32a372e657b # Copy each selected skill directory from .hotskills/gmickel-sheets-cli into .claude/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/gmickel/sheets-cli.git .hotskills/gmickel-sheets-cli && git -C .hotskills/gmickel-sheets-cli checkout --detach 1c0e3dc0aa7d158ca06ba45f412cb32a372e657b # Copy each selected skill directory from .hotskills/gmickel-sheets-cli into .agents/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/gmickel/sheets-cli.git .hotskills/gmickel-sheets-cli && git -C .hotskills/gmickel-sheets-cli checkout --detach 1c0e3dc0aa7d158ca06ba45f412cb32a372e657b # Copy each selected skill directory from .hotskills/gmickel-sheets-cli into .cursor/skills/<skill-name>/
72GitHub stars
0stars in 7 days
1skill in this repository
0commits in 30 days

Heat

0.3
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Oct 27, 202672

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

sheets-cli

When your agent uses it

Read, write, and update Google Sheets data via CLI. Use when the user asks to read spreadsheet data, update cells, append rows, or work with Google Sheets. Triggers on mentions of spreadsheets, sheets, Google Sheets, tabular data in the cloud, or specific sheet names like "Projects" or "Tasks".

What it loads into context

Frontmatter

72 tokens

Always available to the agent

SKILL.md

1,634 tokens

When the skill is activated

Reference documents

10,068 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Quick Reference
  2. Workflow Pattern
  3. Commands
  4. Row Numbering
  5. Global Options
  6. Output Format
  7. Best Practices
  8. Exit Codes

Scripts executed separately

  • .flow/bin/flowctl
  • .flow/bin/flowctl.py
  • package.json
  • src/__tests__/auth.test.ts
  • src/__tests__/cli.test.ts
  • src/__tests__/output.test.ts
  • src/__tests__/sheets.test.ts
  • src/__tests__/skill-sync.test.ts
  • src/__tests__/types.test.ts
  • src/auth.ts
  • src/cli.ts
  • src/output.ts
  • src/sheets.ts
  • src/skill.ts
  • src/types.ts

Files

  • .claude/CLAUDE.mddoc5,883 bytes
  • .claude/settings.jsonasset226 bytes
  • .claude/skills/sheets-cli.mddoc4,525 bytes
  • .cursor/hooks.jsonasset123 bytes
  • .cursor/rules/ultracite.mdcasset5,230 bytes
  • .cursor/rules/use-bun-instead-of-node-vite-npm-pnpm.mdcasset3,604 bytes
  • .flow/bin/flowctlruns177 bytes
  • .flow/bin/flowctl.pyruns264,573 bytes
  • .flow/config.jsonasset185 bytes
  • .flow/meta.jsonasset118 bytes
  • .flow/usage.mddoc3,379 bytes
  • .github/FUNDING.ymlasset65 bytes
  • .gitignoreasset881 bytes
  • .vscode/settings.jsonasset906 bytes
  • AGENTS.mddoc5,041 bytes
  • CLAUDE.mddoc3,604 bytes
  • README.mddoc9,221 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • SKILL.mdcore5,940 bytes
  • biome.jsoncasset397 bytes
  • bun.lockasset31,756 bytes
  • lefthook.ymlasset215 bytes
  • package.jsonruns1,160 bytes
  • prd.mddoc6,843 bytes
  • src/__tests__/auth.test.tsruns4,101 bytes
  • src/__tests__/cli.test.tsruns11,765 bytes
  • src/__tests__/output.test.tsruns3,315 bytes
  • src/__tests__/sheets.test.tsruns18,871 bytes
  • src/__tests__/skill-sync.test.tsruns483 bytes
  • src/__tests__/types.test.tsruns1,832 bytes
  • src/auth.tsruns6,663 bytes
  • src/cli.tsruns23,941 bytes
  • src/output.tsruns1,093 bytes
  • src/sheets.tsruns21,985 bytes
  • src/skill.tsruns228 bytes
  • src/types.tsruns1,928 bytes
  • tsconfig.jsonasset606 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills included

  • sheets-cli

Repository facts

License
No license detected
Created
Dec 16, 2025
Last pushed
Feb 11, 2026
Forks
6
Open issues
1
Project activity
Slowing

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 6, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 14 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 100 signals by file

.flow/bin/flowctl

  • Executable scriptline 1
    #!/bin/bash

.flow/bin/flowctl.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 116
    [Credential-related source omitted]
  • Access to secretsline 406
    [Credential-related source omitted]
  • Access to secretsline 753
    [Credential-related source omitted]
  • Access to secretsline 1233
    [Credential-related source omitted]
  • Access to secretsline 1256
    [Credential-related source omitted]
  • Access to secretsline 1267
    [Credential-related source omitted]
  • Access to secretsline 1268
    [Credential-related source omitted]
  • Access to secretsline 1738
    [Credential-related source omitted]
  • Access to secretsline 1762
    [Credential-related source omitted]
  • Access to secretsline 2406
    [Credential-related source omitted]
  • Access to secretsline 2407
    [Credential-related source omitted]
  • Access to secretsline 5832
    [Credential-related source omitted]
  • Access to secretsline 6056
    [Credential-related source omitted]
  • Access to secretsline 6413
    [Credential-related source omitted]

.flow/usage.md

  • Network accessline 95
    - Human docs: https://github.com/gmickel/gmickel-claude-marketplace/blob/main/plugins/flow-next/docs/flowctl.md

.gitignore

  • Access to secretsline 19
    [Credential-related source omitted]
  • Access to secretsline 41
    [Credential-related source omitted]

README.md

  • Network accessline 1
    <p align="center">   <picture>     <source media="(prefers-color-scheme: dark)" srcset="https://em-content.zobj.net/source/apple/391/scroll_1f4dc.png">
  • Network accessline 2
    <picture>     <source media="(prefers-color-scheme: dark)" srcset="https://em-content.zobj.net/source/apple/391/scroll_1f4dc.png">     <img alt="sheets-cli" src="https://em-content.zobj.net/source/apple/391/scroll_1f4dc.png" width="96">
  • Network accessline 3
    <source media="(prefers-color-scheme: dark)" srcset="https://em-content.zobj.net/source/apple/391/scroll_1f4dc.png">
  • Network accessline 4
    <img alt="sheets-cli" src="https://em-content.zobj.net/source/apple/391/scroll_1f4dc.png" width="96">
  • Network accessline 23
    <p align="center">   <img src="https://img.shields.io/badge/bun-%23000000.svg?style=flat&logo=bun&logoColor=white" alt="Bun">
  • Network accessline 24
    <img src="https://img.shields.io/badge/bun-%23000000.svg?style=flat&logo=bun&logoColor=white" alt="Bun">
  • Network accessline 25
    <img src="https://img.shields.io/badge/typescript-%23007ACC.svg?style=flat&logo=typescript&logoColor=white" alt="TypeScript">
  • Network accessline 26
    <img src="https://img.shields.io/badge/Google%20Sheets-34A853?style=flat&logo=google-sheets&logoColor=white" alt="Google Sheets">
  • Network accessline 27
    <br>   <img src="https://img.shields.io/badge/Claude_Code-D97757?style=flat&logo=anthropic&logoColor=white" alt="Claude Code">   <img src="https://img.shields.io/badge/OpenAI_Codex-412991?style=flat&logo=openai&logoColor=white" alt="OpenAI 
  • Network accessline 28
    <img src="https://img.shields.io/badge/Claude_Code-D97757?style=flat&logo=anthropic&logoColor=white" alt="Claude Code">
  • Network accessline 29
    <img src="https://img.shields.io/badge/OpenAI_Codex-412991?style=flat&logo=openai&logoColor=white" alt="OpenAI Codex">
  • Network accessline 34
    > **📢 New Project:** Check out [**GNO**](https://gno.sh) — local hybrid search for your documents (Markdown, PDF, Word, Excel). Combines BM25 + vector search with MCP integration for AI agents. Great companion to sheets-cli: search your loc
  • Network accessline 50
    > **🆕 Agent Skills** — Install as a skill for [Claude Code](https://claude.ai/code), [OpenAI Codex](https://openai.com/index/openai-codex/), or VS Code (Insiders preview; enable `chat.useAgentSkills`). The agent automatically discovers shee
  • Network accessline 56
    **Prerequisites:** [Bun](https://bun.sh) runtime
  • Network accessline 59
    git clone https://github.com/gmickel/sheets-cli.git
  • Network accessline 86
    1. Go to [Google Cloud Console → APIs](https://console.cloud.google.com/apis/library)
  • Network accessline 92
    1. Go to [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) 2. Create **OAuth 2.0 Client ID** → Desktop app 3. Download the JSON file
  • Network accessline 96
    > Desktop apps auto-allow localhost redirects. CLI captures OAuth code via `http://localhost:3847`.
  • Access to secretsline 101
    [Credential-related source omitted]
  • Network accessline 265
    Installs an [Agent Skill](https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills/overview) that teaches the agent how to use sheets-cli. After installing, the agent automatically discovers sheets-cli when you mention spreadsheets,
  • Network accessline 321
    <p align="center">   <sub>Built with <a href="https://bun.sh">Bun</a> • Styled for machines and humans alike</sub>
  • Network accessline 322
    <sub>Built with <a href="https://bun.sh">Bun</a> • Styled for machines and humans alike</sub>

package.json

  • Executable scriptline 1
    Executable file
  • Network accessline 7
    "repository": {     "type": "git",     "url": "https://github.com/gmickel/sheets-cli"
  • Network accessline 8
    "type": "git",     "url": "https://github.com/gmickel/sheets-cli"   },
  • Network accessline 9
    "url": "https://github.com/gmickel/sheets-cli"
  • Network accessline 10
    },   "bugs": {     "url": "https://github.com/gmickel/sheets-cli/issues"
  • Network accessline 11
    "bugs": {     "url": "https://github.com/gmickel/sheets-cli/issues"   },
  • Network accessline 12
    "url": "https://github.com/gmickel/sheets-cli/issues"

prd.md

  • Network accessline 200
    [1]: https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/append?utm_source=chatgpt.com "Method: spreadsheets.values.append | Google Sheets"
  • Network accessline 201
    [2]: https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate?utm_source=chatgpt.com "Method: spreadsheets.values.batchUpdate | Google Sheets"
  • Network accessline 202
    [3]: https://bun.com/docs/bundler/executables?utm_source=chatgpt.com "Single-file executable"
  • Network accessline 203
    [4]: https://bun.com/blog/bun-v1.3.3?utm_source=chatgpt.com "Bun v1.3.3 | Bun Blog"

src/__tests__/auth.test.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 10
    [Credential-related source omitted]
  • Access to secretsline 16
    [Credential-related source omitted]
  • Dangerous shell operationline 23
    await Bun.$`rm -rf /tmp/test-sheets-cli`.quiet().nothrow();
  • Dangerous shell operationline 28
    await Bun.$`rm -rf /tmp/test-sheets-cli`.quiet().nothrow();

src/__tests__/cli.test.ts

  • Executable scriptline 1
    Executable file

src/__tests__/output.test.ts

  • Executable scriptline 1
    Executable file

src/__tests__/sheets.test.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 360
    {           ID: "25",           URL: "https://example.com",
  • Network accessline 361
    ID: "25",           URL: "https://example.com",           Status: "2do",
  • Network accessline 362
    URL: "https://example.com",
  • Network accessline 390
    {           ID: "25",           URL: "https://example.com",
  • Network accessline 391
    ID: "25",           URL: "https://example.com",           Status: "2do",
  • Network accessline 392
    URL: "https://example.com",
  • Network accessline 405
    expect(body.values[0]).toEqual([         "25",         "https://example.com",
  • Network accessline 406
    "25",         "https://example.com",         "2do",
  • Network accessline 407
    "https://example.com",

src/__tests__/skill-sync.test.ts

  • Executable scriptline 1
    Executable file

src/__tests__/types.test.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 26
    test("extracts ID from full Google Sheets URL", () => {     const url =       "https://docs.google.com/spreadsheets/d/abc123-XYZ_test-456/edit#gid=0";
  • Network accessline 27
    const url =       "https://docs.google.com/spreadsheets/d/abc123-XYZ_test-456/edit#gid=0";     expect(parseSpreadsheetId(url)).toBe("abc123-XYZ_test-456");
  • Network accessline 28
    "https://docs.google.com/spreadsheets/d/abc123-XYZ_test-456/edit#gid=0";
  • Network accessline 32
    test("extracts ID from URL without fragment", () => {     const url = "https://docs.google.com/spreadsheets/d/abc123-XYZ_test/edit";
  • Network accessline 33
    const url = "https://docs.google.com/spreadsheets/d/abc123-XYZ_test/edit";
  • Network accessline 42
    test("handles URL with query params", () => {     const url =       "https://docs.google.com/spreadsheets/d/abc123/edit?usp=sharing";
  • Network accessline 43
    const url =       "https://docs.google.com/spreadsheets/d/abc123/edit?usp=sharing";     expect(parseSpreadsheetId(url)).toBe("abc123");
  • Network accessline 44
    "https://docs.google.com/spreadsheets/d/abc123/edit?usp=sharing";

src/auth.ts

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    const SCOPES = [   "https://www.googleapis.com/auth/spreadsheets",
  • Network accessline 7
    "https://www.googleapis.com/auth/spreadsheets",
  • Network accessline 8
    "https://www.googleapis.com/auth/drive.readonly",
  • Access to secretsline 48
    [Credential-related source omitted]
  • Access to secretsline 53
    [Credential-related source omitted]
  • Network accessline 82
    server = Bun.serve({       port,       fetch(req) {
  • Network accessline 83
    port,       fetch(req) {         const url = new URL(req.url);
  • Network accessline 84
    fetch(req) {
  • Access to secretsline 158
    [Credential-related source omitted]
  • Network accessline 161
    const redirectUri = `http://localhost:${LOOPBACK_PORT}`;
  • Access to secretsline 164
    [Credential-related source omitted]
  • Dangerous shell operationline 223
    await Bun.$`rm ${tokenPath}`.quiet();

src/cli.ts

  • Executable scriptline 1
    #!/usr/bin/env bun

src/output.ts

  • Executable scriptline 1
    Executable file

src/sheets.ts

  • Executable scriptline 1
    Executable file

src/skill.ts

  • Executable scriptline 1
    Executable file

src/types.ts

  • Executable scriptline 1
    Executable file
  • Access to secretsline 2
    [Credential-related source omitted]
  • Network accessline 6
    // Parse Google Sheets URL to extract spreadsheet ID // Supports: https://docs.google.com/spreadsheets/d/ID/edit#gid=0
  • Network accessline 7
    // Supports: https://docs.google.com/spreadsheets/d/ID/edit#gid=0

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 1 fact
  • Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionsrc/auth.ts:7High confidence
Signal confidence: 98 facts
  • Executable script in code of a file that runs.flow/bin/flowctl:1High confidence
  • Executable script in code of a file that runs.flow/bin/flowctl.py:1High confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:116Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:406Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:753Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1233Low confidence
  • Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1256Low confidence
  • Access to secrets in a comment of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1267Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1268Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1738Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:1762Low confidence
  • Access to secrets in a comment of a file that runs.flow/bin/flowctl.py:2406Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:2407Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:5832Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:6056Low confidence
  • Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored value.flow/bin/flowctl.py:6413Low confidence
  • Network access in prose of documentation.flow/usage.md:95Low confidence
  • Network access in prose of documentationREADME.md:1Low confidence
  • Network access in prose of documentationREADME.md:2Low confidence
  • Network access in prose of documentationREADME.md:3Low confidence
  • Network access in prose of documentationREADME.md:4Low confidence
  • Network access in prose of documentationREADME.md:23Low confidence
  • Network access in prose of documentationREADME.md:24Low confidence
  • Network access in prose of documentationREADME.md:25Low confidence
  • Network access in prose of documentationREADME.md:26Low confidence
  • Network access in prose of documentationREADME.md:27Low confidence
  • Network access in prose of documentationREADME.md:28Low confidence
  • Network access in prose of documentationREADME.md:29Low confidence
  • Network access in prose of documentationREADME.md:34Low confidence
  • Network access in prose of documentationREADME.md:50Low confidence
  • Network access in prose of documentationREADME.md:56Low confidence
  • Network access in code of documentationREADME.md:59Low confidence
  • Network access in prose of documentationREADME.md:86Low confidence
  • Network access in prose of documentationREADME.md:92Low confidence
  • Network access in prose of documentationREADME.md:96Low confidence
  • Access to secrets in code of documentationREADME.md:101Low confidence
  • Network access in prose of documentationREADME.md:265Low confidence
  • Network access in prose of documentationREADME.md:321Low confidence
  • Network access in prose of documentationREADME.md:322Low confidence
  • Executable script in code of a file that runspackage.json:1High confidence
  • Network access in code of a file that runspackage.json:7High confidence
  • Network access in code of a file that runspackage.json:8High confidence
  • Network access in code of a file that runspackage.json:9High confidence
  • Network access in code of a file that runspackage.json:10High confidence
  • Network access in code of a file that runspackage.json:11High confidence
  • Network access in code of a file that runspackage.json:12High confidence
  • Network access in prose of documentationprd.md:200Low confidence
  • Network access in prose of documentationprd.md:201Low confidence
  • Network access in prose of documentationprd.md:202Low confidence
  • Network access in prose of documentationprd.md:203Low confidence

and 48 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativePath .claude/CLAUDE.md.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorNativePath .cursor/hooks.json.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.