@elnora-ai/linear 1.0.1 → 2.0.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 (302) hide show
  1. package/.claude-plugin/marketplace.json +7 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -1
  4. package/README.md +275 -25
  5. package/agents/linear-issue-creator.md +135 -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 +190 -26
  10. package/commands/linear-cleanup.md +64 -29
  11. package/dist/cli.js +69 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/client/auth.d.ts +10 -0
  14. package/dist/client/auth.d.ts.map +1 -1
  15. package/dist/client/auth.js +50 -3
  16. package/dist/client/auth.js.map +1 -1
  17. package/dist/client/linear-client.d.ts +7 -0
  18. package/dist/client/linear-client.d.ts.map +1 -1
  19. package/dist/client/linear-client.js +13 -1
  20. package/dist/client/linear-client.js.map +1 -1
  21. package/dist/commands/agent-activities.d.ts +3 -0
  22. package/dist/commands/agent-activities.d.ts.map +1 -0
  23. package/dist/commands/agent-activities.js +144 -0
  24. package/dist/commands/agent-activities.js.map +1 -0
  25. package/dist/commands/agent-sessions.d.ts +3 -0
  26. package/dist/commands/agent-sessions.d.ts.map +1 -0
  27. package/dist/commands/agent-sessions.js +132 -0
  28. package/dist/commands/agent-sessions.js.map +1 -0
  29. package/dist/commands/attachments.d.ts +3 -0
  30. package/dist/commands/attachments.d.ts.map +1 -0
  31. package/dist/commands/attachments.js +265 -0
  32. package/dist/commands/attachments.js.map +1 -0
  33. package/dist/commands/audit.d.ts +3 -0
  34. package/dist/commands/audit.d.ts.map +1 -0
  35. package/dist/commands/audit.js +73 -0
  36. package/dist/commands/audit.js.map +1 -0
  37. package/dist/commands/comments.d.ts +3 -0
  38. package/dist/commands/comments.d.ts.map +1 -0
  39. package/dist/commands/comments.js +107 -0
  40. package/dist/commands/comments.js.map +1 -0
  41. package/dist/commands/completion.d.ts +3 -0
  42. package/dist/commands/completion.d.ts.map +1 -0
  43. package/dist/commands/completion.js +62 -0
  44. package/dist/commands/completion.js.map +1 -0
  45. package/dist/commands/context.d.ts +3 -0
  46. package/dist/commands/context.d.ts.map +1 -0
  47. package/dist/commands/context.js +94 -0
  48. package/dist/commands/context.js.map +1 -0
  49. package/dist/commands/curator.d.ts +14 -0
  50. package/dist/commands/curator.d.ts.map +1 -1
  51. package/dist/commands/curator.js +97 -19
  52. package/dist/commands/curator.js.map +1 -1
  53. package/dist/commands/customer-needs.d.ts +3 -0
  54. package/dist/commands/customer-needs.d.ts.map +1 -0
  55. package/dist/commands/customer-needs.js +198 -0
  56. package/dist/commands/customer-needs.js.map +1 -0
  57. package/dist/commands/customers.d.ts +5 -0
  58. package/dist/commands/customers.d.ts.map +1 -0
  59. package/dist/commands/customers.js +201 -0
  60. package/dist/commands/customers.js.map +1 -0
  61. package/dist/commands/cycles.d.ts +3 -0
  62. package/dist/commands/cycles.d.ts.map +1 -0
  63. package/dist/commands/cycles.js +67 -0
  64. package/dist/commands/cycles.js.map +1 -0
  65. package/dist/commands/documents.d.ts +3 -0
  66. package/dist/commands/documents.d.ts.map +1 -0
  67. package/dist/commands/documents.js +105 -0
  68. package/dist/commands/documents.js.map +1 -0
  69. package/dist/commands/favorites.d.ts +3 -0
  70. package/dist/commands/favorites.d.ts.map +1 -0
  71. package/dist/commands/favorites.js +101 -0
  72. package/dist/commands/favorites.js.map +1 -0
  73. package/dist/commands/index.d.ts +30 -0
  74. package/dist/commands/index.d.ts.map +1 -1
  75. package/dist/commands/index.js +30 -0
  76. package/dist/commands/index.js.map +1 -1
  77. package/dist/commands/initiatives.d.ts +3 -0
  78. package/dist/commands/initiatives.d.ts.map +1 -0
  79. package/dist/commands/initiatives.js +106 -0
  80. package/dist/commands/initiatives.js.map +1 -0
  81. package/dist/commands/issues.d.ts +21 -0
  82. package/dist/commands/issues.d.ts.map +1 -0
  83. package/dist/commands/issues.js +1083 -0
  84. package/dist/commands/issues.js.map +1 -0
  85. package/dist/commands/labels.d.ts +3 -0
  86. package/dist/commands/labels.d.ts.map +1 -0
  87. package/dist/commands/labels.js +111 -0
  88. package/dist/commands/labels.js.map +1 -0
  89. package/dist/commands/milestones.d.ts +3 -0
  90. package/dist/commands/milestones.d.ts.map +1 -0
  91. package/dist/commands/milestones.js +94 -0
  92. package/dist/commands/milestones.js.map +1 -0
  93. package/dist/commands/notifications.d.ts +3 -0
  94. package/dist/commands/notifications.d.ts.map +1 -0
  95. package/dist/commands/notifications.js +130 -0
  96. package/dist/commands/notifications.js.map +1 -0
  97. package/dist/commands/project-labels.d.ts +3 -0
  98. package/dist/commands/project-labels.d.ts.map +1 -0
  99. package/dist/commands/project-labels.js +80 -0
  100. package/dist/commands/project-labels.js.map +1 -0
  101. package/dist/commands/project-relations.d.ts +3 -0
  102. package/dist/commands/project-relations.d.ts.map +1 -0
  103. package/dist/commands/project-relations.js +96 -0
  104. package/dist/commands/project-relations.js.map +1 -0
  105. package/dist/commands/projects.d.ts +3 -0
  106. package/dist/commands/projects.d.ts.map +1 -0
  107. package/dist/commands/projects.js +263 -0
  108. package/dist/commands/projects.js.map +1 -0
  109. package/dist/commands/quota.d.ts +3 -0
  110. package/dist/commands/quota.d.ts.map +1 -0
  111. package/dist/commands/quota.js +28 -0
  112. package/dist/commands/quota.js.map +1 -0
  113. package/dist/commands/reactions.d.ts +7 -0
  114. package/dist/commands/reactions.d.ts.map +1 -0
  115. package/dist/commands/reactions.js +53 -0
  116. package/dist/commands/reactions.js.map +1 -0
  117. package/dist/commands/relations.d.ts +3 -0
  118. package/dist/commands/relations.d.ts.map +1 -0
  119. package/dist/commands/relations.js +73 -0
  120. package/dist/commands/relations.js.map +1 -0
  121. package/dist/commands/states.d.ts +3 -0
  122. package/dist/commands/states.d.ts.map +1 -0
  123. package/dist/commands/states.js +52 -0
  124. package/dist/commands/states.js.map +1 -0
  125. package/dist/commands/status-updates.d.ts +3 -0
  126. package/dist/commands/status-updates.d.ts.map +1 -0
  127. package/dist/commands/status-updates.js +117 -0
  128. package/dist/commands/status-updates.js.map +1 -0
  129. package/dist/commands/sync.d.ts.map +1 -1
  130. package/dist/commands/sync.js +58 -18
  131. package/dist/commands/sync.js.map +1 -1
  132. package/dist/commands/teams.d.ts +3 -0
  133. package/dist/commands/teams.d.ts.map +1 -0
  134. package/dist/commands/teams.js +135 -0
  135. package/dist/commands/teams.js.map +1 -0
  136. package/dist/commands/templates.d.ts +3 -0
  137. package/dist/commands/templates.d.ts.map +1 -0
  138. package/dist/commands/templates.js +76 -0
  139. package/dist/commands/templates.js.map +1 -0
  140. package/dist/commands/users.d.ts +3 -0
  141. package/dist/commands/users.d.ts.map +1 -0
  142. package/dist/commands/users.js +40 -0
  143. package/dist/commands/users.js.map +1 -0
  144. package/dist/commands/views.d.ts +3 -0
  145. package/dist/commands/views.d.ts.map +1 -0
  146. package/dist/commands/views.js +177 -0
  147. package/dist/commands/views.js.map +1 -0
  148. package/dist/commands/webhooks.d.ts +3 -0
  149. package/dist/commands/webhooks.d.ts.map +1 -0
  150. package/dist/commands/webhooks.js +234 -0
  151. package/dist/commands/webhooks.js.map +1 -0
  152. package/dist/config/loader.d.ts.map +1 -1
  153. package/dist/config/loader.js +3 -0
  154. package/dist/config/loader.js.map +1 -1
  155. package/dist/config/types.d.ts +15 -1
  156. package/dist/config/types.d.ts.map +1 -1
  157. package/dist/config/types.js +1 -0
  158. package/dist/config/types.js.map +1 -1
  159. package/dist/curator/dispatch.d.ts +52 -0
  160. package/dist/curator/dispatch.d.ts.map +1 -0
  161. package/dist/curator/dispatch.js +144 -0
  162. package/dist/curator/dispatch.js.map +1 -0
  163. package/dist/curator/index.d.ts +5 -0
  164. package/dist/curator/index.d.ts.map +1 -0
  165. package/dist/curator/index.js +5 -0
  166. package/dist/curator/index.js.map +1 -0
  167. package/dist/curator/llm.d.ts +70 -0
  168. package/dist/curator/llm.d.ts.map +1 -0
  169. package/dist/curator/llm.js +107 -0
  170. package/dist/curator/llm.js.map +1 -0
  171. package/dist/curator/snapshot.d.ts +34 -0
  172. package/dist/curator/snapshot.d.ts.map +1 -0
  173. package/dist/curator/snapshot.js +127 -0
  174. package/dist/curator/snapshot.js.map +1 -0
  175. package/dist/curator/state.d.ts +50 -0
  176. package/dist/curator/state.d.ts.map +1 -0
  177. package/dist/curator/state.js +125 -0
  178. package/dist/curator/state.js.map +1 -0
  179. package/dist/lib/bulk-graphql.d.ts +144 -0
  180. package/dist/lib/bulk-graphql.d.ts.map +1 -0
  181. package/dist/lib/bulk-graphql.js +380 -0
  182. package/dist/lib/bulk-graphql.js.map +1 -0
  183. package/dist/lib/index.d.ts +2 -0
  184. package/dist/lib/index.d.ts.map +1 -0
  185. package/dist/lib/index.js +2 -0
  186. package/dist/lib/index.js.map +1 -0
  187. package/dist/output/cli.d.ts +17 -0
  188. package/dist/output/cli.d.ts.map +1 -0
  189. package/dist/output/cli.js +252 -0
  190. package/dist/output/cli.js.map +1 -0
  191. package/dist/output/formatter.d.ts +6 -0
  192. package/dist/output/formatter.d.ts.map +1 -1
  193. package/dist/output/formatter.js +10 -0
  194. package/dist/output/formatter.js.map +1 -1
  195. package/dist/output/index.d.ts +1 -0
  196. package/dist/output/index.d.ts.map +1 -1
  197. package/dist/output/index.js +1 -0
  198. package/dist/output/index.js.map +1 -1
  199. package/dist/scripts/sync-linear-templates.d.ts +26 -0
  200. package/dist/scripts/sync-linear-templates.d.ts.map +1 -0
  201. package/dist/scripts/sync-linear-templates.js +115 -0
  202. package/dist/scripts/sync-linear-templates.js.map +1 -0
  203. package/dist/signals/github-commits.d.ts +31 -0
  204. package/dist/signals/github-commits.d.ts.map +1 -0
  205. package/dist/signals/github-commits.js +127 -0
  206. package/dist/signals/github-commits.js.map +1 -0
  207. package/dist/signals/github-pr.d.ts +16 -0
  208. package/dist/signals/github-pr.d.ts.map +1 -0
  209. package/dist/signals/github-pr.js +98 -0
  210. package/dist/signals/github-pr.js.map +1 -0
  211. package/dist/signals/index.d.ts +4 -0
  212. package/dist/signals/index.d.ts.map +1 -1
  213. package/dist/signals/index.js +4 -0
  214. package/dist/signals/index.js.map +1 -1
  215. package/dist/signals/linear-issues.d.ts +20 -0
  216. package/dist/signals/linear-issues.d.ts.map +1 -0
  217. package/dist/signals/linear-issues.js +115 -0
  218. package/dist/signals/linear-issues.js.map +1 -0
  219. package/dist/signals/registry.d.ts +4 -3
  220. package/dist/signals/registry.d.ts.map +1 -1
  221. package/dist/signals/registry.js +33 -11
  222. package/dist/signals/registry.js.map +1 -1
  223. package/dist/signals/slack-messages.d.ts +20 -0
  224. package/dist/signals/slack-messages.d.ts.map +1 -0
  225. package/dist/signals/slack-messages.js +129 -0
  226. package/dist/signals/slack-messages.js.map +1 -0
  227. package/dist/utils/errors.d.ts +81 -0
  228. package/dist/utils/errors.d.ts.map +1 -0
  229. package/dist/utils/errors.js +110 -0
  230. package/dist/utils/errors.js.map +1 -0
  231. package/dist/utils/index.d.ts +9 -0
  232. package/dist/utils/index.d.ts.map +1 -0
  233. package/dist/utils/index.js +9 -0
  234. package/dist/utils/index.js.map +1 -0
  235. package/dist/utils/label-policy.d.ts +60 -0
  236. package/dist/utils/label-policy.d.ts.map +1 -0
  237. package/dist/utils/label-policy.js +103 -0
  238. package/dist/utils/label-policy.js.map +1 -0
  239. package/dist/utils/parse.d.ts +48 -0
  240. package/dist/utils/parse.d.ts.map +1 -0
  241. package/dist/utils/parse.js +133 -0
  242. package/dist/utils/parse.js.map +1 -0
  243. package/dist/utils/project-status.d.ts +6 -0
  244. package/dist/utils/project-status.d.ts.map +1 -0
  245. package/dist/utils/project-status.js +33 -0
  246. package/dist/utils/project-status.js.map +1 -0
  247. package/dist/utils/rate-limit.d.ts +24 -0
  248. package/dist/utils/rate-limit.d.ts.map +1 -0
  249. package/dist/utils/rate-limit.js +89 -0
  250. package/dist/utils/rate-limit.js.map +1 -0
  251. package/dist/utils/resolve.d.ts +84 -0
  252. package/dist/utils/resolve.d.ts.map +1 -0
  253. package/dist/utils/resolve.js +172 -0
  254. package/dist/utils/resolve.js.map +1 -0
  255. package/dist/utils/sleep.d.ts +2 -0
  256. package/dist/utils/sleep.d.ts.map +1 -0
  257. package/dist/utils/sleep.js +4 -0
  258. package/dist/utils/sleep.js.map +1 -0
  259. package/dist/utils/webhook-verify.d.ts +42 -0
  260. package/dist/utils/webhook-verify.d.ts.map +1 -0
  261. package/dist/utils/webhook-verify.js +65 -0
  262. package/dist/utils/webhook-verify.js.map +1 -0
  263. package/package.json +7 -2
  264. package/references/agent-description-template.md +31 -0
  265. package/references/cli-reference.md +227 -0
  266. package/references/curator-tiering-rules.md +78 -0
  267. package/references/label-policy.example.json +37 -0
  268. package/references/label-policy.placeholder.json +6 -0
  269. package/references/settings-template.md +30 -0
  270. package/references/signal-sources.example.json +0 -8
  271. package/references/sla-reference.md +70 -0
  272. package/references/template-index.md +34 -0
  273. package/references/workspace-labels.md +124 -0
  274. package/references/workspace-projects.md +56 -0
  275. package/references/workspace-routing.md +58 -0
  276. package/schemas/label-policy.json +72 -0
  277. package/scripts/postinstall.mjs +195 -0
  278. package/skills/linear-workspace/SKILL.md +65 -4
  279. package/templates/ACC-PRO-provision.md +74 -0
  280. package/templates/ACC-PRV-privileged.md +66 -0
  281. package/templates/ACC-QTR-review.md +77 -0
  282. package/templates/ACC-REV-revoke.md +67 -0
  283. package/templates/AI-USE-capability.md +111 -0
  284. package/templates/AUD-CAP-corrective.md +89 -0
  285. package/templates/AUD-INT-internal.md +92 -0
  286. package/templates/AUD-MGT-management.md +110 -0
  287. package/templates/CHG-MAJ-major.md +110 -0
  288. package/templates/CHG-SIG-significant.md +83 -0
  289. package/templates/CHG-STD-standard.md +47 -0
  290. package/templates/LRN-DOC-lessons.md +75 -0
  291. package/templates/OPS-BCK-backup.md +99 -0
  292. package/templates/OPS-DAT-data-mod.md +98 -0
  293. package/templates/RCA-DOC-root-cause.md +105 -0
  294. package/templates/RSK-ASS-assessment.md +87 -0
  295. package/templates/RSK-VND-vendor.md +113 -0
  296. package/templates/SEC-INC-incident.md +76 -0
  297. package/templates/SEC-PEN-pentest.md +58 -0
  298. package/templates/SEC-VLN-vulnerability.md +69 -0
  299. package/templates/SLA-AVL-availability.md +86 -0
  300. package/templates/SLA-OPS-operational.md +70 -0
  301. package/templates/agent-server-template/README.md +88 -0
  302. package/templates/agent-server-template/server.example.ts +185 -0
