@paysdoc/devplatform 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/dist/git/bootstrapIdentity.d.ts +50 -0
- package/dist/git/bootstrapIdentity.d.ts.map +1 -0
- package/dist/git/bootstrapIdentity.js +72 -0
- package/dist/git/bootstrapIdentity.js.map +1 -0
- package/dist/git/branchOps.d.ts +27 -0
- package/dist/git/branchOps.d.ts.map +1 -0
- package/dist/git/branchOps.js +91 -0
- package/dist/git/branchOps.js.map +1 -0
- package/dist/git/claimOps.d.ts +40 -0
- package/dist/git/claimOps.d.ts.map +1 -0
- package/dist/git/claimOps.js +44 -0
- package/dist/git/claimOps.js.map +1 -0
- package/dist/git/commitOps.d.ts +35 -0
- package/dist/git/commitOps.d.ts.map +1 -0
- package/dist/git/commitOps.js +131 -0
- package/dist/git/commitOps.js.map +1 -0
- package/dist/git/consoleLogger.d.ts +8 -0
- package/dist/git/consoleLogger.d.ts.map +1 -0
- package/dist/git/consoleLogger.js +9 -0
- package/dist/git/consoleLogger.js.map +1 -0
- package/dist/git/gitContext.d.ts +150 -0
- package/dist/git/gitContext.d.ts.map +1 -0
- package/dist/git/gitContext.js +405 -0
- package/dist/git/gitContext.js.map +1 -0
- package/dist/git/gitReadOps.d.ts +33 -0
- package/dist/git/gitReadOps.d.ts.map +1 -0
- package/dist/git/gitReadOps.js +38 -0
- package/dist/git/gitReadOps.js.map +1 -0
- package/dist/git/index.d.ts +49 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +44 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/processCleanup.d.ts +7 -0
- package/dist/git/processCleanup.d.ts.map +1 -0
- package/dist/git/processCleanup.js +45 -0
- package/dist/git/processCleanup.js.map +1 -0
- package/dist/git/remoteOps.d.ts +25 -0
- package/dist/git/remoteOps.d.ts.map +1 -0
- package/dist/git/remoteOps.js +30 -0
- package/dist/git/remoteOps.js.map +1 -0
- package/dist/git/repoWorkspace.d.ts +72 -0
- package/dist/git/repoWorkspace.d.ts.map +1 -0
- package/dist/git/repoWorkspace.js +85 -0
- package/dist/git/repoWorkspace.js.map +1 -0
- package/dist/git/types.d.ts +182 -0
- package/dist/git/types.d.ts.map +1 -0
- package/dist/git/types.js +10 -0
- package/dist/git/types.js.map +1 -0
- package/dist/git/workingDirectoryGuard.d.ts +39 -0
- package/dist/git/workingDirectoryGuard.d.ts.map +1 -0
- package/dist/git/workingDirectoryGuard.js +53 -0
- package/dist/git/workingDirectoryGuard.js.map +1 -0
- package/dist/git/worktreeCreateOps.d.ts +45 -0
- package/dist/git/worktreeCreateOps.d.ts.map +1 -0
- package/dist/git/worktreeCreateOps.js +208 -0
- package/dist/git/worktreeCreateOps.js.map +1 -0
- package/dist/git/worktreeProbeOps.d.ts +17 -0
- package/dist/git/worktreeProbeOps.d.ts.map +1 -0
- package/dist/git/worktreeProbeOps.js +66 -0
- package/dist/git/worktreeProbeOps.js.map +1 -0
- package/dist/git/worktreeQueryOps.d.ts +45 -0
- package/dist/git/worktreeQueryOps.d.ts.map +1 -0
- package/dist/git/worktreeQueryOps.js +129 -0
- package/dist/git/worktreeQueryOps.js.map +1 -0
- package/dist/git/worktreeRemoveOps.d.ts +27 -0
- package/dist/git/worktreeRemoveOps.d.ts.map +1 -0
- package/dist/git/worktreeRemoveOps.js +132 -0
- package/dist/git/worktreeRemoveOps.js.map +1 -0
- package/dist/git/worktreeResetOps.d.ts +18 -0
- package/dist/git/worktreeResetOps.d.ts.map +1 -0
- package/dist/git/worktreeResetOps.js +68 -0
- package/dist/git/worktreeResetOps.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/forgeProviders.d.ts +72 -0
- package/dist/providers/forgeProviders.d.ts.map +1 -0
- package/dist/providers/forgeProviders.js +112 -0
- package/dist/providers/forgeProviders.js.map +1 -0
- package/dist/providers/github/appAuth.d.ts +70 -0
- package/dist/providers/github/appAuth.d.ts.map +1 -0
- package/dist/providers/github/appAuth.js +243 -0
- package/dist/providers/github/appAuth.js.map +1 -0
- package/dist/providers/github/cloneUrl.d.ts +12 -0
- package/dist/providers/github/cloneUrl.d.ts.map +1 -0
- package/dist/providers/github/cloneUrl.js +20 -0
- package/dist/providers/github/cloneUrl.js.map +1 -0
- package/dist/providers/github/commands/boardCommands.d.ts +22 -0
- package/dist/providers/github/commands/boardCommands.d.ts.map +1 -0
- package/dist/providers/github/commands/boardCommands.js +66 -0
- package/dist/providers/github/commands/boardCommands.js.map +1 -0
- package/dist/providers/github/commands/issueCommands.d.ts +21 -0
- package/dist/providers/github/commands/issueCommands.d.ts.map +1 -0
- package/dist/providers/github/commands/issueCommands.js +50 -0
- package/dist/providers/github/commands/issueCommands.js.map +1 -0
- package/dist/providers/github/commands/labelCommands.d.ts +3 -0
- package/dist/providers/github/commands/labelCommands.d.ts.map +1 -0
- package/dist/providers/github/commands/labelCommands.js +8 -0
- package/dist/providers/github/commands/labelCommands.js.map +1 -0
- package/dist/providers/github/commands/prCommands.d.ts +14 -0
- package/dist/providers/github/commands/prCommands.d.ts.map +1 -0
- package/dist/providers/github/commands/prCommands.js +46 -0
- package/dist/providers/github/commands/prCommands.js.map +1 -0
- package/dist/providers/github/commands/secretCommands.d.ts +2 -0
- package/dist/providers/github/commands/secretCommands.d.ts.map +1 -0
- package/dist/providers/github/commands/secretCommands.js +5 -0
- package/dist/providers/github/commands/secretCommands.js.map +1 -0
- package/dist/providers/github/contextBinding.d.ts +11 -0
- package/dist/providers/github/contextBinding.d.ts.map +1 -0
- package/dist/providers/github/contextBinding.js +15 -0
- package/dist/providers/github/contextBinding.js.map +1 -0
- package/dist/providers/github/domain/issue.d.ts +94 -0
- package/dist/providers/github/domain/issue.d.ts.map +1 -0
- package/dist/providers/github/domain/issue.js +7 -0
- package/dist/providers/github/domain/issue.js.map +1 -0
- package/dist/providers/github/domain/pullRequest.d.ts +55 -0
- package/dist/providers/github/domain/pullRequest.d.ts.map +1 -0
- package/dist/providers/github/domain/pullRequest.js +9 -0
- package/dist/providers/github/domain/pullRequest.js.map +1 -0
- package/dist/providers/github/ghAuthToken.d.ts +28 -0
- package/dist/providers/github/ghAuthToken.d.ts.map +1 -0
- package/dist/providers/github/ghAuthToken.js +39 -0
- package/dist/providers/github/ghAuthToken.js.map +1 -0
- package/dist/providers/github/ghCommandRunner.d.ts +20 -0
- package/dist/providers/github/ghCommandRunner.d.ts.map +1 -0
- package/dist/providers/github/ghCommandRunner.js +21 -0
- package/dist/providers/github/ghCommandRunner.js.map +1 -0
- package/dist/providers/github/ghIssueApi.d.ts +29 -0
- package/dist/providers/github/ghIssueApi.d.ts.map +1 -0
- package/dist/providers/github/ghIssueApi.js +37 -0
- package/dist/providers/github/ghIssueApi.js.map +1 -0
- package/dist/providers/github/ghIssueParsers.d.ts +28 -0
- package/dist/providers/github/ghIssueParsers.d.ts.map +1 -0
- package/dist/providers/github/ghIssueParsers.js +105 -0
- package/dist/providers/github/ghIssueParsers.js.map +1 -0
- package/dist/providers/github/ghPrApi.d.ts +27 -0
- package/dist/providers/github/ghPrApi.d.ts.map +1 -0
- package/dist/providers/github/ghPrApi.js +32 -0
- package/dist/providers/github/ghPrApi.js.map +1 -0
- package/dist/providers/github/ghPrParsers.d.ts +57 -0
- package/dist/providers/github/ghPrParsers.d.ts.map +1 -0
- package/dist/providers/github/ghPrParsers.js +135 -0
- package/dist/providers/github/ghPrParsers.js.map +1 -0
- package/dist/providers/github/ghRepoApi.d.ts +33 -0
- package/dist/providers/github/ghRepoApi.d.ts.map +1 -0
- package/dist/providers/github/ghRepoApi.js +89 -0
- package/dist/providers/github/ghRepoApi.js.map +1 -0
- package/dist/providers/github/githubBoardManager.d.ts +39 -0
- package/dist/providers/github/githubBoardManager.d.ts.map +1 -0
- package/dist/providers/github/githubBoardManager.js +166 -0
- package/dist/providers/github/githubBoardManager.js.map +1 -0
- package/dist/providers/github/githubCodeHost.d.ts +73 -0
- package/dist/providers/github/githubCodeHost.d.ts.map +1 -0
- package/dist/providers/github/githubCodeHost.js +217 -0
- package/dist/providers/github/githubCodeHost.js.map +1 -0
- package/dist/providers/github/githubIdentity.d.ts +51 -0
- package/dist/providers/github/githubIdentity.d.ts.map +1 -0
- package/dist/providers/github/githubIdentity.js +110 -0
- package/dist/providers/github/githubIdentity.js.map +1 -0
- package/dist/providers/github/githubIssueTracker.d.ts +69 -0
- package/dist/providers/github/githubIssueTracker.d.ts.map +1 -0
- package/dist/providers/github/githubIssueTracker.js +209 -0
- package/dist/providers/github/githubIssueTracker.js.map +1 -0
- package/dist/providers/github/githubTokenProvider.d.ts +41 -0
- package/dist/providers/github/githubTokenProvider.d.ts.map +1 -0
- package/dist/providers/github/githubTokenProvider.js +51 -0
- package/dist/providers/github/githubTokenProvider.js.map +1 -0
- package/dist/providers/github/index.d.ts +10 -0
- package/dist/providers/github/index.d.ts.map +1 -0
- package/dist/providers/github/index.js +5 -0
- package/dist/providers/github/index.js.map +1 -0
- package/dist/providers/github/mappers.d.ts +40 -0
- package/dist/providers/github/mappers.d.ts.map +1 -0
- package/dist/providers/github/mappers.js +103 -0
- package/dist/providers/github/mappers.js.map +1 -0
- package/dist/providers/github/tokenResolver.d.ts +37 -0
- package/dist/providers/github/tokenResolver.d.ts.map +1 -0
- package/dist/providers/github/tokenResolver.js +43 -0
- package/dist/providers/github/tokenResolver.js.map +1 -0
- package/dist/providers/gitlab/gitlabApiClient.d.ts +45 -0
- package/dist/providers/gitlab/gitlabApiClient.d.ts.map +1 -0
- package/dist/providers/gitlab/gitlabApiClient.js +95 -0
- package/dist/providers/gitlab/gitlabApiClient.js.map +1 -0
- package/dist/providers/gitlab/gitlabBoardManager.d.ts +11 -0
- package/dist/providers/gitlab/gitlabBoardManager.d.ts.map +1 -0
- package/dist/providers/gitlab/gitlabBoardManager.js +27 -0
- package/dist/providers/gitlab/gitlabBoardManager.js.map +1 -0
- package/dist/providers/gitlab/gitlabCodeHost.d.ts +49 -0
- package/dist/providers/gitlab/gitlabCodeHost.d.ts.map +1 -0
- package/dist/providers/gitlab/gitlabCodeHost.js +109 -0
- package/dist/providers/gitlab/gitlabCodeHost.js.map +1 -0
- package/dist/providers/gitlab/gitlabTypes.d.ts +46 -0
- package/dist/providers/gitlab/gitlabTypes.d.ts.map +1 -0
- package/dist/providers/gitlab/gitlabTypes.js +6 -0
- package/dist/providers/gitlab/gitlabTypes.js.map +1 -0
- package/dist/providers/gitlab/index.d.ts +5 -0
- package/dist/providers/gitlab/index.d.ts.map +1 -0
- package/dist/providers/gitlab/index.js +4 -0
- package/dist/providers/gitlab/index.js.map +1 -0
- package/dist/providers/gitlab/mappers.d.ts +26 -0
- package/dist/providers/gitlab/mappers.d.ts.map +1 -0
- package/dist/providers/gitlab/mappers.js +63 -0
- package/dist/providers/gitlab/mappers.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +7 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/jira/adfConverter.d.ts +32 -0
- package/dist/providers/jira/adfConverter.d.ts.map +1 -0
- package/dist/providers/jira/adfConverter.js +144 -0
- package/dist/providers/jira/adfConverter.js.map +1 -0
- package/dist/providers/jira/index.d.ts +8 -0
- package/dist/providers/jira/index.d.ts.map +1 -0
- package/dist/providers/jira/index.js +5 -0
- package/dist/providers/jira/index.js.map +1 -0
- package/dist/providers/jira/jiraApiClient.d.ts +42 -0
- package/dist/providers/jira/jiraApiClient.d.ts.map +1 -0
- package/dist/providers/jira/jiraApiClient.js +84 -0
- package/dist/providers/jira/jiraApiClient.js.map +1 -0
- package/dist/providers/jira/jiraBoardManager.d.ts +11 -0
- package/dist/providers/jira/jiraBoardManager.d.ts.map +1 -0
- package/dist/providers/jira/jiraBoardManager.js +27 -0
- package/dist/providers/jira/jiraBoardManager.js.map +1 -0
- package/dist/providers/jira/jiraIssueTracker.d.ts +53 -0
- package/dist/providers/jira/jiraIssueTracker.d.ts.map +1 -0
- package/dist/providers/jira/jiraIssueTracker.js +231 -0
- package/dist/providers/jira/jiraIssueTracker.js.map +1 -0
- package/dist/providers/jira/jiraTypes.d.ts +61 -0
- package/dist/providers/jira/jiraTypes.d.ts.map +1 -0
- package/dist/providers/jira/jiraTypes.js +6 -0
- package/dist/providers/jira/jiraTypes.js.map +1 -0
- package/dist/providers/types.d.ts +271 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +52 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/workspaceValidation.d.ts +18 -0
- package/dist/providers/workspaceValidation.d.ts.map +1 -0
- package/dist/providers/workspaceValidation.js +37 -0
- package/dist/providers/workspaceValidation.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure parsers for the `gh pr …` / `gh api` JSON the code host receives from
|
|
3
|
+
* `GhPrApi` — the canonical home of parsing that `adws/github/prApi.ts` still
|
|
4
|
+
* carries a copy of until #821 deletes it. The error policy (swallow / wrap /
|
|
5
|
+
* rethrow) lives in the port methods, not here — every function below is
|
|
6
|
+
* pure and throws on malformed JSON; there is no logging and no I/O.
|
|
7
|
+
*/
|
|
8
|
+
import type { PRDetails, PRReviewComment, PRListItem, RawPR } from './domain/pullRequest.js';
|
|
9
|
+
/** Extends `RawPR` with `updatedAt` for PR-selection logic. */
|
|
10
|
+
export interface RawPRListEntry extends RawPR {
|
|
11
|
+
readonly updatedAt: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Issue number embedded in an ADW branch name (`{prefix}/issue-{number}-{slug}`).
|
|
15
|
+
* Copied from `adws/triggers/webhookHandlers.ts`'s `extractIssueNumberFromBranch`
|
|
16
|
+
* because the adapter cannot import `adws/triggers`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function issueNumberFromBranch(branchName: string | null | undefined): number | null;
|
|
19
|
+
/** Parses `gh pr view --json number,title,body,state,headRefName,baseRefName,url`. */
|
|
20
|
+
export declare function parsePRDetails(json: string): PRDetails;
|
|
21
|
+
/** Parses `gh api .../pulls/:number/reviews` (REST) — filters PENDING and substitutes a placeholder for an empty-bodied review. */
|
|
22
|
+
export declare function parsePRReviews(json: string): PRReviewComment[];
|
|
23
|
+
/** Parses `gh api .../pulls/:number/comments` (REST, line-level comments). */
|
|
24
|
+
export declare function parsePRLineComments(json: string): PRReviewComment[];
|
|
25
|
+
/** Parses `gh pr list --json number,headRefName,updatedAt`. */
|
|
26
|
+
export declare function parsePRListItems(json: string): PRListItem[];
|
|
27
|
+
/**
|
|
28
|
+
* Picks the PR ADW should act on for a branch. Prefers the most-recently
|
|
29
|
+
* updated OPEN PR (fixes #508: a stale closed/merged PR must never win over
|
|
30
|
+
* a live open one). Falls back to the most-recently-updated PR overall when
|
|
31
|
+
* none are open.
|
|
32
|
+
*/
|
|
33
|
+
export declare function selectPreferredPR(prs: readonly RawPRListEntry[]): RawPRListEntry | null;
|
|
34
|
+
/** The GraphQL-shaped (`gh pr view --json reviewDecision,reviews`) review entry: `author`/`submittedAt`, not the REST `user`/`submitted_at`. */
|
|
35
|
+
interface PRReview {
|
|
36
|
+
readonly author: {
|
|
37
|
+
readonly login: string;
|
|
38
|
+
} | null;
|
|
39
|
+
readonly state: string;
|
|
40
|
+
readonly submittedAt: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Per-reviewer-latest approval aggregation fallback, used when `reviewDecision`
|
|
44
|
+
* is null or empty (no branch protection / no required reviewers). Takes only
|
|
45
|
+
* APPROVED/CHANGES_REQUESTED reviews, picks the latest per reviewer, and
|
|
46
|
+
* returns true iff every reviewer's latest substantive review is APPROVED
|
|
47
|
+
* and there is at least one such reviewer.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isApprovedFromReviewsList(reviews: readonly PRReview[]): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Parses `gh pr view --json reviewDecision,reviews`. `reviewDecision ===
|
|
52
|
+
* 'APPROVED'` wins outright; any other non-empty value is a refusal;
|
|
53
|
+
* null/undefined/"" falls back to {@link isApprovedFromReviewsList}.
|
|
54
|
+
*/
|
|
55
|
+
export declare function parsePRApprovalState(json: string): boolean;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=ghPrParsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghPrParsers.d.ts","sourceRoot":"","sources":["../../../src/providers/github/ghPrParsers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AA2C7F,+DAA+D;AAC/D,MAAM,WAAW,cAAe,SAAQ,KAAK;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAI1F;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAiBtD;AAED,mIAAmI;AACnI,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAkB9D;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAgBnE;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAO3D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,GAAG,IAAI,CAOvF;AAED,gJAAgJ;AAChJ,UAAU,QAAQ;IAChB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAkB/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ1D"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure parsers for the `gh pr …` / `gh api` JSON the code host receives from
|
|
3
|
+
* `GhPrApi` — the canonical home of parsing that `adws/github/prApi.ts` still
|
|
4
|
+
* carries a copy of until #821 deletes it. The error policy (swallow / wrap /
|
|
5
|
+
* rethrow) lives in the port methods, not here — every function below is
|
|
6
|
+
* pure and throws on malformed JSON; there is no logging and no I/O.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Issue number embedded in an ADW branch name (`{prefix}/issue-{number}-{slug}`).
|
|
10
|
+
* Copied from `adws/triggers/webhookHandlers.ts`'s `extractIssueNumberFromBranch`
|
|
11
|
+
* because the adapter cannot import `adws/triggers`.
|
|
12
|
+
*/
|
|
13
|
+
export function issueNumberFromBranch(branchName) {
|
|
14
|
+
if (!branchName)
|
|
15
|
+
return null;
|
|
16
|
+
const match = branchName.match(/issue-(\d+)/);
|
|
17
|
+
return match ? parseInt(match[1], 10) : null;
|
|
18
|
+
}
|
|
19
|
+
/** Parses `gh pr view --json number,title,body,state,headRefName,baseRefName,url`. */
|
|
20
|
+
export function parsePRDetails(json) {
|
|
21
|
+
const raw = JSON.parse(json);
|
|
22
|
+
const issueMatch = raw.body?.match(/Implements #(\d+)/);
|
|
23
|
+
const issueNumber = issueMatch ? parseInt(issueMatch[1], 10) : issueNumberFromBranch(raw.headRefName);
|
|
24
|
+
return {
|
|
25
|
+
number: raw.number,
|
|
26
|
+
title: raw.title,
|
|
27
|
+
body: raw.body || '',
|
|
28
|
+
state: raw.state,
|
|
29
|
+
headBranch: raw.headRefName,
|
|
30
|
+
baseBranch: raw.baseRefName,
|
|
31
|
+
url: raw.url,
|
|
32
|
+
issueNumber,
|
|
33
|
+
reviewComments: [],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Parses `gh api .../pulls/:number/reviews` (REST) — filters PENDING and substitutes a placeholder for an empty-bodied review. */
|
|
37
|
+
export function parsePRReviews(json) {
|
|
38
|
+
const raw = JSON.parse(json);
|
|
39
|
+
return raw
|
|
40
|
+
.filter((r) => r.state !== 'PENDING' && ((r.body && r.body.trim() !== '') || r.state === 'CHANGES_REQUESTED'))
|
|
41
|
+
.map((r) => ({
|
|
42
|
+
id: r.id,
|
|
43
|
+
author: {
|
|
44
|
+
login: r.user?.login || 'unknown',
|
|
45
|
+
name: null,
|
|
46
|
+
isBot: r.user?.type === 'Bot',
|
|
47
|
+
},
|
|
48
|
+
body: (r.body && r.body.trim() !== '') ? r.body : `[Review submitted: ${r.state}]`,
|
|
49
|
+
path: '',
|
|
50
|
+
line: null,
|
|
51
|
+
createdAt: r.submitted_at,
|
|
52
|
+
updatedAt: r.submitted_at,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
/** Parses `gh api .../pulls/:number/comments` (REST, line-level comments). */
|
|
56
|
+
export function parsePRLineComments(json) {
|
|
57
|
+
const raw = JSON.parse(json);
|
|
58
|
+
return raw.map((c) => ({
|
|
59
|
+
id: c.id,
|
|
60
|
+
author: {
|
|
61
|
+
login: c.user?.login || 'unknown',
|
|
62
|
+
name: null,
|
|
63
|
+
isBot: c.user?.type === 'Bot',
|
|
64
|
+
},
|
|
65
|
+
body: c.body,
|
|
66
|
+
path: c.path || '',
|
|
67
|
+
line: c.line || c.original_line || null,
|
|
68
|
+
createdAt: c.created_at,
|
|
69
|
+
updatedAt: c.updated_at,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
/** Parses `gh pr list --json number,headRefName,updatedAt`. */
|
|
73
|
+
export function parsePRListItems(json) {
|
|
74
|
+
const raw = JSON.parse(json);
|
|
75
|
+
return raw.map((pr) => ({
|
|
76
|
+
number: pr.number,
|
|
77
|
+
headBranch: pr.headRefName,
|
|
78
|
+
updatedAt: pr.updatedAt,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Picks the PR ADW should act on for a branch. Prefers the most-recently
|
|
83
|
+
* updated OPEN PR (fixes #508: a stale closed/merged PR must never win over
|
|
84
|
+
* a live open one). Falls back to the most-recently-updated PR overall when
|
|
85
|
+
* none are open.
|
|
86
|
+
*/
|
|
87
|
+
export function selectPreferredPR(prs) {
|
|
88
|
+
if (prs.length === 0)
|
|
89
|
+
return null;
|
|
90
|
+
const open = prs.filter((p) => p.state === 'OPEN');
|
|
91
|
+
const pool = open.length > 0 ? open : prs;
|
|
92
|
+
return [...pool].sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())[0];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Per-reviewer-latest approval aggregation fallback, used when `reviewDecision`
|
|
96
|
+
* is null or empty (no branch protection / no required reviewers). Takes only
|
|
97
|
+
* APPROVED/CHANGES_REQUESTED reviews, picks the latest per reviewer, and
|
|
98
|
+
* returns true iff every reviewer's latest substantive review is APPROVED
|
|
99
|
+
* and there is at least one such reviewer.
|
|
100
|
+
*/
|
|
101
|
+
export function isApprovedFromReviewsList(reviews) {
|
|
102
|
+
const substantive = reviews.filter((r) => r.state === 'APPROVED' || r.state === 'CHANGES_REQUESTED');
|
|
103
|
+
if (substantive.length === 0)
|
|
104
|
+
return false;
|
|
105
|
+
const latestByAuthor = new Map();
|
|
106
|
+
for (const review of substantive) {
|
|
107
|
+
if (!review.author)
|
|
108
|
+
continue;
|
|
109
|
+
const login = review.author.login;
|
|
110
|
+
const existing = latestByAuthor.get(login);
|
|
111
|
+
if (!existing || review.submittedAt > existing.submittedAt) {
|
|
112
|
+
latestByAuthor.set(login, review);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const review of latestByAuthor.values()) {
|
|
116
|
+
if (review.state !== 'APPROVED')
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
return latestByAuthor.size > 0;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Parses `gh pr view --json reviewDecision,reviews`. `reviewDecision ===
|
|
123
|
+
* 'APPROVED'` wins outright; any other non-empty value is a refusal;
|
|
124
|
+
* null/undefined/"" falls back to {@link isApprovedFromReviewsList}.
|
|
125
|
+
*/
|
|
126
|
+
export function parsePRApprovalState(json) {
|
|
127
|
+
const result = JSON.parse(json);
|
|
128
|
+
const { reviewDecision, reviews } = result;
|
|
129
|
+
if (reviewDecision === 'APPROVED')
|
|
130
|
+
return true;
|
|
131
|
+
if (reviewDecision)
|
|
132
|
+
return false;
|
|
133
|
+
return isApprovedFromReviewsList(reviews || []);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=ghPrParsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghPrParsers.js","sourceRoot":"","sources":["../../../src/providers/github/ghPrParsers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ghRepoApi.ts — the relocation target of GitContext's former semantic
|
|
3
|
+
* surface (#797). Composes the issue and PR leaf factories with the
|
|
4
|
+
* repo/label/secret/board remainder into one `GhRepoApi` view over a
|
|
5
|
+
* `GitContext` the caller already holds. Deep-import only: never added to
|
|
6
|
+
* `./index.ts`, exactly like `ghIssueApi`/`ghPrApi` and `createGhCommandRunner`
|
|
7
|
+
* — a bound view over an existing context selects no identity, so it is not a
|
|
8
|
+
* construction site the guard's `unsanctioned-construction` rule needs to see.
|
|
9
|
+
*/
|
|
10
|
+
import type { GitContext } from '../../git/index.js';
|
|
11
|
+
import { type GhIssueApi } from './ghIssueApi.js';
|
|
12
|
+
import { type GhPrApi } from './ghPrApi.js';
|
|
13
|
+
/** Repo-scoped operations (labels, secrets, board moves) not owned by the issue or PR leaf APIs. */
|
|
14
|
+
export interface GhRepoOps {
|
|
15
|
+
defaultBranch(): string;
|
|
16
|
+
authenticatedUser(): string;
|
|
17
|
+
createLabel(name: string, color: string, description: string): void;
|
|
18
|
+
applyLabel(issueNumber: number, labelName: string): void;
|
|
19
|
+
setSecret(name: string, value: string): void;
|
|
20
|
+
runGraphQL(query: string, variables?: Record<string, string | number>): string;
|
|
21
|
+
/** stdin-JSON form for GraphQL mutations with complex/array variables the flag form cannot express. */
|
|
22
|
+
runGraphQLInput(body: Record<string, unknown>): string;
|
|
23
|
+
/**
|
|
24
|
+
* Moves a GitHub issue to a target status on its Projects V2 board.
|
|
25
|
+
* Returns true if the move succeeded; false if no project, no item, or no status match.
|
|
26
|
+
*/
|
|
27
|
+
moveIssueToStatus(issueNumber: number, targetStatus: string): boolean;
|
|
28
|
+
}
|
|
29
|
+
/** The full composed GitHub-repo API: issue ops, PR ops, and repo-scoped ops over one bound `GitContext`. */
|
|
30
|
+
export type GhRepoApi = GhIssueApi & GhPrApi & GhRepoOps;
|
|
31
|
+
/** Composes the full 35-operation `GhRepoApi` over `ctx` — a bound view, selecting no identity. */
|
|
32
|
+
export declare function createGhRepoApi(ctx: GitContext): GhRepoApi;
|
|
33
|
+
//# sourceMappingURL=ghRepoApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghRepoApi.d.ts","sourceRoot":"","sources":["../../../src/providers/github/ghRepoApi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAW,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAQrD,oGAAoG;AACpG,MAAM,WAAW,SAAS;IACxB,aAAa,IAAI,MAAM,CAAC;IACxB,iBAAiB,IAAI,MAAM,CAAC;IAC5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/E,uGAAuG;IACvG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IACvD;;;OAGG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CACvE;AAED,6GAA6G;AAC7G,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AA4EzD,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAO1D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ghRepoApi.ts — the relocation target of GitContext's former semantic
|
|
3
|
+
* surface (#797). Composes the issue and PR leaf factories with the
|
|
4
|
+
* repo/label/secret/board remainder into one `GhRepoApi` view over a
|
|
5
|
+
* `GitContext` the caller already holds. Deep-import only: never added to
|
|
6
|
+
* `./index.ts`, exactly like `ghIssueApi`/`ghPrApi` and `createGhCommandRunner`
|
|
7
|
+
* — a bound view over an existing context selects no identity, so it is not a
|
|
8
|
+
* construction site the guard's `unsanctioned-construction` rule needs to see.
|
|
9
|
+
*/
|
|
10
|
+
import { createGhCommandRunner } from './ghCommandRunner.js';
|
|
11
|
+
import { ghIssueApi } from './ghIssueApi.js';
|
|
12
|
+
import { ghPrApi } from './ghPrApi.js';
|
|
13
|
+
import { createLabelCmd, applyLabelCmd } from './commands/labelCommands.js';
|
|
14
|
+
import { setSecretCmd } from './commands/secretCommands.js';
|
|
15
|
+
import { graphQLCmd, graphQLInputCmd, projectQueryCmd, itemQueryCmd, fieldQueryCmd, moveStatusCmd, parseProjectId, parseIssueItem, parseStatusField, } from './commands/boardCommands.js';
|
|
16
|
+
/**
|
|
17
|
+
* Moves an issue to `targetStatus` on the repo's Projects V2 board.
|
|
18
|
+
* Walks project lookup -> item lookup -> status-field lookup -> the move
|
|
19
|
+
* itself, short-circuiting to `false` on any lookup failure or missing data,
|
|
20
|
+
* and to `true` early if the item is already at `targetStatus`.
|
|
21
|
+
*/
|
|
22
|
+
function moveIssueToStatus(run, owner, repo, issueNumber, targetStatus) {
|
|
23
|
+
let projectId;
|
|
24
|
+
try {
|
|
25
|
+
projectId = parseProjectId(run(projectQueryCmd(owner, repo), { purpose: 'alternateIdentity' }));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (!projectId)
|
|
31
|
+
return false;
|
|
32
|
+
let item;
|
|
33
|
+
try {
|
|
34
|
+
item = parseIssueItem(run(itemQueryCmd(owner, repo, issueNumber), { purpose: 'alternateIdentity' }), projectId);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (!item)
|
|
40
|
+
return false;
|
|
41
|
+
if (item.currentStatus?.toLowerCase() === targetStatus.toLowerCase())
|
|
42
|
+
return true;
|
|
43
|
+
let field;
|
|
44
|
+
try {
|
|
45
|
+
field = parseStatusField(run(fieldQueryCmd(projectId), { purpose: 'alternateIdentity' }), targetStatus, item.currentStatus);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
if (!field)
|
|
51
|
+
return false;
|
|
52
|
+
if (field === 'already_at_status')
|
|
53
|
+
return true;
|
|
54
|
+
try {
|
|
55
|
+
run(moveStatusCmd(projectId, item.itemId, field.fieldId, field.optionId), { purpose: 'alternateIdentity' });
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
function ghRepoOps(run, owner, repo) {
|
|
63
|
+
return {
|
|
64
|
+
defaultBranch: () => run(`gh repo view ${owner}/${repo} --json defaultBranchRef --jq .defaultBranchRef.name`),
|
|
65
|
+
authenticatedUser: () => run('gh api user'),
|
|
66
|
+
createLabel: (name, color, description) => {
|
|
67
|
+
run(createLabelCmd(owner, repo, name, color, description));
|
|
68
|
+
},
|
|
69
|
+
applyLabel: (issueNumber, labelName) => {
|
|
70
|
+
run(applyLabelCmd(owner, repo, issueNumber, labelName));
|
|
71
|
+
},
|
|
72
|
+
setSecret: (name, value) => {
|
|
73
|
+
run(setSecretCmd(owner, repo, name), { input: value });
|
|
74
|
+
},
|
|
75
|
+
runGraphQL: (query, variables) => run(graphQLCmd(query, variables), { purpose: 'alternateIdentity' }),
|
|
76
|
+
runGraphQLInput: (body) => run(graphQLInputCmd(), { input: JSON.stringify(body), purpose: 'alternateIdentity' }),
|
|
77
|
+
moveIssueToStatus: (issueNumber, targetStatus) => moveIssueToStatus(run, owner, repo, issueNumber, targetStatus),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** Composes the full 35-operation `GhRepoApi` over `ctx` — a bound view, selecting no identity. */
|
|
81
|
+
export function createGhRepoApi(ctx) {
|
|
82
|
+
const { run } = createGhCommandRunner(ctx);
|
|
83
|
+
return {
|
|
84
|
+
...ghIssueApi(run, ctx.owner, ctx.repo),
|
|
85
|
+
...ghPrApi(run, ctx.owner, ctx.repo),
|
|
86
|
+
...ghRepoOps(run, ctx.owner, ctx.repo),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=ghRepoApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ghRepoApi.js","sourceRoot":"","sources":["../../../src/providers/github/ghRepoApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub implementation of the BoardManager provider interface.
|
|
3
|
+
* Ensures a GitHub Projects V2 board exists for the repository and
|
|
4
|
+
* that all required ADW columns are present.
|
|
5
|
+
*
|
|
6
|
+
* Binds `createGhCommandRunner(ctx)` once at construction, over a
|
|
7
|
+
* `GitContext` the caller already holds, and logs through the injected
|
|
8
|
+
* `Logger` port instead of `adws/core`'s `log`.
|
|
9
|
+
*/
|
|
10
|
+
import { type GitContext, type Logger } from '../../git/index.js';
|
|
11
|
+
import type { BoardManager, BoardColumnDefinition, RepoIdentifier } from '../types.js';
|
|
12
|
+
type StatusOption = {
|
|
13
|
+
id?: string;
|
|
14
|
+
name: string;
|
|
15
|
+
color: string;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Merges existing board options with the required ADW columns.
|
|
20
|
+
* Preserves existing option IDs. Inserts missing ADW columns at
|
|
21
|
+
* positions derived from BOARD_COLUMNS.order using an anchor rule.
|
|
22
|
+
*/
|
|
23
|
+
export declare function mergeStatusOptions(existing: Array<{
|
|
24
|
+
id?: string;
|
|
25
|
+
name: string;
|
|
26
|
+
color: string;
|
|
27
|
+
description: string;
|
|
28
|
+
}>, adwColumns: readonly BoardColumnDefinition[]): {
|
|
29
|
+
merged: StatusOption[];
|
|
30
|
+
changed: boolean;
|
|
31
|
+
added: string[];
|
|
32
|
+
};
|
|
33
|
+
export interface GitHubBoardManagerDeps {
|
|
34
|
+
readonly logger?: Logger;
|
|
35
|
+
}
|
|
36
|
+
/** Factory function to create a GitHub BoardManager provider, bound to the given `GitContext` and repository. */
|
|
37
|
+
export declare function createGitHubBoardManager(ctx: GitContext, repoId: RepoIdentifier, deps?: GitHubBoardManagerDeps): BoardManager;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=githubBoardManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubBoardManager.d.ts","sourceRoot":"","sources":["../../../src/providers/github/githubBoardManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMvF,KAAK,YAAY,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,EAClF,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAC3C;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CA8C/D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAoID,iHAAiH;AACjH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAE,sBAA2B,GAAG,YAAY,CAEjI"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub implementation of the BoardManager provider interface.
|
|
3
|
+
* Ensures a GitHub Projects V2 board exists for the repository and
|
|
4
|
+
* that all required ADW columns are present.
|
|
5
|
+
*
|
|
6
|
+
* Binds `createGhCommandRunner(ctx)` once at construction, over a
|
|
7
|
+
* `GitContext` the caller already holds, and logs through the injected
|
|
8
|
+
* `Logger` port instead of `adws/core`'s `log`.
|
|
9
|
+
*/
|
|
10
|
+
import { consoleLogger } from '../../git/index.js';
|
|
11
|
+
import { BOARD_COLUMNS, validateRepoIdentifier } from '../types.js';
|
|
12
|
+
import { assertContextBoundTo } from './contextBinding.js';
|
|
13
|
+
import { createGhCommandRunner } from './ghCommandRunner.js';
|
|
14
|
+
import { graphQLCmd, graphQLInputCmd } from './commands/boardCommands.js';
|
|
15
|
+
/**
|
|
16
|
+
* Merges existing board options with the required ADW columns.
|
|
17
|
+
* Preserves existing option IDs. Inserts missing ADW columns at
|
|
18
|
+
* positions derived from BOARD_COLUMNS.order using an anchor rule.
|
|
19
|
+
*/
|
|
20
|
+
export function mergeStatusOptions(existing, adwColumns) {
|
|
21
|
+
const adwByName = new Map(adwColumns.map((col) => [col.status.toLowerCase(), col]));
|
|
22
|
+
const merged = existing.map((opt) => {
|
|
23
|
+
const adwCol = adwByName.get(opt.name.toLowerCase());
|
|
24
|
+
if (!adwCol)
|
|
25
|
+
return { ...opt };
|
|
26
|
+
return { id: opt.id, name: adwCol.status, color: adwCol.color, description: adwCol.description };
|
|
27
|
+
});
|
|
28
|
+
const existingLower = new Set(existing.map((o) => o.name.toLowerCase()));
|
|
29
|
+
const missingCols = adwColumns.filter((col) => !existingLower.has(col.status.toLowerCase()));
|
|
30
|
+
let nextInsertIdx = 0;
|
|
31
|
+
for (const col of missingCols) {
|
|
32
|
+
const adwInMerged = [];
|
|
33
|
+
for (let i = 0; i < merged.length; i++) {
|
|
34
|
+
const def = adwByName.get(merged[i].name.toLowerCase());
|
|
35
|
+
if (def)
|
|
36
|
+
adwInMerged.push({ order: def.order, index: i });
|
|
37
|
+
}
|
|
38
|
+
let insertAt;
|
|
39
|
+
if (adwInMerged.length === 0) {
|
|
40
|
+
insertAt = nextInsertIdx;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const anchor = adwInMerged
|
|
44
|
+
.filter((a) => a.order <= col.order)
|
|
45
|
+
.reduce((best, a) => (best === null || a.order > best.order ? a : best), null);
|
|
46
|
+
insertAt = anchor !== null ? anchor.index + 1 : adwInMerged[0].index;
|
|
47
|
+
}
|
|
48
|
+
merged.splice(insertAt, 0, { name: col.status, color: col.color, description: col.description });
|
|
49
|
+
nextInsertIdx = insertAt + 1;
|
|
50
|
+
}
|
|
51
|
+
const added = missingCols.map((c) => c.status);
|
|
52
|
+
const changed = added.length > 0 ||
|
|
53
|
+
existing.length !== merged.length ||
|
|
54
|
+
existing.some((opt, i) => {
|
|
55
|
+
const m = merged[i];
|
|
56
|
+
return m.name !== opt.name || m.color !== opt.color || m.description !== opt.description;
|
|
57
|
+
});
|
|
58
|
+
return { merged, changed, added };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* GitHub implementation of the BoardManager interface. Bound to a specific
|
|
62
|
+
* repository and `GitContext` at construction time.
|
|
63
|
+
*/
|
|
64
|
+
class GitHubBoardManager {
|
|
65
|
+
repoId;
|
|
66
|
+
gh;
|
|
67
|
+
logger;
|
|
68
|
+
constructor(ctx, repoId, deps = {}) {
|
|
69
|
+
this.repoId = repoId;
|
|
70
|
+
validateRepoIdentifier(repoId);
|
|
71
|
+
assertContextBoundTo(ctx, repoId, 'createGitHubBoardManager');
|
|
72
|
+
this.gh = createGhCommandRunner(ctx);
|
|
73
|
+
this.logger = deps.logger ?? consoleLogger;
|
|
74
|
+
}
|
|
75
|
+
/** Finds the first GitHub Projects V2 board linked to the repository. */
|
|
76
|
+
async findBoard() {
|
|
77
|
+
const { owner, repo } = this.repoId;
|
|
78
|
+
try {
|
|
79
|
+
const query = `query($owner:String!,$repo:String!){repository(owner:$owner,name:$repo){projectsV2(first:1){nodes{id}}}}`;
|
|
80
|
+
const result = this.gh.run(graphQLCmd(query, { owner, repo }), { purpose: 'alternateIdentity' });
|
|
81
|
+
const parsed = JSON.parse(result);
|
|
82
|
+
const nodes = parsed.data.repository.projectsV2.nodes;
|
|
83
|
+
return nodes.length > 0 ? nodes[0].id : null;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.logger(`Failed to find project for ${owner}/${repo}: ${error}`, 'warn');
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Creates a new GitHub Projects V2 board and links it to the repository. */
|
|
91
|
+
async createBoard(name) {
|
|
92
|
+
const { owner, repo } = this.repoId;
|
|
93
|
+
// Look up the owner node ID
|
|
94
|
+
const ownerIdQuery = `query($owner:String!,$repo:String!){repository(owner:$owner,name:$repo){owner{id}}}`;
|
|
95
|
+
const ownerIdResult = this.gh.run(graphQLCmd(ownerIdQuery, { owner, repo }), { purpose: 'alternateIdentity' });
|
|
96
|
+
const ownerIdParsed = JSON.parse(ownerIdResult);
|
|
97
|
+
const ownerId = ownerIdParsed.data.repository.owner.id;
|
|
98
|
+
// Create the project
|
|
99
|
+
const createMutation = `mutation($ownerId:ID!,$title:String!){createProjectV2(input:{ownerId:$ownerId,title:$title}){projectV2{id}}}`;
|
|
100
|
+
const createResult = this.gh.run(graphQLCmd(createMutation, { ownerId, title: name }), { purpose: 'alternateIdentity' });
|
|
101
|
+
const createParsed = JSON.parse(createResult);
|
|
102
|
+
const projectId = createParsed.data.createProjectV2.projectV2.id;
|
|
103
|
+
// Link the project to the repository
|
|
104
|
+
const repoNodeQuery = `query($owner:String!,$repo:String!){repository(owner:$owner,name:$repo){id}}`;
|
|
105
|
+
const repoNodeResult = this.gh.run(graphQLCmd(repoNodeQuery, { owner, repo }), { purpose: 'alternateIdentity' });
|
|
106
|
+
const repoNodeParsed = JSON.parse(repoNodeResult);
|
|
107
|
+
const repositoryId = repoNodeParsed.data.repository.id;
|
|
108
|
+
const linkMutation = `mutation($projectId:ID!,$repositoryId:ID!){linkProjectV2ToRepository(input:{projectId:$projectId,repositoryId:$repositoryId}){repository{id}}}`;
|
|
109
|
+
this.gh.run(graphQLCmd(linkMutation, { projectId, repositoryId }), { purpose: 'alternateIdentity' });
|
|
110
|
+
this.logger(`Created project board "${name}" (id: ${projectId})`, 'success');
|
|
111
|
+
return projectId;
|
|
112
|
+
}
|
|
113
|
+
updateStatusFieldOptions(fieldId, options) {
|
|
114
|
+
const mutation = `
|
|
115
|
+
mutation($fieldId: ID!, $singleSelectOptions: [ProjectV2SingleSelectFieldOptionInput!]!) {
|
|
116
|
+
updateProjectV2Field(input: {
|
|
117
|
+
fieldId: $fieldId
|
|
118
|
+
singleSelectOptions: $singleSelectOptions
|
|
119
|
+
}) {
|
|
120
|
+
projectV2Field {
|
|
121
|
+
... on ProjectV2SingleSelectField { id }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`;
|
|
126
|
+
const singleSelectOptions = options.map((o) => o.id !== undefined
|
|
127
|
+
? { id: o.id, name: o.name, color: o.color, description: o.description }
|
|
128
|
+
: { name: o.name, color: o.color, description: o.description });
|
|
129
|
+
const body = { query: mutation, variables: { fieldId, singleSelectOptions } };
|
|
130
|
+
this.gh.run(graphQLInputCmd(), { input: JSON.stringify(body), purpose: 'alternateIdentity' });
|
|
131
|
+
}
|
|
132
|
+
/** Ensures all required ADW columns exist on the board. */
|
|
133
|
+
async ensureColumns(boardId) {
|
|
134
|
+
const statusField = this.getStatusFieldOptions(boardId);
|
|
135
|
+
if (!statusField) {
|
|
136
|
+
this.logger('No Status field found on project board', 'warn');
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
const { merged, changed, added } = mergeStatusOptions(statusField.options, BOARD_COLUMNS);
|
|
140
|
+
if (!changed)
|
|
141
|
+
return true;
|
|
142
|
+
this.updateStatusFieldOptions(statusField.fieldId, merged);
|
|
143
|
+
added.forEach((name) => this.logger(`Added board column "${name}"`, 'info'));
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
getStatusFieldOptions(projectId) {
|
|
147
|
+
try {
|
|
148
|
+
const query = `query($projectId:ID!){node(id:$projectId){...on ProjectV2{field(name:"Status"){...on ProjectV2SingleSelectField{id options{id name color description}}}}}}`;
|
|
149
|
+
const result = this.gh.run(graphQLCmd(query, { projectId }), { purpose: 'alternateIdentity' });
|
|
150
|
+
const parsed = JSON.parse(result);
|
|
151
|
+
const field = parsed.data.node.field;
|
|
152
|
+
if (!field || !field.id)
|
|
153
|
+
return null;
|
|
154
|
+
return { fieldId: field.id, options: field.options };
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
this.logger(`Failed to get status field options: ${error}`, 'warn');
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Factory function to create a GitHub BoardManager provider, bound to the given `GitContext` and repository. */
|
|
163
|
+
export function createGitHubBoardManager(ctx, repoId, deps = {}) {
|
|
164
|
+
return new GitHubBoardManager(ctx, repoId, deps);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=githubBoardManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubBoardManager.js","sourceRoot":"","sources":["../../../src/providers/github/githubBoardManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAgC,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI1E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAkF,EAClF,UAA4C;IAE5C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAmB,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE7F,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,WAAW,GAA4C,EAAE,CAAC;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACxD,IAAI,GAAG;gBAAE,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,aAAa,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,WAAW;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;iBACnC,MAAM,CACL,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAC/D,IAAI,CACL,CAAC;YACJ,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvE,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACjG,aAAa,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,OAAO,GACX,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QACjC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,CAAC;QAC3F,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAMD;;;GAGG;AACH,MAAM,kBAAkB;IAIwB;IAH7B,EAAE,CAAkB;IACpB,MAAM,CAAS;IAEhC,YAAY,GAAe,EAAmB,MAAsB,EAAE,OAA+B,EAAE;QAAzD,WAAM,GAAN,MAAM,CAAgB;QAClE,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC/B,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAC9D,IAAI,CAAC,EAAE,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAC7C,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,SAAS;QACb,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,0GAA0G,CAAC;YACzH,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACjG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAE/B,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;YACtD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,8BAA8B,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAEpC,4BAA4B;QAC5B,MAAM,YAAY,GAAG,qFAAqF,CAAC;QAC3G,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/G,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAE7C,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAEvD,qBAAqB;QACrB,MAAM,cAAc,GAAG,8GAA8G,CAAC;QACtI,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACzH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAE3C,CAAC;QACF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAEjE,qCAAqC;QACrC,MAAM,aAAa,GAAG,8EAA8E,CAAC;QACrG,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACjH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAE/C,CAAC;QACF,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAEvD,MAAM,YAAY,GAAG,gJAAgJ,CAAC;QACtK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAErG,IAAI,CAAC,MAAM,CAAC,0BAA0B,IAAI,UAAU,SAAS,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7E,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,wBAAwB,CAAC,OAAe,EAAE,OAAuB;QACvE,MAAM,QAAQ,GAAG;;;;;;;;;;;KAWhB,CAAC;QACF,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC,CAAC,EAAE,KAAK,SAAS;YAChB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;YACxE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CACjE,CAAC;QACF,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;QAC9E,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAE1F,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAE7E,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CAC3B,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,4JAA4J,CAAC;YAC3K,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC/F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAM/B,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACrC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,uCAAuC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,iHAAiH;AACjH,MAAM,UAAU,wBAAwB,CAAC,GAAe,EAAE,MAAsB,EAAE,OAA+B,EAAE;IACjH,OAAO,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub implementation of the CodeHost interface.
|
|
3
|
+
*
|
|
4
|
+
* Binds `createGhRepoApi(ctx)` once at construction, over a `GitContext` the
|
|
5
|
+
* caller already holds. Every method reproduces the command, parse, error
|
|
6
|
+
* policy and log line of its absorbed legacy free function
|
|
7
|
+
* (`adws/github/prApi.ts`) exactly, logging through the injected `Logger`
|
|
8
|
+
* port instead of `adws/core`'s `log`.
|
|
9
|
+
*/
|
|
10
|
+
import { type GitContext, type Logger } from '../../git/index.js';
|
|
11
|
+
import { type CodeHost, type CreatePROptions, type ForgeActionResult, type MergedPullRequestRecord, type PullRequest, type PullRequestRecord, type PullRequestResult, type PullRequestSummary, type RepoIdentifier, type ReviewComment } from '../types.js';
|
|
12
|
+
export interface GitHubCodeHostDeps {
|
|
13
|
+
readonly logger?: Logger;
|
|
14
|
+
/** Consulted by `canApprovePullRequests()`; default answers `false`. ADW wires it to its GitHub-App + PAT configuration in `repoContext.ts`. */
|
|
15
|
+
readonly canApprovePullRequests?: () => boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* GitHub-specific implementation of the CodeHost interface. Bound to a
|
|
19
|
+
* specific repository and `GitContext` at construction time.
|
|
20
|
+
*/
|
|
21
|
+
export declare class GitHubCodeHost implements CodeHost {
|
|
22
|
+
private readonly repoId;
|
|
23
|
+
private readonly gh;
|
|
24
|
+
private readonly logger;
|
|
25
|
+
private readonly canApprove?;
|
|
26
|
+
/** Memoised authenticated-user login: `undefined` = not yet asked, `null` = failed. */
|
|
27
|
+
private authenticatedUserMemo;
|
|
28
|
+
constructor(ctx: GitContext, repoId: RepoIdentifier, deps?: GitHubCodeHostDeps);
|
|
29
|
+
/** Returns the bound RepoIdentifier. */
|
|
30
|
+
getRepoIdentifier(): RepoIdentifier;
|
|
31
|
+
getDefaultBranch(): string;
|
|
32
|
+
/** Fetches PR details and maps to PullRequest. */
|
|
33
|
+
fetchPullRequest(prNumber: number): PullRequest;
|
|
34
|
+
/** Posts a comment on the specified PR. */
|
|
35
|
+
commentOnPullRequest(prNumber: number, body: string): void;
|
|
36
|
+
private fetchLineComments;
|
|
37
|
+
private fetchReviewBodies;
|
|
38
|
+
/** Fetches review comments (line-level + review-body) and maps to ReviewComment[]. */
|
|
39
|
+
fetchReviewComments(prNumber: number): ReviewComment[];
|
|
40
|
+
/** Lists open PRs and maps to PullRequest[]. */
|
|
41
|
+
listOpenPullRequests(): PullRequest[];
|
|
42
|
+
/**
|
|
43
|
+
* Creates a pull request via `gh pr create` with the provided title and body.
|
|
44
|
+
* Reuses an existing open PR on the branch, if one is found, rather than
|
|
45
|
+
* opening a second. Returns the PR URL and number.
|
|
46
|
+
*/
|
|
47
|
+
createPullRequest(options: CreatePROptions): PullRequestResult;
|
|
48
|
+
/** Finds the PR for a branch (open, or most-recently-updated when none are open); null if none. */
|
|
49
|
+
findPullRequestByBranch(branchName: string): PullRequestSummary | null;
|
|
50
|
+
/** True when the PR has at least one qualifying approval. */
|
|
51
|
+
isPullRequestApproved(prNumber: number): boolean;
|
|
52
|
+
/** Approves a PR under the bound identity. */
|
|
53
|
+
approvePullRequest(prNumber: number): ForgeActionResult;
|
|
54
|
+
/** Merges a PR. */
|
|
55
|
+
mergePullRequest(prNumber: number): ForgeActionResult;
|
|
56
|
+
/** Sets a repo secret (e.g. GitHub Actions). */
|
|
57
|
+
setSecret(name: string, value: string): void;
|
|
58
|
+
/** Merged PRs, newest first, at most `limit`. Throws on failure. */
|
|
59
|
+
listMergedPullRequests(limit: number): readonly MergedPullRequestRecord[];
|
|
60
|
+
/** Every PR of the repository (open, closed and merged). Throws on failure — callers own the swallow policy. */
|
|
61
|
+
listPullRequests(): readonly PullRequestRecord[];
|
|
62
|
+
/** Login the code host's commands run as; memoised per instance, one warning on failure. */
|
|
63
|
+
getAuthenticatedUser(): string | null;
|
|
64
|
+
/** True when the injected capability seam says this identity can approve PRs; `false` by default. */
|
|
65
|
+
canApprovePullRequests(): boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Factory function that creates a GitHubCodeHost bound to the given
|
|
69
|
+
* `GitContext` and repository. Validates the RepoIdentifier and refuses a
|
|
70
|
+
* context bound to a different owner/repo before construction.
|
|
71
|
+
*/
|
|
72
|
+
export declare function createGitHubCodeHost(ctx: GitContext, repoId: RepoIdentifier, deps?: GitHubCodeHostDeps): CodeHost;
|
|
73
|
+
//# sourceMappingURL=githubCodeHost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubCodeHost.d.ts","sourceRoot":"","sources":["../../../src/providers/github/githubCodeHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAkBjF,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,gJAAgJ;IAChJ,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC;CACjD;AAOD;;;GAGG;AACH,qBAAa,cAAe,YAAW,QAAQ;IAOhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANpD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgB;IAC5C,uFAAuF;IACvF,OAAO,CAAC,qBAAqB,CAA4B;gBAE7C,GAAG,EAAE,UAAU,EAAmB,MAAM,EAAE,cAAc,EAAE,IAAI,GAAE,kBAAuB;IAOnG,wCAAwC;IACxC,iBAAiB,IAAI,cAAc;IAInC,gBAAgB,IAAI,MAAM;IAI1B,kDAAkD;IAClD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAQ/C,2CAA2C;IAC3C,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAS1D,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,iBAAiB;IASzB,sFAAsF;IACtF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAetD,gDAAgD;IAChD,oBAAoB,IAAI,WAAW,EAAE;IASrC;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,iBAAiB;IAyB9D,mGAAmG;IACnG,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAStE,6DAA6D;IAC7D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAShD,8CAA8C;IAC9C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB;IAYvD,mBAAmB;IACnB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB;IAYrD,gDAAgD;IAChD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5C,oEAAoE;IACpE,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,uBAAuB,EAAE;IAIzE,gHAAgH;IAChH,gBAAgB,IAAI,SAAS,iBAAiB,EAAE;IAIhD,4FAA4F;IAC5F,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAYrC,qGAAqG;IACrG,sBAAsB,IAAI,OAAO;CAGlC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,GAAE,kBAAuB,GAAG,QAAQ,CAGrH"}
|