@cat-factory/integrations 0.24.1 → 0.25.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/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/documents/ConfluenceProvider.d.ts +1 -1
- package/dist/modules/documents/GitHubDocsProvider.d.ts +1 -1
- package/dist/modules/documents/LinearDocumentProvider.d.ts +24 -0
- package/dist/modules/documents/LinearDocumentProvider.d.ts.map +1 -0
- package/dist/modules/documents/LinearDocumentProvider.js +38 -0
- package/dist/modules/documents/LinearDocumentProvider.js.map +1 -0
- package/dist/modules/documents/NotionProvider.d.ts +1 -1
- package/dist/modules/documents/linear-docs.logic.d.ts +35 -0
- package/dist/modules/documents/linear-docs.logic.d.ts.map +1 -0
- package/dist/modules/documents/linear-docs.logic.js +110 -0
- package/dist/modules/documents/linear-docs.logic.js.map +1 -0
- package/dist/modules/shared/linear.client.d.ts +75 -0
- package/dist/modules/shared/linear.client.d.ts.map +1 -0
- package/dist/modules/shared/linear.client.js +192 -0
- package/dist/modules/shared/linear.client.js.map +1 -0
- package/dist/modules/tasks/GitHubIssuesProvider.d.ts +1 -1
- package/dist/modules/tasks/JiraProvider.d.ts +1 -1
- package/dist/modules/tasks/LinearTaskProvider.d.ts +33 -0
- package/dist/modules/tasks/LinearTaskProvider.d.ts.map +1 -0
- package/dist/modules/tasks/LinearTaskProvider.js +99 -0
- package/dist/modules/tasks/LinearTaskProvider.js.map +1 -0
- package/dist/modules/tasks/linear.logic.d.ts +105 -0
- package/dist/modules/tasks/linear.logic.d.ts.map +1 -0
- package/dist/modules/tasks/linear.logic.js +176 -0
- package/dist/modules/tasks/linear.logic.js.map +1 -0
- package/dist/modules/tracker/TicketTrackerService.d.ts +13 -2
- package/dist/modules/tracker/TicketTrackerService.d.ts.map +1 -1
- package/dist/modules/tracker/TicketTrackerService.js +18 -0
- package/dist/modules/tracker/TicketTrackerService.js.map +1 -1
- package/dist/modules/tracker/linear.create.logic.d.ts +16 -0
- package/dist/modules/tracker/linear.create.logic.d.ts.map +1 -0
- package/dist/modules/tracker/linear.create.logic.js +34 -0
- package/dist/modules/tracker/linear.create.logic.js.map +1 -0
- package/dist/modules/tracker/linear.writeback.logic.d.ts +29 -0
- package/dist/modules/tracker/linear.writeback.logic.d.ts.map +1 -0
- package/dist/modules/tracker/linear.writeback.logic.js +47 -0
- package/dist/modules/tracker/linear.writeback.logic.js.map +1 -0
- package/dist/modules/writeback/IssueWritebackService.d.ts +24 -2
- package/dist/modules/writeback/IssueWritebackService.d.ts.map +1 -1
- package/dist/modules/writeback/IssueWritebackService.js +52 -0
- package/dist/modules/writeback/IssueWritebackService.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.logic.js","sourceRoot":"","sources":["../../../src/modules/tasks/linear.logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ export interface JiraConnection {
|
|
|
5
5
|
accountEmail: string;
|
|
6
6
|
apiToken: string;
|
|
7
7
|
}
|
|
8
|
+
/** Linear credentials (a personal API key against the GraphQL endpoint). */
|
|
9
|
+
export interface LinearConnection {
|
|
10
|
+
apiKey: string;
|
|
11
|
+
}
|
|
8
12
|
export interface TicketTrackerServiceDependencies {
|
|
9
13
|
trackerSettingsRepository: TrackerSettingsRepository;
|
|
10
14
|
/**
|
|
@@ -20,8 +24,14 @@ export interface TicketTrackerServiceDependencies {
|
|
|
20
24
|
*/
|
|
21
25
|
resolveJiraConnection?: (workspaceId: string) => Promise<JiraConnection | null>;
|
|
22
26
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
27
|
+
* Resolves the workspace's Linear credentials, or null when Linear isn't
|
|
28
|
+
* configured. Absent → the Linear tracker passes through.
|
|
29
|
+
*/
|
|
30
|
+
resolveLinearConnection?: (workspaceId: string) => Promise<LinearConnection | null>;
|
|
31
|
+
/**
|
|
32
|
+
* HTTP transport for the Jira/Linear create call. Injected by each runtime (both
|
|
33
|
+
* expose a global `fetch`) so this package needs no DOM lib; absent → those
|
|
34
|
+
* trackers pass through.
|
|
25
35
|
*/
|
|
26
36
|
fetchImpl?: FetchLike;
|
|
27
37
|
}
|
|
@@ -45,6 +55,7 @@ export declare class TicketTrackerService implements TicketTrackerProvider {
|
|
|
45
55
|
private readonly deps;
|
|
46
56
|
constructor(deps: TicketTrackerServiceDependencies);
|
|
47
57
|
createTicket(request: CreateTicketRequest): Promise<CreatedTicket | null>;
|
|
58
|
+
private createLinearIssue;
|
|
48
59
|
private createJiraIssue;
|
|
49
60
|
}
|
|
50
61
|
//# sourceMappingURL=TicketTrackerService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TicketTrackerService.d.ts","sourceRoot":"","sources":["../../../src/modules/tracker/TicketTrackerService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"TicketTrackerService.d.ts","sourceRoot":"","sources":["../../../src/modules/tracker/TicketTrackerService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAA;AAoB5B,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gCAAgC;IAC/C,yBAAyB,EAAE,yBAAyB,CAAA;IACpD;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IACjF;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC/E;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACnF;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KACrE,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAAA;AAIhG,qBAAa,oBAAqB,YAAW,qBAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,gCAAgC,EAAI;IAEjE,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAO9E;YAEa,iBAAiB;YAsBjB,eAAe;CAkC9B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { buildJiraIssuePayload } from './jira.create.logic.js';
|
|
2
|
+
import { LINEAR_ISSUE_CREATE_MUTATION, buildLinearIssueCreateVariables, parseLinearIssueCreateResponse, } from './linear.create.logic.js';
|
|
3
|
+
import { postLinearGraphql } from '../shared/linear.client.js';
|
|
2
4
|
import { toBase64 } from './base64.js';
|
|
3
5
|
const USER_AGENT = 'cat-factory';
|
|
4
6
|
export class TicketTrackerService {
|
|
@@ -14,8 +16,24 @@ export class TicketTrackerService {
|
|
|
14
16
|
return (await this.deps.fileGitHubIssue?.(request)) ?? null;
|
|
15
17
|
if (settings.tracker === 'jira')
|
|
16
18
|
return this.createJiraIssue(request, settings.jiraProjectKey);
|
|
19
|
+
if (settings.tracker === 'linear')
|
|
20
|
+
return this.createLinearIssue(request, settings.linearTeamId);
|
|
17
21
|
return null;
|
|
18
22
|
}
|
|
23
|
+
async createLinearIssue(request, teamId) {
|
|
24
|
+
const { resolveLinearConnection, fetchImpl } = this.deps;
|
|
25
|
+
if (!resolveLinearConnection || !fetchImpl || !teamId)
|
|
26
|
+
return null;
|
|
27
|
+
const connection = await resolveLinearConnection(request.workspaceId);
|
|
28
|
+
if (!connection?.apiKey)
|
|
29
|
+
return null;
|
|
30
|
+
const data = await postLinearGraphql(fetchImpl, { apiKey: connection.apiKey }, LINEAR_ISSUE_CREATE_MUTATION, buildLinearIssueCreateVariables({
|
|
31
|
+
teamId,
|
|
32
|
+
title: request.title,
|
|
33
|
+
body: request.body,
|
|
34
|
+
}));
|
|
35
|
+
return parseLinearIssueCreateResponse(data);
|
|
36
|
+
}
|
|
19
37
|
async createJiraIssue(request, projectKey) {
|
|
20
38
|
const { resolveJiraConnection, fetchImpl } = this.deps;
|
|
21
39
|
if (!resolveJiraConnection || !fetchImpl || !projectKey)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TicketTrackerService.js","sourceRoot":"","sources":["../../../src/modules/tracker/TicketTrackerService.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"TicketTrackerService.js","sourceRoot":"","sources":["../../../src/modules/tracker/TicketTrackerService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The `issueCreate` mutation (returns the created issue's identifier + URL). */
|
|
2
|
+
export declare const LINEAR_ISSUE_CREATE_MUTATION = "mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n success\n issue { identifier url }\n }\n}";
|
|
3
|
+
/** Build the `issueCreate` variables. A team id is required by Linear's API. */
|
|
4
|
+
export declare function buildLinearIssueCreateVariables(input: {
|
|
5
|
+
teamId: string;
|
|
6
|
+
title: string;
|
|
7
|
+
body: string;
|
|
8
|
+
}): {
|
|
9
|
+
input: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
/** Parse the `issueCreate` response into the filed ticket; throws on failure. */
|
|
12
|
+
export declare function parseLinearIssueCreateResponse(data: unknown): {
|
|
13
|
+
externalId: string;
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=linear.create.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.create.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tracker/linear.create.logic.ts"],"names":[],"mappings":"AAKA,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,yIAKvC,CAAA;AAEF,gFAAgF;AAChF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAQrC;AASD,iFAAiF;AACjF,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAUjG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Pure helpers for filing a Linear issue: the `issueCreate` GraphQL mutation, its
|
|
2
|
+
// variables, and parsing the response. Kept out of the service so they are
|
|
3
|
+
// unit-testable without a live API. Linear descriptions are Markdown, so (unlike
|
|
4
|
+
// Jira's `markdownToAdf`) the body passes through unchanged.
|
|
5
|
+
/** The `issueCreate` mutation (returns the created issue's identifier + URL). */
|
|
6
|
+
export const LINEAR_ISSUE_CREATE_MUTATION = `mutation CreateIssue($input: IssueCreateInput!) {
|
|
7
|
+
issueCreate(input: $input) {
|
|
8
|
+
success
|
|
9
|
+
issue { identifier url }
|
|
10
|
+
}
|
|
11
|
+
}`;
|
|
12
|
+
/** Build the `issueCreate` variables. A team id is required by Linear's API. */
|
|
13
|
+
export function buildLinearIssueCreateVariables(input) {
|
|
14
|
+
return {
|
|
15
|
+
input: {
|
|
16
|
+
teamId: input.teamId,
|
|
17
|
+
title: input.title.slice(0, 250),
|
|
18
|
+
description: input.body,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Parse the `issueCreate` response into the filed ticket; throws on failure. */
|
|
23
|
+
export function parseLinearIssueCreateResponse(data) {
|
|
24
|
+
const payload = (data ?? {});
|
|
25
|
+
const issue = payload.issueCreate?.issue;
|
|
26
|
+
if (!payload.issueCreate?.success || !issue?.identifier) {
|
|
27
|
+
throw new Error('Linear issueCreate did not return a created issue');
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
externalId: issue.identifier,
|
|
31
|
+
url: issue.url ?? `https://linear.app/issue/${issue.identifier}`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=linear.create.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.create.logic.js","sourceRoot":"","sources":["../../../src/modules/tracker/linear.create.logic.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,2EAA2E;AAC3E,iFAAiF;AACjF,6DAA6D;AAE7D,iFAAiF;AACjF,MAAM,CAAC,MAAM,4BAA4B,GAAG;;;;;EAK1C,CAAA;AAEF,gFAAgF;AAChF,MAAM,UAAU,+BAA+B,CAAC,KAI/C;IACC,OAAO;QACL,KAAK,EAAE;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAChC,WAAW,EAAE,KAAK,CAAC,IAAI;SACxB;KACF,CAAA;AACH,CAAC;AASD,iFAAiF;AACjF,MAAM,UAAU,8BAA8B,CAAC,IAAa;IAC1D,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAuB,CAAA;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAA;IACxC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IACD,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,4BAA4B,KAAK,CAAC,UAAU,EAAE;KACjE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Look up an issue's UUID by its identifier (for the comment mutation). */
|
|
2
|
+
export declare const LINEAR_ISSUE_ID_QUERY = "query IssueId($id: String!) {\n issue(id: $id) { id }\n}";
|
|
3
|
+
/** Look up an issue's UUID plus its team's workflow states (for resolve). */
|
|
4
|
+
export declare const LINEAR_ISSUE_RESOLVE_LOOKUP_QUERY = "query IssueResolveLookup($id: String!) {\n issue(id: $id) {\n id\n team { states { nodes { id type } } }\n }\n}";
|
|
5
|
+
/** The `commentCreate` mutation. */
|
|
6
|
+
export declare const LINEAR_COMMENT_CREATE_MUTATION = "mutation CommentCreate($input: CommentCreateInput!) {\n commentCreate(input: $input) { success }\n}";
|
|
7
|
+
/** The `issueUpdate` mutation (used to set the resolved state). */
|
|
8
|
+
export declare const LINEAR_ISSUE_UPDATE_MUTATION = "mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {\n issueUpdate(id: $id, input: $input) { success }\n}";
|
|
9
|
+
/** Build the `commentCreate` variables (issue UUID + Markdown body). */
|
|
10
|
+
export declare function buildLinearCommentVariables(issueId: string, body: string): {
|
|
11
|
+
input: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
/** Build the `issueUpdate` variables that move an issue to a workflow state. */
|
|
14
|
+
export declare function buildLinearStateUpdateVariables(issueId: string, stateId: string): {
|
|
15
|
+
id: string;
|
|
16
|
+
input: Record<string, unknown>;
|
|
17
|
+
};
|
|
18
|
+
/** One workflow state as returned by the team-states lookup. */
|
|
19
|
+
export interface LinearWorkflowState {
|
|
20
|
+
id?: string;
|
|
21
|
+
type?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Pick the id of the team's **completed**-type workflow state (Linear's standard
|
|
25
|
+
* resolved category), or null if none exists. Returns the first match, the
|
|
26
|
+
* conventional resolve target in a default workflow.
|
|
27
|
+
*/
|
|
28
|
+
export declare function pickCompletedStateId(states: LinearWorkflowState[]): string | null;
|
|
29
|
+
//# sourceMappingURL=linear.writeback.logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.writeback.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/tracker/linear.writeback.logic.ts"],"names":[],"mappings":"AAYA,4EAA4E;AAC5E,eAAO,MAAM,qBAAqB,8DAEhC,CAAA;AAEF,6EAA6E;AAC7E,eAAO,MAAM,iCAAiC,4HAK5C,CAAA;AAEF,oCAAoC;AACpC,eAAO,MAAM,8BAA8B,yGAEzC,CAAA;AAEF,mEAAmE;AACnE,eAAO,MAAM,4BAA4B,0HAEvC,CAAA;AAEF,wEAAwE;AACxE,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAEpC;AAED,gFAAgF;AAChF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAEhD;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,GAAG,IAAI,CAEjF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Pure helpers for Linear issue-tracker writeback: the GraphQL documents +
|
|
2
|
+
// variable builders for commenting on an issue and transitioning it to a completed
|
|
3
|
+
// workflow state, plus picking that state. Kept out of the service so they are
|
|
4
|
+
// unit-testable without a live API.
|
|
5
|
+
//
|
|
6
|
+
// Linear identifies issues by a UUID in mutations (the stored external id is the
|
|
7
|
+
// human identifier `ENG-123`, which the `issue(id:)` read resolves but the
|
|
8
|
+
// mutations want the UUID), so writeback first looks the issue up to get its UUID
|
|
9
|
+
// (and, for resolve, its team's workflow states), then mutates. Linear has no
|
|
10
|
+
// native "close" — resolution is a transition to a `completed`-type state, the
|
|
11
|
+
// analogue of Jira's Done category.
|
|
12
|
+
/** Look up an issue's UUID by its identifier (for the comment mutation). */
|
|
13
|
+
export const LINEAR_ISSUE_ID_QUERY = `query IssueId($id: String!) {
|
|
14
|
+
issue(id: $id) { id }
|
|
15
|
+
}`;
|
|
16
|
+
/** Look up an issue's UUID plus its team's workflow states (for resolve). */
|
|
17
|
+
export const LINEAR_ISSUE_RESOLVE_LOOKUP_QUERY = `query IssueResolveLookup($id: String!) {
|
|
18
|
+
issue(id: $id) {
|
|
19
|
+
id
|
|
20
|
+
team { states { nodes { id type } } }
|
|
21
|
+
}
|
|
22
|
+
}`;
|
|
23
|
+
/** The `commentCreate` mutation. */
|
|
24
|
+
export const LINEAR_COMMENT_CREATE_MUTATION = `mutation CommentCreate($input: CommentCreateInput!) {
|
|
25
|
+
commentCreate(input: $input) { success }
|
|
26
|
+
}`;
|
|
27
|
+
/** The `issueUpdate` mutation (used to set the resolved state). */
|
|
28
|
+
export const LINEAR_ISSUE_UPDATE_MUTATION = `mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {
|
|
29
|
+
issueUpdate(id: $id, input: $input) { success }
|
|
30
|
+
}`;
|
|
31
|
+
/** Build the `commentCreate` variables (issue UUID + Markdown body). */
|
|
32
|
+
export function buildLinearCommentVariables(issueId, body) {
|
|
33
|
+
return { input: { issueId, body } };
|
|
34
|
+
}
|
|
35
|
+
/** Build the `issueUpdate` variables that move an issue to a workflow state. */
|
|
36
|
+
export function buildLinearStateUpdateVariables(issueId, stateId) {
|
|
37
|
+
return { id: issueId, input: { stateId } };
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Pick the id of the team's **completed**-type workflow state (Linear's standard
|
|
41
|
+
* resolved category), or null if none exists. Returns the first match, the
|
|
42
|
+
* conventional resolve target in a default workflow.
|
|
43
|
+
*/
|
|
44
|
+
export function pickCompletedStateId(states) {
|
|
45
|
+
return states.find((s) => s.type === 'completed' && s.id)?.id ?? null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=linear.writeback.logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.writeback.logic.js","sourceRoot":"","sources":["../../../src/modules/tracker/linear.writeback.logic.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,mFAAmF;AACnF,+EAA+E;AAC/E,oCAAoC;AACpC,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,kFAAkF;AAClF,8EAA8E;AAC9E,+EAA+E;AAC/E,oCAAoC;AAEpC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG;;EAEnC,CAAA;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;EAK/C,CAAA;AAEF,oCAAoC;AACpC,MAAM,CAAC,MAAM,8BAA8B,GAAG;;EAE5C,CAAA;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,4BAA4B,GAAG;;EAE1C,CAAA;AAEF,wEAAwE;AACxE,MAAM,UAAU,2BAA2B,CACzC,OAAe,EACf,IAAY;IAEZ,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAA;AACrC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,+BAA+B,CAC7C,OAAe,EACf,OAAe;IAEf,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAA;AAC5C,CAAC;AAQD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA6B;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,IAAI,CAAA;AACvE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Block, type IssueWritebackProvider, type PullRequestRef, type TaskRepository, type TrackerSettingsRepository } from '@cat-factory/kernel';
|
|
2
|
-
import type { FetchLike, JiraConnection } from '../tracker/TicketTrackerService.js';
|
|
2
|
+
import type { FetchLike, JiraConnection, LinearConnection } from '../tracker/TicketTrackerService.js';
|
|
3
3
|
export interface IssueWritebackServiceDependencies {
|
|
4
4
|
trackerSettingsRepository: TrackerSettingsRepository;
|
|
5
5
|
taskRepository: TaskRepository;
|
|
@@ -19,7 +19,12 @@ export interface IssueWritebackServiceDependencies {
|
|
|
19
19
|
* Reuses the same seam as `TicketTrackerService`. Absent → Jira writeback passes through.
|
|
20
20
|
*/
|
|
21
21
|
resolveJiraConnection?: (workspaceId: string) => Promise<JiraConnection | null>;
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the workspace's Linear credentials, or null when Linear isn't configured.
|
|
24
|
+
* Reuses the same seam as `TicketTrackerService`. Absent → Linear writeback passes through.
|
|
25
|
+
*/
|
|
26
|
+
resolveLinearConnection?: (workspaceId: string) => Promise<LinearConnection | null>;
|
|
27
|
+
/** HTTP transport for the Jira/Linear calls (each runtime exposes a global `fetch`). */
|
|
23
28
|
fetchImpl?: FetchLike;
|
|
24
29
|
}
|
|
25
30
|
export declare class IssueWritebackService implements IssueWritebackProvider {
|
|
@@ -31,6 +36,23 @@ export declare class IssueWritebackService implements IssueWritebackProvider {
|
|
|
31
36
|
private forEachIssue;
|
|
32
37
|
private comment;
|
|
33
38
|
private resolve;
|
|
39
|
+
/**
|
|
40
|
+
* Comment on a Linear issue: resolve its UUID by identifier, then `commentCreate`.
|
|
41
|
+
* On merge this runs before {@link resolveLinear}, so the issue is looked up twice
|
|
42
|
+
* (here for the UUID, there for the UUID + the team's workflow states). That second
|
|
43
|
+
* lookup is unavoidable — only it carries the states needed to pick the resolved
|
|
44
|
+
* state — and the duplicated read is one cheap `issue(id:){id}` call, so the seam is
|
|
45
|
+
* kept uniform with the GitHub/Jira comment/resolve split rather than special-cased.
|
|
46
|
+
*/
|
|
47
|
+
private commentLinear;
|
|
48
|
+
/** Resolve a Linear issue: look up its UUID + team states, then transition to completed. */
|
|
49
|
+
private resolveLinear;
|
|
50
|
+
/**
|
|
51
|
+
* Issue a Linear GraphQL request for the workspace's connection. Returns the
|
|
52
|
+
* validated `data` (or null when Linear isn't configured). Throws on a GraphQL /
|
|
53
|
+
* HTTP error so the per-issue `.catch` in {@link forEachIssue} swallows it.
|
|
54
|
+
*/
|
|
55
|
+
private linearRequest;
|
|
34
56
|
private resolveJira;
|
|
35
57
|
/**
|
|
36
58
|
* Issue a Jira REST v3 request for the workspace's connection. Returns the parsed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueWritebackService.d.ts","sourceRoot":"","sources":["../../../src/modules/writeback/IssueWritebackService.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"IssueWritebackService.d.ts","sourceRoot":"","sources":["../../../src/modules/writeback/IssueWritebackService.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAA;AAW5B,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EACjB,MAAM,oCAAoC,CAAA;AAkB3C,MAAM,WAAW,iCAAiC;IAChD,yBAAyB,EAAE,yBAAyB,CAAA;IACpD,cAAc,EAAE,cAAc,CAAA;IAC9B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/F;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7E;;;OAGG;IACH,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC/E;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACnF,wFAAwF;IACxF,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,qBAAsB,YAAW,sBAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,iCAAiC,EAAI;IAElE,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9F;IAEK,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9F;IAED,2FAA2F;YAC7E,YAAY;YAOZ,OAAO;YAiBP,OAAO;IAcrB;;;;;;;OAOG;YACW,aAAa;IAiB3B,4FAA4F;YAC9E,aAAa;IAgB3B;;;;OAIG;YACW,aAAa;YAYb,WAAW;IAazB;;;;OAIG;YACW,WAAW;CA+B1B"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { resolveWritebackFlag, } from '@cat-factory/kernel';
|
|
2
2
|
import { buildJiraCommentPayload, pickDoneTransition } from '../tracker/jira.writeback.logic.js';
|
|
3
|
+
import { LINEAR_COMMENT_CREATE_MUTATION, LINEAR_ISSUE_ID_QUERY, LINEAR_ISSUE_RESOLVE_LOOKUP_QUERY, LINEAR_ISSUE_UPDATE_MUTATION, buildLinearCommentVariables, buildLinearStateUpdateVariables, pickCompletedStateId, } from '../tracker/linear.writeback.logic.js';
|
|
4
|
+
import { postLinearGraphql } from '../shared/linear.client.js';
|
|
3
5
|
import { toBase64 } from '../tracker/base64.js';
|
|
4
6
|
// IssueWritebackService: the runtime-neutral `IssueWritebackProvider`. As a task's
|
|
5
7
|
// PR progresses the execution engine calls it to write back to the task's linked
|
|
@@ -57,6 +59,10 @@ export class IssueWritebackService {
|
|
|
57
59
|
method: 'POST',
|
|
58
60
|
body: buildJiraCommentPayload(body),
|
|
59
61
|
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (issue.source === 'linear') {
|
|
65
|
+
await this.commentLinear(workspaceId, issue.externalId, body);
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
68
|
async resolve(workspaceId, issue) {
|
|
@@ -66,8 +72,54 @@ export class IssueWritebackService {
|
|
|
66
72
|
}
|
|
67
73
|
if (issue.source === 'jira') {
|
|
68
74
|
await this.resolveJira(workspaceId, issue.externalId);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (issue.source === 'linear') {
|
|
78
|
+
await this.resolveLinear(workspaceId, issue.externalId);
|
|
69
79
|
}
|
|
70
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Comment on a Linear issue: resolve its UUID by identifier, then `commentCreate`.
|
|
83
|
+
* On merge this runs before {@link resolveLinear}, so the issue is looked up twice
|
|
84
|
+
* (here for the UUID, there for the UUID + the team's workflow states). That second
|
|
85
|
+
* lookup is unavoidable — only it carries the states needed to pick the resolved
|
|
86
|
+
* state — and the duplicated read is one cheap `issue(id:){id}` call, so the seam is
|
|
87
|
+
* kept uniform with the GitHub/Jira comment/resolve split rather than special-cased.
|
|
88
|
+
*/
|
|
89
|
+
async commentLinear(workspaceId, identifier, body) {
|
|
90
|
+
const lookup = (await this.linearRequest(workspaceId, LINEAR_ISSUE_ID_QUERY, {
|
|
91
|
+
id: identifier,
|
|
92
|
+
}));
|
|
93
|
+
const issueId = lookup?.issue?.id;
|
|
94
|
+
if (!issueId)
|
|
95
|
+
return;
|
|
96
|
+
await this.linearRequest(workspaceId, LINEAR_COMMENT_CREATE_MUTATION, buildLinearCommentVariables(issueId, body));
|
|
97
|
+
}
|
|
98
|
+
/** Resolve a Linear issue: look up its UUID + team states, then transition to completed. */
|
|
99
|
+
async resolveLinear(workspaceId, identifier) {
|
|
100
|
+
const lookup = (await this.linearRequest(workspaceId, LINEAR_ISSUE_RESOLVE_LOOKUP_QUERY, {
|
|
101
|
+
id: identifier,
|
|
102
|
+
}));
|
|
103
|
+
const issueId = lookup?.issue?.id;
|
|
104
|
+
const stateId = pickCompletedStateId((lookup?.issue?.team?.states?.nodes ?? []));
|
|
105
|
+
if (!issueId || !stateId)
|
|
106
|
+
return;
|
|
107
|
+
await this.linearRequest(workspaceId, LINEAR_ISSUE_UPDATE_MUTATION, buildLinearStateUpdateVariables(issueId, stateId));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Issue a Linear GraphQL request for the workspace's connection. Returns the
|
|
111
|
+
* validated `data` (or null when Linear isn't configured). Throws on a GraphQL /
|
|
112
|
+
* HTTP error so the per-issue `.catch` in {@link forEachIssue} swallows it.
|
|
113
|
+
*/
|
|
114
|
+
async linearRequest(workspaceId, document, variables) {
|
|
115
|
+
const { resolveLinearConnection, fetchImpl } = this.deps;
|
|
116
|
+
if (!resolveLinearConnection || !fetchImpl)
|
|
117
|
+
return null;
|
|
118
|
+
const connection = await resolveLinearConnection(workspaceId);
|
|
119
|
+
if (!connection?.apiKey)
|
|
120
|
+
return null;
|
|
121
|
+
return postLinearGraphql(fetchImpl, { apiKey: connection.apiKey }, document, variables);
|
|
122
|
+
}
|
|
71
123
|
async resolveJira(workspaceId, key) {
|
|
72
124
|
const path = `issue/${encodeURIComponent(key)}/transitions`;
|
|
73
125
|
const list = (await this.jiraRequest(workspaceId, path, { method: 'GET' }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueWritebackService.js","sourceRoot":"","sources":["../../../src/modules/writeback/IssueWritebackService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,GAOrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"IssueWritebackService.js","sourceRoot":"","sources":["../../../src/modules/writeback/IssueWritebackService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/integrations",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "External-system integration domain logic for the Agent Architecture Board (GitHub, documents, tasks, environments, runners).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"ai": "^6.0.209",
|
|
28
|
-
"@cat-factory/contracts": "0.
|
|
29
|
-
"@cat-factory/kernel": "0.42.
|
|
28
|
+
"@cat-factory/contracts": "0.41.0",
|
|
29
|
+
"@cat-factory/kernel": "0.42.2"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"typescript": "7.0.1-rc",
|