ghostrail 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -3
- package/dist/agent/claude-code.d.ts +10 -0
- package/dist/agent/claude-code.d.ts.map +1 -1
- package/dist/agent/claude-code.js +20 -0
- package/dist/agent/claude-code.js.map +1 -1
- package/dist/agent/result.d.ts.map +1 -1
- package/dist/agent/result.js +13 -2
- package/dist/agent/result.js.map +1 -1
- package/dist/backend/container.d.ts +18 -0
- package/dist/backend/container.d.ts.map +1 -1
- package/dist/backend/container.js +33 -10
- package/dist/backend/container.js.map +1 -1
- package/dist/backend/git-credentials.d.ts +18 -0
- package/dist/backend/git-credentials.d.ts.map +1 -0
- package/dist/backend/git-credentials.js +30 -0
- package/dist/backend/git-credentials.js.map +1 -0
- package/dist/backend/local-worktree.d.ts.map +1 -1
- package/dist/backend/local-worktree.js +21 -0
- package/dist/backend/local-worktree.js.map +1 -1
- package/dist/backend/types.d.ts +12 -1
- package/dist/backend/types.d.ts.map +1 -1
- package/dist/claude-profile/classify.d.ts +41 -0
- package/dist/claude-profile/classify.d.ts.map +1 -0
- package/dist/claude-profile/classify.js +103 -0
- package/dist/claude-profile/classify.js.map +1 -0
- package/dist/claude-profile/index.d.ts +3 -0
- package/dist/claude-profile/index.d.ts.map +1 -0
- package/dist/claude-profile/index.js +3 -0
- package/dist/claude-profile/index.js.map +1 -0
- package/dist/claude-profile/setup.d.ts +33 -0
- package/dist/claude-profile/setup.d.ts.map +1 -0
- package/dist/claude-profile/setup.js +81 -0
- package/dist/claude-profile/setup.js.map +1 -0
- package/dist/cli/commands.d.ts +67 -2
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +420 -17
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +20 -2
- package/dist/commands/help.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +61 -9
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +51 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +4 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/factory/build.d.ts +24 -0
- package/dist/factory/build.d.ts.map +1 -1
- package/dist/factory/build.js +80 -11
- package/dist/factory/build.js.map +1 -1
- package/dist/loop/concurrency.d.ts +13 -0
- package/dist/loop/concurrency.d.ts.map +1 -0
- package/dist/loop/concurrency.js +27 -0
- package/dist/loop/concurrency.js.map +1 -0
- package/dist/loop/engine.d.ts.map +1 -1
- package/dist/loop/engine.js +19 -14
- package/dist/loop/engine.js.map +1 -1
- package/dist/loop/index.d.ts +2 -0
- package/dist/loop/index.d.ts.map +1 -1
- package/dist/loop/index.js +2 -0
- package/dist/loop/index.js.map +1 -1
- package/dist/loop/ports.d.ts +37 -1
- package/dist/loop/ports.d.ts.map +1 -1
- package/dist/loop/watch.d.ts +25 -0
- package/dist/loop/watch.d.ts.map +1 -0
- package/dist/loop/watch.js +45 -0
- package/dist/loop/watch.js.map +1 -0
- package/dist/publish/gh.d.ts +20 -1
- package/dist/publish/gh.d.ts.map +1 -1
- package/dist/publish/gh.js +37 -3
- package/dist/publish/gh.js.map +1 -1
- package/dist/publish/githost.d.ts +12 -0
- package/dist/publish/githost.d.ts.map +1 -1
- package/dist/publish/githost.js +14 -0
- package/dist/publish/githost.js.map +1 -1
- package/dist/publish/github-publisher.d.ts +1 -1
- package/dist/publish/github-publisher.d.ts.map +1 -1
- package/dist/publish/github-publisher.js +6 -5
- package/dist/publish/github-publisher.js.map +1 -1
- package/dist/respond/respond.d.ts +10 -1
- package/dist/respond/respond.d.ts.map +1 -1
- package/dist/respond/respond.js +37 -3
- package/dist/respond/respond.js.map +1 -1
- package/dist/secrets/env-file.d.ts +23 -0
- package/dist/secrets/env-file.d.ts.map +1 -0
- package/dist/secrets/env-file.js +70 -0
- package/dist/secrets/env-file.js.map +1 -0
- package/dist/secrets/index.d.ts +4 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/load.d.ts +24 -0
- package/dist/secrets/load.d.ts.map +1 -0
- package/dist/secrets/load.js +43 -0
- package/dist/secrets/load.js.map +1 -0
- package/dist/skill/install.d.ts +56 -0
- package/dist/skill/install.d.ts.map +1 -0
- package/dist/skill/install.js +93 -0
- package/dist/skill/install.js.map +1 -0
- package/dist/source/linear.d.ts +51 -8
- package/dist/source/linear.d.ts.map +1 -1
- package/dist/source/linear.js +213 -23
- package/dist/source/linear.js.map +1 -1
- package/dist/triage/apply.d.ts +28 -0
- package/dist/triage/apply.d.ts.map +1 -0
- package/dist/triage/apply.js +68 -0
- package/dist/triage/apply.js.map +1 -0
- package/dist/triage/engine.d.ts +31 -0
- package/dist/triage/engine.d.ts.map +1 -0
- package/dist/triage/engine.js +122 -0
- package/dist/triage/engine.js.map +1 -0
- package/dist/triage/index.d.ts +4 -0
- package/dist/triage/index.d.ts.map +1 -0
- package/dist/triage/index.js +4 -0
- package/dist/triage/index.js.map +1 -0
- package/dist/triage/plan.d.ts +37 -0
- package/dist/triage/plan.d.ts.map +1 -0
- package/dist/triage/plan.js +75 -0
- package/dist/triage/plan.js.map +1 -0
- package/dist/vendor/skilltend/apply.d.ts +25 -0
- package/dist/vendor/skilltend/apply.d.ts.map +1 -0
- package/dist/vendor/skilltend/apply.js +85 -0
- package/dist/vendor/skilltend/apply.js.map +1 -0
- package/dist/vendor/skilltend/detect.d.ts +35 -0
- package/dist/vendor/skilltend/detect.d.ts.map +1 -0
- package/dist/vendor/skilltend/detect.js +187 -0
- package/dist/vendor/skilltend/detect.js.map +1 -0
- package/dist/vendor/skilltend/frontmatter.d.ts +5 -0
- package/dist/vendor/skilltend/frontmatter.d.ts.map +1 -0
- package/dist/vendor/skilltend/frontmatter.js +59 -0
- package/dist/vendor/skilltend/frontmatter.js.map +1 -0
- package/dist/vendor/skilltend/fsFacade.d.ts +24 -0
- package/dist/vendor/skilltend/fsFacade.d.ts.map +1 -0
- package/dist/vendor/skilltend/fsFacade.js +68 -0
- package/dist/vendor/skilltend/fsFacade.js.map +1 -0
- package/dist/vendor/skilltend/paths.d.ts +28 -0
- package/dist/vendor/skilltend/paths.d.ts.map +1 -0
- package/dist/vendor/skilltend/paths.js +24 -0
- package/dist/vendor/skilltend/paths.js.map +1 -0
- package/dist/vendor/skilltend/plan.d.ts +46 -0
- package/dist/vendor/skilltend/plan.d.ts.map +1 -0
- package/dist/vendor/skilltend/plan.js +79 -0
- package/dist/vendor/skilltend/plan.js.map +1 -0
- package/dist/vendor/skilltend/registry.d.ts +56 -0
- package/dist/vendor/skilltend/registry.d.ts.map +1 -0
- package/dist/vendor/skilltend/registry.js +129 -0
- package/dist/vendor/skilltend/registry.js.map +1 -0
- package/docker/factory.Dockerfile +39 -0
- package/package.json +4 -3
- package/skill/ghostrail/SKILL.md +145 -0
- package/templates/{fix-bugs-local → code-local}/README.md +3 -3
- package/templates/code-local/ghostrail.toml +44 -0
- package/templates/code-local/prompts/resolve-issue.md +31 -0
- package/templates/code-local/prompts/respond.md +27 -0
- package/templates/code-local/prompts/triage.md +51 -0
- package/templates/content-loop/ghostrail.toml +5 -2
- package/templates/content-loop/prompts/respond.md +25 -0
- package/templates/fix-bugs-local/ghostrail.toml +0 -37
- package/templates/fix-bugs-local/prompts/fix-bug.md +0 -27
package/dist/source/linear.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GHOSTRAIL_MARKER } from "../publish/githost.js";
|
|
1
2
|
export const LINEAR_ENDPOINT = "https://api.linear.app/graphql";
|
|
2
3
|
/**
|
|
3
4
|
* A default requester over `fetch`, authenticating with a Linear personal API
|
|
@@ -27,18 +28,39 @@ query EligibleIssues($filter: IssueFilter!, $first: Int!) {
|
|
|
27
28
|
}
|
|
28
29
|
}`;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
31
|
+
* Translate an assignee constraint into a Linear `assignee` sub-filter, or
|
|
32
|
+
* undefined when there is nothing to filter. `"unassigned"` matches a null
|
|
33
|
+
* assignee; `"me"` matches `viewerId` (dropped if the viewer is unresolved, so
|
|
34
|
+
* we never accidentally match everyone); anything containing `@` matches by
|
|
35
|
+
* email; otherwise by user id.
|
|
33
36
|
*/
|
|
34
|
-
export function
|
|
37
|
+
export function assigneeClause(assignee, viewerId) {
|
|
38
|
+
if (assignee === undefined)
|
|
39
|
+
return undefined;
|
|
40
|
+
if (assignee === "unassigned")
|
|
41
|
+
return { null: true };
|
|
42
|
+
if (assignee === "me")
|
|
43
|
+
return viewerId === undefined ? undefined : { id: { eq: viewerId } };
|
|
44
|
+
if (assignee.includes("@"))
|
|
45
|
+
return { email: { eq: assignee } };
|
|
46
|
+
return { id: { eq: assignee } };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build the Linear `IssueFilter` for an eligibility spec. Every provided
|
|
50
|
+
* constraint is combined (implicit AND): team key, project name, state name,
|
|
51
|
+
* assignee, and each label (via `and`). Only the provided fields are included.
|
|
52
|
+
*/
|
|
53
|
+
export function buildIssueFilter(eligible, scope = {}) {
|
|
35
54
|
const filter = {};
|
|
36
|
-
if (teamKey !== undefined)
|
|
37
|
-
filter.team = { key: { eq: teamKey } };
|
|
55
|
+
if (scope.teamKey !== undefined)
|
|
56
|
+
filter.team = { key: { eq: scope.teamKey } };
|
|
57
|
+
if (scope.project !== undefined)
|
|
58
|
+
filter.project = { name: { eq: scope.project } };
|
|
38
59
|
if (eligible.state !== undefined)
|
|
39
60
|
filter.state = { name: { eq: eligible.state } };
|
|
40
|
-
|
|
41
|
-
|
|
61
|
+
const assignee = assigneeClause(eligible.assignee, scope.viewerId);
|
|
62
|
+
if (assignee !== undefined)
|
|
63
|
+
filter.assignee = assignee;
|
|
42
64
|
if (eligible.labels.length > 0) {
|
|
43
65
|
filter.and = eligible.labels.map((name) => ({ labels: { some: { name: { eq: name } } } }));
|
|
44
66
|
}
|
|
@@ -54,11 +76,10 @@ export function parseIssueNodes(data) {
|
|
|
54
76
|
continue;
|
|
55
77
|
const record = node;
|
|
56
78
|
const { id, identifier, title, url } = record;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
typeof url === "string")
|
|
61
|
-
parsed.push({ id, identifier, title, url });
|
|
79
|
+
// Require the identifying fields; `url` is display-only, so a node without it
|
|
80
|
+
// is still kept (mapped with url undefined) rather than silently dropped.
|
|
81
|
+
if (typeof id === "string" && typeof identifier === "string" && typeof title === "string") {
|
|
82
|
+
parsed.push({ id, identifier, title, ...(typeof url === "string" ? { url } : {}) });
|
|
62
83
|
}
|
|
63
84
|
}
|
|
64
85
|
return parsed;
|
|
@@ -66,10 +87,33 @@ export function parseIssueNodes(data) {
|
|
|
66
87
|
const BOOTSTRAP_QUERY = `
|
|
67
88
|
query Bootstrap($teamKey: String!) {
|
|
68
89
|
viewer { id }
|
|
90
|
+
teams(filter: { key: { eq: $teamKey } }) { nodes { id } }
|
|
69
91
|
workflowStates(filter: { team: { key: { eq: $teamKey } } }) {
|
|
70
92
|
nodes { id name }
|
|
71
93
|
}
|
|
72
94
|
}`;
|
|
95
|
+
const ISSUE_CREATE = `
|
|
96
|
+
mutation IssueCreate($input: IssueCreateInput!) {
|
|
97
|
+
issueCreate(input: $input) { success issue { id identifier title url } }
|
|
98
|
+
}`;
|
|
99
|
+
const ISSUE_CHILDREN_QUERY = `
|
|
100
|
+
query IssueChildren($id: String!) {
|
|
101
|
+
issue(id: $id) {
|
|
102
|
+
children(first: 100) {
|
|
103
|
+
nodes { id identifier title url }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}`;
|
|
107
|
+
/** Extract child issues from an `issue.children` payload, skipping malformed nodes. */
|
|
108
|
+
export function parseChildIssues(data) {
|
|
109
|
+
const issue = data.issue;
|
|
110
|
+
const nodes = Array.isArray(issue?.children?.nodes) ? issue.children.nodes : [];
|
|
111
|
+
return parseIssueNodes({ issues: { nodes } });
|
|
112
|
+
}
|
|
113
|
+
const ISSUE_RELATION_CREATE = `
|
|
114
|
+
mutation IssueRelationCreate($input: IssueRelationCreateInput!) {
|
|
115
|
+
issueRelationCreate(input: $input) { success }
|
|
116
|
+
}`;
|
|
73
117
|
const ISSUE_UPDATE = `
|
|
74
118
|
mutation IssueUpdate($id: String!, $input: IssueUpdateInput!) {
|
|
75
119
|
issueUpdate(id: $id, input: $input) { success }
|
|
@@ -78,6 +122,73 @@ const COMMENT_CREATE = `
|
|
|
78
122
|
mutation CommentCreate($input: CommentCreateInput!) {
|
|
79
123
|
commentCreate(input: $input) { success }
|
|
80
124
|
}`;
|
|
125
|
+
const ISSUE_COMMENTS_QUERY = `
|
|
126
|
+
query IssueComments($id: String!) {
|
|
127
|
+
issue(id: $id) {
|
|
128
|
+
comments(first: 100) {
|
|
129
|
+
nodes { body createdAt user { displayName } }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}`;
|
|
133
|
+
/** Extract comments from an `issue.comments` payload, oldest-first as returned. */
|
|
134
|
+
export function parseComments(data) {
|
|
135
|
+
const issue = data.issue;
|
|
136
|
+
const nodes = Array.isArray(issue?.comments?.nodes) ? issue.comments.nodes : [];
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const node of nodes) {
|
|
139
|
+
if (node === null || typeof node !== "object")
|
|
140
|
+
continue;
|
|
141
|
+
const record = node;
|
|
142
|
+
const { body, createdAt } = record;
|
|
143
|
+
if (typeof body !== "string" || typeof createdAt !== "string")
|
|
144
|
+
continue;
|
|
145
|
+
const author = record.user?.displayName;
|
|
146
|
+
out.push({ author: typeof author === "string" ? author : "unknown", body, createdAt });
|
|
147
|
+
}
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
const ISSUE_HISTORY_QUERY = `
|
|
151
|
+
query IssueHistory($id: String!) {
|
|
152
|
+
issue(id: $id) {
|
|
153
|
+
history(first: 50) {
|
|
154
|
+
nodes { createdAt fromAssignee { id } toAssignee { id } }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}`;
|
|
158
|
+
/** Extract assignment history entries from an `issue.history` payload. */
|
|
159
|
+
export function parseHistory(data) {
|
|
160
|
+
const issue = data.issue;
|
|
161
|
+
const nodes = Array.isArray(issue?.history?.nodes) ? issue.history.nodes : [];
|
|
162
|
+
const out = [];
|
|
163
|
+
for (const node of nodes) {
|
|
164
|
+
if (node === null || typeof node !== "object")
|
|
165
|
+
continue;
|
|
166
|
+
const record = node;
|
|
167
|
+
const createdAt = record.createdAt;
|
|
168
|
+
if (typeof createdAt !== "string")
|
|
169
|
+
continue;
|
|
170
|
+
const from = record.fromAssignee?.id;
|
|
171
|
+
const to = record.toAssignee?.id;
|
|
172
|
+
out.push({
|
|
173
|
+
createdAt,
|
|
174
|
+
fromAssigneeId: typeof from === "string" ? from : null,
|
|
175
|
+
toAssigneeId: typeof to === "string" ? to : null,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The assignee an issue had immediately before the bot (`botId`) was assigned to
|
|
182
|
+
* it: the `fromAssignee` of the most recent history entry whose `toAssignee` is
|
|
183
|
+
* the bot. Returns null when there was no prior assignee (or no such event), so
|
|
184
|
+
* the caller unassigns.
|
|
185
|
+
*/
|
|
186
|
+
export function lastAssigneeBeforeBot(history, botId) {
|
|
187
|
+
const [mostRecent] = history
|
|
188
|
+
.filter((entry) => entry.toAssigneeId === botId)
|
|
189
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
190
|
+
return mostRecent === undefined ? null : mostRecent.fromAssigneeId;
|
|
191
|
+
}
|
|
81
192
|
/**
|
|
82
193
|
* The Linear implementation of the {@link Source} port, over the GraphQL API
|
|
83
194
|
* (a headless `claude -p` has no Linear MCP). Claiming an item moves it to the
|
|
@@ -92,7 +203,8 @@ export class LinearSource {
|
|
|
92
203
|
constructor(request, opts) {
|
|
93
204
|
this.request = request;
|
|
94
205
|
this.opts = {
|
|
95
|
-
|
|
206
|
+
team: opts.team,
|
|
207
|
+
...(opts.project === undefined ? {} : { project: opts.project }),
|
|
96
208
|
eligible: opts.eligible,
|
|
97
209
|
inProgressState: opts.inProgressState ?? "In Progress",
|
|
98
210
|
resetState: opts.resetState ?? opts.eligible.state ?? "Todo",
|
|
@@ -100,14 +212,24 @@ export class LinearSource {
|
|
|
100
212
|
};
|
|
101
213
|
}
|
|
102
214
|
async listEligible() {
|
|
215
|
+
// Only "me" needs the viewer id, and only then do we pay for a bootstrap.
|
|
216
|
+
const viewerId = this.opts.eligible.assignee === "me" ? (await this.ensureBootstrap()).viewerId : undefined;
|
|
103
217
|
const data = await this.request(ELIGIBLE_ISSUES_QUERY, {
|
|
104
|
-
filter: buildIssueFilter(this.opts.eligible,
|
|
218
|
+
filter: buildIssueFilter(this.opts.eligible, {
|
|
219
|
+
teamKey: this.opts.team,
|
|
220
|
+
...(this.opts.project === undefined ? {} : { project: this.opts.project }),
|
|
221
|
+
...(viewerId === undefined ? {} : { viewerId }),
|
|
222
|
+
}),
|
|
105
223
|
first: this.opts.maxItems,
|
|
106
224
|
});
|
|
107
225
|
const nodes = parseIssueNodes(data);
|
|
108
226
|
for (const node of nodes)
|
|
109
227
|
this.uuidByIdentifier.set(node.identifier, node.id);
|
|
110
|
-
return nodes.map((node) => ({
|
|
228
|
+
return nodes.map((node) => ({
|
|
229
|
+
id: node.identifier,
|
|
230
|
+
title: node.title,
|
|
231
|
+
...(node.url === undefined ? {} : { url: node.url }),
|
|
232
|
+
}));
|
|
111
233
|
}
|
|
112
234
|
async claim(item) {
|
|
113
235
|
const { viewerId, stateIdByName } = await this.ensureBootstrap();
|
|
@@ -119,14 +241,26 @@ export class LinearSource {
|
|
|
119
241
|
return true;
|
|
120
242
|
}
|
|
121
243
|
async comment(item, body) {
|
|
122
|
-
|
|
244
|
+
// Carry the marker so the respond pass never treats the bot's own comments
|
|
245
|
+
// as human feedback to act on.
|
|
246
|
+
await this.request(COMMENT_CREATE, {
|
|
247
|
+
input: { issueId: await this.uuidFor(item), body: `${body}\n\n${GHOSTRAIL_MARKER}` },
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
async listComments(item) {
|
|
251
|
+
// Linear's `issue(id:)` resolves the human identifier (e.g. "TJ-123"), so
|
|
252
|
+
// this works in the respond pass without a prior listEligible.
|
|
253
|
+
const data = await this.request(ISSUE_COMMENTS_QUERY, { id: item.id });
|
|
254
|
+
return parseComments(data);
|
|
123
255
|
}
|
|
124
256
|
async reassignToHuman(item) {
|
|
125
257
|
const { viewerId } = await this.ensureBootstrap();
|
|
126
|
-
await this.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
});
|
|
258
|
+
const id = await this.uuidFor(item);
|
|
259
|
+
// Hand the issue back to whoever held it just before the bot; unassign if
|
|
260
|
+
// there was no prior assignee.
|
|
261
|
+
const data = await this.request(ISSUE_HISTORY_QUERY, { id });
|
|
262
|
+
const target = lastAssigneeBeforeBot(parseHistory(data), viewerId);
|
|
263
|
+
await this.request(ISSUE_UPDATE, { id, input: { assigneeId: target } });
|
|
130
264
|
}
|
|
131
265
|
async reset(item) {
|
|
132
266
|
const { stateIdByName } = await this.ensureBootstrap();
|
|
@@ -136,10 +270,63 @@ export class LinearSource {
|
|
|
136
270
|
input: stateId === undefined ? { assigneeId: null } : { stateId, assigneeId: null },
|
|
137
271
|
});
|
|
138
272
|
}
|
|
273
|
+
async listSubIssues(parent) {
|
|
274
|
+
// Resolves the human identifier directly, so triage can check for existing
|
|
275
|
+
// children on a retry without a prior listEligible.
|
|
276
|
+
const data = await this.request(ISSUE_CHILDREN_QUERY, { id: parent.id });
|
|
277
|
+
const nodes = parseChildIssues(data);
|
|
278
|
+
for (const node of nodes)
|
|
279
|
+
this.uuidByIdentifier.set(node.identifier, node.id);
|
|
280
|
+
return nodes.map((node) => ({
|
|
281
|
+
id: node.identifier,
|
|
282
|
+
title: node.title,
|
|
283
|
+
...(node.url === undefined ? {} : { url: node.url }),
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
async createSubIssue(parent, spec) {
|
|
287
|
+
const { teamId } = await this.ensureBootstrap();
|
|
288
|
+
const parentId = await this.uuidFor(parent);
|
|
289
|
+
const input = {
|
|
290
|
+
teamId,
|
|
291
|
+
title: spec.title,
|
|
292
|
+
parentId,
|
|
293
|
+
...(spec.description === undefined ? {} : { description: spec.description }),
|
|
294
|
+
};
|
|
295
|
+
const data = await this.request(ISSUE_CREATE, { input });
|
|
296
|
+
const issue = data.issueCreate?.issue;
|
|
297
|
+
const record = (issue ?? {});
|
|
298
|
+
const { id, identifier, title, url } = record;
|
|
299
|
+
if (typeof id !== "string" || typeof identifier !== "string") {
|
|
300
|
+
throw new Error("Linear: sub-issue create returned no identifier");
|
|
301
|
+
}
|
|
302
|
+
// Cache the new identifier so it can be linked/acted on without a re-list.
|
|
303
|
+
this.uuidByIdentifier.set(identifier, id);
|
|
304
|
+
return {
|
|
305
|
+
id: identifier,
|
|
306
|
+
title: typeof title === "string" ? title : spec.title,
|
|
307
|
+
...(typeof url === "string" ? { url } : {}),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
async linkBlockedBy(blocked, blocker) {
|
|
311
|
+
const blockedId = await this.uuidFor(blocked);
|
|
312
|
+
const blockerId = await this.uuidFor(blocker);
|
|
313
|
+
// "blocker blocks blocked" is the inverse of "blocked is blocked by blocker".
|
|
314
|
+
await this.request(ISSUE_RELATION_CREATE, {
|
|
315
|
+
input: { issueId: blockerId, relatedIssueId: blockedId, type: "blocks" },
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
async markDecomposed(parent) {
|
|
319
|
+
// Unassign only (no state change), so the parent leaves the bot's triage
|
|
320
|
+
// queue but keeps its place otherwise.
|
|
321
|
+
await this.request(ISSUE_UPDATE, {
|
|
322
|
+
id: await this.uuidFor(parent),
|
|
323
|
+
input: { assigneeId: null },
|
|
324
|
+
});
|
|
325
|
+
}
|
|
139
326
|
async ensureBootstrap() {
|
|
140
327
|
if (this.bootstrap !== undefined)
|
|
141
328
|
return this.bootstrap;
|
|
142
|
-
const data = await this.request(BOOTSTRAP_QUERY, { teamKey: this.opts.
|
|
329
|
+
const data = await this.request(BOOTSTRAP_QUERY, { teamKey: this.opts.team });
|
|
143
330
|
const viewer = data.viewer;
|
|
144
331
|
const states = data.workflowStates?.nodes;
|
|
145
332
|
const stateIdByName = new Map();
|
|
@@ -153,7 +340,10 @@ export class LinearSource {
|
|
|
153
340
|
}
|
|
154
341
|
if (typeof viewer?.id !== "string")
|
|
155
342
|
throw new Error("Linear bootstrap: no viewer id");
|
|
156
|
-
|
|
343
|
+
const teamNodes = data.teams?.nodes;
|
|
344
|
+
const firstTeam = Array.isArray(teamNodes) ? teamNodes[0] : undefined;
|
|
345
|
+
const teamId = typeof firstTeam?.id === "string" ? firstTeam.id : "";
|
|
346
|
+
this.bootstrap = { viewerId: viewer.id, teamId, stateIdByName };
|
|
157
347
|
return this.bootstrap;
|
|
158
348
|
}
|
|
159
349
|
async uuidFor(item) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/source/linear.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/source/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Logger, TriageSource, WorkItem } from "../loop/ports.js";
|
|
2
|
+
import type { TriagePlan } from "./plan.js";
|
|
3
|
+
/** The outcome of applying a triage plan to a parent issue. */
|
|
4
|
+
export interface TriageResult {
|
|
5
|
+
itemId: string;
|
|
6
|
+
state: "split" | "noop" | "failed";
|
|
7
|
+
/** Identifiers of the created sub-issues (split only). */
|
|
8
|
+
createdIds?: string[];
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Apply a validated triage plan through the source. For a split: create each
|
|
13
|
+
* sub-issue (in order, unassigned), wire up the blocked-by links declared by
|
|
14
|
+
* `dependsOn`, comment a summary on the parent, and mark the parent decomposed
|
|
15
|
+
* (unassigned, out of the triage queue). For a noop: comment and mark it handled.
|
|
16
|
+
*
|
|
17
|
+
* Sub-issues are created unassigned on purpose: a human approves each by
|
|
18
|
+
* assigning it to the factory bot, which drops it into the fix queue.
|
|
19
|
+
*
|
|
20
|
+
* **Resumable.** A previous run that died partway leaves real sub-issues behind,
|
|
21
|
+
* so the plan is matched against the parent's existing children by title and
|
|
22
|
+
* reuses them rather than creating duplicates. Blocked-by links are only made
|
|
23
|
+
* when one side is newly created: if both already existed, the earlier run made
|
|
24
|
+
* that link. The parent is marked decomposed last, so an interrupted run leaves
|
|
25
|
+
* it in the triage queue to be retried.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyTriagePlan(source: TriageSource, parent: WorkItem, plan: TriagePlan, logger?: Logger): Promise<TriageResult>;
|
|
28
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/triage/apply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,MAAmB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAoDvB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const nullLogger = { info: () => { }, warn: () => { } };
|
|
2
|
+
function subIssueSpec(title, description) {
|
|
3
|
+
return description === undefined ? { title } : { title, description };
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Apply a validated triage plan through the source. For a split: create each
|
|
7
|
+
* sub-issue (in order, unassigned), wire up the blocked-by links declared by
|
|
8
|
+
* `dependsOn`, comment a summary on the parent, and mark the parent decomposed
|
|
9
|
+
* (unassigned, out of the triage queue). For a noop: comment and mark it handled.
|
|
10
|
+
*
|
|
11
|
+
* Sub-issues are created unassigned on purpose: a human approves each by
|
|
12
|
+
* assigning it to the factory bot, which drops it into the fix queue.
|
|
13
|
+
*
|
|
14
|
+
* **Resumable.** A previous run that died partway leaves real sub-issues behind,
|
|
15
|
+
* so the plan is matched against the parent's existing children by title and
|
|
16
|
+
* reuses them rather than creating duplicates. Blocked-by links are only made
|
|
17
|
+
* when one side is newly created: if both already existed, the earlier run made
|
|
18
|
+
* that link. The parent is marked decomposed last, so an interrupted run leaves
|
|
19
|
+
* it in the triage queue to be retried.
|
|
20
|
+
*/
|
|
21
|
+
export async function applyTriagePlan(source, parent, plan, logger = nullLogger) {
|
|
22
|
+
if (plan.status === "noop") {
|
|
23
|
+
await source.comment(parent, `Triage: no split needed.${plan.reason ? ` ${plan.reason}` : ""}`);
|
|
24
|
+
await source.markDecomposed(parent);
|
|
25
|
+
logger.info(`${parent.id}: triage noop`);
|
|
26
|
+
return { itemId: parent.id, state: "noop" };
|
|
27
|
+
}
|
|
28
|
+
// Index the parent's existing children by title so a retry reuses them.
|
|
29
|
+
const existing = new Map();
|
|
30
|
+
for (const child of await source.listSubIssues(parent)) {
|
|
31
|
+
const key = child.title.trim();
|
|
32
|
+
if (!existing.has(key))
|
|
33
|
+
existing.set(key, child);
|
|
34
|
+
}
|
|
35
|
+
const created = [];
|
|
36
|
+
const isNew = [];
|
|
37
|
+
let reused = 0;
|
|
38
|
+
for (const spec of plan.subIssues) {
|
|
39
|
+
const match = existing.get(spec.title.trim());
|
|
40
|
+
if (match !== undefined) {
|
|
41
|
+
created.push(match);
|
|
42
|
+
isNew.push(false);
|
|
43
|
+
reused++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
created.push(await source.createSubIssue(parent, subIssueSpec(spec.title, spec.description)));
|
|
47
|
+
isNew.push(true);
|
|
48
|
+
}
|
|
49
|
+
for (let i = 0; i < plan.subIssues.length; i++) {
|
|
50
|
+
const blocked = created[i];
|
|
51
|
+
const deps = plan.subIssues[i]?.dependsOn ?? [];
|
|
52
|
+
if (blocked === undefined)
|
|
53
|
+
continue;
|
|
54
|
+
for (const dep of deps) {
|
|
55
|
+
const blocker = created[dep];
|
|
56
|
+
// Skip a link whose endpoints both predate this run: already linked.
|
|
57
|
+
if (blocker === undefined || (isNew[i] !== true && isNew[dep] !== true))
|
|
58
|
+
continue;
|
|
59
|
+
await source.linkBlockedBy(blocked, blocker);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const list = created.map((sub, i) => `- ${sub.id}: ${plan.subIssues[i]?.title ?? ""}`).join("\n");
|
|
63
|
+
await source.comment(parent, `Triage: split into ${created.length} sub-issue(s).${plan.reason ? ` ${plan.reason}` : ""}\n\n${list}\n\nAssign one to the factory bot to start work.`);
|
|
64
|
+
await source.markDecomposed(parent);
|
|
65
|
+
logger.info(`${parent.id}: triage split into ${created.length}${reused > 0 ? ` (${reused} reused)` : ""}`);
|
|
66
|
+
return { itemId: parent.id, state: "split", createdIds: created.map((sub) => sub.id) };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/triage/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Backend } from "../backend/types.js";
|
|
2
|
+
import type { GhostrailConfig } from "../config/schema.js";
|
|
3
|
+
import type { GlobalStore } from "../global/store.js";
|
|
4
|
+
import type { Agent, Lock, Logger, TriageSource } from "../loop/ports.js";
|
|
5
|
+
import { type TriageResult } from "./apply.js";
|
|
6
|
+
/** Path, relative to the workspace root, where the triage agent writes its plan. */
|
|
7
|
+
export declare const TRIAGE_PLAN_PATH = ".ghostrail/triage.json";
|
|
8
|
+
/** The result of a triage tick (one per item). */
|
|
9
|
+
export interface TriageTickResult {
|
|
10
|
+
lockAcquired: boolean;
|
|
11
|
+
results: TriageResult[];
|
|
12
|
+
}
|
|
13
|
+
export interface TriageDeps {
|
|
14
|
+
repoPath: string;
|
|
15
|
+
source: TriageSource;
|
|
16
|
+
backend: Backend;
|
|
17
|
+
agent: Agent;
|
|
18
|
+
lock: Lock;
|
|
19
|
+
logger?: Logger;
|
|
20
|
+
/** Optional global store for staging shared artifacts into the workspace. */
|
|
21
|
+
globalStore?: GlobalStore;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run one triage tick: discover issues in the triage queue and, for each (up to
|
|
25
|
+
* the guardrails), claim it, provision a workspace for repo context, run the
|
|
26
|
+
* triage agent (which writes a decomposition plan), and apply that plan through
|
|
27
|
+
* the source. Like the run loop it holds a single global lock and never touches
|
|
28
|
+
* code or PRs. Requires `config.triage` to be set.
|
|
29
|
+
*/
|
|
30
|
+
export declare function triageTick(deps: TriageDeps, config: GhostrailConfig): Promise<TriageTickResult>;
|
|
31
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/triage/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,YAAY,CAAC;AAGhE,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,2BAA2B,CAAC;AAKzD,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAmBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { stageArtifacts } from "../global/stage.js";
|
|
2
|
+
import { branchName } from "../loop/branch.js";
|
|
3
|
+
import { mapWithConcurrency } from "../loop/concurrency.js";
|
|
4
|
+
import { applyTriagePlan } from "./apply.js";
|
|
5
|
+
import { parseTriagePlan } from "./plan.js";
|
|
6
|
+
/** Path, relative to the workspace root, where the triage agent writes its plan. */
|
|
7
|
+
export const TRIAGE_PLAN_PATH = ".ghostrail/triage.json";
|
|
8
|
+
const BRANCH_PREFIX = "triage";
|
|
9
|
+
const nullLogger = { info: () => { }, warn: () => { } };
|
|
10
|
+
async function readWorkspaceFile(backend, workspace, path) {
|
|
11
|
+
const result = await backend.exec(workspace, ["cat", path]);
|
|
12
|
+
return result.exitCode === 0 ? result.stdout : undefined;
|
|
13
|
+
}
|
|
14
|
+
async function ignoreErrors(action) {
|
|
15
|
+
try {
|
|
16
|
+
await action();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// best-effort
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run one triage tick: discover issues in the triage queue and, for each (up to
|
|
24
|
+
* the guardrails), claim it, provision a workspace for repo context, run the
|
|
25
|
+
* triage agent (which writes a decomposition plan), and apply that plan through
|
|
26
|
+
* the source. Like the run loop it holds a single global lock and never touches
|
|
27
|
+
* code or PRs. Requires `config.triage` to be set.
|
|
28
|
+
*/
|
|
29
|
+
export async function triageTick(deps, config) {
|
|
30
|
+
const logger = deps.logger ?? nullLogger;
|
|
31
|
+
if (config.triage === undefined) {
|
|
32
|
+
throw new Error("triage requires a [triage] config section");
|
|
33
|
+
}
|
|
34
|
+
const triage = config.triage;
|
|
35
|
+
const acquired = await deps.lock.acquire();
|
|
36
|
+
if (!acquired) {
|
|
37
|
+
logger.warn("another tick holds the lock; skipping");
|
|
38
|
+
return { lockAcquired: false, results: [] };
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const eligible = await deps.source.listEligible();
|
|
42
|
+
const items = eligible.slice(0, config.guardrails.maxItemsPerRun);
|
|
43
|
+
logger.info(`triage: discovered ${eligible.length} item(s), taking ${items.length}`);
|
|
44
|
+
const results = await mapWithConcurrency(items, config.guardrails.concurrency, (item) => triageItem(deps, config, triage.prompt, item, logger));
|
|
45
|
+
return { lockAcquired: true, results };
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await deps.lock.release();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function triageItem(deps, config, prompt, item, logger) {
|
|
52
|
+
let workspace;
|
|
53
|
+
try {
|
|
54
|
+
const claimed = await deps.source.claim(item);
|
|
55
|
+
if (!claimed) {
|
|
56
|
+
logger.info(`${item.id}: claim lost, skipping`);
|
|
57
|
+
return { itemId: item.id, state: "noop" };
|
|
58
|
+
}
|
|
59
|
+
const source = config.factory.source;
|
|
60
|
+
workspace = await deps.backend.provision({
|
|
61
|
+
repoPath: source ?? deps.repoPath,
|
|
62
|
+
baseBranch: config.factory.baseBranch,
|
|
63
|
+
branch: branchName(BRANCH_PREFIX, item.id, item.title),
|
|
64
|
+
...(source === undefined ? {} : { clone: true }),
|
|
65
|
+
...(config.backend.image === undefined ? {} : { image: config.backend.image }),
|
|
66
|
+
});
|
|
67
|
+
if (deps.globalStore !== undefined && config.artifacts.length > 0) {
|
|
68
|
+
await stageArtifacts(deps.backend, workspace, deps.globalStore, config.artifacts, logger);
|
|
69
|
+
}
|
|
70
|
+
const agentConfig = {
|
|
71
|
+
kind: config.agent.kind,
|
|
72
|
+
prompt,
|
|
73
|
+
allowedTools: config.agent.allowedTools,
|
|
74
|
+
};
|
|
75
|
+
const outcome = await deps.agent.run({
|
|
76
|
+
backend: deps.backend,
|
|
77
|
+
workspace,
|
|
78
|
+
item,
|
|
79
|
+
agent: agentConfig,
|
|
80
|
+
guardrails: config.guardrails,
|
|
81
|
+
});
|
|
82
|
+
return await route(deps, item, workspace, outcome, logger);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
logger.warn(`${item.id}: triage errored, resetting: ${message}`);
|
|
87
|
+
await ignoreErrors(() => deps.source.reset(item));
|
|
88
|
+
return { itemId: item.id, state: "failed", error: message };
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
if (workspace !== undefined) {
|
|
92
|
+
await ignoreErrors(() => deps.backend.teardown(workspace));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function route(deps, item, workspace, outcome, logger) {
|
|
97
|
+
if (outcome.status === "blocked") {
|
|
98
|
+
logger.info(`${item.id}: triage blocked, handing back to a human`);
|
|
99
|
+
await deps.source.comment(item, outcome.questions ?? "Triage needs a decision.");
|
|
100
|
+
await deps.source.reassignToHuman(item);
|
|
101
|
+
return { itemId: item.id, state: "noop" };
|
|
102
|
+
}
|
|
103
|
+
if (outcome.status === "failed") {
|
|
104
|
+
await deps.source.comment(item, `Triage failed: ${outcome.error ?? "unknown error"}`);
|
|
105
|
+
await deps.source.reset(item);
|
|
106
|
+
return { itemId: item.id, state: "failed", error: outcome.error ?? "unknown error" };
|
|
107
|
+
}
|
|
108
|
+
const raw = await readWorkspaceFile(deps.backend, workspace, TRIAGE_PLAN_PATH);
|
|
109
|
+
if (raw === undefined || raw.trim().length === 0) {
|
|
110
|
+
await deps.source.comment(item, "Triage produced no plan.");
|
|
111
|
+
await deps.source.reset(item);
|
|
112
|
+
return { itemId: item.id, state: "failed", error: "no triage plan written" };
|
|
113
|
+
}
|
|
114
|
+
const plan = parseTriagePlan(raw);
|
|
115
|
+
if (plan.status === "invalid") {
|
|
116
|
+
await deps.source.comment(item, `Triage plan was invalid: ${plan.error}`);
|
|
117
|
+
await deps.source.reset(item);
|
|
118
|
+
return { itemId: item.id, state: "failed", error: plan.error };
|
|
119
|
+
}
|
|
120
|
+
return applyTriagePlan(deps.source, item, plan, logger);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/triage/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { type TriageResult, applyTriagePlan } from "./apply.js";
|
|
2
|
+
export { type TriageDeps, TRIAGE_PLAN_PATH, type TriageTickResult, triageTick } from "./engine.js";
|
|
3
|
+
export { type ParsedPlan, parseTriagePlan, type SubIssuePlan, type TriagePlan } from "./plan.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|