跳到主要内容
知仓学习社ZHICANG

add-clidash

Add clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ship…

读凭据改身份文件执行命令读文件联网写文件严重 9 · 高危 13nanocoai/nanoclaw

它会碰到什么

扫了多少26 个文本文件,124 KB
它会碰到什么读凭据改身份文件执行命令读文件联网写文件
命中总数101 处
命中统计严重 9 · 高 13 · 中 75 · 低 2

这个仓库里自带 2 个测试样本文件(有些技能仓会放故意的恶意样本做演示),它们不计入上面的能力与命中。

逐条看命中(22 条严重或高危)
  • 严重 add/tools/clidash/clidash.config.example.json:78cred-paths
    "deny": ["node_modules", ".env", "*token*", "*secret*", "*.pem", "*.key", "*.lock", "pnpm-lock.yaml"],
  • 严重 add/tools/clidash/test/docs-server.test.js:20cred-paths
    w('groups/alpha/.env', 'SECRET=nope');
  • 严重 add/tools/clidash/test/docs-server.test.js:32cred-paths
    deny: ['node_modules', '.env', '*token*', '*secret*', '*.pem', '*.key'],
  • 严重 add/tools/clidash/test/docs-server.test.js:80cred-paths
    // .env is excluded by the deny-list and not in any collection pattern
  • 严重 add/tools/clidash/test/docs-server.test.js:84cred-paths
    const res = await fetch(`${base2}/api/doc?c=all&p=${encodeURIComponent('groups/alpha/.env')}`);
  • 严重 add/tools/clidash/test/docs.test.js:35cred-paths
    const DENY = ['node_modules', '.env', '*token*', '*secret*', '*.pem', '*.key'];
  • 严重 add/tools/clidash/test/docs.test.js:62cred-paths
    assert.ok(!files.some((f) => f.endsWith('.env')));
  • 严重 add/tools/clidash/test/docs.test.js:101cred-paths
    assert.throws(() => resolveDoc(root, SKILLS, 'groups/alpha/skills/../../../.env', DENY), /not allowed/i);
  • 严重 add/tools/clidash/test/docs.test.js:110cred-paths
    assert.throws(() => resolveDoc(root, coll, 'groups/alpha/.env', DENY), /not allowed/i);
  • add/tools/clidash/clidash.config.example.json:88identity-write
    "label": "CLAUDE.md",
  • add/tools/clidash/clidash.config.example.json:90identity-write
    "patterns": ["groups/*/CLAUDE.md", "groups/*/CLAUDE.local.md"]
  • add/tools/clidash/docs.js:3identity-write
    // Surfaces on-disk documents (skills, CLAUDE.md, profile.json, conversations)
  • add/tools/clidash/public/md.js:2identity-write
    // (SKILL.md / CLAUDE.md). Pure string functions, no DOM — importable in both the
  • add/tools/clidash/server.js:11exec-spawn
    import { execFile } from 'node:child_process';
  • add/tools/clidash/server.js:369identity-write
    // Read-only file viewer (skills, CLAUDE.md, profiles, conversations).
  • add/tools/clidash/server.js:428cred-envread
    const configPath = process.env.CLIDASH_CONFIG ?? join(MODULE_DIR, 'clidash.config.json');
  • add/tools/clidash/server.js:430cred-envread
    if (process.env.PORT) config.port = Number(process.env.PORT);
  • add/tools/clidash/server.js:430cred-envread
    if (process.env.PORT) config.port = Number(process.env.PORT);
  • add/tools/clidash/server.js:431cred-envread
    if (process.env.BIND) config.bind = process.env.BIND;
  • add/tools/clidash/server.js:431cred-envread
    if (process.env.BIND) config.bind = process.env.BIND;
  • add/tools/clidash/test/docs.test.js:19identity-write
    w('groups/alpha/CLAUDE.md', '# Alpha');
  • add/tools/clidash/test/docs.test.js:56identity-write
    assert.deepEqual(files, ['groups/alpha/CLAUDE.local.md', 'groups/alpha/CLAUDE.md']);

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

/add-clidash — CLI-derived read-only dashboard

clidash is a small, read-only web dashboard. You point it at any CLI that can

list resources as JSON (NanoClaw's ncl, docker, kubectl, …) and it builds

the dashboard at runtime: one tab per resource, a generic table over whatever

columns the rows have. A new ncl resource becomes a new tab and a new column

becomes a new table column with zero code changes.

It ships pre-wired for NanoClaw's ncl CLI and adds three NanoClaw-aware

panels driven entirely by config:

  • Agents overview — status cards joining groups + sessions + messaging

groups + wirings (green <15m / amber <2h / red older).

  • Activity — per-session inbound/outbound message totals and a daily series,

read directly from the session DBs (ncl has no messages resource).

  • Logs — last N lines of allowlisted host log files.
  • Files — a read-only viewer for group skills, CLAUDE.md, and profiles.

Why it's safe

clidash is read-only by construction: the server can only execFile the

argv templates in its config. {resource} is the sole substitution and is

allowlist-validated against the discovered/static resource set before exec —

never a shell, no free-form input reaches argv. There is no auth; **the network

is the auth boundary** — it binds 127.0.0.1 by default. Only ever bind a

private interface (e.g. a tailnet IP), never a public one.

It's distinct from /add-dashboard (which pushes JSON snapshots to a separate

@nanoco/nanoclaw-dashboard npm package): clidash has zero dependencies, no

