@bretwardjames/ghp-cli 0.1.2 → 0.1.4
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/dist/branch-linker.d.ts +31 -9
- package/dist/branch-linker.d.ts.map +1 -1
- package/dist/branch-linker.js +61 -35
- package/dist/branch-linker.js.map +1 -1
- package/dist/commands/edit.d.ts +2 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +126 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/git-utils.d.ts +6 -52
- package/dist/git-utils.d.ts.map +1 -1
- package/dist/git-utils.js +7 -137
- package/dist/git-utils.js.map +1 -1
- package/dist/github-api.d.ts +17 -146
- package/dist/github-api.d.ts.map +1 -1
- package/dist/github-api.js +48 -864
- package/dist/github-api.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/branch-linker.d.ts
CHANGED
|
@@ -1,15 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* CLI-specific branch linker with file-based storage.
|
|
3
|
+
*
|
|
4
|
+
* This module wraps the core BranchLinker with a file-based StorageAdapter
|
|
5
|
+
* that stores links in ~/.config/ghp-cli/branch-links.json
|
|
6
|
+
*/
|
|
7
|
+
import { BranchLinker, type StorageAdapter, type BranchLink } from '@bretwardjames/ghp-core';
|
|
8
|
+
/**
|
|
9
|
+
* File-based storage adapter for CLI usage
|
|
10
|
+
*/
|
|
11
|
+
declare const fileStorageAdapter: StorageAdapter;
|
|
12
|
+
declare const linker: BranchLinker;
|
|
13
|
+
/**
|
|
14
|
+
* Create a link between a branch and an issue.
|
|
15
|
+
* Backwards-compatible function signature for existing CLI code.
|
|
16
|
+
*/
|
|
9
17
|
export declare function linkBranch(branch: string, issueNumber: number, issueTitle: string, itemId: string, repo: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Remove the link for an issue.
|
|
20
|
+
* @returns true if a link was removed, false if no link existed
|
|
21
|
+
*/
|
|
10
22
|
export declare function unlinkBranch(repo: string, issueNumber: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get the branch linked to an issue.
|
|
25
|
+
*/
|
|
11
26
|
export declare function getBranchForIssue(repo: string, issueNumber: number): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Get the full link info for a branch.
|
|
29
|
+
*/
|
|
12
30
|
export declare function getIssueForBranch(repo: string, branch: string): BranchLink | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get all links for a repository.
|
|
33
|
+
*/
|
|
13
34
|
export declare function getAllLinksForRepo(repo: string): BranchLink[];
|
|
14
|
-
export {};
|
|
35
|
+
export type { BranchLink } from '@bretwardjames/ghp-core';
|
|
36
|
+
export { linker, fileStorageAdapter };
|
|
15
37
|
//# sourceMappingURL=branch-linker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-linker.d.ts","sourceRoot":"","sources":["../src/branch-linker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"branch-linker.d.ts","sourceRoot":"","sources":["../src/branch-linker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EACH,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,UAAU,EAClB,MAAM,yBAAyB,CAAC;AAKjC;;GAEG;AACH,QAAA,MAAM,kBAAkB,EAAE,cAmBzB,CAAC;AAGF,QAAA,MAAM,MAAM,cAAuC,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,UAAU,CACtB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACb,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAcvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAG7D;AAGD,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/branch-linker.js
CHANGED
|
@@ -1,60 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI-specific branch linker with file-based storage.
|
|
3
|
+
*
|
|
4
|
+
* This module wraps the core BranchLinker with a file-based StorageAdapter
|
|
5
|
+
* that stores links in ~/.config/ghp-cli/branch-links.json
|
|
6
|
+
*/
|
|
1
7
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
8
|
import { homedir } from 'os';
|
|
3
9
|
import { join } from 'path';
|
|
10
|
+
import { BranchLinker, } from '@bretwardjames/ghp-core';
|
|
4
11
|
const DATA_DIR = join(homedir(), '.config', 'ghp-cli');
|
|
5
12
|
const LINKS_FILE = join(DATA_DIR, 'branch-links.json');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
/**
|
|
14
|
+
* File-based storage adapter for CLI usage
|
|
15
|
+
*/
|
|
16
|
+
const fileStorageAdapter = {
|
|
17
|
+
load() {
|
|
18
|
+
try {
|
|
19
|
+
if (existsSync(LINKS_FILE)) {
|
|
20
|
+
const data = readFileSync(LINKS_FILE, 'utf-8');
|
|
21
|
+
return JSON.parse(data);
|
|
22
|
+
}
|
|
11
23
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
+
catch {
|
|
25
|
+
// Ignore errors, return empty array
|
|
26
|
+
}
|
|
27
|
+
return [];
|
|
28
|
+
},
|
|
29
|
+
save(links) {
|
|
30
|
+
if (!existsSync(DATA_DIR)) {
|
|
31
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
writeFileSync(LINKS_FILE, JSON.stringify(links, null, 2));
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
// Create singleton linker instance
|
|
37
|
+
const linker = new BranchLinker(fileStorageAdapter);
|
|
38
|
+
/**
|
|
39
|
+
* Create a link between a branch and an issue.
|
|
40
|
+
* Backwards-compatible function signature for existing CLI code.
|
|
41
|
+
*/
|
|
24
42
|
export function linkBranch(branch, issueNumber, issueTitle, itemId, repo) {
|
|
25
|
-
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
filtered.push({
|
|
29
|
-
branch,
|
|
30
|
-
issueNumber,
|
|
31
|
-
issueTitle,
|
|
32
|
-
itemId,
|
|
33
|
-
repo,
|
|
34
|
-
linkedAt: new Date().toISOString(),
|
|
35
|
-
});
|
|
36
|
-
saveLinks(filtered);
|
|
43
|
+
// Use sync-like behavior for backwards compatibility
|
|
44
|
+
// The file adapter is synchronous so this works
|
|
45
|
+
linker.link(branch, issueNumber, issueTitle, itemId, repo);
|
|
37
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Remove the link for an issue.
|
|
49
|
+
* @returns true if a link was removed, false if no link existed
|
|
50
|
+
*/
|
|
38
51
|
export function unlinkBranch(repo, issueNumber) {
|
|
39
|
-
|
|
52
|
+
// Load, filter, and save synchronously for backwards compatibility
|
|
53
|
+
const adapter = fileStorageAdapter;
|
|
54
|
+
const links = adapter.load();
|
|
40
55
|
const filtered = links.filter(l => !(l.repo === repo && l.issueNumber === issueNumber));
|
|
41
56
|
if (filtered.length === links.length) {
|
|
42
|
-
return false;
|
|
57
|
+
return false;
|
|
43
58
|
}
|
|
44
|
-
|
|
59
|
+
adapter.save(filtered);
|
|
45
60
|
return true;
|
|
46
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the branch linked to an issue.
|
|
64
|
+
*/
|
|
47
65
|
export function getBranchForIssue(repo, issueNumber) {
|
|
48
|
-
const links =
|
|
66
|
+
const links = fileStorageAdapter.load();
|
|
49
67
|
const link = links.find(l => l.repo === repo && l.issueNumber === issueNumber);
|
|
50
68
|
return link?.branch || null;
|
|
51
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Get the full link info for a branch.
|
|
72
|
+
*/
|
|
52
73
|
export function getIssueForBranch(repo, branch) {
|
|
53
|
-
const links =
|
|
74
|
+
const links = fileStorageAdapter.load();
|
|
54
75
|
return links.find(l => l.repo === repo && l.branch === branch) || null;
|
|
55
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all links for a repository.
|
|
79
|
+
*/
|
|
56
80
|
export function getAllLinksForRepo(repo) {
|
|
57
|
-
const links =
|
|
81
|
+
const links = fileStorageAdapter.load();
|
|
58
82
|
return links.filter(l => l.repo === repo);
|
|
59
83
|
}
|
|
84
|
+
// Also export the linker instance and adapter for advanced usage
|
|
85
|
+
export { linker, fileStorageAdapter };
|
|
60
86
|
//# sourceMappingURL=branch-linker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-linker.js","sourceRoot":"","sources":["../src/branch-linker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"branch-linker.js","sourceRoot":"","sources":["../src/branch-linker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACH,YAAY,GAGf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,kBAAkB,GAAmB;IACvC,IAAI;QACA,IAAI,CAAC;YACD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,oCAAoC;QACxC,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAmB;QACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;CACJ,CAAC;AAEF,mCAAmC;AACnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,UAAU,CACtB,MAAc,EACd,WAAmB,EACnB,UAAkB,EAClB,MAAc,EACd,IAAY;IAEZ,qDAAqD;IACrD,gDAAgD;IAChD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,WAAmB;IAC1D,mEAAmE;IACnE,MAAM,OAAO,GAAG,kBAAkB,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAkB,CAAC;IAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CACtD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,WAAmB;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAkB,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IAC/E,OAAO,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc;IAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAkB,CAAC;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAkB,CAAC;IACxD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAKD,iEAAiE;AACjE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D9D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { api } from '../github-api.js';
|
|
3
|
+
import { detectRepository } from '../git-utils.js';
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
import { writeFileSync, readFileSync, unlinkSync, existsSync } from 'fs';
|
|
6
|
+
import { tmpdir } from 'os';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
export async function editCommand(issue) {
|
|
9
|
+
const repo = await detectRepository();
|
|
10
|
+
if (!repo) {
|
|
11
|
+
console.error(chalk.red('Error:'), 'Not in a git repository with a GitHub remote');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const authenticated = await api.authenticate();
|
|
15
|
+
if (!authenticated) {
|
|
16
|
+
console.error(chalk.red('Error:'), 'Not authenticated. Run', chalk.cyan('ghp auth'));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const issueNumber = parseInt(issue.replace(/^#/, ''), 10);
|
|
20
|
+
if (isNaN(issueNumber)) {
|
|
21
|
+
console.error(chalk.red('Invalid issue number:'), issue);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Fetch current issue details
|
|
25
|
+
const details = await api.getIssueDetails(repo, issueNumber);
|
|
26
|
+
if (!details) {
|
|
27
|
+
console.error(chalk.red('Issue not found:'), `#${issueNumber}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
console.log(chalk.dim(`Editing #${issueNumber}: ${details.title}`));
|
|
31
|
+
// Open editor with current title and description
|
|
32
|
+
const result = await openEditor(issueNumber, details.title, details.body || '');
|
|
33
|
+
// Check if anything changed
|
|
34
|
+
const titleChanged = result.title !== details.title;
|
|
35
|
+
const bodyChanged = result.body !== (details.body || '');
|
|
36
|
+
if (!titleChanged && !bodyChanged) {
|
|
37
|
+
console.log(chalk.yellow('No changes made'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Check if title is empty
|
|
41
|
+
if (!result.title.trim()) {
|
|
42
|
+
console.error(chalk.red('Error:'), 'Title cannot be empty');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// Update the issue
|
|
46
|
+
console.log(chalk.dim('Updating issue...'));
|
|
47
|
+
const success = await api.updateIssue(repo, issueNumber, {
|
|
48
|
+
title: titleChanged ? result.title : undefined,
|
|
49
|
+
body: bodyChanged ? result.body : undefined,
|
|
50
|
+
});
|
|
51
|
+
if (success) {
|
|
52
|
+
const changes = [];
|
|
53
|
+
if (titleChanged)
|
|
54
|
+
changes.push('title');
|
|
55
|
+
if (bodyChanged)
|
|
56
|
+
changes.push('description');
|
|
57
|
+
console.log(chalk.green('Updated'), `#${issueNumber}`, chalk.dim(`(${changes.join(', ')})`));
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.error(chalk.red('Failed to update issue'));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function openEditor(issueNumber, currentTitle, currentBody) {
|
|
65
|
+
const editor = process.env.EDITOR || process.env.VISUAL || 'vim';
|
|
66
|
+
const tmpFile = join(tmpdir(), `ghp-edit-${issueNumber}-${Date.now()}.md`);
|
|
67
|
+
// Create temp file with editable title, instructions, and body
|
|
68
|
+
const content = [
|
|
69
|
+
currentTitle,
|
|
70
|
+
'',
|
|
71
|
+
'# ─────────────────────────────────────────────',
|
|
72
|
+
`# Editing Issue #${issueNumber}`,
|
|
73
|
+
'# First line = title, everything below = description',
|
|
74
|
+
'# Lines starting with # are ignored',
|
|
75
|
+
'# ─────────────────────────────────────────────',
|
|
76
|
+
'',
|
|
77
|
+
currentBody,
|
|
78
|
+
].join('\n');
|
|
79
|
+
writeFileSync(tmpFile, content);
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
const child = spawn(editor, [tmpFile], {
|
|
82
|
+
stdio: 'inherit',
|
|
83
|
+
});
|
|
84
|
+
child.on('exit', (code) => {
|
|
85
|
+
if (code !== 0) {
|
|
86
|
+
if (existsSync(tmpFile))
|
|
87
|
+
unlinkSync(tmpFile);
|
|
88
|
+
reject(new Error(`Editor exited with code ${code}`));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const fileContent = readFileSync(tmpFile, 'utf-8');
|
|
93
|
+
unlinkSync(tmpFile);
|
|
94
|
+
// Parse the content
|
|
95
|
+
const lines = fileContent.split('\n');
|
|
96
|
+
const nonCommentLines = [];
|
|
97
|
+
for (const line of lines) {
|
|
98
|
+
if (!line.startsWith('#')) {
|
|
99
|
+
nonCommentLines.push(line);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// First non-empty line is the title
|
|
103
|
+
let title = '';
|
|
104
|
+
let bodyStartIndex = 0;
|
|
105
|
+
for (let i = 0; i < nonCommentLines.length; i++) {
|
|
106
|
+
if (nonCommentLines[i].trim()) {
|
|
107
|
+
title = nonCommentLines[i].trim();
|
|
108
|
+
bodyStartIndex = i + 1;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Skip empty lines between title and body
|
|
113
|
+
while (bodyStartIndex < nonCommentLines.length && !nonCommentLines[bodyStartIndex].trim()) {
|
|
114
|
+
bodyStartIndex++;
|
|
115
|
+
}
|
|
116
|
+
// Rest is the body
|
|
117
|
+
const body = nonCommentLines.slice(bodyStartIndex).join('\n').trimEnd();
|
|
118
|
+
resolve({ title, body });
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
reject(err);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa;IAC3C,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,8CAA8C,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;IAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,8BAA8B;IAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEpE,iDAAiD;IACjD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAEhF,4BAA4B;IAC5B,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7C,OAAO;IACX,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE;QACrD,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC9C,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,YAAY;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,WAAW,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAOD,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,YAAoB,EAAE,WAAmB;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE3E,+DAA+D;IAC/D,MAAM,OAAO,GAAG;QACZ,YAAY;QACZ,EAAE;QACF,iDAAiD;QACjD,oBAAoB,WAAW,EAAE;QACjC,sDAAsD;QACtD,qCAAqC;QACrC,iDAAiD;QACjD,EAAE;QACF,WAAW;KACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;YACnC,KAAK,EAAE,SAAS;SACnB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACtB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACb,IAAI,UAAU,CAAC,OAAO,CAAC;oBAAE,UAAU,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACrD,OAAO;YACX,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACnD,UAAU,CAAC,OAAO,CAAC,CAAC;gBAEpB,oBAAoB;gBACpB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,eAAe,GAAa,EAAE,CAAC;gBAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;gBACL,CAAC;gBAED,oCAAoC;gBACpC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,cAAc,GAAG,CAAC,CAAC;gBAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC5B,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAClC,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;wBACvB,MAAM;oBACV,CAAC;gBACL,CAAC;gBAED,0CAA0C;gBAC1C,OAAO,cAAc,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBACxF,cAAc,EAAE,CAAC;gBACrB,CAAC;gBAED,mBAAmB;gBACnB,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAExE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/git-utils.d.ts
CHANGED
|
@@ -1,55 +1,9 @@
|
|
|
1
|
-
import type { RepoInfo } from './types.js';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
2
|
+
* Git utilities re-exported from core library.
|
|
3
|
+
*
|
|
4
|
+
* For CLI usage, all functions use process.cwd() by default.
|
|
5
|
+
* The core library accepts an optional { cwd } parameter for IDE integrations.
|
|
4
6
|
*/
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
* Parse a GitHub URL into owner and repo name
|
|
8
|
-
*/
|
|
9
|
-
export declare function parseGitHubUrl(url: string): RepoInfo | null;
|
|
10
|
-
/**
|
|
11
|
-
* Get the current git branch
|
|
12
|
-
*/
|
|
13
|
-
export declare function getCurrentBranch(): Promise<string | null>;
|
|
14
|
-
/**
|
|
15
|
-
* Check if there are uncommitted changes
|
|
16
|
-
*/
|
|
17
|
-
export declare function hasUncommittedChanges(): Promise<boolean>;
|
|
18
|
-
/**
|
|
19
|
-
* Check if a branch exists locally
|
|
20
|
-
*/
|
|
21
|
-
export declare function branchExists(branchName: string): Promise<boolean>;
|
|
22
|
-
/**
|
|
23
|
-
* Create and checkout a new branch
|
|
24
|
-
*/
|
|
25
|
-
export declare function createBranch(branchName: string): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Checkout an existing branch
|
|
28
|
-
*/
|
|
29
|
-
export declare function checkoutBranch(branchName: string): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Pull latest from origin
|
|
32
|
-
*/
|
|
33
|
-
export declare function pullLatest(): Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Fetch from origin
|
|
36
|
-
*/
|
|
37
|
-
export declare function fetchOrigin(): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Get number of commits behind origin
|
|
40
|
-
*/
|
|
41
|
-
export declare function getCommitsBehind(branch: string): Promise<number>;
|
|
42
|
-
/**
|
|
43
|
-
* Sanitize a string for use in a branch name
|
|
44
|
-
*/
|
|
45
|
-
export declare function sanitizeForBranchName(str: string): string;
|
|
46
|
-
/**
|
|
47
|
-
* Generate a branch name from a pattern
|
|
48
|
-
*/
|
|
49
|
-
export declare function generateBranchName(pattern: string, vars: {
|
|
50
|
-
user: string;
|
|
51
|
-
number: number | null;
|
|
52
|
-
title: string;
|
|
53
|
-
repo: string;
|
|
54
|
-
}, maxLength?: number): string;
|
|
7
|
+
export { detectRepository, getCurrentBranch, hasUncommittedChanges, branchExists, createBranch, checkoutBranch, pullLatest, fetchOrigin, getCommitsBehind, getCommitsAhead, isGitRepository, getRepositoryRoot, sanitizeForBranchName, generateBranchName, getDefaultBranch, parseGitHubUrl, } from '@bretwardjames/ghp-core';
|
|
8
|
+
export type { RepoInfo, GitOptions } from '@bretwardjames/ghp-core';
|
|
55
9
|
//# sourceMappingURL=git-utils.d.ts.map
|
package/dist/git-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACjB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/git-utils.js
CHANGED
|
@@ -1,140 +1,10 @@
|
|
|
1
|
-
import { exec } from 'child_process';
|
|
2
|
-
import { promisify } from 'util';
|
|
3
|
-
const execAsync = promisify(exec);
|
|
4
1
|
/**
|
|
5
|
-
*
|
|
2
|
+
* Git utilities re-exported from core library.
|
|
3
|
+
*
|
|
4
|
+
* For CLI usage, all functions use process.cwd() by default.
|
|
5
|
+
* The core library accepts an optional { cwd } parameter for IDE integrations.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const url = stdout.trim();
|
|
11
|
-
return parseGitHubUrl(url);
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Parse a GitHub URL into owner and repo name
|
|
19
|
-
*/
|
|
20
|
-
export function parseGitHubUrl(url) {
|
|
21
|
-
// Handle SSH format: git@github.com:owner/repo.git
|
|
22
|
-
const sshMatch = url.match(/git@github\.com:([^/]+)\/(.+?)(?:\.git)?$/);
|
|
23
|
-
if (sshMatch) {
|
|
24
|
-
return {
|
|
25
|
-
owner: sshMatch[1],
|
|
26
|
-
name: sshMatch[2],
|
|
27
|
-
fullName: `${sshMatch[1]}/${sshMatch[2]}`,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
// Handle HTTPS format: https://github.com/owner/repo.git
|
|
31
|
-
const httpsMatch = url.match(/https:\/\/github\.com\/([^/]+)\/(.+?)(?:\.git)?$/);
|
|
32
|
-
if (httpsMatch) {
|
|
33
|
-
return {
|
|
34
|
-
owner: httpsMatch[1],
|
|
35
|
-
name: httpsMatch[2],
|
|
36
|
-
fullName: `${httpsMatch[1]}/${httpsMatch[2]}`,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Get the current git branch
|
|
43
|
-
*/
|
|
44
|
-
export async function getCurrentBranch() {
|
|
45
|
-
try {
|
|
46
|
-
const { stdout } = await execAsync('git branch --show-current');
|
|
47
|
-
return stdout.trim() || null;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Check if there are uncommitted changes
|
|
55
|
-
*/
|
|
56
|
-
export async function hasUncommittedChanges() {
|
|
57
|
-
try {
|
|
58
|
-
const { stdout } = await execAsync('git status --porcelain');
|
|
59
|
-
return stdout.trim().length > 0;
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Check if a branch exists locally
|
|
67
|
-
*/
|
|
68
|
-
export async function branchExists(branchName) {
|
|
69
|
-
try {
|
|
70
|
-
await execAsync(`git show-ref --verify --quiet refs/heads/${branchName}`);
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Create and checkout a new branch
|
|
79
|
-
*/
|
|
80
|
-
export async function createBranch(branchName) {
|
|
81
|
-
await execAsync(`git checkout -b "${branchName}"`);
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Checkout an existing branch
|
|
85
|
-
*/
|
|
86
|
-
export async function checkoutBranch(branchName) {
|
|
87
|
-
await execAsync(`git checkout "${branchName}"`);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Pull latest from origin
|
|
91
|
-
*/
|
|
92
|
-
export async function pullLatest() {
|
|
93
|
-
await execAsync('git pull');
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Fetch from origin
|
|
97
|
-
*/
|
|
98
|
-
export async function fetchOrigin() {
|
|
99
|
-
await execAsync('git fetch origin');
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get number of commits behind origin
|
|
103
|
-
*/
|
|
104
|
-
export async function getCommitsBehind(branch) {
|
|
105
|
-
try {
|
|
106
|
-
await fetchOrigin();
|
|
107
|
-
const { stdout } = await execAsync(`git rev-list --count ${branch}..origin/${branch}`);
|
|
108
|
-
return parseInt(stdout.trim(), 10) || 0;
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return 0;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Sanitize a string for use in a branch name
|
|
116
|
-
*/
|
|
117
|
-
export function sanitizeForBranchName(str) {
|
|
118
|
-
return str
|
|
119
|
-
.toLowerCase()
|
|
120
|
-
.replace(/[^a-z0-9-]/g, '-')
|
|
121
|
-
.replace(/-+/g, '-')
|
|
122
|
-
.replace(/^-|-$/g, '')
|
|
123
|
-
.substring(0, 50);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Generate a branch name from a pattern
|
|
127
|
-
*/
|
|
128
|
-
export function generateBranchName(pattern, vars, maxLength = 60) {
|
|
129
|
-
const sanitizedTitle = sanitizeForBranchName(vars.title);
|
|
130
|
-
let branch = pattern
|
|
131
|
-
.replace('{user}', vars.user)
|
|
132
|
-
.replace('{number}', vars.number?.toString() || 'draft')
|
|
133
|
-
.replace('{title}', sanitizedTitle)
|
|
134
|
-
.replace('{repo}', vars.repo);
|
|
135
|
-
if (branch.length > maxLength) {
|
|
136
|
-
branch = branch.substring(0, maxLength).replace(/-$/, '');
|
|
137
|
-
}
|
|
138
|
-
return branch;
|
|
139
|
-
}
|
|
7
|
+
// Re-export all git utilities from core
|
|
8
|
+
// These all use process.cwd() by default, which is correct for CLI usage
|
|
9
|
+
export { detectRepository, getCurrentBranch, hasUncommittedChanges, branchExists, createBranch, checkoutBranch, pullLatest, fetchOrigin, getCommitsBehind, getCommitsAhead, isGitRepository, getRepositoryRoot, sanitizeForBranchName, generateBranchName, getDefaultBranch, parseGitHubUrl, } from '@bretwardjames/ghp-core';
|
|
140
10
|
//# sourceMappingURL=git-utils.js.map
|
package/dist/git-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,yEAAyE;AACzE,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACjB,MAAM,yBAAyB,CAAC"}
|