{"_id":"@avatarsd-llc/strawberry-cli","_rev":"4-d7e704f2e7626198de12d2a32c69219b","name":"@avatarsd-llc/strawberry-cli","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@avatarsd-llc/strawberry-cli","version":"0.1.0","keywords":["gorshok","strawberry","websocket","protobuf","grow-controller","cli","claude-skill","device-client","esp32"],"author":{"name":"Avatars LLC"},"license":"Apache-2.0","_id":"@avatarsd-llc/strawberry-cli@0.1.0","maintainers":[{"name":"avatarsd","email":"avatarsd2@gmail.com"}],"homepage":"https://github.com/avatarsd-llc/strawberry-cli#readme","bugs":{"url":"https://github.com/avatarsd-llc/strawberry-cli/issues"},"bin":{"strawberry":"bin/strawberry-cli.mjs","strawberry-cli":"bin/strawberry-cli.mjs"},"dist":{"shasum":"62e0474143e596019a57188ceaa38905b5aea9f6","tarball":"https://registry.npmjs.org/@avatarsd-llc/strawberry-cli/-/strawberry-cli-0.1.0.tgz","fileCount":61,"integrity":"sha512-dJg7j3BRpo23HYyw2hgQ8WxUeD5q+eht6IsoKbBhcCHc9Zq+jTj1tbDrr/7sEnguhjyJX3kc25xRwCahoeerwQ==","signatures":[{"sig":"MEQCIDAjNCIwcQSZjliNeoAgODG3MnDCcrkQZMJGCUzmEWR8AiBg5ScUnEb3mYsl8bXAJ5rNKRy1m8+owL3E4vusXkZw1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8879843},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"},"./node":{"types":"./dist/node.d.ts","import":"./dist/node.mjs","require":"./dist/node.cjs"},"./design":{"types":"./dist/design/index.d.ts","import":"./dist/design/index.mjs","require":"./dist/design/index.cjs"}},"gitHead":"76ff5eb03b48f2867814361b1ce84ee9ef4fd4b4","scripts":{"sil":"npm run build && node sil/run-sil.mjs","test":"vitest run","build":"tsup","proto":"node scripts/gen-proto.mjs","sil:mock":"node sil/mock-board.mjs","sil:docker":"docker build -f sil/Dockerfile -t strawberry-sil . && docker run --rm -d --name strawberry-sil -p 8080:8080 strawberry-sil && (sleep 2; MOCK_BOARD_PORT=8080 node sil/run-sil.mjs --external; rc=$?; docker rm -f strawberry-sil >/dev/null 2>&1; exit $rc)","test:watch":"vitest","lint:purity":"node scripts/check-purity.mjs"},"_npmUser":{"name":"avatarsd","email":"avatarsd2@gmail.com"},"repository":{"url":"git+https://github.com/avatarsd-llc/strawberry-cli.git","type":"git"},"_npmVersion":"10.9.8","description":"Open-source, framework-free TypeScript client for the Strawberry (Gorshok-v4) grow controller WS+protobuf interface. One library for the web UI SPA, the Pulumi deploy provider, the strawberry-cli, and a Claude Code agent-skill.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@protobuf-ts/runtime":"^2.9.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.6.3","@types/node":"^20.14.0","@protobuf-ts/plugin":"^2.11.1","@vitest/coverage-v8":"^2.1.9"},"peerDependencies":{"ws":"^8"},"peerDependenciesMeta":{"ws":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/strawberry-cli_0.1.0_1781903494561_0.14915881992350744","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@avatarsd-llc/strawberry-cli","version":"0.2.0","keywords":["gorshok","strawberry","websocket","protobuf","grow-controller","cli","claude-skill","esp32"],"author":{"name":"Avatars LLC"},"license":"Apache-2.0","_id":"@avatarsd-llc/strawberry-cli@0.2.0","maintainers":[{"name":"avatarsd","email":"avatarsd2@gmail.com"}],"homepage":"https://github.com/avatarsd-llc/strawberry-cli#readme","bugs":{"url":"https://github.com/avatarsd-llc/strawberry-cli/issues"},"bin":{"strawberry":"bin/strawberry-cli.mjs","strawberry-cli":"bin/strawberry-cli.mjs"},"dist":{"shasum":"51cb1f1366b5ffbc7dc517dc18afe342d186f8ec","tarball":"https://registry.npmjs.org/@avatarsd-llc/strawberry-cli/-/strawberry-cli-0.2.0.tgz","fileCount":31,"integrity":"sha512-tjELK+sDfvKe68O8oXwvHH+eBrpH1d+auhnYpB1d2NF9uwqzPB2ozLHCByjg25x174anOT/zKwsHIxeL8bR+rA==","signatures":[{"sig":"MEUCIQDWfnAJcdv+raME4ld1cGotIrSjlVjs8KFGgcQu2M6DJwIgJxb8J+ue31JFIskmha+QQpPl7EjTN+37GbMKgm6Xt0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":475336},"type":"module","engines":{"node":">=22"},"gitHead":"502b4d89bcb2e66e027e5e1c6c33ab925a0013a3","scripts":{"sil":"npm run build -w @avatarsd-llc/strawberry-client && npm run build && node sil/run-sil.mjs","test":"vitest run","build":"tsup","sil:mock":"node sil/mock-board.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"avatarsd","email":"avatarsd2@gmail.com"},"repository":{"url":"git+https://github.com/avatarsd-llc/strawberry-cli.git","type":"git","directory":"packages/strawberry-cli"},"_npmVersion":"10.9.8","description":"Framework-free CLI for the Strawberry (Gorshok-v4) grow controller. Drives the WS+protobuf interface (SEC-001 auth, OTA, WireGuard, grow-unit build) over @avatarsd-llc/strawberry-client.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@avatarsd-llc/strawberry-client":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"ws":"^8"},"peerDependenciesMeta":{"ws":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/strawberry-cli_0.2.0_1781955836029_0.2872119154494528","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@avatarsd-llc/strawberry-cli","version":"0.2.1","keywords":["gorshok","strawberry","websocket","protobuf","grow-controller","cli","claude-skill","esp32"],"author":{"name":"Avatars LLC"},"license":"Apache-2.0","_id":"@avatarsd-llc/strawberry-cli@0.2.1","maintainers":[{"name":"avatarsd","email":"avatarsd2@gmail.com"}],"homepage":"https://github.com/avatarsd-llc/strawberry-cli#readme","bugs":{"url":"https://github.com/avatarsd-llc/strawberry-cli/issues"},"bin":{"strawberry":"bin/strawberry-cli.mjs","strawberry-cli":"bin/strawberry-cli.mjs"},"dist":{"shasum":"874b9368e4b49d534ea1bb8c4690b7eeacf204c3","tarball":"https://registry.npmjs.org/@avatarsd-llc/strawberry-cli/-/strawberry-cli-0.2.1.tgz","fileCount":31,"integrity":"sha512-LfmBuMwwV/3hxdXGtmGND8TN3hkf/fh7fvqINpZYHIqHj3Hka8Ji3StLoR7UXgEG8THl0da+JI07RY3gq1sW7g==","signatures":[{"sig":"MEUCIQDoKW0OqQE9cllKrxCj80ZAXdwy1vivEbSWQS7ABIPYLgIgL/2Vw5vdaE5+SPy2mb4L29XIiLH+B2DU34NOpYYtXnQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":475934},"type":"module","engines":{"node":">=22"},"gitHead":"65f5779de9eae71c17b389b2ead86a86a008ab53","scripts":{"sil":"npm run build -w @avatarsd-llc/strawberry-client && npm run build && node sil/run-sil.mjs","test":"vitest run","build":"tsup","sil:mock":"node sil/mock-board.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"avatarsd","email":"avatarsd2@gmail.com"},"repository":{"url":"git+https://github.com/avatarsd-llc/strawberry-cli.git","type":"git","directory":"packages/strawberry-cli"},"_npmVersion":"10.9.8","description":"Framework-free CLI for the Strawberry (Gorshok-v4) grow controller. Drives the WS+protobuf interface (HMAC auth, OTA, WireGuard, grow-unit build) over @avatarsd-llc/strawberry-client.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"@avatarsd-llc/strawberry-client":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"peerDependencies":{"ws":"^8"},"peerDependenciesMeta":{"ws":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/strawberry-cli_0.2.1_1781957015243_0.3673711760561178","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@avatarsd-llc/strawberry-cli","version":"0.2.2","description":"Framework-free CLI for the Strawberry (Gorshok-v4) grow controller. Drives the WS+protobuf interface (HMAC auth, OTA, WireGuard, grow-unit build) over @avatarsd-llc/strawberry-client.","license":"Apache-2.0","author":{"name":"Avatars LLC"},"homepage":"https://github.com/avatarsd-llc/strawberry-cli#readme","repository":{"type":"git","url":"git+https://github.com/avatarsd-llc/strawberry-cli.git","directory":"packages/strawberry-cli"},"bugs":{"url":"https://github.com/avatarsd-llc/strawberry-cli/issues"},"keywords":["gorshok","strawberry","websocket","protobuf","grow-controller","cli","claude-skill","esp32"],"type":"module","bin":{"strawberry":"bin/strawberry-cli.mjs","strawberry-cli":"bin/strawberry-cli.mjs"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"scripts":{"build":"tsup","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","sil":"npm run build -w @avatarsd-llc/strawberry-client && npm run build && node sil/run-sil.mjs","sil:mock":"node sil/mock-board.mjs"},"dependencies":{"@avatarsd-llc/strawberry-client":"^0.1.0"},"peerDependencies":{"ws":"^8"},"peerDependenciesMeta":{"ws":{"optional":true}},"engines":{"node":">=22"},"_id":"@avatarsd-llc/strawberry-cli@0.2.2","gitHead":"0c3db544a8e762b298fa4e74fbf6f995c5c2e485","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-GYXw47ihqEOHszARUt0Ae1dEgMUBDjvsyfUNHkfCIrRPSkGVcFpuqN5JFcPWWssDzLDRpPYWxPT0bjHGJtwA1w==","shasum":"c1058d677987c5d32180fc5f0748e12a3a0df5e9","tarball":"https://registry.npmjs.org/@avatarsd-llc/strawberry-cli/-/strawberry-cli-0.2.2.tgz","fileCount":31,"unpackedSize":480081,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCK5d81IHX6wq5OWr//BH+jT2Vyvre55JaXtFZX7fVrEgIgZJOuNhHX8Wg/u93FcRHHdduxpx4GSlJOJcVmeuO1MaI="}]},"_npmUser":{"name":"avatarsd","email":"avatarsd2@gmail.com"},"directories":{},"maintainers":[{"name":"avatarsd","email":"avatarsd2@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/strawberry-cli_0.2.2_1781960920799_0.1869911663875654"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-19T21:11:34.367Z","modified":"2026-06-20T13:08:41.048Z","0.1.0":"2026-06-19T21:11:34.806Z","0.2.0":"2026-06-20T11:43:56.191Z","0.2.1":"2026-06-20T12:03:35.415Z","0.2.2":"2026-06-20T13:08:40.939Z"},"bugs":{"url":"https://github.com/avatarsd-llc/strawberry-cli/issues"},"author":{"name":"Avatars LLC"},"license":"Apache-2.0","homepage":"https://github.com/avatarsd-llc/strawberry-cli#readme","keywords":["gorshok","strawberry","websocket","protobuf","grow-controller","cli","claude-skill","esp32"],"repository":{"type":"git","url":"git+https://github.com/avatarsd-llc/strawberry-cli.git","directory":"packages/strawberry-cli"},"description":"Framework-free CLI for the Strawberry (Gorshok-v4) grow controller. Drives the WS+protobuf interface (HMAC auth, OTA, WireGuard, grow-unit build) over @avatarsd-llc/strawberry-client.","maintainers":[{"name":"avatarsd","email":"avatarsd2@gmail.com"}],"readme":"# @avatarsd-llc/strawberry-cli\n\n`strawberry` — a framework-free CLI for board setup of the **Strawberry** (Gorshok-v4)\nESP32-C6 grow controller, plus the Claude Code agent skills that drive it. It is a thin\ncommand surface over the [`@avatarsd-llc/strawberry-client`](../strawberry-client) library and\nsupersedes the firmware's hand-rolled `tools/*.py` (`ota_upload.py`, `wg_provision.py`,\n`verify_grow.py`, the `ws_*_stress.py` family).\n\n## Install\n\n```bash\nnpm i @avatarsd-llc/strawberry-cli      # or: npx @avatarsd-llc/strawberry-cli ...\n```\n\n**Node 22+** baseline. The [`ws`](https://www.npmjs.com/package/ws) package is an optional\npeer dependency (used by the Node transport); install it if your runtime lacks a global\n`WebSocket`.\n\n## CLI\n\n```bash\nnpx strawberry info --host 192.168.1.117          # reachable? who is it?\nexport STRAWBERRY_PW='device-password'             # plaintext stays local; only HMAC goes on the wire\nnpx strawberry query capabilities --host 192.168.1.117 --json\nnpx strawberry help --json                          # the whole command tree, machine-readable\n```\n\nThe password is resolved (in order) from `--password`, `--password-file`,\n`$STRAWBERRY_PW` / `$STRAWBERRY_PASSWORD`, or an interactive TTY prompt — and **never\ncrosses the wire**. Global flags: `--host`, `--password` / `--password-file`,\n`--token-file`, `--ttl-ms`, `--json`.\n\n| Command       | Purpose |\n|---------------|---------|\n| `info`        | Connect + print capabilities / system flags / Wi-Fi (alias: `connect`). |\n| `query`       | One-shot pull of a device state (14 verbs, e.g. `capabilities`, `wifi`, `device_config`, `grow_config`, `ota`, `wg_status`, `ow_config`). |\n| `auth`        | HMAC session: `login` / `resume` / `revoke`; writes a 0600 token file. |\n| `net`         | Provision Wi-Fi STA creds / Home-Assistant MQTT; read net info (`wifi`/`ha`/`info`). |\n| `provision`   | Convenience wrapper: `wifi` / `wireguard` / `identity`. |\n| `wg`          | WireGuard fleet overlay: `apply` a wg-quick `.conf` / `disable` / `status`. |\n| `ota`         | Push firmware over WS: `--bin` (app) / `--spa-bin` (web UI) / `--combined` (lockstep). |\n| `system`      | Persisted hardware/runtime `config` and boot-time subsystem `flags`. |\n| `grow`        | Build a unit: `unit-set` / `unit-remove` / `unit-list` / `io-add` / `io-remove` / `io-list` / `schedule-set`. |\n| `controllers` | Wire the controller graph: `graph-apply` (atomic, rollback-safe) / `list` / `destroy`. |\n| `diag`        | Health: `heap` (free-heap trend + min_free) / `stress` (unit-churn smoke test) / `logs`. |\n| `reboot`      | Reboot, or `--factory-reset` / `--grow-erase`. |\n| `raw`         | Send any `ClientMessage` from a JSON file (escape hatch). |\n\n`query` excludes `snapshot` and `stats`: those are **push-only** on the firmware — read\nthem by subscribing to their topics, not by querying. Full command reference:\n[`docs/cli.md`](./docs/cli.md).\n\n## Skill — drive a board from a Claude Code agent\n\nThe package bundles agent skills under [`skill/`](./skill/). Point a Claude Code agent at\n[`skill/strawberry-board`](./skill/strawberry-board/SKILL.md) and it will take an arbitrary board\nfrom fresh to running by sequencing the per-step skills, each of which drives the\n`strawberry` CLI (it adds no second client). The agent first reads\n`strawberry help --json` so every step uses the device's *provable* command vocabulary\nrather than a guessed one.\n\n**Coverage.** The library and CLI expose the board's *full* WS+protobuf command surface —\nall **64** `ClientMessage` commands, **38** `ServerMessage` types, **17** query kinds and\n**13** pub/sub topics — round-tripped by a **106-case** protocol matrix, so an agent can\nreach every documented board capability from a single client. Behaviour against live\nhardware is tracked by a separate HIL acceptance matrix; a few advanced flows (e.g.\ncross-process token *resume*) are firmware-version-dependent and flagged in the relevant\nskill rather than silently assumed.\n\nThe orchestrator chains these per-step skills (each is also usable on its own — see\n[`skill/README.md`](./skill/README.md)):\n\n| Skill | Stage |\n|-------|-------|\n| [`strawberry-reach`](./skill/strawberry-reach/SKILL.md) | Find the board on the LAN (WS probe, no mDNS), confirm by MAC, HMAC login, persist a 0600 token. |\n| [`strawberry-provision`](./skill/strawberry-provision/SKILL.md) | Join Wi-Fi STA, optional HA MQTT, optional WireGuard fleet join. |\n| [`strawberry-flash`](./skill/strawberry-flash/SKILL.md) | Bring to target firmware/web-UI revision (app/spa/combined), validated dwell+3x. |\n| [`strawberry-config`](./skill/strawberry-config/SKILL.md) | Persisted config + boot subsystem flags + 1-Wire IO boards. |\n| [`strawberry-unit`](./skill/strawberry-unit/SKILL.md) | Compose a cultivation unit: create, add IO, atomic graph-apply, schedule, optional Control Box. |\n| [`strawberry-import-export`](./skill/strawberry-import-export/SKILL.md) | Lossless save/restore of a unit or whole-device design; secrets redacted, device key never serialized. |\n| [`strawberry-diagnose`](./skill/strawberry-diagnose/SKILL.md) | Health pass: heap trend, system stress, capacity boundary, JSONL recording. |\n\nCanonical order: `discover -> auth -> capabilities -> network -> overlay (fleet) ->\nconfig -> firmware -> build unit -> verify`. The skills locate the board **by MAC**\n(DHCP leases drift — a stale IP looks like a crash but isn't), stop for human sign-off\nbefore destructive steps (factory-reset, grow-erase, OTA), and validate every reboot with\na dwell+3x recovery gate.\n\n## Build & test\n\nFrom the monorepo root (workspace-aware; the library is built/linked automatically):\n\n```bash\nnpm install\nnpm run build                          # builds strawberry-client, then this CLI -> dist/cli.{mjs,cjs}\nnpm run test -w @avatarsd-llc/strawberry-cli   # vitest: CLI args + wg-conf parsing\nnode packages/strawberry-cli/bin/strawberry-cli.mjs --help\n```\n\n**SIL** (software-in-the-loop) — a mock board under [`sil/`](./sil/) exercises the CLI bin\nagainst an in-process server: `npm run sil` (informational; surfaces the documented OPEN\nprotocol findings as failing rows). The mock board loads the codec from the built\n`@avatarsd-llc/strawberry-client` sibling package so it cannot drift from the wire schema.\n\n## License\n\n[Apache-2.0](./LICENSE), (c) Avatars LLC.\n","readmeFilename":"README.md"}