microgit-cli 0.0.0-stage → 0.1.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.
- 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 +32 -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 +91 -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 +100 -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 @@
|
|
|
1
|
+
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/commands/repos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { CliError } from '../error/index.js';
|
|
5
|
+
import { BIN, SETTINGS } from './settings.js';
|
|
6
|
+
/** Environment variables, named from the settings prefix. */
|
|
7
|
+
export const ENV = {
|
|
8
|
+
url: `${SETTINGS.envPrefix}_URL`,
|
|
9
|
+
token: `${SETTINGS.envPrefix}_TOKEN`,
|
|
10
|
+
username: `${SETTINGS.envPrefix}_USERNAME`,
|
|
11
|
+
password: `${SETTINGS.envPrefix}_PASSWORD`,
|
|
12
|
+
config: `${SETTINGS.envPrefix}_CONFIG`,
|
|
13
|
+
};
|
|
14
|
+
export const DEFAULT_URL = 'http://127.0.0.1:3000';
|
|
15
|
+
/** `MICROGIT_CONFIG` (or the settings prefix) can point at a different file. */
|
|
16
|
+
export function configFilePath() {
|
|
17
|
+
const override = process.env[ENV.config]?.trim();
|
|
18
|
+
return override
|
|
19
|
+
? path.resolve(override)
|
|
20
|
+
: path.join(os.homedir(), SETTINGS.configDir, 'config.json');
|
|
21
|
+
}
|
|
22
|
+
export function readStoredConfig() {
|
|
23
|
+
const file = configFilePath();
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = fs.readFileSync(file, 'utf8');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error.code === 'ENOENT')
|
|
30
|
+
return {};
|
|
31
|
+
throw new CliError(`Cannot read the config file ${file}: ${error.message}`);
|
|
32
|
+
}
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new CliError(`Config file ${file} is not valid JSON: ${error.message}\n` +
|
|
39
|
+
`Fix it or run \`${BIN} config clear\`.`);
|
|
40
|
+
}
|
|
41
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
42
|
+
throw new CliError(`Config file ${file} must contain a JSON object.`);
|
|
43
|
+
}
|
|
44
|
+
const value = parsed;
|
|
45
|
+
const text = (key) => typeof value[key] === 'string' && value[key] !== '' ? value[key] : undefined;
|
|
46
|
+
return {
|
|
47
|
+
url: text('url'),
|
|
48
|
+
username: text('username'),
|
|
49
|
+
token: text('token'),
|
|
50
|
+
expiresAt: text('expiresAt'),
|
|
51
|
+
password: text('password'),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function writeStoredConfig(config) {
|
|
55
|
+
const file = configFilePath();
|
|
56
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
57
|
+
const clean = {};
|
|
58
|
+
if (config.url)
|
|
59
|
+
clean.url = config.url;
|
|
60
|
+
if (config.username)
|
|
61
|
+
clean.username = config.username;
|
|
62
|
+
if (config.token)
|
|
63
|
+
clean.token = config.token;
|
|
64
|
+
if (config.expiresAt)
|
|
65
|
+
clean.expiresAt = config.expiresAt;
|
|
66
|
+
if (config.password)
|
|
67
|
+
clean.password = config.password;
|
|
68
|
+
fs.writeFileSync(file, `${JSON.stringify(clean, null, 2)}\n`, {
|
|
69
|
+
encoding: 'utf8',
|
|
70
|
+
mode: 0o600,
|
|
71
|
+
});
|
|
72
|
+
// Windows ignores the mode; everywhere else keep the file private.
|
|
73
|
+
try {
|
|
74
|
+
fs.chmodSync(file, 0o600);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Best effort only.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function clearStoredConfig() {
|
|
81
|
+
try {
|
|
82
|
+
fs.rmSync(configFilePath(), { force: true });
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
throw new CliError(`Cannot remove the config file: ${error.message}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Accept `host`, `host:3000`, `https://host`; strip trailing slashes. */
|
|
89
|
+
export function normalizeUrl(raw) {
|
|
90
|
+
const trimmed = raw.trim().replace(/\/+$/, '');
|
|
91
|
+
if (trimmed === '')
|
|
92
|
+
return DEFAULT_URL;
|
|
93
|
+
return /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed) ? trimmed : `http://${trimmed}`;
|
|
94
|
+
}
|
|
95
|
+
/** `--url` first, then the URL env var, then the stored value, then localhost. */
|
|
96
|
+
export function resolveUrl(flagUrl) {
|
|
97
|
+
const stored = readStoredConfig();
|
|
98
|
+
return normalizeUrl(flagUrl?.trim() || process.env[ENV.url]?.trim() || stored.url || DEFAULT_URL);
|
|
99
|
+
}
|
|
100
|
+
/** Everything a command needs: URL, token and optional git credentials. */
|
|
101
|
+
export function loadConfig(flagUrl) {
|
|
102
|
+
const stored = readStoredConfig();
|
|
103
|
+
return {
|
|
104
|
+
...stored,
|
|
105
|
+
url: resolveUrl(flagUrl),
|
|
106
|
+
token: process.env[ENV.token]?.trim() || stored.token,
|
|
107
|
+
username: process.env[ENV.username]?.trim() || stored.username,
|
|
108
|
+
password: process.env[ENV.password] || stored.password,
|
|
109
|
+
configPath: configFilePath(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function requireAuth(config) {
|
|
113
|
+
if (!config.token) {
|
|
114
|
+
throw new CliError(`You are not signed in. Run \`${BIN} login\` first.`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Basic credentials for git, or `null` when only the API session is stored. */
|
|
118
|
+
export function gitAuth(config) {
|
|
119
|
+
if (config.username && config.password) {
|
|
120
|
+
return { username: config.username, password: config.password };
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every static, user-facing name in one place. Change these and the banners,
|
|
3
|
+
* prompt, help page, messages, environment variables and config folder follow.
|
|
4
|
+
*
|
|
5
|
+
* Alternative taglines you can drop in:
|
|
6
|
+
* 'self-hosted git over ssh & http, in one command'
|
|
7
|
+
* 'host, clone and push — no cloud in the middle'
|
|
8
|
+
* Alternative labels: 'gitserver', 'githost', 'git service'.
|
|
9
|
+
*/
|
|
10
|
+
export const SETTINGS = {
|
|
11
|
+
/** npm package name (`name` in package.json). */
|
|
12
|
+
packageName: 'microgit-cli',
|
|
13
|
+
/** Command installed on PATH (`bin` in package.json). */
|
|
14
|
+
bin: 'microgit',
|
|
15
|
+
/** Product name shown in banners and help. */
|
|
16
|
+
name: 'microgit-cli',
|
|
17
|
+
/** Wordmark at the start of the ASCII logo: `μgit ━━━ ●`. */
|
|
18
|
+
mark: 'μgit',
|
|
19
|
+
version: '0.1.0',
|
|
20
|
+
/** Short label printed next to the name: `microgit-cli • <label>`. */
|
|
21
|
+
label: 'git client',
|
|
22
|
+
tagline: 'manage your own git server — clone, push, host',
|
|
23
|
+
/** One-line description for package.json and README. */
|
|
24
|
+
description: 'Command line client for a self-hosted git server',
|
|
25
|
+
/** Footer line in the boxed logo and the one-line version. */
|
|
26
|
+
footer: 'zero deps · Node 21+',
|
|
27
|
+
/** Prefix for environment variables (MICROGIT_URL, MICROGIT_TOKEN, ...). */
|
|
28
|
+
envPrefix: 'MICROGIT',
|
|
29
|
+
/** Folder under the home directory holding config.json and history. */
|
|
30
|
+
configDir: '.microgit',
|
|
31
|
+
};
|
|
32
|
+
/** The command users type. */
|
|
33
|
+
export const BIN = SETTINGS.bin;
|
|
34
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,iDAAiD;IACjD,WAAW,EAAE,cAAc;IAC3B,yDAAyD;IACzD,GAAG,EAAE,UAAU;IACf,8CAA8C;IAC9C,IAAI,EAAE,cAAc;IACpB,6DAA6D;IAC7D,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,OAAO;IAChB,sEAAsE;IACtE,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,gDAAgD;IACzD,wDAAwD;IACxD,WAAW,EAAE,kDAAkD;IAC/D,8DAA8D;IAC9D,MAAM,EAAE,sBAAsB;IAE9B,4EAA4E;IAC5E,SAAS,EAAE,UAAU;IACrB,uEAAuE;IACvE,SAAS,EAAE,WAAW;CACd,CAAC;AAEX,8BAA8B;AAC9B,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** An expected failure: printed without a stack trace and the process exits 1. */
|
|
2
|
+
export class CliError extends Error {
|
|
3
|
+
exitCode;
|
|
4
|
+
constructor(message, exitCode = 1) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'CliError';
|
|
7
|
+
this.exitCode = exitCode;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/** Readable text for anything thrown, used by the CLI and the shell. */
|
|
11
|
+
export function errorMessage(error) {
|
|
12
|
+
return error instanceof Error ? error.message : String(error);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,QAAQ,GAAG,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
package/src/git/index.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { ENV, gitAuth } from '../config/index.js';
|
|
5
|
+
import { CliError } from '../error/index.js';
|
|
6
|
+
import { BIN } from '../config/settings.js';
|
|
7
|
+
import { info } from '../ui/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Git talks HTTP Basic, not the API's Bearer token. Pass the credentials as an
|
|
10
|
+
* `http.extraHeader` through the environment: unlike a URL or a remote entry it
|
|
11
|
+
* is not written to `.git/config`, and unlike `-c` it is not in the process
|
|
12
|
+
* arguments on most systems.
|
|
13
|
+
*/
|
|
14
|
+
function gitEnv(auth) {
|
|
15
|
+
const env = { ...process.env };
|
|
16
|
+
delete env.GIT_CONFIG_COUNT;
|
|
17
|
+
delete env.GIT_CONFIG_KEY_0;
|
|
18
|
+
delete env.GIT_CONFIG_VALUE_0;
|
|
19
|
+
if (!process.stdin.isTTY)
|
|
20
|
+
env.GIT_TERMINAL_PROMPT = '0';
|
|
21
|
+
if (auth) {
|
|
22
|
+
const basic = Buffer.from(`${auth.username}:${auth.password}`, 'utf8').toString('base64');
|
|
23
|
+
env.GIT_CONFIG_COUNT = '1';
|
|
24
|
+
env.GIT_CONFIG_KEY_0 = 'http.extraHeader';
|
|
25
|
+
env.GIT_CONFIG_VALUE_0 = `Authorization: Basic ${basic}`;
|
|
26
|
+
}
|
|
27
|
+
return env;
|
|
28
|
+
}
|
|
29
|
+
/** Run git, optionally with Basic auth and with inherited stdout/stderr. */
|
|
30
|
+
export function git(args, options = {}) {
|
|
31
|
+
const cwd = options.cwd ?? process.cwd();
|
|
32
|
+
const inherit = options.inherit ?? false;
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const child = spawn('git', args, {
|
|
35
|
+
cwd,
|
|
36
|
+
env: gitEnv(options.auth ?? null),
|
|
37
|
+
stdio: inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'],
|
|
38
|
+
windowsHide: true,
|
|
39
|
+
});
|
|
40
|
+
let stdout = '';
|
|
41
|
+
let stderr = '';
|
|
42
|
+
if (!inherit) {
|
|
43
|
+
child.stdout?.on('data', (chunk) => {
|
|
44
|
+
stdout += chunk.toString('utf8');
|
|
45
|
+
});
|
|
46
|
+
child.stderr?.on('data', (chunk) => {
|
|
47
|
+
stderr += chunk.toString('utf8');
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
child.on('error', (error) => {
|
|
51
|
+
reject(new CliError(`Cannot run git: ${error.message}. Is git installed and in PATH?`));
|
|
52
|
+
});
|
|
53
|
+
child.on('close', (code) => {
|
|
54
|
+
resolve({ code: code ?? 1, stdout, stderr });
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Run a git command and fail the CLI if it exits non-zero. */
|
|
59
|
+
export async function gitChecked(args, options = {}) {
|
|
60
|
+
const inherit = options.inherit ?? true;
|
|
61
|
+
const result = await git(args, { ...options, inherit });
|
|
62
|
+
if (result.code !== 0) {
|
|
63
|
+
throw new CliError(`git ${args.join(' ')} failed with exit code ${result.code}.`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Run a git command and return its trimmed stdout. */
|
|
67
|
+
export async function gitCapture(args, cwd = process.cwd()) {
|
|
68
|
+
const result = await git(args, { cwd });
|
|
69
|
+
if (result.code !== 0) {
|
|
70
|
+
throw new CliError(result.stderr.trim() || `git ${args.join(' ')} failed.`);
|
|
71
|
+
}
|
|
72
|
+
return result.stdout.trim();
|
|
73
|
+
}
|
|
74
|
+
export async function isGitRepo(cwd = process.cwd()) {
|
|
75
|
+
const result = await git(['rev-parse', '--is-inside-work-tree'], { cwd });
|
|
76
|
+
return result.code === 0 && result.stdout.trim() === 'true';
|
|
77
|
+
}
|
|
78
|
+
export async function requireGitRepo(cwd = process.cwd()) {
|
|
79
|
+
if (!(await isGitRepo(cwd))) {
|
|
80
|
+
throw new CliError(`Not a git repository: ${cwd}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function hasRemote(name = 'origin', cwd = process.cwd()) {
|
|
84
|
+
const result = await git(['remote', 'get-url', name], { cwd });
|
|
85
|
+
return result.code === 0;
|
|
86
|
+
}
|
|
87
|
+
async function hasUpstream(cwd = process.cwd()) {
|
|
88
|
+
const result = await git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], { cwd });
|
|
89
|
+
return result.code === 0;
|
|
90
|
+
}
|
|
91
|
+
/** Give a new repository a local identity when git has none configured. */
|
|
92
|
+
export async function ensureIdentity(cwd, username) {
|
|
93
|
+
const name = await git(['config', '--get', 'user.name'], { cwd });
|
|
94
|
+
const email = await git(['config', '--get', 'user.email'], { cwd });
|
|
95
|
+
if (name.stdout.trim() === '') {
|
|
96
|
+
await gitChecked(['config', 'user.name', username], { cwd, inherit: false });
|
|
97
|
+
info(`Set local git user.name to ${username}`);
|
|
98
|
+
}
|
|
99
|
+
if (email.stdout.trim() === '') {
|
|
100
|
+
await gitChecked(['config', 'user.email', `${username}@${BIN}.local`], { cwd, inherit: false });
|
|
101
|
+
info(`Set local git user.email to ${username}@${BIN}.local`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** Clone a repository, using saved credentials when there are any. */
|
|
105
|
+
export async function cloneRepo(repo, dir, config) {
|
|
106
|
+
const target = path.resolve(dir);
|
|
107
|
+
if (fs.existsSync(target)) {
|
|
108
|
+
const entries = fs.readdirSync(target);
|
|
109
|
+
if (entries.length > 0) {
|
|
110
|
+
throw new CliError(`Directory is not empty: ${target}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const auth = gitAuth(config);
|
|
114
|
+
if (repo.private && !auth && !process.stdin.isTTY) {
|
|
115
|
+
throw new CliError('This repository is private and no password is saved. ' +
|
|
116
|
+
`Run \`${BIN} login --save-password\` or set ${ENV.password}.`);
|
|
117
|
+
}
|
|
118
|
+
await gitChecked(['clone', repo.cloneUrl, dir], { auth });
|
|
119
|
+
}
|
|
120
|
+
/** Create a local repository with a first commit and push it to the server. */
|
|
121
|
+
export async function initRepo(repo, dir, config) {
|
|
122
|
+
const target = path.resolve(dir);
|
|
123
|
+
if (fs.existsSync(target) && fs.readdirSync(target).length > 0) {
|
|
124
|
+
throw new CliError(`Directory is not empty: ${target}`);
|
|
125
|
+
}
|
|
126
|
+
fs.mkdirSync(target, { recursive: true });
|
|
127
|
+
await gitChecked(['init', '-b', 'main'], { cwd: target, inherit: false });
|
|
128
|
+
await ensureIdentity(target, config.username ?? BIN);
|
|
129
|
+
const readme = path.join(target, 'README.md');
|
|
130
|
+
if (!fs.existsSync(readme)) {
|
|
131
|
+
fs.writeFileSync(readme, `# ${repo.name}\n`, 'utf8');
|
|
132
|
+
}
|
|
133
|
+
await gitChecked(['add', '-A'], { cwd: target, inherit: false });
|
|
134
|
+
await gitChecked(['commit', '-m', 'Initial commit'], { cwd: target });
|
|
135
|
+
await gitChecked(['remote', 'add', 'origin', repo.cloneUrl], { cwd: target, inherit: false });
|
|
136
|
+
await pushRepo(config, [], target);
|
|
137
|
+
}
|
|
138
|
+
/** Push the current branch, setting an upstream on the first push. */
|
|
139
|
+
export async function pushRepo(config, extra = [], cwd = process.cwd()) {
|
|
140
|
+
await requireGitRepo(cwd);
|
|
141
|
+
if (!(await hasRemote('origin', cwd))) {
|
|
142
|
+
throw new CliError(`This repository has no 'origin' remote. Use \`${BIN} clone <owner/name>\` or add one with git.`);
|
|
143
|
+
}
|
|
144
|
+
const auth = gitAuth(config);
|
|
145
|
+
if (!auth && !process.stdin.isTTY) {
|
|
146
|
+
throw new CliError(`No saved git password. Run \`${BIN} login --save-password\` or set ${ENV.password}.`);
|
|
147
|
+
}
|
|
148
|
+
const args = extra.length > 0
|
|
149
|
+
? ['push', ...extra]
|
|
150
|
+
: (await hasUpstream(cwd))
|
|
151
|
+
? ['push']
|
|
152
|
+
: ['push', '-u', 'origin', 'HEAD'];
|
|
153
|
+
await gitChecked(args, { cwd, auth });
|
|
154
|
+
}
|
|
155
|
+
/** Pull from origin, using saved credentials when there are any. */
|
|
156
|
+
export async function pullRepo(config, extra = [], cwd = process.cwd()) {
|
|
157
|
+
await requireGitRepo(cwd);
|
|
158
|
+
if (!(await hasRemote('origin', cwd))) {
|
|
159
|
+
throw new CliError(`This repository has no 'origin' remote. Use \`${BIN} clone <owner/name>\` or add one with git.`);
|
|
160
|
+
}
|
|
161
|
+
await gitChecked(['pull', ...extra], { cwd, auth: gitAuth(config) });
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|