Metadata-driven CLI for AI Agent Bots — 48 operations across 7 domains, structured JSON envelope I/O, zero interactive prompts.
# Add to your Claude Code skills
git clone https://github.com/Mininglamp-OSS/octo-cliLast scanned: 7/1/2026
{
"issues": [
{
"file": "README.md",
"line": 93,
"type": "remote-install",
"message": "Install command (remote install script piped to a shell — review the source before running): \"curl -fsSL https://raw.githubusercontent.com/Mininglamp-OSS/octo-cli/main/instal\"",
"severity": "low"
}
],
"status": "PASSED",
"scannedAt": "2026-07-01T08:13:31.503Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}octo-cli is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by Mininglamp-OSS. Metadata-driven CLI for AI Agent Bots — 48 operations across 7 domains, structured JSON envelope I/O, zero interactive prompts. It has 474 GitHub stars.
Yes. octo-cli passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/Mininglamp-OSS/octo-cli" and add it to your Claude Code skills directory (see the Installation section above).
octo-cli is primarily written in Go. It is open-source under Mininglamp-OSS on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh octo-cli against similar tools.
No comments yet. Be the first to share your thoughts!
octo-cli is the command-line interface for the Octo ecosystem — a thin,
single-binary REST client designed for AI Agent Bots to call via exec
from agent runtimes (OpenClaw, Claude Code, and similar). Every invocation
emits a structured JSON envelope on stdout; errors go to stderr with a
deterministic taxonomy. There is no interactive I/O.
octo-cli is metadata-driven. The command tree is auto-registered at startup from OpenAPI 3.x specs embedded into the binary. Adding or changing an endpoint means editing a spec, not the code.
OpenAPI specs ──► Registry ──► Service Engine ──► Factory ──► Client ──► Output
(embedded) (parsed) (cobra commands) (DI) (HTTP) (envelope)
Key properties:
OCTO_API_BASE_URL.internal/cmdutil.Factory is the dependency container.
No mutable package-level globals; tests inject stubs through ConfigFunc
/ CredentialFunc / ClientFunc / RegistryFunc.| Domain | Ops | Purpose |
|---|---|---|
docs |
32 | Documents, spreadsheets & whiteboards — lifecycle, full-text search, body content, sheet cells (paged read), board scenes, members, comments, versions, attachments |
html |
20 | Interactive HTML documents (octo-doc, separate backend from docs) — publish immutable versions, drafts, per-doc share codes & per-uid grants, media assets, inline comments, agent element read/replace |
drive |
42 | Network drive — spaces & members, folder/file tree, two-phase blob upload & signed download, online-document mounts, share links, invites, IM-attachment transfer. Plus 3 composite commands (upload file, download file, share create) for 45 leaves total |
matter |
14 | Todos/tasks — temporarily withheld while the backend API stabilizes |
summary |
4 | Personal-bot summaries — create owner-only summaries from explicit sources, then discover/read/cite. Temporarily withheld while the create backend (Mininglamp-OSS/octo-smart-summary#181) is merged, deployed, and enabled |
group |
9 | Groups — list, get, members, metadata; create/update (User Bot) |
thread |
8 | Threads — create, list, get, members, join/leave, metadata |
bot |
6 | Bot lifecycle — register, user-info, space-members, heartbeat |
message |
10 | Messaging — send, edit, sync, read-receipt; search (search/all/files/media/around/groups, in-channel or cross-channel) |
file |
4 | Files — upload, download, credentials, presigned URLs |
event |
2 | Event polling — list, ack |
loop |
126 | Fleet control plane — tasks, executions, experts, expert teams, workspaces, runtimes, projects, skills, automations, attachments, comments, labels, and related resources |
For Node-based agent runtimes (OpenClaw, etc.):
npm install -g @mininglamp-oss/octo-cli
The npm package resolves the matching platform sub-package, which already contains the prebuilt binary. Install does not download binaries from GitHub.
go install github.com/Mininglamp-OSS/octo-cli/cmd/octo-cli@latest
brew install Mininglamp-OSS/tap/octo-cli
Download the latest binary for your platform from GitHub Releases:
# Archives are named octo-cli_<version>_<os>_<arch>.tar.gz for every platform,
# including Windows. Pick the one for your platform and substitute <version>
# (e.g. 0.5.0):
curl -LO https://github.com/Mininglamp-OSS/octo-cli/releases/download/v<version>/octo-cli_<version>_linux_amd64.tar.gz
tar xzf octo-cli_<version>_linux_amd64.tar.gz
sudo mv octo-cli /usr/local/bin/
Windows release archives are .tar.gz as well; Windows 10+ includes tar.exe.
curl -fsSL https://raw.githubusercontent.com/Mininglamp-OSS/octo-cli/main/install.sh | sh
# Authenticate as a bot.
export OCTO_BOT_TOKEN="bf_your_user_bot_token"
# Optional for test or self-hosted deployments; production is the default.
# export OCTO_API_BASE_URL="https://im-test.deepminer.com.cn"
# NOTE: the `matter` domain is temporarily withheld (backend API stabilizing).
# Messaging
octo-cli message send --data '{"channel_id":"chat-1","channel_type":1,"payload":{"type":1,"content":"hi"}}'
octo-cli message edit --data '{"message_id":"m-1","channel_id":"chat-1","channel_type":1,"content_edit":"{\"type\":1,\"content\":\"updated\"}"}'
# Message search (User Bot bf_ or user API key uk_ token; App Bot app_ is rejected locally).
octo-cli message search --chat-id chat-1 --keyword "quarterly report" # in-channel
octo-cli message search --keyword "quarterly report" # cross-channel (mixed feed)
octo-cli message search files --chat-id chat-1 --keyword "*.pdf" # files in a channel
octo-cli message search groups --keyword "quarterly report" # which channels matched (L1)
octo-cli message search all --keyword "budget" --on-behalf-of u-alice # OBO: as a real person
# Groups and threads
octo-cli group list
octo-cli group members group-abc
octo-cli thread list group-abc
octo-cli thread create group-abc --name "design review"
# Files
octo-cli file upload --file ./report.pdf
octo-cli file download abc123 --jq '.data.url'
# Agent Mail — policy-aware send; the server may accept it or save a Draft
# depending on the mailbox's current outbound mode.
octo-cli mail message send-intent \
--to recipient@example.com --subject "Status update" --text "Ready." \
--idempotency-key "send-example-001"
octo-cli mail thread get T123
octo-cli mail draft list
# Docs — create/list/search, then read and incrementally edit the live body.
octo-cli docs create --title "Design notes"
octo-cli docs list --sort updatedAt:desc
octo-cli docs search --keyword "quarterly plan" --doc-type doc --page-all
octo-cli docs get doc-123
octo-cli docs content get doc-123 # returns the body + base version token
octo-cli docs import doc-123 --file ./notes.md # replaces a doc from .md/.markdown/.docx
octo-cli docs export doc-123 --export-format pdf -o ./notes.pdf
octo-cli docs members set doc-123 --data '{"uid":"u-1","role":"writer"}'
# Fleet/Loop uses the same gateway under /fleet/api/v1.
octo-cli loop task list --workspace-id <workspace-id>
octo-cli docs comments add doc-123 --data '{"body":"looks good"}'
# Mounted HTML documents registered in docs-backend use the same search endpoint.
# Resolve a hit's slug with docs get, then continue in the separate html domain.
octo-cli docs search --keyword "interactive roadmap" --doc-type html --page-all
octo-cli docs get html-doc-id # returns octoDocSlug for HTML documents
octo-cli html get html-document-slug
# Spreadsheets — read the live cells + base version, then batch-edit under If-Match.
octo-cli docs sheet get sheet-9 # whole sheet + base version token
octo-cli docs import sheet-9 --file ./report.xlsx # imports the first visible worksheet
octo-cli docs export sheet-9 --export-format xlsx -o ./report.xlsx
octo-cli docs sheet get sheet-9 --limit 500 # page a large sheet; follow --cursor <nextCursor>
octo-cli docs sheet edit sheet-9 --base-version "<token>" \
--data '{"cells":{"default!0:0":{"v":"hi"},"default!1:0":null}}'
# Whiteboards — read the live scene + base version, then upsert/delete elements under If-Match.
octo-cli docs scene get board-7 # elements (z-order) + files + base version token
octo-cli docs scene edit board-7 --base-version "<token>" \
--data '{"elements":[{"id":"e1","type":"rectangle","version":4}],"deletedElementIds":["e2"],"files":{}}'
octo-cli docs import board-7 --file ./board.excalidraw # merge (default): preserves existing elements
octo-cli docs import board-7 --file ./board.excalidraw --mode replace # explicit overwrite; backend safety snapshot + concurrency protection
octo-cli docs export board-7 --export-format png -o ./board.png
# HTML docs (octo-doc) — a SEPARATE backend from `docs`. Publish self-contained
# interactive HTML as immutable versions, then edit a single stamped artifact.
octo-cli html publish --slug launch --html '<h1>hi</h1>' --mount-type group --group-no <group_no> \
--data '{"meta":{"title":"Launch page"}}' # title lives in meta.title; slug+html required
octo-cli html list
octo-cli html versions my-slug
octo-cli html draft save my-slug --data '{"html":"<h1>wip</h1>"}' # then: html draft promote my-slug
octo-cli html share my-slug # mint a reader share code
octo-cli html grant add my-slug --data '{"uid":"u-1"}' # per-uid authorization
octo-cli html element get --slug my-slug --aid <content-hash> # read one stamped artifact (slug is a flag)
octo-cli html element replace --slug my-slug --aid <content-hash> --new-html '<p>new</p>'
# Discover the API — fully offline, specs are embedded.
o