build step, no push pipeline, and no edits to NanoClaw source — it just reads

ncl and the session DBs.

Steps

1. Copy the tool into place

clidash is fully self-contained — copy the whole directory in:

tools/ is not a standard NanoClaw directory and cp -R won't create it, so

make it first:

mkdir -p tools
cp -R .claude/skills/add-clidash/add/tools/clidash tools/clidash

That is the only file change this skill makes. Nothing in NanoClaw src/ is

touched, no dependency is added.

2. Create the config

The example config is pre-wired for NanoClaw with paths relative to the repo

root, so it works as-is when you run clidash from tools/clidash/:

cd tools/clidash
cp clidash.config.example.json clidash.config.json

clidash.config.json is your local config — add it to .gitignore if you

don't want to commit install-specific paths:

echo 'tools/clidash/clidash.config.json' >> ../../.gitignore

The example assumes ncl is built at bin/ncl. If bin/ncl doesn't exist,

build it first (pnpm run build) or point clis.ncl.bin at the right path.

3. Test

Tests use a stub CLI — no real ncl or docker needed:

npm test

All tests should pass (Node ≥ 22.5, node:test, zero dependencies).

4. Run and verify

node server.js          # serves http://127.0.0.1:4690

In another shell, confirm it's live and that ncl discovery worked:

curl -s http://127.0.0.1:4690/api/clis | head -c 400      # CLIs + discovered resources
curl -s http://127.0.0.1:4690/api/r/ncl/groups | head -c 400   # a real resource table

Then open http://127.0.0.1:4690/ in a browser. You should see the Agents

overview plus a tab per ncl resource.

5. (Optional) Run as a service

clidash binds 127.0.0.1 by default. To reach it from other devices, bind a

private (e.g. tailnet) IP via the BIND env var or bind in config — never a

public interface.

# ~/.config/systemd/user/clidash.service   (Linux)
[Unit]
Description=clidash read-only CLI dashboard

[Service]
WorkingDirectory=%h/nanoclaw/tools/clidash
ExecStart=/usr/bin/node %h/nanoclaw/tools/clidash/server.js
Environment=BIND=127.0.0.1
Restart=on-failure

[Install]
WantedBy=default.target
systemctl --user enable --now clidash

On macOS, wrap node server.js (with WorkingDirectory = tools/clidash) in a

launchd plist the same way the main NanoClaw service is configured.

Configuration reference

clidash.config.json keys (see tools/clidash/README.md and

clidash.config.example.json for the full shape):

| Key | Purpose |

|-----|---------|

| port, bind, refreshSeconds | server bind + UI auto-refresh cadence |

| clis.<name>.bin / cwd / env | how to invoke the CLI (bin is relative to cwd) |

| clis.<name>.discover or resources | runtime discovery (ncl help) vs a static resource list |

| clis.<name>.list | argv template; {resource} is the only substitution |

| clis.<name>.output | json or jsonlines (docker/kubectl style) |

| clis.<name>.unwrap | dot-path into a response envelope (e.g. data) |

| clis.<name>.enrich/badges/summary | table decorations (ID→name joins, status colors, summary cards) |

| activity | sessionsRoot + days for the message-activity charts |

| logs | dir, tailLines, and an allowlist of files to tail |

| docs | file viewer: root, a deny glob list, and collections of glob patterns |

Adding a second CLI is config-only — e.g. docker is included as a jsonlines

example. View plugins (views/<cli>-<view>.js) are the only per-CLI code and

are optional.

Troubleshooting

  • ENOENT / config not found — run from tools/clidash/ and make sure you

copied clidash.config.example.json to clidash.config.json (step 2), or set

CLIDASH_CONFIG=/abs/path.json.

  • No ncl resources / discovery emptybin/ncl isn't built or the path

is wrong. Build it (pnpm run build) or fix clis.ncl.bin.

  • docker tab errors — the docker daemon isn't running, or remove the

docker CLI from config if you don't need it.

  • Can't reach it from another device — it binds 127.0.0.1; set

BIND=<private-ip> (tailnet), never a public interface.

  • Empty Activity/Logs/Files — check that activity.sessionsRoot,

logs.dir, and docs.root resolve to your NanoClaw root (relative to where

you launch node server.js).

Removal

See [REMOVE.md](REMOVE.md).

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。

它属于哪个仓库

星标★ 30,781
本站分层T1
该仓技能数61
原文件路径.claude/skills/add-clidash/SKILL.md

同一个仓库里的其他技能

看这个仓库的全部 61 个技能