StorageOps — S3-compatible object storage diagnostic toolkit. A Pi Coding Agent extension + skill pack.
Project description
StorageOps
StorageOps is a Pi Coding Agent extension and skill pack for diagnosing S3-compatible object storage problems.
It is designed for cases like AccessDenied, SlowDown, SignatureDoesNotMatch, checksum mismatches, stale reads, broken lifecycle rules, failed notifications, and migration surprises. You provide logs, errors, configs, or a short description; Pi loads the StorageOps skills and tools to produce an evidence-based diagnosis.
What You Get
- 16 diagnostic skills covering security, protocol compatibility, CLI/SDK behavior, performance, network access, lifecycle cost, replication, mount/workspace usage, migration, data consistency, access logs, big-data pipelines, notifications, reporting, and triage, plus 1 eval skill pack.
- 3 Pi extension tools:
scan_secretsredacts credentials and tokens.detect_domainranks likely diagnostic domains from evidence text.search_memorysearches prior Pi sessions for related diagnoses.
- Deterministic helper scripts for access logs, policy analysis, throttling, ETags, small-object cost, migration estimates, SigV4 parsing, endpoint reachability, and golden-case eval.
- A regression suite with 33 compact golden cases and size gates to keep the repository lean.
Quick Start
Prerequisites: Node.js 18+, Python 3.11+, and a model provider key.
# 1. Install Pi Coding Agent (the runtime engine)
# storageops install does this automatically, but you can also install manually:
npm install -g @earendil-works/pi-coding-agent
# 2. Install StorageOps
python3 -m pip install storageops -i https://pypi.org/simple
storageops install
# 3. Configure a model key (pick one)
export ANTHROPIC_API_KEY=sk-...
export DEEPSEEK_API_KEY=sk-...
export OPENAI_API_KEY=sk-...
# 4. Run a diagnosis
storageops --print 's5cmd sync reports 429 SlowDown; diagnose likely cause'
Ubuntu / Debian: If
pip install storageopsfails with "externally-managed-environment", usepython3 -m pip install storageops --break-system-packages -i https://pypi.org/simpleon an isolated VM, or create a virtualenv first.Cloud or regional PyPI mirrors: If your default mirror reports "No matching distribution found for storageops", install from the official PyPI index:
python3 -m pip install --upgrade storageops -i https://pypi.org/simple
storageops install automatically installs Pi Coding Agent via npm if it is not
already present. It stops before deployment when an older Pi version is detected
and prints the manual upgrade command, avoiding both auto-upgrades and half-ready
StorageOps installs.
Configure a Model Key
Use any one of these patterns:
export DEEPSEEK_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-...
export OPENAI_API_KEY=sk-...
Or store a local key for the selected StorageOps/Pi agent directory:
echo sk-... > ~/.storageops/agent/api-key
chmod 600 ~/.storageops/agent/api-key
You can also pass Pi-native options through storageops, for example --provider, --model, --api-key, --print, --resume, or @file inputs.
DeepSeek smoke test:
storageops --provider deepseek --model deepseek-v4-pro --print 'hello'
deepseek-v4-pro and deepseek-v4-flash are known-good DeepSeek choices with
Pi 0.78.0. If you keep a key in ~/.storageops/agent/api-key, StorageOps reads
it and exposes it to Pi; you do not need to pass --api-key for normal use.
Install Modes
Independent mode is the default:
storageops install
It writes:
~/.storageops/
├── agent/
│ ├── settings.json
│ ├── api-key
│ ├── extensions/storageops.ts
│ └── sessions/
└── skills/
Merge mode installs into an existing Pi setup:
storageops install --merge
It writes the extension to ~/.pi/agent/extensions/, skills to ~/.pi/skills/, and backs up settings.json before merging StorageOps settings.
Typical Workflows
Single-shot diagnosis:
storageops --print @rclone-debug.log 'Explain the checksum mismatch and safe next steps'
Interactive diagnosis:
storageops
Refresh an install after upgrade:
python3 -m pip install --upgrade storageops -i https://pypi.org/simple
storageops install --force
storageops install --force redeploys files from the currently installed local
package. During install, StorageOps prints the local package version and package
path, warns if PyPI has a newer version, and records deployment provenance in
~/.storageops/install.json.
Run quality gates from a checkout:
python3 scripts/skill_integrity_check.py
python3 skills/storageops-eval-golden-cases/scripts/golden_case_validator.py \
skills/storageops-eval-golden-cases/cases
make validate
Documentation Map
- Getting Started
- Cloud VM Install Guide
- CLI Reference
- Architecture
- Quick Reference
- Release
- Tutorial
- Skill Quality Guide
- Skill Taxonomy
- Routing Flowchart
- Dependency Map
- API Coverage Matrix
- Examples
- Changelog
- Security
- Contributing
Repository Note
The source tree keeps canonical skills at repository root and exposes them through storageops_cli/skills -> ../skills for packaging. The installer expects packaged skills to be available next to storageops_cli; review distribution changes carefully.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file storageops-0.4.20.tar.gz.
File metadata
- Download URL: storageops-0.4.20.tar.gz
- Upload date:
- Size: 241.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
157869232e929f564ca2efc3e928aea0b19aebb1dc27d7a1d75e80247cbe53ad
|
|
| MD5 |
7e51cff06aa59af03764ec72db36e7a8
|
|
| BLAKE2b-256 |
b2a19a75ac1960ef3cbd77f59635525aee77b8b049116cef89fa6463ffac176e
|
Provenance
The following attestation bundles were made for storageops-0.4.20.tar.gz:
Publisher:
publish.yml on hxddh/storageops
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
storageops-0.4.20.tar.gz -
Subject digest:
157869232e929f564ca2efc3e928aea0b19aebb1dc27d7a1d75e80247cbe53ad - Sigstore transparency entry: 1702518366
- Sigstore integration time:
-
Permalink:
hxddh/storageops@4c7ebbacc4920a819505c345ed9aeacc3e4ab905 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/hxddh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4c7ebbacc4920a819505c345ed9aeacc3e4ab905 -
Trigger Event:
push
-
Statement type:
File details
Details for the file storageops-0.4.20-py3-none-any.whl.
File metadata
- Download URL: storageops-0.4.20-py3-none-any.whl
- Upload date:
- Size: 344.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6a5ce6b8d21c9aa5c5f1fe8bb36a806d8981387a70440a1086fb21e6f151b90
|
|
| MD5 |
694f871946bd9491c3d681ed3a01fd22
|
|
| BLAKE2b-256 |
ae6162b3de067e79f22873f2ed94858ac9baf5b98aeebbfa82133ee936d3d4ad
|
Provenance
The following attestation bundles were made for storageops-0.4.20-py3-none-any.whl:
Publisher:
publish.yml on hxddh/storageops
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
storageops-0.4.20-py3-none-any.whl -
Subject digest:
b6a5ce6b8d21c9aa5c5f1fe8bb36a806d8981387a70440a1086fb21e6f151b90 - Sigstore transparency entry: 1702518417
- Sigstore integration time:
-
Permalink:
hxddh/storageops@4c7ebbacc4920a819505c345ed9aeacc3e4ab905 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/hxddh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4c7ebbacc4920a819505c345ed9aeacc3e4ab905 -
Trigger Event:
push
-
Statement type: