vps-hybrid-networking 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,7 +19,7 @@ The skill lives in [`skills/vps-hybrid-networking/`](skills/vps-hybrid-networkin
19
19
  npx skills add AnandaAp/vps-hybrid-networking
20
20
  ```
21
21
 
22
- The [skills CLI](https://skills.sh) auto-detects 75+ agents (Claude Code, Codex, Cursor, OpenCode, Gemini CLI, Antigravity, Windsurf, …) and installs the skill into the right folder for each. Add `-g` for a global install, or `--agent <name>` to target one agent.
22
+ The [skills CLI](https://skills.sh) auto-detects 75+ agents (Claude Code, Codex, Cursor, OpenCode, Gemini CLI, Antigravity, Hermes Agent, Windsurf, Cline, …) and installs the skill into the right folder for each. Add `-g` for a global install, or `--agent <name>` to target one agent.
23
23
 
24
24
  ### Claude Code — plugin marketplace
25
25
 
@@ -57,17 +57,29 @@ Or as an extension (bundles the same skill):
57
57
  gemini extensions install https://github.com/AnandaAp/vps-hybrid-networking
58
58
  ```
59
59
 
60
+ ### Hermes Agent (Nous Research)
61
+
62
+ Hermes installs skills straight from GitHub — the identifier is the repo-relative path to the skill folder:
63
+
64
+ ```bash
65
+ hermes skills install AnandaAp/vps-hybrid-networking/skills/vps-hybrid-networking
66
+ ```
67
+
68
+ Hermes security-scans skills on install. You can also register this repo as a reusable source once with `hermes skills tap add AnandaAp/vps-hybrid-networking`.
69
+
70
+ > **Note on the Hermes security scan:** this skill is a root-level server-administration runbook, so Hermes' pattern scanner flags its subject matter (`sudo`, systemd units, files under `/etc`, network tunnels) and hub installs are currently blocked with a "dangerous" verdict. The flagged operations are the setup itself, run on your own server with your own tokens — but review the findings before trusting any skill, including this one. If you have reviewed it and want it anyway, install manually: copy `skills/vps-hybrid-networking/` into your Hermes skills folder (`%LOCALAPPDATA%\hermes\skills\` on Windows, `~/.hermes/skills\` elsewhere) and restart Hermes.
71
+
60
72
  ### npm / npx installer (this repo's own package)
61
73
 
62
74
  ```bash
63
- npx vps-hybrid-networking@1.0.0
75
+ npx vps-hybrid-networking@1.0.2
64
76
  ```
65
77
 
66
- Auto-detects your installed agents and copies the skill into each one's skills folder. Useful flags: `--all`, `--agent claude-code,antigravity`, `--list`, `--dry-run`. (If the npm package is not yet published, clone this repo and run `node bin/install.mjs --all` — it is the same code with the same result.)
78
+ Auto-detects your installed agents and copies the skill into each one's skills folder. Targets: Claude Code, Antigravity, Codex / agents standard, Gemini CLI, OpenCode, Cursor, Hermes Agent, Cline, Roo Code, Goose, Amp, Windsurf, Kiro CLI, Qwen Code, GitHub Copilot, Trae, and Continue. Useful flags: `--all`, `--agent claude-code,antigravity`, `--list`, `--dry-run`. (If the npm package is not yet published, clone this repo and run `node bin/install.mjs --all` — it is the same code with the same result.)
67
79
 
68
80
  ### Manual
69
81
 
70
- Copy the `skills/vps-hybrid-networking/` folder into your agent's skills directory (e.g. `~/.claude/skills/`, `~/.agents/skills/`, `~/.gemini/config/skills/`). Done — the skill is just files.
82
+ Copy the `skills/vps-hybrid-networking/` folder into your agent's skills directory (e.g. `~/.claude/skills/`, `~/.agents/skills/`, `~/.gemini/config/skills/`, `~/.hermes/skills/` — on Windows, Hermes uses `%LOCALAPPDATA%\hermes\skills\`). Done — the skill is just files.
71
83
 
72
84
  ## Installer security
73
85
 
@@ -76,7 +88,7 @@ The npm installer is built to be boring and auditable:
76
88
  - **Zero dependencies** — Node.js standard library only; there is no dependency tree to compromise.
77
89
  - **No install hooks** — `package.json` defines no lifecycle scripts, so nothing runs implicitly on `npm install`/`npx`. The installer runs only when you invoke it.
78
90
  - **No network, no execution** — the installer never downloads anything and never spawns a process. It only copies the skill files bundled inside the package into a fixed allow-list of well-known agent folders, and it verifies every destination stays inside its allow-listed folder before copying.
79
- - **Pin the version** (`npx vps-hybrid-networking@1.0.0`) if you want reproducible installs, and read [`bin/install.mjs`](bin/install.mjs) — it is short on purpose.
91
+ - **Pin the version** (`npx vps-hybrid-networking@1.0.2`) if you want reproducible installs, and read [`bin/install.mjs`](bin/install.mjs) — it is short on purpose.
80
92
  - Prefer not to run third-party installers at all? Use `npx skills add` (which pulls straight from GitHub) or the manual copy above.
81
93
 
82
94
  ## What's inside
@@ -113,6 +125,7 @@ skills/vps-hybrid-networking/ the skill itself (SKILL.md + scripts/)
113
125
  .agents/plugins/ Codex marketplace catalog
114
126
  plugin.json Agent Plugins standard manifest (Codex/Cursor portable layout)
115
127
  gemini-extension.json Gemini CLI extension manifest
128
+ assets/logo.jpg plugin logo (Antigravity Marketplace)
116
129
  package.json + bin/install.mjs the zero-dependency npm/npx installer
117
130
  ```
118
131
 
package/bin/install.mjs CHANGED
@@ -42,6 +42,12 @@ if (!existsSync(join(source, 'SKILL.md'))) {
42
42
  }
43
43
 
44
44
  const home = homedir();
45
+ // Hermes Agent keeps its home in ~/.hermes on POSIX, but a native Windows
46
+ // install lives in %LOCALAPPDATA%\hermes — resolve per platform.
47
+ const hermesHome = process.platform === 'win32'
48
+ ? join(process.env.LOCALAPPDATA ?? join(home, 'AppData', 'Local'), 'hermes')
49
+ : join(home, '.hermes');
50
+
45
51
  const TARGETS = {
46
52
  'claude-code': { label: 'Claude Code', skillsDir: join(home, '.claude', 'skills'), detectDir: join(home, '.claude') },
47
53
  'antigravity': { label: 'Antigravity', skillsDir: join(home, '.gemini', 'config', 'skills'), detectDir: join(home, '.gemini') },
@@ -49,6 +55,17 @@ const TARGETS = {
49
55
  'gemini-cli': { label: 'Gemini CLI', skillsDir: join(home, '.gemini', 'skills'), detectDir: join(home, '.gemini') },
50
56
  'opencode': { label: 'OpenCode', skillsDir: join(home, '.config', 'opencode', 'skills'), detectDir: join(home, '.config', 'opencode') },
51
57
  'cursor': { label: 'Cursor', skillsDir: join(home, '.cursor', 'skills'), detectDir: join(home, '.cursor') },
58
+ 'hermes': { label: 'Hermes Agent', skillsDir: join(hermesHome, 'skills'), detectDir: hermesHome },
59
+ 'cline': { label: 'Cline', skillsDir: join(home, '.agents', 'skills'), detectDir: join(home, '.cline') },
60
+ 'roo': { label: 'Roo Code', skillsDir: join(home, '.roo', 'skills'), detectDir: join(home, '.roo') },
61
+ 'goose': { label: 'Goose', skillsDir: join(home, '.config', 'goose', 'skills'), detectDir: join(home, '.config', 'goose') },
62
+ 'amp': { label: 'Amp', skillsDir: join(home, '.config', 'agents', 'skills'), detectDir: join(home, '.config', 'amp') },
63
+ 'windsurf': { label: 'Windsurf', skillsDir: join(home, '.codeium', 'windsurf', 'skills'), detectDir: join(home, '.codeium') },
64
+ 'kiro-cli': { label: 'Kiro CLI', skillsDir: join(home, '.kiro', 'skills'), detectDir: join(home, '.kiro') },
65
+ 'qwen-code': { label: 'Qwen Code', skillsDir: join(home, '.qwen', 'skills'), detectDir: join(home, '.qwen') },
66
+ 'github-copilot': { label: 'GitHub Copilot', skillsDir: join(home, '.copilot', 'skills'), detectDir: join(home, '.copilot') },
67
+ 'trae': { label: 'Trae', skillsDir: join(home, '.trae', 'skills'), detectDir: join(home, '.trae') },
68
+ 'continue': { label: 'Continue', skillsDir: join(home, '.continue', 'skills'), detectDir: join(home, '.continue') },
52
69
  };
53
70
 
54
71
  function parseArgs(argv) {
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"Ananda Apriliansyah Cahya Utama","bin":{"vps-hybrid-networking":"bin/install.mjs"},"description":"Installer for the vps-hybrid-networking agent skill — serves a NAT-blocked VPS via Tailscale + Cloudflare Tunnel + Caddy (DNS-01). Zero dependencies, no install hooks, no network access.","engines":{"node":">=18"},"files":["bin/install.mjs","skills","README.md","LICENSE"],"homepage":"https://github.com/AnandaAp/vps-hybrid-networking#readme","keywords":["agent-skill","claude-code","antigravity","codex","gemini-cli","opencode","cursor","vps","caddy","cloudflare-tunnel","tailscale"],"license":"MIT","name":"vps-hybrid-networking","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/AnandaAp/vps-hybrid-networking.git"},"type":"module","version":"1.0.0"}
1
+ {"author":"Ananda Apriliansyah Cahya Utama","bin":{"vps-hybrid-networking":"bin/install.mjs"},"description":"Installer for the vps-hybrid-networking agent skill \u2014 serves a NAT-blocked VPS via Tailscale + Cloudflare Tunnel + Caddy (DNS-01). Zero dependencies, no install hooks, no network access.","engines":{"node":">=18"},"files":["bin/install.mjs","skills","README.md","LICENSE"],"homepage":"https://github.com/AnandaAp/vps-hybrid-networking#readme","keywords":["agent-skill","claude-code","antigravity","codex","gemini-cli","opencode","cursor","hermes-agent","cline","roo-code","goose","amp","windsurf","kiro-cli","qwen-code","github-copilot","trae","continue","vps","caddy","cloudflare-tunnel","tailscale"],"license":"MIT","name":"vps-hybrid-networking","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/AnandaAp/vps-hybrid-networking.git"},"type":"module","version":"1.0.2"}
@@ -152,8 +152,12 @@ sudo killall python3
152
152
  ### Stage 2: Private Network Setup via Tailscale
153
153
 
154
154
  ```bash
155
- # 1. Install official Tailscale package
156
- curl -fsSL https://tailscale.com/install.sh | sh
155
+ # 1. Install Tailscale from its official apt repository (no pipe-to-shell installer).
156
+ # Replace <distro> with ubuntu or debian and <codename> with your
157
+ # release codename (e.g. noble for Ubuntu 24.04, bookworm for Debian 12).
158
+ curl -fsSL https://pkgs.tailscale.com/stable/<distro>/<codename>.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
159
+ curl -fsSL https://pkgs.tailscale.com/stable/<distro>/<codename>.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
160
+ sudo apt-get update && sudo apt-get install -y tailscale
157
161
 
158
162
  # 2. Connect machine to your Tailnet
159
163
  sudo tailscale up --hostname=my-vps --accept-routes
@@ -282,13 +286,13 @@ sudo apt-get update && sudo apt-get install -y cloudflared
282
286
 
283
287
  # 2. Store the tunnel token in a protected file
284
288
  sudo mkdir -p /etc/cloudflared
285
- sudo bash -c 'cat << "EOF" > /etc/cloudflared/token
289
+ sudo tee /etc/cloudflared/token > /dev/null <<'EOF'
286
290
  <YOUR_CLOUDFLARE_TUNNEL_TOKEN>
287
- EOF'
291
+ EOF
288
292
  sudo chmod 600 /etc/cloudflared/token
289
293
 
290
294
  # 3. Create Systemd Service File: /etc/systemd/system/cloudflared.service
291
- sudo bash -c 'cat << "EOF" > /etc/systemd/system/cloudflared.service
295
+ sudo tee /etc/systemd/system/cloudflared.service > /dev/null <<'EOF'
292
296
  [Unit]
293
297
  Description=Cloudflare Tunnel client
294
298
  After=network-online.target
@@ -303,7 +307,7 @@ RestartSec=5s
303
307
 
304
308
  [Install]
305
309
  WantedBy=multi-user.target
306
- EOF'
310
+ EOF
307
311
 
308
312
  # 4. Reload systemd and start the tunnel daemon
309
313
  sudo systemctl daemon-reload