@neturely/okffs 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/docs.d.ts +11 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +203 -0
- package/dist/docs.js.map +1 -0
- package/dist/git.d.ts +7 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +22 -0
- package/dist/git.js.map +1 -0
- package/dist/github.d.ts +111 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +301 -0
- package/dist/github.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/address_pr_review.d.ts +18 -0
- package/dist/prompts/address_pr_review.d.ts.map +1 -0
- package/dist/prompts/address_pr_review.js +35 -0
- package/dist/prompts/address_pr_review.js.map +1 -0
- package/dist/prompts/update_guidance.d.ts +18 -0
- package/dist/prompts/update_guidance.d.ts.map +1 -0
- package/dist/prompts/update_guidance.js +47 -0
- package/dist/prompts/update_guidance.js.map +1 -0
- package/dist/tools/close_issue.d.ts +17 -0
- package/dist/tools/close_issue.d.ts.map +1 -0
- package/dist/tools/close_issue.js +28 -0
- package/dist/tools/close_issue.js.map +1 -0
- package/dist/tools/comment_issue.d.ts +20 -0
- package/dist/tools/comment_issue.d.ts.map +1 -0
- package/dist/tools/comment_issue.js +23 -0
- package/dist/tools/comment_issue.js.map +1 -0
- package/dist/tools/commit_and_update.d.ts +20 -0
- package/dist/tools/commit_and_update.d.ts.map +1 -0
- package/dist/tools/commit_and_update.js +80 -0
- package/dist/tools/commit_and_update.js.map +1 -0
- package/dist/tools/create_issue.d.ts +29 -0
- package/dist/tools/create_issue.d.ts.map +1 -0
- package/dist/tools/create_issue.js +82 -0
- package/dist/tools/create_issue.js.map +1 -0
- package/dist/tools/create_issues_from_list.d.ts +50 -0
- package/dist/tools/create_issues_from_list.d.ts.map +1 -0
- package/dist/tools/create_issues_from_list.js +48 -0
- package/dist/tools/create_issues_from_list.js.map +1 -0
- package/dist/tools/create_pull_request.d.ts +20 -0
- package/dist/tools/create_pull_request.d.ts.map +1 -0
- package/dist/tools/create_pull_request.js +170 -0
- package/dist/tools/create_pull_request.js.map +1 -0
- package/dist/tools/delete_branch.d.ts +20 -0
- package/dist/tools/delete_branch.d.ts.map +1 -0
- package/dist/tools/delete_branch.js +39 -0
- package/dist/tools/delete_branch.js.map +1 -0
- package/dist/tools/delete_issue.d.ts +20 -0
- package/dist/tools/delete_issue.d.ts.map +1 -0
- package/dist/tools/delete_issue.js +46 -0
- package/dist/tools/delete_issue.js.map +1 -0
- package/dist/tools/get_issue.d.ts +17 -0
- package/dist/tools/get_issue.d.ts.map +1 -0
- package/dist/tools/get_issue.js +27 -0
- package/dist/tools/get_issue.js.map +1 -0
- package/dist/tools/link_issues.d.ts +23 -0
- package/dist/tools/link_issues.d.ts.map +1 -0
- package/dist/tools/link_issues.js +42 -0
- package/dist/tools/link_issues.js.map +1 -0
- package/dist/tools/list_issues.d.ts +11 -0
- package/dist/tools/list_issues.d.ts.map +1 -0
- package/dist/tools/list_issues.js +61 -0
- package/dist/tools/list_issues.js.map +1 -0
- package/dist/tools/list_pr_review_comments.d.ts +17 -0
- package/dist/tools/list_pr_review_comments.d.ts.map +1 -0
- package/dist/tools/list_pr_review_comments.js +43 -0
- package/dist/tools/list_pr_review_comments.js.map +1 -0
- package/dist/tools/plan.d.ts +79 -0
- package/dist/tools/plan.d.ts.map +1 -0
- package/dist/tools/plan.js +159 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepare_release.d.ts +23 -0
- package/dist/tools/prepare_release.d.ts.map +1 -0
- package/dist/tools/prepare_release.js +172 -0
- package/dist/tools/prepare_release.js.map +1 -0
- package/dist/tools/reply_to_review_comment.d.ts +23 -0
- package/dist/tools/reply_to_review_comment.d.ts.map +1 -0
- package/dist/tools/reply_to_review_comment.js +25 -0
- package/dist/tools/reply_to_review_comment.js.map +1 -0
- package/dist/tools/resolve_review_thread.d.ts +17 -0
- package/dist/tools/resolve_review_thread.d.ts.map +1 -0
- package/dist/tools/resolve_review_thread.js +27 -0
- package/dist/tools/resolve_review_thread.js.map +1 -0
- package/package.json +48 -0
package/dist/git.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
// All git calls pass arguments as an array via execFileSync, so no shell is
|
|
3
|
+
// involved — values like branch names or commit messages (which can originate
|
|
4
|
+
// from issue body text or user input) can never be interpreted as commands.
|
|
5
|
+
/** Run a git command with arguments passed as an array. Throws on failure. */
|
|
6
|
+
export function git(args) {
|
|
7
|
+
execFileSync("git", args, { stdio: "ignore" });
|
|
8
|
+
}
|
|
9
|
+
/** Run a git command and return its trimmed stdout. Throws on failure. */
|
|
10
|
+
export function gitOutput(args) {
|
|
11
|
+
return execFileSync("git", args, { encoding: "utf8" }).trim();
|
|
12
|
+
}
|
|
13
|
+
/** Current branch name, or null if it can't be determined. */
|
|
14
|
+
export function currentBranch() {
|
|
15
|
+
try {
|
|
16
|
+
return gitOutput(["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=git.js.map
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAE5E,8EAA8E;AAC9E,MAAM,UAAU,GAAG,CAAC,IAAc;IAChC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/github.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export declare const owner: string | undefined;
|
|
2
|
+
export declare const repo: string | undefined;
|
|
3
|
+
export declare function slugify(title: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Build the branch name for an issue.
|
|
6
|
+
* Format: {issue-number}-{slug}, or {issue-number}-{identifier}-{slug}
|
|
7
|
+
* when OKFFS_IDENTIFIER is set. The identifier is slugified too, so spaces or
|
|
8
|
+
* other characters invalid in a git ref can't break branch creation.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildBranchName(issueNumber: number, title: string): string;
|
|
11
|
+
export declare function createIssue(title: string, body: string, assignees?: string[], labels?: string[], milestone?: number): Promise<{
|
|
12
|
+
number: number;
|
|
13
|
+
html_url: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function updateIssueBody(issueNumber: number, body: string): Promise<void>;
|
|
16
|
+
export declare function getDefaultBranch(): Promise<string>;
|
|
17
|
+
export declare function getRepoDefaultBranch(): Promise<string>;
|
|
18
|
+
export declare function getRef(ref: string): Promise<{
|
|
19
|
+
object: {
|
|
20
|
+
sha: string;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
export declare function createBranch(branchName: string, sha: string): Promise<void>;
|
|
24
|
+
export interface IssueSummary {
|
|
25
|
+
number: number;
|
|
26
|
+
title: string;
|
|
27
|
+
html_url: string;
|
|
28
|
+
body: string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function listIssues(): Promise<IssueSummary[]>;
|
|
31
|
+
export interface PullRequestSummary {
|
|
32
|
+
number: number;
|
|
33
|
+
html_url: string;
|
|
34
|
+
draft: boolean;
|
|
35
|
+
head: {
|
|
36
|
+
ref: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export declare function listOpenPullRequests(): Promise<PullRequestSummary[]>;
|
|
40
|
+
export interface IssueRelationships {
|
|
41
|
+
parent: number[];
|
|
42
|
+
blockedBy: number[];
|
|
43
|
+
blocking: number[];
|
|
44
|
+
}
|
|
45
|
+
export declare function parseRelationships(body: string | null): IssueRelationships;
|
|
46
|
+
export declare function closeIssue(issueNumber: number): Promise<void>;
|
|
47
|
+
export declare function getIssue(issueNumber: number): Promise<{
|
|
48
|
+
number: number;
|
|
49
|
+
title: string;
|
|
50
|
+
html_url: string;
|
|
51
|
+
body: string | null;
|
|
52
|
+
}>;
|
|
53
|
+
export declare function addIssueComment(issueNumber: number, body: string): Promise<void>;
|
|
54
|
+
export declare function deleteBranch(branchName: string): Promise<void>;
|
|
55
|
+
export declare function getBranchCommits(branchName: string, baseBranch: string): Promise<Array<{
|
|
56
|
+
sha: string;
|
|
57
|
+
commit: {
|
|
58
|
+
message: string;
|
|
59
|
+
};
|
|
60
|
+
}>>;
|
|
61
|
+
export declare function getIssueComments(issueNumber: number): Promise<Array<{
|
|
62
|
+
body: string;
|
|
63
|
+
}>>;
|
|
64
|
+
export declare function createPullRequest(title: string, body: string, head: string, base: string): Promise<{
|
|
65
|
+
number: number;
|
|
66
|
+
html_url: string;
|
|
67
|
+
}>;
|
|
68
|
+
export declare function getOpenPullRequestForBranch(branch: string): Promise<{
|
|
69
|
+
number: number;
|
|
70
|
+
html_url: string;
|
|
71
|
+
node_id: string;
|
|
72
|
+
draft: boolean;
|
|
73
|
+
} | null>;
|
|
74
|
+
export declare function updatePullRequest(prNumber: number, fields: {
|
|
75
|
+
title?: string;
|
|
76
|
+
body?: string;
|
|
77
|
+
}): Promise<void>;
|
|
78
|
+
export declare function markPullRequestReady(nodeId: string): Promise<void>;
|
|
79
|
+
export declare function createDraftPullRequest(title: string, body: string, head: string, base: string): Promise<{
|
|
80
|
+
number: number;
|
|
81
|
+
html_url: string;
|
|
82
|
+
}>;
|
|
83
|
+
export declare function extractBranchFromBody(body: string | null): string | null;
|
|
84
|
+
export interface ReviewComment {
|
|
85
|
+
id: number;
|
|
86
|
+
path: string | null;
|
|
87
|
+
line: number | null;
|
|
88
|
+
author: string;
|
|
89
|
+
body: string;
|
|
90
|
+
}
|
|
91
|
+
export interface ReviewThread {
|
|
92
|
+
id: string;
|
|
93
|
+
isResolved: boolean;
|
|
94
|
+
comments: ReviewComment[];
|
|
95
|
+
}
|
|
96
|
+
export interface ReviewSummary {
|
|
97
|
+
author: string;
|
|
98
|
+
state: string;
|
|
99
|
+
body: string;
|
|
100
|
+
}
|
|
101
|
+
export interface PullRequestReview {
|
|
102
|
+
threads: ReviewThread[];
|
|
103
|
+
reviews: ReviewSummary[];
|
|
104
|
+
}
|
|
105
|
+
export declare function getPullRequestReview(prNumber: number): Promise<PullRequestReview>;
|
|
106
|
+
export declare function replyToReviewComment(prNumber: number, commentId: number, body: string): Promise<{
|
|
107
|
+
id: number;
|
|
108
|
+
html_url: string;
|
|
109
|
+
}>;
|
|
110
|
+
export declare function resolveReviewThread(threadId: string): Promise<void>;
|
|
111
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/github.js
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
const BASE = "https://api.github.com";
|
|
4
|
+
const PAT_LINK = "https://github.com/settings/tokens/new?scopes=repo&description=okffs";
|
|
5
|
+
/** Run a command and return trimmed stdout, or null on any failure. */
|
|
6
|
+
function tryExec(cmd, args) {
|
|
7
|
+
try {
|
|
8
|
+
const out = execFileSync(cmd, args, {
|
|
9
|
+
encoding: "utf8",
|
|
10
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
11
|
+
}).trim();
|
|
12
|
+
return out || null;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a GitHub token. Prefers GITHUB_TOKEN, then falls back to the GitHub
|
|
20
|
+
* CLI (`gh auth token`) so users already signed in with `gh` need no setup.
|
|
21
|
+
*/
|
|
22
|
+
function resolveToken() {
|
|
23
|
+
return process.env.GITHUB_TOKEN || tryExec("gh", ["auth", "token"]);
|
|
24
|
+
}
|
|
25
|
+
/** Parse owner/repo from a GitHub remote URL (https or ssh form). */
|
|
26
|
+
function parseOwnerRepo(remoteUrl) {
|
|
27
|
+
const m = remoteUrl.match(/github\.com[:/]([^/]+)\/(.+?)(?:\.git)?$/);
|
|
28
|
+
return m ? { owner: m[1], repo: m[2] } : null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Resolve owner/repo. Prefers explicit env vars, then auto-detects from the
|
|
32
|
+
* `origin` git remote of the current working directory.
|
|
33
|
+
*/
|
|
34
|
+
function resolveOwnerRepo() {
|
|
35
|
+
let owner = process.env.GITHUB_OWNER;
|
|
36
|
+
let repo = process.env.GITHUB_REPO;
|
|
37
|
+
if (!owner || !repo) {
|
|
38
|
+
const remote = tryExec("git", ["remote", "get-url", "origin"]);
|
|
39
|
+
const parsed = remote ? parseOwnerRepo(remote) : null;
|
|
40
|
+
if (parsed) {
|
|
41
|
+
owner = owner || parsed.owner;
|
|
42
|
+
repo = repo || parsed.repo;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { owner, repo };
|
|
46
|
+
}
|
|
47
|
+
const token = resolveToken();
|
|
48
|
+
const resolved = resolveOwnerRepo();
|
|
49
|
+
export const owner = resolved.owner;
|
|
50
|
+
export const repo = resolved.repo;
|
|
51
|
+
if (!token) {
|
|
52
|
+
throw new Error(`No GitHub token found. Set GITHUB_TOKEN in .env — a fine-grained PAT (least privilege; ` +
|
|
53
|
+
`Issues/Contents/Pull requests read-write, Metadata read, Administration read-write) or, for a quick start, ` +
|
|
54
|
+
`a classic broad repo-scope token: ${PAT_LINK} — or sign in with the GitHub CLI (\`gh auth login\`).`);
|
|
55
|
+
}
|
|
56
|
+
if (!owner || !repo) {
|
|
57
|
+
throw new Error("Could not determine the GitHub repository. Run okffs from inside a git repo with a GitHub `origin` remote, or set GITHUB_OWNER and GITHUB_REPO in .env.");
|
|
58
|
+
}
|
|
59
|
+
async function request(path, options = {}) {
|
|
60
|
+
const res = await fetch(`${BASE}${path}`, {
|
|
61
|
+
...options,
|
|
62
|
+
headers: {
|
|
63
|
+
Authorization: `Bearer ${token}`,
|
|
64
|
+
Accept: "application/vnd.github+json",
|
|
65
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
...options.headers,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
if (!res.ok) {
|
|
71
|
+
const body = await res.text();
|
|
72
|
+
throw new Error(`GitHub API error ${res.status}: ${body}`);
|
|
73
|
+
}
|
|
74
|
+
if (res.status === 204) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return res.json();
|
|
78
|
+
}
|
|
79
|
+
async function graphqlRequest(query, variables) {
|
|
80
|
+
const res = await fetch(`${BASE}/graphql`, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: {
|
|
83
|
+
Authorization: `Bearer ${token}`,
|
|
84
|
+
"Content-Type": "application/json",
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({ query, variables }),
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok) {
|
|
89
|
+
const body = await res.text();
|
|
90
|
+
throw new Error(`GitHub GraphQL error ${res.status}: ${body}`);
|
|
91
|
+
}
|
|
92
|
+
const json = (await res.json());
|
|
93
|
+
if (json.errors) {
|
|
94
|
+
throw new Error(`GitHub GraphQL error: ${JSON.stringify(json.errors)}`);
|
|
95
|
+
}
|
|
96
|
+
return json.data;
|
|
97
|
+
}
|
|
98
|
+
export function slugify(title) {
|
|
99
|
+
return title
|
|
100
|
+
.toLowerCase()
|
|
101
|
+
.replace(/[^a-z0-9\s-]/g, "")
|
|
102
|
+
.trim()
|
|
103
|
+
.split(/\s+/)
|
|
104
|
+
.slice(0, 5)
|
|
105
|
+
.join("-");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Build the branch name for an issue.
|
|
109
|
+
* Format: {issue-number}-{slug}, or {issue-number}-{identifier}-{slug}
|
|
110
|
+
* when OKFFS_IDENTIFIER is set. The identifier is slugified too, so spaces or
|
|
111
|
+
* other characters invalid in a git ref can't break branch creation.
|
|
112
|
+
*/
|
|
113
|
+
export function buildBranchName(issueNumber, title) {
|
|
114
|
+
const slug = slugify(title);
|
|
115
|
+
const identifier = config.identifier ? slugify(config.identifier) : "";
|
|
116
|
+
return identifier
|
|
117
|
+
? `${issueNumber}-${identifier}-${slug}`
|
|
118
|
+
: `${issueNumber}-${slug}`;
|
|
119
|
+
}
|
|
120
|
+
export async function createIssue(title, body, assignees, labels, milestone) {
|
|
121
|
+
return request(`/repos/${owner}/${repo}/issues`, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
body: JSON.stringify({ title, body, assignees, labels, ...(milestone !== undefined && { milestone }) }),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
export async function updateIssueBody(issueNumber, body) {
|
|
127
|
+
await request(`/repos/${owner}/${repo}/issues/${issueNumber}`, {
|
|
128
|
+
method: "PATCH",
|
|
129
|
+
body: JSON.stringify({ body }),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
export async function getDefaultBranch() {
|
|
133
|
+
if (config.baseBranch)
|
|
134
|
+
return config.baseBranch;
|
|
135
|
+
const data = await request(`/repos/${owner}/${repo}`);
|
|
136
|
+
return data.default_branch;
|
|
137
|
+
}
|
|
138
|
+
// The repository's actual default branch, ignoring OKFFS_BASE_BRANCH. GitHub's
|
|
139
|
+
// `Closes #N` only auto-closes the issue when a PR merges into this branch.
|
|
140
|
+
export async function getRepoDefaultBranch() {
|
|
141
|
+
const data = await request(`/repos/${owner}/${repo}`);
|
|
142
|
+
return data.default_branch;
|
|
143
|
+
}
|
|
144
|
+
export async function getRef(ref) {
|
|
145
|
+
return request(`/repos/${owner}/${repo}/git/ref/heads/${ref}`);
|
|
146
|
+
}
|
|
147
|
+
export async function createBranch(branchName, sha) {
|
|
148
|
+
await request(`/repos/${owner}/${repo}/git/refs`, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
body: JSON.stringify({ ref: `refs/heads/${branchName}`, sha }),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
export async function listIssues() {
|
|
154
|
+
// The issues endpoint also returns pull requests; filter them out via the
|
|
155
|
+
// pull_request field that only PRs carry.
|
|
156
|
+
const raw = await request(`/repos/${owner}/${repo}/issues?state=open&per_page=100`);
|
|
157
|
+
return raw
|
|
158
|
+
.filter((i) => !i.pull_request)
|
|
159
|
+
.map(({ number, title, html_url, body }) => ({ number, title, html_url, body }));
|
|
160
|
+
}
|
|
161
|
+
export async function listOpenPullRequests() {
|
|
162
|
+
return request(`/repos/${owner}/${repo}/pulls?state=open&per_page=100`);
|
|
163
|
+
}
|
|
164
|
+
// Parse the "## Relationships" section written by link_issues, e.g.
|
|
165
|
+
// - Blocked by #3
|
|
166
|
+
// - Blocking #7
|
|
167
|
+
// - Parent: #1
|
|
168
|
+
export function parseRelationships(body) {
|
|
169
|
+
const result = { parent: [], blockedBy: [], blocking: [] };
|
|
170
|
+
if (!body)
|
|
171
|
+
return result;
|
|
172
|
+
const idx = body.indexOf("## Relationships");
|
|
173
|
+
if (idx === -1)
|
|
174
|
+
return result;
|
|
175
|
+
let section = body.slice(idx + "## Relationships".length);
|
|
176
|
+
const nextHeading = section.search(/\n## /);
|
|
177
|
+
if (nextHeading !== -1)
|
|
178
|
+
section = section.slice(0, nextHeading);
|
|
179
|
+
for (const line of section.split("\n")) {
|
|
180
|
+
const m = line.match(/^\s*-\s*(Blocked by|Blocking|Parent:?)\s*#(\d+)/i);
|
|
181
|
+
if (!m)
|
|
182
|
+
continue;
|
|
183
|
+
const num = parseInt(m[2], 10);
|
|
184
|
+
const label = m[1].toLowerCase();
|
|
185
|
+
if (label.startsWith("blocked"))
|
|
186
|
+
result.blockedBy.push(num);
|
|
187
|
+
else if (label.startsWith("blocking"))
|
|
188
|
+
result.blocking.push(num);
|
|
189
|
+
else if (label.startsWith("parent"))
|
|
190
|
+
result.parent.push(num);
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
export async function closeIssue(issueNumber) {
|
|
195
|
+
await request(`/repos/${owner}/${repo}/issues/${issueNumber}`, {
|
|
196
|
+
method: "PATCH",
|
|
197
|
+
body: JSON.stringify({ state: "closed" }),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
export async function getIssue(issueNumber) {
|
|
201
|
+
return request(`/repos/${owner}/${repo}/issues/${issueNumber}`);
|
|
202
|
+
}
|
|
203
|
+
export async function addIssueComment(issueNumber, body) {
|
|
204
|
+
await request(`/repos/${owner}/${repo}/issues/${issueNumber}/comments`, {
|
|
205
|
+
method: "POST",
|
|
206
|
+
body: JSON.stringify({ body }),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
export async function deleteBranch(branchName) {
|
|
210
|
+
await request(`/repos/${owner}/${repo}/git/refs/heads/${branchName}`, {
|
|
211
|
+
method: "DELETE",
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
export async function getBranchCommits(branchName, baseBranch) {
|
|
215
|
+
return request(`/repos/${owner}/${repo}/compare/${baseBranch}...${branchName}`).then((data) => data.commits ?? []);
|
|
216
|
+
}
|
|
217
|
+
export async function getIssueComments(issueNumber) {
|
|
218
|
+
// Fetch newest-first so callers can reliably take the most recent N comments.
|
|
219
|
+
return request(`/repos/${owner}/${repo}/issues/${issueNumber}/comments?per_page=100&sort=created&direction=desc`);
|
|
220
|
+
}
|
|
221
|
+
export async function createPullRequest(title, body, head, base) {
|
|
222
|
+
return request(`/repos/${owner}/${repo}/pulls`, {
|
|
223
|
+
method: "POST",
|
|
224
|
+
body: JSON.stringify({ title, head, base, body }),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Find the open PR (if any) whose head is the given branch. Used to reuse a
|
|
228
|
+
// draft PR created up front by create_issue under OKFFS_AUTO_PR=true.
|
|
229
|
+
export async function getOpenPullRequestForBranch(branch) {
|
|
230
|
+
const prs = await request(`/repos/${owner}/${repo}/pulls?head=${owner}:${branch}&state=open&per_page=1`);
|
|
231
|
+
return prs.length > 0 ? prs[0] : null;
|
|
232
|
+
}
|
|
233
|
+
export async function updatePullRequest(prNumber, fields) {
|
|
234
|
+
await request(`/repos/${owner}/${repo}/pulls/${prNumber}`, {
|
|
235
|
+
method: "PATCH",
|
|
236
|
+
body: JSON.stringify(fields),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Mark a draft PR ready for review. The REST update endpoint cannot change the
|
|
240
|
+
// draft flag, so this uses the GraphQL markPullRequestReadyForReview mutation.
|
|
241
|
+
export async function markPullRequestReady(nodeId) {
|
|
242
|
+
await graphqlRequest(`mutation($id: ID!) { markPullRequestReadyForReview(input: { pullRequestId: $id }) { pullRequest { id } } }`, { id: nodeId });
|
|
243
|
+
}
|
|
244
|
+
export async function createDraftPullRequest(title, body, head, base) {
|
|
245
|
+
return request(`/repos/${owner}/${repo}/pulls`, {
|
|
246
|
+
method: "POST",
|
|
247
|
+
body: JSON.stringify({ title, head, base, body, draft: true }),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
export function extractBranchFromBody(body) {
|
|
251
|
+
if (!body)
|
|
252
|
+
return null;
|
|
253
|
+
const match = body.match(/\*\*Branch:\*\*\s+`([^`]+)`/);
|
|
254
|
+
return match ? match[1] : null;
|
|
255
|
+
}
|
|
256
|
+
// Fetch inline review threads (with resolved state + thread ids) and overall
|
|
257
|
+
// review summaries for a PR. Uses GraphQL so we get thread ids and resolved
|
|
258
|
+
// state, which the REST comments endpoint does not expose.
|
|
259
|
+
export async function getPullRequestReview(prNumber) {
|
|
260
|
+
const data = await graphqlRequest(`query($owner:String!,$repo:String!,$pr:Int!){
|
|
261
|
+
repository(owner:$owner,name:$repo){
|
|
262
|
+
pullRequest(number:$pr){
|
|
263
|
+
reviewThreads(first:100){ nodes{ id isResolved comments(first:50){ nodes{ databaseId path line originalLine body author{login} } } } }
|
|
264
|
+
reviews(first:50){ nodes{ state body author{login} } }
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}`, { owner, repo, pr: prNumber });
|
|
268
|
+
const pr = data.repository.pullRequest;
|
|
269
|
+
if (!pr) {
|
|
270
|
+
// GitHub GraphQL returns pullRequest: null (no errors array) for an
|
|
271
|
+
// unknown PR number — surface a clear message instead of a null deref.
|
|
272
|
+
throw new Error(`Pull request #${prNumber} not found in ${owner}/${repo}.`);
|
|
273
|
+
}
|
|
274
|
+
const threads = pr.reviewThreads.nodes.map((t) => ({
|
|
275
|
+
id: t.id,
|
|
276
|
+
isResolved: t.isResolved,
|
|
277
|
+
comments: t.comments.nodes.map((c) => ({
|
|
278
|
+
id: c.databaseId,
|
|
279
|
+
path: c.path,
|
|
280
|
+
line: c.line ?? c.originalLine,
|
|
281
|
+
author: c.author?.login ?? "unknown",
|
|
282
|
+
body: c.body,
|
|
283
|
+
})),
|
|
284
|
+
}));
|
|
285
|
+
const reviews = pr.reviews.nodes
|
|
286
|
+
.filter((r) => r.body && r.body.trim())
|
|
287
|
+
.map((r) => ({ author: r.author?.login ?? "unknown", state: r.state, body: r.body }));
|
|
288
|
+
return { threads, reviews };
|
|
289
|
+
}
|
|
290
|
+
// Reply to an inline review comment thread (REST in_reply_to).
|
|
291
|
+
export async function replyToReviewComment(prNumber, commentId, body) {
|
|
292
|
+
return request(`/repos/${owner}/${repo}/pulls/${prNumber}/comments`, {
|
|
293
|
+
method: "POST",
|
|
294
|
+
body: JSON.stringify({ body, in_reply_to: commentId }),
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
// Mark a review thread resolved (GraphQL — no REST equivalent).
|
|
298
|
+
export async function resolveReviewThread(threadId) {
|
|
299
|
+
await graphqlRequest(`mutation($id:ID!){ resolveReviewThread(input:{threadId:$id}){ thread{ id isResolved } } }`, { id: threadId });
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
8
|
+
import * as createIssue from "./tools/create_issue.js";
|
|
9
|
+
import * as listIssues from "./tools/list_issues.js";
|
|
10
|
+
import * as closeIssue from "./tools/close_issue.js";
|
|
11
|
+
import * as deleteIssue from "./tools/delete_issue.js";
|
|
12
|
+
import * as deleteBranch from "./tools/delete_branch.js";
|
|
13
|
+
import * as getIssue from "./tools/get_issue.js";
|
|
14
|
+
import * as commentIssue from "./tools/comment_issue.js";
|
|
15
|
+
import * as createIssuesFromList from "./tools/create_issues_from_list.js";
|
|
16
|
+
import * as plan from "./tools/plan.js";
|
|
17
|
+
import * as linkIssues from "./tools/link_issues.js";
|
|
18
|
+
import * as createPullRequest from "./tools/create_pull_request.js";
|
|
19
|
+
import * as commitAndUpdate from "./tools/commit_and_update.js";
|
|
20
|
+
import * as listPrReviewComments from "./tools/list_pr_review_comments.js";
|
|
21
|
+
import * as replyToReviewComment from "./tools/reply_to_review_comment.js";
|
|
22
|
+
import * as resolveReviewThread from "./tools/resolve_review_thread.js";
|
|
23
|
+
import * as prepareRelease from "./tools/prepare_release.js";
|
|
24
|
+
import * as addressPrReview from "./prompts/address_pr_review.js";
|
|
25
|
+
import * as updateGuidance from "./prompts/update_guidance.js";
|
|
26
|
+
const tools = [createIssue, listIssues, closeIssue, deleteIssue, deleteBranch, getIssue, commentIssue, createIssuesFromList, plan, linkIssues, createPullRequest, commitAndUpdate, listPrReviewComments, replyToReviewComment, resolveReviewThread, prepareRelease];
|
|
27
|
+
const prompts = [addressPrReview, updateGuidance];
|
|
28
|
+
// Read the package version so the server reports the real version (dist/index.js
|
|
29
|
+
// lives one level below package.json in both dev and the published package).
|
|
30
|
+
const version = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
|
|
31
|
+
const server = new Server({ name: "okffs", version }, { capabilities: { tools: {}, prompts: {} } });
|
|
32
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
33
|
+
tools: tools.map((t) => ({
|
|
34
|
+
name: t.name,
|
|
35
|
+
description: t.description,
|
|
36
|
+
inputSchema: zodToJsonSchema(t.inputSchema),
|
|
37
|
+
})),
|
|
38
|
+
}));
|
|
39
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
40
|
+
const tool = tools.find((t) => t.name === req.params.name);
|
|
41
|
+
if (!tool) {
|
|
42
|
+
throw new Error(`Unknown tool: ${req.params.name}`);
|
|
43
|
+
}
|
|
44
|
+
const input = tool.inputSchema.parse(req.params.arguments);
|
|
45
|
+
return tool.handler(input);
|
|
46
|
+
});
|
|
47
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
48
|
+
prompts: prompts.map((p) => ({
|
|
49
|
+
name: p.name,
|
|
50
|
+
description: p.description,
|
|
51
|
+
arguments: p.argumentDefs,
|
|
52
|
+
})),
|
|
53
|
+
}));
|
|
54
|
+
server.setRequestHandler(GetPromptRequestSchema, async (req) => {
|
|
55
|
+
const prompt = prompts.find((p) => p.name === req.params.name);
|
|
56
|
+
if (!prompt) {
|
|
57
|
+
throw new Error(`Unknown prompt: ${req.params.name}`);
|
|
58
|
+
}
|
|
59
|
+
return prompt.build(req.params.arguments ?? {});
|
|
60
|
+
});
|
|
61
|
+
const transport = new StdioServerTransport();
|
|
62
|
+
await server.connect(transport);
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const name = "address_pr_review";
|
|
2
|
+
export declare const description = "Read a pull request's review comments, fix the valid ones, reply to each, and post a summary.";
|
|
3
|
+
export declare const argumentDefs: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
required: boolean;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function build(args: Record<string, string | undefined>): {
|
|
9
|
+
description: string;
|
|
10
|
+
messages: {
|
|
11
|
+
role: "user";
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=address_pr_review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address_pr_review.d.ts","sourceRoot":"","sources":["../../src/prompts/address_pr_review.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,sBAAsB,CAAC;AAExC,eAAO,MAAM,WAAW,kGACyE,CAAC;AAElG,eAAO,MAAM,YAAY;;;;GAMxB,CAAC;AAEF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;;;;;;;;;EAyB7D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const name = "address_pr_review";
|
|
2
|
+
export const description = "Read a pull request's review comments, fix the valid ones, reply to each, and post a summary.";
|
|
3
|
+
export const argumentDefs = [
|
|
4
|
+
{
|
|
5
|
+
name: "pr_number",
|
|
6
|
+
description: "The pull request number to address review comments for",
|
|
7
|
+
required: true,
|
|
8
|
+
},
|
|
9
|
+
];
|
|
10
|
+
export function build(args) {
|
|
11
|
+
const pr = args.pr_number ?? "<pr_number>";
|
|
12
|
+
const text = [
|
|
13
|
+
`Address the review feedback on PR #${pr}. Work through these steps:`,
|
|
14
|
+
``,
|
|
15
|
+
`1. Call \`list_pr_review_comments\` for PR #${pr} to read the inline threads and review summaries.`,
|
|
16
|
+
`2. Triage: decide which comments are valid and in scope. Use your judgment — you don't have to act on every comment, but explain any you intentionally skip.`,
|
|
17
|
+
`3. Fix the code for the comments you're addressing. Build/verify if the project supports it.`,
|
|
18
|
+
`4. Commit and push the fixes with \`commit_and_update\`.`,
|
|
19
|
+
`5. Reply to each addressed thread with \`reply_to_review_comment\` (use the comment id from step 1), briefly noting what you changed and referencing the fix.`,
|
|
20
|
+
`6. Post an overall summary of the fixes as a PR comment with \`comment_issue\` (pass the PR number — PRs accept issue comments).`,
|
|
21
|
+
`7. For each addressed thread, call \`resolve_review_thread\` with its thread id. It respects \`OKFFS_RESOLVE_THREADS\`: threads are only actually resolved when that env var is enabled, otherwise they're left for the user to resolve.`,
|
|
22
|
+
``,
|
|
23
|
+
`Keep replies and the summary concise and specific about what changed.`,
|
|
24
|
+
].join("\n");
|
|
25
|
+
return {
|
|
26
|
+
description: `Address review feedback on PR #${pr}`,
|
|
27
|
+
messages: [
|
|
28
|
+
{
|
|
29
|
+
role: "user",
|
|
30
|
+
content: { type: "text", text },
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=address_pr_review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address_pr_review.js","sourceRoot":"","sources":["../../src/prompts/address_pr_review.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAExC,MAAM,CAAC,MAAM,WAAW,GACtB,+FAA+F,CAAC;AAElG,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wDAAwD;QACrE,QAAQ,EAAE,IAAI;KACf;CACF,CAAC;AAEF,MAAM,UAAU,KAAK,CAAC,IAAwC;IAC5D,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC;IAC3C,MAAM,IAAI,GAAG;QACX,sCAAsC,EAAE,6BAA6B;QACrE,EAAE;QACF,+CAA+C,EAAE,mDAAmD;QACpG,8JAA8J;QAC9J,8FAA8F;QAC9F,0DAA0D;QAC1D,+JAA+J;QAC/J,kIAAkI;QAClI,0OAA0O;QAC1O,EAAE;QACF,uEAAuE;KACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACL,WAAW,EAAE,kCAAkC,EAAE,EAAE;QACnD,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE;aACzC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const name = "update_guidance";
|
|
2
|
+
export declare const description = "Review the work done for an issue and intelligently maintain the okffs-owned 'Project Guidance (okffs usage)' section of CLAUDE.md to reflect new or changed functionality.";
|
|
3
|
+
export declare const argumentDefs: {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
required: boolean;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function build(args: Record<string, string | undefined>): {
|
|
9
|
+
description: string;
|
|
10
|
+
messages: {
|
|
11
|
+
role: "user";
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=update_guidance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update_guidance.d.ts","sourceRoot":"","sources":["../../src/prompts/update_guidance.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,oBAAoB,CAAC;AAEtC,eAAO,MAAM,WAAW,gLACuJ,CAAC;AAEhL,eAAO,MAAM,YAAY;;;;GAMxB,CAAC;AAKF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;;;;;;;;;EAmC7D"}
|