@elnora-ai/linear 1.0.1 → 1.1.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.
Files changed (299) hide show
  1. package/.claude-plugin/marketplace.json +7 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +13 -1
  4. package/README.md +116 -26
  5. package/agents/linear-issue-creator.md +129 -17
  6. package/agents/linear-issue-reviewer.md +122 -23
  7. package/agents/linear-issue-updater.md +137 -25
  8. package/agents/linear-state-curator.md +173 -0
  9. package/agents/linear-url-to-issues.md +189 -26
  10. package/commands/linear-cleanup.md +64 -29
  11. package/dist/cli.js +64 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/client/auth.d.ts.map +1 -1
  14. package/dist/client/auth.js +13 -2
  15. package/dist/client/auth.js.map +1 -1
  16. package/dist/client/linear-client.d.ts +7 -0
  17. package/dist/client/linear-client.d.ts.map +1 -1
  18. package/dist/client/linear-client.js +13 -1
  19. package/dist/client/linear-client.js.map +1 -1
  20. package/dist/commands/agent-activities.d.ts +3 -0
  21. package/dist/commands/agent-activities.d.ts.map +1 -0
  22. package/dist/commands/agent-activities.js +144 -0
  23. package/dist/commands/agent-activities.js.map +1 -0
  24. package/dist/commands/agent-sessions.d.ts +3 -0
  25. package/dist/commands/agent-sessions.d.ts.map +1 -0
  26. package/dist/commands/agent-sessions.js +132 -0
  27. package/dist/commands/agent-sessions.js.map +1 -0
  28. package/dist/commands/attachments.d.ts +3 -0
  29. package/dist/commands/attachments.d.ts.map +1 -0
  30. package/dist/commands/attachments.js +265 -0
  31. package/dist/commands/attachments.js.map +1 -0
  32. package/dist/commands/audit.d.ts +3 -0
  33. package/dist/commands/audit.d.ts.map +1 -0
  34. package/dist/commands/audit.js +73 -0
  35. package/dist/commands/audit.js.map +1 -0
  36. package/dist/commands/comments.d.ts +3 -0
  37. package/dist/commands/comments.d.ts.map +1 -0
  38. package/dist/commands/comments.js +107 -0
  39. package/dist/commands/comments.js.map +1 -0
  40. package/dist/commands/completion.d.ts +3 -0
  41. package/dist/commands/completion.d.ts.map +1 -0
  42. package/dist/commands/completion.js +62 -0
  43. package/dist/commands/completion.js.map +1 -0
  44. package/dist/commands/context.d.ts +3 -0
  45. package/dist/commands/context.d.ts.map +1 -0
  46. package/dist/commands/context.js +94 -0
  47. package/dist/commands/context.js.map +1 -0
  48. package/dist/commands/curator.d.ts +14 -0
  49. package/dist/commands/curator.d.ts.map +1 -1
  50. package/dist/commands/curator.js +97 -19
  51. package/dist/commands/curator.js.map +1 -1
  52. package/dist/commands/customer-needs.d.ts +3 -0
  53. package/dist/commands/customer-needs.d.ts.map +1 -0
  54. package/dist/commands/customer-needs.js +198 -0
  55. package/dist/commands/customer-needs.js.map +1 -0
  56. package/dist/commands/customers.d.ts +5 -0
  57. package/dist/commands/customers.d.ts.map +1 -0
  58. package/dist/commands/customers.js +201 -0
  59. package/dist/commands/customers.js.map +1 -0
  60. package/dist/commands/cycles.d.ts +3 -0
  61. package/dist/commands/cycles.d.ts.map +1 -0
  62. package/dist/commands/cycles.js +67 -0
  63. package/dist/commands/cycles.js.map +1 -0
  64. package/dist/commands/documents.d.ts +3 -0
  65. package/dist/commands/documents.d.ts.map +1 -0
  66. package/dist/commands/documents.js +105 -0
  67. package/dist/commands/documents.js.map +1 -0
  68. package/dist/commands/favorites.d.ts +3 -0
  69. package/dist/commands/favorites.d.ts.map +1 -0
  70. package/dist/commands/favorites.js +101 -0
  71. package/dist/commands/favorites.js.map +1 -0
  72. package/dist/commands/index.d.ts +30 -0
  73. package/dist/commands/index.d.ts.map +1 -1
  74. package/dist/commands/index.js +30 -0
  75. package/dist/commands/index.js.map +1 -1
  76. package/dist/commands/initiatives.d.ts +3 -0
  77. package/dist/commands/initiatives.d.ts.map +1 -0
  78. package/dist/commands/initiatives.js +106 -0
  79. package/dist/commands/initiatives.js.map +1 -0
  80. package/dist/commands/issues.d.ts +21 -0
  81. package/dist/commands/issues.d.ts.map +1 -0
  82. package/dist/commands/issues.js +993 -0
  83. package/dist/commands/issues.js.map +1 -0
  84. package/dist/commands/labels.d.ts +3 -0
  85. package/dist/commands/labels.d.ts.map +1 -0
  86. package/dist/commands/labels.js +111 -0
  87. package/dist/commands/labels.js.map +1 -0
  88. package/dist/commands/milestones.d.ts +3 -0
  89. package/dist/commands/milestones.d.ts.map +1 -0
  90. package/dist/commands/milestones.js +94 -0
  91. package/dist/commands/milestones.js.map +1 -0
  92. package/dist/commands/notifications.d.ts +3 -0
  93. package/dist/commands/notifications.d.ts.map +1 -0
  94. package/dist/commands/notifications.js +130 -0
  95. package/dist/commands/notifications.js.map +1 -0
  96. package/dist/commands/project-labels.d.ts +3 -0
  97. package/dist/commands/project-labels.d.ts.map +1 -0
  98. package/dist/commands/project-labels.js +80 -0
  99. package/dist/commands/project-labels.js.map +1 -0
  100. package/dist/commands/project-relations.d.ts +3 -0
  101. package/dist/commands/project-relations.d.ts.map +1 -0
  102. package/dist/commands/project-relations.js +96 -0
  103. package/dist/commands/project-relations.js.map +1 -0
  104. package/dist/commands/projects.d.ts +3 -0
  105. package/dist/commands/projects.d.ts.map +1 -0
  106. package/dist/commands/projects.js +263 -0
  107. package/dist/commands/projects.js.map +1 -0
  108. package/dist/commands/quota.d.ts +3 -0
  109. package/dist/commands/quota.d.ts.map +1 -0
  110. package/dist/commands/quota.js +28 -0
  111. package/dist/commands/quota.js.map +1 -0
  112. package/dist/commands/reactions.d.ts +7 -0
  113. package/dist/commands/reactions.d.ts.map +1 -0
  114. package/dist/commands/reactions.js +53 -0
  115. package/dist/commands/reactions.js.map +1 -0
  116. package/dist/commands/relations.d.ts +3 -0
  117. package/dist/commands/relations.d.ts.map +1 -0
  118. package/dist/commands/relations.js +73 -0
  119. package/dist/commands/relations.js.map +1 -0
  120. package/dist/commands/states.d.ts +3 -0
  121. package/dist/commands/states.d.ts.map +1 -0
  122. package/dist/commands/states.js +52 -0
  123. package/dist/commands/states.js.map +1 -0
  124. package/dist/commands/status-updates.d.ts +3 -0
  125. package/dist/commands/status-updates.d.ts.map +1 -0
  126. package/dist/commands/status-updates.js +117 -0
  127. package/dist/commands/status-updates.js.map +1 -0
  128. package/dist/commands/sync.d.ts.map +1 -1
  129. package/dist/commands/sync.js +58 -18
  130. package/dist/commands/sync.js.map +1 -1
  131. package/dist/commands/teams.d.ts +3 -0
  132. package/dist/commands/teams.d.ts.map +1 -0
  133. package/dist/commands/teams.js +135 -0
  134. package/dist/commands/teams.js.map +1 -0
  135. package/dist/commands/templates.d.ts +3 -0
  136. package/dist/commands/templates.d.ts.map +1 -0
  137. package/dist/commands/templates.js +76 -0
  138. package/dist/commands/templates.js.map +1 -0
  139. package/dist/commands/users.d.ts +3 -0
  140. package/dist/commands/users.d.ts.map +1 -0
  141. package/dist/commands/users.js +40 -0
  142. package/dist/commands/users.js.map +1 -0
  143. package/dist/commands/views.d.ts +3 -0
  144. package/dist/commands/views.d.ts.map +1 -0
  145. package/dist/commands/views.js +177 -0
  146. package/dist/commands/views.js.map +1 -0
  147. package/dist/commands/webhooks.d.ts +3 -0
  148. package/dist/commands/webhooks.d.ts.map +1 -0
  149. package/dist/commands/webhooks.js +234 -0
  150. package/dist/commands/webhooks.js.map +1 -0
  151. package/dist/config/loader.d.ts.map +1 -1
  152. package/dist/config/loader.js +3 -0
  153. package/dist/config/loader.js.map +1 -1
  154. package/dist/config/types.d.ts +15 -1
  155. package/dist/config/types.d.ts.map +1 -1
  156. package/dist/config/types.js +1 -0
  157. package/dist/config/types.js.map +1 -1
  158. package/dist/curator/dispatch.d.ts +52 -0
  159. package/dist/curator/dispatch.d.ts.map +1 -0
  160. package/dist/curator/dispatch.js +144 -0
  161. package/dist/curator/dispatch.js.map +1 -0
  162. package/dist/curator/index.d.ts +5 -0
  163. package/dist/curator/index.d.ts.map +1 -0
  164. package/dist/curator/index.js +5 -0
  165. package/dist/curator/index.js.map +1 -0
  166. package/dist/curator/llm.d.ts +70 -0
  167. package/dist/curator/llm.d.ts.map +1 -0
  168. package/dist/curator/llm.js +107 -0
  169. package/dist/curator/llm.js.map +1 -0
  170. package/dist/curator/snapshot.d.ts +34 -0
  171. package/dist/curator/snapshot.d.ts.map +1 -0
  172. package/dist/curator/snapshot.js +127 -0
  173. package/dist/curator/snapshot.js.map +1 -0
  174. package/dist/curator/state.d.ts +50 -0
  175. package/dist/curator/state.d.ts.map +1 -0
  176. package/dist/curator/state.js +125 -0
  177. package/dist/curator/state.js.map +1 -0
  178. package/dist/lib/bulk-graphql.d.ts +144 -0
  179. package/dist/lib/bulk-graphql.d.ts.map +1 -0
  180. package/dist/lib/bulk-graphql.js +380 -0
  181. package/dist/lib/bulk-graphql.js.map +1 -0
  182. package/dist/lib/index.d.ts +2 -0
  183. package/dist/lib/index.d.ts.map +1 -0
  184. package/dist/lib/index.js +2 -0
  185. package/dist/lib/index.js.map +1 -0
  186. package/dist/output/cli.d.ts +17 -0
  187. package/dist/output/cli.d.ts.map +1 -0
  188. package/dist/output/cli.js +252 -0
  189. package/dist/output/cli.js.map +1 -0
  190. package/dist/output/formatter.d.ts +6 -0
  191. package/dist/output/formatter.d.ts.map +1 -1
  192. package/dist/output/formatter.js +10 -0
  193. package/dist/output/formatter.js.map +1 -1
  194. package/dist/output/index.d.ts +1 -0
  195. package/dist/output/index.d.ts.map +1 -1
  196. package/dist/output/index.js +1 -0
  197. package/dist/output/index.js.map +1 -1
  198. package/dist/scripts/sync-linear-templates.d.ts +26 -0
  199. package/dist/scripts/sync-linear-templates.d.ts.map +1 -0
  200. package/dist/scripts/sync-linear-templates.js +115 -0
  201. package/dist/scripts/sync-linear-templates.js.map +1 -0
  202. package/dist/signals/github-commits.d.ts +31 -0
  203. package/dist/signals/github-commits.d.ts.map +1 -0
  204. package/dist/signals/github-commits.js +127 -0
  205. package/dist/signals/github-commits.js.map +1 -0
  206. package/dist/signals/github-pr.d.ts +16 -0
  207. package/dist/signals/github-pr.d.ts.map +1 -0
  208. package/dist/signals/github-pr.js +98 -0
  209. package/dist/signals/github-pr.js.map +1 -0
  210. package/dist/signals/index.d.ts +4 -0
  211. package/dist/signals/index.d.ts.map +1 -1
  212. package/dist/signals/index.js +4 -0
  213. package/dist/signals/index.js.map +1 -1
  214. package/dist/signals/linear-issues.d.ts +20 -0
  215. package/dist/signals/linear-issues.d.ts.map +1 -0
  216. package/dist/signals/linear-issues.js +115 -0
  217. package/dist/signals/linear-issues.js.map +1 -0
  218. package/dist/signals/registry.d.ts +4 -3
  219. package/dist/signals/registry.d.ts.map +1 -1
  220. package/dist/signals/registry.js +33 -11
  221. package/dist/signals/registry.js.map +1 -1
  222. package/dist/signals/slack-messages.d.ts +20 -0
  223. package/dist/signals/slack-messages.d.ts.map +1 -0
  224. package/dist/signals/slack-messages.js +129 -0
  225. package/dist/signals/slack-messages.js.map +1 -0
  226. package/dist/utils/errors.d.ts +63 -0
  227. package/dist/utils/errors.d.ts.map +1 -0
  228. package/dist/utils/errors.js +94 -0
  229. package/dist/utils/errors.js.map +1 -0
  230. package/dist/utils/index.d.ts +9 -0
  231. package/dist/utils/index.d.ts.map +1 -0
  232. package/dist/utils/index.js +9 -0
  233. package/dist/utils/index.js.map +1 -0
  234. package/dist/utils/label-policy.d.ts +53 -0
  235. package/dist/utils/label-policy.d.ts.map +1 -0
  236. package/dist/utils/label-policy.js +93 -0
  237. package/dist/utils/label-policy.js.map +1 -0
  238. package/dist/utils/parse.d.ts +48 -0
  239. package/dist/utils/parse.d.ts.map +1 -0
  240. package/dist/utils/parse.js +133 -0
  241. package/dist/utils/parse.js.map +1 -0
  242. package/dist/utils/project-status.d.ts +6 -0
  243. package/dist/utils/project-status.d.ts.map +1 -0
  244. package/dist/utils/project-status.js +33 -0
  245. package/dist/utils/project-status.js.map +1 -0
  246. package/dist/utils/rate-limit.d.ts +24 -0
  247. package/dist/utils/rate-limit.d.ts.map +1 -0
  248. package/dist/utils/rate-limit.js +89 -0
  249. package/dist/utils/rate-limit.js.map +1 -0
  250. package/dist/utils/resolve.d.ts +84 -0
  251. package/dist/utils/resolve.d.ts.map +1 -0
  252. package/dist/utils/resolve.js +172 -0
  253. package/dist/utils/resolve.js.map +1 -0
  254. package/dist/utils/sleep.d.ts +2 -0
  255. package/dist/utils/sleep.d.ts.map +1 -0
  256. package/dist/utils/sleep.js +4 -0
  257. package/dist/utils/sleep.js.map +1 -0
  258. package/dist/utils/webhook-verify.d.ts +42 -0
  259. package/dist/utils/webhook-verify.d.ts.map +1 -0
  260. package/dist/utils/webhook-verify.js +65 -0
  261. package/dist/utils/webhook-verify.js.map +1 -0
  262. package/package.json +4 -1
  263. package/references/agent-description-template.md +31 -0
  264. package/references/cli-reference.md +227 -0
  265. package/references/curator-tiering-rules.md +76 -0
  266. package/references/label-policy.example.json +37 -0
  267. package/references/label-policy.placeholder.json +6 -0
  268. package/references/settings-template.md +30 -0
  269. package/references/sla-reference.md +70 -0
  270. package/references/template-index.md +34 -0
  271. package/references/workspace-labels.md +124 -0
  272. package/references/workspace-projects.md +56 -0
  273. package/references/workspace-routing.md +58 -0
  274. package/schemas/label-policy.json +72 -0
  275. package/skills/linear-workspace/SKILL.md +65 -4
  276. package/templates/ACC-PRO-provision.md +74 -0
  277. package/templates/ACC-PRV-privileged.md +66 -0
  278. package/templates/ACC-QTR-review.md +77 -0
  279. package/templates/ACC-REV-revoke.md +67 -0
  280. package/templates/AI-USE-capability.md +111 -0
  281. package/templates/AUD-CAP-corrective.md +89 -0
  282. package/templates/AUD-INT-internal.md +92 -0
  283. package/templates/AUD-MGT-management.md +110 -0
  284. package/templates/CHG-MAJ-major.md +110 -0
  285. package/templates/CHG-SIG-significant.md +83 -0
  286. package/templates/CHG-STD-standard.md +47 -0
  287. package/templates/LRN-DOC-lessons.md +75 -0
  288. package/templates/OPS-BCK-backup.md +99 -0
  289. package/templates/OPS-DAT-data-mod.md +98 -0
  290. package/templates/RCA-DOC-root-cause.md +105 -0
  291. package/templates/RSK-ASS-assessment.md +87 -0
  292. package/templates/RSK-VND-vendor.md +113 -0
  293. package/templates/SEC-INC-incident.md +76 -0
  294. package/templates/SEC-PEN-pentest.md +58 -0
  295. package/templates/SEC-VLN-vulnerability.md +69 -0
  296. package/templates/SLA-AVL-availability.md +86 -0
  297. package/templates/SLA-OPS-operational.md +70 -0
  298. package/templates/agent-server-template/README.md +88 -0
  299. package/templates/agent-server-template/server.example.ts +185 -0
