Feishu Doc Writer
hyperlist/feishu-multi-agent
Feishu document writing skill. An agent skill from hyperlist/feishu-multi-agent.
Installs the `dial` CLI and a credential in NanoClaw agent containers so chosen agents can send SMS, place AI voice calls and receive verification codes.
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nanocoai/nanoclaw add-dial-tool --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-dial-tool .claude/skills/add-dial-tool && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .claude/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-toolType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nanocoai/nanoclaw add-dial-tool --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-dial-tool .agents/skills/add-dial-tool && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .agents/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nanocoai/nanoclaw add-dial-tool --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-dial-tool .cursor/skills/add-dial-tool && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .cursor/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/nanocoai/nanoclaw.git --path .claude/skills/add-dial-tool--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nanocoai/nanoclaw add-dial-tool --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-dial-tool .gemini/skills/add-dial-tool && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .gemini/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install nanocoai/nanoclaw add-dial-toolInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-dial-tool .github/skills/add-dial-tool && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .github/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add nanocoai/nanoclaw --skill add-dial-tool -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nanocoai/nanoclaw add-dial-tool --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nanocoai/nanoclaw.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-dial-tool .opencode/skills/add-dial-tool && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-dial-tool" agent skill from https://github.com/nanocoai/nanoclaw/tree/main/.claude/skills/add-dial-tool into .opencode/skills/add-dial-tool/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-dial-tool", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-dial-toolInstalls the `dial` CLI and a credential in NanoClaw agent containers so chosen agents can send SMS, place AI voice calls and receive verification codes.
A NanoClaw setup skill that adds Dial as a container tool. The `dial` CLI goes on the agent's PATH, a `dial-cli` skill teaches the agent to use it, and an OneCLI credential for api.getdial.ai is injected without putting the key in an environment variable. It is separate from the Dial messaging channel set up by `/add-dial`, can be installed alone, and is safe to re-run when you want to change which agents may use it.
An agent with Dial access can text and call any number and buy more numbers on the Dial account, so the key is granted per agent and every other agent gets a OneCLI block rule that returns `403 blocked_by_policy`. The skill must be run from the NanoClaw repo on the host, not from an agent chat. Pre-flight checks need the `onecli` CLI and stop if the OneCLI gateway is version 1.42 or later, because legacy rule writes are rejected there.
Read from SKILL.md and the folder at commit 66f0823. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
getdial.aiFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Dial Tool loads about 4.4k tokens when it runs. Until then it costs about 129 tokens; SKILL.md has 1,567 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from nanocoai/nanoclaw at commit 66f0823, republished under its MIT licence (© nanocoai). 1,567 words, ~4,442 tokens.
.claude/skills/add-dial-tool/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Installs Dial as a container tool: the dial CLI on the agent's PATH, the
dial-cli skill so the agent knows how to drive it, and an OneCLI credential so
in-container calls are injected keyless. Independent of the Dial channel
(/add-dial) — install this alone. Idempotent: re-run it to change which agents
may use Dial.
This tool spends money and reaches real people. An agent with Dial access can
text and call any number and buy more numbers, billed to the Dial account. The
CLI and the skill file land in every agent's container, but the key is
injected per agent by OneCLI, so the operator chooses which agents get it. Every
other agent gets an OneCLI block rule and sees 403 blocked_by_policy if it
tries.
Run this from the NanoClaw repo on the host (not from a chat with an agent — the
container can't install itself). The mechanical steps carry nc: directive
fences: an agent reads the prose and applies them, and a parser can apply them
deterministically from the same document. Every directive is idempotent, so the
whole skill is safe to re-run; anything a parser can't apply falls back to the
prose beside it.
OneCLI is required for credential injection — without it there is no way to hand the key to a container without putting it in an env var. This must succeed before anything else runs:
command -v onecli >/dev/nullIf it fails, tell the user to run /init-onecli first, then retry. Stop here.
This skill scopes Dial with legacy OneCLI block rules. OneCLI gateway 1.42 and
later reject legacy rule writes (410), and that includes 1.42.0, the version
NanoClaw pins. Writing the Dial key first and then failing on the rules would
leave every all-mode agent able to use Dial. So read the version of the
gateway the onecli CLI talks to before anything is written, and stop unless it
is older than 1.42. The Dial sign-up and credential steps below use the captured
version, so they cannot run when this check fails:
U=$(onecli config get api-host | jq -r '.value // empty') && [ -n "$U" ] || { echo "could not read the onecli CLI's api-host, so the OneCLI gateway version cannot be checked. Nothing was written to OneCLI." >&2; exit 1; }; H=$(curl -fsS --max-time 10 "$U/api/health") || { echo "could not reach the OneCLI gateway at $U. Nothing was written to OneCLI." >&2; exit 1; }; V=$(printf '%s' "$H" | jq -er '.version') || V=; case "$V" in 0.*|1.[0-9].*|1.[1-3][0-9].*|1.4[01].*) printf '%s\n' "$V" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$' && { echo "$V"; exit 0; };; esac; echo "OneCLI gateway version '${V:-unreadable}' at $U: /add-dial-tool needs legacy OneCLI rules, which gateway 1.42 and later reject. Nothing was written to OneCLI. This skill is not supported on the pinned gateway (1.42.0) until it moves to the OneCLI policy API." >&2; exit 1If it fails, show the user the message as it is and stop. Do not work around it by turning off OneCLI policy enforcement or granting the Dial key by hand: the block rules are what keep agents you did not choose away from Dial.
Calls this setup makes to Dial identify the install. The dial CLI prepends
DIAL_USER_AGENT to its own token, so the account's requests stay attributable
to this NanoClaw install in Dial's server-side logs. Resolve the token once
(nanoclaw/<version>; an unreadable package.json degrades to
nanoclaw/unknown rather than blocking the install):
node -p "'nanoclaw/'+(require('./package.json').version||'unknown')" 2>/dev/null || echo nanoclaw/unknownPrefix every dial command below with DIAL_USER_AGENT={{dial_ua}}.
List the agent groups (the NanoClaw service must be running — ncl talks to it
over its socket):
ncl groups list --json | jq -r 'if (.data|length)==0 then "no agent groups yet" else [.data[] | "\(.id) (\(.name))"] | join(", ") end'Ask the operator which of them may use Dial. Say plainly what they are granting, and ask even when there is a single agent:
Agents on this install: {{agent_groups}}. Giving an agent Dial lets it text and call any number and buy numbers, billed to your Dial account. Agents you leave out are blocked at the gateway (reversible by running /add-dial-tool again). Agents created after this run have Dial until the next run.Which agents may use Dial? Enter agent ids separated by commas with no spaces (the `ag-…` column), `all` for every agent, or `none` to install the tool with every agent blocked for now.all and none cannot be mixed with ids, and an empty answer is never
"everyone". A typo must not silently open or close anything, so every id named
must be a real agent group:
for w in $(printf '%s' '{{dial_agents}}' | tr ',' ' '); do case "$w" in all|none) ;; *) ncl groups list --json | jq -e --arg id "$w" '.data[] | select(.id==$id)' >/dev/null || { echo "unknown agent group '$w' — see: ncl groups list" >&2; exit 1; }; esac; doneThe host needs the dial CLI to sign in: dial auth login / dial auth verify-otp write the host auth file that the credential step below reads. Pinned
to the same version the agent image gets, so host and sandbox agree:
command -v dial >/dev/null || npm install -g @getdial/cli@0.37.0Dial's CLI owns the account credential (an auth file it writes on sign-in).
Is this host already signed in?
DIAL_USER_AGENT={{dial_ua}} dial doctor --jsonIf it is, read which account — that account's key is what the chosen agents will use:
DIAL_USER_AGENT={{dial_ua}} dial doctor --jsonThis host is signed in to Dial as {{connected_email}}; the agents you chose will use that account. To give them a different account, run `dial auth login <email> --force` and `dial auth verify-otp --code <code>` on the host first, then run /add-dial-tool again.If it is not, verify an email with a one-time code. Collect the email:
What's your email? Dial sends a one-time code to verify it. By continuing you create a Dial account and agree to Dial's Terms of Service (https://getdial.ai/terms) and Privacy Policy (https://getdial.ai/privacy).Send the code (--force re-sends even if a prior code is pending):
: "OneCLI gateway {{onecli_gateway}}"; DIAL_USER_AGENT={{dial_ua}} dial auth login {{owner_email}} --forceCollect the code:
Enter the 6-digit code from your emailVerify it. Do not pass --agent nanoclaw here: this skill owns the container
dial-cli skill, and --agent would drop a second, unmanaged copy next to it:
: "OneCLI gateway {{onecli_gateway}}"; DIAL_USER_AGENT={{dial_ua}} dial auth verify-otp --code {{otp}}The agent's global Node CLIs install from container/cli-tools.json, not from
hand-edited Dockerfile layers. Add the pinned Dial CLI — idempotent on name, so
a re-run is a no-op. @getdial/cli has no native postinstall, so no onlyBuilt:
{ "name": "@getdial/cli", "version": "0.37.0" }The version (0.37.0) is the canonical pin — this document is the source of
truth; the host install above uses the same one.
Mount the sandbox-aware dial-cli skill so the agent knows the CLI runs keyless
in there and never asks for credentials. container/skills/ is mounted read-only
into every agent container (at /app/skills) — which is why the key, not the
skill file, is what gets scoped per agent:
container-skills/dial-cli/SKILL.md -> container/skills/dial-cli/SKILL.mdRebuild the image so the CLI lands. On an install that fetches a published image this adds Dial as a layer on top of it; on one that builds its own it rebuilds:
./container/build.shRead the API key from the host auth file — the single source of truth, written
by dial auth login / dial auth verify-otp — and put it in the OneCLI vault
for api.getdial.ai. Always replace: the vault is keyed by name, so an
existing "Dial API" secret is not necessarily this account's (re-onboarding,
switching accounts, or rotating the key all leave a secret whose value points at
the previous account, and a sandboxed agent then lists that account's numbers).
A stale secret is deleted and a fresh one created rather than updated in place:
onecli secrets update accepts a new value only on the command line, and the key
must never sit on one. It travels through a 0600 temp file that is removed right
after (--file), so it is never on argv or in a captured variable. Selective-mode
agents pick the new id up in the merge step below:
: "OneCLI gateway {{onecli_gateway}}"; T=$(mktemp) && chmod 600 "$T" && jq -r '.apiKey // empty' "${XDG_DATA_HOME:-$HOME/.local/share}/dial/auth.v1.json" > "$T" 2>/dev/null; [ -s "$T" ] || { rm -f "$T"; echo "no Dial API key in the host auth file — sign in with dial auth login / verify-otp, then re-run" >&2; exit 1; }; S=$(onecli secrets list | jq -r 'first(.data[] | select(.name | test("(?i)dial"))) | .id // empty'); if [ -n "$S" ]; then onecli secrets delete --id "$S" >/dev/null || { rm -f "$T"; echo "could not remove the previous Dial secret $S" >&2; exit 1; }; fi; onecli secrets create --name "Dial API" --type generic --file "$T" --host-pattern api.getdial.ai --header-name Authorization --value-format "Bearer {value}" >/dev/null; rc=$?; rm -f "$T"; exit $rcNanoClaw gives every agent group its own OneCLI agent whose identifier is the
group id, created on the group's first spawn. A group that has never spawned has
no OneCLI agent yet, and a block rule needs one to attach to — so create the
missing ones now, exactly as the runtime would (secret mode all, nothing else
touched):
G=$(ncl groups list --json) || { echo "could not list agent groups — is the NanoClaw host running?" >&2; exit 1; }; AG=$(onecli agents list) || { echo "could not list OneCLI agents" >&2; exit 1; }; printf '%s' "$G" | jq -r '.data[] | "\(.id)\t\(.name)"' | while IFS="$(printf '\t')" read -r gid gname; do printf '%s' "$AG" | jq -e --arg g "$gid" '.data[] | select(.identifier==$g)' >/dev/null || onecli agents create --name "$gname" --identifier "$gid" >/dev/null || { echo "could not create an OneCLI agent for $gname ($gid)" >&2; exit 1; }; doneThe one switch is a per-agent block rule on api.getdial.ai, named
Dial: blocked for <group> so only this skill's rules are ever read or written
(an operator's own rules on the host are left alone). A chosen agent has its
rule removed; every other agent has one present and enabled. A 403 blocked_by_policy in a container means "not chosen", not "broken":
A=$(printf '%s' '{{dial_agents}}' | tr -d ' '); G=$(ncl groups list --json) || { echo "could not list agent groups — is the NanoClaw host running?" >&2; exit 1; }; case ",$A," in *,all,*) A=$(printf '%s' "$G" | jq -r '[.data[].id] | join(",")');; esac; AG=$(onecli agents list) || { echo "could not list OneCLI agents" >&2; exit 1; }; RL=$(onecli rules list) || { echo "could not list OneCLI rules" >&2; exit 1; }; printf '%s' "$G" | jq -r '.data[] | "\(.id)\t\(.name)"' | while IFS="$(printf '\t')" read -r gid gname; do aid=$(printf '%s' "$AG" | jq -r --arg g "$gid" 'first(.data[] | select(.identifier==$g)) | .id // empty'); [ -n "$aid" ] || { echo "no OneCLI agent for $gname ($gid)" >&2; exit 1; }; rid=$(printf '%s' "$RL" | jq -r --arg a "$aid" 'first(.data[] | select(.hostPattern=="api.getdial.ai" and .action=="block" and .agentId==$a and (.name | startswith("Dial: blocked for ")) and ((.pathPattern // "")=="") and ((.method // "")==""))) | .id // empty'); case ",$A," in *,"$gid",*) if [ -n "$rid" ]; then onecli rules delete --id "$rid" >/dev/null || { echo "could not remove the Dial block for $gname ($gid)" >&2; exit 1; }; fi; echo "allowed: $gname ($gid)";; *) if [ -z "$rid" ]; then onecli rules create --name "Dial: blocked for $gname" --host-pattern api.getdial.ai --action block --agent-id "$aid" --enabled >/dev/null || { echo "could not create the Dial block for $gname ($gid)" >&2; exit 1; }; else onecli rules update --id "$rid" --enabled true >/dev/null || { echo "could not re-enable the Dial block for $gname ($gid)" >&2; exit 1; }; fi; echo "blocked: $gname ($gid)";; esac; doneSecret lists are left alone, with one exception. An agent in selective mode only
gets the secrets on its list, so a chosen selective agent has the Dial secret
merged into it. onecli agents set-secrets switches an agent to selective mode,
so it is never called on an all-mode agent — that would silently cut the agent
off from every credential not on its list. Blocked agents keep their lists
untouched in either mode; the rule alone blocks:
A=$(printf '%s' '{{dial_agents}}' | tr -d ' '); case ",$A," in *,all,*) A=$(ncl groups list --json | jq -r '[.data[].id] | join(",")');; esac; S=$(onecli secrets list | jq -r 'first(.data[] | select(.name | test("(?i)dial"))) | .id // empty'); [ -n "$S" ] || { echo "no Dial secret in the OneCLI vault — the credential step above did not complete" >&2; exit 1; }; onecli agents list | jq -r '.data[] | select(.secretMode=="selective") | "\(.id)\t\(.identifier)"' | while IFS="$(printf '\t')" read -r aid gid; do case ",$A," in *,"$gid",*) onecli agents set-secrets --id "$aid" --secret-ids "$(onecli agents secrets --id "$aid" | jq -r --arg s "$S" '[.data[], $s] | unique | join(",")')" >/dev/null || { echo "could not add the Dial secret to $gid" >&2; exit 1; }; echo "Dial secret added to the list of $gid";; esac; donecontainer/skills/ is mounted read-only into every agent container, and each
group's .claude-shared/skills/ holds symlinks into that mount that are synced
when the container spawns — so nothing is copied per session. A running agent
keeps its old image until it respawns, so restart every group; without a
--message each one comes back on its next message, on the new image, with the
CLI on PATH and the skill in place. This is a restart effect, so it does not
fire after an earlier step bounced — agents keep the image they have until the
gap above is fixed and the skill is re-applied:
ncl groups list --json | jq -r '.data[].id' | while read -r gid; do ncl groups restart --id "$gid" >/dev/null || { echo "could not restart $gid" >&2; exit 1; }; doneThe chosen agents can now use Dial from inside their containers; the others are
blocked at the gateway. Auth is injected by OneCLI; a 403 blocked_by_policy
means the agent was not chosen (run /add-dial-tool again to change that); a
401 means the Dial secret needs (re)connecting — not a login. Verify from a
chat with a chosen agent: "run dial doctor" or "text +1… hi".
To uninstall: see REMOVE.md. To wire Dial as a messaging
channel too, run /add-dial.
command -v onecli fails. OneCLI is not installed or not on PATH. Run
/init-onecli, then re-run this skill.
ncl can't reach the host. The agent list and the scoping steps talk to the
running NanoClaw service. Start it (pnpm run dev, or restart the service) and
re-run.
unknown agent group. An id in your answer is not in ncl groups list. Copy
the ag-… id exactly; names are not accepted.
no Dial API key in the host auth file. The sign-in did not complete. Run
dial auth login <email> --force, then dial auth verify-otp --code <code>, and
re-run.
A chosen agent gets 401. The vault secret is stale (a different account's
key, or a rotated one). Re-run this skill — it always rewrites the secret with the
key the host is signed in with.
An agent you left out can still use Dial. It was created after the last run
(a new OneCLI agent starts in all mode with no rule). Re-run this skill; it
only touches the per-agent rules.
dial: command not found inside a container. The image predates the manifest
entry. Run ./container/build.sh, then ncl groups restart --id <group-id> so the
agent respawns on it.
© nanocoai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files in .claude/skills/add-dial-tool of nanocoai/nanoclaw.
Open the folder on GitHubat commit 66f0823
Add Dial Tool next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Dial Tool this skillnanocoai/nanoclaw | 31k | — | ~4.4k | Automated safety check: Pass | MIT | |
| Feishu Doc Writerhyperlist/feishu-multi-agent | 273 | — | ~505 | Automated safety check: Pass | None | |
| Viral Titlekangarooking/kangarooking-skills | 661 | — | ~1.7k | Automated safety check: Pass | None | |
| Telegram Plugin Updaterk1p1l0/claude-telegram-supercharged | 132 | — | ~764 | Automated safety check: Pass | Apache-2.0 | |
| Discord Bot Architectdavila7/claude-code-templates | 32k | 7 repos | ~2k | Automated safety check: Pass | MIT | |
| Hanzi Browsehanzili/hanzi-browse | 177 | — | ~2.4k | Automated safety check: Pass | Custom licence |
hyperlist/feishu-multi-agent
Feishu document writing skill. An agent skill from hyperlist/feishu-multi-agent.
kangarooking/kangarooking-skills
Generate high-potential viral title candidates for content across WeChat public account articles, X/Twitter posts, YouTube videos, Bilibili videos, and similar content platforms.
k1p1l0/claude-telegram-supercharged
Updates the enhanced Telegram plugin for Claude Code from its GitHub repository: compares file hashes, shows recent commits, asks first, then runs the installer.
davila7/claude-code-templates
Specialized skill for building production-ready Discord bots.
hanzili/hanzi-browse
Delegates a browsing task to a sub-agent running in the USER'S OWN Chrome — the browser they have open right now, already signed into everything.
appleweiping/WEIPING_WIKI
创建 lark-cli 的自定义 Skill。当用户需要把飞书 API 操作封装成可复用的 Skill(包装原子 API 或编排多步流程)时使用。
nanocoai/nanoclaw
Installs or refreshes Iron Proxy and its Iron Control web console for NanoClaw, with a local Docker setup, database, credentials and a human approval bridge.
nanocoai/nanoclaw
Installs or refreshes OneCLI as the gateway provider for NanoClaw, copying the adapter files, registering the provider and running the setup script.
nanocoai/nanoclaw
Drives a web browser from the shell with the agent-browser CLI: open pages, read an element snapshot, click and fill by reference, grab text and screenshots.
nanocoai/nanoclaw
Guides a conversational migration from an OpenClaw install to NanoClaw v2, carrying over identity, channel credentials, scheduled tasks and workspace files.
nanocoai/nanoclaw
Wires up an additional phone number onto an already-installed Dial channel, so one NanoClaw install answers SMS and AI voice calls on more than one line.
nanocoai/nanoclaw
Connects NanoClaw to iMessage through one channel with either a local Mac backend or a hosted backend via photon.codes, copying in the adapter and installing its package.
Categories
Installs the `dial` CLI and a credential in NanoClaw agent containers so chosen agents can send SMS, place AI voice calls and receive verification codes. A NanoClaw setup skill that adds Dial as a container tool.ai is injected without putting the key in an environment variable.
Add Dial Tool fits situations like: letting selected NanoClaw agents send texts or place calls from inside their sandbox; changing which agents may use Dial after a first install; letting an agent receive SMS verification codes; using `dial` from a chat without wiring Dial up as a messaging channel.
Run `npx skills add nanocoai/nanoclaw --skill add-dial-tool -a claude-code`. Or copy the skill folder (.claude/skills/add-dial-tool in nanocoai/nanoclaw) into .claude/skills/add-dial-tool in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nanocoai/nanoclaw --skill add-dial-tool -a codex`. Or copy the skill folder (.claude/skills/add-dial-tool in nanocoai/nanoclaw) into .agents/skills/add-dial-tool in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add nanocoai/nanoclaw --skill add-dial-tool -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-dial-tool, .gemini/skills/add-dial-tool, .github/skills/add-dial-tool and .opencode/skills/add-dial-tool in your project.
Going by SKILL.md and its folder, Add Dial Tool needs the command-line tools its instructions call (pnpm). Our summary lists: A NanoClaw repository checkout on the host; OneCLI (the `onecli` CLI), set up with `/init-onecli`; A Dial account, which is billed for texts and calls.
SKILL.md names 1 domain. In commands or code: getdial.ai; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Dial Tool is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Dial Tool: Feishu Doc Writer (hyperlist/feishu-multi-agent, 273 stars), Viral Title (kangarooking/kangarooking-skills, 661 stars), Telegram Plugin Updater (k1p1l0/claude-telegram-supercharged, 132 stars) and Discord Bot Architect (davila7/claude-code-templates, 32k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nanocoai (a GitHub organization) maintains it in nanocoai/nanoclaw, which has 30,902 GitHub stars. The repository holds 59 skills in this directory. The repository was last updated on October 6, 2026.
Source: nanocoai/nanoclaw on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.