@gitgate/gg-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/commands/actions.d.ts +11 -0
  2. package/dist/commands/actions.d.ts.map +1 -0
  3. package/dist/commands/actions.js +97 -0
  4. package/dist/commands/actions.js.map +1 -0
  5. package/dist/commands/auth.d.ts +11 -0
  6. package/dist/commands/auth.d.ts.map +1 -0
  7. package/dist/commands/auth.js +104 -0
  8. package/dist/commands/auth.js.map +1 -0
  9. package/dist/commands/import.d.ts +10 -0
  10. package/dist/commands/import.d.ts.map +1 -0
  11. package/dist/commands/import.js +101 -0
  12. package/dist/commands/import.js.map +1 -0
  13. package/dist/commands/issue.d.ts +12 -0
  14. package/dist/commands/issue.d.ts.map +1 -0
  15. package/dist/commands/issue.js +140 -0
  16. package/dist/commands/issue.js.map +1 -0
  17. package/dist/commands/pr.d.ts +14 -0
  18. package/dist/commands/pr.d.ts.map +1 -0
  19. package/dist/commands/pr.js +150 -0
  20. package/dist/commands/pr.js.map +1 -0
  21. package/dist/commands/repo.d.ts +19 -0
  22. package/dist/commands/repo.d.ts.map +1 -0
  23. package/dist/commands/repo.js +199 -0
  24. package/dist/commands/repo.js.map +1 -0
  25. package/dist/commands/search.d.ts +6 -0
  26. package/dist/commands/search.d.ts.map +1 -0
  27. package/dist/commands/search.js +46 -0
  28. package/dist/commands/search.js.map +1 -0
  29. package/dist/commands/viz.d.ts +13 -0
  30. package/dist/commands/viz.d.ts.map +1 -0
  31. package/dist/commands/viz.js +167 -0
  32. package/dist/commands/viz.js.map +1 -0
  33. package/dist/index.d.ts +9 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +34 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/lib/api-client.d.ts +23 -0
  38. package/dist/lib/api-client.d.ts.map +1 -0
  39. package/dist/lib/api-client.js +79 -0
  40. package/dist/lib/api-client.js.map +1 -0
  41. package/dist/lib/config.d.ts +16 -0
  42. package/dist/lib/config.d.ts.map +1 -0
  43. package/dist/lib/config.js +44 -0
  44. package/dist/lib/config.js.map +1 -0
  45. package/dist/lib/output.d.ts +8 -0
  46. package/dist/lib/output.d.ts.map +1 -0
  47. package/dist/lib/output.js +46 -0
  48. package/dist/lib/output.js.map +1 -0
  49. package/package.json +48 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * gg run — CI/CD workflow run commands.
