@phamvuhoang/otto-core 0.2.0 → 0.4.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/cli-help.d.ts +16 -3
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +14 -4
- package/dist/cli-help.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/linear-api.d.ts +161 -0
- package/dist/linear-api.d.ts.map +1 -0
- package/dist/linear-api.js +288 -0
- package/dist/linear-api.js.map +1 -0
- package/dist/linear-auth.d.ts +42 -0
- package/dist/linear-auth.d.ts.map +1 -0
- package/dist/linear-auth.js +115 -0
- package/dist/linear-auth.js.map +1 -0
- package/dist/linear-cli.d.ts +37 -0
- package/dist/linear-cli.d.ts.map +1 -0
- package/dist/linear-cli.js +176 -0
- package/dist/linear-cli.js.map +1 -0
- package/dist/linear-main.d.ts +5 -0
- package/dist/linear-main.d.ts.map +1 -0
- package/dist/linear-main.js +27 -0
- package/dist/linear-main.js.map +1 -0
- package/dist/loop.d.ts +2 -0
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +79 -5
- package/dist/loop.js.map +1 -1
- package/dist/preflight.d.ts +3 -0
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +13 -1
- package/dist/preflight.js.map +1 -1
- package/dist/run-bin.d.ts +21 -1
- package/dist/run-bin.d.ts.map +1 -1
- package/dist/run-bin.js +12 -6
- package/dist/run-bin.js.map +1 -1
- package/dist/stages.d.ts +10 -0
- package/dist/stages.d.ts.map +1 -1
- package/dist/stages.js +10 -0
- package/dist/stages.js.map +1 -1
- package/dist/watch.d.ts +53 -4
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +76 -11
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
- package/templates/ghprompt-workflow.md +6 -3
- package/templates/linear-completion.md +17 -0
- package/templates/linearafk-issue.md +31 -0
- package/templates/linearafk.md +29 -0
- package/templates/linearprompt.md +39 -0
- package/templates/prompt.md +4 -0
package/dist/cli-help.d.ts
CHANGED
|
@@ -12,7 +12,12 @@ export type CliFlags = {
|
|
|
12
12
|
reviewPanel: boolean;
|
|
13
13
|
watch: boolean;
|
|
14
14
|
watchIntervalSec?: number;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Normalized `--issue` value. A number for GitHub refs (the default parser);
|
|
17
|
+
* a canonical string for Linear refs (`ENG-123` / UUID, via an injected
|
|
18
|
+
* `parseIssue`). In both cases it is shell-safe for `OTTO_ISSUE`.
|
|
19
|
+
*/
|
|
20
|
+
issue?: number | string;
|
|
16
21
|
maxWaitMs?: number;
|
|
17
22
|
fresh: boolean;
|
|
18
23
|
verify: boolean;
|
|
@@ -35,7 +40,15 @@ export declare function parseDurationMs(raw: string): number;
|
|
|
35
40
|
* pass the raw ref to a shell. See render.ts security invariant.
|
|
36
41
|
*/
|
|
37
42
|
export declare function parseIssueRef(raw: string): number;
|
|
38
|
-
|
|
43
|
+
/** Options for {@link parseFlags}. */
|
|
44
|
+
export type ParseFlagsOptions = {
|
|
45
|
+
/**
|
|
46
|
+
* How to validate/normalize the `--issue` value. Defaults to the GitHub
|
|
47
|
+
* number ref ({@link parseIssueRef}); otto-linear-afk injects a Linear parser.
|
|
48
|
+
*/
|
|
49
|
+
parseIssue?: (raw: string) => number | string;
|
|
50
|
+
};
|
|
51
|
+
export declare function parseFlags(argv: string[], opts?: ParseFlagsOptions): CliFlags;
|
|
39
52
|
/**
|
|
40
53
|
* Resolve the @phamvuhoang/otto-core version by reading the package.json that
|
|
41
54
|
* sits two levels up from the compiled cli-help.js (packages/core/dist/ →
|
|
@@ -58,7 +71,7 @@ export type PrintConfigOptions = {
|
|
|
58
71
|
reviewLenses?: string[];
|
|
59
72
|
watch?: boolean;
|
|
60
73
|
watchIntervalSec?: number;
|
|
61
|
-
issue?: number;
|
|
74
|
+
issue?: number | string;
|
|
62
75
|
maxWaitMs?: number;
|
|
63
76
|
mode?: string;
|
|
64
77
|
branchStrategy?: "current" | "branch" | "worktree";
|
package/dist/cli-help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-help.d.ts","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-help.d.ts","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmBjD;AAED,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;CAC/C,CAAC;AAEF,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,iBAAsB,GAC3B,QAAQ,CA4LV;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAWxC;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,IAAI,CA+CN;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,kBAAuB,GAC5B,IAAI,CAgGN"}
|
package/dist/cli-help.js
CHANGED
|
@@ -44,7 +44,8 @@ export function parseIssueRef(raw) {
|
|
|
44
44
|
}
|
|
45
45
|
return n;
|
|
46
46
|
}
|
|
47
|
-
export function parseFlags(argv) {
|
|
47
|
+
export function parseFlags(argv, opts = {}) {
|
|
48
|
+
const parseIssue = opts.parseIssue ?? parseIssueRef;
|
|
48
49
|
let help = false;
|
|
49
50
|
let version = false;
|
|
50
51
|
let printConfig = false;
|
|
@@ -116,7 +117,7 @@ export function parseFlags(argv) {
|
|
|
116
117
|
continue;
|
|
117
118
|
}
|
|
118
119
|
if (expectingIssue) {
|
|
119
|
-
issue =
|
|
120
|
+
issue = parseIssue(a);
|
|
120
121
|
expectingIssue = false;
|
|
121
122
|
continue;
|
|
122
123
|
}
|
|
@@ -336,11 +337,20 @@ export function printConfig(bin, workspaceDir, packageDir, opts = {}) {
|
|
|
336
337
|
const reviewStatus = reviewLenses.length
|
|
337
338
|
? `panel: ${reviewLenses.join(", ")}`
|
|
338
339
|
: "single reviewer";
|
|
339
|
-
|
|
340
|
+
// Linear watch polls OTTO_LINEAR_LABEL (the label its implementer selects);
|
|
341
|
+
// every other mode polls OTTO_WATCH_LABEL. Mirror run-bin's resolution so the
|
|
342
|
+
// reported label matches what a --watch run would actually poll. Linear mode
|
|
343
|
+
// never falls back to OTTO_WATCH_LABEL: run-bin's resolveWatchLabel returns
|
|
344
|
+
// OTTO_LINEAR_LABEL || "otto", short-circuiting before OTTO_WATCH_LABEL.
|
|
345
|
+
const watchLabel = mode === "linear"
|
|
346
|
+
? process.env.OTTO_LINEAR_LABEL?.trim() || "otto"
|
|
347
|
+
: process.env.OTTO_WATCH_LABEL?.trim() || "otto";
|
|
340
348
|
const watchStatus = watch
|
|
341
349
|
? `on (every ${watchIntervalSec ?? 300}s, label "${watchLabel}")`
|
|
342
350
|
: "off";
|
|
343
|
-
|
|
351
|
+
// GitHub refs are numbers (rendered `#42`); Linear refs are already-canonical
|
|
352
|
+
// strings (`ENG-123` / UUID) and stand alone.
|
|
353
|
+
const issueStatus = issue == null ? "off" : typeof issue === "number" ? `#${issue}` : issue;
|
|
344
354
|
const branchStatus = `${branchStrategy ?? "current"} (prefix "${branchPrefix ?? "otto/"}")`;
|
|
345
355
|
process.stdout.write(`[${bin}] resolved config
|
|
346
356
|
version ${bin} ${cli} (core ${core})
|
package/dist/cli-help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export { runAfk } from "./main.js";
|
|
2
2
|
export { runGhAfk } from "./gh-main.js";
|
|
3
|
+
export { runLinearAfk, type RunLinearAfkOptions } from "./linear-main.js";
|
|
3
4
|
export { runLoop, type LoopOptions, type LoopOutcome } from "./loop.js";
|
|
4
5
|
export { STAGES, type Stage } from "./stages.js";
|
|
5
6
|
export { renderTemplate, type RenderOptions, type RenderVars, } from "./render.js";
|
|
6
7
|
export { runStage, type StageResult } from "./runner.js";
|
|
7
|
-
export { runWatch, type RunWatchOptions } from "./watch.js";
|
|
8
|
+
export { runWatch, pollOpenIssues, pollLinearIssues, type RunWatchOptions, type PollResult, type WatchProvider, type LinearPollDeps, } from "./watch.js";
|
|
8
9
|
export { runPreflight, whichBin, type PreflightResult, type PreflightProbes, } from "./preflight.js";
|
|
10
|
+
export { parseLinearRef, parseLinearIssueArg, resolveLinearAuth, resolveDoneState, linearConfigPath, createLinearClient, LinearApiError, type LinearRef, type LinearAuth, type LinearAuthDeps, type LinearClient, type LinearClientDeps, type LinearViewer, type LinearIssueSummary, type LinearIssueDetail, type LinearComment, type LinearWorkflowState, type DoneStateResolution, type LinearErrorKind, } from "./linear-api.js";
|
|
11
|
+
export { runLinearAuth, defaultLinearAuthDeps, type LinearAuthCliDeps, } from "./linear-auth.js";
|
|
12
|
+
export { runLinear, defaultLinearCliDeps, type LinearCliDeps, } from "./linear-cli.js";
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,KAAK,aAAa,GACnB,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export { runAfk } from "./main.js";
|
|
2
2
|
export { runGhAfk } from "./gh-main.js";
|
|
3
|
+
export { runLinearAfk } from "./linear-main.js";
|
|
3
4
|
export { runLoop } from "./loop.js";
|
|
4
5
|
export { STAGES } from "./stages.js";
|
|
5
6
|
export { renderTemplate, } from "./render.js";
|
|
6
7
|
export { runStage } from "./runner.js";
|
|
7
|
-
export { runWatch } from "./watch.js";
|
|
8
|
+
export { runWatch, pollOpenIssues, pollLinearIssues, } from "./watch.js";
|
|
8
9
|
export { runPreflight, whichBin, } from "./preflight.js";
|
|
10
|
+
export { parseLinearRef, parseLinearIssueArg, resolveLinearAuth, resolveDoneState, linearConfigPath, createLinearClient, LinearApiError, } from "./linear-api.js";
|
|
11
|
+
export { runLinearAuth, defaultLinearAuthDeps, } from "./linear-auth.js";
|
|
12
|
+
export { runLinear, defaultLinearCliDeps, } from "./linear-cli.js";
|
|
9
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,OAAO,EAAsC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAoB,MAAM,aAAa,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAsC,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAoB,MAAM,aAAa,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,YAAY,EACZ,QAAQ,GAGT,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GAaf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,oBAAoB,GAErB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A normalized Linear issue reference. Discriminated so callers know whether to
|
|
3
|
+
* query Linear by its human identifier (`ENG-123`) or by the issue UUID.
|
|
4
|
+
*/
|
|
5
|
+
export type LinearRef = {
|
|
6
|
+
kind: "identifier";
|
|
7
|
+
identifier: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "uuid";
|
|
10
|
+
uuid: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Normalize a user-supplied Linear issue reference to a {@link LinearRef}.
|
|
14
|
+
* Accepts a Linear identifier (`ENG-123`), an issue UUID, or a Linear issue
|
|
15
|
+
* URL (`https://linear.app/acme/issue/ENG-123/slug`). Team keys are uppercased
|
|
16
|
+
* to Linear's canonical form; UUIDs are lowercased. Throws on anything else.
|
|
17
|
+
*
|
|
18
|
+
* SECURITY: like {@link parseIssueRef} in cli-help.ts, the normalized value is
|
|
19
|
+
* the only part of a ref that may reach a shell (via a static template command
|
|
20
|
+
* reading an env var). The identifier/UUID regexes admit only `[A-Za-z0-9-]`,
|
|
21
|
+
* so a value like `$(rm -rf ~)` can never survive parsing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseLinearRef(raw: string): LinearRef;
|
|
24
|
+
/**
|
|
25
|
+
* Parse + canonicalize a `--issue` value to the single shell-safe string Otto
|
|
26
|
+
* exports as `OTTO_ISSUE` for the Linear single-issue template. Identifiers are
|
|
27
|
+
* uppercased, UUIDs lowercased; both admit only `[A-Za-z0-9-]`, so the result is
|
|
28
|
+
* safe to interpolate into the static `otto-linear view "$OTTO_ISSUE"` command.
|
|
29
|
+
* Throws (via {@link parseLinearRef}) on anything malformed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseLinearIssueArg(raw: string): string;
|
|
32
|
+
/** A resolved Linear credential plus where it came from (for `--print-config`). */
|
|
33
|
+
export type LinearAuth = {
|
|
34
|
+
token: string;
|
|
35
|
+
source: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Injectable env/fs so {@link resolveLinearAuth} stays pure and unit-testable
|
|
39
|
+
* without real env vars or a real home dir. Mirrors {@link PreflightProbes}.
|
|
40
|
+
*/
|
|
41
|
+
export type LinearAuthDeps = {
|
|
42
|
+
env: NodeJS.ProcessEnv;
|
|
43
|
+
/** Read a file's contents, or null if it is absent/unreadable. */
|
|
44
|
+
readFile: (path: string) => string | null;
|
|
45
|
+
/** Home directory holding the credential file. */
|
|
46
|
+
home: string;
|
|
47
|
+
};
|
|
48
|
+
/** Canonical location of the stored Linear API key (outside any repo). */
|
|
49
|
+
export declare function linearConfigPath(home: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a Linear API key with precedence `OTTO_LINEAR_API_KEY` →
|
|
52
|
+
* `LINEAR_API_KEY` → `~/.config/otto/linear.json` (`{ "type": "apiKey",
|
|
53
|
+
* "token": "..." }`). Returns the token and its source, or null when no source
|
|
54
|
+
* yields a usable (non-empty) token. The config shape is kept extensible for a
|
|
55
|
+
* future OAuth `type`.
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveLinearAuth(deps?: LinearAuthDeps): LinearAuth | null;
|
|
58
|
+
/**
|
|
59
|
+
* Why a Linear API call failed, so callers (notably watch-mode polling) can
|
|
60
|
+
* distinguish a bad/missing credential from a transient network blip or a
|
|
61
|
+
* malformed request. `auth` is surfaced specially by `--print-config`/`--watch`.
|
|
62
|
+
*/
|
|
63
|
+
export type LinearErrorKind = "auth" | "request" | "network";
|
|
64
|
+
/** A typed Linear API failure carrying a {@link LinearErrorKind}. */
|
|
65
|
+
export declare class LinearApiError extends Error {
|
|
66
|
+
readonly kind: LinearErrorKind;
|
|
67
|
+
readonly status?: number;
|
|
68
|
+
constructor(message: string, kind: LinearErrorKind, status?: number);
|
|
69
|
+
}
|
|
70
|
+
/** Minimal viewer identity returned by {@link LinearClient.whoami}. */
|
|
71
|
+
export type LinearViewer = {
|
|
72
|
+
id: string;
|
|
73
|
+
name: string;
|
|
74
|
+
email: string;
|
|
75
|
+
};
|
|
76
|
+
/** A labelled open issue as returned by {@link LinearClient.listIssues}. */
|
|
77
|
+
export type LinearIssueSummary = {
|
|
78
|
+
id: string;
|
|
79
|
+
identifier: string;
|
|
80
|
+
title: string;
|
|
81
|
+
url: string;
|
|
82
|
+
/** Workflow state name (e.g. "Todo"). */
|
|
83
|
+
state: string;
|
|
84
|
+
};
|
|
85
|
+
/** One comment on an issue (author name flattened, never null). */
|
|
86
|
+
export type LinearComment = {
|
|
87
|
+
author: string;
|
|
88
|
+
body: string;
|
|
89
|
+
createdAt: string;
|
|
90
|
+
};
|
|
91
|
+
/** Full issue detail returned by {@link LinearClient.viewIssue}. */
|
|
92
|
+
export type LinearIssueDetail = LinearIssueSummary & {
|
|
93
|
+
description: string;
|
|
94
|
+
comments: LinearComment[];
|
|
95
|
+
};
|
|
96
|
+
/** A team's workflow state (column), with its category `type` and ordering. */
|
|
97
|
+
export type LinearWorkflowState = {
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
/** Workflow category: "completed", "started", "unstarted", "canceled", … */
|
|
101
|
+
type: string;
|
|
102
|
+
/** Ordering within the team's workflow; lower = earlier. */
|
|
103
|
+
position: number;
|
|
104
|
+
};
|
|
105
|
+
export type LinearClientDeps = {
|
|
106
|
+
token: string;
|
|
107
|
+
/** Injectable for tests; defaults to the global `fetch` (Node 20+). */
|
|
108
|
+
fetch?: typeof fetch;
|
|
109
|
+
/** Overridable endpoint (tests/self-hosting); defaults to Linear's API. */
|
|
110
|
+
endpoint?: string;
|
|
111
|
+
};
|
|
112
|
+
/** Narrow set of Linear GraphQL operations Otto needs. */
|
|
113
|
+
export type LinearClient = {
|
|
114
|
+
whoami(): Promise<LinearViewer>;
|
|
115
|
+
listIssues(opts: {
|
|
116
|
+
label: string;
|
|
117
|
+
team?: string;
|
|
118
|
+
limit: number;
|
|
119
|
+
}): Promise<LinearIssueSummary[]>;
|
|
120
|
+
viewIssue(ref: LinearRef): Promise<LinearIssueDetail>;
|
|
121
|
+
addComment(issueId: string, body: string): Promise<{
|
|
122
|
+
id: string;
|
|
123
|
+
}>;
|
|
124
|
+
listWorkflowStates(team: string): Promise<LinearWorkflowState[]>;
|
|
125
|
+
moveToDone(issueId: string, stateId: string): Promise<{
|
|
126
|
+
id: string;
|
|
127
|
+
state: string;
|
|
128
|
+
}>;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Build a Linear GraphQL client bound to one API key. Each method issues a
|
|
132
|
+
* single GraphQL request over injectable `fetch`, authenticating with the
|
|
133
|
+
* personal-API-key scheme (`Authorization: <key>`, no `Bearer`). Failures throw
|
|
134
|
+
* a {@link LinearApiError} classified as `auth`/`request`/`network`.
|
|
135
|
+
*
|
|
136
|
+
* Ref→id resolution beyond {@link viewIssue} (e.g. resolving a done-state id)
|
|
137
|
+
* is intentionally left to higher layers; these ops stay thin and 1:1 with the
|
|
138
|
+
* underlying GraphQL operations so they are trivial to mock and reason about.
|
|
139
|
+
*/
|
|
140
|
+
export declare function createLinearClient(deps: LinearClientDeps): LinearClient;
|
|
141
|
+
/** Outcome of resolving the target "done" workflow state for an issue's team. */
|
|
142
|
+
export type DoneStateResolution = {
|
|
143
|
+
kind: "resolved";
|
|
144
|
+
state: LinearWorkflowState;
|
|
145
|
+
} | {
|
|
146
|
+
kind: "ambiguous";
|
|
147
|
+
reason: string;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Resolve which workflow state a completed issue should move to, given a team's
|
|
151
|
+
* states and an optional preferred state name (`OTTO_LINEAR_DONE_STATE`):
|
|
152
|
+
*
|
|
153
|
+
* 1. If `preferredName` is set, the state whose name matches it
|
|
154
|
+
* (case-insensitively) wins; if none matches the result is `ambiguous` — we
|
|
155
|
+
* never silently pick a different state than the user named.
|
|
156
|
+
* 2. Otherwise the first `type: "completed"` state by ascending `position`.
|
|
157
|
+
* 3. If neither yields a state the result is `ambiguous`; callers should
|
|
158
|
+
* comment on the issue and leave a human to move it rather than guess.
|
|
159
|
+
*/
|
|
160
|
+
export declare function resolveDoneState(states: LinearWorkflowState[], preferredName?: string): DoneStateResolution;
|
|
161
|
+
//# sourceMappingURL=linear-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-api.d.ts","sourceRoot":"","sources":["../src/linear-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
// A Linear issue identifier: team key (letter then letters/digits) + "-" +
|
|
5
|
+
// positive number (no leading zero — mirrors parseIssueRef strictness).
|
|
6
|
+
const IDENTIFIER_RE = /^[A-Za-z][A-Za-z0-9]*-[1-9]\d*$/;
|
|
7
|
+
// Issue UUID (RFC-4122 shape; we don't validate the version nibble).
|
|
8
|
+
const UUID_RE = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
9
|
+
// `linear.app/<workspace>/issue/<IDENTIFIER>[/<slug>...]` — the identifier is
|
|
10
|
+
// the path segment after `/issue/`.
|
|
11
|
+
const URL_IDENTIFIER_RE = /\/issue\/([A-Za-z][A-Za-z0-9]*-[1-9]\d*)(?:[/?#]|$)/;
|
|
12
|
+
/**
|
|
13
|
+
* Normalize a user-supplied Linear issue reference to a {@link LinearRef}.
|
|
14
|
+
* Accepts a Linear identifier (`ENG-123`), an issue UUID, or a Linear issue
|
|
15
|
+
* URL (`https://linear.app/acme/issue/ENG-123/slug`). Team keys are uppercased
|
|
16
|
+
* to Linear's canonical form; UUIDs are lowercased. Throws on anything else.
|
|
17
|
+
*
|
|
18
|
+
* SECURITY: like {@link parseIssueRef} in cli-help.ts, the normalized value is
|
|
19
|
+
* the only part of a ref that may reach a shell (via a static template command
|
|
20
|
+
* reading an env var). The identifier/UUID regexes admit only `[A-Za-z0-9-]`,
|
|
21
|
+
* so a value like `$(rm -rf ~)` can never survive parsing.
|
|
22
|
+
*/
|
|
23
|
+
export function parseLinearRef(raw) {
|
|
24
|
+
const s = raw.trim();
|
|
25
|
+
const urlMatch = s.match(URL_IDENTIFIER_RE);
|
|
26
|
+
if (urlMatch) {
|
|
27
|
+
return { kind: "identifier", identifier: urlMatch[1].toUpperCase() };
|
|
28
|
+
}
|
|
29
|
+
if (UUID_RE.test(s)) {
|
|
30
|
+
return { kind: "uuid", uuid: s.toLowerCase() };
|
|
31
|
+
}
|
|
32
|
+
if (IDENTIFIER_RE.test(s)) {
|
|
33
|
+
return { kind: "identifier", identifier: s.toUpperCase() };
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`--issue must be a Linear identifier (ENG-123), an issue UUID, or a Linear issue URL, got: ${JSON.stringify(raw)}`);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse + canonicalize a `--issue` value to the single shell-safe string Otto
|
|
39
|
+
* exports as `OTTO_ISSUE` for the Linear single-issue template. Identifiers are
|
|
40
|
+
* uppercased, UUIDs lowercased; both admit only `[A-Za-z0-9-]`, so the result is
|
|
41
|
+
* safe to interpolate into the static `otto-linear view "$OTTO_ISSUE"` command.
|
|
42
|
+
* Throws (via {@link parseLinearRef}) on anything malformed.
|
|
43
|
+
*/
|
|
44
|
+
export function parseLinearIssueArg(raw) {
|
|
45
|
+
const ref = parseLinearRef(raw);
|
|
46
|
+
return ref.kind === "uuid" ? ref.uuid : ref.identifier;
|
|
47
|
+
}
|
|
48
|
+
/** Canonical location of the stored Linear API key (outside any repo). */
|
|
49
|
+
export function linearConfigPath(home) {
|
|
50
|
+
return join(home, ".config", "otto", "linear.json");
|
|
51
|
+
}
|
|
52
|
+
const defaultAuthDeps = {
|
|
53
|
+
env: process.env,
|
|
54
|
+
readFile: (p) => {
|
|
55
|
+
try {
|
|
56
|
+
return readFileSync(p, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
home: homedir(),
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Resolve a Linear API key with precedence `OTTO_LINEAR_API_KEY` →
|
|
66
|
+
* `LINEAR_API_KEY` → `~/.config/otto/linear.json` (`{ "type": "apiKey",
|
|
67
|
+
* "token": "..." }`). Returns the token and its source, or null when no source
|
|
68
|
+
* yields a usable (non-empty) token. The config shape is kept extensible for a
|
|
69
|
+
* future OAuth `type`.
|
|
70
|
+
*/
|
|
71
|
+
export function resolveLinearAuth(deps = defaultAuthDeps) {
|
|
72
|
+
const { env, readFile, home } = deps;
|
|
73
|
+
for (const name of ["OTTO_LINEAR_API_KEY", "LINEAR_API_KEY"]) {
|
|
74
|
+
const token = env[name]?.trim();
|
|
75
|
+
if (token)
|
|
76
|
+
return { token, source: name };
|
|
77
|
+
}
|
|
78
|
+
const path = linearConfigPath(home);
|
|
79
|
+
const raw = readFile(path);
|
|
80
|
+
if (raw != null) {
|
|
81
|
+
try {
|
|
82
|
+
const token = JSON.parse(raw).token;
|
|
83
|
+
if (typeof token === "string" && token.trim()) {
|
|
84
|
+
return { token: token.trim(), source: path };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// malformed config → no credential from this source
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// GraphQL client
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/** Linear's GraphQL endpoint. */
|
|
97
|
+
const LINEAR_ENDPOINT = "https://api.linear.app/graphql";
|
|
98
|
+
/** A typed Linear API failure carrying a {@link LinearErrorKind}. */
|
|
99
|
+
export class LinearApiError extends Error {
|
|
100
|
+
kind;
|
|
101
|
+
status;
|
|
102
|
+
constructor(message, kind, status) {
|
|
103
|
+
super(message);
|
|
104
|
+
this.name = "LinearApiError";
|
|
105
|
+
this.kind = kind;
|
|
106
|
+
this.status = status;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function isAuthError(status, errors) {
|
|
110
|
+
if (status === 401 || status === 403)
|
|
111
|
+
return true;
|
|
112
|
+
return errors.some((e) => /authenticat/i.test(e?.message ?? "") ||
|
|
113
|
+
/^AUTHENTICATION/i.test(e?.extensions?.code ?? ""));
|
|
114
|
+
}
|
|
115
|
+
const ISSUE_FIELDS = `id identifier title url description state { name type }`;
|
|
116
|
+
const COMMENT_FIELDS = `comments { nodes { body createdAt user { name } } }`;
|
|
117
|
+
function mapDetail(raw) {
|
|
118
|
+
return {
|
|
119
|
+
id: raw.id,
|
|
120
|
+
identifier: raw.identifier,
|
|
121
|
+
title: raw.title,
|
|
122
|
+
url: raw.url,
|
|
123
|
+
description: raw.description ?? "",
|
|
124
|
+
state: raw.state.name,
|
|
125
|
+
comments: (raw.comments?.nodes ?? []).map((c) => ({
|
|
126
|
+
author: c.user?.name ?? "unknown",
|
|
127
|
+
body: c.body,
|
|
128
|
+
createdAt: c.createdAt,
|
|
129
|
+
})),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build a Linear GraphQL client bound to one API key. Each method issues a
|
|
134
|
+
* single GraphQL request over injectable `fetch`, authenticating with the
|
|
135
|
+
* personal-API-key scheme (`Authorization: <key>`, no `Bearer`). Failures throw
|
|
136
|
+
* a {@link LinearApiError} classified as `auth`/`request`/`network`.
|
|
137
|
+
*
|
|
138
|
+
* Ref→id resolution beyond {@link viewIssue} (e.g. resolving a done-state id)
|
|
139
|
+
* is intentionally left to higher layers; these ops stay thin and 1:1 with the
|
|
140
|
+
* underlying GraphQL operations so they are trivial to mock and reason about.
|
|
141
|
+
*/
|
|
142
|
+
export function createLinearClient(deps) {
|
|
143
|
+
const fetchImpl = deps.fetch ?? fetch;
|
|
144
|
+
const endpoint = deps.endpoint ?? LINEAR_ENDPOINT;
|
|
145
|
+
const token = deps.token;
|
|
146
|
+
async function request(query, variables) {
|
|
147
|
+
let res;
|
|
148
|
+
try {
|
|
149
|
+
res = await fetchImpl(endpoint, {
|
|
150
|
+
method: "POST",
|
|
151
|
+
headers: {
|
|
152
|
+
"content-type": "application/json",
|
|
153
|
+
authorization: token,
|
|
154
|
+
},
|
|
155
|
+
body: JSON.stringify({ query, variables }),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
throw new LinearApiError(`Linear request failed: ${e.message}`, "network");
|
|
160
|
+
}
|
|
161
|
+
let json;
|
|
162
|
+
try {
|
|
163
|
+
json = (await res.json());
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
json = undefined;
|
|
167
|
+
}
|
|
168
|
+
const errors = json?.errors ?? [];
|
|
169
|
+
if (!res.ok || errors.length > 0) {
|
|
170
|
+
const kind = isAuthError(res.status, errors) ? "auth" : "request";
|
|
171
|
+
const msg = errors[0]?.message ?? `HTTP ${res.status}`;
|
|
172
|
+
throw new LinearApiError(`Linear GraphQL error: ${msg}`, kind, res.status);
|
|
173
|
+
}
|
|
174
|
+
return json.data;
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
async whoami() {
|
|
178
|
+
const data = await request(`query { viewer { id name email } }`, {});
|
|
179
|
+
return data.viewer;
|
|
180
|
+
},
|
|
181
|
+
async listIssues({ label, team, limit }) {
|
|
182
|
+
const filter = {
|
|
183
|
+
labels: { some: { name: { eq: label } } },
|
|
184
|
+
state: { type: { nin: ["completed", "canceled"] } },
|
|
185
|
+
};
|
|
186
|
+
if (team)
|
|
187
|
+
filter.team = { key: { eq: team } };
|
|
188
|
+
const data = await request(`query ListIssues($filter: IssueFilter!, $first: Int!) {
|
|
189
|
+
issues(filter: $filter, first: $first) {
|
|
190
|
+
nodes { id identifier title url state { name type } }
|
|
191
|
+
}
|
|
192
|
+
}`, { filter, first: limit });
|
|
193
|
+
return data.issues.nodes.map((n) => ({
|
|
194
|
+
id: n.id,
|
|
195
|
+
identifier: n.identifier,
|
|
196
|
+
title: n.title,
|
|
197
|
+
url: n.url,
|
|
198
|
+
state: n.state.name,
|
|
199
|
+
}));
|
|
200
|
+
},
|
|
201
|
+
async viewIssue(ref) {
|
|
202
|
+
if (ref.kind === "uuid") {
|
|
203
|
+
const data = await request(`query ViewIssue($id: String!) {
|
|
204
|
+
issue(id: $id) { ${ISSUE_FIELDS} ${COMMENT_FIELDS} }
|
|
205
|
+
}`, { id: ref.uuid });
|
|
206
|
+
if (!data.issue) {
|
|
207
|
+
throw new LinearApiError(`Linear issue not found: ${ref.uuid}`, "request");
|
|
208
|
+
}
|
|
209
|
+
return mapDetail(data.issue);
|
|
210
|
+
}
|
|
211
|
+
const [, team, num] = ref.identifier.match(/^([A-Za-z][A-Za-z0-9]*)-([1-9]\d*)$/);
|
|
212
|
+
const data = await request(`query FindIssue($team: String!, $number: Float!) {
|
|
213
|
+
issues(filter: { team: { key: { eq: $team } }, number: { eq: $number } }, first: 1) {
|
|
214
|
+
nodes { ${ISSUE_FIELDS} ${COMMENT_FIELDS} }
|
|
215
|
+
}
|
|
216
|
+
}`, { team, number: Number(num) });
|
|
217
|
+
const node = data.issues.nodes[0];
|
|
218
|
+
if (!node) {
|
|
219
|
+
throw new LinearApiError(`Linear issue not found: ${ref.identifier}`, "request");
|
|
220
|
+
}
|
|
221
|
+
return mapDetail(node);
|
|
222
|
+
},
|
|
223
|
+
async addComment(issueId, body) {
|
|
224
|
+
const data = await request(`mutation AddComment($issueId: String!, $body: String!) {
|
|
225
|
+
commentCreate(input: { issueId: $issueId, body: $body }) {
|
|
226
|
+
success comment { id }
|
|
227
|
+
}
|
|
228
|
+
}`, { issueId, body });
|
|
229
|
+
return { id: data.commentCreate.comment.id };
|
|
230
|
+
},
|
|
231
|
+
async listWorkflowStates(team) {
|
|
232
|
+
const data = await request(`query WorkflowStates($team: String!) {
|
|
233
|
+
workflowStates(filter: { team: { key: { eq: $team } } }, first: 100) {
|
|
234
|
+
nodes { id name type position }
|
|
235
|
+
}
|
|
236
|
+
}`, { team });
|
|
237
|
+
return data.workflowStates.nodes.map((n) => ({
|
|
238
|
+
id: n.id,
|
|
239
|
+
name: n.name,
|
|
240
|
+
type: n.type,
|
|
241
|
+
position: n.position,
|
|
242
|
+
}));
|
|
243
|
+
},
|
|
244
|
+
async moveToDone(issueId, stateId) {
|
|
245
|
+
const data = await request(`mutation MoveToDone($id: String!, $stateId: String!) {
|
|
246
|
+
issueUpdate(id: $id, input: { stateId: $stateId }) {
|
|
247
|
+
success issue { id state { name type } }
|
|
248
|
+
}
|
|
249
|
+
}`, { id: issueId, stateId });
|
|
250
|
+
return { id: data.issueUpdate.issue.id, state: data.issueUpdate.issue.state.name };
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Resolve which workflow state a completed issue should move to, given a team's
|
|
256
|
+
* states and an optional preferred state name (`OTTO_LINEAR_DONE_STATE`):
|
|
257
|
+
*
|
|
258
|
+
* 1. If `preferredName` is set, the state whose name matches it
|
|
259
|
+
* (case-insensitively) wins; if none matches the result is `ambiguous` — we
|
|
260
|
+
* never silently pick a different state than the user named.
|
|
261
|
+
* 2. Otherwise the first `type: "completed"` state by ascending `position`.
|
|
262
|
+
* 3. If neither yields a state the result is `ambiguous`; callers should
|
|
263
|
+
* comment on the issue and leave a human to move it rather than guess.
|
|
264
|
+
*/
|
|
265
|
+
export function resolveDoneState(states, preferredName) {
|
|
266
|
+
const wanted = preferredName?.trim();
|
|
267
|
+
if (wanted) {
|
|
268
|
+
const match = states.find((s) => s.name.toLowerCase() === wanted.toLowerCase());
|
|
269
|
+
if (match)
|
|
270
|
+
return { kind: "resolved", state: match };
|
|
271
|
+
const names = states.map((s) => s.name).join(", ") || "none";
|
|
272
|
+
return {
|
|
273
|
+
kind: "ambiguous",
|
|
274
|
+
reason: `no workflow state named "${wanted}" (have: ${names})`,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const completed = states
|
|
278
|
+
.filter((s) => s.type === "completed")
|
|
279
|
+
.sort((a, b) => a.position - b.position);
|
|
280
|
+
if (completed.length === 0) {
|
|
281
|
+
return {
|
|
282
|
+
kind: "ambiguous",
|
|
283
|
+
reason: 'no workflow state of type "completed"',
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
return { kind: "resolved", state: completed[0] };
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=linear-api.js.map
|