@relayfile/adapter-linear 0.1.20 → 0.1.22
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/discovery/linear/.adapter.md +71 -0
- package/discovery/linear/issues/.create.example.json +6 -0
- package/discovery/linear/issues/.schema.json +145 -0
- package/discovery/linear/issues/{issueId}/comments/.create.example.json +3 -0
- package/discovery/linear/issues/{issueId}/comments/.schema.json +91 -0
- package/dist/__tests__/aliases.test.d.ts +2 -0
- package/dist/__tests__/aliases.test.d.ts.map +1 -0
- package/dist/__tests__/aliases.test.js +184 -0
- package/dist/__tests__/aliases.test.js.map +1 -0
- package/dist/__tests__/by-state.test.d.ts +2 -0
- package/dist/__tests__/by-state.test.d.ts.map +1 -0
- package/dist/__tests__/by-state.test.js +282 -0
- package/dist/__tests__/by-state.test.js.map +1 -0
- package/dist/__tests__/index-emission.test.d.ts +2 -0
- package/dist/__tests__/index-emission.test.d.ts.map +1 -0
- package/dist/__tests__/index-emission.test.js +118 -0
- package/dist/__tests__/index-emission.test.js.map +1 -0
- package/dist/__tests__/layout-prompt.test.d.ts +2 -0
- package/dist/__tests__/layout-prompt.test.d.ts.map +1 -0
- package/dist/__tests__/layout-prompt.test.js +14 -0
- package/dist/__tests__/layout-prompt.test.js.map +1 -0
- package/dist/__tests__/linear-adapter.test.js +241 -7
- package/dist/__tests__/linear-adapter.test.js.map +1 -1
- package/dist/__tests__/name-id-convention.test.d.ts +2 -0
- package/dist/__tests__/name-id-convention.test.d.ts.map +1 -0
- package/dist/__tests__/name-id-convention.test.js +50 -0
- package/dist/__tests__/name-id-convention.test.js.map +1 -0
- package/dist/__tests__/path-mapper.test.js +5 -1
- package/dist/__tests__/path-mapper.test.js.map +1 -1
- package/dist/alias-slug.d.ts +3 -0
- package/dist/alias-slug.d.ts.map +1 -0
- package/dist/alias-slug.js +17 -0
- package/dist/alias-slug.js.map +1 -0
- package/dist/index-emitter.d.ts +10 -0
- package/dist/index-emitter.d.ts.map +1 -0
- package/dist/index-emitter.js +30 -0
- package/dist/index-emitter.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/layout-prompt.d.ts +7 -0
- package/dist/layout-prompt.d.ts.map +1 -0
- package/dist/layout-prompt.js +45 -0
- package/dist/layout-prompt.js.map +1 -0
- package/dist/linear-adapter.d.ts +11 -0
- package/dist/linear-adapter.d.ts.map +1 -1
- package/dist/linear-adapter.js +403 -33
- package/dist/linear-adapter.js.map +1 -1
- package/dist/path-mapper.d.ts +22 -3
- package/dist/path-mapper.d.ts.map +1 -1
- package/dist/path-mapper.js +133 -21
- package/dist/path-mapper.js.map +1 -1
- package/dist/queries.d.ts +24 -0
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +50 -0
- package/dist/queries.js.map +1 -1
- package/dist/resources.d.ts +25 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +23 -0
- package/dist/resources.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/writeback.d.ts +7 -3
- package/dist/writeback.d.ts.map +1 -1
- package/dist/writeback.js +52 -14
- package/dist/writeback.js.map +1 -1
- package/dist/writeback.test.js +15 -43
- package/dist/writeback.test.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface AdapterResourceConfig {
|
|
2
|
+
readonly name: string;
|
|
3
|
+
readonly path: string;
|
|
4
|
+
readonly pathPattern: RegExp;
|
|
5
|
+
readonly idPattern: RegExp;
|
|
6
|
+
readonly schema: string;
|
|
7
|
+
readonly createExample: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const resources: readonly [{
|
|
10
|
+
readonly name: "issues";
|
|
11
|
+
readonly path: "/linear/issues";
|
|
12
|
+
readonly pathPattern: RegExp;
|
|
13
|
+
readonly idPattern: RegExp;
|
|
14
|
+
readonly schema: "discovery/linear/issues/.schema.json";
|
|
15
|
+
readonly createExample: "discovery/linear/issues/.create.example.json";
|
|
16
|
+
}, {
|
|
17
|
+
readonly name: "comments";
|
|
18
|
+
readonly path: "/linear/issues/{issueId}/comments";
|
|
19
|
+
readonly pathPattern: RegExp;
|
|
20
|
+
readonly idPattern: RegExp;
|
|
21
|
+
readonly schema: "discovery/linear/issues/{issueId}/comments/.schema.json";
|
|
22
|
+
readonly createExample: "discovery/linear/issues/{issueId}/comments/.create.example.json";
|
|
23
|
+
}];
|
|
24
|
+
export declare function findResourceByPath(path: string): AdapterResourceConfig | undefined;
|
|
25
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;EAiB+B,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAGlF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const resources = [
|
|
2
|
+
{
|
|
3
|
+
name: "issues",
|
|
4
|
+
path: "/linear/issues",
|
|
5
|
+
pathPattern: /^\/linear\/issues(?:\/[^\/]+(?:\.json)?)?$/,
|
|
6
|
+
idPattern: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
7
|
+
schema: "discovery/linear/issues/.schema.json",
|
|
8
|
+
createExample: "discovery/linear/issues/.create.example.json",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "comments",
|
|
12
|
+
path: "/linear/issues/{issueId}/comments",
|
|
13
|
+
pathPattern: /^\/linear\/issues\/[^\/]+\/comments(?:\/[^\/]+(?:\.json)?)?$/,
|
|
14
|
+
idPattern: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
15
|
+
schema: "discovery/linear/issues/{issueId}/comments/.schema.json",
|
|
16
|
+
createExample: "discovery/linear/issues/{issueId}/comments/.create.example.json",
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
export function findResourceByPath(path) {
|
|
20
|
+
const normalizedPath = path.endsWith(".json") ? path : path.replace(/\/$/, "");
|
|
21
|
+
return resources.find((resource) => resource.pathPattern.test(normalizedPath));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,4CAA4C;QACzD,SAAS,EAAE,iEAAiE;QAC5E,MAAM,EAAE,sCAAsC;QAC9C,aAAa,EAAE,8CAA8C;KAC9D;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,mCAAmC;QACzC,WAAW,EAAE,8DAA8D;QAC3E,SAAS,EAAE,iEAAiE;QAC5E,MAAM,EAAE,yDAAyD;QACjE,aAAa,EAAE,iEAAiE;KACjF;CACkD,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/writeback.d.ts
CHANGED
|
@@ -3,12 +3,16 @@ import type { LinearWritebackRequest } from './types.js';
|
|
|
3
3
|
* Resolve a relayfile writeback into a Linear GraphQL mutation request.
|
|
4
4
|
*
|
|
5
5
|
* Supported routes (today):
|
|
6
|
-
* POST /linear/issues/<slug>--<uuid>/comments
|
|
7
|
-
* POST /linear/issues
|
|
8
|
-
* PATCH/PUT /linear/issues/<slug>--<uuid>.json
|
|
6
|
+
* POST /linear/issues/<slug>--<uuid>/comments/<draft>.json → commentCreate
|
|
7
|
+
* POST /linear/issues/<draft>.json → issueCreate
|
|
8
|
+
* PATCH/PUT /linear/issues/<slug>--<uuid>.json → issueUpdate
|
|
9
9
|
*
|
|
10
10
|
* The path-mapper emits issue paths as `<slug>--<32-hex>`. We reverse the
|
|
11
11
|
* suffix to recover the canonical UUID Linear's API requires.
|
|
12
12
|
*/
|
|
13
13
|
export declare function resolveWritebackRequest(path: string, content: string): LinearWritebackRequest;
|
|
14
|
+
export declare class ReadOnlyFieldError extends Error {
|
|
15
|
+
readonly field: string;
|
|
16
|
+
constructor(field: string);
|
|
17
|
+
}
|
|
14
18
|
//# sourceMappingURL=writeback.d.ts.map
|
package/dist/writeback.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAmB7F"}
|
|
1
|
+
{"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAmB7F;AAqND,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;CAK1B"}
|
package/dist/writeback.js
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
* Resolve a relayfile writeback into a Linear GraphQL mutation request.
|
|
3
3
|
*
|
|
4
4
|
* Supported routes (today):
|
|
5
|
-
* POST /linear/issues/<slug>--<uuid>/comments
|
|
6
|
-
* POST /linear/issues
|
|
7
|
-
* PATCH/PUT /linear/issues/<slug>--<uuid>.json
|
|
5
|
+
* POST /linear/issues/<slug>--<uuid>/comments/<draft>.json → commentCreate
|
|
6
|
+
* POST /linear/issues/<draft>.json → issueCreate
|
|
7
|
+
* PATCH/PUT /linear/issues/<slug>--<uuid>.json → issueUpdate
|
|
8
8
|
*
|
|
9
9
|
* The path-mapper emits issue paths as `<slug>--<32-hex>`. We reverse the
|
|
10
10
|
* suffix to recover the canonical UUID Linear's API requires.
|
|
11
11
|
*/
|
|
12
12
|
export function resolveWritebackRequest(path, content) {
|
|
13
13
|
// Comment on an existing issue.
|
|
14
|
-
const newCommentMatch = path.match(/^\/linear\/issues\/([^/]+)\/comments\/
|
|
15
|
-
if (newCommentMatch?.[1]) {
|
|
14
|
+
const newCommentMatch = path.match(/^\/linear\/issues\/([^/]+)\/comments\/([^/]+)\.json$/);
|
|
15
|
+
if (newCommentMatch?.[1] && newCommentMatch[2] && !isCanonicalLinearIdSegment(newCommentMatch[2])) {
|
|
16
16
|
return buildCommentCreate(extractLinearId(newCommentMatch[1]), content);
|
|
17
17
|
}
|
|
18
|
-
// Create a brand-new issue.
|
|
19
|
-
|
|
18
|
+
// Create a brand-new issue from any non-canonical filename.
|
|
19
|
+
const issueFileMatch = path.match(/^\/linear\/issues\/([^/]+)\.json$/);
|
|
20
|
+
if (issueFileMatch?.[1] && !isCanonicalLinearIdSegment(issueFileMatch[1])) {
|
|
20
21
|
return buildIssueCreate(content);
|
|
21
22
|
}
|
|
22
23
|
// Update an existing issue's metadata.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return buildIssueUpdate(extractLinearId(issueUpdateMatch[1]), content);
|
|
24
|
+
if (issueFileMatch?.[1]) {
|
|
25
|
+
return buildIssueUpdate(extractLinearId(issueFileMatch[1]), content);
|
|
26
26
|
}
|
|
27
27
|
throw new Error(`No Linear writeback rule matched ${path}`);
|
|
28
28
|
}
|
|
@@ -62,6 +62,12 @@ function extractLinearId(segment) {
|
|
|
62
62
|
// Canonical UUIDs and synthetic test ids fall through.
|
|
63
63
|
return decoded;
|
|
64
64
|
}
|
|
65
|
+
function isCanonicalLinearIdSegment(segment) {
|
|
66
|
+
const decoded = decodeURIComponent(segment);
|
|
67
|
+
return (/--[0-9a-f]{32}$/i.test(decoded) ||
|
|
68
|
+
/^[0-9a-f]{32}$/i.test(decoded) ||
|
|
69
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(decoded));
|
|
70
|
+
}
|
|
65
71
|
/**
|
|
66
72
|
* Reformat a 32-char hex string back to canonical UUID `8-4-4-4-12` form.
|
|
67
73
|
* Inverse of the dehyphenation done by `path-mapper.idSuffix()`.
|
|
@@ -115,11 +121,11 @@ function buildCommentCreate(issueId, content) {
|
|
|
115
121
|
}
|
|
116
122
|
// JSON object: pull body + optional parentId, doNotSubscribeToIssue, etc.
|
|
117
123
|
if (!isRecord(parsed)) {
|
|
118
|
-
throw new Error('comments
|
|
124
|
+
throw new Error('comments/<draft>.json writeback expects a JSON object or plain string');
|
|
119
125
|
}
|
|
120
126
|
const body = readString(parsed, 'body');
|
|
121
127
|
if (!body) {
|
|
122
|
-
throw new Error('comments
|
|
128
|
+
throw new Error('comments/<draft>.json writeback requires a non-empty `body`');
|
|
123
129
|
}
|
|
124
130
|
const input = { issueId, body };
|
|
125
131
|
const parentId = readString(parsed, 'parentId');
|
|
@@ -143,13 +149,14 @@ function buildCommentCreate(issueId, content) {
|
|
|
143
149
|
*/
|
|
144
150
|
function buildIssueCreate(content) {
|
|
145
151
|
const payload = parseJsonObject(content);
|
|
152
|
+
rejectReadOnlyFields(payload);
|
|
146
153
|
const teamId = readString(payload, 'teamId');
|
|
147
154
|
if (!teamId) {
|
|
148
|
-
throw new Error('issues
|
|
155
|
+
throw new Error('issues/<draft>.json writeback requires a `teamId`');
|
|
149
156
|
}
|
|
150
157
|
const title = readString(payload, 'title');
|
|
151
158
|
if (!title) {
|
|
152
|
-
throw new Error('issues
|
|
159
|
+
throw new Error('issues/<draft>.json writeback requires a `title`');
|
|
153
160
|
}
|
|
154
161
|
const input = { teamId, title };
|
|
155
162
|
const description = readString(payload, 'description');
|
|
@@ -199,6 +206,28 @@ function buildIssueCreate(content) {
|
|
|
199
206
|
* would reject the request.
|
|
200
207
|
*/
|
|
201
208
|
const ENVELOPE_MARKER_KEYS = ['provider', 'objectType', 'objectId', 'workspaceId'];
|
|
209
|
+
const READ_ONLY_FIELDS = new Set([
|
|
210
|
+
'id',
|
|
211
|
+
'identifier',
|
|
212
|
+
'url',
|
|
213
|
+
'createdAt',
|
|
214
|
+
'updatedAt',
|
|
215
|
+
'provider',
|
|
216
|
+
'objectType',
|
|
217
|
+
'objectId',
|
|
218
|
+
'workspaceId',
|
|
219
|
+
'connectionId',
|
|
220
|
+
'_webhook',
|
|
221
|
+
'_connection',
|
|
222
|
+
]);
|
|
223
|
+
export class ReadOnlyFieldError extends Error {
|
|
224
|
+
field;
|
|
225
|
+
constructor(field) {
|
|
226
|
+
super(`Field "${field}" is read-only and cannot be written`);
|
|
227
|
+
this.name = 'ReadOnlyFieldError';
|
|
228
|
+
this.field = field;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
202
231
|
function looksLikeSyncedEnvelope(payload) {
|
|
203
232
|
if (!isRecord(payload.payload))
|
|
204
233
|
return false;
|
|
@@ -252,9 +281,11 @@ const ISSUE_UPDATE_ALLOWLIST = new Set([
|
|
|
252
281
|
*/
|
|
253
282
|
function buildIssueUpdate(issueId, content) {
|
|
254
283
|
const parsed = parseJsonObject(content);
|
|
284
|
+
rejectReadOnlyFields(parsed);
|
|
255
285
|
const source = looksLikeSyncedEnvelope(parsed)
|
|
256
286
|
? parsed.payload
|
|
257
287
|
: parsed;
|
|
288
|
+
rejectReadOnlyFields(source);
|
|
258
289
|
const input = {};
|
|
259
290
|
for (const [key, value] of Object.entries(source)) {
|
|
260
291
|
if (!ISSUE_UPDATE_ALLOWLIST.has(key))
|
|
@@ -272,6 +303,13 @@ function buildIssueUpdate(issueId, content) {
|
|
|
272
303
|
body: { query: ISSUE_UPDATE_MUTATION, variables: { id: issueId, input } },
|
|
273
304
|
};
|
|
274
305
|
}
|
|
306
|
+
function rejectReadOnlyFields(payload) {
|
|
307
|
+
for (const key of Object.keys(payload)) {
|
|
308
|
+
if (READ_ONLY_FIELDS.has(key)) {
|
|
309
|
+
throw new ReadOnlyFieldError(key);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
275
313
|
/* ------------------------------------------------------------------ *
|
|
276
314
|
* JSON helpers
|
|
277
315
|
* ------------------------------------------------------------------ */
|
package/dist/writeback.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.js","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,OAAe;IACnE,gCAAgC;IAChC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"writeback.js","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"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"}
|
package/dist/writeback.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { resolveWritebackRequest } from './writeback.js';
|
|
3
|
+
import { ReadOnlyFieldError, resolveWritebackRequest } from './writeback.js';
|
|
4
4
|
const PAGE_UUID = '2fd6800c-1c90-80ea-9ec8-fe4a0daa66b8';
|
|
5
5
|
const PAGE_HEX = PAGE_UUID.replace(/-/g, '');
|
|
6
6
|
describe('linear writeback', () => {
|
|
7
7
|
describe('comment create', () => {
|
|
8
8
|
it('creates a comment from plain-text content on a slug-form path', () => {
|
|
9
|
-
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/
|
|
9
|
+
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/review-note.json`, 'looks good, ship it');
|
|
10
10
|
assert.strictEqual(req.action, 'create_comment');
|
|
11
11
|
assert.strictEqual(req.method, 'POST');
|
|
12
12
|
assert.strictEqual(req.endpoint, '/graphql');
|
|
@@ -15,24 +15,24 @@ describe('linear writeback', () => {
|
|
|
15
15
|
assert.strictEqual(input.body, 'looks good, ship it');
|
|
16
16
|
});
|
|
17
17
|
it('accepts a JSON object with a body field', () => {
|
|
18
|
-
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/
|
|
18
|
+
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/review-note.json`, JSON.stringify({ body: 'with metadata', doNotSubscribeToIssue: true }));
|
|
19
19
|
const input = req.body.variables.input;
|
|
20
20
|
assert.strictEqual(input.body, 'with metadata');
|
|
21
21
|
assert.strictEqual(input.doNotSubscribeToIssue, true);
|
|
22
22
|
});
|
|
23
23
|
it('rejects a missing body in JSON form', () => {
|
|
24
|
-
assert.throws(() => resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/
|
|
24
|
+
assert.throws(() => resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}/comments/review-note.json`, '{}'), /requires a non-empty `body`/);
|
|
25
25
|
});
|
|
26
26
|
it('rejects legacy 8-char id suffix paths with a clear re-sync message', () => {
|
|
27
|
-
assert.throws(() => resolveWritebackRequest('/linear/issues/auth-refactor--2fd6800c/comments/
|
|
27
|
+
assert.throws(() => resolveWritebackRequest('/linear/issues/auth-refactor--2fd6800c/comments/review-note.json', 'hi'), /legacy 8-char id suffix.*relayfile pull/);
|
|
28
28
|
});
|
|
29
29
|
it('rejects team-prefixed identifiers with a clear UUID-required message', () => {
|
|
30
|
-
assert.throws(() => resolveWritebackRequest('/linear/issues/PROJ-441/comments/
|
|
30
|
+
assert.throws(() => resolveWritebackRequest('/linear/issues/PROJ-441/comments/review-note.json', 'hi'), /team-prefixed identifier/);
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
33
|
describe('issue create', () => {
|
|
34
34
|
it('creates an issue from a JSON payload', () => {
|
|
35
|
-
const req = resolveWritebackRequest('/linear/issues/
|
|
35
|
+
const req = resolveWritebackRequest('/linear/issues/audit-log-export.json', JSON.stringify({ teamId: 'team-1', title: 'Audit log export', priority: 2 }));
|
|
36
36
|
assert.strictEqual(req.action, 'create_issue');
|
|
37
37
|
const input = req.body.variables.input;
|
|
38
38
|
assert.strictEqual(input.teamId, 'team-1');
|
|
@@ -40,15 +40,12 @@ describe('linear writeback', () => {
|
|
|
40
40
|
assert.strictEqual(input.priority, 2);
|
|
41
41
|
});
|
|
42
42
|
it('rejects a missing teamId', () => {
|
|
43
|
-
assert.throws(() => resolveWritebackRequest('/linear/issues/
|
|
43
|
+
assert.throws(() => resolveWritebackRequest('/linear/issues/audit-log-export.json', JSON.stringify({ title: 'x' })), /requires a `teamId`/);
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
46
|
describe('issue update', () => {
|
|
47
|
-
it('builds an issueUpdate mutation
|
|
47
|
+
it('builds an issueUpdate mutation for a canonical id filename', () => {
|
|
48
48
|
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}.json`, JSON.stringify({
|
|
49
|
-
id: 'should-be-stripped',
|
|
50
|
-
identifier: 'PROJ-441',
|
|
51
|
-
createdAt: 'should-be-stripped',
|
|
52
49
|
title: 'New title',
|
|
53
50
|
description: 'New description',
|
|
54
51
|
}));
|
|
@@ -60,6 +57,9 @@ describe('linear writeback', () => {
|
|
|
60
57
|
description: 'New description',
|
|
61
58
|
});
|
|
62
59
|
});
|
|
60
|
+
it('rejects read-only fields instead of silently stripping them', () => {
|
|
61
|
+
assert.throws(() => resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}.json`, JSON.stringify({ id: 'different', title: 'New title' })), (error) => error instanceof ReadOnlyFieldError && error.field === 'id');
|
|
62
|
+
});
|
|
63
63
|
it('drops denormalized synced-read fields that IssueUpdateInput does not accept', () => {
|
|
64
64
|
// Pins the bug surfaced on op_31 in workspace rw_517d60b6: the synced
|
|
65
65
|
// file the path-mapper wrote on the read side included Linear's
|
|
@@ -73,8 +73,6 @@ describe('linear writeback', () => {
|
|
|
73
73
|
// The fix: explicit allowlist matching IssueUpdateInput. Anything not
|
|
74
74
|
// in the schema is silently dropped; only mutable fields go through.
|
|
75
75
|
const req = resolveWritebackRequest(`/linear/issues/${PAGE_UUID}.json`, JSON.stringify({
|
|
76
|
-
id: PAGE_UUID,
|
|
77
|
-
identifier: 'PROJ-441',
|
|
78
76
|
title: 'edited title',
|
|
79
77
|
description: 'edited description',
|
|
80
78
|
// Denormalized read-only fields the writeback must NOT forward:
|
|
@@ -83,10 +81,6 @@ describe('linear writeback', () => {
|
|
|
83
81
|
priority_label: 'No priority',
|
|
84
82
|
created_at: '2026-04-03T18:38:27.932Z',
|
|
85
83
|
updated_at: '2026-04-03T18:38:28.177Z',
|
|
86
|
-
url: 'https://linear.app/x/issue/PROJ-441',
|
|
87
|
-
// Read-side metadata Linear's webhook normalizer emits:
|
|
88
|
-
_connection: { provider: 'linear' },
|
|
89
|
-
_webhook: { action: 'update' },
|
|
90
84
|
descriptionData: '{"type":"doc"}',
|
|
91
85
|
}));
|
|
92
86
|
const variables = req.body.variables;
|
|
@@ -97,37 +91,15 @@ describe('linear writeback', () => {
|
|
|
97
91
|
descriptionData: '{"type":"doc"}',
|
|
98
92
|
});
|
|
99
93
|
});
|
|
100
|
-
it('
|
|
101
|
-
|
|
102
|
-
// /linear/issues/<id>.json file produced by LinearAdapter.renderContent.
|
|
103
|
-
// The agent edits payload.title and writes the whole envelope back; the
|
|
104
|
-
// resolver must NOT forward `provider`, `workspaceId`, etc. into the
|
|
105
|
-
// GraphQL IssueUpdateInput.
|
|
106
|
-
const req = resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}.json`, JSON.stringify({
|
|
94
|
+
it('rejects synced envelopes because their metadata fields are read-only', () => {
|
|
95
|
+
assert.throws(() => resolveWritebackRequest(`/linear/issues/auth-refactor--${PAGE_HEX}.json`, JSON.stringify({
|
|
107
96
|
provider: 'linear',
|
|
108
97
|
connectionId: 'conn-1',
|
|
109
98
|
workspaceId: 'wks-1',
|
|
110
|
-
eventType: 'issue.updated',
|
|
111
|
-
objectType: 'issue',
|
|
112
|
-
objectId: PAGE_UUID,
|
|
113
|
-
deleted: false,
|
|
114
99
|
payload: {
|
|
115
|
-
id: PAGE_UUID,
|
|
116
|
-
identifier: 'PROJ-441',
|
|
117
100
|
title: 'Edited title',
|
|
118
|
-
description: 'Edited description',
|
|
119
|
-
priority: 1,
|
|
120
101
|
},
|
|
121
|
-
}));
|
|
122
|
-
const variables = req.body.variables;
|
|
123
|
-
assert.strictEqual(variables.id, PAGE_UUID);
|
|
124
|
-
// Only mutable fields from payload survive the denylist; envelope
|
|
125
|
-
// markers (provider, workspaceId, etc.) must not appear.
|
|
126
|
-
assert.deepStrictEqual(variables.input, {
|
|
127
|
-
title: 'Edited title',
|
|
128
|
-
description: 'Edited description',
|
|
129
|
-
priority: 1,
|
|
130
|
-
});
|
|
102
|
+
})), (error) => error instanceof ReadOnlyFieldError && error.field === 'provider');
|
|
131
103
|
});
|
|
132
104
|
});
|
|
133
105
|
describe('unmatched paths', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeback.test.js","sourceRoot":"","sources":["../src/writeback.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"writeback.test.js","sourceRoot":"","sources":["../src/writeback.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayfile/adapter-linear",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.22",
|
|
4
4
|
"description": "Linear adapter bootstrap package for Relayfile",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
|
-
"dist"
|
|
31
|
+
"dist",
|
|
32
|
+
"discovery"
|
|
32
33
|
],
|
|
33
34
|
"scripts": {
|
|
34
35
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|