brn-toolkit 1.0.1 → 1.0.2
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/skills/github/scripts/get_issue.js +38 -32
- package/dist/skills/github/scripts/get_repo_info.js +22 -16
- package/dist/skills/github/scripts/list_prs.js +26 -20
- package/dist/skills/jira/scripts/get_ticket.js +32 -26
- package/package.json +1 -1
- package/skills/git-worktree/SKILL.md +1 -1
- package/skills/github/SKILL.md +1 -1
- package/skills/github/scripts/get_issue.ts +42 -35
- package/skills/github/scripts/get_repo_info.ts +24 -17
- package/skills/github/scripts/list_prs.ts +29 -22
- package/skills/jira/SKILL.md +1 -1
- package/skills/jira/scripts/get_ticket.ts +33 -26
- package/skills/workflow/SKILL.md +1 -1
- package/skills/workspace-manager/SKILL.md +1 -1
|
@@ -4,37 +4,43 @@
|
|
|
4
4
|
* Usage: npx tsx get_issue.ts <owner/repo/issues/number> or <owner/repo> <issue_number>
|
|
5
5
|
*/
|
|
6
6
|
import { githubRequest } from "../../../lib/utils.js";
|
|
7
|
-
|
|
8
|
-
let
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
async function main() {
|
|
8
|
+
let repoPath = process.argv[2];
|
|
9
|
+
let issueNumber = process.argv[3];
|
|
10
|
+
// Handle URL-like format: owner/repo/issues/123
|
|
11
|
+
if (repoPath && repoPath.includes("/issues/")) {
|
|
12
|
+
const parts = repoPath.split("/");
|
|
13
|
+
issueNumber = parts.pop();
|
|
14
|
+
parts.pop(); // remove 'issues'
|
|
15
|
+
repoPath = parts.join("/");
|
|
16
|
+
}
|
|
17
|
+
if (!repoPath || !issueNumber) {
|
|
18
|
+
console.log("Usage: npx tsx get_issue.ts <owner/repo> <issue_number>");
|
|
19
|
+
console.log("Example: npx tsx get_issue.ts octocat/Hello-World 1");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const issue = await githubRequest(`/repos/${repoPath}/issues/${issueNumber}`);
|
|
23
|
+
console.log(`Issue: #${issue.number} ${issue.title}`);
|
|
24
|
+
console.log("=".repeat(60));
|
|
25
|
+
console.log(`Status: ${issue.state.toUpperCase()}`);
|
|
26
|
+
console.log(`Author: @${issue.user.login}`);
|
|
27
|
+
console.log(`Assignee: ${issue.assignee ? "@" + issue.assignee.login : "Unassigned"}`);
|
|
28
|
+
console.log(`Labels: ${issue.labels.map(l => l.name).join(", ") || "None"}`);
|
|
29
|
+
console.log(`Created: ${issue.created_at.slice(0, 10)}`);
|
|
30
|
+
console.log(`Updated: ${issue.updated_at.slice(0, 10)}`);
|
|
31
|
+
console.log();
|
|
32
|
+
if (issue.body) {
|
|
33
|
+
console.log("Description:");
|
|
34
|
+
console.log("-".repeat(40));
|
|
35
|
+
console.log(issue.body);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log("No description provided.");
|
|
39
|
+
}
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(`URL: ${issue.html_url}`);
|
|
15
42
|
}
|
|
16
|
-
|
|
17
|
-
console.
|
|
18
|
-
console.log("Example: npx tsx get_issue.ts octocat/Hello-World 1");
|
|
43
|
+
main().catch(err => {
|
|
44
|
+
console.error("❌ Error:", err.message);
|
|
19
45
|
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
const issue = await githubRequest(`/repos/${repoPath}/issues/${issueNumber}`);
|
|
22
|
-
console.log(`Issue: #${issue.number} ${issue.title}`);
|
|
23
|
-
console.log("=".repeat(60));
|
|
24
|
-
console.log(`Status: ${issue.state.toUpperCase()}`);
|
|
25
|
-
console.log(`Author: @${issue.user.login}`);
|
|
26
|
-
console.log(`Assignee: ${issue.assignee ? "@" + issue.assignee.login : "Unassigned"}`);
|
|
27
|
-
console.log(`Labels: ${issue.labels.map(l => l.name).join(", ") || "None"}`);
|
|
28
|
-
console.log(`Created: ${issue.created_at.slice(0, 10)}`);
|
|
29
|
-
console.log(`Updated: ${issue.updated_at.slice(0, 10)}`);
|
|
30
|
-
console.log();
|
|
31
|
-
if (issue.body) {
|
|
32
|
-
console.log("Description:");
|
|
33
|
-
console.log("-".repeat(40));
|
|
34
|
-
console.log(issue.body);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
console.log("No description provided.");
|
|
38
|
-
}
|
|
39
|
-
console.log();
|
|
40
|
-
console.log(`URL: ${issue.html_url}`);
|
|
46
|
+
});
|
|
@@ -4,20 +4,26 @@
|
|
|
4
4
|
* Usage: npx tsx get_repo_info.ts <owner/repo>
|
|
5
5
|
*/
|
|
6
6
|
import { githubRequest } from "../../../lib/utils.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
async function main() {
|
|
8
|
+
const repoPath = process.argv[2];
|
|
9
|
+
if (!repoPath) {
|
|
10
|
+
console.log("Usage: npx tsx get_repo_info.ts <owner/repo>");
|
|
11
|
+
console.log("Example: npx tsx get_repo_info.ts octocat/Hello-World");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const repo = await githubRequest(`/repos/${repoPath}`);
|
|
15
|
+
console.log(`Repository: ${repo.full_name}`);
|
|
16
|
+
console.log("=".repeat(50));
|
|
17
|
+
console.log(`Description: ${repo.description ?? "N/A"}`);
|
|
18
|
+
console.log(`Visibility: ${repo.private ? "Private" : "Public"}`);
|
|
19
|
+
console.log(`Default: ${repo.default_branch}`);
|
|
20
|
+
console.log(`Language: ${repo.language ?? "N/A"}`);
|
|
21
|
+
console.log(`Stars: ${repo.stargazers_count}`);
|
|
22
|
+
console.log(`Forks: ${repo.forks_count}`);
|
|
23
|
+
console.log(`Clone URL: ${repo.clone_url}`);
|
|
24
|
+
console.log(`SSH URL: ${repo.ssh_url}`);
|
|
12
25
|
}
|
|
13
|
-
|
|
14
|
-
console.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
console.log(`Visibility: ${repo.private ? "Private" : "Public"}`);
|
|
18
|
-
console.log(`Default: ${repo.default_branch}`);
|
|
19
|
-
console.log(`Language: ${repo.language ?? "N/A"}`);
|
|
20
|
-
console.log(`Stars: ${repo.stargazers_count}`);
|
|
21
|
-
console.log(`Forks: ${repo.forks_count}`);
|
|
22
|
-
console.log(`Clone URL: ${repo.clone_url}`);
|
|
23
|
-
console.log(`SSH URL: ${repo.ssh_url}`);
|
|
26
|
+
main().catch(err => {
|
|
27
|
+
console.error("❌ Error:", err.message);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
});
|
|
@@ -4,24 +4,30 @@
|
|
|
4
4
|
* Usage: npx tsx list_prs.ts <owner/repo> [state]
|
|
5
5
|
*/
|
|
6
6
|
import { githubRequest } from "../../../lib/utils.js";
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
console.log(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
7
|
+
async function main() {
|
|
8
|
+
const repoPath = process.argv[2];
|
|
9
|
+
const state = process.argv[3] ?? "open";
|
|
10
|
+
if (!repoPath) {
|
|
11
|
+
console.log("Usage: npx tsx list_prs.ts <owner/repo> [state]");
|
|
12
|
+
console.log("States: open, closed, all (default: open)");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const prs = await githubRequest(`/repos/${repoPath}/pulls?state=${state}&per_page=30`);
|
|
16
|
+
console.log(`Pull Requests for ${repoPath} (${state}):`);
|
|
17
|
+
console.log("=".repeat(50));
|
|
18
|
+
if (prs.length === 0) {
|
|
19
|
+
console.log("No pull requests found.");
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
for (const pr of prs) {
|
|
23
|
+
const draft = pr.draft ? "📝" : "";
|
|
24
|
+
console.log(`#${pr.number} ${draft} ${pr.title}`);
|
|
25
|
+
console.log(` ${pr.head.ref} → ${pr.base.ref} by @${pr.user.login}`);
|
|
26
|
+
console.log(` ${pr.html_url}`);
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
27
29
|
}
|
|
30
|
+
main().catch(err => {
|
|
31
|
+
console.error("❌ Error:", err.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
@@ -16,30 +16,36 @@ function extractText(node) {
|
|
|
16
16
|
}
|
|
17
17
|
return "";
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
console.log(
|
|
30
|
-
console.log(
|
|
31
|
-
console.log(`
|
|
32
|
-
console.log(`
|
|
33
|
-
console.log(`
|
|
34
|
-
console.log(`
|
|
35
|
-
console.log(`
|
|
36
|
-
console.log(`
|
|
37
|
-
console.log(`
|
|
38
|
-
console.log();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
19
|
+
async function main() {
|
|
20
|
+
const ticketKey = process.argv[2];
|
|
21
|
+
if (!ticketKey) {
|
|
22
|
+
console.log("Usage: npx tsx get_ticket.ts <ticket_key>");
|
|
23
|
+
console.log("Example: npx tsx get_ticket.ts PROJ-123");
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const { url } = getJiraConfig();
|
|
27
|
+
const issue = await jiraRequest(`/rest/api/3/issue/${ticketKey}`);
|
|
28
|
+
const { fields } = issue;
|
|
29
|
+
console.log(`Ticket: ${issue.key}`);
|
|
30
|
+
console.log("=".repeat(60));
|
|
31
|
+
console.log(`Summary: ${fields.summary}`);
|
|
32
|
+
console.log(`Status: ${fields.status.name}`);
|
|
33
|
+
console.log(`Type: ${fields.issuetype.name}`);
|
|
34
|
+
console.log(`Priority: ${fields.priority?.name ?? "None"}`);
|
|
35
|
+
console.log(`Assignee: ${fields.assignee?.displayName ?? "Unassigned"}`);
|
|
36
|
+
console.log(`Reporter: ${fields.reporter?.displayName ?? "Unknown"}`);
|
|
37
|
+
console.log(`Created: ${fields.created.slice(0, 10)}`);
|
|
38
|
+
console.log(`Updated: ${fields.updated.slice(0, 10)}`);
|
|
39
|
+
console.log();
|
|
40
|
+
if (fields.description) {
|
|
41
|
+
console.log("Description:");
|
|
42
|
+
console.log("-".repeat(40));
|
|
43
|
+
console.log(extractText(fields.description));
|
|
44
|
+
}
|
|
45
|
+
console.log();
|
|
46
|
+
console.log(`URL: ${url}/browse/${issue.key}`);
|
|
43
47
|
}
|
|
44
|
-
|
|
45
|
-
console.
|
|
48
|
+
main().catch(err => {
|
|
49
|
+
console.error("❌ Error:", err.message);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
});
|
package/package.json
CHANGED
package/skills/github/SKILL.md
CHANGED
|
@@ -18,42 +18,49 @@ interface Issue {
|
|
|
18
18
|
html_url: string;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
// Handle URL-like format: owner/repo/issues/123
|
|
25
|
-
if (repoPath && repoPath.includes("/issues/")) {
|
|
26
|
-
const parts = repoPath.split("/");
|
|
27
|
-
issueNumber = parts.pop()!;
|
|
28
|
-
parts.pop(); // remove 'issues'
|
|
29
|
-
repoPath = parts.join("/");
|
|
30
|
-
}
|
|
21
|
+
async function main() {
|
|
22
|
+
let repoPath = process.argv[2];
|
|
23
|
+
let issueNumber = process.argv[3];
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
// Handle URL-like format: owner/repo/issues/123
|
|
26
|
+
if (repoPath && repoPath.includes("/issues/")) {
|
|
27
|
+
const parts = repoPath.split("/");
|
|
28
|
+
issueNumber = parts.pop()!;
|
|
29
|
+
parts.pop(); // remove 'issues'
|
|
30
|
+
repoPath = parts.join("/");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (!repoPath || !issueNumber) {
|
|
34
|
+
console.log("Usage: npx tsx get_issue.ts <owner/repo> <issue_number>");
|
|
35
|
+
console.log("Example: npx tsx get_issue.ts octocat/Hello-World 1");
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
37
38
|
|
|
38
|
-
const issue = await githubRequest<Issue>(`/repos/${repoPath}/issues/${issueNumber}`);
|
|
39
|
-
|
|
40
|
-
console.log(`Issue: #${issue.number} ${issue.title}`);
|
|
41
|
-
console.log("=".repeat(60));
|
|
42
|
-
console.log(`Status: ${issue.state.toUpperCase()}`);
|
|
43
|
-
console.log(`Author: @${issue.user.login}`);
|
|
44
|
-
console.log(`Assignee: ${issue.assignee ? "@" + issue.assignee.login : "Unassigned"}`);
|
|
45
|
-
console.log(`Labels: ${issue.labels.map(l => l.name).join(", ") || "None"}`);
|
|
46
|
-
console.log(`Created: ${issue.created_at.slice(0, 10)}`);
|
|
47
|
-
console.log(`Updated: ${issue.updated_at.slice(0, 10)}`);
|
|
48
|
-
console.log();
|
|
49
|
-
|
|
50
|
-
if (issue.body) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
} else {
|
|
55
|
-
|
|
39
|
+
const issue = await githubRequest<Issue>(`/repos/${repoPath}/issues/${issueNumber}`);
|
|
40
|
+
|
|
41
|
+
console.log(`Issue: #${issue.number} ${issue.title}`);
|
|
42
|
+
console.log("=".repeat(60));
|
|
43
|
+
console.log(`Status: ${issue.state.toUpperCase()}`);
|
|
44
|
+
console.log(`Author: @${issue.user.login}`);
|
|
45
|
+
console.log(`Assignee: ${issue.assignee ? "@" + issue.assignee.login : "Unassigned"}`);
|
|
46
|
+
console.log(`Labels: ${issue.labels.map(l => l.name).join(", ") || "None"}`);
|
|
47
|
+
console.log(`Created: ${issue.created_at.slice(0, 10)}`);
|
|
48
|
+
console.log(`Updated: ${issue.updated_at.slice(0, 10)}`);
|
|
49
|
+
console.log();
|
|
50
|
+
|
|
51
|
+
if (issue.body) {
|
|
52
|
+
console.log("Description:");
|
|
53
|
+
console.log("-".repeat(40));
|
|
54
|
+
console.log(issue.body);
|
|
55
|
+
} else {
|
|
56
|
+
console.log("No description provided.");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(`URL: ${issue.html_url}`);
|
|
56
61
|
}
|
|
57
62
|
|
|
58
|
-
|
|
59
|
-
console.
|
|
63
|
+
main().catch(err => {
|
|
64
|
+
console.error("❌ Error:", err.message);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
});
|
|
@@ -17,23 +17,30 @@ interface Repo {
|
|
|
17
17
|
ssh_url: string;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
async function main() {
|
|
21
|
+
const repoPath = process.argv[2];
|
|
21
22
|
|
|
22
|
-
if (!repoPath) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
23
|
+
if (!repoPath) {
|
|
24
|
+
console.log("Usage: npx tsx get_repo_info.ts <owner/repo>");
|
|
25
|
+
console.log("Example: npx tsx get_repo_info.ts octocat/Hello-World");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
27
28
|
|
|
28
|
-
const repo = await githubRequest<Repo>(`/repos/${repoPath}`);
|
|
29
|
+
const repo = await githubRequest<Repo>(`/repos/${repoPath}`);
|
|
29
30
|
|
|
30
|
-
console.log(`Repository: ${repo.full_name}`);
|
|
31
|
-
console.log("=".repeat(50));
|
|
32
|
-
console.log(`Description: ${repo.description ?? "N/A"}`);
|
|
33
|
-
console.log(`Visibility: ${repo.private ? "Private" : "Public"}`);
|
|
34
|
-
console.log(`Default: ${repo.default_branch}`);
|
|
35
|
-
console.log(`Language: ${repo.language ?? "N/A"}`);
|
|
36
|
-
console.log(`Stars: ${repo.stargazers_count}`);
|
|
37
|
-
console.log(`Forks: ${repo.forks_count}`);
|
|
38
|
-
console.log(`Clone URL: ${repo.clone_url}`);
|
|
39
|
-
console.log(`SSH URL: ${repo.ssh_url}`);
|
|
31
|
+
console.log(`Repository: ${repo.full_name}`);
|
|
32
|
+
console.log("=".repeat(50));
|
|
33
|
+
console.log(`Description: ${repo.description ?? "N/A"}`);
|
|
34
|
+
console.log(`Visibility: ${repo.private ? "Private" : "Public"}`);
|
|
35
|
+
console.log(`Default: ${repo.default_branch}`);
|
|
36
|
+
console.log(`Language: ${repo.language ?? "N/A"}`);
|
|
37
|
+
console.log(`Stars: ${repo.stargazers_count}`);
|
|
38
|
+
console.log(`Forks: ${repo.forks_count}`);
|
|
39
|
+
console.log(`Clone URL: ${repo.clone_url}`);
|
|
40
|
+
console.log(`SSH URL: ${repo.ssh_url}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
main().catch(err => {
|
|
44
|
+
console.error("❌ Error:", err.message);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
});
|
|
@@ -15,31 +15,38 @@ interface PR {
|
|
|
15
15
|
user: { login: string };
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
const
|
|
18
|
+
async function main() {
|
|
19
|
+
const repoPath = process.argv[2];
|
|
20
|
+
const state = process.argv[3] ?? "open";
|
|
20
21
|
|
|
21
|
-
if (!repoPath) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
22
|
+
if (!repoPath) {
|
|
23
|
+
console.log("Usage: npx tsx list_prs.ts <owner/repo> [state]");
|
|
24
|
+
console.log("States: open, closed, all (default: open)");
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
26
27
|
|
|
27
|
-
const prs = await githubRequest<PR[]>(
|
|
28
|
-
|
|
29
|
-
);
|
|
28
|
+
const prs = await githubRequest<PR[]>(
|
|
29
|
+
`/repos/${repoPath}/pulls?state=${state}&per_page=30`
|
|
30
|
+
);
|
|
30
31
|
|
|
31
|
-
console.log(`Pull Requests for ${repoPath} (${state}):`);
|
|
32
|
-
console.log("=".repeat(50));
|
|
32
|
+
console.log(`Pull Requests for ${repoPath} (${state}):`);
|
|
33
|
+
console.log("=".repeat(50));
|
|
33
34
|
|
|
34
|
-
if (prs.length === 0) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
35
|
+
if (prs.length === 0) {
|
|
36
|
+
console.log("No pull requests found.");
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
38
39
|
|
|
39
|
-
for (const pr of prs) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
for (const pr of prs) {
|
|
41
|
+
const draft = pr.draft ? "📝" : "";
|
|
42
|
+
console.log(`#${pr.number} ${draft} ${pr.title}`);
|
|
43
|
+
console.log(` ${pr.head.ref} → ${pr.base.ref} by @${pr.user.login}`);
|
|
44
|
+
console.log(` ${pr.html_url}`);
|
|
45
|
+
console.log();
|
|
46
|
+
}
|
|
45
47
|
}
|
|
48
|
+
|
|
49
|
+
main().catch(err => {
|
|
50
|
+
console.error("❌ Error:", err.message);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
});
|
package/skills/jira/SKILL.md
CHANGED
|
@@ -36,36 +36,43 @@ function extractText(node: unknown): string {
|
|
|
36
36
|
return "";
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
async function main() {
|
|
40
|
+
const ticketKey = process.argv[2];
|
|
40
41
|
|
|
41
|
-
if (!ticketKey) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
42
|
+
if (!ticketKey) {
|
|
43
|
+
console.log("Usage: npx tsx get_ticket.ts <ticket_key>");
|
|
44
|
+
console.log("Example: npx tsx get_ticket.ts PROJ-123");
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
46
47
|
|
|
47
|
-
const { url } = getJiraConfig();
|
|
48
|
-
const issue = await jiraRequest<Issue>(`/rest/api/3/issue/${ticketKey}`);
|
|
48
|
+
const { url } = getJiraConfig();
|
|
49
|
+
const issue = await jiraRequest<Issue>(`/rest/api/3/issue/${ticketKey}`);
|
|
49
50
|
|
|
50
|
-
const { fields } = issue;
|
|
51
|
+
const { fields } = issue;
|
|
51
52
|
|
|
52
|
-
console.log(`Ticket: ${issue.key}`);
|
|
53
|
-
console.log("=".repeat(60));
|
|
54
|
-
console.log(`Summary: ${fields.summary}`);
|
|
55
|
-
console.log(`Status: ${fields.status.name}`);
|
|
56
|
-
console.log(`Type: ${fields.issuetype.name}`);
|
|
57
|
-
console.log(`Priority: ${fields.priority?.name ?? "None"}`);
|
|
58
|
-
console.log(`Assignee: ${fields.assignee?.displayName ?? "Unassigned"}`);
|
|
59
|
-
console.log(`Reporter: ${fields.reporter?.displayName ?? "Unknown"}`);
|
|
60
|
-
console.log(`Created: ${fields.created.slice(0, 10)}`);
|
|
61
|
-
console.log(`Updated: ${fields.updated.slice(0, 10)}`);
|
|
62
|
-
console.log();
|
|
53
|
+
console.log(`Ticket: ${issue.key}`);
|
|
54
|
+
console.log("=".repeat(60));
|
|
55
|
+
console.log(`Summary: ${fields.summary}`);
|
|
56
|
+
console.log(`Status: ${fields.status.name}`);
|
|
57
|
+
console.log(`Type: ${fields.issuetype.name}`);
|
|
58
|
+
console.log(`Priority: ${fields.priority?.name ?? "None"}`);
|
|
59
|
+
console.log(`Assignee: ${fields.assignee?.displayName ?? "Unassigned"}`);
|
|
60
|
+
console.log(`Reporter: ${fields.reporter?.displayName ?? "Unknown"}`);
|
|
61
|
+
console.log(`Created: ${fields.created.slice(0, 10)}`);
|
|
62
|
+
console.log(`Updated: ${fields.updated.slice(0, 10)}`);
|
|
63
|
+
console.log();
|
|
63
64
|
|
|
64
|
-
if (fields.description) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
if (fields.description) {
|
|
66
|
+
console.log("Description:");
|
|
67
|
+
console.log("-".repeat(40));
|
|
68
|
+
console.log(extractText(fields.description));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
console.log();
|
|
72
|
+
console.log(`URL: ${url}/browse/${issue.key}`);
|
|
68
73
|
}
|
|
69
74
|
|
|
70
|
-
|
|
71
|
-
console.
|
|
75
|
+
main().catch(err => {
|
|
76
|
+
console.error("❌ Error:", err.message);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
});
|
package/skills/workflow/SKILL.md
CHANGED