bombshell-dev-clack · v1.0.0 · 2026-02-09 · sha256 a270db332daeeb50
bombshell-dev-clack v1.0.0A
Immutable. This exact content is served forever at /api/v1/blob/a270db332daeeb50.
---
name: bombshell-dev-clack-skilld
description: "Using code importing from \"@clack/prompts\". Researching or debugging @clack/prompts, clack/prompts, clack prompts, clack."
version: 1.0.0
generated_by: Claude Code · Haiku 4.5
---
# bombshell-dev/clack `@clack/prompts`
**Version:** 1.0.0 (1 week ago)
**Deps:** picocolors@^1.0.0, sisteransi@^1.0.5, @clack/core@1.0.0
**Tags:** latest: 1.0.0 (1 week ago), alpha: 1.0.0-alpha.10 (1 week ago)
**References:** [package.json](./.skilld/pkg/package.json) • [README](./.skilld/pkg/README.md) • [GitHub Issues](./.skilld/issues/_INDEX.md) • [Releases](./.skilld/releases/)
## Search
Use `npx skilld search` instead of grepping `.skilld/` directories — hybrid semantic + keyword search across all indexed docs, issues, and releases.
```bash
npx skilld search "query" -p @clack/prompts
npx skilld search "issues:error handling" -p @clack/prompts
npx skilld search "releases:deprecated" -p @clack/prompts
```
Filters: `docs:`, `issues:`, `releases:` prefix narrows by source type.
## LLM Gaps
⚠️ **ESM-only in v1** — v1.0.0 is ESM-only, v0 was dual CJS/ESM. Node v20+ requires `--input-type=module` or `.mjs` extension. [source](./@clack/prompts@1.0.0.md)
⚠️ **Spinner API changed** — `spinner.stop(undefined, 1)` for cancel and `spinner.stop(undefined, 2)` for error are now `spinner.cancel()` and `spinner.error()`. Old code silently fails. [source](./@clack/prompts@1.0.0.md)
⚠️ **`suggestion` prompt removed** — v1 removed the standalone `suggestion` prompt. Use `autocomplete` or the new `path` prompt (which is autocomplete-based) instead. [source](./@clack/prompts@1.0.0.md)
⚠️ **Placeholder not used as value** — `placeholder` is visual-only since v1, doesn't populate return value if user presses Enter without typing. Use `initialValue` for defaults. [source](./issue-321.md)
⚠️ **Long spinner messages wrap badly** — Messages near terminal width overflow and duplicate/misalign. Truncate messages or test in narrow terminals. [source](./issue-237.md)
⚠️ **Spinner doesn't auto-cleanup** — Spinner leaves process hanging if not properly stopped. Always call `stop()`, `cancel()`, or `error()` to cleanup stdin. [source](./issue-348.md)
⚠️ **Multiline option rendering buggy** — Options with 2+ lines show selection highlight in wrong places when navigating. Wrap long text or split into single lines. [source](./issue-116.md)
⚠️ **Settings now customizable globally** — Use `updateSettings({ messages: { cancel: '...', error: '...' } })` for i18n/multilingual CLIs, not just per-instance options. [source](./@clack/prompts@1.0.0.md)
⚠️ **New `userInput` separate from `value`** — Prompts now store `userInput` (raw user text) separately from `value` (processed). Existing code expecting single field works but loses raw input. [source](./@clack/prompts@1.0.0.md)
⚠️ **Progress/Spinner no longer auto-exit** — Must explicitly call `stop()` or the process hangs. Generators and async functions don't auto-stop on completion. [source](./issue-348.md)
# Best Practices
✅ Use `isCancel()` with all prompts to detect user cancellation — enables graceful Ctrl+C handling [source](./.skilld/pkg/README.md)
```ts
import { isCancel, cancel, text } from '@clack/prompts';
const value = await text({ message: 'Input:' });
if (isCancel(value)) {
cancel('Cancelled');
process.exit(0);
}
```
✅ Use `group()` with `onCancel` callback for multi-prompt flows — prevents partial state on interruption [source](./.skilld/pkg/README.md)
```ts
const results = await group({
name: () => text({ message: 'Name?' }),
email: ({ results }) => text({ message: `Email for ${results.name}?` }),
}, {
onCancel: () => {
cancel('Operation cancelled');
process.exit(0);
}
});
```
✅ Call `spinner.stop()`, `spinner.cancel()`, or `spinner.error()` explicitly — don't use legacy code parameter API [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```ts
const s = spinner();
s.start('Processing');
// ...
s.stop('Done'); // success
s.cancel('User cancelled'); // cancellation
s.error('Failed!'); // error
```
✅ Customize global messages via `updateSettings()` for multilingual CLIs — applies to all spinner instances [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```ts
import * as prompts from '@clack/prompts';
prompts.updateSettings({
messages: {
cancel: 'Operación cancelada',
error: 'Se produjo un error',
}
});
```
✅ Use `taskLog()` for subprocess output — automatically clears logs on success [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```ts
const log = taskLog({ title: 'Running npm install' });
for await (const line of npmProcess()) {
log.message(line);
}
log.success('Done!'); // clears all logged lines
```
✅ Pass custom `filter` to `autocompleteMultiselect` for fuzzy search — enables user-defined matching logic [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```ts
import { autocompleteMultiselect } from '@clack/prompts';
const selected = await autocompleteMultiselect({
message: 'Select packages:',
options: [...],
filter: (value, options) => {
// Custom fuzzy matching or filtering
return options.filter(opt => opt.label.includes(value));
}
});
```
✅ Use `progress()` with `max` and `advance()` for long operations — provides visual feedback on task completion [source](./.skilld/pkg/README.md)
```ts
const p = progress({ max: 100 });
p.start('Downloading');
for (let i = 0; i < 100; i += 10) {
await delay(100);
p.advance(i, `Progress: ${i}%`);
}
p.stop('Complete');
```
✅ Set `required: false` on `multiselect` and `autocompleteMultiselect` — allows zero selections [source](./.skilld/pkg/README.md)
```ts
const tools = await multiselect({
message: 'Additional tools (optional)?',
options: [...],
required: false, // allows []
});
```
✅ Use `selectableGroups: false` in `groupMultiselect` to disable group-level selection — still allows selecting all children [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```ts
const items = await groupMultiselect({
message: 'Select items:',
options: { fruits: [...], veggies: [...] },
selectableGroups: false, // can't select whole group, only items
});
```
✅ ESM-only in v1.0.0+ — use Node 20+ `--input-type=module` or conditional imports for CJS [source](./.skilld/releases/@clack/prompts@1.0.0.md)
```json
{
"type": "module",
"exports": "./dist/index.js"
}
```