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.
Files changed (39) hide show
  1. package/.release-please-manifest.json +1 -1
  2. package/CHANGELOG.md +14 -0
  3. package/README.md +113 -132
  4. package/dist/cli/wrapper.d.ts +0 -1
  5. package/dist/cli/wrapper.d.ts.map +1 -1
  6. package/dist/cli/wrapper.js +19 -54
  7. package/dist/cli/wrapper.js.map +1 -1
  8. package/dist/commands/helpers.js +1 -1
  9. package/dist/commands/runner.d.ts.map +1 -1
  10. package/dist/commands/runner.js +22 -18
  11. package/dist/commands/runner.js.map +1 -1
  12. package/dist/config/constants.d.ts.map +1 -1
  13. package/dist/config/constants.js +37 -52
  14. package/dist/config/constants.js.map +1 -1
  15. package/dist/utils/arg-parser.d.ts.map +1 -1
  16. package/dist/utils/arg-parser.js +23 -8
  17. package/dist/utils/arg-parser.js.map +1 -1
  18. package/dist/utils/bitbucket-client.d.ts +24 -37
  19. package/dist/utils/bitbucket-client.d.ts.map +1 -1
  20. package/dist/utils/bitbucket-client.js +38 -52
  21. package/dist/utils/bitbucket-client.js.map +1 -1
  22. package/dist/utils/bitbucket-utils.d.ts +48 -68
  23. package/dist/utils/bitbucket-utils.d.ts.map +1 -1
  24. package/dist/utils/bitbucket-utils.js +100 -125
  25. package/dist/utils/bitbucket-utils.js.map +1 -1
  26. package/dist/utils/config-loader.d.ts +10 -29
  27. package/dist/utils/config-loader.d.ts.map +1 -1
  28. package/dist/utils/config-loader.js +277 -51
  29. package/dist/utils/config-loader.js.map +1 -1
  30. package/dist/utils/index.d.ts +1 -1
  31. package/dist/utils/index.d.ts.map +1 -1
  32. package/dist/utils/index.js +1 -1
  33. package/dist/utils/index.js.map +1 -1
  34. package/package.json +1 -3
  35. package/tests/integration/cli-integration.test.ts +96 -217
  36. package/tests/unit/cli/wrapper.test.ts +28 -137
  37. package/tests/unit/commands/runner.test.ts +69 -197
  38. package/tests/unit/utils/arg-parser.test.ts +53 -4
  39. 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 yaml from 'yaml';
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
- * Load Bitbucket connection profiles from .claude/bitbucket-config.local.md
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
- export function loadConfig(projectRoot) {
18
- const configPath = path.join(projectRoot, '.claude', 'bitbucket-config.local.md');
19
- if (!fs.existsSync(configPath)) {
20
- throw new Error(`Configuration file not found at ${configPath}\n` +
21
- `Please create .claude/bitbucket-config.local.md with your Bitbucket profiles.`);
22
- }
23
- const content = fs.readFileSync(configPath, 'utf-8');
24
- // Extract YAML frontmatter
25
- const frontmatterRegex = /^---\n([\s\S]*?)\n---/;
26
- const frontmatterMatch = frontmatterRegex.exec(content);
27
- if (!frontmatterMatch) {
28
- throw new Error(`Invalid configuration file format. Expected YAML frontmatter (---...---) at the beginning.`);
29
- }
30
- const frontmatter = frontmatterMatch[1];
31
- const config = yaml.parse(frontmatter);
32
- // Validate configuration
33
- if (!config.profiles || typeof config.profiles !== 'object') {
34
- throw new Error('Configuration must include "profiles" object');
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
- // Validate each profile
37
- for (const [profileName, profile] of Object.entries(config.profiles)) {
38
- // Email and apiToken are required
39
- if (!profile.email || !profile.apiToken) {
40
- throw new Error(`Profile "${profileName}" must have both "email" and "apiToken"`);
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
- // Validate email format
43
- if (!isValidEmail(profile.email)) {
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
- return {
48
- profiles: config.profiles,
49
- defaultProfile: config.defaultProfile || Object.keys(config.profiles)[0],
50
- defaultFormat: config.defaultFormat || 'json',
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
- * Get Bitbucket client options for a specific profile
268
+ * Load Bitbucket connection configuration from ~/.bbkcli
55
269
  *
56
- * @param config - Configuration object
57
- * @param profileName - Profile name
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 getBitbucketClientOptions(config, profileName) {
61
- const profile = config.profiles[profileName];
62
- if (!profile) {
63
- const availableProfiles = Object.keys(config.profiles).join(', ');
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
- if (!profile.email || !profile.apiToken) {
67
- throw new Error(`Profile "${profileName}" must have both "email" and "apiToken"`);
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
- auth: {
71
- email: profile.email,
72
- apiToken: profile.apiToken,
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":"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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/utils/config-loader.ts"],"names":[],"mappings":"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"}
@@ -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;AAChD,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"}
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"}
@@ -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
@@ -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;AAEhD,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"}
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.1.2",
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",