@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,52 @@
1
+ // `elnora-linear states` — workflow state lookups by team.
2
+ import { getClient } from "../client/index.js";
3
+ import { handleAsyncCommand, outputSuccess } from "../output/index.js";
4
+ import { NotFoundError, parseLimit, resolveTeam } from "../utils/index.js";
5
+ export function setupStatesCommand(program) {
6
+ const states = program.command("states").description("List workflow states");
7
+ states
8
+ .command("list")
9
+ .description("List workflow states for a team")
10
+ .requiredOption("--team <team>", "Team name or key")
11
+ .option("--limit <n>", "Max results", "100")
12
+ .action(handleAsyncCommand(async (opts) => {
13
+ const client = await getClient();
14
+ const team = await resolveTeam(client, opts.team);
15
+ const result = await client.workflowStates({
16
+ first: parseLimit(opts.limit, 100),
17
+ filter: { team: { id: { eq: team.id } } },
18
+ });
19
+ const rows = result.nodes.map((s) => ({
20
+ id: s.id,
21
+ name: s.name,
22
+ type: s.type,
23
+ color: s.color,
24
+ position: s.position,
25
+ }));
26
+ outputSuccess({ states: rows, team: team.name, count: rows.length });
27
+ }));
28
+ states
29
+ .command("get <nameOrId>")
30
+ .description("Get workflow state details")
31
+ .requiredOption("--team <team>", "Team name or key")
32
+ .action(handleAsyncCommand(async (nameOrId, opts) => {
33
+ const client = await getClient();
34
+ const team = await resolveTeam(client, opts.team);
35
+ const result = await client.workflowStates({
36
+ first: 250,
37
+ filter: { team: { id: { eq: team.id } } },
38
+ });
39
+ const match = result.nodes.find((s) => s.id === nameOrId || s.name.toLowerCase() === nameOrId.toLowerCase());
40
+ if (!match)
41
+ throw new NotFoundError("Workflow state", nameOrId);
42
+ outputSuccess({
43
+ id: match.id,
44
+ name: match.name,
45
+ type: match.type,
46
+ color: match.color,
47
+ position: match.position,
48
+ team: team.name,
49
+ });
50
+ }));
51
+ }
52
+ //# sourceMappingURL=states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/commands/states.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function setupStatusUpdatesCommand(program: Command): void;
3
+ //# sourceMappingURL=status-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-updates.d.ts","sourceRoot":"","sources":["../../src/commands/status-updates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+HhE"}
@@ -0,0 +1,117 @@
1
+ // `elnora-linear status-updates` — manage project/initiative status updates.
2
+ //
3
+ // Initiative status updates are not yet exposed by Linear's SDK; this command
4
+ // rejects --type initiative with a pointer to `initiatives update --status`.
5
+ import { getClient } from "../client/index.js";
6
+ import { handleAsyncCommand, outputSuccess } from "../output/index.js";
7
+ import { CliError, parseHealth, parseLimit, requireNonEmptyUpdate, requireYes, resolveProject, } from "../utils/index.js";
8
+ export function setupStatusUpdatesCommand(program) {
9
+ const statusUpdates = program.command("status-updates").description("Manage project/initiative status updates");
10
+ statusUpdates
11
+ .command("list")
12
+ .description("List status updates")
13
+ .requiredOption("--type <type>", "Type: project or initiative")
14
+ .option("--project <project>", "Filter by project")
15
+ .option("--initiative <initiative>", "Filter by initiative")
16
+ .option("--limit <n>", "Max results", "25")
17
+ .action(handleAsyncCommand(async (opts) => {
18
+ const client = await getClient();
19
+ if (opts.type === "project" && opts.project) {
20
+ const project = await resolveProject(client, opts.project);
21
+ const updates = await client.projectUpdates({
22
+ filter: { project: { id: { eq: project.id } } },
23
+ first: parseLimit(opts.limit, 25),
24
+ });
25
+ const items = updates.nodes.map((u) => ({
26
+ id: u.id,
27
+ body: u.body ?? null,
28
+ health: u.health ?? null,
29
+ createdAt: u.createdAt,
30
+ }));
31
+ outputSuccess({ statusUpdates: items, project: project.name, count: items.length });
32
+ return;
33
+ }
34
+ if (opts.type === "initiative") {
35
+ throw new CliError("Initiative status updates are not yet supported by the Linear SDK.", {
36
+ suggestion: "Use 'elnora-linear initiatives update <id> --status <status>' to update initiative status directly.",
37
+ });
38
+ }
39
+ throw new CliError("Specify --project with --type project to list status updates.", {
40
+ suggestion: 'Example: elnora-linear status-updates list --type project --project "My Project"',
41
+ });
42
+ }));
43
+ statusUpdates
44
+ .command("create")
45
+ .description("Create a status update")
46
+ .requiredOption("--type <type>", "Type: project or initiative")
47
+ .option("--project <project>", "Project name or ID")
48
+ .option("--initiative <initiative>", "Initiative name or ID")
49
+ .option("--health <health>", "Health: onTrack, atRisk, offTrack")
50
+ .option("--body <body>", "Update content (markdown)")
51
+ .action(handleAsyncCommand(async (opts) => {
52
+ const client = await getClient();
53
+ if (opts.type === "project" && opts.project) {
54
+ const project = await resolveProject(client, opts.project);
55
+ const input = { projectId: project.id };
56
+ if (opts.body)
57
+ input.body = opts.body;
58
+ if (opts.health)
59
+ input.health = parseHealth(opts.health);
60
+ const payload = await client.createProjectUpdate(input);
61
+ outputSuccess({ created: payload.success });
62
+ return;
63
+ }
64
+ if (opts.type === "initiative") {
65
+ throw new CliError("Initiative status updates are not yet supported by the Linear SDK.", {
66
+ suggestion: "Use 'elnora-linear initiatives update <id> --status <status>' to update initiative status directly.",
67
+ });
68
+ }
69
+ throw new CliError("Specify --project with --type project to create a status update.", {
70
+ suggestion: 'Example: elnora-linear status-updates create --type project --project "My Project" --body "Update text"',
71
+ });
72
+ }));
73
+ statusUpdates
74
+ .command("update <id>")
75
+ .description("Update a status update")
76
+ .option("--health <health>", "Health: onTrack, atRisk, offTrack")
77
+ .option("--body <body>", "Update content (markdown)")
78
+ .action(handleAsyncCommand(async (id, opts) => {
79
+ const client = await getClient();
80
+ const update = {};
81
+ if (opts.body)
82
+ update.body = opts.body;
83
+ if (opts.health)
84
+ update.health = parseHealth(opts.health);
85
+ requireNonEmptyUpdate(update);
86
+ const payload = await client.updateProjectUpdate(id, update);
87
+ outputSuccess({ updated: payload.success });
88
+ }));
89
+ statusUpdates
90
+ .command("delete <id>")
91
+ .description("Archive a status update (recoverable). Use --permanent --yes for irreversible delete.")
92
+ .option("--permanent", "Permanently delete (irreversible — requires --yes)")
93
+ .option("--yes", "Confirm permanent deletion")
94
+ .action(handleAsyncCommand(async (id, opts) => {
95
+ if (opts.permanent) {
96
+ requireYes(opts, `permanently delete status update ${id}`);
97
+ }
98
+ const client = await getClient();
99
+ if (opts.permanent) {
100
+ const payload = await client.deleteProjectUpdate(id);
101
+ outputSuccess({ deleted: payload.success, permanent: true });
102
+ }
103
+ else {
104
+ const payload = await client.archiveProjectUpdate(id);
105
+ outputSuccess({ archived: payload.success });
106
+ }
107
+ }));
108
+ statusUpdates
109
+ .command("restore <id>")
110
+ .description("Restore an archived status update")
111
+ .action(handleAsyncCommand(async (id) => {
112
+ const client = await getClient();
113
+ const payload = await client.unarchiveProjectUpdate(id);
114
+ outputSuccess({ restored: payload.success });
115
+ }));
116
+ }
117
+ //# sourceMappingURL=status-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-updates.js","sourceRoot":"","sources":["../../src/commands/status-updates.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,12 @@
13
13
  //
