pickem 0.0.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,49 @@
1
+ # Changelog
2
+
3
+ All notable changes to pickem will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.2.0] — 2026-05-09
9
+
10
+ ### Added
11
+
12
+ - `pickem.checkbox(items, opts) → Promise<V[]>` — multi-select with built-in
13
+ filter-as-you-type. Built on `@inquirer/core`. Space toggles, Enter submits,
14
+ Backspace removes filter chars, Esc clears the filter. Pinned items respect
15
+ the filter (stay pinned within filtered set). Checked items remain in the
16
+ result even if the filter hides them. Result is in source order, matching
17
+ `@inquirer/prompts/checkbox` semantics.
18
+ - `searchable?: boolean` option on both `pickem()` and `pickem.checkbox()`.
19
+ Default `true`. When `false`, falls back to the non-search prompts
20
+ (`@inquirer/prompts/select` and `/checkbox` respectively).
21
+ - `'checkbox'` step type for `wizard()`. `ctx[step.id]` receives `string[]`.
22
+ - `allowFreeText?: boolean` on `pickem.checkbox()`. When `true`, typing text
23
+ that matches nothing and pressing Enter appends the typed text to the list
24
+ as a checked item; the filter clears and the prompt stays open.
25
+ - `npm run demo` — interactive tour of every feature using `tsx`.
26
+ Uses `MemoryStorage` so demo runs don't pollute `~/.pickem/usage.json`.
27
+ - New direct dep: `@inquirer/core ^10.3.2` (was already pulled transitively
28
+ by `@inquirer/prompts`).
29
+ - New devDeps: `@inquirer/testing ^3.3.5` (custom prompt smoke-tests),
30
+ `tsx ^4.21.0` (demo runner).
31
+ - Public type exports: `CheckboxOptions`, `CheckboxStep`.
32
+
33
+ ### Changed
34
+
35
+ - **BREAKING**: default `badgeStyle` changed from `'bracket'` to `'none'`.
36
+ Items with a `group` no longer render `[group]` badges by default. Pass
37
+ `{ badgeStyle: 'bracket' }` or `{ badgeStyle: 'dot' }` to opt back in.
38
+ - `searchableCheckbox` toggle glyphs upgraded from `[ ]`/`[x]` to filled
39
+ circles (`○`/`●`, green when checked) with a cyan `❯` cursor. Matches
40
+ the Apple/iOS and `@inquirer/prompts` default visual style.
41
+ - `pickem()` single-select stats lookup no longer reaches into the tracker's
42
+ private `cache` field — uses the public `getStats()` method instead.
43
+ Fixes a latent issue when the tracker hadn't been loaded yet.
44
+ - `BadgeStyle` union now includes `'none'`.
45
+
46
+ ### Internal
47
+
48
+ - Extracted `resolveTrackOptions` to `src/internal/track.ts` (shared between
49
+ `pickem.ts` and `checkbox.ts`).
package/README.md CHANGED
@@ -8,6 +8,15 @@ Usage-sorted searchable autocomplete for CLI tools. One dependency-light module
8
8
  npm install pickem
9
9
  ```
10
10
 
11
+ ## Demo
12
+
13
+ An interactive tour of every feature ships with the repo:
14
+
15
+ ```bash
16
+ git clone https://github.com/calebogden/pickem
17
+ cd pickem && npm install && npm run demo
18
+ ```
19
+
11
20
  ## Quick Start
12
21
 
13
22
  ```typescript
@@ -20,6 +29,35 @@ const choice = await pickem([
20
29
  ])
21
30
  ```
22
31
 
32
+ ## Multi-select (checkbox)
33
+
34
+ `pickem.checkbox(items, opts)` returns `string[]` — the values of every checked item.
35
+
36
+ ```typescript
37
+ import { pickem } from 'pickem'
38
+
39
+ const choices = await pickem.checkbox([
40
+ { label: 'Deploy', value: 'deploy' },
41
+ { label: 'Test', value: 'test' },
42
+ { label: 'Lint', value: 'lint' },
43
+ ], { message: 'Which steps?', defaultChecked: ['test'] })
44
+ // => ['deploy', 'test']
45
+ ```
46
+
47
+ Key bindings: Space toggles a selection, Enter submits, type to filter, Esc clears the filter, Backspace removes filter characters.
48
+
49
+ Pass `searchable: false` to fall back to the standard `@inquirer/prompts` checkbox (no search bar):
50
+
51
+ ```typescript
52
+ const choices = await pickem.checkbox(items, { searchable: false })
53
+ ```
54
+
55
+ Pass `{ allowFreeText: true }` to let the user add ad-hoc entries: type text that doesn't match any item, press Enter, and the typed text is appended to the list as a checked item. The filter clears and the prompt stays open so they can keep toggling or add more.
56
+
57
+ ```typescript
58
+ const tags = await pickem.checkbox(KNOWN_TAGS, { allowFreeText: true })
59
+ ```
60
+
23
61
  ## Usage Tracking
24
62
 
25
63
  Items sort by how often they're used. Enable with `track: true`:
@@ -50,7 +88,7 @@ const npm = defineSource('npm', async () => [
50
88
  ])
51
89
 
52
90
  const choice = await pickem.from([scripts, npm], { track: true })
53
- // Items get group badges: [scripts], [npm]
91
+ // Items get group badges when badgeStyle is set: [scripts], [npm]
54
92
  ```
