repo-do 1.2.1 → 1.3.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.
Files changed (52) hide show
  1. package/README.md +50 -1
  2. package/dist/cli.js +19 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/add.d.ts +2 -0
  5. package/dist/commands/add.d.ts.map +1 -1
  6. package/dist/commands/add.js +52 -6
  7. package/dist/commands/add.js.map +1 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +1 -0
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/find.js +1 -1
  12. package/dist/commands/find.js.map +1 -1
  13. package/dist/commands/list.d.ts.map +1 -1
  14. package/dist/commands/list.js +8 -3
  15. package/dist/commands/list.js.map +1 -1
  16. package/dist/commands/remove.js +1 -1
  17. package/dist/commands/remove.js.map +1 -1
  18. package/dist/commands/scan.d.ts +2 -0
  19. package/dist/commands/scan.d.ts.map +1 -0
  20. package/dist/commands/scan.js +29 -0
  21. package/dist/commands/scan.js.map +1 -0
  22. package/dist/constants/index.d.ts +1 -0
  23. package/dist/constants/index.d.ts.map +1 -1
  24. package/dist/constants/index.js +1 -0
  25. package/dist/constants/index.js.map +1 -1
  26. package/dist/core/config-manager.d.ts.map +1 -1
  27. package/dist/core/config-manager.js +7 -1
  28. package/dist/core/config-manager.js.map +1 -1
  29. package/dist/core/git-url-parser.d.ts +1 -0
  30. package/dist/core/git-url-parser.d.ts.map +1 -1
  31. package/dist/core/git-url-parser.js +27 -25
  32. package/dist/core/git-url-parser.js.map +1 -1
  33. package/dist/core/repository-manager.d.ts +11 -4
  34. package/dist/core/repository-manager.d.ts.map +1 -1
  35. package/dist/core/repository-manager.js +228 -12
  36. package/dist/core/repository-manager.js.map +1 -1
  37. package/dist/core/repository-registry.d.ts +22 -0
  38. package/dist/core/repository-registry.d.ts.map +1 -0
  39. package/dist/core/repository-registry.js +104 -0
  40. package/dist/core/repository-registry.js.map +1 -0
  41. package/dist/index.d.ts +9 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +10 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/types/index.d.ts +34 -0
  46. package/dist/types/index.d.ts.map +1 -1
  47. package/dist/types/index.js.map +1 -1
  48. package/dist/utils/git-executor.d.ts +12 -0
  49. package/dist/utils/git-executor.d.ts.map +1 -1
  50. package/dist/utils/git-executor.js +25 -0
  51. package/dist/utils/git-executor.js.map +1 -1
  52. package/package.json +3 -3
package/README.md CHANGED
@@ -25,6 +25,8 @@ English · [简体中文](./docs/README.zh-CN.md)
25
25
  - **Fast Repository Search**: Quickly find repositories by name or path fragments
26
26
  - **Clipboard Integration**: Automatically copy `cd` commands to clipboard
27
27
  - **Cache-Based Performance**: Fast repository listing without repeated directory scans
28
+ - **Existing Repository Detection**: Track existing clones by remote URL and reuse them before cloning duplicates
29
+ - **Multi-Location Tracking**: Keep multiple local directories for the same remote repository when needed
28
30
  - **Cross-Platform**: Works on Windows, macOS, and Linux
29
31
  - **Git Clone Pass-through**: Support all git clone arguments (--depth, --branch, etc.)
30
32
 
@@ -121,8 +123,16 @@ repo-do add git@github.com:STDSuperman/NanoBanana-PPT-Skills.git
121
123
 
122
124
  # JSON output (for scripts and AI models)
123
125
  repo-do add https://github.com/user/repo.git --json
126
+
127
+ # Force a new clone even if the same remote is already tracked
128
+ repo-do add https://github.com/user/repo.git --force-clone
129
+
130
+ # Use an already tracked local repository without prompting
131
+ repo-do add https://github.com/user/repo.git --use-existing
124
132
  ```
125
133
 
134
+ Before cloning, `repo-do` checks the global repository configuration for the same remote repository. SSH and HTTPS remotes such as `git@github.com:user/repo.git` and `https://github.com/user/repo` are treated as the same repository. If a matching repository already exists in another local directory, interactive mode asks whether to use the existing directory. `--json` mode uses the existing directory automatically unless `--force-clone` is provided.
135
+
126
136
  **`--json` output:**
127
137
 
128
138
  When using `--json`, the command outputs a single line of JSON to stdout with no spinner, color, or clipboard side effects:
@@ -136,6 +146,7 @@ When using `--json`, the command outputs a single line of JSON to stdout with no
136
146
  | `success` | boolean | `true` if the repo path is available (cloned or already exists) |
137
147
  | `path` | string | Absolute path to the local repository |
138
148
  | `alreadyExists` | boolean | `true` if the repository was already cloned |
149
+ | `adoptedExisting` | boolean | `true` if an existing repository in a different location was used |
139
150
  | `message` | string | Error or status message |
140
151
 
141
152
  On failure, the process exits with code 1 and outputs:
@@ -186,6 +197,22 @@ repo-do list
186
197
  repo-do list --refresh
187
198
  ```
188
199
 
200
+ When `--refresh` is used, `repo-do` scans the configured base directory, records detected Git repositories in configuration, and rebuilds the fast repository cache.
201
+
202
+ ### `repo-do scan [paths...]`
203
+
204
+ Scan existing Git repositories and track them in configuration.
205
+
206
+ ```bash
207
+ # Scan the configured base directory
208
+ repo-do scan
209
+
210
+ # Scan one or more custom directories
211
+ repo-do scan ~/Code ~/work
212
+ ```
213
+
214
+ Detected repositories are grouped by normalized remote URL. If the same remote exists in multiple local directories, all directories are stored as locations for that repository.
215
+
189
216
  ### `repo-do remove <repo>`
190
217
 
191
218
  Remove a repository from tracking (does not delete files).
@@ -234,7 +261,28 @@ Configuration is stored in `~/.repo-do/config.json`:
234
261
  ```json