14
14
  // What it does NOT do (yet — coming with the curator PR):
15
15
  // - Interactive prompts for slack channels, repos, signal sources
16
- import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
17
17
  import { homedir } from "node:os";
18
18
  import { join } from "node:path";
19
19
  import { getLinearClient } from "../client/index.js";
20
20
  import { BUNDLED_REFERENCES_DIR, loadConfig, REFERENCE_NAMES, resolveReferencesDir, } from "../config/index.js";
21
+ import { ValidationError } from "../utils/errors.js";
21
22
  export const AUTO_SYNC_TARGETS = ["teams", "projects", "users", "workflows"];
22
23
  /**
23
24
  * Resolves the directory the sync command should write to.
@@ -93,7 +94,11 @@ export function mapWorkflowState(s) {
93
94
  // ---------- file write helpers ----------
94
95
  function writeReferenceJson(dir, name, body) {
95
96
  const path = join(dir, `${name}.json`);
96
- writeFileSync(path, `${JSON.stringify(body, null, 2)}\n`);
97
+ const tmp = `${path}.tmp`;
98
+ // Atomic write: stage into a sibling, fsync-style rename. A crash mid-write
99
+ // leaves the prior file intact rather than corrupting the reference.
100
+ writeFileSync(tmp, `${JSON.stringify(body, null, 2)}\n`);
101
+ renameSync(tmp, path);
97
102
  return path;
98
103
  }
99
104
  function emitReport(report, mode) {
@@ -105,18 +110,37 @@ function emitReport(report, mode) {
105
110
  }
106
111
  }
107
112
  // ---------- live sync (network) ----------
113
+ /**
114
+ * Drain a Linear SDK Connection (paged result) into a flat array. Uses the
115
+ * SDK's own `pageInfo.hasNextPage` + `fetchNext()` to follow cursors so we
116
+ * never silently truncate a workspace with more than `first` results.
117
+ */
118
+ async function drainConnection(initial) {
119
+ const all = [...initial.nodes];
120
+ let cursor = initial;
121
+ while (cursor.pageInfo.hasNextPage) {
122
+ cursor = (await cursor.fetchNext());
123
+ all.push(...cursor.nodes);
124
+ }
125
+ return all;
126
+ }
127
+ async function listAllTeams(client) {
128
+ const first = await client.teams({ first: 250 });
129
+ return drainConnection(first);
130
+ }
108
131
  async function syncTeams(client, dir) {
109
- const result = await client.teams({ first: 250 });
110
- const teams = result.nodes.map((t) => mapTeam({ key: t.key, name: t.name, description: t.description }));
132
+ const teamNodes = await listAllTeams(client);
133
+ const teams = teamNodes.map((t) => mapTeam({ key: t.key, name: t.name, description: t.description }));
111
134
  const path = writeReferenceJson(dir, "teams", { teams });
112
135
  return { target: "teams", written: teams.length, path };
113
136
  }
