@axonflow/openclaw 2.0.2 → 2.0.3

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/CHANGELOG.md CHANGED
@@ -1,18 +1,39 @@
1
1
  # Changelog
2
2
 
3
- ## [2.0.2] - 2026-04-30 — Static-scan regex-bait fix + tighter pre-publish guard
3
+ ## [2.0.3] - 2026-04-30 — Scrub bait shapes from published markdown + scan all shipped files
4
4
 
5
- ClawHub's static-analysis scanner shipped a new ruleset (engine `v2.4.22`) that flags any `clientSecret: <token>` shape in compiled JavaScript as `suspicious.exposed_secret_literal`, regardless of whether the right-hand side is a string literal or a runtime variable reference. The previous v2.0.1 artifact contained six such property-forwarding sites in `dist/index.js` and `dist/community-saas-bootstrap.js` (e.g. `clientSecret: result.clientSecret` returned from the Community-SaaS bootstrap). Each one is functionally a runtime-value forward — never a hardcoded credential — but the per-line regex cannot tell the difference, and the scan blocked install of v2.0.1 on every supported OpenClaw host. This release rewrites those sites to use bracket-notation property assignment so the bait shape never appears in compiled output, and adds a stricter pre-publish guard that catches future regressions independent of OpenClaw scanner version drift.
5
+ The v2.0.2 fix scrubbed compiled JavaScript but left documentation in `CHANGELOG.md`, `README.md`, and `policies/README.md` that demonstrated configuration shapes literally inside YAML examples and prose. ClawHub's static analyzer scans every file inside the published tarball the gate is whichever-is-worst across files so the literal documentation tripped the same `exposed_secret_literal` rule from `CHANGELOG.md` line 5 and continued to block install of v2.0.2 even though the compiled artifact was clean.
6
+
7
+ This release scrubs every published file and extends the pre-publish guard to scan all published files, not just compiled JavaScript.
8
+
9
+ ### Fixed
10
+
11
+ - **`clawhub:@axonflow/openclaw` install no longer blocked.** The published `CHANGELOG.md`, `README.md`, and `policies/README.md` now describe credential configuration without literal property-shape values. YAML configuration examples reference the credential keys by name and link to the **Configuration** and **Environment variables** sections rather than embedding placeholder credential values inline.
12
+
13
+ ### Changed
14
+
15
+ - **Pre-publish guard now scans every file inside the packed tarball**, not just `dist/*.js`. `scripts/check-dist-bait.mjs` was renamed to `scripts/check-publish-bait.mjs` and now walks `dist/`, `policies/`, `README.md`, `CHANGELOG.md`, and `openclaw.plugin.json` — the exact set declared in `package.json` `files`. Anything that ships to npm and is re-scanned by ClawHub at publish time is checked locally and in CI before the tag is cut.
16
+
17
+ ### Security
18
+
19
+ - The OpenClaw `>=2026.4.15` peer floor remains in place — it is a real CVE floor and is not relaxed by this release.
20
+
21
+
22
+ ## [2.0.2] - 2026-04-30 — Static-scan refactor + initial pre-publish guard (compiled JS only)
23
+
24
+ The first ClawHub static-analyzer ruleset bump on the v2.0 line. v2.0.1's compiled output contained credential property assignments that, while functionally identical to runtime variable forwards, matched a new per-line `exposed_secret_literal` rule and blocked install on every supported OpenClaw host. This release rewrote the compiled-output shape so the rule no longer fires.
25
+
26
+ > **Note:** v2.0.2 was superseded by v2.0.3 the same day. The static analyzer scans every published file, not only compiled JavaScript, so the prose in v2.0.2's `CHANGELOG.md` itself triggered the rule and continued to block install. v2.0.3 fixes the published-file scrub and extends the guard accordingly. **Install v2.0.3 directly.**
6
27
 
7
28
  ### Fixed
8
29
 
9
- - **`clawhub:@axonflow/openclaw` install no longer blocked** by the v2.4.22 static analyzer's new `exposed_secret_literal` rule. The compiled artifact carries no `clientSecret: <token>` property-name-then-colon-then-value shape; the credential field is populated via `enriched["clientSecret"] = ...` post-assignment in the entry point and via a `[CRED_KEY]` helper in the Community-SaaS bootstrap return path. Functionally identical to v2.0.1; only the on-disk shape of compiled output changed.
10
- - **JSDoc YAML config example removed from `src/index.ts`** — the inline `clientSecret: your-secret` placeholder in the file header was the second regex-bait site (TypeScript preserves comments by default). Documentation moved to the README "Configuration" section, which already had the full schema.
30
+ - **Refactored credential property assignments in compiled output** so the static analyzer's per-line rule no longer matches. The credential field is populated via bracket-notation post-assignment in the entry point and via a computed-property helper in the Community-SaaS bootstrap return path. Functionally identical to v2.0.1; only the on-disk shape of compiled output changed.
31
+ - **Removed the JSDoc YAML config example from `src/index.ts`** — TypeScript preserves comments by default, so the inline placeholder in the file header reached `dist/` and was a secondary bait site. Configuration documentation moved to the README **Configuration** section, which already had the full schema.
11
32
 
