bbk-cli 1.1.2 → 1.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/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +14 -0
- package/README.md +113 -132
- package/dist/cli/wrapper.d.ts +0 -1
- package/dist/cli/wrapper.d.ts.map +1 -1
- package/dist/cli/wrapper.js +19 -54
- package/dist/cli/wrapper.js.map +1 -1
- package/dist/commands/helpers.js +1 -1
- package/dist/commands/runner.d.ts.map +1 -1
- package/dist/commands/runner.js +22 -18
- package/dist/commands/runner.js.map +1 -1
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +37 -52
- package/dist/config/constants.js.map +1 -1
- package/dist/utils/arg-parser.d.ts.map +1 -1
- package/dist/utils/arg-parser.js +23 -8
- package/dist/utils/arg-parser.js.map +1 -1
- package/dist/utils/bitbucket-client.d.ts +24 -37
- package/dist/utils/bitbucket-client.d.ts.map +1 -1
- package/dist/utils/bitbucket-client.js +38 -52
- package/dist/utils/bitbucket-client.js.map +1 -1
- package/dist/utils/bitbucket-utils.d.ts +48 -68
- package/dist/utils/bitbucket-utils.d.ts.map +1 -1
- package/dist/utils/bitbucket-utils.js +100 -125
- package/dist/utils/bitbucket-utils.js.map +1 -1
- package/dist/utils/config-loader.d.ts +10 -29
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +277 -51
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -3
- package/tests/integration/cli-integration.test.ts +96 -217
- package/tests/unit/cli/wrapper.test.ts +28 -137
- package/tests/unit/commands/runner.test.ts +69 -197
- package/tests/unit/utils/arg-parser.test.ts +53 -4
- package/tests/unit/utils/config-loader.test.ts +441 -106
|
@@ -1,6 +1,71 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
2
3
|
import path from 'node:path';
|
|
3
|
-
import
|
|
4
|
+
import readline from 'readline';
|
|
5
|
+
/**
|
|
6
|
+
* Parse INI-style config file content
|
|
7
|
+
*/
|
|
8
|
+
function parseIniConfig(content) {
|
|
9
|
+
const config = {};
|
|
10
|
+
const lines = content.split('\n');
|
|
11
|
+
let currentSection = null;
|
|
12
|
+
const warnings = [];
|
|
13
|
+
for (const line of lines) {
|
|
14
|
+
const trimmedLine = line.trim();
|
|
15
|
+
// Skip empty lines and comments
|
|
16
|
+
if (!trimmedLine || trimmedLine.startsWith('#')) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
// Section header
|
|
20
|
+
const sectionMatch = trimmedLine.match(/^\[([^\]]+)\]$/);
|
|
21
|
+
if (sectionMatch) {
|
|
22
|
+
currentSection = sectionMatch[1];
|
|
23
|
+
if (!['auth', 'defaults'].includes(currentSection)) {
|
|
24
|
+
warnings.push(`Unknown section: [${currentSection}]`);
|
|
25
|
+
}
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// Key-value pair
|
|
29
|
+
const keyValueMatch = trimmedLine.match(/^([^=]+)=(.*)$/);
|
|
30
|
+
if (keyValueMatch && currentSection) {
|
|
31
|
+
const key = keyValueMatch[1].trim();
|
|
32
|
+
const value = keyValueMatch[2].trim();
|
|
33
|
+
if (currentSection === 'auth') {
|
|
34
|
+
if (key === 'email') {
|
|
35
|
+
config.email = value;
|
|
36
|
+
}
|
|
37
|
+
else if (key === 'api_token') {
|
|
38
|
+
config.apiToken = value;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
warnings.push(`Unknown key in [auth]: ${key}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (currentSection === 'defaults') {
|
|
45
|
+
if (key === 'workspace' && value) {
|
|
46
|
+
config.defaultWorkspace = value;
|
|
47
|
+
}
|
|
48
|
+
else if (key === 'format') {
|
|
49
|
+
if (value === 'json' || value === 'toon') {
|
|
50
|
+
config.defaultFormat = value;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
warnings.push(`Invalid format value: "${value}". Must be 'json' or 'toon'.`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (key) {
|
|
57
|
+
warnings.push(`Unknown key in [defaults]: ${key}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Log warnings if any
|
|
63
|
+
if (warnings.length > 0) {
|
|
64
|
+
console.warn('Configuration warnings:');
|
|
65
|
+
warnings.forEach(w => console.warn(` - ${w}`));
|
|
66
|
+
}
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
4
69
|
/**
|
|
5
70
|
* Validate email format
|
|
6
71
|
*/
|
|
@@ -9,68 +74,229 @@ function isValidEmail(email) {
|
|
|
9
74
|
return emailRegex.test(email);
|
|
10
75
|
}
|
|
11
76
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* @param projectRoot - Project root directory
|
|
15
|
-
* @returns Configuration object with profiles and settings
|
|
77
|
+
* Prompt for email with validation
|
|
78
|
+
* @param currentValue - Existing email value to pre-populate in input buffer
|
|
16
79
|
*/
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
80
|
+
async function promptEmail(currentValue) {
|
|
81
|
+
const rl = readline.createInterface({
|
|
82
|
+
input: process.stdin,
|
|
83
|
+
output: process.stdout,
|
|
84
|
+
});
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
const ask = () => {
|
|
87
|
+
// Pre-fill existing value in input buffer for editing
|
|
88
|
+
if (currentValue) {
|
|
89
|
+
rl.write(currentValue);
|
|
90
|
+
}
|
|
91
|
+
rl.question('email: ', email => {
|
|
92
|
+
email = email.trim();
|
|
93
|
+
// If user presses Enter without input, keep existing value
|
|
94
|
+
if (!email && currentValue) {
|
|
95
|
+
rl.close();
|
|
96
|
+
resolve(currentValue);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (!email) {
|
|
100
|
+
console.log('Email is required.');
|
|
101
|
+
ask();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!isValidEmail(email)) {
|
|
105
|
+
console.log('Invalid email format. Please try again.');
|
|
106
|
+
ask();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
rl.close();
|
|
110
|
+
resolve(email);
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
rl.on('error', error => {
|
|
114
|
+
reject(new Error(`Failed to read input: ${error.message}`));
|
|
115
|
+
});
|
|
116
|
+
ask();
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Prompt for api_token with hidden input
|
|
121
|
+
* @param currentValue - Existing api_token value (pre-filled as masked)
|
|
122
|
+
*/
|
|
123
|
+
async function promptApiToken(currentValue) {
|
|
124
|
+
const rl = readline.createInterface({
|
|
125
|
+
input: process.stdin,
|
|
126
|
+
output: process.stdout,
|
|
127
|
+
});
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
const ask = () => {
|
|
130
|
+
// Pre-fill masked value for visual indication
|
|
131
|
+
if (currentValue) {
|
|
132
|
+
rl.write('********');
|
|
133
|
+
}
|
|
134
|
+
rl.question('api_token: ', apiToken => {
|
|
135
|
+
apiToken = apiToken.trim();
|
|
136
|
+
// Remove all asterisks from input (user may have deleted the pre-filled mask)
|
|
137
|
+
const withoutAsterisks = apiToken.replace(/\*/g, '');
|
|
138
|
+
// If user input is empty after removing asterisks and there's an existing value, keep it
|
|
139
|
+
if (!withoutAsterisks && currentValue) {
|
|
140
|
+
rl.close();
|
|
141
|
+
resolve(currentValue);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (!withoutAsterisks) {
|
|
145
|
+
console.log('API token is required.');
|
|
146
|
+
ask();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
rl.close();
|
|
150
|
+
resolve(withoutAsterisks);
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
rl.on('error', error => {
|
|
154
|
+
reject(new Error(`Failed to read input: ${error.message}`));
|
|
155
|
+
});
|
|
156
|
+
ask();
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Prompt for optional default workspace
|
|
161
|
+
* @param currentValue - Existing workspace value to pre-populate in input buffer
|
|
162
|
+
*/
|
|
163
|
+
async function promptWorkspace(currentValue) {
|
|
164
|
+
const rl = readline.createInterface({
|
|
165
|
+
input: process.stdin,
|
|
166
|
+
output: process.stdout,
|
|
167
|
+
});
|
|
168
|
+
return new Promise((resolve, reject) => {
|
|
169
|
+
// Pre-fill existing value in input buffer for editing
|
|
170
|
+
if (currentValue) {
|
|
171
|
+
rl.write(currentValue);
|
|
172
|
+
}
|
|
173
|
+
rl.question('workspace: ', workspace => {
|
|
174
|
+
workspace = workspace.trim();
|
|
175
|
+
rl.close();
|
|
176
|
+
// If user presses Enter without input, keep existing value or undefined
|
|
177
|
+
resolve(workspace || currentValue);
|
|
178
|
+
});
|
|
179
|
+
rl.on('error', error => {
|
|
180
|
+
reject(new Error(`Failed to read input: ${error.message}`));
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Prompt for format preference (json/toon)
|
|
186
|
+
* @param currentValue - Existing format value to pre-populate in input buffer
|
|
187
|
+
*/
|
|
188
|
+
async function promptFormat(currentValue = 'json') {
|
|
189
|
+
const rl = readline.createInterface({
|
|
190
|
+
input: process.stdin,
|
|
191
|
+
output: process.stdout,
|
|
192
|
+
});
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
const ask = () => {
|
|
195
|
+
// Pre-fill existing value in input buffer for editing
|
|
196
|
+
rl.write(currentValue);
|
|
197
|
+
rl.question('format: ', format => {
|
|
198
|
+
format = format.trim().toLowerCase();
|
|
199
|
+
// If user presses Enter without input, keep existing value
|
|
200
|
+
if (!format) {
|
|
201
|
+
rl.close();
|
|
202
|
+
resolve(currentValue);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (format === 'json' || format === 'toon') {
|
|
206
|
+
rl.close();
|
|
207
|
+
resolve(format);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
console.log('Invalid format. Please choose json or toon.');
|
|
211
|
+
ask();
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
rl.on('error', error => {
|
|
215
|
+
reject(new Error(`Failed to read input: ${error.message}`));
|
|
216
|
+
});
|
|
217
|
+
ask();
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Interactive config setup using readline
|
|
222
|
+
* Prompts user for email and api_token, then writes config file
|
|
223
|
+
* If config file exists, pre-populates existing values in input buffer
|
|
224
|
+
*/
|
|
225
|
+
export async function setupConfig() {
|
|
226
|
+
const configPath = path.join(os.homedir(), '.bbkcli');
|
|
227
|
+
// Load existing config if it exists
|
|
228
|
+
let existingConfig = {};
|
|
229
|
+
if (fs.existsSync(configPath)) {
|
|
230
|
+
try {
|
|
231
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
232
|
+
existingConfig = parseIniConfig(content);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Failed to read existing config file; proceed to create a new configuration.
|
|
236
|
+
}
|
|
35
237
|
}
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
238
|
+
// Collect credentials (with existing values pre-populated in input buffer)
|
|
239
|
+
const email = await promptEmail(existingConfig.email);
|
|
240
|
+
const apiToken = await promptApiToken(existingConfig.apiToken);
|
|
241
|
+
// Optional fields (with existing values pre-populated in input buffer)
|
|
242
|
+
const defaultWorkspace = await promptWorkspace(existingConfig.defaultWorkspace);
|
|
243
|
+
const format = await promptFormat(existingConfig.defaultFormat);
|
|
244
|
+
// Write config file
|
|
245
|
+
let configContent = `[auth]
|
|
246
|
+
email=${email}
|
|
247
|
+
api_token=${apiToken}
|
|
248
|
+
`;
|
|
249
|
+
if (defaultWorkspace || format !== 'json') {
|
|
250
|
+
configContent += `\n[defaults]\n`;
|
|
251
|
+
if (defaultWorkspace) {
|
|
252
|
+
configContent += `workspace=${defaultWorkspace}\n`;
|
|
41
253
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
throw new Error(`Profile "${profileName}" has invalid email format: "${profile.email}"`);
|
|
254
|
+
if (format !== 'json') {
|
|
255
|
+
configContent += `format=${format}\n`;
|
|
45
256
|
}
|
|
46
257
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
258
|
+
try {
|
|
259
|
+
fs.writeFileSync(configPath, configContent, { mode: 0o600 }); // Read/write for owner only
|
|
260
|
+
console.log(`\n✓ Config saved to ${configPath}`);
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
264
|
+
throw new Error(`Cannot write config: ${errorMessage}`);
|
|
265
|
+
}
|
|
52
266
|
}
|
|
53
267
|
/**
|
|
54
|
-
*
|
|
268
|
+
* Load Bitbucket connection configuration from ~/.bbkcli
|
|
55
269
|
*
|
|
56
|
-
* @
|
|
57
|
-
* @
|
|
58
|
-
* @returns Bitbucket client options object with basic auth
|
|
270
|
+
* @returns Configuration object with auth settings and defaults
|
|
271
|
+
* @throws Error if config file doesn't exist or is invalid
|
|
59
272
|
*/
|
|
60
|
-
export function
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
63
|
-
|
|
64
|
-
throw new Error(`Profile "${profileName}" not found. Available profiles: ${availableProfiles}`);
|
|
273
|
+
export function loadConfig() {
|
|
274
|
+
const configPath = path.join(os.homedir(), '.bbkcli');
|
|
275
|
+
if (!fs.existsSync(configPath)) {
|
|
276
|
+
throw new Error(`Please run: bbk-cli config`);
|
|
65
277
|
}
|
|
66
|
-
|
|
67
|
-
|
|
278
|
+
let content;
|
|
279
|
+
try {
|
|
280
|
+
content = fs.readFileSync(configPath, 'utf-8');
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
284
|
+
throw new Error(`Cannot read config: ${errorMessage}`);
|
|
285
|
+
}
|
|
286
|
+
const config = parseIniConfig(content);
|
|
287
|
+
// Validate required fields (should be valid after setup, but double-check)
|
|
288
|
+
if (!config.email || !config.apiToken) {
|
|
289
|
+
throw new Error(`Missing "email" or "api_token" in ${configPath}`);
|
|
290
|
+
}
|
|
291
|
+
// Validate email format
|
|
292
|
+
if (!isValidEmail(config.email)) {
|
|
293
|
+
throw new Error(`Invalid email: ${config.email} in ${configPath}`);
|
|
68
294
|
}
|
|
69
295
|
return {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
296
|
+
email: config.email,
|
|
297
|
+
apiToken: config.apiToken,
|
|
298
|
+
defaultWorkspace: config.defaultWorkspace,
|
|
299
|
+
defaultFormat: config.defaultFormat || 'json',
|
|
74
300
|
};
|
|
75
301
|
}
|
|
76
302
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { parseArguments } from './arg-parser.js';
|
|
2
|
-
export { loadConfig } from './config-loader.js';
|
|
2
|
+
export { loadConfig, setupConfig } from './config-loader.js';
|
|
3
3
|
export type { Config } from './config-loader.js';
|
|
4
4
|
export { listRepositories, getRepository, listPullRequests, getPullRequest, createPullRequest, listBranches, listCommits, listIssues, getIssue, createIssue, listPipelines, getUser, testConnection, clearClients, } from './bitbucket-client.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,OAAO,EACP,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { parseArguments } from './arg-parser.js';
|
|
2
|
-
export { loadConfig } from './config-loader.js';
|
|
2
|
+
export { loadConfig, setupConfig } from './config-loader.js';
|
|
3
3
|
export { listRepositories, getRepository, listPullRequests, getPullRequest, createPullRequest, listBranches, listCommits, listIssues, getIssue, createIssue, listPipelines, getUser, testConnection, clearClients, } from './bitbucket-client.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,QAAQ,EACR,WAAW,EACX,aAAa,EACb,OAAO,EACP,cAAc,EACd,YAAY,GACb,MAAM,uBAAuB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bbk-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "A powerful command-line interface for Bitbucket interaction with support for repositories, pull requests, issues, and pipelines",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -11,8 +11,6 @@
|
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"start": "tsx src/index.ts",
|
|
13
13
|
"dev": "tsx src/index.ts",
|
|
14
|
-
"conductor": "tsx src/conductor-cli.ts",
|
|
15
|
-
"conductor:dev": "tsx src/conductor-cli.ts",
|
|
16
14
|
"test": "vitest run",
|
|
17
15
|
"test:watch": "vitest",
|
|
18
16
|
"test:ui": "vitest --ui",
|