@@ -0,0 +1,380 @@
1
+ // Bulk GraphQL client — raw fetch against Linear's GraphQL endpoint, bypassing
2
+ // the @linear/sdk's per-relation lazy resolvers.
3
+ //
4
+ // Why: SDK list calls like client.issues(...) return objects whose relations
5
+ // (state, assignee, project, labels) are Promise-typed properties — awaiting
6
+ // each one fires a fresh GraphQL request. Reading 250 issues costs ~1,250
7
+ // requests, blowing the 2,500/hr Linear budget in two listings.
8
+ import { getApiKey } from "../client/index.js";
9
+ import { redactSecrets } from "../output/index.js";
10
+ import { sleep } from "../utils/sleep.js";
11
+ const ENDPOINT = "https://api.linear.app/graphql";
12
+ // Cap Retry-After honoring. A hostile or buggy header value of, say, 99999
13
+ // would otherwise stall a curator run for ~27 hours. Linear's rate-limit
14
+ // windows reset in seconds-to-minutes, so 60s is plenty.
15
+ const MAX_RETRY_AFTER_SECONDS = 60;
16
+ function clampedRetryAfter(headerValue, fallbackSeconds = 60) {
17
+ // Honor an explicit "0" (fast retry) but treat missing/garbage as fallback.
18
+ const parsed = headerValue !== null ? Number.parseInt(headerValue, 10) : Number.NaN;
19
+ const seconds = Number.isFinite(parsed) && parsed >= 0 ? parsed : fallbackSeconds;
20
+ return Math.min(seconds, MAX_RETRY_AFTER_SECONDS);
21
+ }
22
+ let cachedApiKey = null;
23
+ async function getCachedApiKey() {
24
+ if (!cachedApiKey)
25
+ cachedApiKey = await getApiKey({ allowPrompt: true });
26
+ return cachedApiKey;
27
+ }
28
+ export function resetBulkGraphqlAuthCache() {
29
+ cachedApiKey = null;
30
+ }
31
+ let lastRateLimit = {};
32
+ export function getLastRateLimit() {
33
+ return lastRateLimit;
34
+ }
35
+ function parseRateHeaders(h) {
36
+ const num = (v) => (v != null && !Number.isNaN(+v) ? +v : undefined);
37
+ let resetSeconds = num(h.get("x-ratelimit-requests-reset"));
38
+ if (resetSeconds !== undefined) {
39
+ const nowSec = Date.now() / 1000;
40
+ const asAbsolute = resetSeconds > 1e12 ? resetSeconds / 1000 : resetSeconds;
41
+ if (asAbsolute > nowSec) {
42
+ resetSeconds = Math.max(0, Math.round(asAbsolute - nowSec));
43
+ }
44
+ }
45
+ return {
46
+ remaining: num(h.get("x-ratelimit-requests-remaining")),
47
+ limit: num(h.get("x-ratelimit-requests-limit")),
48
+ resetSeconds,
49
+ };
50
+ }
51
+ function isRateLimitedBody(body) {
52
+ const errs = body.errors;
53
+ if (!Array.isArray(errs) || errs.length === 0)
54
+ return false;
55
+ return errs.some((e) => e?.extensions?.code === "RATELIMITED" || e?.extensions?.type === "ratelimited");
56
+ }
57
+ let fetchImpl = fetch;
58
+ export function setFetchForTesting(impl) {
59
+ fetchImpl = impl ?? fetch;
60
+ }
61
+ export async function gqlRequest(query, variables = {}, opts = {}) {
62
+ const maxRetries = opts.maxRetries ?? 3;
63
+ const apiKey = await getCachedApiKey();
64
+ let attempt = 0;
65
+ while (true) {
66
+ const res = await fetchImpl(ENDPOINT, {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json", Authorization: apiKey },
69
+ body: JSON.stringify({ query, variables }),
70
+ });
71
+ const rateLimit = parseRateHeaders(res.headers);
72
+ lastRateLimit = rateLimit;
73
+ if (res.status === 429) {
74
+ if (attempt >= maxRetries) {
75
+ return { errors: [{ message: "Rate limited after max retries" }], rateLimit };
76
+ }
77
+ const retryAfter = clampedRetryAfter(res.headers.get("retry-after"));
78
+ process.stderr.write(`Linear 429: sleeping ${retryAfter}s (attempt ${attempt + 1}/${maxRetries})\n`);
79
+ await sleep(retryAfter * 1000);
80
+ attempt++;
81
+ continue;
82
+ }
83
+ let parsedBody = null;
84
+ if (res.status === 400) {
85
+ try {
86
+ parsedBody = await res.clone().json();
87
+ }
88
+ catch { }
89
+ if (parsedBody && isRateLimitedBody(parsedBody)) {
90
+ if (attempt >= maxRetries) {
91
+ return { errors: [{ message: "Rate limited after max retries" }], rateLimit };
92
+ }
93
+ const retryAfter = clampedRetryAfter(res.headers.get("retry-after"));
94
+ process.stderr.write(`Linear RATELIMITED: sleeping ${retryAfter}s (attempt ${attempt + 1}/${maxRetries})\n`);
95
+ await sleep(retryAfter * 1000);
96
+ attempt++;
97
+ continue;
98
+ }
99
+ }
100
+ if (!res.ok) {
101
+ const text = parsedBody ? JSON.stringify(parsedBody) : await res.text();
102
+ return {
103
+ errors: [{ message: redactSecrets(`HTTP ${res.status}: ${text.slice(0, 500)}`) }],
104
+ rateLimit,
105
+ };
106
+ }
107
+ const body = parsedBody ??
108
+ (await res.json());
109
+ if (rateLimit.remaining !== undefined && rateLimit.limit !== undefined) {
110
+ const headroom = rateLimit.remaining / rateLimit.limit;
111
+ if (headroom < 0.05) {
112
+ process.stderr.write(`Linear rate-limit headroom ${(headroom * 100).toFixed(1)}% — pausing 2s\n`);
113
+ await sleep(2000);
114
+ }
115
+ }
116
+ return { ...body, rateLimit };
117
+ }
118
+ }
119
+ const BULK_LIST_FIELDS_DEFAULT = `
120
+ identifier
121
+ title
122
+ priority
123
+ state { id name type }
124
+ assignee { id name }
125
+ team { id key name }
126
+ project { id name }
127
+ labels { nodes { id name } }
128
+ parent { identifier }
129
+ url
130
+ `;
131
+ const BULK_LIST_FIELDS_EXTENDED = `
132
+ identifier
133
+ title
134
+ description
135
+ priority
136
+ state { id name type }
137
+ assignee { id name }
138
+ team { id key name }
139
+ project { id name }
140
+ labels { nodes { id name } }
141
+ parent { identifier }
142
+ children { nodes { identifier } }
143
+ relations { nodes { type relatedIssue { identifier } } }
144
+ url
145
+ updatedAt
146
+ createdAt
147
+ `;
148
+ function bulkListFieldsFor(opts) {
149
+ return opts.includeDescription || opts.includeRelations ? BULK_LIST_FIELDS_EXTENDED : BULK_LIST_FIELDS_DEFAULT;
150
+ }
151
+ export async function bulkListIssues(filter, opts = {}) {
152
+ const pageSize = opts.pageSize ?? 250;
153
+ const max = opts.max ?? Infinity;
154
+ const fields = bulkListFieldsFor(opts);
155
+ const query = `
156
+ query IssuesBulk($after: String, $filter: IssueFilter, $first: Int!) {
157
+ issues(first: $first, after: $after, filter: $filter) {
158
+ pageInfo { hasNextPage endCursor }
159
+ nodes { ${fields} }
160
+ }
161
+ }`;
162
+ const all = [];
163
+ let after = null;
164
+ while (true) {
165
+ const res = await gqlRequest(query, {
166
+ after,
167
+ filter,
168
+ first: Math.min(pageSize, max - all.length),
169
+ });
170
+ if (res.errors) {
171
+ throw new Error(`bulkListIssues failed: ${res.errors.map((e) => e.message).join("; ")}`);
172
+ }
173
+ const page = res.data.issues;
174
+ all.push(...page.nodes);
175
+ if (!page.pageInfo.hasNextPage || all.length >= max)
176
+ break;
177
+ after = page.pageInfo.endCursor;
178
+ }
179
+ return all;
180
+ }
181
+ export async function bulkGetIssue(identifier, opts = {}) {
182
+ const match = identifier.match(/^([A-Z]+)-(\d+)$/);
183
+ if (!match)
184
+ return null;
185
+ const fields = bulkListFieldsFor({
186
+ includeDescription: opts.includeDescription ?? true,
187
+ includeRelations: opts.includeRelations ?? true,
188
+ });
189
+ const res = await gqlRequest(`query($team: String!, $number: Float!) {
190
+ issues(first: 1, filter: { team: { key: { eq: $team } }, number: { eq: $number } }) {
191
+ nodes { ${fields} }
192
+ }
193
+ }`, { team: match[1], number: parseInt(match[2], 10) });
194
+ if (res.errors)
195
+ throw new Error(`bulkGetIssue: ${res.errors.map((e) => e.message).join("; ")}`);
196
+ return res.data.issues.nodes[0] ?? null;
197
+ }
198
+ export async function bulkSearchIssues(query, opts = {}) {
199
+ const teamVar = opts.teamKey ? "$team: String!" : "";
200
+ const variables = { query, first: opts.first ?? 25 };
201
+ if (opts.teamKey)
202
+ variables.team = opts.teamKey;
203
+ const gql = `
204
+ query Search($query: String!, $first: Int!${teamVar ? `, ${teamVar}` : ""}) {
205
+ issues(
206
+ first: $first
207
+ filter: {
208
+ and: [
209
+ { or: [
210
+ { title: { containsIgnoreCase: $query } }
211
+ { description: { containsIgnoreCase: $query } }
212
+ ] }
213
+ ${opts.teamKey ? "{ team: { key: { eq: $team } } }" : ""}
214
+ ]
215
+ }
216
+ ) {
217
+ nodes { ${bulkListFieldsFor(opts)} }
218
+ }
219
+ }`;
220
+ const res = await gqlRequest(gql, variables);
221
+ if (res.errors)
222
+ throw new Error(`bulkSearchIssues: ${res.errors.map((e) => e.message).join("; ")}`);
223
+ return res.data.issues.nodes;
224
+ }
225
+ export function formatBulkIssue(n, withFull = false) {
226
+ const out = {
227
+ identifier: n.identifier,
228
+ title: n.title,
229
+ state: n.state?.name ?? null,
230
+ priority: n.priority,
231
+ assignee: n.assignee?.name ?? null,
232
+ team: n.team?.name ?? null,
233
+ project: n.project?.name ?? null,
234
+ labels: n.labels.nodes.map((l) => l.name),
235
+ parent: n.parent?.identifier ?? null,
236
+ url: n.url,
237
+ };
238
+ if (withFull) {
239
+ out.description = n.description;
240
+ out.children = n.children.nodes.map((c) => c.identifier);
241
+ out.relations = n.relations.nodes.map((r) => ({ type: r.type, with: r.relatedIssue?.identifier ?? null }));
242
+ out.updatedAt = n.updatedAt;
243
+ out.createdAt = n.createdAt;
244
+ }
245
+ return out;
246
+ }
247
+ /**
248
+ * Execute a list of mutations grouped into one GraphQL document per batch
249
+ * (default 10 ops per batch). Returns one result per input op, in order.
250
+ *
251
+ * **Not idempotent.** Linear's GraphQL API does not provide a server-side
252
+ * idempotency key, and we do not deduplicate ops on the client. If a batch is
253
+ * partially applied and the caller retries the same set, applied siblings will
254
+ * be re-applied (e.g. duplicate comments, no-op state changes that re-trigger
255
+ * webhooks). Callers running this from a retry loop must either:
256
+ *
257
+ * - filter ops by the result of the prior call (only retry `ok: false`), or
258
+ * - design ops so re-application is safe (idempotent updates like
259
+ * `updateIssue({stateId: X})` are fine; `createComment` is not).
260
+ *
261
+ * The dispatcher in `src/curator/dispatch.ts` deliberately avoids calling this
262
+ * from a retry loop for this reason; bulk-edit callers should do the same.
263
+ */
264
+ export async function batchMutations(ops, opts = {}) {
265
+ const batchSize = opts.batchSize ?? 10;
266
+ const results = [];
267
+ for (let i = 0; i < ops.length; i += batchSize) {
268
+ const slice = ops.slice(i, i + batchSize);
269
+ const varDecls = [];
270
+ const opDecls = [];
271
+ const variables = {};
272
+ for (const op of slice) {
273
+ const argParts = [];
274
+ for (const [vName, v] of Object.entries(op.vars)) {
275
+ const scoped = `${op.alias}_${vName}`;
276
+ varDecls.push(`$${scoped}: ${v.type}`);
277
+ argParts.push(`${vName}: $${scoped}`);
278
+ variables[scoped] = v.value;
279
+ }
280
+ const sel = op.selection ?? "success";
281
+ opDecls.push(`${op.alias}: ${op.field}(${argParts.join(", ")}) { ${sel} }`);
282
+ }
283
+ const doc = `mutation Batch(${varDecls.join(", ")}) {\n ${opDecls.join("\n ")}\n}`;
284
+ const res = await gqlRequest(doc, variables);
285
+ const errorByAlias = new Map();
286
+ const documentErrors = [];
287
+ for (const e of res.errors ?? []) {
288
+ const alias = typeof e.path?.[0] === "string" ? e.path[0] : null;
289
+ if (alias) {
290
+ const prev = errorByAlias.get(alias);
291
+ errorByAlias.set(alias, prev ? `${prev}; ${e.message}` : e.message);
292
+ }
293
+ else {
294
+ documentErrors.push(e.message);
295
+ }
296
+ }
297
+ const docError = documentErrors.length > 0 ? documentErrors.join("; ") : null;
298
+ const siblingError = errorByAlias.size > 0
299
+ ? `aborted: sibling op in same batch failed (${[...errorByAlias.values()].join("; ")})`
300
+ : null;
301
+ for (const op of slice) {
302
+ const data = res.data?.[op.alias];
303
+ const aliasError = errorByAlias.get(op.alias);
304
+ if (data) {
305
+ results.push({ alias: op.alias, ok: true, data });
306
+ }
307
+ else if (aliasError) {
308
+ results.push({ alias: op.alias, ok: false, error: aliasError });
309
+ }
310
+ else if (docError) {
311
+ results.push({ alias: op.alias, ok: false, error: docError });
312
+ }
313
+ else if (siblingError) {
314
+ results.push({ alias: op.alias, ok: false, error: siblingError });
315
+ }
316
+ else {
317
+ results.push({ alias: op.alias, ok: false, error: "no data returned" });
318
+ }
319
+ }
320
+ }
321
+ return results;
322
+ }
323
+ export async function resolveIssueIds(identifiers) {
324
+ if (identifiers.length === 0)
325
+ return {};
326
+ const byTeam = {};
327
+ for (const id of identifiers) {
328
+ const m = /^([A-Z]+)-(\d+)$/.exec(id);
329
+ if (!m)
330
+ continue;
331
+ const teamKey = m[1];
332
+ if (!byTeam[teamKey])
333
+ byTeam[teamKey] = [];
334
+ byTeam[teamKey].push(parseInt(m[2], 10));
335
+ }
336
+ const map = {};
337
+ for (const [teamKey, numbers] of Object.entries(byTeam)) {
338
+ let after = null;
339
+ while (true) {
340
+ const res = await gqlRequest(`query($team: String!, $numbers: [Float!], $after: String) {
341
+ issues(
342
+ first: 250
343
+ after: $after
344
+ filter: { team: { key: { eq: $team } }, number: { in: $numbers } }
345
+ ) {
346
+ pageInfo { hasNextPage endCursor }
347
+ nodes { id identifier }
348
+ }
349
+ }`, { team: teamKey, numbers, after });
350
+ if (res.errors)
351
+ throw new Error(`resolveIssueIds: ${res.errors.map((e) => e.message).join("; ")}`);
352
+ const page = res.data.issues;
353
+ for (const n of page.nodes)
354
+ map[n.identifier] = n.id;
355
+ if (!page.pageInfo.hasNextPage)
356
+ break;
357
+ after = page.pageInfo.endCursor;
358
+ }
359
+ }
360
+ return map;
361
+ }
362
+ export async function resolveStateId(teamKey, stateName) {
363
+ const res = await gqlRequest(`query($team: String!) {
364
+ team(id: $team) {
365
+ states(first: 50) { nodes { id name } }
366
+ }
367
+ }`, { team: teamKey });
368
+ if (res.errors || !res.data?.team)
369
+ return null;
370
+ const match = res.data.team.states.nodes.find((s) => s.name.toLowerCase() === stateName.toLowerCase());
371
+ return match?.id ?? null;
372
+ }
373
+ export const _internal = {
374
+ parseRateHeaders,
375
+ isRateLimitedBody,
376
+ bulkListFieldsFor,
377
+ clampedRetryAfter,
378
+ MAX_RETRY_AFTER_SECONDS,
379
+ };
380
+ //# sourceMappingURL=bulk-graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-graphql.js","sourceRoot":"","sources":["../../src/lib/bulk-graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./bulk-graphql.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./bulk-graphql.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare function setPrettyMode(value: boolean): void;
2
+ export declare function setOutputFormat(value: string): void;
3
+ export declare function setFields(value: string): void;
4
+ export declare function getFields(): string[] | null;
5
+ /** Test-only: reset module-level state between tests. */
6
+ export declare function _resetOutputState(): void;
7
+ export declare function outputSuccess(data: unknown): void;
8
+ /**
9
+ * Mask PII / sensitive identifiers in a single Linear audit log entry.
10
+ * Returns a NEW object — never mutates the input.
11
+ */
12
+ export declare function redactAuditEntry(entry: Record<string, unknown>): Record<string, unknown>;
13
+ export declare function outputError(error: unknown): void;
14
+ type AsyncHandler = (...args: any[]) => Promise<void>;
15
+ export declare function handleAsyncCommand<T extends AsyncHandler>(fn: T): T;
16
+ export {};
17
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/output/cli.ts"],"names":[],"mappings":"AAgBA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAElD;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMnD;AAGD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAS7C;AAED,wBAAgB,SAAS,IAAI,MAAM,EAAE,GAAG,IAAI,CAE3C;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AA4JD,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAYjD;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAexF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA0BhD;AAGD,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,YAAY,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAUnE"}