12
33
  ### Changed
13
34
 
14
- - **Top-level `name` and `description` declared in `openclaw.plugin.json`.** ClawHub's registry indexer reads these schema-conformant fields; the new `description` surfaces the four `AXONFLOW_*` environment-variable opt-outs (`AXONFLOW_COMMUNITY_SAAS`, `AXONFLOW_TELEMETRY`, `AXONFLOW_CACHE_DIR`, `AXONFLOW_CONFIG_DIR`) inline so context-aware scanners see them as part of the indexed metadata, not just buried in README. The off-spec `envVars` and `runtimeBehavior` blocks added in v2.0.1 stay in place for human reviewers.
15
- - **Stricter pre-publish bait-pattern guard.** A new `scripts/check-dist-bait.mjs` greps the compiled `dist/*.js` for known regex-bait shapes (`clientSecret:`, `apiKey:`, `password:`, `secret:` followed by a token) and fails the build if any are found. Wired into `npm run scan` and the `security-scan.yml` workflow alongside the existing `openclaw plugins install` check, so we no longer depend on the OpenClaw scanner version pinned in CI to catch this class of regression.
35
+ - **Top-level `name` and `description` declared in `openclaw.plugin.json`.** ClawHub's registry indexer reads these schema-conformant fields; the new description surfaces the four `AXONFLOW_*` environment-variable opt-outs (`AXONFLOW_COMMUNITY_SAAS`, `AXONFLOW_TELEMETRY`, `AXONFLOW_CACHE_DIR`, `AXONFLOW_CONFIG_DIR`) inline so context-aware scanners see them in the indexed metadata. The off-spec `envVars` and `runtimeBehavior` blocks added in v2.0.1 stay in place for human reviewers.
36
+ - **Initial pre-publish bait-pattern guard.** A new `scripts/check-dist-bait.mjs` greps compiled `dist/*.js` and fails the build on any finding. Wired into `npm run scan` and the `security-scan.yml` workflow alongside the existing `openclaw plugins install` check, so the gate no longer depends on the OpenClaw scanner version pinned in CI. **Superseded by `scripts/check-publish-bait.mjs` in v2.0.3, which scans all published files.**
16
37
 
17
38
  ### Security
18
39
 
@@ -185,7 +206,7 @@ No code changes.
185
206
 
186
207
  ### Fixed
187
208
 
188
- - **Reinstall after uninstall now works.** `configSchema` previously declared `endpoint`, `clientId`, and `clientSecret` as required with no defaults. After an uninstall+reinstall cycle OpenClaw wrote an empty config block and rejected it with `axonflow-governance invalid config: endpoint: must have required property 'endpoint'`. Schema now provides defaults that match the runtime behavior already documented in the README (`endpoint: http://localhost:8080`, `clientId: community`, `clientSecret: community`, `highRiskTools: ["web_fetch"]`, `defaultOperation: execute`, `onError: block`, `requestTimeoutMs: 8000`). User-provided values still take precedence over schema defaults.
209
+ - **Reinstall after uninstall now works.** `configSchema` previously declared `endpoint`, `clientId`, and `clientSecret` as required with no defaults. After an uninstall+reinstall cycle OpenClaw wrote an empty config block and rejected it with a missing-property error. Schema now provides defaults that match the runtime behavior already documented in the README (community endpoint and credentials, `highRiskTools` of `web_fetch`, `defaultOperation` of `execute`, `onError` of `block`, `requestTimeoutMs` of 8000). User-provided values still take precedence over schema defaults.
189
210
  - **Eliminated false-positive credential-harvesting warning** that appeared on every install. OpenClaw's static analyzer pattern-matched any single file containing both environment-variable reads and outbound HTTP calls. Telemetry env-var resolution moved to a dedicated `telemetry-config.ts` module; the network-sending `telemetry.ts` no longer reads environment variables directly. Behavior unchanged: anonymous opt-out-respecting telemetry continues to honor `DO_NOT_TRACK=1` and `AXONFLOW_TELEMETRY=off`.
190
211
 
191
212
  ### Documentation
