@clawops/cli 1.7.2 → 1.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -92
- package/dist/{chunk-SEABO2UU.js → chunk-OPUM3FDW.js} +1 -1
- package/dist/cli.js +5 -4
- package/dist/{generate-NIF6IBZC.js → generate-DYNAQRD7.js} +1 -1
- package/dist/{package-TZ2HYF5C.js → package-3RCGT5UR.js} +4 -1
- package/dist/{server-WM3AY4PJ.js → server-7TEMRTRY.js} +2 -2
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -12,113 +12,58 @@ and Cursor drive them through typed MCP tools with explicit safety controls.
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
## What's new in v1.7.
|
|
15
|
+
## What's new in v1.7.3
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`/etc/clawops/hardening/` record what has been applied.
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
clawops harden --list # show available modules
|
|
24
|
-
clawops harden --stack prod --dry-run # preview changes, apply nothing
|
|
25
|
-
clawops harden --stack prod # apply the default module set
|
|
26
|
-
clawops harden --stack prod --options ssh,ufw # apply a specific subset
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
**Common modules (all providers), ON by default:** `ssh` (hardens `sshd_config`, guards against
|
|
30
|
-
lockout by verifying `authorized_keys` is non-empty before restarting sshd), `ufw` (deny-all
|
|
31
|
-
incoming, allow SSH + gateway 18789), `fail2ban` (SSH jail: 5 failures → 10-minute ban),
|
|
32
|
-
`unattended-upgrades` (security-only auto updates), and `docker-socket` (verify
|
|
33
|
-
`/var/run/docker.sock` is `root:docker 660`). **Opt-in:** `auditd`, `lynis` (CIS Level 1 scan →
|
|
34
|
-
`~/.clawops/reports/`), `sysctl`.
|
|
35
|
-
|
|
36
|
-
**AWS modules (check-only, ON by default):** `aws-sg-audit` (warns on `0.0.0.0/0` ingress on
|
|
37
|
-
unexpected ports) and `aws-ssm-check` (verifies `AmazonSSMManagedInstanceCore` for emergency SSM
|
|
38
|
-
shell access). **Opt-in:** `aws-flow-logs`, `aws-guardduty`.
|
|
39
|
-
|
|
40
|
-
`clawops setup` now presents a multi-select hardening step after deploy (skippable with
|
|
41
|
-
`--no-harden`), and `clawops doctor --stack <name>` gains a Hardening section showing which
|
|
42
|
-
modules are applied, missing, or drifted.
|
|
17
|
+
**README maintenance.** The release-notes section had grown to four versions and was missing
|
|
18
|
+
v1.7.2 entirely. It now carries the current line only; [`CHANGELOG.md`](CHANGELOG.md) remains the
|
|
19
|
+
full history.
|
|
43
20
|
|
|
44
21
|
---
|
|
45
22
|
|
|
46
|
-
## What's new in v1.
|
|
23
|
+
## What's new in v1.7.2
|
|
47
24
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
25
|
+
**Refuses OpenClaw 2.0.** OpenClaw `2026.8.1` changed the container runtime contract — state moved
|
|
26
|
+
into SQLite, config moved to a writable path, and model providers became install-gated plugins.
|
|
27
|
+
Deploying it from this release line produces a crash-looping gateway. `doctor`, `plan`, `up` and
|
|
28
|
+
`apply` now refuse anything above `2026.7.1-2`.
|
|
52
29
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
30
|
+
The support range in `spec/openclaw-versions.yaml` was previously unbounded *and read by no code*,
|
|
31
|
+
so any OpenClaw release was accepted. Moving tags are now resolved to a concrete version **before**
|
|
32
|
+
the range check, and an unresolved tag is refused rather than assumed safe — `latest` and `stable`
|
|
33
|
+
both point at 2.0 today. The default is now a concrete pin.
|
|
57
34
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- **Azure:** updated deprecated image reference `UbuntuServer/22.04-LTS` →
|
|
62
|
-
`0001-com-ubuntu-server-jammy/22_04-lts-gen2` — every Azure deployment was broken; and fixed a
|
|
63
|
-
malformed Key Vault `roleDefinitionId` that broke Key Vault RBAC entirely.
|
|
64
|
-
- **AWS:** Bedrock startup script now uses the IMDSv2 PUT→GET token flow (a plain `curl` to IMDS
|
|
65
|
-
returned 401, so the region always fell back to `us-east-1`); replaced
|
|
66
|
-
`AmazonBedrockFullAccess` with a least-privilege inline policy.
|
|
67
|
-
- **AWS (⚠️ migration impact):** migrated from inline Security Group ingress/egress arrays to
|
|
68
|
-
individual `SecurityGroupIngressRule`/`SecurityGroupEgressRule` resources so CIDR changes no
|
|
69
|
-
longer replace the whole Security Group. **Existing AWS stacks have their Security Group
|
|
70
|
-
replaced on the first `clawops up` after this upgrade** — see
|
|
71
|
-
`docs/decisions/0009-aws-sg-rule-resources.md` for the import-based mitigation.
|
|
72
|
-
- **All providers:** `accessMode=auto` egress-IP detection now returns a `Result` and throws a
|
|
73
|
-
clear error on failure instead of silently producing a VM with zero ingress rules.
|
|
35
|
+
`clawops doctor --stack <name>` reports the version a deployed gateway is actually running, so an
|
|
36
|
+
existing deployment that already picked up 2.0 through a moving tag can be identified.
|
|
74
37
|
|
|
75
|
-
|
|
38
|
+
**`clawops config set` now applies.** It never has. The config clawops mounted was read by nothing
|
|
39
|
+
on either OpenClaw line — models, channels and auth mode were silently discarded. Setting
|
|
40
|
+
`OPENCLAW_CONFIG_PATH` fixes it, with four guards: `gateway.port` normalisation (with a warning),
|
|
41
|
+
an argv `--port` pin, a parse check, and a post-restart health gate. The MCP `gateway restart`
|
|
42
|
+
tool, which dropped the config mount entirely, now matches the CLI path.
|
|
76
43
|
|
|
77
|
-
|
|
44
|
+
**A fresh local deployment starts.** OpenClaw refuses a non-loopback bind without auth and always
|
|
45
|
+
binds `0.0.0.0` in a container, and the bootstrap never supplied a token — so the gateway exited 78
|
|
46
|
+
and systemd restart-looped. A token is now generated once, kept in a `0600` env file, and passed
|
|
47
|
+
via `--env-file`, never on the command line.
|
|
78
48
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
log lines" invoke the real `clawops` CLI rather than having the gateway AI guess.
|
|
49
|
+
**Ollama is reachable.** `localhost` inside the container is the container. clawops now passes
|
|
50
|
+
`--add-host=host.docker.internal:host-gateway` and defaults the Ollama address to match.
|
|
82
51
|
|
|
83
|
-
|
|
84
|
-
clawops
|
|
85
|
-
|
|
86
|
-
clawops mcp wire --force # bypass gateway version check
|
|
87
|
-
```
|
|
52
|
+
**Packaging.** `spec/` was missing from the published files, and neither it nor
|
|
53
|
+
`bootstrap.sh.tmpl` resolved from the bundle — so `clawops plan` and `clawops up --provider local`
|
|
54
|
+
failed from an npm install. Both are now shipped and resolved correctly.
|
|
88
55
|
|
|
89
|
-
|
|
90
|
-
|
|
56
|
+
**SSH host keys.** The verifier read each `known_hosts` line's *key type* as the key, so any
|
|
57
|
+
standard entry failed permanently with `Host denied`. Standard entries now parse, including
|
|
58
|
+
comma-separated host lists, `[host]:port`, hashed hostnames, `@revoked` / `@cert-authority`
|
|
59
|
+
markers, and wildcard and negated patterns.
|
|
91
60
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
61
|
+
> **Behaviour change:** a host covered by a wildcard whose key does not match is now refused where
|
|
62
|
+
> it previously connected. Ignoring wildcards meant trust-on-first-use accepted a key your own
|
|
63
|
+
> `known_hosts` contradicted. This matches OpenSSH.
|
|
95
64
|
|
|
96
65
|
---
|
|
97
66
|
|
|
98
|
-
## What's new in v1.4.0
|
|
99
|
-
|
|
100
|
-
**`clawops monitor`** — live dashboard for any deployed stack. Shows gateway health, container
|
|
101
|
-
status, CPU/memory, disk usage, and a rolling log tail. Refreshes on an interval with `[r]`,
|
|
102
|
-
toggles logs with `[l]`, and quits with `[q]`.
|
|
103
|
-
|
|
104
|
-
Run without `--stack` to get an **interactive stack picker** first — probes all registered stacks
|
|
105
|
-
in parallel, shows only running ones by default, and lets you toggle to a full list (`[a]`) where
|
|
106
|
-
not-deployed stacks can be deleted from the registry with `[d]`. Press `[s]` inside the dashboard
|
|
107
|
-
to go back to the picker.
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
clawops monitor # interactive stack selection → dashboard
|
|
111
|
-
clawops monitor --stack prod # jump straight to a named stack
|
|
112
|
-
clawops monitor --stack prod | cat # one-shot snapshot for CI
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**`clawops_monitor` MCP tool** — same snapshot as a single structured JSON call, so Claude Code
|
|
116
|
-
and Cursor can check stack health without opening a terminal.
|
|
117
|
-
|
|
118
|
-
**`clawops stacks delete` guard** — now blocks deletion of a still-deployed stack and requires
|
|
119
|
-
`--force` to remove from the registry without tearing down cloud resources first.
|
|
120
|
-
|
|
121
|
-
---
|
|
122
67
|
|
|
123
68
|
## Who this is for
|
|
124
69
|
|
|
@@ -612,7 +557,7 @@ pnpm dev doctor # verify toolchain
|
|
|
612
557
|
```bash
|
|
613
558
|
pnpm dev # run CLI from src/ via tsx
|
|
614
559
|
pnpm build # tsup → dist/
|
|
615
|
-
pnpm test # vitest (
|
|
560
|
+
pnpm test # vitest (786 tests, ~4s)
|
|
616
561
|
pnpm test:changed # vitest --changed (fast edit loop)
|
|
617
562
|
pnpm test:integration # Docker-based SSH integration tests
|
|
618
563
|
pnpm typecheck # tsc --noEmit
|
|
@@ -45,7 +45,7 @@ async function generatePlan(intent, _opts) {
|
|
|
45
45
|
"plan/apply is not supported for the local provider. Use `clawops up` directly."
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
|
-
const { version } = await import("./package-
|
|
48
|
+
const { version } = await import("./package-3RCGT5UR.js");
|
|
49
49
|
const config = getConfig();
|
|
50
50
|
const instanceType = intent.instanceType ?? "small";
|
|
51
51
|
const { guardOpenclawVersion, defaultOpenclawVersion } = await import("./version-guard-MZAO4KHS.js");
|
package/dist/cli.js
CHANGED
|
@@ -495,7 +495,7 @@ var plan_default = defineCommand5({
|
|
|
495
495
|
},
|
|
496
496
|
async run({ args }) {
|
|
497
497
|
const { buildContext } = await import("./context-5LCUG2QR.js");
|
|
498
|
-
const { generatePlan } = await import("./generate-
|
|
498
|
+
const { generatePlan } = await import("./generate-DYNAQRD7.js");
|
|
499
499
|
const ctx = buildContext(args);
|
|
500
500
|
if (ctx.adapter.name === "local") {
|
|
501
501
|
throw new UsageError(
|
|
@@ -1907,7 +1907,7 @@ var serveCmd = defineCommand17({
|
|
|
1907
1907
|
inspector: { type: "boolean", description: "Enable MCP inspector" }
|
|
1908
1908
|
},
|
|
1909
1909
|
async run({ args }) {
|
|
1910
|
-
const { serveMcp } = await import("./server-
|
|
1910
|
+
const { serveMcp } = await import("./server-7TEMRTRY.js");
|
|
1911
1911
|
await serveMcp({
|
|
1912
1912
|
port: args.http ? Number(args.http) : void 0,
|
|
1913
1913
|
bind: args.bind,
|
|
@@ -3527,7 +3527,7 @@ import { accessSync as accessSync2, constants as constants2 } from "fs";
|
|
|
3527
3527
|
import { execSync as execSync2 } from "child_process";
|
|
3528
3528
|
var ISSUES_URL = `${REPO_URL}/issues/new`;
|
|
3529
3529
|
var BODY_CAP = 2e3;
|
|
3530
|
-
var VERSION = true ? "1.7.
|
|
3530
|
+
var VERSION = true ? "1.7.4" : "dev";
|
|
3531
3531
|
async function collectContext() {
|
|
3532
3532
|
const nodeVersion = process22.version;
|
|
3533
3533
|
const os3 = `${process22.platform} ${process22.arch}`;
|
|
@@ -3767,11 +3767,12 @@ function handleError(err) {
|
|
|
3767
3767
|
}
|
|
3768
3768
|
|
|
3769
3769
|
// src/cli/index.ts
|
|
3770
|
+
var CLI_VERSION = true ? "1.7.4" : "dev";
|
|
3770
3771
|
var main = defineCommand23({
|
|
3771
3772
|
meta: {
|
|
3772
3773
|
name: "clawops",
|
|
3773
3774
|
description: "Deploy and manage self-hosted OpenClaw instances across clouds",
|
|
3774
|
-
version:
|
|
3775
|
+
version: CLI_VERSION
|
|
3775
3776
|
},
|
|
3776
3777
|
args: {
|
|
3777
3778
|
stack: { type: "string", description: "Target named stack (default from config)" },
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// package.json
|
|
4
4
|
var name = "@clawops/cli";
|
|
5
|
-
var version = "1.7.
|
|
5
|
+
var version = "1.7.4";
|
|
6
6
|
var description = "Deploy and manage self-hosted OpenClaw instances across clouds";
|
|
7
7
|
var type = "module";
|
|
8
8
|
var bin = {
|
|
@@ -19,6 +19,7 @@ var repository = {
|
|
|
19
19
|
type: "git",
|
|
20
20
|
url: "git+https://github.com/dfridkin/clawops.git"
|
|
21
21
|
};
|
|
22
|
+
var homepage = "https://clawops.fyi";
|
|
22
23
|
var mcpName = "io.github.dfridkin/clawops";
|
|
23
24
|
var publishConfig = {
|
|
24
25
|
access: "public",
|
|
@@ -102,6 +103,7 @@ var package_default = {
|
|
|
102
103
|
exports,
|
|
103
104
|
files,
|
|
104
105
|
repository,
|
|
106
|
+
homepage,
|
|
105
107
|
mcpName,
|
|
106
108
|
publishConfig,
|
|
107
109
|
engines,
|
|
@@ -120,6 +122,7 @@ export {
|
|
|
120
122
|
engines,
|
|
121
123
|
exports,
|
|
122
124
|
files,
|
|
125
|
+
homepage,
|
|
123
126
|
mcpName,
|
|
124
127
|
name,
|
|
125
128
|
packageManager,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "./chunk-3QJBNAHW.js";
|
|
10
10
|
import {
|
|
11
11
|
generatePlan
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OPUM3FDW.js";
|
|
13
13
|
import {
|
|
14
14
|
validatePlan
|
|
15
15
|
} from "./chunk-6X45DDGH.js";
|
|
@@ -1307,7 +1307,7 @@ If none of the above resolves the issue:
|
|
|
1307
1307
|
|
|
1308
1308
|
// src/mcp/server.ts
|
|
1309
1309
|
async function serveMcp(opts) {
|
|
1310
|
-
const { version } = await import("./package-
|
|
1310
|
+
const { version } = await import("./package-3RCGT5UR.js");
|
|
1311
1311
|
const server = new McpServer({ name: "clawops", version });
|
|
1312
1312
|
registerTools(server, opts);
|
|
1313
1313
|
registerResources(server);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clawops/cli",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.4",
|
|
4
4
|
"description": "Deploy and manage self-hosted OpenClaw instances across clouds",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"type": "git",
|
|
18
18
|
"url": "git+https://github.com/dfridkin/clawops.git"
|
|
19
19
|
},
|
|
20
|
+
"homepage": "https://clawops.fyi",
|
|
20
21
|
"mcpName": "io.github.dfridkin/clawops",
|
|
21
22
|
"publishConfig": {
|
|
22
23
|
"access": "public",
|