Agent Skills
Repository: Nuelink/nuelink-agent Install: npx skills add Nuelink/nuelink-agent
The MCP server lets an assistant call Nuelink. Skills tell it how to call Nuelink well.
A skill is a short instruction file your agent reads when a task matches it. The Nuelink skills pack encodes the workflows we’d want any agent to follow: resolve IDs before mutating, preview with --dry-run, treat ambiguous publishing intent as a draft, and ask before anything goes live. Without them, an agent left alone with a publishing tool tends to guess. With them, it checks.
Who this is for
Section titled “Who this is for”- You use Claude Code, Codex, or another agent runtime that reads skills.
- You want the agent to run Nuelink CLI commands without you approving each one blindly.
- You want a consistent, reviewable workflow across your team.
If you just want to publish from a chat, you want the MCP server instead. Skills are for agents that run commands.
Install
Section titled “Install”1. Install the skills pack
Section titled “1. Install the skills pack”npx skills add Nuelink/nuelink-agent2. Install and authenticate the CLI
Section titled “2. Install and authenticate the CLI”The skills drive the CLI, so the CLI has to be there:
npm install -g @nuelink/nuelink-cliprintf '%s' "$NUELINK_API_KEY" | nuelink-cli auth:login --stdinnuelink-cli auth:statusIn CI, prefer the NUELINK_API_KEY environment variable over a saved config file.
3. (Optional) Connect the MCP server separately
Section titled “3. (Optional) Connect the MCP server separately”The repository includes an example .mcp.json for https://mcp.nuelink.com/mcp, but npx skills add installs skill directories only. Add the MCP server through your runtime’s separate MCP configuration flow; do not assume that installing the Skills configured MCP.
Tested install locations
Section titled “Tested install locations”| Runtime | Repository scope | Typical user scope |
|---|---|---|
| Codex / agents-compatible runtimes | .agents/skills/ | $HOME/.agents/skills/ |
| Claude Code | .claude/skills/ | $HOME/.claude/skills/ |
Other runtimes can use different paths. Follow that runtime’s current Skills documentation.
The three skills
Section titled “The three skills”The pack is deliberately small. Three skills, picked by what the task ends in.
nuelink-cli-setup
Section titled “nuelink-cli-setup”Install, authenticate, verify identity, and troubleshoot config.
Use it first, or any time you’re not sure which account is active.
npm install -g @nuelink/nuelink-clinuelink-cli --versionprintf '%s' "$NUELINK_API_KEY" | nuelink-cli auth:login --stdinnuelink-cli auth:statusnuelink-cli auth:validatenuelink-cli meGuardrails: never echo a full API key, stop before any mutation if me shows the wrong account, and re-authenticate with auth:clear if auth looks stale or auth:validate fails.
nuelink-cli-manage
Section titled “nuelink-cli-manage”Discover resources and safely create the non-post ones: collections and automations, plus listing brands, channels, and media.
nuelink-cli brands --per-page 25 --page 1nuelink-cli collections --brand-id BRAND_ID --per-page 25 --page 1nuelink-cli channels --brand-id BRAND_ID --per-page 25 --page 1nuelink-cli automations --brand-id BRAND_IDnuelink-cli media --brand-id BRAND_IDIts mutation workflow, in order:
- Resolve resource names and confirm exactly one target ID per resource.
- Validate payload fields and required enums.
- Run the create command with
--dry-runand show the validated payload. - Get explicit user confirmation.
- Run the same complete command without
--dry-run, then report the created ID.
Step 5 matters: the agent repeats the same command, not an abbreviated one that could change the payload.
nuelink-cli-publish
Section titled “nuelink-cli-publish”Upload media, and list, draft, queue, schedule, publish, update, or delete posts, then review what was published. The skill that touches the outside world.
nuelink-cli media:upload --brand-id BRAND_ID --file ./assets/image.jpg --dry-runnuelink-cli posts --brand-id BRAND_ID --collection-id COLLECTION_IDnuelink-cli brand-posts --brand-id BRAND_ID --view SCHEDULEDnuelink-cli schedule --brand-id BRAND_IDnuelink-cli posts:create \ --brand-id BRAND_ID \ --collection-id COLLECTION_ID \ --caption "Post body" \ --publish-mode DRAFT \ --dry-runnuelink-cli posts:update --brand-id BRAND_ID --post-id POST_ID --queue-position FRONT --dry-runnuelink-cli published-posts --brand-id BRAND_ID --status FAILEDIts rules:
- Resolve and confirm exactly one
BRAND_IDand oneCOLLECTION_ID. - Preview every upload and every post mutation with
--dry-runfirst. - If publishing intent is ambiguous, use
DRAFT. - Require explicit confirmation for
QUEUE,SCHEDULE, andIMMEDIATE. - Check the current state with
scheduleandbrand-postsbefore updating a queued or scheduled post, and confirm everyposts:updateagainst the exact brand and post ID. - Treat
posts:deleteas irreversible: ask for a separate, explicit confirmation immediately before running it.
Safety defaults
Section titled “Safety defaults”Every skill in the pack shares the same posture:
| Rule | Why |
|---|---|
| Resolve target IDs before any mutation | Stops posts landing in the wrong brand |
Preview with --dry-run | Shows the intended JSON payload or upload metadata without contacting the API; server acceptance is not guaranteed |
Default ambiguous intent to DRAFT | A misread instruction saves a draft, not a live post |
Require explicit intent for QUEUE, SCHEDULE, IMMEDIATE | Publishing is never a side effect |
Confirm posts:delete separately, right before it runs | Deletion is the one change that can’t be undone |
| One resource change at a time | Failures stay small and easy to reverse |
| Inject secrets from a secret manager | Avoids command arguments and saved CLI config; still prevent environment dumps and unnecessary child-process inheritance |
| Use explicit pagination in scripts | Deterministic results across runs |
Repository integration metadata
Section titled “Repository integration metadata”The repository contains runtime-specific metadata:
| Runtime or surface | Repository file |
|---|---|
| Claude Code plugin metadata | .claude-plugin/plugin.json |
| Codex metadata | .codex-plugin/plugin.json |
| Remote MCP example | .mcp.json |
The documented npx skills add command installs the three canonical Skills as copied directories; it does not install these root files. A full marketplace/plugin installation can install the plugin package and bundled MCP configuration when the runtime supports it. Each canonical Skill’s references/ directory is copied with that Skill.
For an MCP-backed public OpenAI marketplace submission, add public HTTPS values for privacyPolicyURL, termsOfServiceURL, and supportURL to the Codex plugin interface. Repository CI should also run the official Claude plugin validator and a Codex marketplace install/MCP discovery smoke test, rather than only JSON-parsing the manifests.
Compatibility aliases
Section titled “Compatibility aliases”An earlier layout used nine narrower skills. Those still exist under compatibility-skills/ as an opt-in migration package, and each one routes to its canonical replacement:
| Legacy skill | Now |
|---|---|
nuelink-cli-install-auth, nuelink-cli-profile, nuelink-cli-ops | nuelink-cli-setup |
nuelink-cli-brands, nuelink-cli-channels, nuelink-cli-collections, nuelink-cli-automations, nuelink-cli-media | nuelink-cli-manage |
nuelink-cli-posts | nuelink-cli-publish |
They aren’t part of the default bundle. Copy that directory only when migrating an installation that still references an old name.
Recommended workflow
Section titled “Recommended workflow”Skills are instruction files, not a policy engine or sandbox. The canonical Skills guide agents to resolve targets, preview mutations, default ambiguous publishing intent to DRAFT, and request confirmation for non-draft publishing. Users must still review commands and control the agent’s shell, file, credential, and network permissions.
Additional recommended checks—not guaranteed by every shipped Skill—are:
- Read a created resource back when a matching list operation can identify it reliably.
- Show a collection’s channels before non-draft post creation.
- Confirm the brand timezone and absolute timestamp before
SCHEDULE, remembering that listed publish dates come back in UTC. - For a first automation, pass
--load-old-posts falseand--add-posts-as-draft trueexplicitly.falseis the API’s default for both, but spelling it out keeps the reviewed command self-describing. - Prefer
posts:update --publish-mode DRAFToverposts:deletewhen the goal is only to stop a post from going out.
A request that works well
Section titled “A request that works well”Using the Nuelink CLI, verify the connected account, find the brand “Example Brand” and the collection “Product Launches”, show me that collection’s channels, then prepare a
DRAFTpost command with--dry-run. Don’t upload or create anything until I approve the exact command.
Every clause is doing work: it names the brand and collection, asks for the channels before anything is written, sets the publish mode explicitly, and withholds permission until the command is on screen.
Examples
Section titled “Examples”Request and response examples live in examples/, grouped by domain, using placeholder tokens like SAMPLE_BRAND_ID. Replace them with your own IDs before running anything.
- Profile and brand list responses
- Channel, collection, automation, and media list responses
- Collection and automation create payloads, and the media upload response
- Post create and update payloads
- Post list, schedule, and published-results responses
Contributing
Section titled “Contributing”If you’re editing skills locally, validate before you open a PR:
npm run lint:mdnpm run validatenpm run validate:behaviornpm run validate:allWhat CI actually runs:
| Check | Covers |
|---|---|
npm ci --ignore-scripts | Clean dependency install |
npm run validate | Skill structure and frontmatter |
npm run validate:installer | Installer discovery for Codex and Claude Code |
skills-ref validate | The Agent Skills reference implementation, run over every skill and alias |
npm run validate:behavior | Behavior fixtures |
npm run validate:contracts | JSON syntax, default-skill inventory, and seven network-blocked mutation dry-runs |
markdownlint-cli2 | Markdown lint |
The contract check runs all seven API mutation dry-runs with the network blocked, including posts:update and posts:delete, so a dry-run path that quietly tries to reach the API fails the build. The plugin manifests parse as JSON, but CI does not yet run ecosystem-specific semantic validation for either manifest format.
Review skill changes before you update. A skill update changes how your agent behaves, not just what it reads.
The pack is MIT licensed. Issues and PRs welcome at github.com/Nuelink/nuelink-agent.