repo-do 1.2.1 → 1.3.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/README.md +50 -1
- package/dist/cli.js +15 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +2 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +52 -6
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +1 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/find.js +1 -1
- package/dist/commands/find.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +8 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.js +1 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/scan.d.ts +2 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +29 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +1 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +7 -1
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/git-url-parser.d.ts +1 -0
- package/dist/core/git-url-parser.d.ts.map +1 -1
- package/dist/core/git-url-parser.js +27 -25
- package/dist/core/git-url-parser.js.map +1 -1
- package/dist/core/repository-manager.d.ts +11 -4
- package/dist/core/repository-manager.d.ts.map +1 -1
- package/dist/core/repository-manager.js +228 -12
- package/dist/core/repository-manager.js.map +1 -1
- package/dist/core/repository-registry.d.ts +22 -0
- package/dist/core/repository-registry.d.ts.map +1 -0
- package/dist/core/repository-registry.js +104 -0
- package/dist/core/repository-registry.js.map +1 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/git-executor.d.ts +12 -0
- package/dist/utils/git-executor.d.ts.map +1 -1
- package/dist/utils/git-executor.js +25 -0
- package/dist/utils/git-executor.js.map +1 -1
- 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
|
@@ -6,6 +6,7 @@ import { listCommand } from './commands/list.js';
|
|
|
6
6
|
import { findCommand } from './commands/find.js';
|
|
7
7
|
import { removeCommand } from './commands/remove.js';
|
|
8
8
|
import { configCommand } from './commands/config.js';
|
|
9
|
+
import { scanCommand } from './commands/scan.js';
|
|
9
10
|
|
|
10
11
|
const program = new Command();
|
|
11
12
|
program
|
|
@@ -20,10 +21,17 @@ program
|
|
|
20
21
|
.command('add <url>')
|
|
21
22
|
.description('Clone a git repository')
|
|
22
23
|
.option('--json', 'Output result as JSON')
|
|
24
|
+
.option('--force-clone', 'Clone even when the same remote already has a tracked local repository')
|
|
25
|
+
.option('--use-existing', 'Use a tracked local repository when the same remote already exists')
|
|
23
26
|
.allowUnknownOption()
|
|
24
27
|
.action((url, options, command) => {
|
|
25
28
|
const args = command.args.slice(1);
|
|
26
|
-
addCommand(url, {
|
|
29
|
+
addCommand(url, {
|
|
30
|
+
args,
|
|
31
|
+
json: options.json,
|
|
32
|
+
forceClone: options.forceClone,
|
|
33
|
+
useExisting: options.useExisting,
|
|
34
|
+
});
|
|
27
35
|
});
|
|
28
36
|
program
|
|
29
37
|
.command('list')
|
|
@@ -40,6 +48,12 @@ program
|
|
|
40
48
|
.command('remove <identifier>')
|
|
41
49
|
.description('Remove repository from management (files not deleted)')
|
|
42
50
|
.action(removeCommand);
|
|
51
|
+
program
|
|
52
|
+
.command('scan [paths...]')
|
|
53
|
+
.description('Scan existing git repositories and track them in configuration')
|
|
54
|
+
.action((paths) => {
|
|
55
|
+
scanCommand(paths);
|
|
56
|
+
});
|
|
43
57
|
program
|
|
44
58
|
.command('config')
|
|
45
59
|
.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":"
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;AAWA,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,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"}
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/add.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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({
|
|
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
|
|
85
|
+
if (spinner) {
|
|
86
|
+
spinner.fail('Failed to clone repository');
|
|
87
|
+
}
|
|
42
88
|
logger.error(error.message);
|
|
43
89
|
process.exit(1);
|
|
44
90
|
}
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sources":["../../src/commands/add.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
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,
|
|
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"}
|
package/dist/commands/config.js
CHANGED
|
@@ -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;;;;"}
|
package/dist/commands/find.js
CHANGED
|
@@ -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;
|
|
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":"
|
|
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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -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
|
|
13
|
+
const repoCounts = new Map();
|
|
15
14
|
repos.forEach(repo => {
|
|
16
|
-
|
|
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":"
|
|
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;;;;"}
|
package/dist/commands/remove.js
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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
|
|
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"}
|
package/dist/constants/index.js
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sources":["../../src/core/config-manager.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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?:\/\/([^\/]+)\/([^\/]+)\/([
|
|
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@([^:]+):([^\/]+)\/([
|
|
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@([^\/]+)\/([^\/]+)\/([
|
|
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":";;;
|
|
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;;;;"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { IRepositoryInfo, ICloneResult } from '../types';
|
|
1
|
+
import { IConfiguredRepository, ICloneOptions, IRepositoryInfo, ICloneResult, IScanResult } from '../types';
|
|
2
2
|
export declare class RepositoryManager {
|
|
3
|
-
cloneRepository(url: string, cloneArgs?: string[], options?:
|
|
4
|
-
silent?: boolean;
|
|
5
|
-
}): Promise<ICloneResult>;
|
|
3
|
+
cloneRepository(url: string, cloneArgs?: string[], options?: ICloneOptions): Promise<ICloneResult>;
|
|
6
4
|
listRepositories(refresh?: boolean): Promise<IRepositoryInfo[]>;
|
|
7
5
|
findRepositories(query: string): Promise<IRepositoryInfo[]>;
|
|
8
6
|
removeRepository(identifier: string): Promise<void>;
|
|
9
7
|
repositoryExists(path: string): Promise<boolean>;
|
|
8
|
+
getConfiguredRepository(url: string): Promise<IConfiguredRepository | undefined>;
|
|
9
|
+
getTargetPath(url: string, baseDir: string): string;
|
|
10
|
+
scanRepositories(roots?: string[]): Promise<IScanResult>;
|
|
11
|
+
private getKnownRepositories;
|
|
12
|
+
private findUsableLocation;
|
|
13
|
+
private createRepositoryInfo;
|
|
14
|
+
private getMatchingRemoteUrl;
|
|
15
|
+
private getFirstSupportedRemote;
|
|
16
|
+
private findGitRepositories;
|
|
10
17
|
}
|
|
11
18
|
export declare const repositoryManager: RepositoryManager;
|
|
12
19
|
//# sourceMappingURL=repository-manager.d.ts.map
|