@clipboard-health/groundcrew 3.4.0 → 4.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 (37) hide show
  1. package/README.md +20 -25
  2. package/clearance-allow-hosts +10 -0
  3. package/crew.config.example.ts +14 -33
  4. package/dist/commands/cleaner.d.ts.map +1 -1
  5. package/dist/commands/cleaner.js +1 -5
  6. package/dist/commands/dispatcher.d.ts.map +1 -1
  7. package/dist/commands/dispatcher.js +5 -5
  8. package/dist/commands/eligibility.d.ts +1 -1
  9. package/dist/commands/eligibility.d.ts.map +1 -1
  10. package/dist/commands/eligibility.js +4 -4
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +2 -1
  13. package/dist/commands/setupWorkspace.d.ts.map +1 -1
  14. package/dist/commands/setupWorkspace.js +1 -2
  15. package/dist/commands/ticketDoctor.d.ts.map +1 -1
  16. package/dist/commands/ticketDoctor.js +11 -33
  17. package/dist/index.d.ts +3 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/lib/adapters/linear/factory.d.ts +10 -14
  21. package/dist/lib/adapters/linear/factory.d.ts.map +1 -1
  22. package/dist/lib/adapters/linear/factory.js +23 -63
  23. package/dist/lib/adapters/linear/schema.d.ts +3 -5
  24. package/dist/lib/adapters/linear/schema.d.ts.map +1 -1
  25. package/dist/lib/adapters/linear/schema.js +3 -5
  26. package/dist/lib/boardSource.d.ts +55 -39
  27. package/dist/lib/boardSource.d.ts.map +1 -1
  28. package/dist/lib/boardSource.js +130 -237
  29. package/dist/lib/config.d.ts +11 -70
  30. package/dist/lib/config.d.ts.map +1 -1
  31. package/dist/lib/config.js +10 -157
  32. package/dist/lib/linearIssueStatus.d.ts +0 -4
  33. package/dist/lib/linearIssueStatus.d.ts.map +1 -1
  34. package/dist/lib/linearIssueStatus.js +0 -0
  35. package/dist/lib/ticketSource.d.ts +5 -7
  36. package/dist/lib/ticketSource.d.ts.map +1 -1
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,OAAO,IAAI,aAAa,EAG7B,KAAK,KAAK,IAAI,WAAW,EAE1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAElF,OAAO,KAAK,EAEV,eAAe,EACf,KAAK,IAAI,cAAc,EACvB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAUvD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,qBAAqB,GAC7B,eAAe,CAcjB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,cAAc,CAAC,cAAc,CAAC,GAC3C,eAAe,CAoBjB;AAcD,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,cAAc,CAAC,cAAc,CAAC,EAC5C,UAAU,EAAE,MAAM,GACjB,cAAc,CA8BhB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,cAAc,GACtB,YAAY,CAwEd"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAIL,KAAK,KAAK,IAAI,WAAW,EAE1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAEV,eAAe,EACf,KAAK,IAAI,cAAc,EACvB,YAAY,EACb,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AASvD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAW3F;AAUD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAsB7F;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,cAAc,GACtB,YAAY,CA6Dd"}
@@ -1,78 +1,45 @@
1
1
  /**
2
2
  * Linear `TicketSource` factory. Wraps the existing boardSource.ts machinery
3
3
  * (createBoardSource, fetchResolvedIssue, createLinearIssueStatusUpdater) and
4
- * converts the legacy Linear-specific `Issue`/`Blocker` shapes into the
5
- * canonical `Issue`/`Blocker` shapes consumers (via `Board`) speak.
4
+ * converts the Linear-native `Issue`/`Blocker` shapes into the canonical
5
+ * `Issue`/`Blocker` shapes consumers (via `Board`) speak.
6
6
  *
7
- * Per-project canonical-status mapping lives here: each `Issue` is mapped
8
- * against its own project's `statuses` block (the multi-project semantics
9
- * shipped in PR #75). Off-config blockers fall back to the union of all
10
- * configured projects' status sets — preserving today's
11
- * `isTerminalStatusForBlocker` behavior.
7
+ * Status mapping is driven entirely by Linear's workflow `state.type`
8
+ * (`unstarted` todo, `started` in-progress,
9
+ * `completed`/`canceled`/`duplicate` done) so renamed columns are classified
10
+ * correctly without any per-team config.
12
11
  *
13
12
  * Description is not populated on `fetch()` Issues (boardSource's snapshot
14
13
  * doesn't include it); `resolveOne()` Issues carry the full description
15
- * because `fetchResolvedIssue` fetches it explicitly. Phase 6 can lift
16
- * description onto the board snapshot when it refactors setupWorkspace.
14
+ * because `fetchResolvedIssue` fetches it explicitly.
17
15
  */