235
262
  {
236
263
  "baseDirectory": "D:\\Code",
237
- "version": "1.0.0"
264
+ "version": "1.0.0",
265
+ "repositories": [
266
+ {
267
+ "id": "github.com/STDSuperman/super-image-cropper",
268
+ "canonicalRemote": "github.com/STDSuperman/super-image-cropper",
269
+ "displayUrl": "git@github.com:STDSuperman/super-image-cropper.git",
270
+ "domain": "github.com",
271
+ "group": "STDSuperman",
272
+ "name": "super-image-cropper",
273
+ "preferredPath": "D:\\Code\\github.com\\STDSuperman\\super-image-cropper",
274
+ "locations": [
275
+ {
276
+ "path": "D:\\Code\\github.com\\STDSuperman\\super-image-cropper",
277
+ "remoteUrl": "git@github.com:STDSuperman/super-image-cropper.git",
278
+ "remoteName": "origin",
279
+ "source": "clone",
280
+ "firstSeenAt": "2026-01-11T12:00:00.000Z",
281
+ "lastSeenAt": "2026-01-11T12:00:00.000Z"
282
+ }
283
+ ]
284
+ }
285
+ ]
238
286
  }
239
287
  ```
240
288
 
@@ -293,6 +341,7 @@ All paths are handled using Node.js `path` module for cross-platform compatibili
293
341
  - **NOT_FOUND**: Repository not found in cache
294
342
  - **PERMISSION_DENIED**: File system permission error
295
343
  - **GIT_NOT_INSTALLED**: Git is not installed
344
+ - **PATH_CONFLICT**: Target path exists but is not the requested repository
296
345
 
297
346
  ## Development
298
347
 
package/dist/cli.js CHANGED
@@ -1,17 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
+ import { createRequire } from 'module';
3
4
  import { initCommand } from './commands/init.js';
4
5
  import { addCommand } from './commands/add.js';
5
6
  import { listCommand } from './commands/list.js';
6
7
  import { findCommand } from './commands/find.js';
7
8
  import { removeCommand } from './commands/remove.js';
8
9
  import { configCommand } from './commands/config.js';
10
+ import { scanCommand } from './commands/scan.js';
9
11
 
12
+ const require$1 = createRequire(import.meta.url);
13
+ const packageJson = require$1('../package.json');
10
14
  const program = new Command();
11
15
  program
12
16
  .name('repo-do')
13
17
  .description('Unified git repository management tool')
14
- .version('1.0.0');
18
+ .version(packageJson.version);
15
19
  program
16
20
  .command('init')
17
21
  .description('Initialize configuration')
@@ -20,10 +24,17 @@ program
20
24
  .command('add <url>')
21
25
  .description('Clone a git repository')
22
26
  .option('--json', 'Output result as JSON')
27
+ .option('--force-clone', 'Clone even when the same remote already has a tracked local repository')
28
+ .option('--use-existing', 'Use a tracked local repository when the same remote already exists')
23
29
  .allowUnknownOption()
24
30
  .action((url, options, command) => {
25
31
  const args = command.args.slice(1);
26
- addCommand(url, { args, json: options.json });
32
+ addCommand(url, {
33
+ args,
34
+ json: options.json,
35
+ forceClone: options.forceClone,
36
+ useExisting: options.useExisting,
37
+ });
27
38
  });
28
39
  program
29
40
  .command('list')
@@ -40,6 +51,12 @@ program
40
51
  .command('remove <identifier>')
41
52
  .description('Remove repository from management (files not deleted)')
42
53
  .action(removeCommand);
54
+ program
55
+ .command('scan [paths...]')
56
+ .description('Scan existing git repositories and track them in configuration')
57
+ .action((paths) => {
58
+ scanCommand(paths);
59
+ });
43
60
  program
44
61
  .command('config')
45
62
  .description('View or modify configuration')
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;AAUA,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;AAE7B;KACG,IAAI,CAAC,SAAS;KACd,WAAW,CAAC,wCAAwC;KACpD,OAAO,CAAC,OAAO,CAAC;AAEnB;KACG,OAAO,CAAC,MAAM;KACd,WAAW,CAAC,0BAA0B;KACtC,MAAM,CAAC,WAAW,CAAC;AAEtB;KACG,OAAO,CAAC,WAAW;KACnB,WAAW,CAAC,wBAAwB;AACpC,KAAA,MAAM,CAAC,QAAQ,EAAE,uBAAuB;AACxC,KAAA,kBAAkB;KAClB,MAAM,CAAC,CAAC,GAAW,EAAE,OAAY,EAAE,OAAgB,KAAI;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,IAAA,UAAU,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,MAAM;KACd,WAAW,CAAC,+BAA+B;AAC3C,KAAA,MAAM,CAAC,WAAW,EAAE,0BAA0B;AAC9C,KAAA,MAAM,CAAC,CAAC,OAAO,KAAI;IAClB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,eAAe;KACvB,WAAW,CAAC,kCAAkC;KAC9C,MAAM,CAAC,WAAW,CAAC;AAEtB;KACG,OAAO,CAAC,qBAAqB;KAC7B,WAAW,CAAC,uDAAuD;KACnE,MAAM,CAAC,aAAa,CAAC;AAExB;KACG,OAAO,CAAC,QAAQ;KAChB,WAAW,CAAC,8BAA8B;AAC1C,KAAA,MAAM,CAAC,aAAa,EAAE,yBAAyB;AAC/C,KAAA,MAAM,CAAC,aAAa,EAAE,uBAAuB;AAC7C,KAAA,MAAM,CAAC,iBAAiB,EAAE,4BAA4B;AACtD,KAAA,MAAM,CAAC,CAAC,OAAO,KAAI;AAClB,IAAA,aAAa,CAAC;QACZ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;AACrB,KAAA,CAAC;AACJ,CAAC,CAAC;AAEJ,OAAO,CAAC,KAAK,EAAE"}
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":[null],"names":["require"],"mappings":";;;;;;;;;;;AAYA,MAAMA,SAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9C,MAAM,WAAW,GAAGA,SAAO,CAAC,iBAAiB,CAAwB;AACrE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;AAE7B;KACG,IAAI,CAAC,SAAS;KACd,WAAW,CAAC,wCAAwC;AACpD,KAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;AAE/B;KACG,OAAO,CAAC,MAAM;KACd,WAAW,CAAC,0BAA0B;KACtC,MAAM,CAAC,WAAW,CAAC;AAEtB;KACG,OAAO,CAAC,WAAW;KACnB,WAAW,CAAC,wBAAwB;AACpC,KAAA,MAAM,CAAC,QAAQ,EAAE,uBAAuB;AACxC,KAAA,MAAM,CAAC,eAAe,EAAE,wEAAwE;AAChG,KAAA,MAAM,CAAC,gBAAgB,EAAE,oEAAoE;AAC7F,KAAA,kBAAkB;KAClB,MAAM,CAAC,CAAC,GAAW,EAAE,OAAY,EAAE,OAAgB,KAAI;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;AACjC,KAAA,CAAC;AACJ,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,MAAM;KACd,WAAW,CAAC,+BAA+B;AAC3C,KAAA,MAAM,CAAC,WAAW,EAAE,0BAA0B;AAC9C,KAAA,MAAM,CAAC,CAAC,OAAO,KAAI;IAClB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,eAAe;KACvB,WAAW,CAAC,kCAAkC;KAC9C,MAAM,CAAC,WAAW,CAAC;AAEtB;KACG,OAAO,CAAC,qBAAqB;KAC7B,WAAW,CAAC,uDAAuD;KACnE,MAAM,CAAC,aAAa,CAAC;AAExB;KACG,OAAO,CAAC,iBAAiB;KACzB,WAAW,CAAC,gEAAgE;AAC5E,KAAA,MAAM,CAAC,CAAC,KAAe,KAAI;IAC1B,WAAW,CAAC,KAAK,CAAC;AACpB,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,QAAQ;KAChB,WAAW,CAAC,8BAA8B;AAC1C,KAAA,MAAM,CAAC,aAAa,EAAE,yBAAyB;AAC/C,KAAA,MAAM,CAAC,aAAa,EAAE,uBAAuB;AAC7C,KAAA,MAAM,CAAC,iBAAiB,EAAE,4BAA4B;AACtD,KAAA,MAAM,CAAC,CAAC,OAAO,KAAI;AAClB,IAAA,aAAa,CAAC;QACZ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;AACrB,KAAA,CAAC;AACJ,CAAC,CAAC;AAEJ,OAAO,CAAC,KAAK,EAAE"}
@@ -1,5 +1,7 @@
1
1
  export declare function addCommand(url: string, options: {
2
2
  args?: string[];
3
3
  json?: boolean;
4
+ forceClone?: boolean;
5
+ useExisting?: boolean;
4
6
  }): Promise<void>;
5
7
  //# sourceMappingURL=add.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AASA,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CzG"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAYA,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FtJ"}
@@ -1,27 +1,71 @@
1
1
  import { repositoryManager } from '../core/repository-manager.js';
2
+ import { configManager } from '../core/config-manager.js';
2
3
  import { clipboardUtil } from '../utils/clipboard.js';
3
4
  import { logger } from '../utils/logger.js';
5
+ import inquirer from 'inquirer';
4
6
  import ora from 'ora';
7
+ import path from 'path';
5
8
 
6
9
  function outputJson(data) {
7
10
  console.log(JSON.stringify(data));
8
11
  }
9
12
  async function addCommand(url, options) {
10
13
  const jsonMode = options.json ?? false;
11
- const spinner = jsonMode ? null : ora('Cloning repository...').start();
14
+ let forceClone = options.forceClone ?? false;
15
+ let useExisting = options.useExisting ?? true;
16
+ let spinner = null;
12
17
  try {
13
18
  const cloneArgs = options.args || [];
14
- const result = await repositoryManager.cloneRepository(url, cloneArgs, { silent: jsonMode });
19
+ if (!jsonMode && !forceClone && options.useExisting === undefined) {
20
+ const configuredRepository = await repositoryManager.getConfiguredRepository(url);
21
+ const baseDir = await configManager.getBaseDirectory();
22
+ const targetPath = repositoryManager.getTargetPath(url, baseDir);
23
+ const existingLocations = configuredRepository?.locations.filter(location => path.resolve(location.path) !== path.resolve(targetPath)) ?? [];
24
+ if (existingLocations.length > 0) {
25
+ logger.warn('This repository already exists in another location:');
26
+ existingLocations.forEach((location, index) => {
27
+ console.log(`${index + 1}. ${location.path}`);
28
+ });
29
+ const { adoptExisting } = await inquirer.prompt([
30
+ {
31
+ type: 'confirm',
32
+ name: 'adoptExisting',
33
+ message: 'Use the existing repository instead of cloning again?',
34
+ default: true,
35
+ },
36
+ ]);
37
+ useExisting = adoptExisting;
38
+ forceClone = !adoptExisting;
39
+ }
40
+ }
41
+ spinner = jsonMode ? null : ora(forceClone ? 'Cloning repository...' : 'Preparing repository...').start();
42
+ const result = await repositoryManager.cloneRepository(url, cloneArgs, {
43
+ silent: jsonMode,
44
+ forceClone,
45
+ useExisting,
46
+ });
15
47
  if (result.alreadyExists) {
16
48
  if (jsonMode) {
17
- outputJson({ success: true, path: result.path, alreadyExists: true, message: result.message });
49
+ outputJson({
50
+ success: true,
51
+ path: result.path,
52
+ alreadyExists: true,
53
+ adoptedExisting: result.adoptedExisting,
54
+ message: result.message,
55
+ });
18
56
  return;
19
57
  }
20
- spinner.warn(result.message);
58
+ spinner.warn(result.adoptedExisting ? `Using existing repository: ${result.path}` : result.message);
59
+ const cdCommand = `cd ${result.path}`;
60
+ const copied = await clipboardUtil.copy(cdCommand);
61
+ if (copied) {
62
+ logger.info('Path copied to clipboard!');
63
+ }
64
+ console.log(`\n${cdCommand}`);
21
65
  return;
22
66
  }
23
67
  if (jsonMode) {
24
- outputJson({ success: true, path: result.path, alreadyExists: false, message: '' });
68
+ outputJson({ success: true, path: result.path, alreadyExists: false, adoptedExisting: false, message: '' });
25
69
  return;
26
70
  }
27
71
  spinner.succeed('Repository cloned successfully!');
@@ -38,7 +82,9 @@ async function addCommand(url, options) {
38
82
  outputJson({ success: false, path: '', alreadyExists: false, message: error.message });
39
83
  process.exit(1);
40
84
  }
41
- spinner.fail('Failed to clone repository');
85
+ if (spinner) {
86
+ spinner.fail('Failed to clone repository');
87
+ }
42
88
  logger.error(error.message);
43
89
  process.exit(1);
44
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sources":["../../src/commands/add.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAKA,SAAS,UAAU,CAAC,IAAiF,EAAA;IACnG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnC;AAEO,eAAe,UAAU,CAAC,GAAW,EAAE,OAA4C,EAAA;AACxF,IAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK;AACtC,IAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE;AAEtE,IAAA,IAAI;AACF,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;AACpC,QAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAE5F,QAAA,IAAI,MAAM,CAAC,aAAa,EAAE;YACxB,IAAI,QAAQ,EAAE;gBACZ,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9F;YACF;AACA,YAAA,OAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC7B;QACF;QAEA,IAAI,QAAQ,EAAE;YACZ,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACnF;QACF;AAEA,QAAA,OAAQ,CAAC,OAAO,CAAC,iCAAiC,CAAC;AACnD,QAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AAE3B,QAAA,MAAM,SAAS,GAAG,CAAA,GAAA,EAAM,MAAM,CAAC,IAAI,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAElD,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC;QAC1C;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,CAAE,CAAC;IAC/B;IAAE,OAAO,KAAK,EAAE;QACd,IAAI,QAAQ,EAAE;YACZ,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;AACjG,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;AACA,QAAA,OAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC;AAC3C,QAAA,MAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC;AACtC,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
1
+ {"version":3,"file":"add.js","sources":["../../src/commands/add.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B1G"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1G"}
@@ -28,6 +28,7 @@ async function configCommand(options) {
28
28
  const config = await configManager.loadConfig();
29
29
  logger.info('Current configuration:');
30
30
  console.log(` Base directory: ${config.baseDirectory}`);
31
+ console.log(` Tracked repositories: ${config.repositories.length}`);
31
32
  console.log(` Version: ${config.version}`);
32
33
  }
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../src/commands/config.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,eAAe,aAAa,CAAC,OAAuD,EAAA;AACzF,IAAA,IAAI;AACF,QAAA,IAAI,OAAO,CAAC,GAAG,EAAE;AACf,YAAA,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;AAC/C,YAAA,IAAI,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE;AACnC,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YACnC;iBAAO;gBACL,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;AAClD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;QACF;aAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE;AACvC,YAAA,IAAI,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE;gBACnC,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;AACnD,gBAAA,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,CAAA,gBAAA,EAAmB,OAAO,CAAC,KAAK,CAAA,CAAE,CAAC;YACjD;iBAAO;gBACL,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;AAClD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;QACF;aAAO;AACL,YAAA,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,CAAA,kBAAA,EAAqB,MAAM,CAAC,aAAa,CAAA,CAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,CAAA,WAAA,EAAc,MAAM,CAAC,OAAO,CAAA,CAAE,CAAC;QAC7C;IACF;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA6B,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACpE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../src/commands/config.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,eAAe,aAAa,CAAC,OAAuD,EAAA;AACzF,IAAA,IAAI;AACF,QAAA,IAAI,OAAO,CAAC,GAAG,EAAE;AACf,YAAA,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;AAC/C,YAAA,IAAI,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE;AACnC,gBAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YACnC;iBAAO;gBACL,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;AAClD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;QACF;aAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE;AACvC,YAAA,IAAI,OAAO,CAAC,GAAG,KAAK,eAAe,EAAE;gBACnC,MAAM,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;AACnD,gBAAA,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC;gBACrD,MAAM,CAAC,IAAI,CAAC,CAAA,gBAAA,EAAmB,OAAO,CAAC,KAAK,CAAA,CAAE,CAAC;YACjD;iBAAO;gBACL,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,OAAO,CAAC,GAAG,CAAA,CAAE,CAAC;AAClD,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjB;QACF;aAAO;AACL,YAAA,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;AAC/C,YAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,CAAA,kBAAA,EAAqB,MAAM,CAAC,aAAa,CAAA,CAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,CAAA,wBAAA,EAA2B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAA,CAAE,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,CAAA,WAAA,EAAc,MAAM,CAAC,OAAO,CAAA,CAAE,CAAC;QAC7C;IACF;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA6B,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACpE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
@@ -26,7 +26,7 @@ async function findCommand(prefix) {
26
26
  name: 'selectedRepo',
27
27
  message: 'Select a repository:',
28
28
  choices: repos.map(repo => ({
29
- name: `${repo.domain}/${repo.group}/${repo.name}`,
29
+ name: `${repo.canonicalRemote ?? `${repo.domain}/${repo.group}/${repo.name}`} (${repo.fullPath})`,
30
30
  value: repo,
31
31
  })),
32
32
  },
@@ -1 +1 @@
1
- {"version":3,"file":"find.js","sources":["../../src/commands/find.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAKO,eAAe,WAAW,CAAC,MAAc,EAAA;AAC9C,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAE9D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAA,CAAA,CAAG,CAAC;YACzD;QACF;QAEA,MAAM,CAAC,OAAO,CAAC,CAAA,MAAA,EAAS,KAAK,CAAC,MAAM,CAAA,cAAA,CAAgB,CAAC;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,QAAQ,CAAA,CAAE,CAAC;AAC/C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,YAA6B;AAEjC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,YAAY,CAAC,QAAQ,CAAA,CAAE,CAAC;QACxD;aAAO;YACL,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AACnD,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AAC1B,wBAAA,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE;AACjD,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA,CAAC;YACF,YAAY,GAAG,IAAI;QACrB;AAEA,QAAA,MAAM,SAAS,GAAG,CAAA,GAAA,EAAM,YAAY,CAAC,QAAQ,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAElD,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,OAAO,CAAC,wBAAwB,SAAS,CAAA,CAAE,CAAC;QACrD;aAAO;AACL,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,CAAE,CAAC;QAC/B;IACF;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
1
+ {"version":3,"file":"find.js","sources":["../../src/commands/find.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAKO,eAAe,WAAW,CAAC,MAAc,EAAA;AAC9C,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAE9D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,mCAAmC,MAAM,CAAA,CAAA,CAAG,CAAC;YACzD;QACF;QAEA,MAAM,CAAC,OAAO,CAAC,CAAA,MAAA,EAAS,KAAK,CAAC,MAAM,CAAA,cAAA,CAAgB,CAAC;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,QAAQ,CAAA,CAAE,CAAC;AAC/C,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,YAA6B;AAEjC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,YAAY,CAAC,QAAQ,CAAA,CAAE,CAAC;QACxD;aAAO;YACL,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AACnD,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;wBAC1B,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG;AACjG,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA,CAAC;YACF,YAAY,GAAG,IAAI;QACrB;AAEA,QAAA,MAAM,SAAS,GAAG,CAAA,GAAA,EAAM,YAAY,CAAC,QAAQ,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAElD,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,OAAO,CAAC,wBAAwB,SAAS,CAAA,CAAE,CAAC;QACrD;aAAO;AACL,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA,CAAE,CAAC;QAC/B;IACF;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/E"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B/E"}
@@ -1,6 +1,5 @@
1
1
  import { repositoryManager } from '../core/repository-manager.js';
2
2
  import { logger } from '../utils/logger.js';
3
- import { configManager } from '../core/config-manager.js';
4
3
 
5
4
  async function listCommand(options) {
6
5
  try {
@@ -11,9 +10,15 @@ async function listCommand(options) {
11
10
  logger.info('Use "git-go add <repo_url>" to add repositories.');
12
11
  return;
13
12
  }
14
- const baseDir = await configManager.getBaseDirectory();
13
+ const repoCounts = new Map();
15
14
  repos.forEach(repo => {
16
- console.log(`${repo.domain}/${repo.group}/${repo.name}`);
15
+ const key = repo.canonicalRemote ?? `${repo.domain}/${repo.group}/${repo.name}`;
16
+ repoCounts.set(key, (repoCounts.get(key) ?? 0) + 1);
17
+ });
18
+ repos.forEach(repo => {
19
+ const key = repo.canonicalRemote ?? `${repo.domain}/${repo.group}/${repo.name}`;
20
+ const hasMultipleLocations = (repoCounts.get(key) ?? 0) > 1;
21
+ console.log(hasMultipleLocations ? `${key} (${repo.fullPath})` : key);
17
22
  });
18
23
  console.log(`\nTotal: ${repos.length} repositories`);
19
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sources":["../../src/commands/list.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIO,eAAe,WAAW,CAAC,OAA8B,EAAA;AAC9D,IAAA,IAAI;AACF,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK;QACxC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAE/D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC;YAC/D;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,gBAAgB,EAAE;AAEtD,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC;AAC1D,QAAA,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,KAAK,CAAC,MAAM,CAAA,aAAA,CAAe,CAAC;IACtD;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
1
+ {"version":3,"file":"list.js","sources":["../../src/commands/list.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,eAAe,WAAW,CAAC,OAA8B,EAAA;AAC9D,IAAA,IAAI;AACF,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK;QACxC,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAE/D,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;AACrC,YAAA,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC;YAC/D;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB;AAE5C,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE;AAC/E,YAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD,QAAA,CAAC,CAAC;AAEF,QAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE;AAC/E,YAAA,MAAM,oBAAoB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAC3D,YAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAA,EAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG,GAAG,GAAG,CAAC;AACvE,QAAA,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,KAAK,CAAC,MAAM,CAAA,aAAA,CAAe,CAAC;IACtD;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
@@ -17,7 +17,7 @@ async function removeCommand(identifier) {
17
17
  name: 'selectedRepo',
18
18
  message: 'Multiple repositories found. Select one to remove:',
19
19
  choices: repos.map(repo => ({
20
- name: `${repo.domain}/${repo.group}/${repo.name} (${repo.fullPath})`,
20
+ name: `${repo.canonicalRemote ?? `${repo.domain}/${repo.group}/${repo.name}`} (${repo.fullPath})`,
21
21
  value: repo,
22
22
  })),
23
23
  },
@@ -1 +1 @@
1
- {"version":3,"file":"remove.js","sources":["../../src/commands/remove.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIO,eAAe,aAAa,CAAC,UAAkB,EAAA;AACpD,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAElE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,KAAK,CAAC,iCAAiC,UAAU,CAAA,CAAA,CAAG,CAAC;AAC5D,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;AAEA,QAAA,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;AAEzB,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AAC7C,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,OAAO,EAAE,oDAAoD;oBAC7D,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;AAC1B,wBAAA,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG;AACpE,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA,CAAC;YACF,UAAU,GAAG,YAAY;QAC3B;QAEA,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AACxC,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,UAAU,CAAC,IAAI,CAAA,6CAAA,CAA+C;AACjF,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA;AACF,SAAA,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACnC;QACF;QAEA,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAA,QAAA,EAAW,UAAU,CAAC,IAAI,CAAA,gBAAA,CAAkB,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,UAAU,CAAC,QAAQ,CAAA,iBAAA,CAAmB,CAAC;IACjE;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
1
+ {"version":3,"file":"remove.js","sources":["../../src/commands/remove.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIO,eAAe,aAAa,CAAC,UAAkB,EAAA;AACpD,IAAA,IAAI;QACF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC;AAElE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,MAAM,CAAC,KAAK,CAAC,iCAAiC,UAAU,CAAA,CAAA,CAAG,CAAC;AAC5D,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjB;AAEA,QAAA,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;AAEzB,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AAC7C,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,OAAO,EAAE,oDAAoD;oBAC7D,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK;wBAC1B,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE,CAAA,EAAA,EAAK,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG;AACjG,wBAAA,KAAK,EAAE,IAAI;AACZ,qBAAA,CAAC,CAAC;AACJ,iBAAA;AACF,aAAA,CAAC;YACF,UAAU,GAAG,YAAY;QAC3B;QAEA,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;AACxC,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,OAAO,EAAE,CAAA,OAAA,EAAU,UAAU,CAAC,IAAI,CAAA,6CAAA,CAA+C;AACjF,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA;AACF,SAAA,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;YACnC;QACF;QAEA,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAA,QAAA,EAAW,UAAU,CAAC,IAAI,CAAA,gBAAA,CAAkB,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,UAAU,CAAC,QAAQ,CAAA,iBAAA,CAAmB,CAAC;IACjE;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAiC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;AACxE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function scanCommand(paths: string[]): Promise<void>;
2
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhE"}
@@ -0,0 +1,29 @@
1
+ import { repositoryManager } from '../core/repository-manager.js';
2
+ import { logger } from '../utils/logger.js';
3
+ import ora from 'ora';
4
+
5
+ async function scanCommand(paths) {
6
+ const spinner = ora('Scanning repositories...').start();
7
+ try {
8
+ const result = await repositoryManager.scanRepositories(paths);
9
+ spinner.succeed('Repository scan complete.');
10
+ console.log(`Scanned: ${result.scanned}`);
11
+ console.log(`Added: ${result.added}`);
12
+ console.log(`Updated: ${result.updated}`);
13
+ console.log(`Skipped: ${result.skipped}`);
14
+ if (result.repositories.length > 0) {
15
+ logger.info('\nTracked repositories:');
16
+ result.repositories.forEach(repo => {
17
+ console.log(`${repo.canonicalRemote} (${repo.locations.length} location${repo.locations.length === 1 ? '' : 's'})`);
18
+ });
19
+ }
20
+ }
21
+ catch (error) {
22
+ spinner.fail('Failed to scan repositories');
23
+ logger.error(error.message);
24
+ process.exit(1);
25
+ }
26
+ }
27
+
28
+ export { scanCommand };
29
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sources":["../../src/commands/scan.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIO,eAAe,WAAW,CAAC,KAAe,EAAA;IAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE;AAEvD,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAE9D,QAAA,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,MAAM,CAAC,OAAO,CAAA,CAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAA,OAAA,EAAU,MAAM,CAAC,KAAK,CAAA,CAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,MAAM,CAAC,OAAO,CAAA,CAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,MAAM,CAAC,OAAO,CAAA,CAAE,CAAC;QAEzC,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,YAAA,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC;AACtC,YAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,IAAG;AACjC,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,eAAe,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAA,SAAA,EAAY,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA,CAAA,CAAG,CAAC;AACrH,YAAA,CAAC,CAAC;QACJ;IACF;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;AAC3C,QAAA,MAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC;AACtC,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
@@ -11,5 +11,6 @@ export declare const ERROR_CODES: {
11
11
  readonly PERMISSION_DENIED: "PERMISSION_DENIED";
12
12
  readonly GIT_NOT_INSTALLED: "GIT_NOT_INSTALLED";
13
13
  readonly CACHE_ERROR: "CACHE_ERROR";
14
+ readonly PATH_CONFLICT: "PATH_CONFLICT";
14
15
  };
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,UAAU,QAAsC,CAAC;AAC9D,eAAO,MAAM,WAAW,QAAuC,CAAC;AAChE,eAAO,MAAM,UAAU,QAA2C,CAAC;AACnE,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,eAAO,MAAM,WAAW;;;;;;;;CAQd,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,UAAU,QAAsC,CAAC;AAC9D,eAAO,MAAM,WAAW,QAAuC,CAAC;AAChE,eAAO,MAAM,UAAU,QAA2C,CAAC;AACnE,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC"}
@@ -14,6 +14,7 @@ const ERROR_CODES = {
14
14
  PERMISSION_DENIED: 'PERMISSION_DENIED',
15
15
  GIT_NOT_INSTALLED: 'GIT_NOT_INSTALLED',
16
16
  CACHE_ERROR: 'CACHE_ERROR',
17
+ PATH_CONFLICT: 'PATH_CONFLICT',
17
18
  };
18
19
 
19
20
  export { CACHE_FILE, CONFIG_DIR, CONFIG_FILE, CONFIG_VERSION, DEFAULT_BASE_DIR, ERROR_CODES };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/constants/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,MAAM,cAAc,GAAG;AACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB;AAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;AAErD,MAAM,WAAW,GAAG;AACzB,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,WAAW,EAAE,aAAa;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/constants/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,MAAM,cAAc,GAAG;AACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU;AACrD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB;AAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM;AAErD,MAAM,WAAW,GAAG;AACzB,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,aAAa,EAAE,eAAe;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAa,MAAM,UAAU,CAAC;AAGlD,qBAAa,aAAa;IAClB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAgBlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlD,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC,OAAO,CAAC,gBAAgB;CAMzB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAa,MAAM,UAAU,CAAC;AAGlD,qBAAa,aAAa;IAClB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAqBlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlD,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAStC,OAAO,CAAC,gBAAgB;CAOzB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -16,7 +16,12 @@ class ConfigManager {
16
16
  try {
17
17
  await this.ensureConfigDir();
18
18
  const content = await fs.readFile(CONFIG_FILE, 'utf-8');
19
- return JSON.parse(content);
19
+ const config = JSON.parse(content);
20
+ return {
21
+ ...this.getDefaultConfig(),
22
+ ...config,
23
+ repositories: config.repositories ?? [],
24
+ };
20
25
  }
21
26
  catch (error) {
22
27
  if (error.code === 'ENOENT') {
@@ -63,6 +68,7 @@ class ConfigManager {
63
68
  return {
64
69
  baseDirectory: DEFAULT_BASE_DIR,
65
70
  version: CONFIG_VERSION,
71
+ repositories: [],
66
72
  };
67
73
  }
68
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.js","sources":["../../src/core/config-manager.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;MAKa,aAAa,CAAA;AACxB,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,mCAAA,EAAuC,KAAe,CAAC,OAAO,CAAA,CAAE,EAChE,WAAW,CAAC,YAAY,CACzB;QACH;IACF;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,eAAe,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;AACvD,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB;QAC3C;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE;AACtD,gBAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;YAChC;AACA,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,uBAAA,EAA2B,KAAe,CAAC,OAAO,CAAA,CAAE,EACpD,WAAW,CAAC,YAAY,CACzB;QACH;IACF;IAEA,MAAM,UAAU,CAAC,MAAmB,EAAA;AAClC,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,eAAe,EAAE;AAC5B,YAAA,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;QAC3E;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,uBAAA,EAA2B,KAAe,CAAC,OAAO,CAAA,CAAE,EACpD,WAAW,CAAC,YAAY,CACzB;QACH;IACF;AAEA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;QACtC,OAAO,MAAM,CAAC,aAAa;IAC7B;IAEA,MAAM,gBAAgB,CAAC,SAAiB,EAAA;AACtC,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;AAE5C,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,SAAS,CACjB,CAAA,iCAAA,EAAqC,KAAe,CAAC,OAAO,CAAA,CAAE,EAC9D,WAAW,CAAC,iBAAiB,CAC9B;QACH;AAEA,QAAA,MAAM,CAAC,aAAa,GAAG,YAAY;AACnC,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAC/B;AAEA,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;AAC5B,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;IAEQ,gBAAgB,GAAA;QACtB,OAAO;AACL,YAAA,aAAa,EAAE,gBAAgB;AAC/B,YAAA,OAAO,EAAE,cAAc;SACxB;IACH;AACD;AAEM,MAAM,aAAa,GAAG,IAAI,aAAa;;;;"}
1
+ {"version":3,"file":"config-manager.js","sources":["../../src/core/config-manager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import { IParsedGitUrl } from '../types';
2
2
  export declare function parseGitUrl(url: string): IParsedGitUrl;
3
+ export declare function getCanonicalRemote(url: string): string;
3
4
  //# sourceMappingURL=git-url-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-url-parser.d.ts","sourceRoot":"","sources":["../../src/core/git-url-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAa,MAAM,UAAU,CAAC;AAGpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CA2DtD"}
1
+ {"version":3,"file":"git-url-parser.d.ts","sourceRoot":"","sources":["../../src/core/git-url-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAa,MAAM,UAAU,CAAC;AAgCpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAyCtD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD"}
@@ -1,55 +1,57 @@
1
1
  import { GitMError } from '../types/index.js';
2
2
  import { ERROR_CODES } from '../constants/index.js';
3
3
 
4
+ function stripGitSuffix(value) {
5
+ return value.endsWith('.git') ? value.slice(0, -4) : value;
6
+ }
7
+ function createParsedUrl(protocol, domain, group, repoName, originalUrl) {
8
+ const cleanRepoName = stripGitSuffix(repoName);
9
+ if (!domain || !group || !cleanRepoName || cleanRepoName.includes('/')) {
10
+ throw new GitMError(`Invalid git URL format: ${originalUrl}`, ERROR_CODES.INVALID_URL);
11
+ }
12
+ return {
13
+ protocol,
14
+ domain: domain.toLowerCase(),
15
+ group,
16
+ repoName: cleanRepoName,
17
+ originalUrl,
18
+ };
19
+ }
4
20
  function parseGitUrl(url) {
5
21
  if (!url || typeof url !== 'string') {
6
22
  throw new GitMError('Invalid URL: URL cannot be empty', ERROR_CODES.INVALID_URL);
7
23
  }
8
24
  const trimmedUrl = url.trim();
9
25
  // HTTPS format: https://github.com/user/repo.git or https://github.com/user/repo
10
- const httpsRegex = /^https?:\/\/([^\/]+)\/([^\/]+)\/([^\/\.]+)(\.git)?$/;
26
+ const httpsRegex = /^https?:\/\/([^\/]+)\/([^\/]+)\/([^\/]+)$/;
11
27
  const httpsMatch = trimmedUrl.match(httpsRegex);
12
28
  if (httpsMatch) {
13
29
  const [, domain, group, repoName] = httpsMatch;
14
- return {
15
- protocol: 'https',
16
- domain,
17
- group,
18
- repoName,
19
- originalUrl: trimmedUrl,
20
- };
30
+ return createParsedUrl('https', domain, group, repoName, trimmedUrl);
21
31
  }
22
32
  // SSH format (scp-style): git@github.com:user/repo.git
23
- const sshScpRegex = /^git@([^:]+):([^\/]+)\/([^\/\.]+)(\.git)?$/;
33
+ const sshScpRegex = /^git@([^:]+):([^\/]+)\/([^\/]+)$/;
24
34
  const sshScpMatch = trimmedUrl.match(sshScpRegex);
25
35
  if (sshScpMatch) {
26
36
  const [, domain, group, repoName] = sshScpMatch;
27
- return {
28
- protocol: 'ssh',
29
- domain,
30
- group,
31
- repoName,
32
- originalUrl: trimmedUrl,
33
- };
37
+ return createParsedUrl('ssh', domain, group, repoName, trimmedUrl);
34
38
  }
35
39
  // SSH format (URL-style): ssh://git@github.com/user/repo.git
36
- const sshUrlRegex = /^ssh:\/\/git@([^\/]+)\/([^\/]+)\/([^\/\.]+)(\.git)?$/;
40
+ const sshUrlRegex = /^ssh:\/\/git@([^\/]+)\/([^\/]+)\/([^\/]+)$/;
37
41
  const sshUrlMatch = trimmedUrl.match(sshUrlRegex);
38
42
  if (sshUrlMatch) {
39
43
  const [, domain, group, repoName] = sshUrlMatch;
40
- return {
41
- protocol: 'ssh',
42
- domain,
43
- group,
44
- repoName,
45
- originalUrl: trimmedUrl,
46
- };
44
+ return createParsedUrl('ssh', domain, group, repoName, trimmedUrl);
47
45
  }
48
46
  throw new GitMError(`Invalid git URL format: ${url}\nSupported formats:\n` +
49
47
  ' - https://github.com/user/repo.git\n' +
50
48
  ' - git@github.com:user/repo.git\n' +
51
49
  ' - ssh://git@github.com/user/repo.git', ERROR_CODES.INVALID_URL);
52
50
  }
51
+ function getCanonicalRemote(url) {
52
+ const parsed = parseGitUrl(url);
53
+ return `${parsed.domain}/${parsed.group}/${parsed.repoName}`;
54
+ }
53
55
 
54
- export { parseGitUrl };
56
+ export { getCanonicalRemote, parseGitUrl };
55
57
  //# sourceMappingURL=git-url-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-url-parser.js","sources":["../../src/core/git-url-parser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGM,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACnC,MAAM,IAAI,SAAS,CAAC,kCAAkC,EAAE,WAAW,CAAC,WAAW,CAAC;IAClF;AAEA,IAAA,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE;;IAG7B,MAAM,UAAU,GAAG,qDAAqD;IACxE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;IAE/C,IAAI,UAAU,EAAE;QACd,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU;QAC9C,OAAO;AACL,YAAA,QAAQ,EAAE,OAAO;YACjB,MAAM;YACN,KAAK;YACL,QAAQ;AACR,YAAA,WAAW,EAAE,UAAU;SACxB;IACH;;IAGA,MAAM,WAAW,GAAG,4CAA4C;IAChE,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;IAEjD,IAAI,WAAW,EAAE;QACf,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,WAAW;QAC/C,OAAO;AACL,YAAA,QAAQ,EAAE,KAAK;YACf,MAAM;YACN,KAAK;YACL,QAAQ;AACR,YAAA,WAAW,EAAE,UAAU;SACxB;IACH;;IAGA,MAAM,WAAW,GAAG,sDAAsD;IAC1E,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;IAEjD,IAAI,WAAW,EAAE;QACf,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,WAAW;QAC/C,OAAO;AACL,YAAA,QAAQ,EAAE,KAAK;YACf,MAAM;YACN,KAAK;YACL,QAAQ;AACR,YAAA,WAAW,EAAE,UAAU;SACxB;IACH;AAEA,IAAA,MAAM,IAAI,SAAS,CACjB,CAAA,wBAAA,EAA2B,GAAG,CAAA,sBAAA,CAAwB;QACtD,wCAAwC;QACxC,oCAAoC;AACpC,QAAA,wCAAwC,EACxC,WAAW,CAAC,WAAW,CACxB;AACH;;;;"}
1
+ {"version":3,"file":"git-url-parser.js","sources":["../../src/core/git-url-parser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGA,SAAS,cAAc,CAAC,KAAa,EAAA;IACnC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;AAC5D;AAEA,SAAS,eAAe,CACtB,QAAyB,EACzB,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,WAAmB,EAAA;AAEnB,IAAA,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC;AAE9C,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACtE,MAAM,IAAI,SAAS,CACjB,CAAA,wBAAA,EAA2B,WAAW,CAAA,CAAE,EACxC,WAAW,CAAC,WAAW,CACxB;IACH;IAEA,OAAO;QACL,QAAQ;AACR,QAAA,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;QAC5B,KAAK;AACL,QAAA,QAAQ,EAAE,aAAa;QACvB,WAAW;KACZ;AACH;AAEM,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QACnC,MAAM,IAAI,SAAS,CAAC,kCAAkC,EAAE,WAAW,CAAC,WAAW,CAAC;IAClF;AAEA,IAAA,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE;;IAG7B,MAAM,UAAU,GAAG,2CAA2C;IAC9D,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;IAE/C,IAAI,UAAU,EAAE;QACd,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU;AAC9C,QAAA,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;IACtE;;IAGA,MAAM,WAAW,GAAG,kCAAkC;IACtD,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;IAEjD,IAAI,WAAW,EAAE;QACf,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,WAAW;AAC/C,QAAA,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;IACpE;;IAGA,MAAM,WAAW,GAAG,4CAA4C;IAChE,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC;IAEjD,IAAI,WAAW,EAAE;QACf,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,WAAW;AAC/C,QAAA,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC;IACpE;AAEA,IAAA,MAAM,IAAI,SAAS,CACjB,CAAA,wBAAA,EAA2B,GAAG,CAAA,sBAAA,CAAwB;QACtD,wCAAwC;QACxC,oCAAoC;AACpC,QAAA,wCAAwC,EACxC,WAAW,CAAC,WAAW,CACxB;AACH;AAEM,SAAU,kBAAkB,CAAC,GAAW,EAAA;AAC5C,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;AAC/B,IAAA,OAAO,CAAA,EAAG,MAAM,CAAC,MAAM,CAAA,CAAA,EAAI,MAAM,CAAC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,EAAE;AAC9D;;;;"}