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.
Files changed (42) hide show
  1. package/README.md +257 -2
  2. package/package.json +26 -4
  3. package/src/api/index.js +111 -0
  4. package/src/api/index.js.map +1 -0
  5. package/src/cli/index.js +58 -0
  6. package/src/cli/index.js.map +1 -0
  7. package/src/cli/repl.js +312 -0
  8. package/src/cli/repl.js.map +1 -0
  9. package/src/commands/auth.js +305 -0
  10. package/src/commands/auth.js.map +1 -0
  11. package/src/commands/config.js +106 -0
  12. package/src/commands/config.js.map +1 -0
  13. package/src/commands/git.js +159 -0
  14. package/src/commands/git.js.map +1 -0
  15. package/src/commands/registry.js +139 -0
  16. package/src/commands/registry.js.map +1 -0
  17. package/src/commands/repos.js +256 -0
  18. package/src/commands/repos.js.map +1 -0
  19. package/src/config/index.js +124 -0
  20. package/src/config/index.js.map +1 -0
  21. package/src/config/settings.js +34 -0
  22. package/src/config/settings.js.map +1 -0
  23. package/src/error/index.js +14 -0
  24. package/src/error/index.js.map +1 -0
  25. package/src/git/index.js +163 -0
  26. package/src/git/index.js.map +1 -0
  27. package/src/help/index.js +52 -0
  28. package/src/help/index.js.map +1 -0
  29. package/src/index.js +9 -0
  30. package/src/index.js.map +1 -0
  31. package/src/theme/banner.js +44 -0
  32. package/src/theme/banner.js.map +1 -0
  33. package/src/theme/index.js +5 -0
  34. package/src/theme/index.js.map +1 -0
  35. package/src/theme/logo.js +36 -0
  36. package/src/theme/logo.js.map +1 -0
  37. package/src/theme/palette.js +32 -0
  38. package/src/theme/palette.js.map +1 -0
  39. package/src/ui/index.js +104 -0
  40. package/src/ui/index.js.map +1 -0
  41. package/src/util/index.js +30 -0
  42. package/src/util/index.js.map +1 -0
