tuner-cli 2026.4.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/input/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ let active = null;
2
+ function menuLines(s) {
3
+ return [
4
+ s.title,
5
+ ...s.items.map((item, i) => i === s.selected ? ` ▸ ${s.label(item, i)}` : ` ${s.label(item, i)}`),
6
+ ' [↑/↓] select · [→/Enter] pick · [←/Esc] back',
7
+ ];
8
+ }
9
+ function redraw(s) {
10
+ const lines = menuLines(s);
11
+ if (s.firstDraw) {
12
+ s.stdout.write('\n');
13
+ s.firstDraw = false;
14
+ }
15
+ else if (lines.length > 1) {
16
+ s.stdout.write(`\x1b[${lines.length - 1}A\r`);
17
+ }
18
+ for (let i = 0; i < lines.length; i++) {
19
+ s.stdout.write(`\x1b[K${lines[i]}`);
20
+ if (i < lines.length - 1) {
21
+ s.stdout.write('\n');
22
+ }
23
+ }
24
+ }
25
+ function eraseMenuBelowTuner(stdout, menuLineCount) {
26
+ if (menuLineCount < 1)
27
+ return;
28
+ stdout.write(`\x1b[${menuLineCount}A\r`);
29
+ for (let j = 0; j < menuLineCount; j++) {
30
+ stdout.write('\n\x1b[K');
31
+ }
32
+ stdout.write(`\x1b[${menuLineCount}A\r`);
33
+ }
34
+ /** Routes keypresses while a list is active. Returns true if consumed. */
35
+ export function feedSelectListKey(key) {
36
+ const s = active;
37
+ if (!s)
38
+ return false;
39
+ if (key.kind === 'escape' || key.kind === 'left') {
40
+ const n = menuLines(s).length;
41
+ active = null;
42
+ eraseMenuBelowTuner(s.stdout, n);
43
+ s.resolve(null);
44
+ return true;
45
+ }
46
+ if (key.kind === 'enter' || key.kind === 'right') {
47
+ const n = menuLines(s).length;
48
+ const idx = s.selected;
49
+ active = null;
50
+ eraseMenuBelowTuner(s.stdout, n);
51
+ s.resolve(idx);
52
+ return true;
53
+ }
54
+ if (key.kind === 'up') {
55
+ s.selected = s.selected <= 0 ? s.items.length - 1 : s.selected - 1;
56
+ redraw(s);
57
+ return true;
58
+ }
59
+ if (key.kind === 'down') {
60
+ s.selected = s.selected >= s.items.length - 1 ? 0 : s.selected + 1;
61
+ redraw(s);
62
+ return true;
63
+ }
64
+ return true;
65
+ }
66
+ export function isSelectListActive() {
67
+ return active !== null;
68
+ }
69
+ /**
70
+ * Opens a modal list below the tuner line. Consumes keys via {@link feedSelectListKey}
71
+ * until Enter/Right picks, Esc/Left backs out (resolve null).
72
+ */
73
+ export function startSelectList(options) {
74
+ if (options.items.length === 0) {
75
+ return Promise.resolve(null);
76
+ }
77
+ return new Promise((resolve) => {
78
+ const state = {
79
+ title: options.title,
80
+ items: options.items,
81
+ label: options.label,
82
+ resolve,
83
+ selected: 0,
84
+ firstDraw: true,
85
+ stdout: options.stdout,
86
+ };
87
+ active = state;
88
+ redraw(state);
89
+ });
90
+ }
91
+ //# sourceMappingURL=select-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-list.js","sourceRoot":"","sources":["../../src/menus/select-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { Command, CommanderError, InvalidArgumentError, Option, } from 'commander';
2
+ import { findInstrument } from 'tuner-core';
3
+ import { DISPLAY_STYLES } from './display/styles.js';
4
+ import { parsedCliToCliArgs, } from './parsed-cli.js';
5
+ export const CLI_DETECTORS = [
6
+ 'pyin',
7
+ 'yin',
8
+ 'mpm',
9
+ 'autocorrelation',
10
+ ];
11
+ const DISPLAY_STYLE_SET = new Set(DISPLAY_STYLES);
12
+ function helpTextAfter() {
13
+ return `
14
+
15
+ TTY keys:
16
+ i Instrument list
17
+ t Tunings for current instrument
18
+ s Display style
19
+ a Advanced options (detector, device, rate, …)
20
+ q Quit when no menu is open (Esc too; inside lists Esc/← goes back — Advanced submenus return to Advanced)
21
+ Lists: Enter or → pick · Esc or ← back · ↑/↓ or j/k move (h/l = ←/→)
22
+
23
+ Examples:
24
+ tuner
25
+ tuner --list-instruments
26
+ tuner --list-tunings guitar
27
+ tuner --style ansi --color always
28
+ tuner --instrument bass --tuning bass-standard`;
29
+ }
30
+ export function createCliCommand() {
31
+ return new Command('tuner')
32
+ .description('tuner — chromatic tuner (CLI)')
33
+ .addHelpText('after', helpTextAfter())
34
+ .showHelpAfterError(false)
35
+ .configureHelp({ sortOptions: true })
36
+ .option('-v, --verbose', 'Print resolved options to stderr at startup', false)
37
+ .option('--list-devices', 'List audio input devices (decibri / PortAudio)', false)
38
+ .option('--list-instruments', 'List built-in instrument ids and names', false)
39
+ .addOption(new Option('--list-tunings <id>', 'List tuning ids and names for an instrument').argParser((v) => {
40
+ if (!v || v.startsWith('--')) {
41
+ throw new InvalidArgumentError('--list-tunings requires an instrument id');
42
+ }
43
+ return v;
44
+ }))
45
+ .option('--device <indexOrName>', 'Input device (substring match or index)')
46
+ .addOption(new Option('--rate <hz>', 'Sample rate').default(48000).argParser((v) => {
47
+ const n = Number(v);
48
+ if (!Number.isFinite(n) || n < 1000) {
49
+ throw new InvalidArgumentError(`Invalid --rate: ${v}`);
50
+ }
51
+ return n;
52
+ }))
53
+ .option('--instrument <id>', 'Instrument id', 'guitar')
54
+ .option('--tuning <id>', 'Tuning id (default: first tuning for the instrument)')
55
+ .addOption(new Option('--detector <kind>', 'Pitch detector')
56
+ .default('yin')
57
+ .argParser((v) => {
58
+ if (!CLI_DETECTORS.includes(v)) {
59
+ throw new InvalidArgumentError(`--detector must be one of: ${CLI_DETECTORS.join(', ')}`);
60
+ }
61
+ return v;
62
+ }))
63
+ .addOption(new Option('--cents-threshold <n>', 'In-tune cents for string hint')
64
+ .default(5)
65
+ .argParser((v) => {
66
+ const n = Number(v);
67
+ if (!Number.isFinite(n) || n < 0) {
68
+ throw new InvalidArgumentError(`Invalid --cents-threshold: ${v}`);
69
+ }
70
+ return n;
71
+ }))
72
+ .addOption(new Option('--color <mode>', 'auto | always | never — SGR for colors & ansi')
73
+ .default('auto')
74
+ .choices(['auto', 'always', 'never']))
75
+ .addOption(new Option('--style <name>', 'standard | colors | ansi').argParser((v) => {
76
+ if (!DISPLAY_STYLE_SET.has(v)) {
77
+ throw new InvalidArgumentError('--style must be standard, colors, or ansi');
78
+ }
79
+ return v;
80
+ }));
81
+ }
82
+ export function mapCommanderError(e) {
83
+ if (e.code === 'commander.unknownOption') {
84
+ const m = /unknown option '([^']+)'/i.exec(e.message);
85
+ if (m?.[1])
86
+ return new Error(`Unknown argument: ${m[1]}`);
87
+ }
88
+ if ((e.code === 'commander.optionMissingArgument' ||
89
+ e.code === 'commander.missingArgument') &&
90
+ e.message.includes('list-tunings')) {
91
+ return new Error('--list-tunings requires an instrument id');
92
+ }
93
+ return new Error(e.message);
94
+ }
95
+ export function parseDeviceArg(raw) {
96
+ if (raw === undefined)
97
+ return undefined;
98
+ const asNum = Number(raw);
99
+ if (Number.isInteger(asNum) && String(asNum) === raw) {
100
+ return asNum;
101
+ }
102
+ return raw;
103
+ }
104
+ export function optsToParsed(raw) {
105
+ if (raw.listDevices)
106
+ return { kind: 'list-devices' };
107
+ if (raw.listInstruments)
108
+ return { kind: 'list-instruments' };
109
+ if (raw.listTunings !== undefined && raw.listTunings !== '') {
110
+ return { kind: 'list-tunings', instrumentId: raw.listTunings };
111
+ }
112
+ const tuningExplicit = raw.tuning !== undefined && raw.tuning !== '';
113
+ let tuningId = raw.tuning ?? 'guitar-standard';
114
+ if (!tuningExplicit) {
115
+ const first = findInstrument(raw.instrument)?.tunings[0]?.id;
116
+ if (first)
117
+ tuningId = first;
118
+ }
119
+ const args = {
120
+ verbose: Boolean(raw.verbose),
121
+ rate: raw.rate,
122
+ instrumentId: raw.instrument,
123
+ tuningExplicit,
124
+ tuningId,
125
+ detector: raw.detector,
126
+ centsThreshold: raw.centsThreshold,
127
+ color: raw.color,
128
+ ...(raw.device !== undefined ? { device: raw.device } : {}),
129
+ ...(raw.style !== undefined ? { style: raw.style } : {}),
130
+ };
131
+ return { kind: 'run', args };
132
+ }
133
+ function parseWithCommander(argv, configure) {
134
+ const cmd = createCliCommand();
135
+ configure(cmd);
136
+ try {
137
+ cmd.parse(argv, RAN_FROM_NODE);
138
+ }
139
+ catch (e) {
140
+ if (e instanceof CommanderError) {
141
+ if (e.code === 'commander.helpDisplayed' || e.code === 'commander.help') {
142
+ return { kind: 'help' };
143
+ }
144
+ throw mapCommanderError(e);
145
+ }
146
+ throw e;
147
+ }
148
+ return optsToParsed(cmd.opts());
149
+ }
150
+ const RAN_FROM_NODE = { from: 'node' };
151
+ function configureSilentCommander(cmd) {
152
+ cmd.exitOverride();
153
+ cmd.configureOutput({ writeOut: () => { }, writeErr: () => { } });
154
+ }
155
+ /**
156
+ * Parse argv without writing to stdout/stderr (tests + `index.ts` share this).
157
+ * Help is returned as `{ kind: 'help' }`; callers render help themselves.
158
+ */
159
+ function parseCliArgv(argv) {
160
+ return parseWithCommander(argv, configureSilentCommander);
161
+ }
162
+ /** Parse argv for tests: no output, help → ParsedCli without printing. */
163
+ export const parseCli = parseCliArgv;
164
+ /**
165
+ * Parse argv for the real process entry. Suppresses Commander's help/error
166
+ * writes so the app prints help and errors exactly once (see `index.ts`).
167
+ */
168
+ export const parseCliRuntime = parseCliArgv;
169
+ export function parseArgs(argv) {
170
+ return parsedCliToCliArgs(parseCli(argv));
171
+ }
172
+ //# sourceMappingURL=parse-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.js","sourceRoot":"","sources":["../src/parse-args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export function parsedCliToCliArgs(parsed) {
2
+ const base = {
3
+ help: false,
4
+ verbose: false,
5
+ listDevices: false,
6
+ listInstruments: false,
7
+ rate: 48000,
8
+ instrumentId: 'guitar',
9
+ tuningExplicit: false,
10
+ tuningId: 'guitar-standard',
11
+ detector: 'yin',
12
+ centsThreshold: 5,
13
+ color: 'auto',
14
+ };
15
+ if (parsed.kind === 'help') {
16
+ return { ...base, help: true };
17
+ }
18
+ if (parsed.kind === 'list-devices') {
19
+ return { ...base, listDevices: true };
20
+ }
21
+ if (parsed.kind === 'list-instruments') {
22
+ return { ...base, listInstruments: true };
23
+ }
24
+ if (parsed.kind === 'list-tunings') {
25
+ return { ...base, listTuningsFor: parsed.instrumentId };
26
+ }
27
+ return {
28
+ ...base,
29
+ ...parsed.args,
30
+ help: false,
31
+ listDevices: false,
32
+ listInstruments: false,
33
+ };
34
+ }
35
+ //# sourceMappingURL=parsed-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsed-cli.js","sourceRoot":"","sources":["../src/parsed-cli.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,IAAI,GAAY;QACpB,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;QACtB,IAAI,EAAE,KAAK;QACX,YAAY,EAAE,QAAQ;QACtB,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,KAAK;QACf,cAAc,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM;KACd,CAAA;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAChC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAA;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,CAAA;IACzD,CAAC;IACD,OAAO;QACL,GAAG,IAAI;QACP,GAAG,MAAM,CAAC,IAAI;QACd,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;KACvB,CAAA;AACH,CAAC"}