microgit-cli 0.0.0-stage → 0.1.2
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/README.md +257 -2
- package/package.json +26 -4
- package/src/api/index.js +111 -0
- package/src/api/index.js.map +1 -0
- package/src/cli/index.js +58 -0
- package/src/cli/index.js.map +1 -0
- package/src/cli/repl.js +312 -0
- package/src/cli/repl.js.map +1 -0
- package/src/commands/auth.js +305 -0
- package/src/commands/auth.js.map +1 -0
- package/src/commands/config.js +106 -0
- package/src/commands/config.js.map +1 -0
- package/src/commands/git.js +159 -0
- package/src/commands/git.js.map +1 -0
- package/src/commands/registry.js +139 -0
- package/src/commands/registry.js.map +1 -0
- package/src/commands/repos.js +256 -0
- package/src/commands/repos.js.map +1 -0
- package/src/config/index.js +124 -0
- package/src/config/index.js.map +1 -0
- package/src/config/settings.js +34 -0
- package/src/config/settings.js.map +1 -0
- package/src/error/index.js +14 -0
- package/src/error/index.js.map +1 -0
- package/src/git/index.js +163 -0
- package/src/git/index.js.map +1 -0
- package/src/help/index.js +52 -0
- package/src/help/index.js.map +1 -0
- package/src/index.js +9 -0
- package/src/index.js.map +1 -0
- package/src/theme/banner.js +44 -0
- package/src/theme/banner.js.map +1 -0
- package/src/theme/index.js +5 -0
- package/src/theme/index.js.map +1 -0
- package/src/theme/logo.js +36 -0
- package/src/theme/logo.js.map +1 -0
- package/src/theme/palette.js +32 -0
- package/src/theme/palette.js.map +1 -0
- package/src/ui/index.js +104 -0
- package/src/ui/index.js.map +1 -0
- package/src/util/index.js +30 -0
- package/src/util/index.js.map +1 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ENV } from '../config/index.js';
|
|
2
|
+
import { COMMANDS, GROUPS } from '../commands/registry.js';
|
|
3
|
+
import { BIN, SETTINGS } from '../config/settings.js';
|
|
4
|
+
import { logoTiny, logoBox } from '../theme/index.js';
|
|
5
|
+
import { bold, cyan, dim, faint } from '../ui/index.js';
|
|
6
|
+
/** `--version`: one line, no banner, safe for scripts. */
|
|
7
|
+
export function printVersion() {
|
|
8
|
+
console.log(logoTiny());
|
|
9
|
+
}
|
|
10
|
+
/** `help`: boxed mark, commands by group, then options and examples. */
|
|
11
|
+
export function printHelp() {
|
|
12
|
+
const nameWidth = Math.max(...COMMANDS.map((command) => command.name.length));
|
|
13
|
+
const aliasLabels = COMMANDS.map((command) => command.aliases?.length ? `(${command.aliases.join(', ')})` : '');
|
|
14
|
+
const aliasWidth = Math.max(...aliasLabels.map((label) => label.length));
|
|
15
|
+
const out = [''];
|
|
16
|
+
out.push(logoBox());
|
|
17
|
+
out.push('');
|
|
18
|
+
out.push(` ${dim('usage')} ${cyan(BIN)} ${dim('<command> [options]')}`);
|
|
19
|
+
out.push(` ${cyan(BIN)} ${dim('start the interactive shell')}`);
|
|
20
|
+
for (const group of GROUPS) {
|
|
21
|
+
out.push('');
|
|
22
|
+
out.push(` ${cyan('●')} ${bold(group)}`);
|
|
23
|
+
COMMANDS.forEach((command, index) => {
|
|
24
|
+
if (command.group !== group)
|
|
25
|
+
return;
|
|
26
|
+
const alias = aliasWidth === 0 ? '' : `${faint((aliasLabels[index] ?? '').padEnd(aliasWidth))} `;
|
|
27
|
+
out.push(` ${cyan(command.name.padEnd(nameWidth))} ${alias}${command.summary}`);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const section = (title) => {
|
|
31
|
+
out.push('');
|
|
32
|
+
out.push(` ${cyan('●')} ${bold(title)}`);
|
|
33
|
+
};
|
|
34
|
+
section('Options');
|
|
35
|
+
out.push(` ${dim('--url <url>')} Server URL (also ${ENV.url})`);
|
|
36
|
+
out.push(` ${dim('--json')} Machine-readable output where supported`);
|
|
37
|
+
out.push(` ${dim('-h, --help')} Help for one command`);
|
|
38
|
+
out.push(` ${dim('-v, --version')} Version without the banner`);
|
|
39
|
+
section('Shell');
|
|
40
|
+
out.push(` ${dim('help · clear · exit')} ${faint('↑↓ history · tab complete · Ctrl+C cancels')}`);
|
|
41
|
+
section('Environment');
|
|
42
|
+
out.push(` ${dim(`${ENV.url} · ${ENV.token} · ${ENV.username} · ${ENV.password}`)}`);
|
|
43
|
+
out.push(` ${dim(ENV.config)} Config file path (default ~/${SETTINGS.configDir}/config.json)`);
|
|
44
|
+
section('Quick start');
|
|
45
|
+
out.push(` ${cyan(`${BIN} login --url http://{HOST_NAME}:{PORT}`)}`);
|
|
46
|
+
out.push(` ${cyan(`${BIN} new app --init`)}`);
|
|
47
|
+
out.push(` ${cyan('cd app')}`);
|
|
48
|
+
out.push(` ${cyan(`${BIN} commit -m "First change"`)}`);
|
|
49
|
+
out.push(` ${cyan(`${BIN} whoami`)}`);
|
|
50
|
+
console.log(out.join('\n'));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/help/index.ts"],"names":[],"mappings":"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"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { main } from './cli/index.js';
|
|
3
|
+
import { CliError, errorMessage } from './error/index.js';
|
|
4
|
+
import { red } from './ui/index.js';
|
|
5
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
6
|
+
console.error(`${red('✗')} ${errorMessage(error)}`);
|
|
7
|
+
process.exitCode = error instanceof CliError ? error.exitCode : 1;
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACnD,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,QAAQ,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { bold, faint, dim, green, cyan } from './palette.js';
|
|
2
|
+
import { DEFAULT_URL } from '../config/index.js';
|
|
3
|
+
import { logoCompact } from './logo.js';
|
|
4
|
+
import { BIN } from '../config/settings.js';
|
|
5
|
+
/** "3d left", "5h left", "expired"; undefined when the session has no expiry. */
|
|
6
|
+
export function sessionLeft(expiresAt) {
|
|
7
|
+
if (!expiresAt)
|
|
8
|
+
return undefined;
|
|
9
|
+
const date = new Date(expiresAt);
|
|
10
|
+
if (Number.isNaN(date.getTime()))
|
|
11
|
+
return undefined;
|
|
12
|
+
const ms = date.getTime() - Date.now();
|
|
13
|
+
if (ms <= 0)
|
|
14
|
+
return 'expired';
|
|
15
|
+
const hours = ms / 3_600_000;
|
|
16
|
+
if (hours < 1)
|
|
17
|
+
return `${Math.max(1, Math.round(ms / 60_000))}m left`;
|
|
18
|
+
if (hours < 48)
|
|
19
|
+
return `${Math.round(hours)}h left`;
|
|
20
|
+
return `${Math.round(hours / 24)}d left`;
|
|
21
|
+
}
|
|
22
|
+
/** Session block printed when the interactive shell starts. */
|
|
23
|
+
export function shellBanner(config) {
|
|
24
|
+
const rows = ['', logoCompact(), ''];
|
|
25
|
+
const meta = (label, value) => ` ${faint('#')} ${dim(label.padEnd(8))} ${value}`;
|
|
26
|
+
rows.push(meta('server', config?.url ?? DEFAULT_URL));
|
|
27
|
+
const left = sessionLeft(config?.expiresAt);
|
|
28
|
+
if (config?.token && config.username) {
|
|
29
|
+
const suffix = left === undefined ? '' : ` ${faint('·')} ${dim(left)}`;
|
|
30
|
+
rows.push(meta('account', `${bold(config.username)}${suffix}`));
|
|
31
|
+
}
|
|
32
|
+
else if (config?.username) {
|
|
33
|
+
rows.push(meta('account', `${dim(config.username)} ${faint('·')} ${dim('signed out')}`));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
rows.push(meta('account', `${dim('signed out')} ${faint('·')} ${cyan('login')} ${dim('to start a session')}`));
|
|
37
|
+
}
|
|
38
|
+
rows.push('');
|
|
39
|
+
rows.push(` ${green('✓')} ${dim('ready')} ${faint('·')} ${dim('type')} ${cyan('help')} ${dim('to list the commands')}`);
|
|
40
|
+
if (config?.token)
|
|
41
|
+
rows.push(` ${faint('#')} ${dim('one-shot')} ${dim(`${BIN} --help`)}`);
|
|
42
|
+
return rows.join('\n');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/theme/banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { bold, cyan, dim, faint, box } from './palette.js';
|
|
2
|
+
import { SETTINGS } from '../config/settings.js';
|
|
3
|
+
const NODE = '●';
|
|
4
|
+
const RULE = '━━━';
|
|
5
|
+
export const MARK = cyan(SETTINGS.mark);
|
|
6
|
+
const NAME = `${bold(SETTINGS.name)} ${faint('•')} ${cyan(SETTINGS.label)}`;
|
|
7
|
+
const VERSION = `v${SETTINGS.version}`;
|
|
8
|
+
/** One line, for `--version` and the shell's `version` builtin. */
|
|
9
|
+
export function logoTiny() {
|
|
10
|
+
return `${MARK}${faint('──')}${cyan(NODE)} ${NAME} ${faint('·')} ${dim(VERSION)}`;
|
|
11
|
+
}
|
|
12
|
+
/** Three lines, for the interactive shell banner. */
|
|
13
|
+
export function logoCompact() {
|
|
14
|
+
const stem = ' '.repeat(SETTINGS.mark.length + 3);
|
|
15
|
+
return [
|
|
16
|
+
` ${MARK} ${faint('━━━━')} ${cyan(NODE)}`,
|
|
17
|
+
`${stem}${faint(`┣${RULE}`)} ${cyan(NODE)} ${NAME} ${dim(VERSION)}`,
|
|
18
|
+
`${stem}${faint(`┗${RULE}`)} ${cyan(NODE)} ${dim(SETTINGS.tagline)}`,
|
|
19
|
+
].join('\n');
|
|
20
|
+
}
|
|
21
|
+
/** Boxed mark, for `help`. */
|
|
22
|
+
export function logoBox() {
|
|
23
|
+
const lead = ' ';
|
|
24
|
+
const stem = ' '.repeat(lead.length + SETTINGS.mark.length + 3);
|
|
25
|
+
return box([
|
|
26
|
+
'',
|
|
27
|
+
`${lead}${MARK} ${faint('──┬─')}${cyan(NODE)}`,
|
|
28
|
+
`${stem}${faint('├─')}${cyan(NODE)} ${NAME} ${dim(VERSION)}`,
|
|
29
|
+
`${stem}${faint('└─')}${cyan(NODE)} ${dim(SETTINGS.tagline)}`,
|
|
30
|
+
'',
|
|
31
|
+
`${lead}${dim(SETTINGS.footer)} ${faint('·')} ${dim(SETTINGS.label)}`,
|
|
32
|
+
`${lead}${dim(SETTINGS.description)}`,
|
|
33
|
+
'',
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/theme/logo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,IAAI,GAAG,KAAK,CAAC;AACnB,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5E,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;AAEvC,mEAAmE;AACnE,MAAM,UAAU,QAAQ;IACtB,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AACrF,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO;QACL,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;QAC1C,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE;QACtE,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,OAAO;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC;IACnB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;QACT,EAAE;QACF,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9C,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE;QAC/D,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;QAC/D,EAAE;QACF,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACrE,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrC,EAAE;KACH,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Colours follow the terminal design: a GitHub-dark 256-colour palette, so the
|
|
2
|
+
* shell reads the same in Windows Terminal, iTerm and VS Code. Anything piped
|
|
3
|
+
* through a file or a non-TTY prints without escape codes.
|
|
4
|
+
*/
|
|
5
|
+
const colour = Boolean(process.stdout.isTTY) && process.env.NO_COLOR === undefined;
|
|
6
|
+
const paint = (spec) => (text) => colour ? `\u001b[${spec}m${text}\u001b[0m` : text;
|
|
7
|
+
/** Structural lines and separators. */
|
|
8
|
+
export const faint = paint('38;5;240');
|
|
9
|
+
/** Secondary text, metadata and hints. */
|
|
10
|
+
export const dim = paint('38;5;246');
|
|
11
|
+
export const bold = paint('1');
|
|
12
|
+
export const red = paint('38;5;203');
|
|
13
|
+
export const green = paint('38;5;114');
|
|
14
|
+
export const yellow = paint('38;5;179');
|
|
15
|
+
/** The single accent colour: nodes, command names, links. */
|
|
16
|
+
export const cyan = paint('38;5;75');
|
|
17
|
+
const ANSI = /\u001b\[[0-9;]*m/g;
|
|
18
|
+
/** Length of a styled string as it appears on screen. */
|
|
19
|
+
export function visibleWidth(value) {
|
|
20
|
+
return value.replace(ANSI, '').length;
|
|
21
|
+
}
|
|
22
|
+
/** Draw a rounded box around already-styled rows. */
|
|
23
|
+
export function box(rows) {
|
|
24
|
+
const width = Math.max(0, ...rows.map(visibleWidth));
|
|
25
|
+
const pad = (row) => ' '.repeat(width - visibleWidth(row));
|
|
26
|
+
return [
|
|
27
|
+
faint(`┌${'─'.repeat(width + 2)}┐`),
|
|
28
|
+
...rows.map((row) => `${faint('│')} ${row}${pad(row)} ${faint('│')}`),
|
|
29
|
+
faint(`└${'─'.repeat(width + 2)}┘`),
|
|
30
|
+
].join('\n');
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"palette.js","sourceRoot":"","sources":["../../src/theme/palette.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;AACnF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,IAAY,EAAU,EAAE,CACvD,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAEpD,uCAAuC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AACvC,0CAA0C;AAC1C,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AACxC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAErC,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAEjC,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACxC,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,GAAG,CAAC,IAAc;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3E,OAAO;QACL,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;QACnC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;KACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/src/ui/index.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { CliError } from '../error/index.js';
|
|
3
|
+
import { faint, dim, bold, red, green, yellow, cyan, visibleWidth, box } from '../theme/palette.js';
|
|
4
|
+
export { faint, dim, bold, red, green, yellow, cyan, visibleWidth, box };
|
|
5
|
+
/** A successful step. */
|
|
6
|
+
export function ok(message) {
|
|
7
|
+
console.log(`${green('✓')} ${message}`);
|
|
8
|
+
}
|
|
9
|
+
/** A neutral next step or piece of information. */
|
|
10
|
+
export function info(message) {
|
|
11
|
+
console.log(`${cyan('→')} ${message}`);
|
|
12
|
+
}
|
|
13
|
+
/** A warning that does not stop the command. */
|
|
14
|
+
export function warn(message) {
|
|
15
|
+
console.error(`${yellow('!')} ${message}`);
|
|
16
|
+
}
|
|
17
|
+
/** Stop the command with a readable error. */
|
|
18
|
+
export function fail(message) {
|
|
19
|
+
throw new CliError(message);
|
|
20
|
+
}
|
|
21
|
+
export function printJson(value) {
|
|
22
|
+
console.log(JSON.stringify(value, null, 2));
|
|
23
|
+
}
|
|
24
|
+
let promptHandlers = null;
|
|
25
|
+
/** Install or remove the prompt handlers used by `ask`/`askSecret`. */
|
|
26
|
+
export function usePromptHandlers(handlers) {
|
|
27
|
+
promptHandlers = handlers;
|
|
28
|
+
}
|
|
29
|
+
function askWith(rl, question) {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
rl.question(question, resolve);
|
|
32
|
+
rl.once('close', () => resolve(''));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Read one line from the terminal, trimmed. */
|
|
36
|
+
export async function ask(question) {
|
|
37
|
+
if (promptHandlers)
|
|
38
|
+
return promptHandlers.ask(question);
|
|
39
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
40
|
+
try {
|
|
41
|
+
const answer = await askWith(rl, question);
|
|
42
|
+
return answer.trim();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
rl.close();
|
|
46
|
+
// Give the interface time to release stdin before the next prompt.
|
|
47
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Read a password without echoing it; falls back to a normal line off a TTY. */
|
|
51
|
+
export async function askSecret(question) {
|
|
52
|
+
if (promptHandlers)
|
|
53
|
+
return promptHandlers.askSecret(question);
|
|
54
|
+
if (!process.stdin.isTTY)
|
|
55
|
+
return ask(question);
|
|
56
|
+
process.stdout.write(question);
|
|
57
|
+
const rl = readline.createInterface({
|
|
58
|
+
input: process.stdin,
|
|
59
|
+
output: process.stdout,
|
|
60
|
+
terminal: true,
|
|
61
|
+
});
|
|
62
|
+
const internal = rl;
|
|
63
|
+
internal._writeToOutput = () => { };
|
|
64
|
+
try {
|
|
65
|
+
const answer = await askWith(rl, '');
|
|
66
|
+
process.stdout.write('\n');
|
|
67
|
+
return answer;
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
rl.close();
|
|
71
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Ask a yes/no question; non-interactive runs use the fallback. */
|
|
75
|
+
export async function confirm(question, fallback = false) {
|
|
76
|
+
if (!process.stdin.isTTY)
|
|
77
|
+
return fallback;
|
|
78
|
+
const answer = (await ask(`${question} ${fallback ? '[Y/n]' : '[y/N]'} `)).toLowerCase();
|
|
79
|
+
if (answer === '')
|
|
80
|
+
return fallback;
|
|
81
|
+
return answer === 'y' || answer === 'yes';
|
|
82
|
+
}
|
|
83
|
+
/** A small aligned table with a dashed header underline. */
|
|
84
|
+
export function table(headers, rows) {
|
|
85
|
+
const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => (row[index] ?? '').length)));
|
|
86
|
+
const pad = (cells) => cells.map((cell, index) => cell.padEnd(widths[index] ?? 0));
|
|
87
|
+
const line = (cells) => pad(cells).join(' ').trimEnd();
|
|
88
|
+
return [
|
|
89
|
+
pad(headers)
|
|
90
|
+
.map((cell) => bold(cell))
|
|
91
|
+
.join(' ')
|
|
92
|
+
.trimEnd(),
|
|
93
|
+
widths.map((width) => faint('─'.repeat(width))).join(' '),
|
|
94
|
+
...rows.map(line),
|
|
95
|
+
].join('\n');
|
|
96
|
+
}
|
|
97
|
+
/** Short, local representation of an ISO timestamp. */
|
|
98
|
+
export function formatDate(iso) {
|
|
99
|
+
if (!iso)
|
|
100
|
+
return '-';
|
|
101
|
+
const date = new Date(iso);
|
|
102
|
+
return Number.isNaN(date.getTime()) ? iso : date.toLocaleString();
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CliError } from '../error/index.js';
|
|
2
|
+
export function text(value) {
|
|
3
|
+
return typeof value === 'string' && value !== '' ? value : undefined;
|
|
4
|
+
}
|
|
5
|
+
export function trimmed(value) {
|
|
6
|
+
const valueText = text(value)?.trim();
|
|
7
|
+
return valueText === '' ? undefined : valueText;
|
|
8
|
+
}
|
|
9
|
+
/** Parse a positive integer option, or fail with a useful message. */
|
|
10
|
+
export function positiveInt(value, option, fallback) {
|
|
11
|
+
const raw = trimmed(value);
|
|
12
|
+
if (raw === undefined)
|
|
13
|
+
return fallback;
|
|
14
|
+
const parsed = Number.parseInt(raw, 10);
|
|
15
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
16
|
+
throw new CliError(`${option} must be a positive integer.`);
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
/** `name`, `name.git`, `owner/name` and `owner/name.git` all work. */
|
|
21
|
+
export function parseTarget(raw) {
|
|
22
|
+
const cleaned = raw.trim().replace(/\.git$/i, '');
|
|
23
|
+
const parts = cleaned.split('/').filter((part) => part !== '');
|
|
24
|
+
if (parts.length === 1)
|
|
25
|
+
return { name: parts[0] ?? '' };
|
|
26
|
+
if (parts.length === 2)
|
|
27
|
+
return { owner: parts[0], name: parts[1] ?? '' };
|
|
28
|
+
throw new CliError(`Expected <name> or <owner/name>, got '${raw}'.`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,UAAU,IAAI,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,OAAO,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,MAAc,EAAE,QAAgB;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzE,MAAM,IAAI,QAAQ,CAAC,yCAAyC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
|