@@ -0,0 +1,50 @@
1
+ import type { PendingQuestion } from "./snapshot.js";
2
+ export interface CuratorRunStats {
3
+ ranAt: string;
4
+ durationMs: number;
5
+ signalsCollected: number;
6
+ highApplied: number;
7
+ mediumQueued: number;
8
+ lowReported: number;
9
+ errors: string[];
10
+ }
11
+ export interface CuratorState {
12
+ $schema?: string;
13
+ version: 1;
14
+ pending_questions: PendingQuestion[];
15
+ processed_thread_keys: string[];
16
+ out_of_band_queue: {
17
+ issue_id: string;
18
+ mentioned_in_thread_key: string;
19
+ mentioned_at: string;
20
+ }[];
21
+ last_run_ended_at: string | null;
22
+ stats: CuratorRunStats[];
23
+ }
24
+ export interface StateDirOptions {
25
+ stateDir?: string;
26
+ }
27
+ export declare function resolveStateDir(opts?: StateDirOptions): string;
28
+ export declare function statePath(opts?: StateDirOptions): string;
29
+ export declare function reportPath(opts?: StateDirOptions): string;
30
+ declare function emptyState(): CuratorState;
31
+ export declare function loadState(opts?: StateDirOptions): CuratorState;
32
+ export declare class CuratorLockError extends Error {
33
+ constructor(path: string);
34
+ }
35
+ export declare function saveState(state: CuratorState, opts?: StateDirOptions): void;
36
+ export declare function appendReportLine(entry: Record<string, unknown>, opts?: StateDirOptions): void;
37
+ /**
38
+ * Debounce key for a proposed action: `${issue_id}:${stable-hash(action)}`.
39
+ * Used to avoid re-asking the same question or re-applying the same change.
40
+ * Keys accumulate in `processed_thread_keys` and age out only by FIFO cap
41
+ * (PROCESSED_KEYS_CAP entries); there's no per-key TTL today.
42
+ */
43
+ export declare function debounceKey(issueId: string, action: Record<string, unknown>): string;
44
+ export declare const _internal: {
45
+ emptyState: typeof emptyState;
46
+ PROCESSED_KEYS_CAP: number;
47
+ STATS_CAP: number;
48
+ };
49
+ export {};
50
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/curator/state.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,CAAC;IACX,iBAAiB,EAAE,eAAe,EAAE,CAAC;IACrC,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,iBAAiB,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,uBAAuB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjG,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;CACzB;AAKD,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,CAIlE;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,CAE5D;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,eAAoB,GAAG,MAAM,CAE7D;AAED,iBAAS,UAAU,IAAI,YAAY,CASlC;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,eAAoB,GAAG,YAAY,CAsBlE;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,IAAI,EAAE,MAAM;CAMxB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,eAAoB,GAAG,IAAI,CAoC/E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAE,eAAoB,GAAG,IAAI,CAMjG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEpF;AAED,eAAO,MAAM,SAAS;;;;CAAgD,CAAC"}
@@ -0,0 +1,125 @@
1
+ // Curator state file — persists pending questions, processed thread keys,
2
+ // and per-run stats across invocations.
3
+ //
4
+ // Default path: ~/.config/elnora-linear/state/curator-state.json (overridable via
5
+ // LINEAR_CURATOR_STATE_DIR env var). Append-only report at
6
+ // ~/.config/elnora-linear/state/curator-report.jsonl.
7
+ //
8
+ // File-locked write — we open with a `.lock` sibling to make sure a second
9
+ // curator run doesn't trample a first one mid-write.
10
+ import { appendFileSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
11
+ import { homedir } from "node:os";
12
+ import { join } from "node:path";
13
+ const PROCESSED_KEYS_CAP = 1000;
14
+ const STATS_CAP = 30;
15
+ export function resolveStateDir(opts = {}) {
16
+ if (opts.stateDir)
17
+ return opts.stateDir;
18
+ if (process.env.LINEAR_CURATOR_STATE_DIR)
19
+ return process.env.LINEAR_CURATOR_STATE_DIR;
20
+ return join(homedir(), ".config", "elnora-linear", "state");
21
+ }
22
+ export function statePath(opts = {}) {
23
+ return join(resolveStateDir(opts), "curator-state.json");
24
+ }
25
+ export function reportPath(opts = {}) {
26
+ return join(resolveStateDir(opts), "curator-report.jsonl");
27
+ }
28
+ function emptyState() {
29
+ return {
30
+ version: 1,
31
+ pending_questions: [],
32
+ processed_thread_keys: [],
33
+ out_of_band_queue: [],
34
+ last_run_ended_at: null,
35
+ stats: [],
36
+ };
37
+ }
38
+ export function loadState(opts = {}) {
39
+ const path = statePath(opts);
40
+ if (!existsSync(path))
41
+ return emptyState();
42
+ try {
43
+ const raw = readFileSync(path, "utf-8");
44
+ const parsed = JSON.parse(raw);
45
+ if (parsed.version !== 1) {
46
+ process.stderr.write(`Warning: curator-state.json has unexpected version ${parsed.version}; resetting.\n`);
47
+ return emptyState();
48
+ }
49
+ return {
50
+ version: 1,
51
+ pending_questions: parsed.pending_questions ?? [],
52
+ processed_thread_keys: parsed.processed_thread_keys ?? [],
53
+ out_of_band_queue: parsed.out_of_band_queue ?? [],
54
+ last_run_ended_at: parsed.last_run_ended_at ?? null,
55
+ stats: parsed.stats ?? [],
56
+ };
57
+ }
58
+ catch (err) {
59
+ process.stderr.write(`Warning: failed to read curator-state.json: ${err.message}; resetting.\n`);
60
+ return emptyState();
61
+ }
62
+ }
63
+ export class CuratorLockError extends Error {
64
+ constructor(path) {
65
+ super(`Another curator run is writing state (${path} exists). If you're sure no other run is active, delete the lock file and retry.`);
66
+ this.name = "CuratorLockError";
67
+ }
68
+ }
69
+ export function saveState(state, opts = {}) {
70
+ const dir = resolveStateDir(opts);
71
+ mkdirSync(dir, { recursive: true });
72
+ const path = statePath(opts);
73
+ const lockPath = `${path}.lock`;
74
+ // Exclusive single-writer guarantee. `wx` mode fails with EEXIST if the lock
75
+ // already exists, so concurrent curator runs (rare but possible if a cron
76
+ // fires while a prior run is still flushing state) bail with a clear error
77
+ // rather than racing each other into a corrupt write.
78
+ let fd;
79
+ try {
80
+ fd = openSync(lockPath, "wx");
81
+ }
82
+ catch (err) {
83
+ if (err.code === "EEXIST") {
84
+ throw new CuratorLockError(lockPath);
85
+ }
86
+ throw err;
87
+ }
88
+ try {
89
+ // Trim caps before serializing.
90
+ if (state.processed_thread_keys.length > PROCESSED_KEYS_CAP) {
91
+ state.processed_thread_keys = state.processed_thread_keys.slice(-PROCESSED_KEYS_CAP);
92
+ }
93
+ if (state.stats.length > STATS_CAP) {
94
+ state.stats = state.stats.slice(-STATS_CAP);
95
+ }
96
+ const tmp = `${path}.tmp`;
97
+ writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
98
+ renameSync(tmp, path);
99
+ }
100
+ finally {
101
+ closeSync(fd);
102
+ try {
103
+ unlinkSync(lockPath);
104
+ }
105
+ catch { }
106
+ }
107
+ }
108
+ export function appendReportLine(entry, opts = {}) {
109
+ const dir = resolveStateDir(opts);
110
+ mkdirSync(dir, { recursive: true });
111
+ const path = reportPath(opts);
112
+ const line = `${JSON.stringify({ ...entry, _ts: new Date().toISOString() })}\n`;
113
+ appendFileSync(path, line, { encoding: "utf-8" });
114
+ }
115
+ /**
116
+ * Debounce key for a proposed action: `${issue_id}:${stable-hash(action)}`.
117
+ * Used to avoid re-asking the same question or re-applying the same change.
118
+ * Keys accumulate in `processed_thread_keys` and age out only by FIFO cap
119
+ * (PROCESSED_KEYS_CAP entries); there's no per-key TTL today.
120
+ */
121
+ export function debounceKey(issueId, action) {
122
+ return `${issueId}:${JSON.stringify(action)}`;
123
+ }
124
+ export const _internal = { emptyState, PROCESSED_KEYS_CAP, STATS_CAP };
125
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/curator/state.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wCAAwC;AACxC,EAAE;AACF,kFAAkF;AAClF,2DAA2D;AAC3D,sDAAsD;AACtD,EAAE;AACF,2EAA2E;AAC3E,qDAAqD;AAErD,OAAO,EACN,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuBjC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AAMrB,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE;IACzD,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACxC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACtF,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAwB,EAAE;IACnD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAwB,EAAE;IACpD,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,UAAU;IAClB,OAAO;QACN,OAAO,EAAE,CAAC;QACV,iBAAiB,EAAE,EAAE;QACrB,qBAAqB,EAAE,EAAE;QACzB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;QACvB,KAAK,EAAE,EAAE;KACT,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAwB,EAAE;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,EAAE,CAAC;IAC3C,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;YAC3G,OAAO,UAAU,EAAE,CAAC;QACrB,CAAC;QACD,OAAO;YACN,OAAO,EAAE,CAAC;YACV,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;YACjD,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,EAAE;YACzD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;YACjD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;YACnD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;SACzB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAAgD,GAAa,CAAC,OAAO,gBAAgB,CAAC,CAAC;QAC5G,OAAO,UAAU,EAAE,CAAC;IACrB,CAAC;AACF,CAAC;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAC1C,YAAY,IAAY;QACvB,KAAK,CACJ,yCAAyC,IAAI,kFAAkF,CAC/H,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAChC,CAAC;CACD;AAED,MAAM,UAAU,SAAS,CAAC,KAAmB,EAAE,OAAwB,EAAE;IACxE,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,CAAC;IAEhC,6EAA6E;IAC7E,0EAA0E;IAC1E,2EAA2E;IAC3E,sDAAsD;IACtD,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACJ,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,GAAG,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACJ,gCAAgC;QAChC,IAAI,KAAK,CAAC,qBAAqB,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YAC7D,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;QAC1B,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACV,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,IAAI,CAAC;YACJ,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA8B,EAAE,OAAwB,EAAE;IAC1F,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC;IAChF,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAA+B;IAC3E,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,144 @@
1
+ declare function clampedRetryAfter(headerValue: string | null, fallbackSeconds?: number): number;
2
+ export interface RateLimitHeaders {
3
+ remaining?: number;
4
+ limit?: number;
5
+ resetSeconds?: number;
6
+ }
7
+ export interface GraphQLResponse<T> {
8
+ data?: T;
9
+ errors?: Array<{
10
+ message: string;
11
+ path?: Array<string | number>;
12
+ extensions?: Record<string, unknown>;
13
+ }>;
14
+ rateLimit: RateLimitHeaders;
15
+ }
16
+ export declare function resetBulkGraphqlAuthCache(): void;
17
+ export declare function getLastRateLimit(): RateLimitHeaders;
18
+ declare function parseRateHeaders(h: Headers): RateLimitHeaders;
19
+ declare function isRateLimitedBody(body: {
20
+ errors?: Array<{
21
+ message?: string;
22
+ extensions?: Record<string, unknown>;
23
+ }>;
24
+ }): boolean;
25
+ type FetchLike = typeof fetch;
26
+ export declare function setFetchForTesting(impl: FetchLike | null): void;
27
+ export declare function gqlRequest<T = unknown>(query: string, variables?: Record<string, unknown>, opts?: {
28
+ maxRetries?: number;
29
+ }): Promise<GraphQLResponse<T>>;
30
+ export interface BulkIssueNode {
31
+ identifier: string;
32
+ title: string;
33
+ description: string | null;
34
+ priority: number | null;
35
+ state: {
36
+ id: string;
37
+ name: string;
38
+ type: string;
39
+ } | null;
40
+ assignee: {
41
+ id: string;
42
+ name: string;
43
+ } | null;
44
+ team: {
45
+ id: string;
46
+ key: string;
47
+ name: string;
48
+ } | null;
49
+ project: {
50
+ id: string;
51
+ name: string;
52
+ } | null;
53
+ labels: {
54
+ nodes: Array<{
55
+ id: string;
56
+ name: string;
57
+ }>;
58
+ };
59
+ parent: {
60
+ identifier: string;
61
+ } | null;
62
+ children: {
63
+ nodes: Array<{
64
+ identifier: string;
65
+ }>;
66
+ };
67
+ relations: {
68
+ nodes: Array<{
69
+ type: string;
70
+ relatedIssue: {
71
+ identifier: string;
72
+ } | null;
73
+ }>;
74
+ };
75
+ url: string;
76
+ updatedAt: string;
77
+ createdAt: string;
78
+ }
79
+ declare function bulkListFieldsFor(opts: {
80
+ includeDescription?: boolean;
81
+ includeRelations?: boolean;
82
+ }): string;
83
+ export declare function bulkListIssues(filter: Record<string, unknown>, opts?: {
84
+ pageSize?: number;
85
+ max?: number;
86
+ includeDescription?: boolean;
87
+ includeRelations?: boolean;
88
+ }): Promise<BulkIssueNode[]>;
89
+ export declare function bulkGetIssue(identifier: string, opts?: {
90
+ includeDescription?: boolean;
91
+ includeRelations?: boolean;
92
+ }): Promise<BulkIssueNode | null>;
93
+ export declare function bulkSearchIssues(query: string, opts?: {
94
+ teamKey?: string;
95
+ first?: number;
96
+ includeDescription?: boolean;
97
+ includeRelations?: boolean;
98
+ }): Promise<BulkIssueNode[]>;
99
+ export declare function formatBulkIssue(n: BulkIssueNode, withFull?: boolean): Record<string, unknown>;
100
+ export interface MutationOp {
101
+ alias: string;
102
+ field: string;
103
+ vars: Record<string, {
104
+ type: string;
105
+ value: unknown;
106
+ }>;
107
+ selection?: string;
108
+ }
109
+ /**
110
+ * Execute a list of mutations grouped into one GraphQL document per batch
111
+ * (default 10 ops per batch). Returns one result per input op, in order.
112
+ *
113
+ * **Not idempotent.** Linear's GraphQL API does not provide a server-side
114
+ * idempotency key, and we do not deduplicate ops on the client. If a batch is
115
+ * partially applied and the caller retries the same set, applied siblings will
116
+ * be re-applied (e.g. duplicate comments, no-op state changes that re-trigger
117
+ * webhooks). Callers running this from a retry loop must either:
118
+ *
119
+ * - filter ops by the result of the prior call (only retry `ok: false`), or
120
+ * - design ops so re-application is safe (idempotent updates like
121
+ * `updateIssue({stateId: X})` are fine; `createComment` is not).
122
+ *
123
+ * The dispatcher in `src/curator/dispatch.ts` deliberately avoids calling this
124
+ * from a retry loop for this reason; bulk-edit callers should do the same.
125
+ */
126
+ export declare function batchMutations(ops: MutationOp[], opts?: {
127
+ batchSize?: number;
128
+ }): Promise<Array<{
129
+ alias: string;
130
+ ok: boolean;
131
+ data?: unknown;
132
+ error?: string;
133
+ }>>;
134
+ export declare function resolveIssueIds(identifiers: string[]): Promise<Record<string, string>>;
135
+ export declare function resolveStateId(teamKey: string, stateName: string): Promise<string | null>;
136
+ export declare const _internal: {
137
+ parseRateHeaders: typeof parseRateHeaders;
138
+ isRateLimitedBody: typeof isRateLimitedBody;
139
+ bulkListFieldsFor: typeof bulkListFieldsFor;
140
+ clampedRetryAfter: typeof clampedRetryAfter;
141
+ MAX_RETRY_AFTER_SECONDS: number;
142
+ };
143
+ export {};
144
+ //# sourceMappingURL=bulk-graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-graphql.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-graphql.ts"],"names":[],"mappings":"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"}