55
93
 
56
94
  ## Wizard Flows
@@ -76,6 +114,7 @@ const result = await wizard([
76
114
  | Type | Purpose |
77
115
  |------|---------|
78
116
  | `pick` | Searchable usage-sorted selection |
117
+ | `checkbox` | Searchable multi-select, returns an array |
79
118
  | `select` | Simple choice list |
80
119
  | `input` | Free text entry |
81
120
  | `confirm` | Yes/no |
@@ -104,16 +143,36 @@ await pickem(items, {
104
143
  message: 'Pick one:', // Prompt message
105
144
  pageSize: 15, // Visible items
106
145
  track: true | TrackOptions, // Enable usage tracking
146
+ searchable: true, // Set false to skip the search bar (falls back to select)
107
147
  searchFields: ['label', 'description'], // Fields to search (dot-notation for meta)
108
148
  search: (item, term) => boolean, // Custom search function
109
149
  format: (item, stats) => string, // Custom display formatter
110
- badgeStyle: 'bracket' | 'dot' | fn, // Group badge style
150
+ badgeStyle: 'none' | 'bracket' | 'dot' | fn, // Group badge style (default: 'none')
111
151
  badgeColors: { npm: 'red' }, // Badge color overrides
112
152
  sort: (a, b) => number, // Tiebreaker after usage sort
113
153
  onSelect: (item) => {}, // Post-selection callback
154
+ allowFreeText: true, // Surface unmatched input as a selectable option
114
155
  })
115
156
  ```
116
157
 
158
+ `pickem.checkbox` accepts the same options, plus:
159
+
160
+ ```typescript
161
+ await pickem.checkbox(items, {
162
+ required: false, // Require at least one selection before Enter submits
163
+ defaultChecked: ['test'], // Pre-checked values
164
+ allowFreeText: true, // Type unmatched text + Enter to add as a checked item
165
+ })
166
+ ```
167
+
168
+ ### `badgeStyle` default changed in v0.2.0
169
+
170
+ The default `badgeStyle` is now `'none'` — group labels are hidden unless you opt in. This is a breaking change if your code relied on the old default of `'bracket'`. To restore the previous behavior:
171
+
172
+ ```typescript
173
+ await pickem(items, { badgeStyle: 'bracket' })
174
+ ```
175
+
117
176
  ## Requirements
118
177
 
119
178
  - Node >= 18
package/checkbox.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { CheckboxOptions, PickItem } from './types.js';
2
+ export declare function checkbox<V = string>(items: PickItem<V>[], options?: CheckboxOptions<V>): Promise<V[]>;
3
+ //# sourceMappingURL=checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../src/checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAA;AAQvE,wBAAsB,QAAQ,CAAC,CAAC,GAAG,MAAM,EACvC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,eAAe,CAAC,CAAC,CAAM,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC,CAuEd"}
package/checkbox.js ADDED
@@ -0,0 +1,76 @@
1
+ import { checkbox as standardCheckbox } from '@inquirer/prompts';
2
+ import { UsageTracker } from './usage/tracker.js';
3
+ import { createFormatter } from './display/format.js';
4
+ import { createSearchFn } from './search/search.js';
5
+ import { resolveTrackOptions } from './internal/track.js';
6
+ import { searchableCheckbox } from './prompt/searchable-checkbox.js';
7
+ export async function checkbox(items, options = {}) {
8
+ const trackOpts = resolveTrackOptions(options.track);
9
+ const tracker = trackOpts ? new UsageTracker(trackOpts) : null;
10
+ const keyFn = trackOpts?.key ?? ((item) => item.label);
11
+ let sorted;
12
+ if (tracker) {
13
+ sorted = await tracker.sortItems(items, keyFn, options.sort);
14
+ }
15
+ else if (options.sort) {
16
+ sorted = [...items].sort(options.sort);
17
+ }
18
+ else {
19
+ sorted = items;
20
+ }
21
+ const formatFn = options.format ??
22
+ createFormatter({
23
+ badgeStyle: options.badgeStyle,
24
+ badgeColors: options.badgeColors,
25
+ });
26
+ const searchFn = options.search ?? createSearchFn(options.searchFields);
27
+ const statsMap = new Map();
28
+ if (tracker) {
29
+ for (const item of sorted) {
30
+ statsMap.set(item.value, await tracker.getStats(keyFn(item)));
31
+ }
32
+ }
33
+ // Build a value→item map once for O(n) post-submit lookups
34
+ const valueToItem = new Map(sorted.map((item) => [item.value, item]));
35
+ const useSearchable = options.searchable !== false;
36
+ let result;
37
+ if (useSearchable) {
38
+ result = await searchableCheckbox({
39
+ message: options.message ?? 'Pick:',
40
+ items: sorted,
41
+ pageSize: options.pageSize ?? 15,
42
+ required: options.required ?? false,
43
+ defaultChecked: options.defaultChecked ?? [],
44
+ allowFreeText: options.allowFreeText ?? false,
45
+ searchFn,
46
+ formatFn,
47
+ usageStats: tracker ? statsMap : null,
48
+ });
49
+ }
50
+ else {
51
+ const defaultCheckedSet = new Set(options.defaultChecked ?? []);
52
+ result = await standardCheckbox({
53
+ message: options.message ?? 'Pick:',
54
+ pageSize: options.pageSize ?? 15,
55
+ required: options.required ?? false,
56
+ choices: sorted.map((item) => ({
57
+ name: formatFn(item, statsMap.get(item.value) ?? null),
58
+ value: item.value,
59
+ checked: defaultCheckedSet.has(item.value),
60
+ description: undefined, // We handle description in formatFn
61
+ })),
62
+ });
63
+ }
64
+ // Single combined pass — track usage and fire onSelect for each selected item
65
+ for (const v of result) {
66
+ const item = valueToItem.get(v);
67
+ if (!item)
68
+ continue;
69
+ if (tracker)
70
+ await tracker.track(keyFn(item), trackOpts?.source);
71
+ if (options.onSelect)
72
+ await options.onSelect(item);
73
+ }
74
+ return result;
75
+ }
76
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../src/checkbox.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,7 @@
1
1
  import type { PickItem, UsageStats } from '../types.js';
2
- type BadgeStyle = 'bracket' | 'dot' | ((group: string) => string);
3
2
  export interface FormatOptions {
4
- badgeStyle?: BadgeStyle;
3
+ badgeStyle?: 'none' | 'bracket' | 'dot' | ((group: string) => string);
5
4
  badgeColors?: Record<string, string>;
6
5
  }
7
6
  export declare function createFormatter<V>(options?: FormatOptions): (item: PickItem<V>, stats: UsageStats | null) => string;
8
- export {};
9
7
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvD,KAAK,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;AAsDjE,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,GAAE,aAAkB,GAC1B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAoBzD"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAsDvD,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAA;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,OAAO,GAAE,aAAkB,GAC1B,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAoBzD"}
package/display/format.js CHANGED
@@ -8,13 +8,7 @@ const ANSI = {
8
8
  magenta: '\x1b[35m',
9
9
  gray: '\x1b[90m',
10
10
  };
11
- const DEFAULT_BADGE_COLORS = {
12
- npm: 'red',
13
- script: 'blue',
14
- builtin: 'green',
15
- workflow: 'magenta',
16
- tool: 'yellow',
17
- };
11
+ const DEFAULT_BADGE_COLORS = {};
18
12
  function colorize(text, color) {
19
13
  const code = ANSI[color] ?? ANSI.gray;
20
14
  return `${code}${text}${ANSI.reset}`;
@@ -26,6 +20,9 @@ function renderBadge(group, style, colors) {
26
20
  if (typeof style === 'function') {
27
21
  return style(group);
28
22
  }
23
+ if (style === 'none') {
24
+ return '';
25
+ }
29
26
  const color = colors[group] ?? 'gray';
30
27
  if (style === 'dot') {
31
28
  return colorize('●', color) + ' ';
@@ -39,7 +36,7 @@ function renderUsageCount(count) {
39
36
  return dim(` (${count})`);
40
37
  }
41
38
  export function createFormatter(options = {}) {
42
- const style = options.badgeStyle ?? 'bracket';
39
+ const style = options.badgeStyle ?? 'none';
43
40
  const colors = { ...DEFAULT_BADGE_COLORS, ...options.badgeColors };
44
41
  return (item, stats) => {
45
42
  let result = '';
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAIA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACR,CAAA;AAEV,MAAM,oBAAoB,GAAsC;IAC9D,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,QAAQ;CACf,CAAA;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAA0B,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;IAC1D,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAAiB,EACjB,MAA8B;IAE9B,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA;IAErC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;IACnC,CAAC;IAED,oBAAoB;IACpB,OAAO,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAA;AAC3B,CAAC;AAOD,MAAM,UAAU,eAAe,CAC7B,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,SAAS,CAAA;IAC7C,MAAM,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAElE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/display/format.ts"],"names":[],"mappings":"AAIA,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;CACR,CAAA;AAEV,MAAM,oBAAoB,GAAsC,EAAE,CAAA;AAElE,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAA0B,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;IAC1D,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AACtC,CAAC;AAED,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;AAC1C,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAAiB,EACjB,MAA8B;IAE9B,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA;IAErC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;IACnC,CAAC;IAED,oBAAoB;IACpB,OAAO,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;AAC5C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAA;AAC3B,CAAC;AAOD,MAAM,UAAU,eAAe,CAC7B,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IAElE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,KAAK,CAAA;QACpB,MAAM,IAAI,gBAAgB,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QAE7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
package/index.d.ts CHANGED
@@ -6,5 +6,5 @@ export { sortByUsage } from './usage/sort.js';
6
6
  export { defineSource, loadSources } from './source/source.js';
7
7
  export { createSearchFn } from './search/search.js';
8
8
  export { createFormatter } from './display/format.js';
9
- export type { PickItem, PickOptions, TrackOptions, UsageStats, UsageRecord, UsageData, UsageStorage, Source, WizardContext, WizardStep, PickStep, SelectStep, InputStep, ConfirmStep, BranchStep, SelectChoice, } from './types.js';
9
+ export type { PickItem, PickOptions, CheckboxOptions, TrackOptions, UsageStats, UsageRecord, UsageData, UsageStorage, Source, WizardContext, WizardStep, PickStep, CheckboxStep, SelectStep, InputStep, ConfirmStep, BranchStep, SelectChoice, } from './types.js';
10
10
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,YAAY,EACV,QAAQ,EACR,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,YAAY,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { TrackOptions } from '../types.js';
2
+ export declare function resolveTrackOptions(track: boolean | TrackOptions | undefined): TrackOptions | null;
3
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/internal/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAIlG"}
@@ -0,0 +1,8 @@
1
+ export function resolveTrackOptions(track) {
2
+ if (!track)
3
+ return null;
4
+ if (track === true)
5
+ return {};
6
+ return track;
7
+ }
8
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/internal/track.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,KAAyC;IAC3E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAC7B,OAAO,KAAK,CAAA;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pickem",
3
- "version": "0.0.4",
3
+ "version": "0.2.0",
4
4
  "description": "Usage-sorted searchable autocomplete for CLI tools",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -11,6 +11,7 @@
11
11
  "types": "./index.d.ts"
12
12
  }
13
13
  },
14
+ "sideEffects": false,
14
15
  "keywords": [
15
16
  "cli",
16
17
  "autocomplete",
@@ -20,11 +21,24 @@
20
21
  "picker",
21
22
  "wizard"
22
23
  ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/calebogden/pickem.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/calebogden/pickem/issues"
30
+ },
31
+ "homepage": "https://github.com/calebogden/pickem#readme",
32
+ "author": "Caleb Ogden <co@ogden.co>",
23
33
  "license": "MIT",
24
34
  "engines": {
25
35
  "node": ">=18"
26
36
  },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
27
40
  "dependencies": {
41
+ "@inquirer/core": "^10.3.2",
28
42
  "@inquirer/prompts": "^7.0.0"
29
43
  }
30
44
  }
package/pickem.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { PickItem, PickOptions, Source } from './types.js';
2
+ import { checkbox } from './checkbox.js';
2
3
  declare function pick<V = string>(items: PickItem<V>[], options?: PickOptions<V>): Promise<V>;
3
4
  /**
4
5
  * Pick from multiple sources loaded in parallel.
@@ -6,6 +7,7 @@ declare function pick<V = string>(items: PickItem<V>[], options?: PickOptions<V>
6
7
  declare function pickFrom<V = string>(sources: Source<V>[], options?: PickOptions<V>): Promise<V>;
7
8
  declare const pickem: typeof pick & {
8
9
  from: typeof pickFrom;
10
+ checkbox: typeof checkbox;
9
11
  };
10
12
  export { pickem };
11
13
  //# sourceMappingURL=pickem.d.ts.map
package/pickem.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pickem.d.ts","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAA;AAY7E,iBAAe,IAAI,CAAC,CAAC,GAAG,MAAM,EAC5B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CA6DZ;AAED;;GAEG;AACH,iBAAe,QAAQ,CAAC,CAAC,GAAG,MAAM,EAChC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CAGZ;AAGD,QAAA,MAAM,MAAM;;CAA0C,CAAA;AAEtD,OAAO,EAAE,MAAM,EAAE,CAAA"}
1
+ {"version":3,"file":"pickem.d.ts","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAOxC,iBAAe,IAAI,CAAC,CAAC,GAAG,MAAM,EAC5B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CA4EZ;AAED;;GAEG;AACH,iBAAe,QAAQ,CAAC,CAAC,GAAG,MAAM,EAChC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,GAC3B,OAAO,CAAC,CAAC,CAAC,CAGZ;AAGD,QAAA,MAAM,MAAM;;;CAAoD,CAAA;AAEhE,OAAO,EAAE,MAAM,EAAE,CAAA"}
package/pickem.js CHANGED
@@ -1,20 +1,14 @@
1
- import { search } from '@inquirer/prompts';
1
+ import { search, select } from '@inquirer/prompts';
2
+ import { checkbox } from './checkbox.js';
2
3
  import { UsageTracker } from './usage/tracker.js';
3
4
  import { createSearchFn } from './search/search.js';
4
5
  import { createFormatter } from './display/format.js';
5
6
  import { loadSources } from './source/source.js';
6
- function resolveTrackOptions(track) {
7
- if (!track)
8
- return null;
9
- if (track === true)
10
- return {};
11
- return track;
12
- }
7
+ import { resolveTrackOptions } from './internal/track.js';
13
8
  async function pick(items, options = {}) {
14
9
  const trackOpts = resolveTrackOptions(options.track);
15
10
  const tracker = trackOpts ? new UsageTracker(trackOpts) : null;
16
11
  const keyFn = trackOpts?.key ?? ((item) => item.label);
17
- // Sort by usage
18
12
  let sorted;
19
13
  if (tracker) {
20
14
  sorted = await tracker.sortItems(items, keyFn, options.sort);
@@ -25,44 +19,54 @@ async function pick(items, options = {}) {
25
19
  else {
26
20
  sorted = items;
27
21
  }
28
- // Search function
29
22
  const searchFn = options.search ?? createSearchFn(options.searchFields);
30
- // Formatter
31
23
  const formatFn = options.format ??
32
24
  createFormatter({
33
25
  badgeStyle: options.badgeStyle,
34
26
  badgeColors: options.badgeColors,
35
27
  });
36
- const result = await search({
37
- message: options.message ?? 'Pick one:',
38
- pageSize: options.pageSize ?? 15,
39
- source: async (term) => {
40
- const filtered = term ? sorted.filter((item) => searchFn(item, term)) : sorted;
41
- return filtered.map((item) => {
42
- const stats = tracker
43
- ? { count: 0, lastUsed: 0, ...tracker.cache?.[keyFn(item)] }
44
- : null;
45
- return {
46
- name: formatFn(item, stats),
28
+ const statsFor = async (item) => tracker ? await tracker.getStats(keyFn(item)) : null;
29
+ let result;
30
+ if (options.searchable === false) {
31
+ const choices = await Promise.all(sorted.map(async (item) => ({
32
+ name: formatFn(item, await statsFor(item)),
33
+ value: item.value,
34
+ description: item.description,
35
+ })));
36
+ result = await select({
37
+ message: options.message ?? 'Pick one:',
38
+ pageSize: options.pageSize ?? 15,
39
+ choices,
40
+ });
41
+ }
42
+ else {
43
+ result = await search({
44
+ message: options.message ?? 'Pick one:',
45
+ pageSize: options.pageSize ?? 15,
46
+ source: async (term) => {
47
+ const filtered = term ? sorted.filter((item) => searchFn(item, term)) : sorted;
48
+ if (options.allowFreeText && term && !filtered.length) {
49
+ return [{ name: term, value: term, description: undefined }];
50
+ }
51
+ return Promise.all(filtered.map(async (item) => ({
52
+ name: formatFn(item, await statsFor(item)),
47
53
  value: item.value,
48
- description: undefined, // We handle description in formatFn
49
- };
50
- });
51
- },
52
- });
54
+ description: undefined,
55
+ })));
56
+ },
57
+ });
58
+ }
53
59
  // Track usage
54
60
  if (tracker) {
55
61
  const selected = sorted.find((item) => item.value === result);
56
- if (selected) {
62
+ if (selected)
57
63
  await tracker.track(keyFn(selected), trackOpts?.source);
58
- }
59
64
  }
60
65
  // onSelect callback
61
66
  if (options.onSelect) {
62
67
  const selected = sorted.find((item) => item.value === result);
63
- if (selected) {
68
+ if (selected)
64
69
  await options.onSelect(selected);
65
- }
66
70
  }
67
71
  return result;
68
72
  }
@@ -74,6 +78,6 @@ async function pickFrom(sources, options = {}) {
74
78
  return pick(items, options);
75
79
  }
76
80
  // Attach .from as a method
77
- const pickem = Object.assign(pick, { from: pickFrom });
81
+ const pickem = Object.assign(pick, { from: pickFrom, checkbox });
78
82
  export { pickem };
79
83
  //# sourceMappingURL=pickem.js.map
package/pickem.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pickem.js","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pickem.js","sourceRoot":"","sources":["../src/pickem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PickItem, UsageStats } from '../types.js';
2
+ export interface SearchableCheckboxConfig<V = string> {
3
+ message: string;
4
+ items: PickItem<V>[];
5
+ pageSize: number;
6
+ required: boolean;
7
+ defaultChecked: V[];
8
+ allowFreeText: boolean;
9
+ searchFn: (item: PickItem<V>, term: string) => boolean;
10
+ formatFn: (item: PickItem<V>, stats: UsageStats | null) => string;
11
+ usageStats: Map<V, UsageStats | null> | null;
12
+ }
13
+ export declare const searchableCheckbox: <V>(config: {
14
+ message: string;
15
+ items: PickItem<V>[];
16
+ pageSize: number;
17
+ required: boolean;
18
+ defaultChecked: V[];
19
+ allowFreeText: boolean;
20
+ searchFn: (item: PickItem<V>, term: string) => boolean;
21
+ formatFn: (item: PickItem<V>, stats: UsageStats | null) => string;
22
+ usageStats: Map<V, UsageStats | null> | null;
23
+ }, context?: import("@inquirer/type").Context) => Promise<V[]> & {
24
+ cancel: () => void;
25
+ };
26
+ //# sourceMappingURL=searchable-checkbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-checkbox.d.ts","sourceRoot":"","sources":["../../src/prompt/searchable-checkbox.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,MAAM;IAClD,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,CAAC,EAAE,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,MAAM,CAAA;IACjE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;CAC7C;AAgCD,eAAO,MAAM,kBAAkB,GAC5B,CAAC;aA1CO,MAAM;;cAEL,MAAM;cACN,OAAO;;mBAEF,OAAO;wCACc,MAAM,KAAK,OAAO;yCACjB,UAAU,GAAG,IAAI,KAAK,MAAM;;;;CAoMlE,CAAA"}
@@ -0,0 +1,173 @@
1
+ import { createPrompt, useState, useKeypress, useMemo, usePrefix, usePagination, isUpKey, isDownKey, isSpaceKey, isEnterKey, isBackspaceKey, } from '@inquirer/core';
2
+ const ANSI = {
3
+ reset: '\x1b[0m',
4
+ dim: '\x1b[2m',
5
+ red: '\x1b[31m',
6
+ green: '\x1b[32m',
7
+ cyan: '\x1b[36m',
8
+ bold: '\x1b[1m',
9
+ };
10
+ const dim = (s) => `${ANSI.dim}${s}${ANSI.reset}`;
11
+ const red = (s) => `${ANSI.red}${s}${ANSI.reset}`;
12
+ const green = (s) => `${ANSI.green}${s}${ANSI.reset}`;
13
+ const cyan = (s) => `${ANSI.cyan}${s}${ANSI.reset}`;
14
+ const bold = (s) => `${ANSI.bold}${s}${ANSI.reset}`;
15
+ function reorderByPin(items) {
16
+ const first = [];
17
+ const last = [];
18
+ const middle = [];
19
+ for (const it of items) {
20
+ if (it.pin === 'first')
21
+ first.push(it);
22
+ else if (it.pin === 'last')
23
+ last.push(it);
24
+ else
25
+ middle.push(it);
26
+ }
27
+ return [...first, ...middle, ...last];
28
+ }
29
+ function isEscapeKey(key) {
30
+ return key.name === 'escape';
31
+ }
32
+ export const searchableCheckbox = createPrompt((config, done) => {
33
+ const [status, setStatus] = useState('idle');
34
+ const [filter, setFilter] = useState('');
35
+ const [cursor, setCursor] = useState(0);
36
+ const [checked, setChecked] = useState(new Set(config.defaultChecked));
37
+ const [extras, setExtras] = useState([]);
38
+ const [error, setError] = useState(undefined);
39
+ const view = useMemo(() => {
40
+ const all = extras.length > 0 ? [...config.items, ...extras] : config.items;
41
+ const filtered = filter
42
+ ? all.filter((it) => config.searchFn(it, filter))
43
+ : all;
44
+ return reorderByPin(filtered);
45
+ }, [filter, config.items, extras]);
46
+ const prefix = usePrefix({ status });
47
+ useKeypress((key, rl) => {
48
+ if (status === 'done')
49
+ return;
50
+ if (isEnterKey(key)) {
51
+ // Free-text path: filter has text, no matches, allowFreeText is on
52
+ if (config.allowFreeText && filter.length > 0 && view.length === 0) {
53
+ // Skip dedupe: if the typed text already exists as an extra, just clear filter
54
+ const existing = extras.find((it) => it.value === filter);
55
+ if (existing) {
56
+ const nextChecked = new Set(checked);
57
+ nextChecked.add(existing.value);
58
+ setChecked(nextChecked);
59
+ setFilter('');
60
+ setCursor(0);
61
+ setError(undefined);
62
+ rl.clearLine(0);
63
+ return;
64
+ }
65
+ const newItem = { label: filter, value: filter };
66
+ setExtras([...extras, newItem]);
67
+ const nextChecked = new Set(checked);
68
+ nextChecked.add(newItem.value);
69
+ setChecked(nextChecked);
70
+ setFilter('');
71
+ setCursor(0);
72
+ setError(undefined);
73
+ rl.clearLine(0);
74
+ return;
75
+ }
76
+ if (config.required && checked.size === 0) {
77
+ setError('At least one item must be selected.');
78
+ return;
79
+ }
80
+ setStatus('done');
81
+ done([...config.items, ...extras]
82
+ .filter((it) => checked.has(it.value))
83
+ .map((it) => it.value));
84
+ return;
85
+ }
86
+ if (isSpaceKey(key)) {
87
+ if (view.length === 0)
88
+ return;
89
+ const item = view[cursor];
90
+ const next = new Set(checked);
91
+ if (next.has(item.value))
92
+ next.delete(item.value);
93
+ else
94
+ next.add(item.value);
95
+ setChecked(next);
96
+ setError(undefined);
97
+ // Space is also a printable char in readline; restore the filter buffer
98
+ // so the space doesn't get treated as filter input.
99
+ rl.clearLine(0);
100
+ if (filter)
101
+ rl.write(filter);
102
+ return;
103
+ }
104
+ if (isUpKey(key)) {
105
+ if (view.length === 0)
106
+ return;
107
+ setCursor((cursor - 1 + view.length) % view.length);
108
+ return;
109
+ }
110
+ if (isDownKey(key)) {
111
+ if (view.length === 0)
112
+ return;
113
+ setCursor((cursor + 1) % view.length);
114
+ return;
115
+ }
116
+ if (isBackspaceKey(key)) {
117
+ if (filter.length > 0) {
118
+ const next = filter.slice(0, -1);
119
+ setFilter(next);
120
+ setCursor(0);
121
+ // Sync readline buffer with our filter string.
122
+ rl.clearLine(0);
123
+ if (next)
124
+ rl.write(next);
125
+ }
126
+ return;
127
+ }
128
+ if (isEscapeKey(key)) {
129
+ if (filter.length > 0) {
130
+ setFilter('');
131
+ setCursor(0);
132
+ rl.clearLine(0);
133
+ }
134
+ return;
135
+ }
136
+ // Printable char: readline already updated rl.line
137
+ if (rl.line !== filter) {
138
+ setFilter(rl.line);
139
+ setCursor(0);
140
+ setError(undefined);
141
+ }
142
+ });
143
+ if (status === 'done') {
144
+ const labels = [...config.items, ...extras]
145
+ .filter((it) => checked.has(it.value))
146
+ .map((it) => it.label)
147
+ .join(', ');
148
+ return `${prefix} ${config.message} ${labels || '(none)'}`;
149
+ }
150
+ const header = `${prefix} ${config.message}${filter ? ` ${filter}_` : ' _'} ${dim(`(${view.length} shown, ${checked.size} selected)`)}`;
151
+ if (view.length === 0) {
152
+ return `${header}\n ${dim('(no matches)')}${error ? `\n ${red(error)}` : ''}`;
153
+ }
154
+ const renderItem = ({ item, index, }) => {
155
+ const isCursor = index === cursor;
156
+ const isChecked = checked.has(item.value);
157
+ const box = isChecked ? green('●') : '○';
158
+ const pointer = isCursor ? cyan('❯') : ' ';
159
+ const stats = config.usageStats?.get(item.value) ?? null;
160
+ const label = config.formatFn(item, stats);
161
+ const line = `${pointer} ${box} ${label}`;
162
+ return isCursor ? bold(line) : line;
163
+ };
164
+ const page = usePagination({
165
+ items: view,
166
+ active: cursor,
167
+ renderItem,
168
+ pageSize: config.pageSize,
169
+ loop: true,
170
+ });
171
+ return `${header}\n${page}${error ? `\n ${red(error)}` : ''}`;
172
+ });
173
+ //# sourceMappingURL=searchable-checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-checkbox.js","sourceRoot":"","sources":["../../src/prompt/searchable-checkbox.ts"],"names":[],"mappings":"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"}
package/types.d.ts CHANGED
@@ -3,6 +3,7 @@ export interface PickItem<V = string> {
3
3
  value: V;
4
4
  description?: string;
5
5
  group?: string;
6
+ pin?: 'first' | 'last';
6
7
  meta?: Record<string, any>;
7
8
  searchText?: string;
8
9
  }
@@ -13,10 +14,27 @@ export interface PickOptions<V = string> {
13
14
  searchFields?: string[];
14
15
  search?: (item: PickItem<V>, term: string) => boolean;
15
16
  format?: (item: PickItem<V>, stats: UsageStats | null) => string;
16
- badgeStyle?: 'bracket' | 'dot' | ((group: string) => string);
17
+ badgeStyle?: 'none' | 'bracket' | 'dot' | ((group: string) => string);
17
18
  badgeColors?: Record<string, string>;
18
19
  sort?: (a: PickItem<V>, b: PickItem<V>) => number;
19
20
  onSelect?: (item: PickItem<V>) => void | Promise<void>;
21
+ /** When true, surface typed text as a selectable option when no results match */
22
+ allowFreeText?: boolean;
23
+ /** When false, falls back to a non-search select prompt. Default true. */
24
+ searchable?: boolean;
25
+ }
26
+ export interface CheckboxOptions<V = string> extends PickOptions<V> {
27
+ /** Require at least one selection before Enter submits. Default false. */
28
+ required?: boolean;
29
+ /** Pre-checked values. */
30
+ defaultChecked?: V[];
31
+ /**
32
+ * When true, typing text that matches no existing items and pressing Enter
33
+ * appends the typed text as a new checked item; the filter clears and the
34
+ * prompt stays open so the user can continue. Multi-select Enter normally
35
+ * submits; allowFreeText overloads Enter only when there are zero matches.
36
+ */
37
+ allowFreeText?: boolean;
20
38
  }
21
39
  export interface TrackOptions {
22
40
  storePath?: string;
@@ -48,7 +66,7 @@ export interface Source<V = string> {
48
66
  export interface WizardContext {
49
67
  [key: string]: any;
50
68
  }
51
- export type WizardStep<V = string> = PickStep<V> | SelectStep | InputStep | ConfirmStep | BranchStep;
69
+ export type WizardStep<V = string> = PickStep<V> | CheckboxStep<V> | SelectStep | InputStep | ConfirmStep | BranchStep;
52
70
  interface BaseStep {
53
71
  id: string;
54
72
  when?: (ctx: WizardContext) => boolean | Promise<boolean>;
@@ -60,6 +78,12 @@ export interface PickStep<V = string> extends BaseStep {
60
78
  items: PickItem<V>[] | ((ctx: WizardContext) => PickItem<V>[] | Promise<PickItem<V>[]>);
61
79
  options?: Omit<PickOptions<V>, 'message'>;
62
80
  }
81
+ export interface CheckboxStep<V = string> extends BaseStep {
82
+ type: 'checkbox';
83
+ message?: string;
84
+ items: PickItem<V>[] | ((ctx: WizardContext) => PickItem<V>[] | Promise<PickItem<V>[]>);
85
+ options?: Omit<CheckboxOptions<V>, 'message'>;
86
+ }
63
87
  export interface SelectStep extends BaseStep {
64
88
  type: 'select';
65
89
  message?: string;
package/types.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/usage/sort.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { PickItem, UsageData } from '../types.js';
2
2
  /**
3
- * 3-tier sort: count desc → lastUsed desc → label alpha.
3
+ * 4-tier sort: pin → count desc → lastUsed desc → tiebreaker → label alpha.
4
+ * Pinned items always sort first/last regardless of usage.
4
5
  * Items with no usage data sort after items with usage.
5
6
  */
6
7
  export declare function sortByUsage<V>(items: PickItem<V>[], usage: UsageData, keyFn?: (item: PickItem<V>) => string, tiebreaker?: (a: PickItem<V>, b: PickItem<V>) => number): PickItem<V>[];
@@ -1 +1 @@
1
- {"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../src/usage/sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEtD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,KAAK,EAAE,SAAS,EAChB,KAAK,GAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,MAA6B,EAC3D,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,GACtD,QAAQ,CAAC,CAAC,CAAC,EAAE,CA0Bf"}
1
+ {"version":3,"file":"sort.d.ts","sourceRoot":"","sources":["../../src/usage/sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,KAAK,EAAE,SAAS,EAChB,KAAK,GAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,MAA6B,EAC3D,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,GACtD,QAAQ,CAAC,CAAC,CAAC,EAAE,CAqCf"}
package/usage/sort.js CHANGED
@@ -1,9 +1,24 @@
1
1
  /**
2
- * 3-tier sort: count desc → lastUsed desc → label alpha.
2
+ * 4-tier sort: pin → count desc → lastUsed desc → tiebreaker → label alpha.
3
+ * Pinned items always sort first/last regardless of usage.
3
4
  * Items with no usage data sort after items with usage.
4
5
  */
5
6
  export function sortByUsage(items, usage, keyFn = (item) => item.label, tiebreaker) {
6
7
  return [...items].sort((a, b) => {
8
+ // Pin takes absolute priority
9
+ const aPin = a.pin;
10
+ const bPin = b.pin;
11
+ if (aPin !== bPin) {
12
+ if (aPin === 'first')
13
+ return -1;
14
+ if (bPin === 'first')
15
+ return 1;
16
+ if (aPin === 'last')
17
+ return 1;
18
+ if (bPin === 'last')
19
+ return -1;
20
+ }
21
+ // Both pinned the same direction (or neither pinned) — continue to usage sort
7
22
  const aKey = keyFn(a);
8
23
  const bKey = keyFn(b);
9
24
  const aUsage = usage[aKey];
package/usage/sort.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/usage/sort.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,KAAoB,EACpB,KAAgB,EAChB,QAAuC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAC3D,UAAuD;IAEvD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,CAAA;QAEjC,mBAAmB;QACnB,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAA;QAE7C,uBAAuB;QACvB,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAA;QACnC,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,GAAG,KAAK,CAAA;QAEzC,oBAAoB;QACpB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC5B,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAA;QAC3B,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/usage/sort.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,KAAoB,EACpB,KAAgB,EAChB,QAAuC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAC3D,UAAuD;IAEvD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,8BAA8B;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAA;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAA;QAClB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,CAAC,CAAC,CAAA;YAC/B,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,CAAC,CAAA;YAC9B,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAA;YAC7B,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAC,CAAA;QAChC,CAAC;QACD,8EAA8E;QAE9E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,CAAA;QACjC,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,CAAA;QAEjC,mBAAmB;QACnB,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAA;QAE7C,uBAAuB;QACvB,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAA;QACnC,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,KAAK,GAAG,KAAK,CAAA;QAEzC,oBAAoB;QACpB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC5B,IAAI,GAAG,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAA;QAC3B,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC"}
package/wizard.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAMX,MAAM,YAAY,CAAA;AA8FnB,wBAAsB,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAClE,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,GAAE,OAAO,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAOX,MAAM,YAAY,CAAA;AA2GnB,wBAAsB,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAClE,KAAK,EAAE,UAAU,EAAE,EACnB,cAAc,GAAE,OAAO,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
package/wizard.js CHANGED
@@ -7,6 +7,13 @@ async function executePick(step, ctx) {
7
7
  ...step.options,
8
8
  });
9
9
  }
10
+ async function executeCheckbox(step, ctx) {
11
+ const items = typeof step.items === 'function' ? await step.items(ctx) : step.items;
12
+ return pickem.checkbox(items, {
13
+ message: step.message,
14
+ ...step.options,
15
+ });
16
+ }
10
17
  async function executeSelect(step, ctx) {
11
18
  const choices = typeof step.choices === 'function' ? await step.choices(ctx) : step.choices;
12
19
  return select({
@@ -49,6 +56,9 @@ async function executeStep(step, ctx) {
49
56
  case 'pick':
50
57
  ctx[step.id] = await executePick(step, ctx);
51
58
  break;
59
+ case 'checkbox':
60
+ ctx[step.id] = await executeCheckbox(step, ctx);
61
+ break;
52
62
  case 'select':
53
63
  ctx[step.id] = await executeSelect(step, ctx);
54
64
  break;
package/wizard.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}