114
137
  async function syncProjects(client, dir) {
115
- const teamsResult = await client.teams({ first: 250 });
138
+ const teamNodes = await listAllTeams(client);
116
139
  const projects = [];
117
- for (const team of teamsResult.nodes) {
118
- const result = await team.projects({ first: 100 });
119
- for (const p of result.nodes) {
140
+ for (const team of teamNodes) {
141
+ const firstPage = await team.projects({ first: 100 });
142
+ const projectNodes = await drainConnection(firstPage);
143
+ for (const p of projectNodes) {
120
144
  projects.push(mapProject({ name: p.name, description: p.description, state: p.state }, team.key));
121
145
  }
122
146
  }
@@ -124,18 +148,20 @@ async function syncProjects(client, dir) {
124
148
  return { target: "projects", written: projects.length, path };
125
149
  }
126
150
  async function syncUsers(client, dir) {
127
- const result = await client.users({ first: 250 });
128
- const users = result.nodes.map((u) => mapUser({ id: u.id, name: u.name, email: u.email, displayName: u.displayName }));
151
+ const firstPage = await client.users({ first: 250 });
152
+ const userNodes = await drainConnection(firstPage);
153
+ const users = userNodes.map((u) => mapUser({ id: u.id, name: u.name, email: u.email, displayName: u.displayName }));
129
154
  const path = writeReferenceJson(dir, "users", { users });
130
155
  return { target: "users", written: users.length, path };
131
156
  }
132
157
  async function syncWorkflows(client, dir) {
133
- const teamsResult = await client.teams({ first: 250 });
158
+ const teamNodes = await listAllTeams(client);
134
159
  const seen = new Set();
135
160
  const states = [];
136
- for (const team of teamsResult.nodes) {
137
- const result = await team.states({ first: 100 });
138
- for (const s of result.nodes) {
161
+ for (const team of teamNodes) {
162
+ const firstPage = await team.states({ first: 100 });
163
+ const stateNodes = await drainConnection(firstPage);
164
+ for (const s of stateNodes) {
139
165
  const mapped = mapWorkflowState({ name: s.name, type: s.type });
140
166
  if (!mapped)
141
167
  continue;
@@ -195,19 +221,33 @@ export function runSyncVerify(opts) {
195
221
  /** Pure: given parsed JSON, decide which reference targets to write. */
196
222
  export function planImport(parsed) {
197
223
  if (typeof parsed !== "object" || parsed === null) {
198
- throw new Error("Import file must be a JSON object.");
224
+ throw new ValidationError("Import file must be a JSON object.");
199
225
  }
200
226
  const obj = parsed;
201
227
  const targets = REFERENCE_NAMES.filter((n) => n in obj);
202
228
  if (targets.length === 0) {
203
- throw new Error(`Import file must be a bundle with top-level keys matching reference names: ${REFERENCE_NAMES.join(", ")}.`);
229
+ throw new ValidationError(`Import file must be a bundle with top-level keys matching reference names: ${REFERENCE_NAMES.join(", ")}.`);
204
230
  }
205
231
  return targets;
206
232
  }
207
233
  export function runSyncImport(opts) {
208
234
  const dir = resolveSyncWriteDir(opts.referencesDir);
209
- const raw = readFileSync(opts.from, "utf8");
210
- const parsed = JSON.parse(raw);
235
+ let raw;
236
+ try {
237
+ raw = readFileSync(opts.from, "utf8");
238
+ }
239
+ catch (e) {
240
+ const msg = e instanceof Error ? e.message : String(e);
241
+ throw new ValidationError(`Cannot read import file ${opts.from}: ${msg}`);
242
+ }
243
+ let parsed;
244
+ try {
245
+ parsed = JSON.parse(raw);
246
+ }
247
+ catch (e) {
248
+ const msg = e instanceof Error ? e.message : String(e);
249
+ throw new ValidationError(`Invalid JSON in ${opts.from}: ${msg}`);
250
+ }
211
251
  const targets = planImport(parsed);
212
252
  const written = [];
213
253
  const obj = parsed;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function setupTeamsCommand(program: Command): void;
3
+ //# sourceMappingURL=teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/commands/teams.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyIxD"}
@@ -0,0 +1,135 @@
1
+ // `elnora-linear teams` — manage Linear teams.
2
+ //
3
+ // `get` returns valid workflow states + the label policy (required groups,
4
+ // allowed prefixes, requiresProject) so agents can plan an issue create
5
+ // without follow-up calls.
6
+ import { getClient } from "../client/index.js";
7
+ import { handleAsyncCommand, outputSuccess } from "../output/index.js";
8
+ import { CliError, getTeamLabelPolicy, parseColor, parseLimit, requireNonEmptyUpdate, requireYes, resolveTeam, } from "../utils/index.js";
9
+ export function setupTeamsCommand(program) {
10
+ const teams = program.command("teams").description("Manage Linear teams");
11
+ teams
12
+ .command("list")
13
+ .description("List all teams")
14
+ .option("--limit <n>", "Max results", "50")
15
+ .action(handleAsyncCommand(async (opts) => {
16
+ const client = await getClient();
17
+ const result = await client.teams({ first: parseLimit(opts.limit, 50) });
18
+ const rows = result.nodes.map((t) => ({
19
+ id: t.id,
20
+ name: t.name,
21
+ key: t.key,
22
+ description: t.description ?? null,
23
+ }));
24
+ outputSuccess({ teams: rows, count: rows.length });
25
+ }));
26
+ teams
27
+ .command("get <nameOrId>")
28
+ .description("Get team details. Includes validStates and label policy (required groups + allowed prefixes + requiresProject) so agents can plan an issue create without follow-up calls.")
29
+ .action(handleAsyncCommand(async (nameOrId) => {
30
+ const client = await getClient();
31
+ const team = await resolveTeam(client, nameOrId);
32
+ const [full, statesConn] = await Promise.all([
33
+ client.team(team.id),
34
+ client.workflowStates({ first: 100, filter: { team: { id: { eq: team.id } } } }),
35
+ ]);
36
+ const validStates = statesConn?.nodes?.map((s) => ({ name: s.name, type: s.type })) ?? [];
37
+ const labelPolicy = getTeamLabelPolicy(full.key);
38
+ const requiredLabels = labelPolicy?.required ?? [];
39
+ const allowedPrefixes = labelPolicy?.allowedPrefixes ?? [];
40
+ outputSuccess({
41
+ id: full.id,
42
+ name: full.name,
43
+ key: full.key,
44
+ description: full.description ?? null,
45
+ validStates,
46
+ requiredLabels,
47
+ allowedLabelPrefixes: allowedPrefixes,
48
+ requiresProject: labelPolicy?.requiresProject ?? false,
49
+ });
50
+ }));
51
+ teams
52
+ .command("create <name>")
53
+ .description("Create a new team")
54
+ .requiredOption("--key <key>", "Team key (e.g., ENG, SEC)")
55
+ .option("--description <desc>", "Team description")
56
+ .option("--color <hex>", "Team color (hex)")
57
+ .option("--icon <emoji>", "Team icon (emoji)")
58
+ .option("--timezone <tz>", "Timezone (e.g., Europe/London)")
59
+ .action(handleAsyncCommand(async (name, opts) => {
60
+ const client = await getClient();
61
+ const input = { name, key: opts.key };
62
+ if (opts.description)
63
+ input.description = opts.description;
64
+ if (opts.color)
65
+ input.color = parseColor(opts.color);
66
+ if (opts.icon)
67
+ input.icon = opts.icon;
68
+ if (opts.timezone)
69
+ input.timezone = opts.timezone;
70
+ const payload = await client.createTeam(input);
71
+ if (!payload.success)
72
+ throw new CliError("Failed to create team");
73
+ const team = await payload.team;
74
+ outputSuccess({
75
+ created: true,
76
+ team: team ? { id: team.id, name: team.name, key: team.key } : null,
77
+ });
78
+ }));
79
+ teams
80
+ .command("update <nameOrId>")
81
+ .description("Update a team")
82
+ .option("--name <name>", "New name")
83
+ .option("--key <key>", "New key")
84
+ .option("--description <desc>", "New description")
85
+ .option("--color <hex>", "New color (hex)")
86
+ .option("--icon <emoji>", "New icon (emoji)")
87
+ .option("--timezone <tz>", "New timezone")
88
+ .action(handleAsyncCommand(async (nameOrId, opts) => {
89
+ const client = await getClient();
90
+ const team = await resolveTeam(client, nameOrId);
91
+ const update = {};
92
+ if (opts.name)
93
+ update.name = opts.name;
94
+ if (opts.key)
95
+ update.key = opts.key;
96
+ if (opts.description)
97
+ update.description = opts.description;
98
+ if (opts.color)
99
+ update.color = parseColor(opts.color);
100
+ if (opts.icon)
101
+ update.icon = opts.icon;
102
+ if (opts.timezone)
103
+ update.timezone = opts.timezone;
104
+ requireNonEmptyUpdate(update);
105
+ const payload = await client.updateTeam(team.id, update);
106
+ if (!payload.success)
107
+ throw new CliError("Failed to update team");
108
+ const updated = await payload.team;
109
+ outputSuccess({
110
+ updated: true,
111
+ team: updated ? { id: updated.id, name: updated.name, key: updated.key } : null,
112
+ });
113
+ }));
114
+ teams
115
+ .command("delete <nameOrId>")
116
+ .description("Archive a team — every issue, project, config goes with it. Requires --yes.")
117
+ .option("--yes", "Confirm team deletion (archives every issue and project in the team)")
118
+ .action(handleAsyncCommand(async (nameOrId, opts) => {
119
+ requireYes(opts, `delete team ${nameOrId} (archives all its issues and projects)`);
120
+ const client = await getClient();
121
+ const team = await resolveTeam(client, nameOrId);
122
+ const payload = await client.deleteTeam(team.id);
123
+ outputSuccess({ deleted: payload.success, name: team.name });
124
+ }));
125
+ teams
126
+ .command("restore <nameOrId>")
127
+ .description("Restore an archived team")
128
+ .action(handleAsyncCommand(async (nameOrId) => {
129
+ const client = await getClient();
130
+ const team = await resolveTeam(client, nameOrId);
131
+ const payload = await client.unarchiveTeam(team.id);
132
+ outputSuccess({ restored: payload.success, name: team.name });
133
+ }));
134
+ }
135
+ //# sourceMappingURL=teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/commands/teams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function setupTemplatesCommand(program: Command): void;
3
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E5D"}
@@ -0,0 +1,76 @@
1
+ // `elnora-linear templates` — Linear native template lookups + sync.
2
+ //
3
+ // - `templates list`: read-only listing of native templates (filterable by
4
+ // type and team)
5
+ // - `templates sync`: pushes .md compliance templates from a local templates
6
+ // directory into Linear as native issue templates.
7
+ // Idempotent: matches by source-footer in description,
8
+ // falls back to exact name match.
9
+ import { getClient } from "../client/index.js";
10
+ import { gqlRequest } from "../lib/bulk-graphql.js";
11
+ import { handleAsyncCommand, outputSuccess } from "../output/index.js";
12
+ import { syncTemplates } from "../scripts/sync-linear-templates.js";
13
+ import { ValidationError } from "../utils/index.js";
14
+ const VALID_TYPES = ["issue", "project", "document"];
15
+ export function setupTemplatesCommand(program) {
16
+ const templates = program
17
+ .command("templates")
18
+ .description("List Linear native templates and sync local .md templates into Linear");
19
+ templates
20
+ .command("list")
21
+ .description("List native Linear templates")
22
+ .option("--type <type>", "Filter by type: issue, project, document")
23
+ .option("--team <name>", "Filter by team name (client-side)")
24
+ .option("--limit <n>", "Max results (client-side cap; templates endpoint returns all)", "100")
25
+ .action(handleAsyncCommand(async (opts) => {
26
+ if (opts.type && !VALID_TYPES.includes(opts.type)) {
27
+ throw new ValidationError(`Invalid --type "${opts.type}". Must be one of: ${VALID_TYPES.join(", ")}.`);
28
+ }
29
+ const res = await gqlRequest(`query {
30
+ templates { id name type description createdAt team { name } }
31
+ }`);
32
+ if (res.errors) {
33
+ throw new ValidationError(`templates list: ${res.errors.map((e) => e.message).join("; ")}`);
34
+ }
35
+ const all = res.data?.templates ?? [];
36
+ const filtered = all
37
+ .filter((t) => !opts.type || t.type === opts.type)
38
+ .map((t) => ({
39
+ id: t.id,
40
+ name: t.name,
41
+ type: t.type,
42
+ team: t.team?.name ?? null,
43
+ description: t.description,
44
+ createdAt: t.createdAt,
45
+ }));
46
+ const teamFiltered = opts.team
47
+ ? filtered.filter((t) => t.team?.toLowerCase() === opts.team.toLowerCase())
48
+ : filtered;
49
+ const limit = parseInt(opts.limit ?? "100", 10);
50
+ const capped = teamFiltered.slice(0, limit);
51
+ outputSuccess({ templates: capped, count: capped.length });
52
+ }));
53
+ templates
54
+ .command("sync")
55
+ .description("Sync local .md templates into Linear as native templates. Idempotent.")
56
+ .requiredOption("--team <name>", "Target team name or key (templates are team-scoped in Linear)")
57
+ .option("--dry-run", "Preview the plan without writing")
58
+ .option("--templates-dir <path>", "Override path to .md templates directory (default: bundled templates/)")
59
+ .option("--yes", "Confirm live sync (required when not --dry-run)")
60
+ .action(handleAsyncCommand(async (opts) => {
61
+ const dryRun = Boolean(opts.dryRun);
62
+ const yes = Boolean(opts.yes);
63
+ if (!dryRun && !yes) {
64
+ throw new ValidationError("Refusing live sync without --yes. Use --dry-run to preview, or pass --yes.");
65
+ }
66
+ const client = await getClient();
67
+ const result = await syncTemplates(client, {
68
+ templatesDir: typeof opts.templatesDir === "string" ? opts.templatesDir : "",
69
+ team: String(opts.team),
70
+ dryRun,
71
+ yes,
72
+ });
73
+ outputSuccess(result);
74
+ }));
75
+ }
76
+ //# sourceMappingURL=templates.js.map