@@ -0,0 +1,106 @@
1
+ import fs from 'node:fs';
2
+ import { clearStoredConfig, configFilePath, loadConfig, normalizeUrl, readStoredConfig, writeStoredConfig, } from '../config/index.js';
3
+ import { BIN } from '../config/settings.js';
4
+ import { fail, formatDate, info, ok, printJson } from '../ui/index.js';
5
+ function mask(value) {
6
+ if (value.length <= 8)
7
+ return 'saved';
8
+ return `${value.slice(0, 4)}...${value.slice(-4)}`;
9
+ }
10
+ export async function configCommand(argv) {
11
+ const json = argv.includes('--json');
12
+ const args = argv.filter((arg) => arg !== '--json');
13
+ const [action, key, ...rest] = args;
14
+ if (!action || action === 'show' || action === '--help' || action === '-h') {
15
+ showConfig(json);
16
+ return;
17
+ }
18
+ if (action === 'path') {
19
+ console.log(configFilePath());
20
+ return;
21
+ }
22
+ if (action === 'edit') {
23
+ const file = configFilePath();
24
+ // Make sure the file exists.
25
+ if (!fs.existsSync(file))
26
+ writeStoredConfig(readStoredConfig());
27
+ const editor = process.env.EDITOR || process.env.VISUAL || (process.platform === 'win32' ? 'notepad' : 'vi');
28
+ const { spawnSync } = await import('node:child_process');
29
+ const result = spawnSync(editor, [file], { stdio: 'inherit', shell: true });
30
+ if (result.status !== 0) {
31
+ fail(`Editor exited with code ${result.status ?? 'unknown'}.`);
32
+ }
33
+ ok(`Edited ${file}.`);
34
+ return;
35
+ }
36
+ if (action === 'clear') {
37
+ clearStoredConfig();
38
+ ok(`Removed ${configFilePath()}`);
39
+ return;
40
+ }
41
+ if (action === 'set') {
42
+ const name = key?.trim();
43
+ const value = rest.join(' ').trim();
44
+ if (!name || value === '') {
45
+ fail(`Usage: ${BIN} config set <url|username|token|password> <value>`);
46
+ }
47
+ const stored = readStoredConfig();
48
+ const next = { ...stored };
49
+ if (name === 'url')
50
+ next.url = normalizeUrl(value);
51
+ else if (name === 'username')
52
+ next.username = value;
53
+ else if (name === 'token')
54
+ next.token = value;
55
+ else if (name === 'password')
56
+ next.password = value;
57
+ else
58
+ fail(`Unknown config key '${name}'. Use url, username, token or password.`);
59
+ writeStoredConfig(next);
60
+ ok(`Set ${name}.`);
61
+ if (name === 'password')
62
+ info('The password is stored in plain text in the config file.');
63
+ return;
64
+ }
65
+ if (action === 'unset') {
66
+ const name = key?.trim();
67
+ if (!name)
68
+ fail(`Usage: ${BIN} config unset <token|password|username|expiresAt>`);
69
+ const stored = readStoredConfig();
70
+ const next = { ...stored };
71
+ if (name === 'token' || name === 'password' || name === 'username' || name === 'expiresAt') {
72
+ delete next[name];
73
+ }
74
+ else {
75
+ fail(`Unknown config key '${name}'.`);
76
+ }
77
+ writeStoredConfig(next);
78
+ ok(`Unset ${name}.`);
79
+ return;
80
+ }
81
+ fail(`Unknown config action '${action}'. Try: ${BIN} config`);
82
+ }
83
+ function showConfig(json) {
84
+ const config = loadConfig();
85
+ const stored = readStoredConfig();
86
+ const token = config.token;
87
+ if (json) {
88
+ printJson({
89
+ configPath: config.configPath,
90
+ url: config.url,
91
+ username: config.username ?? null,
92
+ token: token ? 'saved' : null,
93
+ expiresAt: config.expiresAt ?? null,
94
+ password: config.password ? 'saved' : null,
95
+ });
96
+ return;
97
+ }
98
+ const row = (label, value) => ` ${label.padEnd(12)} ${value}`;
99
+ console.log(row('Config file', config.configPath));
100
+ console.log(row('Server', config.url));
101
+ console.log(row('Username', config.username ?? '-'));
102
+ console.log(row('Token', token ? mask(token) : '-'));
103
+ console.log(row('Expires', formatDate(config.expiresAt)));
104
+ console.log(row('Password', stored.password ? 'saved (plain text)' : '-'));
105
+ }
106
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseArgs } from 'node:util';
4
+ import { loadConfig } from '../config/index.js';
5
+ import { ensureIdentity, git, gitChecked, pullRepo, pushRepo, requireGitRepo } from '../git/index.js';
6
+ import { BIN } from '../config/settings.js';
7
+ import { ask, fail, info, ok } from '../ui/index.js';
8
+ import { text, trimmed } from '../util/index.js';
9
+ export async function initCommand(argv) {
10
+ const { values, positionals } = parseArgs({
11
+ args: argv,
12
+ allowPositionals: true,
13
+ options: {
14
+ dir: { type: 'string' },
15
+ help: { type: 'boolean', short: 'h' },
16
+ },
17
+ });
18
+ if (values.help) {
19
+ console.log(`Usage: ${BIN} init [directory] [options]
20
+
21
+ Create a project folder, run 'git init' in it and add an empty README.md.
22
+ Nothing is committed or pushed, and no server repository is created.
23
+
24
+ Options:
25
+ --dir <path> Directory to use (default: the given name, else this folder)
26
+ -h, --help Show this help
27
+
28
+ Examples:
29
+ ${BIN} init app
30
+ ${BIN} init # initialise the current folder
31
+ ${BIN} init --dir ./projects/app`);
32
+ return;
33
+ }
34
+ const name = trimmed(positionals[0]);
35
+ const target = path.resolve(trimmed(values.dir) ?? name ?? '.');
36
+ const label = path.basename(target) === '' ? target : path.basename(target);
37
+ if (fs.existsSync(path.join(target, '.git'))) {
38
+ fail(`Already a git repository: ${target}`);
39
+ }
40
+ fs.mkdirSync(target, { recursive: true });
41
+ await gitChecked(['init', '-b', 'main'], { cwd: target, inherit: false });
42
+ let username;
43
+ try {
44
+ username = loadConfig().username;
45
+ }
46
+ catch {
47
+ username = undefined;
48
+ }
49
+ if (username)
50
+ await ensureIdentity(target, username);
51
+ const readme = path.join(target, 'README.md');
52
+ if (!fs.existsSync(readme))
53
+ fs.writeFileSync(readme, '', 'utf8');
54
+ ok(`Initialised ${label} with git and an empty README.md`);
55
+ info(`Next: cd ${label} · ${BIN} status`);
56
+ }
57
+ export async function statusCommand(argv) {
58
+ if (argv.includes('--help') || argv.includes('-h')) {
59
+ console.log(`Usage: ${BIN} status`);
60
+ return;
61
+ }
62
+ await requireGitRepo();
63
+ await gitChecked(['status', '--short', '--branch']);
64
+ }
65
+ export async function commitCommand(argv) {
66
+ const { values } = parseArgs({
67
+ args: argv,
68
+ allowPositionals: true,
69
+ options: {
70
+ message: { type: 'string', short: 'm' },
71
+ 'no-add': { type: 'boolean' },
72
+ 'no-push': { type: 'boolean' },
73
+ 'allow-empty': { type: 'boolean' },
74
+ url: { type: 'string' },
75
+ help: { type: 'boolean', short: 'h' },
76
+ },
77
+ });
78
+ if (values.help) {
79
+ console.log(`Usage: ${BIN} commit -m "message" [options]
80
+
81
+ Stage every change, commit it and push the current branch.
82
+
83
+ Options:
84
+ -m, --message <text> Commit message (asked interactively when omitted)
85
+ --no-add Do not run 'git add -A' first
86
+ --no-push Commit only, do not push
87
+ --allow-empty Allow a commit without staged changes
88
+ --url <url> Server URL (for credentials)
89
+ -h, --help Show this help
90
+
91
+ Example:
92
+ ${BIN} commit -m "Add login page"
93
+ ${BIN} commit -m "WIP" --no-push`);
94
+ return;
95
+ }
96
+ await requireGitRepo();
97
+ const cwd = process.cwd();
98
+ let message = text(values.message)?.trim();
99
+ if (!message) {
100
+ if (!process.stdin.isTTY)
101
+ fail('Commit message is required. Use -m "message".');
102
+ message = await ask('Commit message: ');
103
+ }
104
+ if (!message)
105
+ fail('Commit message cannot be empty.');
106
+ const config = loadConfig(text(values.url));
107
+ if (!values['no-add']) {
108
+ await gitChecked(['add', '-A'], { cwd, inherit: false });
109
+ }
110
+ const diff = await git(['diff', '--cached', '--quiet'], { cwd });
111
+ if (diff.code > 1) {
112
+ fail(diff.stderr.trim() || 'Could not inspect the staged changes.');
113
+ }
114
+ let committed = false;
115
+ if (diff.code === 0 && !values['allow-empty']) {
116
+ info('Nothing to commit.');
117
+ }
118
+ else {
119
+ const commitArgs = ['commit', '-m', message];
120
+ if (values['allow-empty'])
121
+ commitArgs.push('--allow-empty');
122
+ await gitChecked(commitArgs, { cwd });
123
+ committed = true;
124
+ }
125
+ if (values['no-push']) {
126
+ if (committed)
127
+ ok('Committed.');
128
+ return;
129
+ }
130
+ await pushRepo(config, [], cwd);
131
+ if (committed)
132
+ ok('Committed and pushed.');
133
+ else
134
+ ok('Pushed.');
135
+ }
136
+ export async function pushCommand(argv) {
137
+ if (argv.includes('--help') || argv.includes('-h')) {
138
+ console.log(`Usage: ${BIN} push [git push arguments]
139
+
140
+ Push the current branch with the saved credentials. Extra arguments are passed
141
+ to git, for example: ${BIN} push --force-with-lease`);
142
+ return;
143
+ }
144
+ const config = loadConfig();
145
+ await pushRepo(config, argv);
146
+ ok('Pushed.');
147
+ }
148
+ export async function pullCommand(argv) {
149
+ if (argv.includes('--help') || argv.includes('-h')) {
150
+ console.log(`Usage: ${BIN} pull [git pull arguments]
151
+
152
+ Pull from origin with the saved credentials. Extra arguments are passed to git.`);
153
+ return;
154
+ }
155
+ const config = loadConfig();
156
+ await pullRepo(config, argv);
157
+ ok('Pulled.');
158
+ }
159
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/commands/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ import { loginCommand, logoutCommand, registerCommand, whoamiCommand } from './auth.js';
2
+ import { configCommand } from './config.js';
3
+ import { commitCommand, initCommand, pullCommand, pushCommand, statusCommand } from './git.js';
4
+ import { cloneCommand, deleteCommand, listCommand, newCommand } from './repos.js';
5
+ import { CliError } from '../error/index.js';
6
+ /**
7
+ * One table drives the entry point, `help` and the shell's tab completion, so a
8
+ * new command only has to be added here.
9
+ */
10
+ export const COMMANDS = [
11
+ {
12
+ name: 'login',
13
+ group: 'Account',
14
+ summary: 'Sign in and store the API session',
15
+ flags: ['--url', '--username', '--password', '--save-password', '--forget-password', '--json', '--help'],
16
+ run: loginCommand,
17
+ },
18
+ {
19
+ name: 'register',
20
+ group: 'Account',
21
+ summary: 'Create an account and sign in',
22
+ flags: ['--url', '--username', '--password', '--save-password', '--forget-password', '--json', '--help'],
23
+ run: registerCommand,
24
+ },
25
+ {
26
+ name: 'logout',
27
+ group: 'Account',
28
+ summary: 'Revoke the session and clear local credentials',
29
+ flags: ['--url', '--json', '--help'],
30
+ run: logoutCommand,
31
+ },
32
+ {
33
+ name: 'whoami',
34
+ aliases: ['me'],
35
+ group: 'Account',
36
+ summary: 'Show the signed-in account',
37
+ flags: ['--url', '--json', '--help'],
38
+ run: whoamiCommand,
39
+ },
40
+ {
41
+ name: 'new',
42
+ aliases: ['create'],
43
+ group: 'Repositories',
44
+ summary: 'Create a repository (--private, --clone, --init)',
45
+ flags: ['--url', '--private', '--public', '--clone', '--init', '--dir', '--json', '--help'],
46
+ run: newCommand,
47
+ },
48
+ {
49
+ name: 'list',
50
+ aliases: ['ls'],
51
+ group: 'Repositories',
52
+ summary: 'List repositories (--owner, --public, --private)',
53
+ flags: ['--url', '--owner', '--name', '--private', '--public', '--page', '--limit', '--json', '--help'],
54
+ run: listCommand,
55
+ },
56
+ {
57
+ name: 'delete',
58
+ aliases: ['rm'],
59
+ group: 'Repositories',
60
+ summary: 'Delete a repository (owner/name for another account)',
61
+ flags: ['--url', '--yes', '--json', '--help'],
62
+ run: deleteCommand,
63
+ },
64
+ {
65
+ name: 'clone',
66
+ group: 'Repositories',
67
+ summary: 'Clone a repository and use the server’s clone URL',
68
+ flags: ['--url', '--dir', '--json', '--help'],
69
+ run: cloneCommand,
70
+ },
71
+ {
72
+ name: 'init',
73
+ group: 'Git',
74
+ summary: 'Start a local repository: folder, .git and an empty README',
75
+ flags: ['--dir', '--help'],
76
+ run: initCommand,
77
+ },
78
+ {
79
+ name: 'status',
80
+ group: 'Git',
81
+ summary: 'Short git status of the current repository',
82
+ flags: ['--help'],
83
+ run: statusCommand,
84
+ },
85
+ {
86
+ name: 'commit',
87
+ group: 'Git',
88
+ summary: 'Stage everything, commit and push',
89
+ flags: ['--url', '--message', '--no-add', '--no-push', '--allow-empty', '--help'],
90
+ run: commitCommand,
91
+ },
92
+ {
93
+ name: 'push',
94
+ group: 'Git',
95
+ summary: 'Push with the saved credentials',
96
+ flags: ['--help'],
97
+ run: pushCommand,
98
+ },
99
+ {
100
+ name: 'pull',
101
+ group: 'Git',
102
+ summary: 'Pull with the saved credentials',
103
+ flags: ['--help'],
104
+ run: pullCommand,
105
+ },
106
+ {
107
+ name: 'config',
108
+ group: 'Config',
109
+ summary: 'Show or edit the config file and session',
110
+ flags: ['--json', '--help'],
111
+ run: configCommand,
112
+ },
113
+ ];
114
+ export const GROUPS = ['Account', 'Repositories', 'Git', 'Config'];
115
+ /** Commands the interactive shell handles itself. */
116
+ export const SHELL_BUILTINS = ['clear', 'exit', 'help'];
117
+ /** Look a command up by name or alias, case-insensitively. */
118
+ export function findCommand(name) {
119
+ const needle = name.trim().toLowerCase();
120
+ if (needle === '')
121
+ return undefined;
122
+ return COMMANDS.find((command) => command.name === needle || command.aliases?.includes(needle) === true);
123
+ }
124
+ /** Every accepted command word, sorted, for completion. */
125
+ export function commandNames() {
126
+ const names = COMMANDS.flatMap((command) => [command.name, ...(command.aliases ?? [])]);
127
+ return [...new Set(names)].sort();
128
+ }
129
+ /** Run one command line; unknown names fail like the one-shot CLI does. */
130
+ export async function dispatch(argv) {
131
+ const [name, ...rest] = argv;
132
+ const command = name === undefined ? undefined : findCommand(name);
133
+ if (command === undefined) {
134
+ const label = name === undefined ? '' : ` '${name}'`;
135
+ throw new CliError(`Unknown command${label}. Type \`help\` to list the commands.`);
136
+ }
137
+ await command.run(rest);
138
+ }
139
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"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"}