ghagga 3.0.0 → 3.2.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/dist/commands/login.test.js +0 -2
- package/dist/commands/login.test.js.map +1 -1
- package/dist/commands/memory/backfill.d.ts +13 -0
- package/dist/commands/memory/backfill.d.ts.map +1 -0
- package/dist/commands/memory/backfill.js +47 -0
- package/dist/commands/memory/backfill.js.map +1 -0
- package/dist/commands/memory/backfill.test.d.ts +11 -0
- package/dist/commands/memory/backfill.test.d.ts.map +1 -0
- package/dist/commands/memory/backfill.test.js +127 -0
- package/dist/commands/memory/backfill.test.js.map +1 -0
- package/dist/commands/memory/clear.test.js +9 -0
- package/dist/commands/memory/clear.test.js.map +1 -1
- package/dist/commands/memory/delete.test.js +9 -0
- package/dist/commands/memory/delete.test.js.map +1 -1
- package/dist/commands/memory/index.d.ts +3 -3
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +5 -3
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/list.test.js +9 -0
- package/dist/commands/memory/list.test.js.map +1 -1
- package/dist/commands/memory/search.test.js +9 -0
- package/dist/commands/memory/search.test.js.map +1 -1
- package/dist/commands/memory/show.test.js +9 -0
- package/dist/commands/memory/show.test.js.map +1 -1
- package/dist/commands/memory/stats.test.js +9 -0
- package/dist/commands/memory/stats.test.js.map +1 -1
- package/dist/commands/memory/utils.d.ts.map +1 -1
- package/dist/commands/memory/utils.js +14 -1
- package/dist/commands/memory/utils.js.map +1 -1
- package/dist/commands/review-output.test.js +37 -0
- package/dist/commands/review-output.test.js.map +1 -1
- package/dist/commands/review.d.ts +12 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +239 -5
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/review.mr-exit.test.d.ts +13 -0
- package/dist/commands/review.mr-exit.test.d.ts.map +1 -0
- package/dist/commands/review.mr-exit.test.js +190 -0
- package/dist/commands/review.mr-exit.test.js.map +1 -0
- package/dist/commands/review.postback-disclosure.test.d.ts +22 -0
- package/dist/commands/review.postback-disclosure.test.d.ts.map +1 -0
- package/dist/commands/review.postback-disclosure.test.js +192 -0
- package/dist/commands/review.postback-disclosure.test.js.map +1 -0
- package/dist/commands/review.pr-exit.test.d.ts +13 -0
- package/dist/commands/review.pr-exit.test.d.ts.map +1 -0
- package/dist/commands/review.pr-exit.test.js +162 -0
- package/dist/commands/review.pr-exit.test.js.map +1 -0
- package/dist/commands/review.pr-jenkins.test.d.ts +16 -0
- package/dist/commands/review.pr-jenkins.test.d.ts.map +1 -0
- package/dist/commands/review.pr-jenkins.test.js +106 -0
- package/dist/commands/review.pr-jenkins.test.js.map +1 -0
- package/dist/commands/review.pr-nativeid-fallback.test.d.ts +15 -0
- package/dist/commands/review.pr-nativeid-fallback.test.d.ts.map +1 -0
- package/dist/commands/review.pr-nativeid-fallback.test.js +151 -0
- package/dist/commands/review.pr-nativeid-fallback.test.js.map +1 -0
- package/dist/commands/review.test.js +13 -0
- package/dist/commands/review.test.js.map +1 -1
- package/dist/index.js +39 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cli-github-client-port.d.ts +52 -0
- package/dist/lib/cli-github-client-port.d.ts.map +1 -0
- package/dist/lib/cli-github-client-port.js +199 -0
- package/dist/lib/cli-github-client-port.js.map +1 -0
- package/dist/lib/cli-github-client-port.test.d.ts +10 -0
- package/dist/lib/cli-github-client-port.test.d.ts.map +1 -0
- package/dist/lib/cli-github-client-port.test.js +47 -0
- package/dist/lib/cli-github-client-port.test.js.map +1 -0
- package/dist/lib/cli-gitlab-client-port.d.ts +62 -0
- package/dist/lib/cli-gitlab-client-port.d.ts.map +1 -0
- package/dist/lib/cli-gitlab-client-port.js +209 -0
- package/dist/lib/cli-gitlab-client-port.js.map +1 -0
- package/dist/lib/cli-gitlab-client-port.test.d.ts +9 -0
- package/dist/lib/cli-gitlab-client-port.test.d.ts.map +1 -0
- package/dist/lib/cli-gitlab-client-port.test.js +292 -0
- package/dist/lib/cli-gitlab-client-port.test.js.map +1 -0
- package/dist/lib/config.d.ts +23 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +9 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/embedding.d.ts +23 -0
- package/dist/lib/embedding.d.ts.map +1 -0
- package/dist/lib/embedding.js +39 -0
- package/dist/lib/embedding.js.map +1 -0
- package/dist/lib/embedding.test.d.ts +8 -0
- package/dist/lib/embedding.test.d.ts.map +1 -0
- package/dist/lib/embedding.test.js +101 -0
- package/dist/lib/embedding.test.js.map +1 -0
- package/dist/lib/forge-postback.d.ts +72 -0
- package/dist/lib/forge-postback.d.ts.map +1 -0
- package/dist/lib/forge-postback.js +39 -0
- package/dist/lib/forge-postback.js.map +1 -0
- package/dist/lib/gitlab-api.d.ts +50 -0
- package/dist/lib/gitlab-api.d.ts.map +1 -0
- package/dist/lib/gitlab-api.js +75 -0
- package/dist/lib/gitlab-api.js.map +1 -0
- package/dist/lib/gitlab-api.test.d.ts +2 -0
- package/dist/lib/gitlab-api.test.d.ts.map +1 -0
- package/dist/lib/gitlab-api.test.js +79 -0
- package/dist/lib/gitlab-api.test.js.map +1 -0
- package/dist/lib/gitlab-e2e.manual.test.d.ts +57 -0
- package/dist/lib/gitlab-e2e.manual.test.d.ts.map +1 -0
- package/dist/lib/gitlab-e2e.manual.test.js +135 -0
- package/dist/lib/gitlab-e2e.manual.test.js.map +1 -0
- package/dist/lib/gitlab-token.d.ts +17 -0
- package/dist/lib/gitlab-token.d.ts.map +1 -0
- package/dist/lib/gitlab-token.js +24 -0
- package/dist/lib/gitlab-token.js.map +1 -0
- package/dist/lib/gitlab-token.test.d.ts +2 -0
- package/dist/lib/gitlab-token.test.d.ts.map +1 -0
- package/dist/lib/gitlab-token.test.js +38 -0
- package/dist/lib/gitlab-token.test.js.map +1 -0
- package/dist/lib/oauth.test.js +0 -1
- package/dist/lib/oauth.test.js.map +1 -1
- package/dist/lib/pr-postback.d.ts +42 -0
- package/dist/lib/pr-postback.d.ts.map +1 -0
- package/dist/lib/pr-postback.js +44 -0
- package/dist/lib/pr-postback.js.map +1 -0
- package/dist/lib/pr-postback.test.d.ts +9 -0
- package/dist/lib/pr-postback.test.d.ts.map +1 -0
- package/dist/lib/pr-postback.test.js +212 -0
- package/dist/lib/pr-postback.test.js.map +1 -0
- package/dist/lib/pr-token.d.ts +15 -0
- package/dist/lib/pr-token.d.ts.map +1 -0
- package/dist/lib/pr-token.js +22 -0
- package/dist/lib/pr-token.js.map +1 -0
- package/dist/lib/pr-token.test.d.ts +2 -0
- package/dist/lib/pr-token.test.d.ts.map +1 -0
- package/dist/lib/pr-token.test.js +25 -0
- package/dist/lib/pr-token.test.js.map +1 -0
- package/package.json +9 -8
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { resolveMrToken } from './gitlab-token.js';
|
|
3
|
+
describe('resolveMrToken (env GITLAB_TOKEN > GL_TOKEN > GitLab-specific stored)', () => {
|
|
4
|
+
it('prefers GITLAB_TOKEN over GL_TOKEN and stored', () => {
|
|
5
|
+
const token = resolveMrToken({ GITLAB_TOKEN: 'gl-primary', GL_TOKEN: 'gl-secondary' }, () => 'gl-stored');
|
|
6
|
+
expect(token).toBe('gl-primary');
|
|
7
|
+
});
|
|
8
|
+
it('falls back to GL_TOKEN when GITLAB_TOKEN is unset', () => {
|
|
9
|
+
const token = resolveMrToken({ GL_TOKEN: 'gl-secondary' }, () => 'gl-stored');
|
|
10
|
+
expect(token).toBe('gl-secondary');
|
|
11
|
+
});
|
|
12
|
+
it('falls back to the GitLab-specific stored token when no env token is set', () => {
|
|
13
|
+
const token = resolveMrToken({}, () => 'gl-stored');
|
|
14
|
+
expect(token).toBe('gl-stored');
|
|
15
|
+
});
|
|
16
|
+
it('returns null when no GitLab token resolves anywhere', () => {
|
|
17
|
+
const token = resolveMrToken({}, () => null);
|
|
18
|
+
expect(token).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it('treats blank/whitespace env tokens as unset and falls through', () => {
|
|
21
|
+
const token = resolveMrToken({ GITLAB_TOKEN: ' ', GL_TOKEN: '' }, () => 'gl-stored');
|
|
22
|
+
expect(token).toBe('gl-stored');
|
|
23
|
+
});
|
|
24
|
+
it('does NOT fall back to the GitHub stored token (FIX B)', async () => {
|
|
25
|
+
// The default stored-token fn must be the GitLab-specific one, NOT getStoredToken
|
|
26
|
+
// (GitHub). With no env tokens AND no GitLab stored token, resolution is null —
|
|
27
|
+
// even if a GitHub token is present in config, it must never be used here.
|
|
28
|
+
const config = await import('./config.js');
|
|
29
|
+
const ghSpy = vi.spyOn(config, 'getStoredToken').mockReturnValue('github-login-token');
|
|
30
|
+
// Inject the real GitLab getter explicitly to prove it does not read GitHub.
|
|
31
|
+
const token = resolveMrToken({}, () => null);
|
|
32
|
+
expect(token).toBeNull();
|
|
33
|
+
// The GitHub getter must not have been consulted by this resolution path.
|
|
34
|
+
expect(ghSpy).not.toHaveBeenCalled();
|
|
35
|
+
ghSpy.mockRestore();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=gitlab-token.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-token.test.js","sourceRoot":"","sources":["../../src/lib/gitlab-token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,QAAQ,CAAC,uEAAuE,EAAE,GAAG,EAAE;IACrF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAuB,EAC7E,GAAG,EAAE,CAAC,WAAW,CAClB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,QAAQ,EAAE,cAAc,EAAuB,EACjD,GAAG,EAAE,CAAC,WAAW,CAClB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAuB,EAC1D,GAAG,EAAE,CAAC,WAAW,CAClB,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,kFAAkF;QAClF,gFAAgF;QAChF,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;QAEvF,6EAA6E;QAC7E,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzB,0EAA0E;QAC1E,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/lib/oauth.test.js
CHANGED
|
@@ -53,7 +53,6 @@ describe('requestDeviceCode', () => {
|
|
|
53
53
|
}),
|
|
54
54
|
}));
|
|
55
55
|
// Verify client_id is in the body
|
|
56
|
-
// biome-ignore lint/style/noNonNullAssertion: test assertion on known mock data
|
|
57
56
|
const callArgs = mockFetch.mock.calls[0];
|
|
58
57
|
const body = JSON.parse(callArgs[1].body);
|
|
59
58
|
expect(body.client_id).toBe(GITHUB_CLIENT_ID);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../src/lib/oauth.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AAEnE,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAElC,mEAAmE;AAEnE,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC/C,OAAO;QACL,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QACjC,MAAM;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAC3B,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,IAAI,GAAG,OAAO;IACnD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;KACX,CAAC;AAC3B,CAAC;AAED,mEAAmE;AAEnE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,SAAS,CAAC,qBAAqB,CAC7B,YAAY,CAAC;YACX,WAAW,EAAE,QAAQ;YACrB,SAAS,EAAE,WAAW;YACtB,gBAAgB,EAAE,iCAAiC;YACnD,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEzC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sCAAsC,EACtC,MAAM,CAAC,gBAAgB,CAAC;YACtB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC,CAAC;SACH,CAAC,CACH,CAAC;QAEF,kCAAkC;QAClC,
|
|
1
|
+
{"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../src/lib/oauth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge-NEUTRAL summary post-back for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* This is the single plumbing point the `ghagga review --pr N` (GitHub) path
|
|
5
|
+
* routes through — and the SAME function P4 will reuse for `--mr N` (GitLab).
|
|
6
|
+
* It is deliberately written against the forge-agnostic surface ONLY:
|
|
7
|
+
* - a `ForgeAdapterBase` (whatever forge built it — GitHub today, GitLab next),
|
|
8
|
+
* - a canonical `ChangeRequestRef`,
|
|
9
|
+
* - a pre-rendered comment `body` (caller renders via ghagga-core for parity),
|
|
10
|
+
* - a `CommentMarker`.
|
|
11
|
+
*
|
|
12
|
+
* It contains NO GitHub specifics: no owner/repo strings, no REST paths, no
|
|
13
|
+
* github-native ids, and no github-native boxing helper. All of that is
|
|
14
|
+
* encapsulated inside the adapter + its client port. To add GitLab in P4, the
|
|
15
|
+
* command-level glue builds a GitLab adapter + a `gitlab`-kind ref and calls
|
|
16
|
+
* THIS function UNCHANGED.
|
|
17
|
+
*
|
|
18
|
+
* Idempotency (find stale → delete all → post fresh) lives inside
|
|
19
|
+
* `adapter.upsertSummaryComment`; this wrapper just relays the adapter's RAW
|
|
20
|
+
* forge-native result. Boxing into a canonical `CommentId` (if ever needed) is
|
|
21
|
+
* the kind-specific HANDLER's concern, not this neutral seam's — the only
|
|
22
|
+
* consumer today logs the raw id, so we do not box at all.
|
|
23
|
+
*/
|
|
24
|
+
import type { ChangeRequestRef, CommentMarker, ForgeAdapterBase } from 'ghagga-forge';
|
|
25
|
+
export interface PostBackResult {
|
|
26
|
+
/** The forge-native id of the summary comment that now exists. */
|
|
27
|
+
createdNativeId: number;
|
|
28
|
+
/** Forge-native ids of stale summary comments removed during the upsert. */
|
|
29
|
+
deletedNativeIds: number[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Upsert the single GHAGGA summary comment on a change request via any forge
|
|
33
|
+
* adapter. Forge-neutral — usable for GitHub PRs (P3) and GitLab MRs (P4)
|
|
34
|
+
* UNCHANGED (zero GitHub coupling).
|
|
35
|
+
*
|
|
36
|
+
* @param adapter the forge adapter (built by the command glue per forge).
|
|
37
|
+
* @param ref the canonical change-request ref (PR/MR).
|
|
38
|
+
* @param body the rendered comment body (parity with the server post-back).
|
|
39
|
+
* @param marker the comment marker identifying GHAGGA-owned comments.
|
|
40
|
+
*/
|
|
41
|
+
export declare function postSummaryComment(adapter: ForgeAdapterBase, ref: ChangeRequestRef, body: string, marker: CommentMarker): Promise<PostBackResult>;
|
|
42
|
+
//# sourceMappingURL=pr-postback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-postback.d.ts","sourceRoot":"","sources":["../../src/lib/pr-postback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,cAAc,CAAC,CASzB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forge-NEUTRAL summary post-back for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* This is the single plumbing point the `ghagga review --pr N` (GitHub) path
|
|
5
|
+
* routes through — and the SAME function P4 will reuse for `--mr N` (GitLab).
|
|
6
|
+
* It is deliberately written against the forge-agnostic surface ONLY:
|
|
7
|
+
* - a `ForgeAdapterBase` (whatever forge built it — GitHub today, GitLab next),
|
|
8
|
+
* - a canonical `ChangeRequestRef`,
|
|
9
|
+
* - a pre-rendered comment `body` (caller renders via ghagga-core for parity),
|
|
10
|
+
* - a `CommentMarker`.
|
|
11
|
+
*
|
|
12
|
+
* It contains NO GitHub specifics: no owner/repo strings, no REST paths, no
|
|
13
|
+
* github-native ids, and no github-native boxing helper. All of that is
|
|
14
|
+
* encapsulated inside the adapter + its client port. To add GitLab in P4, the
|
|
15
|
+
* command-level glue builds a GitLab adapter + a `gitlab`-kind ref and calls
|
|
16
|
+
* THIS function UNCHANGED.
|
|
17
|
+
*
|
|
18
|
+
* Idempotency (find stale → delete all → post fresh) lives inside
|
|
19
|
+
* `adapter.upsertSummaryComment`; this wrapper just relays the adapter's RAW
|
|
20
|
+
* forge-native result. Boxing into a canonical `CommentId` (if ever needed) is
|
|
21
|
+
* the kind-specific HANDLER's concern, not this neutral seam's — the only
|
|
22
|
+
* consumer today logs the raw id, so we do not box at all.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Upsert the single GHAGGA summary comment on a change request via any forge
|
|
26
|
+
* adapter. Forge-neutral — usable for GitHub PRs (P3) and GitLab MRs (P4)
|
|
27
|
+
* UNCHANGED (zero GitHub coupling).
|
|
28
|
+
*
|
|
29
|
+
* @param adapter the forge adapter (built by the command glue per forge).
|
|
30
|
+
* @param ref the canonical change-request ref (PR/MR).
|
|
31
|
+
* @param body the rendered comment body (parity with the server post-back).
|
|
32
|
+
* @param marker the comment marker identifying GHAGGA-owned comments.
|
|
33
|
+
*/
|
|
34
|
+
export async function postSummaryComment(adapter, ref, body, marker) {
|
|
35
|
+
const result = await adapter.upsertSummaryComment(ref, body, marker);
|
|
36
|
+
// Relay the adapter's RAW forge-native result. No boxing here — this keeps
|
|
37
|
+
// the seam fully forge-agnostic so P4 reuses it unchanged. The kind-specific
|
|
38
|
+
// handler boxes/logs as it sees fit.
|
|
39
|
+
return {
|
|
40
|
+
createdNativeId: result.created,
|
|
41
|
+
deletedNativeIds: result.deleted,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=pr-postback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-postback.js","sourceRoot":"","sources":["../../src/lib/pr-postback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAyB,EACzB,GAAqB,EACrB,IAAY,EACZ,MAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,2EAA2E;IAC3E,6EAA6E;IAC7E,qCAAqC;IACrC,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,OAAO;QAC/B,gBAAgB,EAAE,MAAM,CAAC,OAAO;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R-CLI: the `--pr` post-back routes through the REAL GitHubForgeAdapter folding
|
|
3
|
+
* over the CLI's own GitHubClientPort. We mock ONLY `fetch` (the network seam),
|
|
4
|
+
* so this exercises the genuine adapter find→delete→post idempotency path and
|
|
5
|
+
* the genuine CLI port REST calls — a faithful simulation against a mocked
|
|
6
|
+
* GitHub.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=pr-postback.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-postback.test.d.ts","sourceRoot":"","sources":["../../src/lib/pr-postback.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R-CLI: the `--pr` post-back routes through the REAL GitHubForgeAdapter folding
|
|
3
|
+
* over the CLI's own GitHubClientPort. We mock ONLY `fetch` (the network seam),
|
|
4
|
+
* so this exercises the genuine adapter find→delete→post idempotency path and
|
|
5
|
+
* the genuine CLI port REST calls — a faithful simulation against a mocked
|
|
6
|
+
* GitHub.
|
|
7
|
+
*/
|
|
8
|
+
import { REVIEW_COMMENT_MARKER } from 'ghagga-core';
|
|
9
|
+
import { GitHubForgeAdapter } from 'ghagga-forge';
|
|
10
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
11
|
+
import { createCliGitHubClientPort } from './cli-github-client-port.js';
|
|
12
|
+
import { postSummaryComment } from './pr-postback.js';
|
|
13
|
+
const mockFetch = vi.fn();
|
|
14
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
15
|
+
function jsonResponse(status, body) {
|
|
16
|
+
return {
|
|
17
|
+
ok: status >= 200 && status < 300,
|
|
18
|
+
status,
|
|
19
|
+
statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'ERR',
|
|
20
|
+
text: () => Promise.resolve(JSON.stringify(body)),
|
|
21
|
+
json: () => Promise.resolve(body),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const MARKER = { html: REVIEW_COMMENT_MARKER };
|
|
25
|
+
const REF = {
|
|
26
|
+
repo: { kind: 'github', nativeId: 'acme/widgets', path: 'acme/widgets' },
|
|
27
|
+
iid: 42,
|
|
28
|
+
};
|
|
29
|
+
function buildAdapter(token = 'tok') {
|
|
30
|
+
return new GitHubForgeAdapter({
|
|
31
|
+
client: createCliGitHubClientPort(),
|
|
32
|
+
token,
|
|
33
|
+
owner: 'acme',
|
|
34
|
+
repo: 'widgets',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
describe('postSummaryComment via CLI port + GitHubForgeAdapter', () => {
|
|
38
|
+
beforeEach(() => mockFetch.mockReset());
|
|
39
|
+
it('posts a fresh comment when none exists (no stale to delete)', async () => {
|
|
40
|
+
// findExistingComment: empty list → null
|
|
41
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
42
|
+
// postComment → { id }
|
|
43
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 9001 }));
|
|
44
|
+
const adapter = buildAdapter();
|
|
45
|
+
const body = `${REVIEW_COMMENT_MARKER}\n## body`;
|
|
46
|
+
const result = await postSummaryComment(adapter, REF, body, MARKER);
|
|
47
|
+
expect(result.createdNativeId).toBe(9001);
|
|
48
|
+
expect(result.deletedNativeIds).toEqual([]);
|
|
49
|
+
// 1 list call + 1 post call.
|
|
50
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
51
|
+
const [listUrl] = mockFetch.mock.calls[0];
|
|
52
|
+
expect(listUrl).toContain('/repos/acme/widgets/issues/42/comments');
|
|
53
|
+
const [postUrl, postInit] = mockFetch.mock.calls[1];
|
|
54
|
+
expect(postUrl).toBe('https://api.github.com/repos/acme/widgets/issues/42/comments');
|
|
55
|
+
expect(postInit.method).toBe('POST');
|
|
56
|
+
expect(JSON.parse(postInit.body)).toEqual({ body });
|
|
57
|
+
});
|
|
58
|
+
it('finds stale → updates latest IN PLACE → prunes only stale duplicates (idempotent upsert + marker)', async () => {
|
|
59
|
+
// list returns two GHAGGA comments (with marker) + one foreign comment
|
|
60
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, [
|
|
61
|
+
{ id: 100, body: `old ${REVIEW_COMMENT_MARKER}` },
|
|
62
|
+
{ id: 200, body: 'someone else' },
|
|
63
|
+
{ id: 300, body: `newer ${REVIEW_COMMENT_MARKER}` },
|
|
64
|
+
]));
|
|
65
|
+
// FORGE-UPSERT-005: updateComment(latest=300) IN PLACE first...
|
|
66
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, { id: 300 }));
|
|
67
|
+
// ...then deleteComment(stale=100) only after the update confirms success.
|
|
68
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(204, {}));
|
|
69
|
+
const adapter = buildAdapter();
|
|
70
|
+
const result = await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
71
|
+
// "created" now carries the id of the comment currently holding the review
|
|
72
|
+
// body — the updated latest (300), NOT a freshly posted comment.
|
|
73
|
+
expect(result.createdNativeId).toBe(300);
|
|
74
|
+
// The latest (300) is updated, never deleted; only the stale duplicate (100) is pruned.
|
|
75
|
+
expect(result.deletedNativeIds).toEqual([100]);
|
|
76
|
+
// Update happens in place (PATCH) on the latest, before any delete.
|
|
77
|
+
const updateCall = mockFetch.mock.calls[1];
|
|
78
|
+
expect(updateCall[0]).toContain('/issues/comments/300');
|
|
79
|
+
expect(updateCall[1].method).toBe('PATCH');
|
|
80
|
+
expect(JSON.parse(updateCall[1].body)).toEqual({ body: 'body' });
|
|
81
|
+
const delCall = mockFetch.mock.calls[2];
|
|
82
|
+
expect(delCall[0]).toContain('/issues/comments/100');
|
|
83
|
+
expect(delCall[1].method).toBe('DELETE');
|
|
84
|
+
// The latest (300) is updated, never the target of a DELETE.
|
|
85
|
+
const deleteUrls = mockFetch.mock.calls
|
|
86
|
+
.filter((c) => c[1].method === 'DELETE')
|
|
87
|
+
.map((c) => c[0]);
|
|
88
|
+
expect(deleteUrls.some((u) => u.includes('/issues/comments/300'))).toBe(false);
|
|
89
|
+
// foreign comment (200) is never touched.
|
|
90
|
+
const allUrls = mockFetch.mock.calls.map((c) => c[0]).join('\n');
|
|
91
|
+
expect(allUrls).not.toContain('/issues/comments/200');
|
|
92
|
+
// No fresh POST on the replace path — the update carried the body.
|
|
93
|
+
const methods = mockFetch.mock.calls.map((c) => c[1].method);
|
|
94
|
+
expect(methods).not.toContain('POST');
|
|
95
|
+
});
|
|
96
|
+
it('a 401 with the static token is fatal (no invalidate-retry)', async () => {
|
|
97
|
+
// findExistingComment → 401
|
|
98
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(401, { message: 'bad creds' }));
|
|
99
|
+
const adapter = buildAdapter();
|
|
100
|
+
await expect(postSummaryComment(adapter, REF, 'body', MARKER)).rejects.toThrow();
|
|
101
|
+
// exactly one call — no retry loop.
|
|
102
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
103
|
+
});
|
|
104
|
+
it('passes an AbortSignal (timeout) on every fetch so CI cannot hang', async () => {
|
|
105
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
106
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 1 }));
|
|
107
|
+
const adapter = buildAdapter();
|
|
108
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
109
|
+
// Both the list (find) and the post fetch carry an abort signal.
|
|
110
|
+
for (const call of mockFetch.mock.calls) {
|
|
111
|
+
const init = call[1];
|
|
112
|
+
expect(init.signal).toBeInstanceOf(AbortSignal);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
it('sends Bearer auth + version headers on the post', async () => {
|
|
116
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
117
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 1 }));
|
|
118
|
+
const adapter = buildAdapter('secret-token');
|
|
119
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
120
|
+
const [, postInit] = mockFetch.mock.calls[1];
|
|
121
|
+
const headers = postInit.headers;
|
|
122
|
+
expect(headers.Authorization).toBe('Bearer secret-token');
|
|
123
|
+
expect(headers['X-GitHub-Api-Version']).toBe('2022-11-28');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('CLI GitHub port — findExistingComment pagination (backlog #6)', () => {
|
|
127
|
+
beforeEach(() => mockFetch.mockReset());
|
|
128
|
+
function makeComments(count, startId = 0, markerAt) {
|
|
129
|
+
return Array.from({ length: count }, (_, i) => ({
|
|
130
|
+
id: startId + i,
|
|
131
|
+
body: i === markerAt ? `summary ${startId + i} ${REVIEW_COMMENT_MARKER}` : `noise ${startId + i}`,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
it('single page (< 100 comments) → exactly one list call, no extra fetch', async () => {
|
|
135
|
+
const port = createCliGitHubClientPort();
|
|
136
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(20, 0)));
|
|
137
|
+
const result = await port.findExistingComment('acme', 'widgets', 42, 'tok');
|
|
138
|
+
expect(result).toBeNull();
|
|
139
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
140
|
+
expect(mockFetch.mock.calls[0][0]).toContain('page=1');
|
|
141
|
+
});
|
|
142
|
+
it('multi-page → full page 1 forces page 2 fetch; stale-on-page-2 found + updated in place (no duplicate)', async () => {
|
|
143
|
+
// page 1: 100 comments, NO marker → must fetch page 2; page 2 carries the sole marker.
|
|
144
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(100, 0)));
|
|
145
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(15, 100, 5))); // marker id 105
|
|
146
|
+
// FORGE-UPSERT-005: single GHAGGA comment → update it in place, nothing to prune.
|
|
147
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, { id: 105 })); // update 105
|
|
148
|
+
const adapter = buildAdapter();
|
|
149
|
+
const result = await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
150
|
+
// Sole comment (105) is updated in place: it carries the body, nothing is deleted.
|
|
151
|
+
expect(result.deletedNativeIds).toEqual([]);
|
|
152
|
+
expect(result.createdNativeId).toBe(105);
|
|
153
|
+
expect(mockFetch.mock.calls[0][0]).toContain('page=1');
|
|
154
|
+
expect(mockFetch.mock.calls[1][0]).toContain('page=2');
|
|
155
|
+
const updateCall = mockFetch.mock.calls[2];
|
|
156
|
+
expect(updateCall[0]).toContain('/issues/comments/105');
|
|
157
|
+
expect(updateCall[1].method).toBe('PATCH');
|
|
158
|
+
// No DELETE and no POST — the sole comment is updated, not replaced.
|
|
159
|
+
const methods = mockFetch.mock.calls.map((c) => c[1].method);
|
|
160
|
+
expect(methods).not.toContain('DELETE');
|
|
161
|
+
expect(methods).not.toContain('POST');
|
|
162
|
+
});
|
|
163
|
+
it('safety bound → stops at MAX_PAGES (50) and warns instead of looping forever', async () => {
|
|
164
|
+
for (let page = 0; page < 50; page++) {
|
|
165
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, makeComments(100, page * 100)));
|
|
166
|
+
}
|
|
167
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
168
|
+
const port = createCliGitHubClientPort();
|
|
169
|
+
const result = await port.findExistingComment('acme', 'widgets', 42, 'tok');
|
|
170
|
+
expect(result).toBeNull();
|
|
171
|
+
expect(mockFetch).toHaveBeenCalledTimes(50);
|
|
172
|
+
expect(mockFetch.mock.calls[49][0]).toContain('page=50');
|
|
173
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('MAX_PAGES (50)'));
|
|
174
|
+
warnSpy.mockRestore();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('CLI port stub safety (read members never hit in --pr flow)', () => {
|
|
178
|
+
it('the --pr post-back never invokes any stubbed read member', async () => {
|
|
179
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(200, []));
|
|
180
|
+
mockFetch.mockResolvedValueOnce(jsonResponse(201, { id: 5 }));
|
|
181
|
+
const port = createCliGitHubClientPort();
|
|
182
|
+
// Spy on the stubs — if the post-back path touched them they'd throw, but
|
|
183
|
+
// assert explicitly they were never called.
|
|
184
|
+
const fetchPRDiff = vi.spyOn(port, 'fetchPRDiff');
|
|
185
|
+
const getPRFileList = vi.spyOn(port, 'getPRFileList');
|
|
186
|
+
const getPRCommitMessages = vi.spyOn(port, 'getPRCommitMessages');
|
|
187
|
+
const fetchPRDetails = vi.spyOn(port, 'fetchPRDetails');
|
|
188
|
+
const addCommentReaction = vi.spyOn(port, 'addCommentReaction');
|
|
189
|
+
const fetchGraphFromBranch = vi.spyOn(port, 'fetchGraphFromBranch');
|
|
190
|
+
const fetchGraphMetadata = vi.spyOn(port, 'fetchGraphMetadata');
|
|
191
|
+
const adapter = new GitHubForgeAdapter({ client: port, token: 't', owner: 'a', repo: 'b' });
|
|
192
|
+
await postSummaryComment(adapter, REF, 'body', MARKER);
|
|
193
|
+
expect(fetchPRDiff).not.toHaveBeenCalled();
|
|
194
|
+
expect(getPRFileList).not.toHaveBeenCalled();
|
|
195
|
+
expect(getPRCommitMessages).not.toHaveBeenCalled();
|
|
196
|
+
expect(fetchPRDetails).not.toHaveBeenCalled();
|
|
197
|
+
expect(addCommentReaction).not.toHaveBeenCalled();
|
|
198
|
+
expect(fetchGraphFromBranch).not.toHaveBeenCalled();
|
|
199
|
+
expect(fetchGraphMetadata).not.toHaveBeenCalled();
|
|
200
|
+
});
|
|
201
|
+
it('each stubbed read member throws a clear "not supported in CLI" error', async () => {
|
|
202
|
+
const port = createCliGitHubClientPort();
|
|
203
|
+
await expect(port.fetchPRDiff('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
204
|
+
await expect(port.fetchPRDetails('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
205
|
+
await expect(port.getPRFileList('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
206
|
+
await expect(port.getPRCommitMessages('a', 'b', 1, 't')).rejects.toThrow(/not supported in CLI/);
|
|
207
|
+
await expect(port.addCommentReaction('a', 'b', 1, '+1', 't')).rejects.toThrow(/not supported in CLI/);
|
|
208
|
+
await expect(port.fetchGraphFromBranch('a', 'b', 't')).rejects.toThrow(/not supported in CLI/);
|
|
209
|
+
await expect(port.fetchGraphMetadata('a', 'b', 't')).rejects.toThrow(/not supported in CLI/);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
//# sourceMappingURL=pr-postback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-postback.test.js","sourceRoot":"","sources":["../../src/lib/pr-postback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token resolution for the CLI PR post-back (`ghagga review --pr N`).
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (CI/Jenkins-first, interactive fallback):
|
|
5
|
+
* 1. env GITHUB_TOKEN — the GitHub Actions / standard CI convention.
|
|
6
|
+
* 2. env GH_TOKEN — the `gh` CLI / alternate CI convention.
|
|
7
|
+
* 3. getStoredToken() — the interactive `ghagga login` stored token.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when no token resolves; the caller turns that into an
|
|
10
|
+
* actionable error ONLY when `--pr` was actually requested (no token is fine
|
|
11
|
+
* otherwise).
|
|
12
|
+
*/
|
|
13
|
+
/** Resolve a GitHub token: env GITHUB_TOKEN > env GH_TOKEN > stored login. */
|
|
14
|
+
export declare function resolvePrToken(env?: NodeJS.ProcessEnv, storedTokenFn?: () => string | null): string | null;
|
|
15
|
+
//# sourceMappingURL=pr-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.d.ts","sourceRoot":"","sources":["../../src/lib/pr-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,8EAA8E;AAC9E,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,aAAa,GAAE,MAAM,MAAM,GAAG,IAAqB,GAClD,MAAM,GAAG,IAAI,CAKf"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token resolution for the CLI PR post-back (`ghagga review --pr N`).
|
|
3
|
+
*
|
|
4
|
+
* Resolution order (CI/Jenkins-first, interactive fallback):
|
|
5
|
+
* 1. env GITHUB_TOKEN — the GitHub Actions / standard CI convention.
|
|
6
|
+
* 2. env GH_TOKEN — the `gh` CLI / alternate CI convention.
|
|
7
|
+
* 3. getStoredToken() — the interactive `ghagga login` stored token.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` when no token resolves; the caller turns that into an
|
|
10
|
+
* actionable error ONLY when `--pr` was actually requested (no token is fine
|
|
11
|
+
* otherwise).
|
|
12
|
+
*/
|
|
13
|
+
import { getStoredToken } from './config.js';
|
|
14
|
+
/** Resolve a GitHub token: env GITHUB_TOKEN > env GH_TOKEN > stored login. */
|
|
15
|
+
export function resolvePrToken(env = process.env, storedTokenFn = getStoredToken) {
|
|
16
|
+
const fromEnv = env.GITHUB_TOKEN?.trim() || env.GH_TOKEN?.trim();
|
|
17
|
+
if (fromEnv)
|
|
18
|
+
return fromEnv;
|
|
19
|
+
const stored = storedTokenFn();
|
|
20
|
+
return stored?.trim() ? stored : null;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=pr-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.js","sourceRoot":"","sources":["../../src/lib/pr-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAC5B,MAAyB,OAAO,CAAC,GAAG,EACpC,gBAAqC,cAAc;IAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.test.d.ts","sourceRoot":"","sources":["../../src/lib/pr-token.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { resolvePrToken } from './pr-token.js';
|
|
3
|
+
describe('resolvePrToken (env GITHUB_TOKEN > GH_TOKEN > stored)', () => {
|
|
4
|
+
it('prefers GITHUB_TOKEN over GH_TOKEN and stored', () => {
|
|
5
|
+
const token = resolvePrToken({ GITHUB_TOKEN: 'gh-primary', GH_TOKEN: 'gh-secondary' }, () => 'stored');
|
|
6
|
+
expect(token).toBe('gh-primary');
|
|
7
|
+
});
|
|
8
|
+
it('falls back to GH_TOKEN when GITHUB_TOKEN is unset', () => {
|
|
9
|
+
const token = resolvePrToken({ GH_TOKEN: 'gh-secondary' }, () => 'stored');
|
|
10
|
+
expect(token).toBe('gh-secondary');
|
|
11
|
+
});
|
|
12
|
+
it('falls back to the stored login token when no env token is set', () => {
|
|
13
|
+
const token = resolvePrToken({}, () => 'stored');
|
|
14
|
+
expect(token).toBe('stored');
|
|
15
|
+
});
|
|
16
|
+
it('returns null when no token resolves anywhere', () => {
|
|
17
|
+
const token = resolvePrToken({}, () => null);
|
|
18
|
+
expect(token).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it('treats blank/whitespace env tokens as unset and falls through', () => {
|
|
21
|
+
const token = resolvePrToken({ GITHUB_TOKEN: ' ', GH_TOKEN: '' }, () => 'stored');
|
|
22
|
+
expect(token).toBe('stored');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=pr-token.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-token.test.js","sourceRoot":"","sources":["../../src/lib/pr-token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAuB,EAC7E,GAAG,EAAE,CAAC,QAAQ,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAuB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QAChG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,cAAc,CAAC,EAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,cAAc,CAC1B,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAuB,EAC1D,GAAG,EAAE,CAAC,QAAQ,CACf,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ghagga",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "AI-powered code review from the command line — free with GitHub Models",
|
|
@@ -38,18 +38,19 @@
|
|
|
38
38
|
"README.md"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@clack/prompts": "^1.
|
|
41
|
+
"@clack/prompts": "^1.7.0",
|
|
42
42
|
"chalk": "^5.6.0",
|
|
43
43
|
"fts5-sql-bundle": "^1.0.2",
|
|
44
|
-
"commander": "^
|
|
44
|
+
"commander": "^15.0.0",
|
|
45
45
|
"dotenv": "^17.4.2",
|
|
46
|
-
"ghagga-core": "3.
|
|
46
|
+
"ghagga-core": "3.2.0",
|
|
47
|
+
"ghagga-forge": "3.2.0"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
|
-
"tsx": "^4.
|
|
50
|
-
"typescript": "^
|
|
51
|
-
"vitest": "^4.1.
|
|
52
|
-
"@types/node": "^
|
|
50
|
+
"tsx": "^4.23.1",
|
|
51
|
+
"typescript": "^6.0.3",
|
|
52
|
+
"vitest": "^4.1.10",
|
|
53
|
+
"@types/node": "^26.1.0"
|
|
53
54
|
},
|
|
54
55
|
"scripts": {
|
|
55
56
|
"build": "tsc",
|