mcpbeat Sign in

Bombshell Dev Clack Agent Skill

ALWAYS use when writing code importing \"@clack/prompts\". Consult for debugging, best practices, or modifying @clack/prompts, clack/prompts, clack prompts, clack.

2k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
307
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/skilld-dev/skilld --skill bombshell-dev-clack

The instruction itself

4 sections, as written by the author

bombshell-dev/clack @clack/prompts

Version: 1.0.1 (yesterday)

Deps: picocolors@^1.0.0, sisteransi@^1.0.5, @clack/[email protected]

Tags: alpha: 1.0.0-alpha.10 (2 weeks ago), latest: 1.0.1 (yesterday)

References: package.json • README • GitHub Issues • Releases

Use npx -y skilld search instead of grepping .skilld/ directories — hybrid semantic + keyword search across all indexed docs, issues, and releases.

npx -y skilld search "query" -p @clack/prompts
npx -y skilld search "issues:error handling" -p @clack/prompts
npx -y skilld search "releases:deprecated" -p @clack/prompts

Filters: docs:, issues:, releases: prefix narrows by source type.

API Changes

⚠️ ESM-only — v1.0 dropped CJS dual-publish, require('@clack/prompts') no longer works source

⚠️ spinner.stop(msg, 1) / spinner.stop(msg, 2) — v1.0 replaced numeric codes with spinner.cancel(msg) and spinner.error(msg) source

⚠️ suggestion prompt — added then removed in v1.0, use path prompt (autocomplete-based) instead source

⚠️ placeholder in text() — v1.0 changed to visual-only hint, no longer used as tabbable/return value source

autocomplete() / autocompleteMultiselect() — new in v1.0, searchable select with filter option for custom/fuzzy matching source

progress() — new in v1.0, displays a progress bar with start(), stop(), cancel(), error() methods source

taskLog() — new in v1.0, scrolling log output cleared on success; supports group() for nested log sections source

box() — new in v1.0, renders boxed text similar to note source

path() — new in v1.0, autocomplete-based file path prompt source

stream.step() — new in v0.10, renders async iterable message streams (useful for LLM output) source

spinner({ indicator: 'timer' }) — new in v0.10, shows elapsed time instead of dots animation source

updateSettings({ aliases, messages }) — new in v0.9, configures global keybindings and i18n cancel/error messages source

signal option — new in v0.9, all prompts accept AbortSignal for programmatic cancellation source

withGuide option — new in v1.0, disables the default clack border on any prompt source

spinner.clear() — new in v1.0, stops and clears spinner output entirely source

confirm({ vertical: true }) — new in v1.0.1, arranges yes/no options vertically source

Best Practices

✅ Use spinner.cancel() and spinner.error() instead of stop codes — v1.0 replaced stop(msg, code) with distinct methods source

const s = spinner()
s.start('Deploying')
// s.stop('Done')       // success
// s.cancel('Aborted')  // user cancelled (CTRL+C)
// s.error('Failed')    // error occurred
// s.clear()            // stop and clear all output

✅ Pass signal to prompts for programmatic cancellation — all prompts accept AbortSignal since v0.9.0 source

const answer = await confirm({
  message: 'Continue?',
  signal: AbortSignal.timeout(5000),
})

✅ Use group() with onCancel instead of checking isCancel after every prompt — centralizes cancellation handling for multi-step flows source

const result = await p.group({
  name: () => p.text({ message: 'Name?' }),
  lang: () => p.select({ message: 'Language?', options }),
}, {
  onCancel: () => { p.cancel('Cancelled.'); process.exit(0) },
})

✅ Use updateSettings for global i18n messages and key aliases — per-instance options override globals source

import { updateSettings } from '@clack/prompts'
updateSettings({
  aliases: { w: 'up', s: 'down' },
  messages: { cancel: 'Cancelado', error: 'Error' },
})

✅ Use stream instead of log for LLM/async output — accepts sync and async iterables, renders incrementally source

await stream.step((async function* () {
  yield* generateLLMResponse(question)
})())

✅ Use taskLog for subprocess output — renders lines continuously, clears on success, preserves on error source

const tl = taskLog({ title: 'Building' })
for await (const line of buildProcess()) tl.message(line)
success ? tl.success('Done') : tl.error('Failed')

✅ Distinguish placeholder from defaultValue in text() — placeholder is visual-only hint, never returned as value (changed in v1.0); use defaultValue for the fallback return value source

const name = await text({
  message: 'Project name?',
  placeholder: 'my-app',    // visual hint only, NOT returned
  defaultValue: 'my-app',   // returned when user presses Enter without typing
})

✅ v1.0 is ESM-only — CJS require() no longer works; use dynamic import() or switch to ESM source

✅ Guard against empty options arrays in select/multiselect — passing ] throws TypeError: Cannot read properties of undefined [source

✅ Vim keybindings (h/j/k/l) and Escape → cancel are enabled by default since v0.9.0 — updateSettings cannot disable defaults, only add aliases source

How to use it

Copy the folder

Take skilld-dev/bombshell-dev-clack from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.

Install what it needs

The instructions reference npx. Without those the skill loads but fails at the first command.