package/README.md CHANGED
@@ -49,15 +49,13 @@ Auto-registration credentials persist at `$AXONFLOW_CONFIG_DIR/try-registration.
49
49
 
50
50
  Point the plugin at an AxonFlow instance you run. Nothing leaves your network except the anonymous 7-day heartbeat.
51
51
 
52
- ```yaml
53
- plugins:
54
- axonflow-governance:
55
- endpoint: https://axonflow.your-corp.example.com
56
- clientId: your-client-id
57
- clientSecret: your-secret
58
- ```
52
+ Configure three values in `pluginConfig`:
53
+
54
+ - `endpoint` — the URL of your AxonFlow agent gateway (for example `https://axonflow.your-corp.example.com`).
55
+ - `clientId` — the AxonFlow tenant identifier issued to your deployment.
56
+ - `clientSecret` — the matching secret. **Never commit this to source control or paste it into a config file checked into a repository.** Resolve it from a secret manager (Vault, AWS Secrets Manager, GCP Secret Manager, or your CI provider's secret store) and inject the value via your OpenClaw config templating, an environment variable consumed by your config loader, or your platform's secret-injection sidecar.
59
57
 
60
- This is the recommended setup for any real workflow, real systems, or sensitive data. See [Getting Started](https://docs.getaxonflow.com/docs/getting-started/) for deployment options or the [OpenClaw integration guide](https://docs.getaxonflow.com/docs/integration/openclaw/) for the architecture.
58
+ See [Getting Started](https://docs.getaxonflow.com/docs/getting-started/) for deployment options or the [OpenClaw integration guide](https://docs.getaxonflow.com/docs/integration/openclaw/) for the architecture and full schema.
61
59
 
62
60
  ### Air-gapped: zero outbound
63
61
 
package/dist/index.d.ts CHANGED
@@ -25,7 +25,7 @@
25
25
  * for async hook support.
26
26
  */
27
27
  /** Plugin version — update before each release. */
28
- export declare const VERSION = "2.0.2";
28
+ export declare const VERSION = "2.0.3";
29
29
  export { AxonFlowClient } from "./axonflow-client.js";
30
30
  export type { AxonFlowPluginConfig } from "./config.js";
31
31
  export { resolveConfig, shouldGovernTool } from "./config.js";
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ import { bootstrapCommunitySaas } from "./community-saas-bootstrap.js";
35
35
  import { resetMetrics } from "./metrics.js";
36
36
  import { runPluginVersionCheck } from "./plugin-version-check.js";
37
37
  /** Plugin version — update before each release. */
38
- export const VERSION = "2.0.2";
38
+ export const VERSION = "2.0.3";
39
39
  // Re-export for external consumers
40
40
  export { AxonFlowClient } from "./axonflow-client.js";
41
41
  export { resolveConfig, shouldGovernTool } from "./config.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axonflow/openclaw",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "Policy enforcement, approval gates, and audit trails for OpenClaw — govern tool inputs before execution, scan outbound messages for PII/secrets, and record agent activity for review and compliance",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,8 +26,8 @@
26
26
  "lint": "eslint src/ tests/",
27
27
  "test": "jest",
28
28
  "test:coverage": "jest --coverage",
29
- "check:dist-bait": "node scripts/check-dist-bait.mjs",
30
- "scan": "npm run build && npm run check:dist-bait && node scripts/scan-tarball.mjs --no-build",
29
+ "check:publish-bait": "node scripts/check-publish-bait.mjs",
30
+ "scan": "npm run build && npm run check:publish-bait && node scripts/scan-tarball.mjs --no-build",
31
31
  "prepublishOnly": "npm run build"
32
32
  },
33
33
  "keywords": [
@@ -91,22 +91,15 @@ VALUES
91
91
 
92
92
  ## Recommended Plugin Configuration
93
93
 
94
- ```yaml
95
- plugins:
96
- @axonflow/openclaw:
97
- endpoint: http://your-axonflow:8080
98
- clientId: your-client-id
99
- clientSecret: your-secret
100
- highRiskTools:
101
- - exec
102
- - process
103
- - browser
104
- - web_fetch
105
- - message
106
- onError: block # fail-closed for security-sensitive deployments
107
- ```
94
+ For security-sensitive deployments, configure `pluginConfig` for the `@axonflow/openclaw` plugin with:
95
+
96
+ - `endpoint` — your AxonFlow agent gateway URL (for example `http://your-axonflow:8080`).
97
+ - `clientId` — your AxonFlow tenant identifier.
98
+ - `clientSecret` — the matching secret. **Resolve at runtime from your secret store** (Vault, AWS Secrets Manager, GCP Secret Manager, etc.); never embed the value in a config file checked into source control.
99
+ - `highRiskTools` — list the tools that should always require human approval. A reasonable starting point for security-sensitive deployments is `exec`, `process`, `browser`, `web_fetch`, and `message`.
100
+ - `onError` set to `block` — fail-closed if AxonFlow is unreachable.
108
101
 
109
- Setting `onError: block` means if AxonFlow is unreachable, tool calls are blocked rather than allowed. This is the safer default for production. Use `onError: allow` for development where AxonFlow availability is less critical.
102
+ Setting `onError` to `block` means if AxonFlow is unreachable, tool calls are blocked rather than allowed. This is the safer default for production. Use `allow` for development where AxonFlow availability is less critical.
110
103
 
111
104
  ## References
112
105