3
+ *
4
+ * gg run list <owner/repo> — List recent workflow runs
5
+ * gg run view <owner/repo> <id> — View run details
6
+ * gg run rerun <owner/repo> <id> — Re-run a workflow
7
+ * gg run cancel <owner/repo> <id> — Cancel a running workflow
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare const runCommand: Command;
11
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/commands/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,UAAU,SACe,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * gg run — CI/CD workflow run commands.
3
+ *
4
+ * gg run list <owner/repo> — List recent workflow runs
5
+ * gg run view <owner/repo> <id> — View run details
6
+ * gg run rerun <owner/repo> <id> — Re-run a workflow
7
+ * gg run cancel <owner/repo> <id> — Cancel a running workflow
8
+ */
9
+ import { Command } from 'commander';
10
+ import { isAuthenticated } from '../lib/config';
11
+ import { getClient } from '../lib/api-client';
12
+ import { table, relativeTime, statusIcon } from '../lib/output';
13
+ export const runCommand = new Command('run')
14
+ .description('Manage workflow runs');
15
+ runCommand
16
+ .command('list')
17
+ .description('List recent workflow runs')
18
+ .alias('ls')
19
+ .argument('<repo>', 'owner/repo')
20
+ .action(async (repoArg) => {
21
+ const [owner, repo] = parseRepo(repoArg);
22
+ const client = getClient();
23
+ const res = await client.get(`/api/repos/${owner}/${repo}/actions/runs`);
24
+ if (res.data.length === 0) {
25
+ console.log(`No workflow runs in ${owner}/${repo}`);
26
+ return;
27
+ }
28
+ const rows = res.data.map((r) => [
29
+ statusIcon(r.conclusion ?? r.status),
30
+ r.id.substring(0, 8),
31
+ r.status,
32
+ r.triggerEvent,
33
+ r.triggerRef.replace('refs/heads/', ''),
34
+ r.triggerSha.substring(0, 7),
35
+ relativeTime(r.createdAt),
36
+ ]);
37
+ console.log(table(['', 'ID', 'STATUS', 'EVENT', 'BRANCH', 'SHA', 'CREATED'], rows));
38
+ });
39
+ runCommand
40
+ .command('view')
41
+ .description('View workflow run details')
42
+ .argument('<repo>', 'owner/repo')
43
+ .argument('<id>', 'Run ID')
44
+ .action(async (repoArg, id) => {
45
+ const [owner, repo] = parseRepo(repoArg);
46
+ const client = getClient();
47
+ const res = await client.get(`/api/repos/${owner}/${repo}/actions/runs/${id}`);
48
+ const r = res.data;
49
+ console.log(`Run ${r.id}`);
50
+ console.log(` Status: ${r.status}${r.conclusion ? ` (${r.conclusion})` : ''}`);
51
+ console.log(` Trigger: ${r.triggerEvent} on ${r.triggerRef}`);
52
+ console.log(` SHA: ${r.triggerSha}`);
53
+ console.log(` Created: ${relativeTime(r.createdAt)}`);
54
+ if (r.startedAt)
55
+ console.log(` Started: ${relativeTime(r.startedAt)}`);
56
+ if (r.completedAt)
57
+ console.log(` Completed: ${relativeTime(r.completedAt)}`);
58
+ });
59
+ runCommand
60
+ .command('rerun')
61
+ .description('Re-run a workflow')
62
+ .argument('<repo>', 'owner/repo')
63
+ .argument('<id>', 'Run ID')
64
+ .action(async (repoArg, id) => {
65
+ requireAuth();
66
+ const [owner, repo] = parseRepo(repoArg);
67
+ const client = getClient();
68
+ const res = await client.post(`/api/repos/${owner}/${repo}/actions/runs/${id}/rerun`);
69
+ console.log(`Re-run started: ${res.data.id.substring(0, 8)}`);
70
+ });
71
+ runCommand
72
+ .command('cancel')
73
+ .description('Cancel a running workflow')
74
+ .argument('<repo>', 'owner/repo')
75
+ .argument('<id>', 'Run ID')
76
+ .action(async (repoArg, id) => {
77
+ requireAuth();
78
+ const [owner, repo] = parseRepo(repoArg);
79
+ const client = getClient();
80
+ await client.post(`/api/repos/${owner}/${repo}/actions/runs/${id}/cancel`);
81
+ console.log(`Run ${id.substring(0, 8)} cancelled.`);
82
+ });
83
+ function parseRepo(arg) {
84
+ const parts = arg.split('/');
85
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
86
+ console.error('Invalid repo format. Use: owner/repo');
87
+ process.exit(1);
88
+ }
89
+ return [parts[0], parts[1]];
90
+ }
91
+ function requireAuth() {
92
+ if (!isAuthenticated()) {
93
+ console.error('Not authenticated. Run: gg auth login');
94
+ process.exit(1);
95
+ }
96
+ }
97
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/commands/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * gg auth — authentication commands.
3
+ *
4
+ * gg auth login — Login with a personal access token
5
+ * gg auth logout — Clear stored credentials
6
+ * gg auth status — Show current auth status
7
+ * gg auth token create — Create a personal access token
8
+ */
9
+ import { Command } from 'commander';
10
+ export declare const authCommand: Command;
11
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,WAAW,SACe,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * gg auth — authentication commands.
3
+ *
4
+ * gg auth login — Login with a personal access token
5
+ * gg auth logout — Clear stored credentials
6
+ * gg auth status — Show current auth status
7
+ * gg auth token create — Create a personal access token
8
+ */
9
+ import { Command } from 'commander';
10
+ import { saveConfig, clearConfig, loadConfig, isAuthenticated } from '../lib/config';
11
+ import { getClient } from '../lib/api-client';
12
+ export const authCommand = new Command('auth')
13
+ .description('Manage authentication');
14
+ authCommand
15
+ .command('login')
16
+ .description('Log in to GitGate')
17
+ .option('-t, --token <token>', 'Authenticate with a personal access token')
18
+ .option('--api-url <url>', 'API URL (default: https://api.gitgate.com)')
19
+ .action(async (opts) => {
20
+ if (opts.apiUrl) {
21
+ saveConfig({ apiUrl: opts.apiUrl });
22
+ }
23
+ if (opts.token) {
24
+ saveConfig({ token: opts.token });
25
+ // Verify token by fetching current user
26
+ try {
27
+ const client = getClient();
28
+ const res = await client.get('/auth/me');
29
+ saveConfig({ username: res.data.username });
30
+ console.log(`Logged in as ${res.data.username}`);
31
+ }
32
+ catch {
33
+ clearConfig();
34
+ console.error('Invalid token. Login failed.');
35
+ process.exit(1);
36
+ }
37
+ }
38
+ else {
39
+ const config = loadConfig();
40
+ console.log('To authenticate the GitGate CLI:\n');
41
+ console.log(` 1. Sign in to the web UI at ${config.apiUrl}`);
42
+ console.log(' 2. Go to Settings and create a Personal Access Token');
43
+ console.log(' 3. Run:\n');
44
+ console.log(' gg auth login --token gg_your_token');
45
+ }
46
+ });
47
+ authCommand
48
+ .command('logout')
49
+ .description('Log out and clear credentials')
50
+ .action(async () => {
51
+ const config = loadConfig();
52
+ if (config.token) {
53
+ try {
54
+ const client = getClient();
55
+ await client.post('/auth/logout');
56
+ }
57
+ catch {
58
+ // Ignore errors during logout
59
+ }
60
+ }
61
+ clearConfig();
62
+ console.log('Logged out.');
63
+ });
64
+ authCommand
65
+ .command('status')
66
+ .description('Show authentication status')
67
+ .action(async () => {
68
+ const config = loadConfig();
69
+ if (!isAuthenticated()) {
70
+ console.log('Not authenticated. Run: gg auth login');
71
+ return;
72
+ }
73
+ try {
74
+ const client = getClient();
75
+ const res = await client.get('/auth/me');
76
+ console.log(`Logged in as ${res.data.username} (${res.data.email})`);
77
+ console.log(`API: ${config.apiUrl}`);
78
+ }
79
+ catch {
80
+ console.log('Token is invalid or expired. Run: gg auth login');
81
+ }
82
+ });
83
+ authCommand
84
+ .command('token')
85
+ .description('Create a personal access token')
86
+ .argument('<name>', 'Token name')
87
+ .option('-s, --scopes <scopes>', 'Comma-separated scopes', 'repo:read,repo:write')
88
+ .option('-e, --expires <days>', 'Expiration in days')
89
+ .action(async (name, opts) => {
90
+ if (!isAuthenticated()) {
91
+ console.error('Not authenticated. Run: gg auth login');
92
+ process.exit(1);
93
+ }
94
+ const client = getClient();
95
+ const scopes = opts.scopes.split(',');
96
+ const res = await client.post('/auth/tokens', {
97
+ name,
98
+ scopes,
99
+ expiresInDays: opts.expires ? parseInt(opts.expires) : undefined,
100
+ });
101
+ console.log(`Token created: ${res.data.token}`);
102
+ console.log('This token will only be shown once. Store it securely.');
103
+ });
104
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,uBAAuB,CAAC,CAAC;AAExC,WAAW;KACR,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,4CAA4C,CAAC;KACvE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAiC,UAAU,CAAC,CAAC;YACzE,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgD,UAAU,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,WAAW;KACR,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;KAChC,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,EAAE,sBAAsB,CAAC;KACjF,MAAM,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAA0C,cAAc,EAAE;QACrF,IAAI;QACJ,MAAM;QACN,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KACjE,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * gg import — migrate repositories to GitGate.
3
+ *
4
+ * gg import github <url> — Full migration: create repo, clone, push, import metadata
5
+ *
6
+ * Philosophy: git operations use native git. Metadata import uses API.
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare const importCommand: Command;
10
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SACuB,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * gg import — migrate repositories to GitGate.
3
+ *
4
+ * gg import github <url> — Full migration: create repo, clone, push, import metadata
5
+ *
6
+ * Philosophy: git operations use native git. Metadata import uses API.
7
+ */
8
+ import { Command } from 'commander';
9
+ import { execSync } from 'node:child_process';
10
+ import { isAuthenticated, loadConfig } from '../lib/config';
11
+ import { getClient } from '../lib/api-client';
12
+ export const importCommand = new Command('import')
13
+ .description('Migrate repositories to GitGate');
14
+ importCommand
15
+ .command('github')
16
+ .description('Migrate a GitHub repository (git data + optional metadata)')
17
+ .argument('<url>', 'GitHub repository URL (e.g. https://github.com/owner/repo)')
18
+ .option('-t, --token <token>', 'GitHub PAT for metadata import (issues, PRs, labels)')
19
+ .option('-n, --name <name>', 'Repository name on GitGate (default: same as source)')
20
+ .option('--metadata-only', 'Skip git push, only import issues/PRs')
21
+ .action(async (url, opts) => {
22
+ if (!isAuthenticated()) {
23
+ console.error('Not authenticated. Run: gg auth login');
24
+ process.exit(1);
25
+ }
26
+ const config = loadConfig();
27
+ const client = getClient();
28
+ // Parse repo name from URL
29
+ const match = url.match(/github\.com\/([^/]+)\/([^/.]+)/);
30
+ if (!match) {
31
+ console.error('Invalid GitHub URL. Expected: https://github.com/owner/repo');
32
+ process.exit(1);
33
+ }
34
+ const repoName = opts.name ?? match[2];
35
+ // Step 1: Create empty repo on GitGate
36
+ console.log(`Creating ${config.username}/${repoName} on GitGate...`);
37
+ try {
38
+ await client.post('/api/repos', {
39
+ name: repoName,
40
+ description: '',
41
+ autoInit: false,
42
+ });
43
+ }
44
+ catch (err) {
45
+ console.error(`Failed to create repo: ${err instanceof Error ? err.message : err}`);
46
+ process.exit(1);
47
+ }
48
+ const baseUrl = config.apiUrl.replace('api.', '');
49
+ const gitgateUrl = `${baseUrl}/${config.username}/${repoName}.git`;
50
+ if (!opts.metadataOnly) {
51
+ // Step 2: Clone from GitHub (bare) and push to GitGate
52
+ console.log(`\nCloning from ${url}...`);
53
+ const tmpDir = `.gitgate-import-${repoName}-${Date.now()}`;
54
+ try {
55
+ execSync(`git clone --bare ${url} ${tmpDir}`, { stdio: 'inherit' });
56
+ }
57
+ catch {
58
+ console.error('Failed to clone from GitHub.');
59
+ process.exit(1);
60
+ }
61
+ console.log(`\nPushing to GitGate...`);
62
+ try {
63
+ execSync(`git -C ${tmpDir} push --mirror ${gitgateUrl}`, { stdio: 'inherit' });
64
+ }
65
+ catch {
66
+ console.error('Failed to push to GitGate. Check your authentication:');
67
+ console.error(' gg auth login --token <your-gitgate-pat>');
68
+ process.exit(1);
69
+ }
70
+ // Clean up bare clone
71
+ try {
72
+ execSync(`rm -rf ${tmpDir}`, { stdio: 'pipe' });
73
+ }
74
+ catch {
75
+ console.log(`Note: temporary directory ${tmpDir} may need manual cleanup.`);
76
+ }
77
+ console.log(`\nGit data pushed successfully.`);
78
+ }
79
+ // Step 3: Import metadata (issues, PRs, labels) if token provided
80
+ if (opts.token) {
81
+ console.log(`\nImporting issues, PRs, and labels from GitHub...`);
82
+ try {
83
+ await client.post('/api/import/github', {
84
+ githubUrl: url,
85
+ accessToken: opts.token,
86
+ });
87
+ console.log('Metadata imported successfully.');
88
+ }
89
+ catch (err) {
90
+ console.error(`Metadata import failed: ${err instanceof Error ? err.message : err}`);
91
+ console.error('Git data was pushed successfully — only metadata import failed.');
92
+ }
93
+ }
94
+ else {
95
+ console.log('\nSkipping metadata import (no GitHub token provided).');
96
+ console.log('To import issues/PRs later: gg import github <url> --token <pat> --metadata-only');
97
+ }
98
+ console.log(`\nDone! Repository: ${gitgateUrl}`);
99
+ console.log(`Clone: git clone ${gitgateUrl}`);
100
+ });
101
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * gg issue — issue management commands.
3
+ *
4
+ * gg issue create <owner/repo> — Create a new issue
5
+ * gg issue list <owner/repo> — List issues
6
+ * gg issue view <owner/repo> <num> — View issue details
7
+ * gg issue close <owner/repo> <num>— Close an issue
8
+ * gg issue comment <owner/repo> <num> — Add a comment
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare const issueCommand: Command;
12
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SACM,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * gg issue — issue management commands.
3
+ *
4
+ * gg issue create <owner/repo> — Create a new issue
5
+ * gg issue list <owner/repo> — List issues
6
+ * gg issue view <owner/repo> <num> — View issue details
7
+ * gg issue close <owner/repo> <num>— Close an issue
8
+ * gg issue comment <owner/repo> <num> — Add a comment
9
+ */
10
+ import { Command } from 'commander';
11
+ import { isAuthenticated } from '../lib/config';
12
+ import { getClient } from '../lib/api-client';
13
+ import { table, relativeTime, statusIcon, truncate } from '../lib/output';
14
+ export const issueCommand = new Command('issue')
15
+ .description('Manage issues');
16
+ issueCommand
17
+ .command('create')
18
+ .description('Create a new issue')
19
+ .argument('<repo>', 'owner/repo')
20
+ .option('-t, --title <title>', 'Issue title')
21
+ .option('-b, --body <body>', 'Issue body')
22
+ .option('-l, --labels <labels>', 'Comma-separated labels')
23
+ .action(async (repoArg, opts) => {
24
+ requireAuth();
25
+ const [owner, repo] = parseRepo(repoArg);
26
+ if (!opts.title) {
27
+ console.error('Title is required. Use: gg issue create owner/repo -t "title"');
28
+ process.exit(1);
29
+ }
30
+ const client = getClient();
31
+ const res = await client.post(`/api/repos/${owner}/${repo}/issues`, {
32
+ title: opts.title,
33
+ body: opts.body ?? '',
34
+ labels: opts.labels?.split(',') ?? [],
35
+ });
36
+ console.log(`Created issue #${res.data.number}: ${res.data.title}`);
37
+ });
38
+ issueCommand
39
+ .command('list')
40
+ .description('List issues')
41
+ .alias('ls')
42
+ .argument('<repo>', 'owner/repo')
43
+ .option('-s, --state <state>', 'Filter by state (open/closed/all)', 'open')
44
+ .option('-l, --label <label>', 'Filter by label')
45
+ .action(async (repoArg, opts) => {
46
+ const [owner, repo] = parseRepo(repoArg);
47
+ const client = getClient();
48
+ const params = new URLSearchParams({ state: opts.state });
49
+ if (opts.label)
50
+ params.set('label', opts.label);
51
+ const res = await client.get(`/api/repos/${owner}/${repo}/issues?${params}`);
52
+ if (res.data.length === 0) {
53
+ console.log(`No ${opts.state} issues in ${owner}/${repo}`);
54
+ return;
55
+ }
56
+ const rows = res.data.map((i) => [
57
+ statusIcon(i.state),
58
+ `#${i.number}`,
59
+ truncate(i.title, 60),
60
+ relativeTime(i.createdAt),
61
+ ]);
62
+ console.log(table(['', '#', 'TITLE', 'CREATED'], rows));
63
+ });
64
+ issueCommand
65
+ .command('view')
66
+ .description('View issue details')
67
+ .argument('<repo>', 'owner/repo')
68
+ .argument('<number>', 'Issue number')
69
+ .action(async (repoArg, number) => {
70
+ const [owner, repo] = parseRepo(repoArg);
71
+ const client = getClient();
72
+ const res = await client.get(`/api/repos/${owner}/${repo}/issues/${number}`);
73
+ const i = res.data;
74
+ console.log(`#${i.number} ${i.title}`);
75
+ console.log(`State: ${i.state} Created: ${relativeTime(i.createdAt)}`);
76
+ if (i.closedAt)
77
+ console.log(`Closed: ${relativeTime(i.closedAt)}`);
78
+ if (i.body) {
79
+ console.log('');
80
+ console.log(i.body);
81
+ }
82
+ });
83
+ issueCommand
84
+ .command('close')
85
+ .description('Close an issue')
86
+ .argument('<repo>', 'owner/repo')
87
+ .argument('<number>', 'Issue number')
88
+ .action(async (repoArg, number) => {
89
+ requireAuth();
90
+ const [owner, repo] = parseRepo(repoArg);
91
+ const client = getClient();
92
+ await client.patch(`/api/repos/${owner}/${repo}/issues/${number}`, { state: 'closed' });
93
+ console.log(`Issue #${number} closed.`);
94
+ });
95
+ issueCommand
96
+ .command('reopen')
97
+ .description('Reopen an issue')
98
+ .argument('<repo>', 'owner/repo')
99
+ .argument('<number>', 'Issue number')
100
+ .action(async (repoArg, number) => {
101
+ requireAuth();
102
+ const [owner, repo] = parseRepo(repoArg);
103
+ const client = getClient();
104
+ await client.patch(`/api/repos/${owner}/${repo}/issues/${number}`, { state: 'open' });
105
+ console.log(`Issue #${number} reopened.`);
106
+ });
107
+ issueCommand
108
+ .command('comment')
109
+ .description('Add a comment to an issue')
110
+ .argument('<repo>', 'owner/repo')
111
+ .argument('<number>', 'Issue number')
112
+ .option('-b, --body <body>', 'Comment body')
113
+ .action(async (repoArg, number, opts) => {
114
+ requireAuth();
115
+ if (!opts.body) {
116
+ console.error('Comment body is required. Use: gg issue comment owner/repo 1 -b "text"');
117
+ process.exit(1);
118
+ }
119
+ const [owner, repo] = parseRepo(repoArg);
120
+ const client = getClient();
121
+ await client.post(`/api/repos/${owner}/${repo}/issues/${number}/comments`, {
122
+ body: opts.body,
123
+ });
124
+ console.log(`Comment added to issue #${number}.`);
125
+ });
126
+ function parseRepo(arg) {
127
+ const parts = arg.split('/');
128
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
129
+ console.error('Invalid repo format. Use: owner/repo');
130
+ process.exit(1);
131
+ }
132
+ return [parts[0], parts[1]];
133
+ }
134
+ function requireAuth() {
135
+ if (!isAuthenticated()) {
136
+ console.error('Not authenticated. Run: gg auth login');
137
+ process.exit(1);
138
+ }
139
+ }
140
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * gg pr — pull request management commands.
3
+ *
4
+ * gg pr create <owner/repo> — Create a pull request
5
+ * gg pr list <owner/repo> — List pull requests
6
+ * gg pr view <owner/repo> <num> — View PR details
7
+ * gg pr merge <owner/repo> <num> — Merge a pull request
8
+ * gg pr close <owner/repo> <num> — Close a pull request
9
+ * gg pr review <owner/repo> <num> — Submit a review
10
+ * gg pr diff <owner/repo> <num> — View PR diff
11
+ */
12
+ import { Command } from 'commander';
13
+ export declare const prCommand: Command;
14
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,SAAS,SACgB,CAAC"}