Agent skill

Spreadsheet Ops

by ericrisco in ericrisco/rsc-harness

A skill your agent uses when working a spreadsheet programmatically — writing or repairing a formula, generating an .xlsx with Python including charts and conditional formats, driving Google Sheets…

MITAuto-check passedDocuments & Office

Install Spreadsheet Ops

skills CLI
$ npx skills add ericrisco/rsc-harness --skill spreadsheet-ops -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ericrisco/rsc-harness spreadsheet-ops --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/spreadsheet-ops .claude/skills/spreadsheet-ops && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
spreadsheet-ops
GitHub stars
156
Token cost
~2.9k tokens
SKILL.md length
1,307 words
Files
7 (incl. scripts, references)
Skills in repo
229
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when working a spreadsheet programmatically — writing or repairing a formula, generating an .xlsx with Python including charts and conditional formats, driving Google Sheets…

  • Works in 6 steps: Arguments are comma-separated, always —… → A formula string must start with =.… → Anchor references you intend to fill. A… → …
  • Working a spreadsheet programmatically — writing
  • SKILL.md covers Pick the tool first (this…, Formula rules (each rule, one…, Python → Excel and Google Sheets from a script, plus 4 more sections
  • Runs Shell scripts from its folder

What it does

Spreadsheet Ops is an agent skill from ericrisco/rsc-harness. Use when working a spreadsheet programmatically — writing or repairing a formula, generating an .xlsx with Python including charts and conditional formats, driving Google Sheets from a script, building a read-transform-write pipeline, or writing an in-sheet macro or trigger. Covers formula errors, Sheets API quota, service-account permissions, and formulas that read back blank. NOT pure dedupe or normalisation with no sheet output (that is data-cleaning), NOT scraping a web table into rows (that is data-scraper)…

Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/formula-cookbook.md`).

It sits in Documents & Office, covering Excel spreadsheets and Web scraping. It works with Microsoft Excel, Python, Google Sheets and openpyxl. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.

When your agent uses it

  • Working a spreadsheet programmatically — writing
  • Repairing a formula
  • Generating an .xlsx with Python including charts and conditional formats
  • Driving Google Sheets from a script

Example prompts

  • “/spreadsheet-ops”

Requirements

  • Python 3
  • A Bash shell

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Arguments are comma-separated, always — never semicolons. openpyxl and the file format use
  2. A formula string must start with =. ws["A1"] = "SUM(1,1)" stores literal text; `ws["A1"] =
  3. Anchor references you intend to fill. A lookup table dragged down breaks unless absolute: Bad
  4. Prefer XLOOKUP over VLOOKUP — exact match by default, no magic column index to miscount, works
  5. Prefer dynamic arrays over Ctrl+Shift+Enter array formulas — =FILTER(...), =SORT(...),
  6. Never deep-nest IFs. Past two levels use LET (name sub-expressions once) or a helper column.

What it can do on your machine

Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Shell), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Spreadsheet Ops loads about 2.9k tokens when it runs, and up to ~5.7k if it reads all its reference files. Until then it costs about 149 tokens; SKILL.md has 1,307 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~149
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5.7k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,307 words, ~2,936 tokens.

Download SKILL.mdSave it as .claude/skills/spreadsheet-ops/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.
name
spreadsheet-ops
description
Use when working a spreadsheet programmatically — writing or repairing a formula, generating an .xlsx with Python including charts and conditional formats, driving Google Sheets from a script, building a read-transform-write pipeline, or writing an in-sheet macro or trigger. Covers formula errors, Sheets API quota, service-account permissions, and formulas that read back blank. NOT pure dedupe or normalisation with no sheet output (that is `data-cleaning`), NOT scraping a web table into rows (that is `data-scraper`), NOT multi-app event wiring (that is `automation-flows`).
tags
spreadsheet, excel, google-sheets, openpyxl, gspread, apps-script, formulas, automation
recommends
data-cleaning, data-scraper, automation-flows, google-workspace, reporting, duckdb, document-processing
origin
risco

spreadsheet-ops — the spreadsheet as a programmable surface

A spreadsheet is a runtime, not a document. Your job is to emit a checkable artifact — a .xlsx file that opens, a script that compiles, a cell range you can re-read — never a hand-waved formula in prose. Pick the tool that matches the runtime (local file vs cloud sheet, one-shot vs event-driven), write the formula with comma arguments, and verify before you claim it works.

The trap that bites everyone first: openpyxl writes formulas but does not compute them. The string is stored; Excel evaluates it on open. If you read the cell back with Python it is None until a real Excel/LibreOffice session has saved it. Internalize that before you touch a workbook.

Pick the tool first (this branches, so decide before coding)

Your situationReach forWhy
Read and modify an existing local .xlsxopenpyxlOnly mainstream lib that round-trips an existing file.
Write a new .xlsx rich with charts/conditional formats, possibly largexlsxwriter (via pandas ExcelWriter)Write-only but the richest formatting + low-memory constant_memory mode.
Dump a DataFrame to a sheet, minimal fusspandas df.to_excel(...)Wraps an engine; pass engine= explicitly so the result does not depend on what is installed.
Read/write a cloud Google Sheet from a scriptgspread (+ gspread-formatting for colors/rules)Friendly wrapper over the Sheets API for CRUD.
High-volume cloud writes, must beat quotasSheets API v4 batchUpdateOne batched call counts as one request — survives the per-minute limit.
In-sheet menus, time-driven triggers, custom functionsApps Script (V8)Runs inside the sheet; the only place for onEdit/menus.

Two you will confuse: xlsxwriter cannot open an existing file — if you need to edit one in place, that is openpyxl. And gspread vs the raw Sheets API is convenience vs throughput: reach for raw batchUpdate only when gspread's per-call writes would blow the quota.

Versions seen on PyPI when this was written (2026-06-02): openpyxl 3.1.5, gspread 6.2.1 (Python 3.8+), gspread-formatting 1.2.1, pandas on the 3.x line, Sheets API v4, Apps Script on the V8 runtime. Treat these as a floor, re-check PyPI before pinning, and pin whatever you actually resolve — do not copy a point release from a doc as gospel.

Formula rules (each rule, one reason)

  1. Arguments are comma-separated, always — never semicolons. openpyxl and the file format use commas regardless of your machine's locale; a semicolon is the single most common "my written formula is broken" cause. Bad: =SUM(A1;A2) → Good: =SUM(A1,A2).
  2. A formula string must start with =. ws["A1"] = "SUM(1,1)" stores literal text; ws["A1"] = "=SUM(1,1)" stores a formula. No leading = means no calculation, ever.
  3. Anchor references you intend to fill. A lookup table dragged down breaks unless absolute: Bad: =VLOOKUP(A2,Sheet2!A:B,2,0) → Good: =XLOOKUP(A2,Sheet2!$A:$A,Sheet2!$B:$B).
  4. Prefer XLOOKUP over VLOOKUP — exact match by default, no magic column index to miscount, works leftward. VLOOKUP's 4th arg silently defaulting to approximate match is a classic wrong-result bug.
  5. Prefer dynamic arrays over Ctrl+Shift+Enter array formulas — =FILTER(...), =SORT(...), =UNIQUE(...) spill automatically and are readable. A spill blocked by data below it raises #SPILL!; clear the range, do not array-enter.
  6. Never deep-nest IFs. Past two levels use LET (name sub-expressions once) or a helper column. Bad: =IF(A1>90,"A",IF(A1>80,"B",IF(A1>70,"C","D"))) → Good: a lookup table + XLOOKUP, or =LET(g,A1, IF(g>90,"A", IF(g>80,"B","C"))) kept shallow.

When generating cross-sheet formulas, SHEET() returns a sheet's index and SHEETS() returns the sheet count — both have shipped in Excel for years (SHEET/SHEETS since Excel 2013) and exist in Google Sheets, so they are safe to emit. Full XLOOKUP/SUMIFS/LET patterns and the #VALUE!/#REF!/#N/A/#NAME? error decoder live in references/formula-cookbook.md.

Python → Excel

The no-compute trap, stated as code:

python
from openpyxl import load_workbook
wb = load_workbook("report.xlsx")
ws = wb.active
ws["C2"] = "=A2*B2"          # stores the FORMULA string, not a number
wb.save("report.xlsx")
# Re-reading C2 now returns "=A2*B2" (the formula), or with data_only=True
# returns None — because no Excel has opened+saved the file to cache a value.
back = load_workbook("report.xlsx", data_only=True)
assert back.active["C2"].value is None   # last cached value: none yet

So: if a downstream step needs the computed number, either compute it in Python and write the value, or open the file once in Excel/LibreOffice headless to populate the cache. Do not assume openpyxl evaluated it.

Append a sheet to an existing file (the only mode that does not silently truncate):

python
import pandas as pd
with pd.ExcelWriter("report.xlsx", engine="openpyxl", mode="a",
                    if_sheet_exists="replace") as xl:
    df.to_excel(xl, sheet_name="2026-Q2", index=False)

Charts and conditional formatting on a new file go through xlsxwriter (richer) — it is write-only, so never point it at a file you need to keep. Recipes (chart, conditional format, write_only/ constant_memory for big files) are in references/python-excel.md.

Google Sheets from a script

python
import gspread
gc = gspread.service_account(filename="bot-key.json")  # service account
sh = gc.open_by_key("SPREADSHEET_ID")
ws = sh.worksheet("Orders")
ws.append_rows([["2026-06-02", "INV-1001", 240.00]],
               value_input_option="USER_ENTERED")      # parses formulas/dates

The failure that wastes the most time: a service account has zero access until the sheet is shared with its email. Open the key JSON, copy client_email, and share the sheet with it (Editor) — a PermissionError/SpreadsheetNotFound here is almost always an unshared sheet, not bad code.

Quotas (as published 2026-06-02 — re-check Google's "Usage limits" page, these shift): 300 read req/min/project, 60 read req/min/user (writes mirror this), refilled each minute, no daily cap under the per-minute ceiling. A batchUpdate — with all its sub-requests inside — counts as one request. So batch: build one batchUpdate body instead of N update calls, and wrap calls in exponential backoff on HTTP 429. Batching is the difference between a nightly job that survives and one that 429s.

Creating the OAuth client or service account itself is google-workspace's job; this skill assumes the credential exists and owns the Sheets surface. batchUpdate request shapes and backoff code are in references/sheets-api-appsscript.md.

Show full SKILL.md (470 more words)Show less

In-sheet automation (Apps Script V8)

Write for V8 — Google deprecated the legacy Rhino runtime (Feb 2025) and set its retirement for on or after 2026-01-31, so new code should never target it. V8 has no fetch, no timers, no streams — use UrlFetchApp.fetch() (or fetchAll() for parallel) for HTTP. No ES6 import/export, no private #fields.

Read and write the sheet in one range operation, never a per-cell loop — getValue()/setValue() inside a loop makes one API round-trip per cell and times out on real data:

javascript
function colorOverdue() {
  const sh = SpreadsheetApp.getActiveSheet();
  const data = sh.getDataRange().getValues();   // ONE read, all rows
  const out = data.map(r => r[3] === "OVERDUE" ? ["#fde0e0"] : ["#ffffff"]);
  sh.getRange(1, 1, out.length, 1).setBackgrounds(out.map(c => c)); // ONE write
}

Time-driven triggers (run nightly), onEdit simple triggers, and custom menus are covered in references/sheets-api-appsscript.md.

Pipeline pattern: read → transform → write

A pipeline that reruns must not duplicate rows. Decide the write mode first:

  1. Define a header contract — the exact columns and order. Assert the live header matches before writing; a shifted column silently corrupts everything downstream.
  2. Choose the write mode:
    • Full overwrite — clear the data range, write all rows. Simple, safe when the sheet is yours alone.
    • Keyed upsert — read existing keys (e.g. order_id) into a map, update matched rows, append the rest. Idempotent: rerunning yields the same sheet, no duplicates.
  3. Dry-run first. Compute the diff (rows to add/update) and log it; only write when a --apply flag is set. This catches a wrong key or a header drift before it touches the live sheet.
  4. Batch the write (batchUpdate / setValues) and back off on 429.

Anti-patterns

Anti-patternWhy it bitesDo instead
Semicolon arguments =SUM(A1;A2)File format is comma-only; locale display fools youAlways commas =SUM(A1,A2)
Formula string without leading =Stored as literal text, never calculatesStart the string with =
Assuming openpyxl computed the resultIt only stores the formula; value is None until Excel opens itWrite the value, or open once to cache
Per-cell getValue()/setValue() loop (Apps Script)One round-trip per cell → timeoutgetValues()/setValues() once per range
N single update calls to the Sheets APIBlows 60/user-min, 300/project-min quotaOne batchUpdate; backoff on 429
Service account not shared with the sheetPermissionError, looks like a code bugShare the sheet with client_email from the key
Deep-nested IF chainsUnreadable, miscounted parens, hard to repairLET, a lookup table, or a helper column
xlsxwriter to modify an existing fileIt is write-only; you lose the originalopenpyxl for read+modify
df.to_excel("f.xlsx") over an existing fileDefault mode truncates the whole workbookExcelWriter(..., mode="a") to append
VLOOKUP with a hardcoded column indexIndex miscounts when columns move; approximate-match defaultXLOOKUP with explicit ranges

Verify

Run scripts/verify.sh (read-only by default; pass a path to a generated .py/.xlsx). It py_compiles generated scripts, opens produced workbooks with openpyxl to confirm a sheet + header row, and lints formula strings for the semicolon-argument bug. Cloud paths are validated by structure, not live Google calls — no network or credentials required. On an empty/clean target it exits 0.

References: python-excel.md · sheets-api-appsscript.md · formula-cookbook.md.

© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 6 other files (scripts, references) in skills/spreadsheet-ops of ericrisco/rsc-harness.

  • SKILL.md
  • evals/README.md
  • evals/cases.yaml
  • references/formula-cookbook.md
  • references/python-excel.md
  • references/sheets-api-appsscript.md
  • scripts/verify.sh

Open the folder on GitHubat commit 92fde8f

Compare with similar skills

Spreadsheet Ops next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Spreadsheet Ops compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Spreadsheet Ops this skillericrisco/rsc-harness156—~2.9kAutomated safety check: PassMIT
XLSXK-Dense-AI/claude-scientific-writer2.4k—~2.1kAutomated safety check: NotesProprietary
XLSXrvdbreemen/OTGW-firmware20735 repos~2.9kAutomated safety check: PassProprietary
Excel Workbook EditorTokenRhythm/opensquilla7.1k—~1.6kAutomated safety check: PassApache-2.0
Kimi XLSXthvroyal/kimi-skills238—~9.5kAutomated safety check: PassNone
Office XLSXopen-octo/octo-agent125—~1.8kAutomated safety check: NotesMIT

Similar skills

  • XLSX

    K-Dense-AI/claude-scientific-writer

    Create, edit, analyze, or convert Excel spreadsheets (.xlsx, .xlsm, .xltx) where the workbook file is the primary deliverable.

    2.4k GitHub stars~2.1k tokensUpdated 7 days ago
    Documents & OfficeAuto-check: notes
  • XLSX

    rvdbreemen/OTGW-firmware

    Use this skill any time a spreadsheet file is the primary input or output.

    207 GitHub starsUsed in 35 repos~2.9k tokens
    Documents & OfficeAuto-check passed
  • Excel Workbook Editor

    TokenRhythm/opensquilla

    Inspects, edits in place or creates Microsoft Excel .xlsx workbooks with openpyxl, treating each cell as a typed number, string, datetime or formula value.

    7.1k GitHub stars~1.6k tokensUpdated 3 days ago
    Documents & OfficeAuto-check passed
  • Kimi XLSX

    thvroyal/kimi-skills

    Specialized utility for advanced manipulation, analysis, and creation of spreadsheet files, including (but not limited to) XLSX, XLSM, CSV formats.

    238 GitHub stars~9.5k tokensUpdated 6 mo ago
    Documents & OfficeAuto-check passed
  • Office XLSX

    open-octo/octo-agent

    Create, read, and edit Excel (.xlsx) spreadsheets programmatically with openpyxl — cell values, formulas, styling (fonts/fills/borders/alignment/number formats), merged cells, multiple sheets…

    125 GitHub stars~1.8k tokensUpdated 2 days ago
    Documents & OfficeAuto-check: notes
  • Cc Streaming Export Safety

    doccker/cc-use-exp

    当实现用户驱动的大文件导出或批量序列化(Excel/CSV/JSON/JSONL/PDF,数据量未知或超过 1 万行/10 MB)时触发;普通小文件下载、静态资源下载、非导出 Writer/Report 类不触发。防止 OOM、临时文件残留、同步导出阻塞 HTTP 线程和表格公式注入。

    1.1k GitHub stars~2.2k tokensUpdated 1 mo ago
    Documents & OfficeAuto-check passed

More from ericrisco/rsc-harness

All 229 skills in this repo
  • Ab Testing

    ericrisco/rsc-harness

    A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…

    156 GitHub stars~2.4k tokensUpdated yesterday
    Auto-check passed
  • Accessibility

    ericrisco/rsc-harness

    A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…

    156 GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Ads

    ericrisco/rsc-harness

    A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…

    156 GitHub stars~2.2k tokensUpdated yesterday
    Auto-check passed
  • Agent Eval

    ericrisco/rsc-harness

    A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…

    156 GitHub stars~3.2k tokensUpdated yesterday
    Auto-check passed
  • AI Media

    ericrisco/rsc-harness

    A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…

    156 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Analytics

    ericrisco/rsc-harness

    A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.

    156 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed

Questions about Spreadsheet Ops

What does Spreadsheet Ops do?

A skill your agent uses when working a spreadsheet programmatically — writing or repairing a formula, generating an .xlsx with Python including charts and conditional formats, driving Google Sheets…. Spreadsheet Ops is an agent skill from ericrisco/rsc-harness.xlsx with Python including charts and conditional formats, driving Google Sheets from a script, building a read-transform-write pipeline, or writing an in-sheet macro or trigger.

When should I use Spreadsheet Ops?

Spreadsheet Ops fits situations like: working a spreadsheet programmatically — writing; repairing a formula; generating an .xlsx with Python including charts and conditional formats; driving Google Sheets from a script.

How do I install Spreadsheet Ops in Claude Code?

Run `npx skills add ericrisco/rsc-harness --skill spreadsheet-ops -a claude-code`. Or copy the skill folder (skills/spreadsheet-ops in ericrisco/rsc-harness) into .claude/skills/spreadsheet-ops in your project. Claude Code loads it when a task matches its description.

How do I install Spreadsheet Ops in Codex?

Run `npx skills add ericrisco/rsc-harness --skill spreadsheet-ops -a codex`. Or copy the skill folder (skills/spreadsheet-ops in ericrisco/rsc-harness) into .agents/skills/spreadsheet-ops in your project. Codex loads it when a task matches its description.

Can I use Spreadsheet Ops in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill spreadsheet-ops -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spreadsheet-ops, .gemini/skills/spreadsheet-ops, .github/skills/spreadsheet-ops and .opencode/skills/spreadsheet-ops in your project.

What does Spreadsheet Ops need to run?

Going by SKILL.md and its folder, Spreadsheet Ops needs a shell for the scripts in its folder. Our summary lists: Python 3; A Bash shell.

Does Spreadsheet Ops access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Spreadsheet Ops safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Spreadsheet Ops use?

Spreadsheet Ops is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Spreadsheet Ops use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.7k tokens, read only when the agent opens those files.

What are the alternatives to Spreadsheet Ops?

Skills that share tags, products or a category with Spreadsheet Ops: XLSX (K-Dense-AI/claude-scientific-writer, 2.4k stars), XLSX (rvdbreemen/OTGW-firmware, 207 stars), Excel Workbook Editor (TokenRhythm/opensquilla, 7.1k stars) and Kimi XLSX (thvroyal/kimi-skills, 238 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Spreadsheet Ops?

ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.

Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.