18
- import { createBoardSource, fetchResolvedIssue, isTerminalStatusForBlocker, } from "../../boardSource.js";
19
- import { findProjectBySlugId } from "../../config.js";
16
+ import { createBoardSource, fetchResolvedIssue, isTerminalStateType, } from "../../boardSource.js";
20
17
  import { createLinearIssueStatusUpdater } from "../../linearIssueStatus.js";
21
18
  import { getLinearClient } from "../../util.js";
22
- export function canonicalStatusForProject(nativeStatus, project) {
23
- if (project.statuses.todo === nativeStatus) {
19
+ export function canonicalStatusFromStateType(stateType) {
20
+ if (stateType === "unstarted") {
24
21
  return "todo";
25
22
  }
26
- if (project.statuses.inProgress === nativeStatus) {
23
+ if (stateType === "started") {
27
24
  return "in-progress";
28
25
  }
29
- if (project.statuses.done === nativeStatus) {
30
- return "done";
31
- }
32
- if (project.statuses.terminal.includes(nativeStatus)) {
26
+ if (isTerminalStateType(stateType)) {
33
27
  return "done";
34
28
  }
35
29
  return "other";
36
30
  }
37
- export function canonicalBlockerStatus(blocker, globalConfig) {
38
- if (blocker.status === undefined) {
39
- return "other";
40
- }
41
- // Terminal first — handles off-config blockers via the union fallback that
42
- // isTerminalStatusForBlocker already implements.
43
- if (isTerminalStatusForBlocker(blocker, globalConfig)) {
44
- return "done";
45
- }
46
- // Non-terminal: if the blocker's project is configured, use its statuses to
47
- // distinguish todo vs in-progress. For off-config blockers we collapse to
48
- // "other" — eligibility only cares whether the blocker is terminal, so the
49
- // distinction is informational at most.
50
- if (blocker.projectSlugId !== undefined) {
51
- const project = findProjectBySlugId(globalConfig, blocker.projectSlugId);
52
- if (project !== undefined) {
53
- return canonicalStatusForProject(blocker.status, project);
54
- }
55
- }
56
- return "other";
57
- }
58
- function toCanonicalBlocker(blocker, globalConfig, sourceName) {
31
+ function toCanonicalBlocker(blocker, sourceName) {
59
32
  return {
60
33
  id: `${sourceName}:${blocker.id}`,
61
34
  title: blocker.title,
62
- status: canonicalBlockerStatus(blocker, globalConfig),
35
+ status: canonicalStatusFromStateType(blocker.stateType),
63
36
  };
64
37
  }
65
- export function toCanonicalIssue(linearIssue, globalConfig, sourceName) {
66
- const project = findProjectBySlugId(globalConfig, linearIssue.projectSlugId);
67
- /* v8 ignore next 5 @preserve -- fetchBoard's slugId filter and issueStatusBelongsToOwnProject guarantee project is configured by the time we get here */
68
- if (project === undefined) {
69
- throw new Error(`Linear adapter: issue ${linearIssue.id} carries unknown projectSlugId "${linearIssue.projectSlugId}"`);
70
- }
38
+ export function toCanonicalIssue(linearIssue, sourceName) {
71
39
  const sourceRef = {
72
40
  uuid: linearIssue.uuid,
73
41
  statusId: linearIssue.statusId,
74
42
  teamId: linearIssue.teamId,
75
- projectSlugId: linearIssue.projectSlugId,
76
43
  nativeStatus: linearIssue.status,
77
44
  };
78
45
  return {
@@ -81,12 +48,12 @@ export function toCanonicalIssue(linearIssue, globalConfig, sourceName) {
81
48
  title: linearIssue.title,
82
49
  // Board snapshot doesn't carry description; resolveOne() populates it.
83
50
  description: "",
84
- status: canonicalStatusForProject(linearIssue.status, project),
51
+ status: canonicalStatusFromStateType(linearIssue.stateType),
85
52
  repository: linearIssue.repository,
86
53
  model: linearIssue.model,
87
54
  assignee: linearIssue.assignee,
88
55
  updatedAt: linearIssue.updatedAt,
89
- blockers: linearIssue.blockers.map((b) => toCanonicalBlocker(b, globalConfig, sourceName)),
56
+ blockers: linearIssue.blockers.map((b) => toCanonicalBlocker(b, sourceName)),
90
57
  hasMoreBlockers: linearIssue.hasMoreBlockers,
91
58
  sourceRef,
92
59
  };
@@ -96,7 +63,7 @@ export function createLinearTicketSource(config, context) {
96
63
  const { globalConfig } = context;
97
64
  const client = getLinearClient();
98
65
  const boardSource = createBoardSource({ config: globalConfig, client });
99
- const issueStatusUpdater = createLinearIssueStatusUpdater({ config: globalConfig, client });
66
+ const issueStatusUpdater = createLinearIssueStatusUpdater({ client });
100
67
  return {
101
68
  name: sourceName,
102
69
  async verify() {
@@ -104,23 +71,18 @@ export function createLinearTicketSource(config, context) {
104
71
  },
105
72
  async fetch() {
106
73
  const state = await boardSource.fetch();
107
- return state.issues.map((linearIssue) => toCanonicalIssue(linearIssue, globalConfig, sourceName));
74
+ return state.issues.map((linearIssue) => toCanonicalIssue(linearIssue, sourceName));
108
75
  },
109
76
  async resolveOne(naturalId) {
110
- // fetchResolvedIssue throws on unknown project / missing repo; we let
111
- // those propagate. Returning `undefined` is reserved for "ticket genuinely
112
- // doesn't exist," which fetchResolvedIssue surfaces as an Error too —
113
- // for now we let any error bubble up rather than swallow.
77
+ // fetchResolvedIssue throws on missing repo; we let those propagate.
78
+ // Returning `undefined` is reserved for "ticket genuinely doesn't
79
+ // exist," which fetchResolvedIssue surfaces as an Error too — for now
80
+ // we let any error bubble up rather than swallow.
114
81
  const resolved = await fetchResolvedIssue({
115
82
  client,
116
83
  config: globalConfig,
117
84
  ticket: naturalId,
118
85
  });
119
- const project = findProjectBySlugId(globalConfig, resolved.projectSlugId);
120
- /* v8 ignore next 5 @preserve -- fetchResolvedIssue already throws UnknownProjectError before reaching this guard */
121
- if (project === undefined) {
122
- throw new Error(`Linear adapter: resolved issue ${naturalId} carries unknown projectSlugId "${resolved.projectSlugId}"`);
123
- }
124
86
  // fetchResolvedIssue doesn't return the native status name (it's
125
87
  // already been resolved through workflow state lookup). We surface
126
88
  // "other" until the consumer needs the canonical status, which is fine
@@ -129,7 +91,6 @@ export function createLinearTicketSource(config, context) {
129
91
  uuid: resolved.uuid,
130
92
  statusId: "",
131
93
  teamId: resolved.teamId,
132
- projectSlugId: resolved.projectSlugId,
133
94
  nativeStatus: "",
134
95
  };
135
96
  return {
@@ -154,7 +115,6 @@ export function createLinearTicketSource(config, context) {
154
115
  id: issue.id,
155
116
  uuid: ref.uuid,
156
117
  teamId: ref.teamId,
157
- projectSlugId: ref.projectSlugId,
158
118
  });
159
119
  },
160
120
  };
@@ -1,9 +1,7 @@
1
1
  /**
2
- * Zod schema for the Linear adapter's per-source config block. Minimal in MVP-2:
3
- * the global `linear.projects` field (validated in config.ts) is the source of
4
- * truth for which projects to watch and their per-project status names. A
5
- * future refactor can move `projects` into this block to enable multi-workspace
6
- * Linear (one adapter per API key), but that's V1.5+ scope.
2
+ * Zod schema for the Linear adapter's per-source config block. The built-in
3
+ * Linear adapter is implicit and derives scope from the API key's viewer plus
4
+ * `agent-*` labels, so the source config only needs an optional display name.
7
5
  */
8
6
  import { z } from "zod";
9
7
  export declare const linearAdapterConfigSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,yBAAyB;;;iBAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,yBAAyB;;;iBAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
@@ -1,9 +1,7 @@
1
1
  /**
2
- * Zod schema for the Linear adapter's per-source config block. Minimal in MVP-2:
3
- * the global `linear.projects` field (validated in config.ts) is the source of
4
- * truth for which projects to watch and their per-project status names. A
5
- * future refactor can move `projects` into this block to enable multi-workspace
6
- * Linear (one adapter per API key), but that's V1.5+ scope.
2
+ * Zod schema for the Linear adapter's per-source config block. The built-in
3
+ * Linear adapter is implicit and derives scope from the API key's viewer plus
4
+ * `agent-*` labels, so the source config only needs an optional display name.
7
5
  */
8
6
  import { z } from "zod";
9
7
  export const linearAdapterConfigSchema = z.object({
@@ -1,23 +1,30 @@
1
1
  /**
2
- * Linear adapter — turns the project's GraphQL state into a `BoardState`
2
+ * Linear adapter — turns the viewer's GraphQL state into a `BoardState`
3
3
  * snapshot. Owns the GraphQL queries and shape parsing so callers consume a
4
4
  * typed `BoardState` instead of raw nodes.
5
+ *
6
+ * There is no project / view / status configuration: the only filter is
7
+ * "assigned to the API key's viewer AND carries an `agent-*` label."
8
+ * State classification is driven by Linear's workflow `state.type`
9
+ * (`unstarted` | `started` | `completed` | `canceled` | `duplicate`) —
10
+ * never by status name — so workspaces with renamed columns (Todo → To Do,
11
+ * Done → Shipped, etc.) Just Work.
5
12
  */
6
13
  import type { LinearClient } from "@linear/sdk";
7
- import { type ResolvedConfig, type ResolvedProjectConfig } from "./config.ts";
14
+ import { type ResolvedConfig } from "./config.ts";
8
15
  import { RepositoryResolutionError } from "./ticketSource.ts";
16
+ export declare const AGENT_LABEL_PREFIX = "agent-";
17
+ export declare const ISSUES_PAGE_SIZE = 250;
9
18
  export interface Blocker {
10
19
  id: string;
11
20
  title: string;
12
21
  status: string | undefined;
13
22
  /**
14
- * SlugId of the project the blocker lives in. `undefined` when Linear
15
- * returned no project for the blocker (rare issues can technically
16
- * exist without a project). Drives `isTerminalStatusForBlocker`'s
17
- * pick between the blocker's own project terminals and the global
18
- * union fallback.
23
+ * Linear workflow `state.type` for the blocker (`unstarted` | `started` |
24
+ * `completed` | `canceled` | `duplicate` | `backlog` | `triage`). All
25
+ * canonical classification todo / in-progress / terminal — keys off this.
19
26
  */
20
- projectSlugId: string | undefined;
27
+ stateType: string | undefined;
21
28
  }
22
29
  export interface Issue {
23
30
  id: string;
@@ -25,6 +32,8 @@ export interface Issue {
25
32
  title: string;
26
33
  status: string;
27
34
  statusId: string;
35
+ /** Linear workflow `state.type` — the source of truth for canonical classification. */
36
+ stateType: string;
28
37
  assignee: string;
29
38
  updatedAt: string;
30
39
  /**
@@ -37,8 +46,6 @@ export interface Issue {
37
46
  /** `undefined` whenever `repository` is — the two are populated together. */
38
47
  model: string | undefined;
39
48
  teamId: string;
40
- /** SlugId of the Linear project the issue belongs to — always one of `linear.projects[*].slugId`. */
41
- projectSlugId: string;
42
49
  blockers: Blocker[];
43
50
  hasMoreBlockers: boolean;
44
51
  }
@@ -71,22 +78,10 @@ export interface BoardState {
71
78
  parentSkips: ParentSkip[];
72
79
  }
73
80
  export { RepositoryResolutionError };
74
- export declare class UnknownProjectError extends Error {
75
- readonly ticket: string;
76
- readonly projectSlugId: string | undefined;
77
- readonly configuredSlugIds: readonly string[];
78
- constructor(arguments_: {
79
- ticket: string;
80
- projectSlugId: string | undefined;
81
- configuredSlugIds: readonly string[];
82
- });
83
- }
84
81
  export interface BoardSource {
85
82
  /**
86
- * Look up the configured projects and warn loudly on any that aren't
87
- * there. Throws only when zero projects resolve, so a typo in one of
88
- * several entries doesn't abort the watch loop. Run once at startup
89
- * so misconfigurations surface before the first tick.
83
+ * Verify the Linear API key resolves to a viewer. Run once at startup so
84
+ * misconfiguration surfaces before the first tick.
90
85
  */
91
86
  verify(): Promise<void>;
92
87
  /** Fetch the current board snapshot. Paginates internally. */
@@ -97,16 +92,40 @@ interface BoardSourceDeps {
97
92
  client: LinearClient;
98
93
  }
99
94
  export declare function createBoardSource(deps: BoardSourceDeps): BoardSource;
100
- export declare function projectFor(issue: Issue, config: ResolvedConfig): ResolvedProjectConfig;
101
- export declare function isTerminalStatusForIssue(issue: Issue, config: ResolvedConfig): boolean;
95
+ export declare function isIssueInProgress(issue: Pick<Issue, "stateType">): boolean;
96
+ export declare function isIssueTodo(issue: Pick<Issue, "stateType">): boolean;
97
+ export declare function isTerminalStateType(stateType: string | undefined): boolean;
98
+ export declare function isTerminalStatusForIssue(issue: Pick<Issue, "stateType">): boolean;
102
99
  /**
103
- * Terminal check for a blocker. When the blocker lives in a configured
104
- * project, we use that project's terminal list directly. Otherwise we
105
- * fall back to the union of terminals across all configured projects —
106
- * matches today's single-project "is this name in our terminal list?"
107
- * behavior so off-config blockers don't regress.
100
+ * Terminal check for a blocker. Driven by Linear's workflow `state.type` so
101
+ * renamed status columns ("Shipped" instead of "Done") are still classified
102
+ * correctly. An undefined `stateType` falls through to non-terminal.
108
103
  */
109
- export declare function isTerminalStatusForBlocker(blocker: Blocker, config: ResolvedConfig): boolean;
104
+ export declare function isTerminalStatusForBlocker(blocker: Blocker): boolean;
105
+ export interface IssueRelationNode {
106
+ type: string;
107
+ issue?: {
108
+ identifier: string;
109
+ title: string;
110
+ state?: {
111
+ name: string;
112
+ type?: string;
113
+ } | null;
114
+ } | null;
115
+ }
116
+ export declare function modelForResolution(resolution: Exclude<ModelResolution, {
117
+ kind: "no-label";
118
+ }>): string;
119
+ export declare function resolveTodoAgentMetadata(arguments_: {
120
+ ticket: string;
121
+ description: string | undefined;
122
+ modelResolution: ModelResolution;
123
+ config: ResolvedConfig;
124
+ isTodo: boolean;
125
+ }): {
126
+ repository: string | undefined;
127
+ model: string | undefined;
128
+ };
110
129
  interface ResolvedIssue {
111
130
  uuid: string;
112
131
  title: string;
@@ -114,19 +133,18 @@ interface ResolvedIssue {
114
133
  repository: string;
115
134
  model: string;
116
135
  teamId: string;
117
- projectSlugId: string;
118
136
  }
119
137
  export interface RawLinearIssue {
120
138
  uuid: string;
121
139
  title: string;
122
140
  description: string;
123
141
  teamId: string;
124
- projectSlugId: string | undefined;
125
142
  labels: {
126
143
  name: string;
127
144
  }[];
128
145
  /** Linear workflow state name, e.g. "Todo", "In Review". May be "" if state was null. */
129
146
  stateName: string;
147
+ stateType?: string;
130
148
  blockers: Blocker[];
131
149
  hasMoreBlockers: boolean;
132
150
  /**
@@ -148,7 +166,6 @@ export declare function fetchRawLinearIssue(arguments_: {
148
166
  }): Promise<RawLinearIssue>;
149
167
  export declare function fetchInProgressIssueCount(arguments_: {
150
168
  client: LinearClient;
151
- config: ResolvedConfig;
152
169
  }): Promise<number>;
153
170
  export type RepositoryResolution = {
154
171
  kind: "ok";
@@ -182,14 +199,13 @@ export declare function resolveModelFor(arguments_: {
182
199
  /**
183
200
  * `agent-any` collapses to `models.default` here — manual setup doesn't run
184
201
  * the usage-gated `any` resolver, so the caller gets a concrete model name
185
- * instead of a sentinel that downstream code can't interpret. Throws
186
- * `UnknownProjectError` when the ticket lives in a Linear project that
187
- * isn't listed in `linear.projects`, so callers can surface the misconfiguration
188
- * instead of silently using the wrong status names.
202
+ * instead of a sentinel that downstream code can't interpret.
189
203
  */
190
204
  export declare function fetchResolvedIssue(arguments_: {
191
205
  client: LinearClient;
192
206
  config: ResolvedConfig;
193
207
  ticket: string;
194
208
  }): Promise<ResolvedIssue>;
209
+ export declare function warnIfDisabledFallback(ticket: string, modelResolution: ModelResolution, config: ResolvedConfig): void;
210
+ export declare function blockersFromRelations(relations: IssueRelationNode[]): Blocker[];
195
211
  //# sourceMappingURL=boardSource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boardSource.d.ts","sourceRoot":"","sources":["../../src/lib/boardSource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boardSource.d.ts","sourceRoot":"","sources":["../../src/lib/boardSource.ts"],"names":[],"mappings":"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"}