Monorepo of AI-powered CLI tools published under the @fionoble npm scope. Each package wraps an external AI API (currently OpenAI) and doubles as a Claude Code skill.
ai-cli-tools/
├── packages/ ← each subdirectory is an independent CLI tool
│ ├── fcd/ ← @fionoble/fcd (shell function, not a Node.js CLI)
│ ├── image-gen-cli/ ← @fionoble/image-gen-cli
│ ├── issue-watcher/ ← @fionoble/issue-watcher (GitHub issue → PR automation)
│ └── tts-cli/ ← @fionoble/tts-cli
├── install.sh ← links all CLIs globally + installs Claude Code skills
├── pnpm-workspace.yaml
└── package.json ← root (private, no publishable code here)
Every package follows this layout:
packages/<name>/
├── index.js ← single-file CLI entry point (CommonJS, #!/usr/bin/env node)
├── package.json ← scoped to @fionoble, "type": "commonjs"
├── skill/SKILL.md ← Claude Code skill definition
└── README.md
Note: Not all packages are Node.js CLIs. fcd is a pure shell function sourced into the user's shell — it has no index.js, no bin entry, and no Node.js dependencies.
- Single-file CLIs: each tool is one
index.jswith no build step. Keep it that way. - CommonJS: all packages use
"type": "commonjs"withrequire(). - No frameworks: argument parsing is hand-rolled (no yargs/commander). Follow the existing flag-parsing style.
- Dual bin names: each package exposes two bin aliases — a short name (e.g.
tts) and a long name (e.g.tts-cli) for npx compatibility. - Skill install/uninstall: every CLI supports
--install-skilland--uninstall-skillflags that copy/removeskill/SKILL.mdto/from~/.claude/skills/<name>/. - Environment variables: tools use
OPENAI_API_KEY(required) andOPENAI_BASE_URL(optional). New tools wrapping OpenAI should follow the same pattern. - Node.js 18+: minimum version requirement.
- Create
packages/<name>/withindex.js,package.json,skill/SKILL.md, andREADME.md. - Follow the existing package.json shape —
@fionoblescope, dual bin names,"files"array includingindex.jsandskill/SKILL.md. - Add the
--install-skill/--uninstall-skillhandlers (copy the pattern from an existing package). - Update
install.shto link the new CLI and copy its skill. - Keep the CLI as a single
index.jsfile unless complexity genuinely demands splitting.
Skill files have YAML frontmatter with name, description, and allowed-tools, followed by markdown documentation. They should include:
- Tool location (global command + npx fallback)
- All CLI flags in a table
- Environment variable requirements
- Instructions for Claude on how to use the tool well
- Practical examples
Packages are published individually to npm via pnpm publish from within each package directory.
- pnpm for workspace management
- openai SDK (^6.25.0) is the only runtime dependency currently