ZCF is a command-line setup tool for configuring Claude Code and Codex with agents, instructions, skills, hooks, commands, and settings. It is for developers who want to install and personalize these coding-agent workflows through an interactive setup.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add UfoMiao/zcf --skill bmad-initgit clone --depth 1 https://github.com/UfoMiao/zcfWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/ufomiao/zcf/bmad-init)<a href="https://agentmods.dev/skills/ufomiao/zcf/bmad-init"><img src="https://agentmods.dev/badge/skills/ufomiao/zcf/bmad-init/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/ufomiao/zcf/bmad-init"><img src="https://agentmods.dev/badge/skills/ufomiao/zcf/bmad-init.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 9 findings, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium MCP Rug Pull · line 15 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 16 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 161 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 170 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 251 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 253 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 255 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 277 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
- medium MCP Rug Pull · line 278 npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.Fix: Pin the version: npx @scope/[email protected]
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00018 | $0.02599 |
| Opus 5.5 | $0.00007 | $0.01040 |
| Sonnet 5.5 | $0.00004 | $0.00520 |
| Haiku 4.5 | $0.00002 | $0.00260 |
Grade A, and why
bmad-init scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Runs shell commandslowCapability
Expected in a hook, worth knowing in a rule or an instructions file.
const { execSync } = require('node:child_process') How it starts
The opening of the file, as written. The whole thing — 282 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/bmad-init Command
This command initializes or updates BMad-Method (V6) in your project.
When this command is invoked:
- Check if
_bmad/directory exists to determine if BMad V6 is already installed - Check for legacy V4 installations (
.bmad-coreor.bmad-methoddirectories) - Fresh install executes:
npx bmad-method install --directory . --modules bmm --tools claude-code --communication-language English --document-output-language English --yes - Existing install executes:
npx bmad-method install --directory . --action quick-update --yes - Fix installer bug: rename
{output_folder}to_bmad-output(Beta known issue) - Automatically update
.gitignore(remove V4 entries, add V6 entries) - Display installation results and prompt user for next steps
Implementation
const { execSync } = require('node:child_process')
const fs = require('node:fs')
const path = require('node:path')
// Legacy entries to clean from .gitignore
const LEGACY_GITIGNORE_ENTRIES = [
'.bmad-core',
'.bmad-method',
'.claude/commands/BMad',
'{output_folder}', // v6.0.0-Beta.8 bug artifact
]
// V6 .gitignore entries
const V6_GITIGNORE_ENTRIES = [
'_bmad/',
'_bmad-output/',
]
// Fix installer bug: {output_folder} not resolved to _bmad-output (v6.0.0-Beta.8)
function fixOutputFolderBug(cwd) {
const buggyPath = path.join(cwd, '{output_folder}')
const correctPath = path.join(cwd, '_bmad-output')
if (!fs.existsSync(buggyPath)) return false
if (!fs.existsSync(correctPath)) {
// _bmad-output doesn't exist, simply rename
fs.renameSync(buggyPath, correctPath)
console.log(' ✅ {output_folder} → _bmad-output/ (renamed)')
} else {
// _bmad-output already exists, merge subdirectories then delete
const entries = fs.readdirSync(buggyPath, { withFileTypes: true })
for (const entry of entries) {
const src = path.join(buggyPath, entry.name)
const dest = path.join(correctPath, entry.name)
if (!fs.existsSync(dest)) {
fs.renameSync(src, dest)
console.log(` ✅ Moved ${entry.name} → _bmad-output/`)
}
}
fs.rmSync(buggyPath, { recursive: true, force: true })
console.log(' ✅ Removed redundant {output_folder}/')
}
return true
}
function updateGitignore(cwd) {
const gitignorePath = path.join(cwd, '.gitignore')
let content = ''
let exists = false
if (fs.existsSync(gitignorePath)) {
content = fs.readFileSync(gitignorePath, 'utf8')
exists = true
}
const lines = content.split('\n')
let changed = false
// Remove V4 legacy entries
const filtered = lines.filter(line => {
const trimmed = line.trim()
const isLegacy = LEGACY_GITIGNORE_ENTRIES.some(entry =>
trimmed === entry || trimmed === entry + '/' || trimmed === '/' + entry
)
if (isLegacy) {
console.log(` 🗑️ Removing legacy entry: ${trimmed}`)
changed = true
}
return !isLegacy
})
// Add V6 entries
const newEntries = []
for (const entry of V6_GITIGNORE_ENTRIES) {
const entryBase = entry.replace(/\/$/, '')
const alreadyExists = filtered.some(line => {
const trimmed = line.trim()
return trimmed === entry || trimmed === entryBase || trimmed === '/' + entryBase
})
if (!alreadyExists) {
newEntries.push(entry)
console.log(` ✅ Adding new entry: ${entry}`)
changed = true
}
}
if (!changed) {
console.log(' ℹ️ .gitignore is up to date, no changes needed')
return
}
// Build new content
let result = filtered.join('\n')
if (newEntries.length > 0) {
// Ensure trailing newline, then add BMad section
if (result.length > 0 && !result.endsWith('\n')) {
result += '\n'
}
result += '\n# BMad Method V6\n'
result += newEntries.join('\n') + '\n'
}
fs.writeFileSync(gitignorePath, result, 'utf8')
console.log(` 📝 .gitignore ${exists ? 'updated' : 'created'}`)
}
async function initBmad() {
const cwd = process.cwd()
const bmadV6Path = path.join(cwd, '_bmad')
const legacyCorePath = path.join(cwd, '.bmad-core')
const legacyMethodPath = path.join(cwd, '.bmad-method')
// Check for legacy V4 installation
const hasLegacyCore = fs.existsSync(legacyCorePath)
const hasLegacyMethod = fs.existsSync(legacyMethodPath)
if (hasLegacyCore || hasLegacyMethod) {
console.log('⚠️ Legacy BMad V4 installation detected:')
if (hasLegacyCore) console.log(' • .bmad-core/ (V4 core directory)')
if (hasLegacyMethod) console.log(' • .bmad-method/ (V4 method directory)')
console.log('')
console.log('📌 The V6 installer will handle legacy migration automatically. Follow the prompts during installation.')
console.log(' Details: https://bmad-code-org.github.io/BMAD-METHOD/docs/how-to/upgrade-to-v6')
console.log('')
}
// Check if V6 is already installed
const hasV6 = fs.existsSync(bmadV6Path)
// Build non-interactive install command
let installCmd
if (hasV6) {
console.log('🔄 Existing BMad V6 installation detected, performing quick update...')
console.log('')
installCmd = [
'npx bmad-method install',
'--directory .',
'--action quick-update',
'--yes',
].join(' ')
} else {
console.log('🚀 Initializing BMad-Method V6...')
console.log('')
installCmd = [
'npx bmad-method install',
'--directory .',
'--modules bmm',
'--tools claude-code',
'--communication-language English',
'--document-output-language English',
'--yes',
].join(' ')
}
// Execute installation
try {
console.log(`📋 Executing: ${installCmd}`)
console.log('')
execSync(installCmd, {
stdio: 'inherit',
cwd: cwd,
shell: true
})
console.log('')
console.log('✅ BMad-Method V6 installation/update complete!')
console.log('')
console.log('═══════════════════════════════════════════════════════════════')
console.log('📌 IMPORTANT: Please restart your AI IDE to load BMad extensions')
console.log('═══════════════════════════════════════════════════════════════')
console.log('')
// Fix {output_folder} bug (v6.0.0-Beta.8)
console.log('🔧 Checking for known installer issues...')
try {
const fixed = fixOutputFolderBug(cwd)
if (!fixed) console.log(' ℹ️ No fixes needed')
} catch (err) {
console.log(` ⚠️ Failed to fix {output_folder}: ${err.message}`)
console.log(' Please manually rename {output_folder}/ to _bmad-output/')
}
console.log('')
console.log('📂 V6 Directory Structure:')
console.log(' • _bmad/ — agents, workflows, tasks, and configuration')
console.log(' • _bmad-output/ — generated artifact output directory')
console.log('')
// Automatically update .gitignore
console.log('🔧 Updating .gitignore...')
try {
updateGitignore(cwd)
} catch (err) {
console.log(' ⚠️ Failed to automatically update .gitignore, please manually add _bmad/ and _bmad-output/')
}
console.log('')
console.log('🚀 Quick Start:')
console.log(' 1. Restart your AI IDE')
console.log(' 2. Run /bmad-help for guidance and next step suggestions')
console.log(' 3. Type /bmad and use autocomplete to browse available commands')
console.log('')
console.log('💡 Common Workflows:')
console.log(' • /bmad-help — Interactive help')
console.log(' • /bmad-bmm-create-prd — Create Product Requirements Document')
console.log(' • /bmad-bmm-create-architecture — Create Architecture Document')
console.log(' • /bmad-bmm-create-epics-and-stories — Create Epics and User Stories')
console.log(' • /bmad-bmm-sprint-planning — Initialize Sprint Planning')
console.log(' • /bmad-bmm-dev-story — Implement User Story')
// Legacy V4 IDE command cleanup reminder
const legacyClaudeAgents = path.join(cwd, '.claude', 'commands', 'BMad', 'agents')
const legacyClaudeTasks = path.join(cwd, '.claude', 'commands', 'BMad', 'tasks')
if (fs.existsSync(legacyClaudeAgents) || fs.existsSync(legacyClaudeTasks)) {
console.log('')
console.log('⚠️ Legacy V4 IDE commands detected, consider removing manually:')
if (fs.existsSync(legacyClaudeAgents)) console.log(' • .claude/commands/BMad/agents/')
if (fs.existsSync(legacyClaudeTasks)) console.log(' • .claude/commands/BMad/tasks/')
console.log(' New V6 commands are installed under .claude/commands/bmad/')
}
}
catch (error) {
console.error('❌ Installation failed:', error.message)
console.log('')
console.log('🛠️ Manual Installation Guide:')
console.log(' 1. Ensure Node.js 20+ is installed')
console.log(' 2. Non-interactive install:')
console.log(' npx bmad-method install --directory . --modules bmm --tools claude-code --communication-language English --document-output-language English --yes')
console.log(' 3. Quick update existing installation:')
console.log(' npx bmad-method install --directory . --action quick-update --yes')
console.log(' 4. Or interactive install:')
console.log(' npx bmad-method install')
console.log('')
console.log('📖 Documentation:')
console.log(' https://bmad-code-org.github.io/BMAD-METHOD/docs/how-to/install-bmad')
}
}
// Execute initialization
initBmad()
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 282 lines · 18 tokens per session scan A 2a4e10bb0c2e
bmad-init is a skill published in the GitHub repository UfoMiao/zcf (6,079 stars, last pushed yesterday), licensed MIT. It adds 18 tokens to every session and 2,599 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 1 finding (runs shell commands). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
integrations
NextDNS integration guides for third-party platforms and services. This skill should be used when integrating NextDNS with routers, home automation systems, network management platforms, or other third-party services. It also guides transport selection across DoH, DoT, DoQ, DoH3, IPv6, and legacy DNS. Triggers on…
nextdns-cli
NextDNS CLI client best practices for installation, configuration, and management of DNS-over-HTTPS proxy. This skill should be used when installing NextDNS on routers, servers, or client devices, configuring DNS settings, managing the daemon, or troubleshooting DNS issues. Triggers on tasks involving NextDNS CLI…
nextdns-ui
NextDNS Web UI configuration and management best practices. This skill should be used when configuring NextDNS profiles via the web interface (my.nextdns.io), including security features, privacy lists, parental controls, and monitoring logs.
cli-forge-github
Audit and fix GitHub repository health: rulesets vs CI alignment, branch hygiene, PR lifecycle, release automation flow, permission issues, and transient CI failures. Detects misconfigurations that cause PRs to hang, CI to fail silently, branches to accumulate, and releases to stall. Use when the user says 'PR stuck'…
cli-watermark
Steganographic code watermarking for IP defense. Generates multi-layered fingerprints that survive AI rewrites, language changes, renaming, and clean-code passes. Produces timestamped cryptographic commitments for legal proof of authorship. Use when the user wants to watermark a codebase, protect IP, prove code…
cli-audit-data
Audit PostgreSQL database safety in Rust/SQLx applications. Use for schemas, migrations, constraints, indexes, transactions, repositories, state transitions, idempotency, concurrency, queues, multi-tenancy, soft deletion, ledgers, auditability, repair, database incidents, or whenever SQLx and PostgreSQL changes could…