frontier-mcp 0.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.
- package/README.md +104 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -0
- package/dist/domain.d.ts +230 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +23 -0
- package/dist/domain.js.map +1 -0
- package/dist/edges.d.ts +35 -0
- package/dist/edges.d.ts.map +1 -0
- package/dist/edges.js +61 -0
- package/dist/edges.js.map +1 -0
- package/dist/frontier.d.ts +12 -0
- package/dist/frontier.d.ts.map +1 -0
- package/dist/frontier.js +34 -0
- package/dist/frontier.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +29 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +210 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/driver.d.ts +131 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +43 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/markdown/create.d.ts +52 -0
- package/dist/storage/markdown/create.d.ts.map +1 -0
- package/dist/storage/markdown/create.js +298 -0
- package/dist/storage/markdown/create.js.map +1 -0
- package/dist/storage/markdown/driver.d.ts +7 -0
- package/dist/storage/markdown/driver.d.ts.map +1 -0
- package/dist/storage/markdown/driver.js +492 -0
- package/dist/storage/markdown/driver.js.map +1 -0
- package/dist/storage/markdown/frontmatter.d.ts +17 -0
- package/dist/storage/markdown/frontmatter.d.ts.map +1 -0
- package/dist/storage/markdown/frontmatter.js +36 -0
- package/dist/storage/markdown/frontmatter.js.map +1 -0
- package/dist/storage/markdown/header-doc.d.ts +56 -0
- package/dist/storage/markdown/header-doc.d.ts.map +1 -0
- package/dist/storage/markdown/header-doc.js +287 -0
- package/dist/storage/markdown/header-doc.js.map +1 -0
- package/dist/storage/markdown/legacy.d.ts +16 -0
- package/dist/storage/markdown/legacy.d.ts.map +1 -0
- package/dist/storage/markdown/legacy.js +152 -0
- package/dist/storage/markdown/legacy.js.map +1 -0
- package/dist/storage/markdown/migrate.d.ts +27 -0
- package/dist/storage/markdown/migrate.d.ts.map +1 -0
- package/dist/storage/markdown/migrate.js +158 -0
- package/dist/storage/markdown/migrate.js.map +1 -0
- package/dist/storage/markdown/serialize.d.ts +37 -0
- package/dist/storage/markdown/serialize.d.ts.map +1 -0
- package/dist/storage/markdown/serialize.js +321 -0
- package/dist/storage/markdown/serialize.js.map +1 -0
- package/dist/storage/markdown/ticket.d.ts +12 -0
- package/dist/storage/markdown/ticket.d.ts.map +1 -0
- package/dist/storage/markdown/ticket.js +97 -0
- package/dist/storage/markdown/ticket.js.map +1 -0
- package/dist/storage/markdown/write.d.ts +42 -0
- package/dist/storage/markdown/write.d.ts.map +1 -0
- package/dist/storage/markdown/write.js +134 -0
- package/dist/storage/markdown/write.js.map +1 -0
- package/dist/tools/create-tickets.d.ts +63 -0
- package/dist/tools/create-tickets.d.ts.map +1 -0
- package/dist/tools/create-tickets.js +161 -0
- package/dist/tools/create-tickets.js.map +1 -0
- package/dist/tools/edit-map.d.ts +29 -0
- package/dist/tools/edit-map.d.ts.map +1 -0
- package/dist/tools/edit-map.js +81 -0
- package/dist/tools/edit-map.js.map +1 -0
- package/dist/tools/get-board.d.ts +29 -0
- package/dist/tools/get-board.d.ts.map +1 -0
- package/dist/tools/get-board.js +190 -0
- package/dist/tools/get-board.js.map +1 -0
- package/dist/tools/get-tickets.d.ts +14 -0
- package/dist/tools/get-tickets.d.ts.map +1 -0
- package/dist/tools/get-tickets.js +56 -0
- package/dist/tools/get-tickets.js.map +1 -0
- package/dist/tools/list-efforts.d.ts +16 -0
- package/dist/tools/list-efforts.d.ts.map +1 -0
- package/dist/tools/list-efforts.js +38 -0
- package/dist/tools/list-efforts.js.map +1 -0
- package/dist/tools/migrate-effort.d.ts +11 -0
- package/dist/tools/migrate-effort.d.ts.map +1 -0
- package/dist/tools/migrate-effort.js +54 -0
- package/dist/tools/migrate-effort.js.map +1 -0
- package/dist/tools/spec.d.ts +12 -0
- package/dist/tools/spec.d.ts.map +1 -0
- package/dist/tools/spec.js +27 -0
- package/dist/tools/spec.js.map +1 -0
- package/dist/tools/update-ticket.d.ts +62 -0
- package/dist/tools/update-ticket.d.ts.map +1 -0
- package/dist/tools/update-ticket.js +164 -0
- package/dist/tools/update-ticket.js.map +1 -0
- package/dist/tracker-doc.d.ts +10 -0
- package/dist/tracker-doc.d.ts.map +1 -0
- package/dist/tracker-doc.js +16 -0
- package/dist/tracker-doc.js.map +1 -0
- package/dist/workspace-index.d.ts +39 -0
- package/dist/workspace-index.d.ts.map +1 -0
- package/dist/workspace-index.js +83 -0
- package/dist/workspace-index.js.map +1 -0
- package/dist/workspace-watcher.d.ts +24 -0
- package/dist/workspace-watcher.d.ts.map +1 -0
- package/dist/workspace-watcher.js +87 -0
- package/dist/workspace-watcher.js.map +1 -0
- package/dist/workspace.d.ts +23 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +70 -0
- package/dist/workspace.js.map +1 -0
- package/docs/agents/issue-tracker.md +141 -0
- package/package.json +56 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Effort, TicketSummary } from '../domain.ts';
|
|
3
|
+
export declare const getBoardInputSchema: {
|
|
4
|
+
effort: z.ZodString;
|
|
5
|
+
root: z.ZodOptional<z.ZodString>;
|
|
6
|
+
};
|
|
7
|
+
export declare const getBoardDescription: string;
|
|
8
|
+
export interface Board {
|
|
9
|
+
readonly effort: Effort;
|
|
10
|
+
readonly tickets: readonly TicketSummary[];
|
|
11
|
+
/** The Tickets takeable right now. Computed repo-wide; never read from a file. */
|
|
12
|
+
readonly frontier: ReadonlySet<TicketSummary>;
|
|
13
|
+
/** Every Ticket in the workspace, because Edges resolve repo-wide. */
|
|
14
|
+
readonly byId: ReadonlyMap<string, TicketSummary>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A Board is three views of one array — the Effort's slice of it, the Frontier
|
|
18
|
+
* over all of it, and an id lookup across all of it. Building them here keeps
|
|
19
|
+
* the identity relationship they depend on in one place: `frontier.has(ticket)`
|
|
20
|
+
* only works because every view derives from the same objects.
|
|
21
|
+
*/
|
|
22
|
+
export declare function boardFor(effort: Effort, all: readonly TicketSummary[]): Board;
|
|
23
|
+
/**
|
|
24
|
+
* One line per Ticket, and nothing an agent has to open a file to interpret.
|
|
25
|
+
* The whole point is that this costs a fraction of reading the Effort, so every
|
|
26
|
+
* character here is spent deliberately.
|
|
27
|
+
*/
|
|
28
|
+
export declare function renderBoard(board: Board): string;
|
|
29
|
+
//# sourceMappingURL=get-board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-board.d.ts","sourceRoot":"","sources":["../../src/tools/get-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG1D,eAAO,MAAM,mBAAmB;IAC9B,MAAM;IACN,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAEwC,CAAC;AAEzE,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IAC9C,sEAAsE;IACtE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,aAAa,EAAE,GAAG,KAAK,CAO7E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAgChD"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { frontierOf, indexById } from '../frontier.js';
|
|
3
|
+
export const getBoardInputSchema = {
|
|
4
|
+
effort: z.string().describe('Effort slug, as reported by list_efforts.'),
|
|
5
|
+
root: z.string().optional().describe('Workspace directory. Defaults to the session workspace.'),
|
|
6
|
+
};
|
|
7
|
+
export const getBoardDescription = "An Effort's Destination, then one line per Ticket — id, title, kind, status, Edges — with the " +
|
|
8
|
+
'Frontier marked. Never returns bodies; fetch those with get_tickets.';
|
|
9
|
+
/**
|
|
10
|
+
* A Board is three views of one array — the Effort's slice of it, the Frontier
|
|
11
|
+
* over all of it, and an id lookup across all of it. Building them here keeps
|
|
12
|
+
* the identity relationship they depend on in one place: `frontier.has(ticket)`
|
|
13
|
+
* only works because every view derives from the same objects.
|
|
14
|
+
*/
|
|
15
|
+
export function boardFor(effort, all) {
|
|
16
|
+
return {
|
|
17
|
+
effort,
|
|
18
|
+
tickets: all.filter(ticket => ticket.effort === effort.slug),
|
|
19
|
+
frontier: frontierOf(all),
|
|
20
|
+
byId: indexById(all),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* One line per Ticket, and nothing an agent has to open a file to interpret.
|
|
25
|
+
* The whole point is that this costs a fraction of reading the Effort, so every
|
|
26
|
+
* character here is spent deliberately.
|
|
27
|
+
*/
|
|
28
|
+
export function renderBoard(board) {
|
|
29
|
+
const { effort, tickets, frontier } = board;
|
|
30
|
+
const lines = [`effort: ${effort.slug}`];
|
|
31
|
+
// Header-doc prose is the author's, wrapped however they wrote it. Indenting
|
|
32
|
+
// continuation lines keeps a multi-paragraph Destination from being read as
|
|
33
|
+
// more Ticket lines, which are strictly one per line.
|
|
34
|
+
if (effort.destination !== undefined)
|
|
35
|
+
lines.push(labelled('destination', effort.destination));
|
|
36
|
+
else if (effort.specOpening !== undefined)
|
|
37
|
+
lines.push(labelled('spec', effort.specOpening));
|
|
38
|
+
if (tickets.length === 0) {
|
|
39
|
+
lines.push('', '(no tickets)');
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
const takeable = tickets.filter(ticket => frontier.has(ticket));
|
|
43
|
+
lines.push(takeable.length === 0
|
|
44
|
+
? 'frontier: none takeable in this Effort'
|
|
45
|
+
: `frontier: ${takeable.length} marked >`, '');
|
|
46
|
+
for (const ticket of tickets) {
|
|
47
|
+
const line = renderLine(ticket, board);
|
|
48
|
+
lines.push(frontier.has(ticket) ? `> ${line}` : line);
|
|
49
|
+
}
|
|
50
|
+
const warnings = collectWarnings(board);
|
|
51
|
+
if (warnings.length > 0)
|
|
52
|
+
lines.push('', 'warnings:', ...warnings.map(entry => ` ${entry}`));
|
|
53
|
+
return lines.join('\n');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* How long a claim may sit before it looks abandoned. Long enough that an agent
|
|
57
|
+
* working steadily is never flagged, short enough that a session which died
|
|
58
|
+
* overnight is visible the next morning.
|
|
59
|
+
*/
|
|
60
|
+
const STALE_AFTER_HOURS = 24;
|
|
61
|
+
/**
|
|
62
|
+
* A claim held past the threshold is reported and nothing more. Auto-expiry is
|
|
63
|
+
* explicitly out of scope: a long-running agent must never be silently robbed
|
|
64
|
+
* of its Ticket, so releasing one stays a human decision.
|
|
65
|
+
*/
|
|
66
|
+
function isStaleClaim(ticket) {
|
|
67
|
+
if (ticket.status !== 'claimed' || ticket.claimedAt === undefined)
|
|
68
|
+
return false;
|
|
69
|
+
const taken = Date.parse(ticket.claimedAt);
|
|
70
|
+
if (Number.isNaN(taken))
|
|
71
|
+
return false;
|
|
72
|
+
return Date.now() - taken > STALE_AFTER_HOURS * 60 * 60 * 1000;
|
|
73
|
+
}
|
|
74
|
+
function labelled(label, prose) {
|
|
75
|
+
return `${label}: ${prose.split('\n').join('\n ')}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fields are separated by two spaces, so any author-written value has its own
|
|
79
|
+
* whitespace collapsed first — a title containing a double space would
|
|
80
|
+
* otherwise forge a field boundary that is not there.
|
|
81
|
+
*/
|
|
82
|
+
function flat(prose) {
|
|
83
|
+
return prose.replace(/\s+/g, ' ').trim();
|
|
84
|
+
}
|
|
85
|
+
function renderLine(ticket, board) {
|
|
86
|
+
const parts = [
|
|
87
|
+
ticket.handle,
|
|
88
|
+
flat(ticket.title),
|
|
89
|
+
`${ticket.kind}/${ticket.status}`,
|
|
90
|
+
ticket.triage === undefined ? undefined : `triage=${ticket.triage}`,
|
|
91
|
+
ticket.blockedBy.length > 0
|
|
92
|
+
? `blocked_by=${ticket.blockedBy.map(id => renderEdge(id, ticket, board)).join(',')}`
|
|
93
|
+
: undefined,
|
|
94
|
+
ticket.answerGist === undefined ? undefined : `gist=${flat(ticket.answerGist)}`,
|
|
95
|
+
ticket.droppedReason === undefined ? undefined : `dropped=${flat(ticket.droppedReason)}`,
|
|
96
|
+
ticket.claimedBy === undefined ? undefined : `claimed_by=${flat(ticket.claimedBy)}`,
|
|
97
|
+
].filter(part => part !== undefined);
|
|
98
|
+
return parts.join(' ');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* An Edge is a plain id. A blocker living in another Effort is annotated with
|
|
102
|
+
* its owning Effort so it stays followable — there is no compound reference
|
|
103
|
+
* form to carry that, and without it a foreign blocker is a dead end.
|
|
104
|
+
*/
|
|
105
|
+
function renderEdge(id, from, board) {
|
|
106
|
+
const blocker = board.byId.get(id);
|
|
107
|
+
if (blocker === undefined)
|
|
108
|
+
return `${id}?`;
|
|
109
|
+
return blocker.effort === from.effort ? id : `${id}@${blocker.effort}`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Broken Edges surface here rather than through a separate validation tool,
|
|
113
|
+
* because a validation tool nobody calls is a validator that does not exist.
|
|
114
|
+
*
|
|
115
|
+
* Every warning is grouped, never itemized per Ticket. An Effort of Legacy
|
|
116
|
+
* Tickets can carry a dangling Edge on nearly every one of them, and a warnings
|
|
117
|
+
* block longer than the Board it annotates would undo the saving the Board
|
|
118
|
+
* exists to deliver.
|
|
119
|
+
*/
|
|
120
|
+
function collectWarnings(board) {
|
|
121
|
+
const warnings = [];
|
|
122
|
+
const dangling = new Set();
|
|
123
|
+
const orphaned = new Set();
|
|
124
|
+
const unrecognized = new Set();
|
|
125
|
+
const collapsed = new Set();
|
|
126
|
+
const declined = new Set();
|
|
127
|
+
const stale = new Set();
|
|
128
|
+
for (const ticket of board.tickets) {
|
|
129
|
+
for (const edge of ticket.blockedBy) {
|
|
130
|
+
const blocker = board.byId.get(edge);
|
|
131
|
+
if (blocker === undefined)
|
|
132
|
+
dangling.add(edge);
|
|
133
|
+
else if (blocker.status === 'dropped')
|
|
134
|
+
orphaned.add(ticket.handle);
|
|
135
|
+
}
|
|
136
|
+
if (ticket.unrecognizedStatus !== undefined) {
|
|
137
|
+
unrecognized.add(`${ticket.handle} "${ticket.unrecognizedStatus}"`);
|
|
138
|
+
}
|
|
139
|
+
// Still takeable as far as the graph is concerned — a Triage role never
|
|
140
|
+
// moves the Frontier — but somebody has declined it, which is worth saying
|
|
141
|
+
// before an agent picks it up.
|
|
142
|
+
if (ticket.status === 'open' && ticket.triage === 'wontfix')
|
|
143
|
+
declined.add(ticket.handle);
|
|
144
|
+
for (const ref of ticket.collapsedRefs)
|
|
145
|
+
collapsed.add(ref);
|
|
146
|
+
if (isStaleClaim(ticket))
|
|
147
|
+
stale.add(`${ticket.handle} (${ticket.claimedBy ?? '?'})`);
|
|
148
|
+
}
|
|
149
|
+
if (dangling.size > 0) {
|
|
150
|
+
warnings.push(`dangling Edges (${String(dangling.size)}), pointing at no Ticket in this workspace: ` +
|
|
151
|
+
[...dangling].toSorted().join(' '));
|
|
152
|
+
}
|
|
153
|
+
if (orphaned.size > 0) {
|
|
154
|
+
warnings.push(`blocked by a dropped Ticket, which never unblocks (${String(orphaned.size)}): ` +
|
|
155
|
+
[...orphaned].toSorted().join(' '));
|
|
156
|
+
}
|
|
157
|
+
if (unrecognized.size > 0) {
|
|
158
|
+
warnings.push(`unrecognized status, read as open (${String(unrecognized.size)}): ` +
|
|
159
|
+
[...unrecognized].toSorted().join(' '));
|
|
160
|
+
}
|
|
161
|
+
if (collapsed.size > 0) {
|
|
162
|
+
warnings.push(`sub-slice Edges coarsened to their parent Ticket (${String(collapsed.size)}): ` +
|
|
163
|
+
[...collapsed].toSorted().join(' '));
|
|
164
|
+
}
|
|
165
|
+
if (declined.size > 0) {
|
|
166
|
+
warnings.push(`takeable but triaged wontfix — somebody declined these (${String(declined.size)}): ` +
|
|
167
|
+
[...declined].toSorted().join(' '));
|
|
168
|
+
}
|
|
169
|
+
if (stale.size > 0) {
|
|
170
|
+
warnings.push(`stale claim, held longer than ${String(STALE_AFTER_HOURS)}h (${String(stale.size)}): ` +
|
|
171
|
+
`${[...stale].toSorted().join(' ')} — flagged only, never released; ask the holder`);
|
|
172
|
+
}
|
|
173
|
+
const legacy = board.tickets.filter(ticket => ticket.legacy);
|
|
174
|
+
if (legacy.length > 0) {
|
|
175
|
+
warnings.push(`${String(legacy.length)}/${String(board.tickets.length)} Tickets are Legacy — title, ` +
|
|
176
|
+
'status and Edges are inferred from prose. Run migrate_effort to normalize.');
|
|
177
|
+
}
|
|
178
|
+
// Tracked separately from Legacy, because normalizing a Legacy file gives it
|
|
179
|
+
// frontmatter without giving it an id. It would otherwise leave the Legacy
|
|
180
|
+
// count and take its need for migration silently with it, while still being
|
|
181
|
+
// unaddressable by anything but its handle.
|
|
182
|
+
const unidentified = board.tickets.filter(ticket => ticket.id === undefined);
|
|
183
|
+
if (unidentified.length > 0) {
|
|
184
|
+
warnings.push(`no id (${String(unidentified.length)}): ` +
|
|
185
|
+
`${unidentified.map(ticket => ticket.handle).join(' ')} — fetch by the handle shown; ` +
|
|
186
|
+
'nothing can declare an Edge on them until migrate_effort mints one.');
|
|
187
|
+
}
|
|
188
|
+
return warnings;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=get-board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-board.js","sourceRoot":"","sources":["../../src/tools/get-board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAChG,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,gGAAgG;IAChG,sEAAsE,CAAC;AAWzE;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,GAA6B;IACpE,OAAO;QACL,MAAM;QACN,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC;QAC5D,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC;QACzB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;KACrB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzC,6EAA6E;IAC7E,4EAA4E;IAC5E,sDAAsD;IACtD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;SACzF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAE5F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,aAAa,QAAQ,CAAC,MAAM,WAAW,EAC3C,EAAE,CACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;GAIG;AACH,SAAS,YAAY,CAAC,MAAqB;IACzC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,MAAqB,EAAE,KAAY;IACrD,MAAM,KAAK,GAAG;QACZ,MAAM,CAAC,MAAM;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAClB,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE;QACjC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE;QACnE,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YACzB,CAAC,CAAC,cAAc,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACrF,CAAC,CAAC,SAAS;QACb,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;QAC/E,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;QACxF,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;KACpF,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAErC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,EAAU,EAAE,IAAmB,EAAE,KAAY;IAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,GAAG,CAAC;IAE3C,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,KAAY;IACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAErC,IAAI,OAAO,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,MAAM,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC5C,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,wEAAwE;QACxE,2EAA2E;QAC3E,+BAA+B;QAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa;YAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,YAAY,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,SAAS,IAAI,GAAG,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,mBAAmB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,8CAA8C;YACpF,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACrC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,sDAAsD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC9E,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACrC,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CACX,sCAAsC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK;YAClE,CAAC,GAAG,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACzC,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CACX,qDAAqD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK;YAC9E,CAAC,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACtC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,2DAA2D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK;YACnF,CAAC,GAAG,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CACrC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CACX,iCAAiC,MAAM,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;YACrF,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,iDAAiD,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,+BAA+B;YACrF,4EAA4E,CAC/E,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC7E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CACX,UAAU,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK;YACxC,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC;YACtF,qEAAqE,CACxE,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Ticket } from '../domain.ts';
|
|
3
|
+
export declare const getTicketsInputSchema: {
|
|
4
|
+
ids: z.ZodArray<z.ZodString>;
|
|
5
|
+
root: z.ZodOptional<z.ZodString>;
|
|
6
|
+
};
|
|
7
|
+
export declare const getTicketsDescription: string;
|
|
8
|
+
/**
|
|
9
|
+
* Bodies verbatim, under a header carrying the fields a reader needs in hand
|
|
10
|
+
* while reading one. Ids that resolve to nothing are named rather than dropped,
|
|
11
|
+
* so a typo does not look like an empty Ticket.
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderTickets(requested: readonly string[], found: readonly Ticket[]): string;
|
|
14
|
+
//# sourceMappingURL=get-tickets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-tickets.d.ts","sourceRoot":"","sources":["../../src/tools/get-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,eAAO,MAAM,qBAAqB;IAChC,GAAG;IAOH,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAEJ,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAwB5F"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const getTicketsInputSchema = {
|
|
3
|
+
ids: z
|
|
4
|
+
.array(z.string())
|
|
5
|
+
.min(1)
|
|
6
|
+
.describe('Ticket ids, e.g. ["T12","T14"], resolved repo-wide. A Legacy Ticket with no id is ' +
|
|
7
|
+
'fetched by the <effort>#<order> handle its Board line shows.'),
|
|
8
|
+
root: z.string().optional().describe('Workspace directory. Defaults to the session workspace.'),
|
|
9
|
+
};
|
|
10
|
+
export const getTicketsDescription = 'Full bodies for a list of Ticket ids, in one call. Use after get_board, only for the ' +
|
|
11
|
+
'Tickets you actually work.';
|
|
12
|
+
/**
|
|
13
|
+
* Bodies verbatim, under a header carrying the fields a reader needs in hand
|
|
14
|
+
* while reading one. Ids that resolve to nothing are named rather than dropped,
|
|
15
|
+
* so a typo does not look like an empty Ticket.
|
|
16
|
+
*/
|
|
17
|
+
export function renderTickets(requested, found) {
|
|
18
|
+
// Addressable by id when it has one, and by its handle either way — an
|
|
19
|
+
// id-less Legacy Ticket has no other route to its own body.
|
|
20
|
+
const byName = new Map();
|
|
21
|
+
for (const ticket of found) {
|
|
22
|
+
byName.set(ticket.handle, ticket);
|
|
23
|
+
if (ticket.id !== undefined)
|
|
24
|
+
byName.set(ticket.id, ticket);
|
|
25
|
+
}
|
|
26
|
+
const blocks = [];
|
|
27
|
+
const missing = [];
|
|
28
|
+
for (const name of requested) {
|
|
29
|
+
const ticket = byName.get(name);
|
|
30
|
+
if (ticket === undefined) {
|
|
31
|
+
missing.push(name);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
blocks.push(renderOne(ticket));
|
|
35
|
+
}
|
|
36
|
+
if (missing.length > 0)
|
|
37
|
+
blocks.push(`not found: ${missing.join(' ')}`);
|
|
38
|
+
return blocks.join('\n\n---\n\n');
|
|
39
|
+
}
|
|
40
|
+
function renderOne(ticket) {
|
|
41
|
+
const fields = [
|
|
42
|
+
`effort=${ticket.effort}`,
|
|
43
|
+
`kind=${ticket.kind}`,
|
|
44
|
+
ticket.type === undefined ? undefined : `type=${ticket.type}`,
|
|
45
|
+
`status=${ticket.status}`,
|
|
46
|
+
ticket.triage === undefined ? undefined : `triage=${ticket.triage}`,
|
|
47
|
+
ticket.blockedBy.length > 0 ? `blocked_by=${ticket.blockedBy.join(',')}` : undefined,
|
|
48
|
+
ticket.claimedBy === undefined ? undefined : `claimed_by=${ticket.claimedBy}`,
|
|
49
|
+
ticket.claimedAt === undefined ? undefined : `claimed_at=${ticket.claimedAt}`,
|
|
50
|
+
ticket.answerGist === undefined ? undefined : `answer_gist=${ticket.answerGist}`,
|
|
51
|
+
ticket.droppedReason === undefined ? undefined : `dropped_reason=${ticket.droppedReason}`,
|
|
52
|
+
ticket.legacy ? 'legacy' : undefined,
|
|
53
|
+
].filter(field => field !== undefined);
|
|
54
|
+
return `# ${ticket.handle} — ${ticket.title}\n${fields.join(' ')}\n\n${ticket.body}`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=get-tickets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-tickets.js","sourceRoot":"","sources":["../../src/tools/get-tickets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Effort, TicketSummary } from '../domain.ts';
|
|
3
|
+
/**
|
|
4
|
+
* `root` is the per-call workspace override. It is the only argument, and it is
|
|
5
|
+
* optional, because the workspace normally resolves from the session itself.
|
|
6
|
+
*/
|
|
7
|
+
export declare const listEffortsInputSchema: {
|
|
8
|
+
root: z.ZodOptional<z.ZodString>;
|
|
9
|
+
};
|
|
10
|
+
export declare const listEffortsDescription = "List the Efforts in a repo, each with its Ticket count and which header docs it holds.";
|
|
11
|
+
/**
|
|
12
|
+
* One line per Effort, preceded by the workspace that produced them so that a
|
|
13
|
+
* caller can tell which repo it just read.
|
|
14
|
+
*/
|
|
15
|
+
export declare function renderEfforts(root: string, efforts: readonly Effort[], frontier: ReadonlySet<TicketSummary>): string;
|
|
16
|
+
//# sourceMappingURL=list-efforts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-efforts.d.ts","sourceRoot":"","sources":["../../src/tools/list-efforts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,sBAAsB;IACjC,IAAI;CAML,CAAC;AAEF,eAAO,MAAM,sBAAsB,2FACuD,CAAC;AAE3F;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC,GACnC,MAAM,CAiBR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* `root` is the per-call workspace override. It is the only argument, and it is
|
|
4
|
+
* optional, because the workspace normally resolves from the session itself.
|
|
5
|
+
*/
|
|
6
|
+
export const listEffortsInputSchema = {
|
|
7
|
+
root: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe('Workspace directory. Defaults to $FRONTIER_ROOT, then the session working directory.'),
|
|
11
|
+
};
|
|
12
|
+
export const listEffortsDescription = 'List the Efforts in a repo, each with its Ticket count and which header docs it holds.';
|
|
13
|
+
/**
|
|
14
|
+
* One line per Effort, preceded by the workspace that produced them so that a
|
|
15
|
+
* caller can tell which repo it just read.
|
|
16
|
+
*/
|
|
17
|
+
export function renderEfforts(root, efforts, frontier) {
|
|
18
|
+
const lines = [`root: ${root}`];
|
|
19
|
+
if (efforts.length === 0) {
|
|
20
|
+
lines.push('(no efforts)');
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const takeable = countByEffort(frontier);
|
|
24
|
+
for (const effort of efforts) {
|
|
25
|
+
const docs = effort.headerDocs.length === 0 ? 'none' : effort.headerDocs.join(',');
|
|
26
|
+
const size = takeable.get(effort.slug) ?? 0;
|
|
27
|
+
lines.push(`${effort.slug} tickets=${effort.ticketCount} docs=${docs} frontier=${String(size)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return lines.join('\n');
|
|
31
|
+
}
|
|
32
|
+
function countByEffort(frontier) {
|
|
33
|
+
const counts = new Map();
|
|
34
|
+
for (const ticket of frontier)
|
|
35
|
+
counts.set(ticket.effort, (counts.get(ticket.effort) ?? 0) + 1);
|
|
36
|
+
return counts;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=list-efforts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-efforts.js","sourceRoot":"","sources":["../../src/tools/list-efforts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,sFAAsF,CACvF;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GACjC,wFAAwF,CAAC;AAE3F;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,OAA0B,EAC1B,QAAoC;IAEpC,MAAM,KAAK,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,IAAI,aAAa,MAAM,CAAC,WAAW,UAAU,IAAI,cAAc,MAAM,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,QAAoC;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE/F,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { MigrationReport } from '../domain.ts';
|
|
3
|
+
export declare const migrateEffortInputSchema: {
|
|
4
|
+
effort: z.ZodString;
|
|
5
|
+
preview: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
rename: z.ZodOptional<z.ZodBoolean>;
|
|
7
|
+
root: z.ZodOptional<z.ZodString>;
|
|
8
|
+
};
|
|
9
|
+
export declare const migrateEffortDescription: string;
|
|
10
|
+
export declare function renderMigration(report: MigrationReport): string;
|
|
11
|
+
//# sourceMappingURL=migrate-effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-effort.d.ts","sourceRoot":"","sources":["../../src/tools/migrate-effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,cAAc,CAAC;AAErE,eAAO,MAAM,wBAAwB;IACnC,MAAM;IACN,OAAO;IAIP,MAAM;IAMN,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAGoD,CAAC;AAE1F,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAkB/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const migrateEffortInputSchema = {
|
|
3
|
+
effort: z.string().describe('Effort slug whose Legacy Tickets to normalize.'),
|
|
4
|
+
preview: z
|
|
5
|
+
.boolean()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe('Report every change and write nothing. Defaults to false.'),
|
|
8
|
+
rename: z
|
|
9
|
+
.boolean()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Rename files to <NN>-T<n>-<slug>.md. Off by default so relative links keep resolving.'),
|
|
12
|
+
root: z.string().optional().describe('Workspace directory. Defaults to the session workspace.'),
|
|
13
|
+
};
|
|
14
|
+
export const migrateEffortDescription = 'Normalize Legacy Tickets in an Effort: schema frontmatter, preserve existing ids, mint ' +
|
|
15
|
+
'ids for Tickets that have none, turn prose Edges into blocked_by. Preview writes nothing. ' +
|
|
16
|
+
'Filename rewriting is opt-in. Unrecognized files in the Effort directory are ignored.';
|
|
17
|
+
export function renderMigration(report) {
|
|
18
|
+
const count = report.changes.length;
|
|
19
|
+
const verb = report.preview ? 'would migrate' : 'migrated';
|
|
20
|
+
const rename = report.renamed ? ' (renamed)' : '';
|
|
21
|
+
const lines = [
|
|
22
|
+
`${report.effort}: ${report.preview ? 'preview — ' : ''}${verb} ${String(count)}${rename}`,
|
|
23
|
+
];
|
|
24
|
+
if (count === 0) {
|
|
25
|
+
lines.push('(nothing to migrate)');
|
|
26
|
+
return lines.join('\n');
|
|
27
|
+
}
|
|
28
|
+
for (const change of report.changes) {
|
|
29
|
+
lines.push(renderChange(change));
|
|
30
|
+
}
|
|
31
|
+
return lines.join('\n');
|
|
32
|
+
}
|
|
33
|
+
function renderChange(change) {
|
|
34
|
+
const flags = [
|
|
35
|
+
change.normalized ? 'normalize' : undefined,
|
|
36
|
+
change.minted ? 'mint' : undefined,
|
|
37
|
+
].filter(part => part !== undefined);
|
|
38
|
+
const rename = change.fromName !== undefined && change.toName !== undefined
|
|
39
|
+
? `${change.fromName} -> ${change.toName}`
|
|
40
|
+
: undefined;
|
|
41
|
+
const was = change.minted && change.beforeHandle !== change.id ? `was ${change.beforeHandle}` : undefined;
|
|
42
|
+
const edges = change.blockedBy.length === 0 ? undefined : `blocked_by=${change.blockedBy.join(',')}`;
|
|
43
|
+
return [
|
|
44
|
+
change.id,
|
|
45
|
+
change.title,
|
|
46
|
+
flags.length === 0 ? undefined : flags.join('+'),
|
|
47
|
+
was,
|
|
48
|
+
rename,
|
|
49
|
+
edges,
|
|
50
|
+
]
|
|
51
|
+
.filter(part => part !== undefined)
|
|
52
|
+
.join(' ');
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=migrate-effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-effort.js","sourceRoot":"","sources":["../../src/tools/migrate-effort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { SpecDocument } from '../domain.ts';
|
|
3
|
+
export declare const specInputSchema: {
|
|
4
|
+
effort: z.ZodString;
|
|
5
|
+
create: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
content: z.ZodOptional<z.ZodString>;
|
|
7
|
+
expected_revision: z.ZodOptional<z.ZodString>;
|
|
8
|
+
root: z.ZodOptional<z.ZodString>;
|
|
9
|
+
};
|
|
10
|
+
export declare const specDescription: string;
|
|
11
|
+
export declare function renderSpec(effort: string, document: SpecDocument): string;
|
|
12
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/tools/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,eAAe;IAC1B,MAAM;IACN,MAAM;IAIN,OAAO;IAOP,iBAAiB;IAQjB,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,eAAe,QAGuE,CAAC;AAEpG,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const specInputSchema = {
|
|
3
|
+
effort: z.string().describe('Effort slug whose Spec to get or put.'),
|
|
4
|
+
create: z
|
|
5
|
+
.boolean()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe('Start the Effort and its Spec if neither exists. Otherwise an unknown slug fails.'),
|
|
8
|
+
content: z
|
|
9
|
+
.string()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('When set, replace the Spec wholesale (conventionally a document with YAML frontmatter). ' +
|
|
12
|
+
'When omitted, return the current document.'),
|
|
13
|
+
expected_revision: z
|
|
14
|
+
.string()
|
|
15
|
+
.min(1)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Revision from a prior spec read. Required when overwriting an existing Spec; ' +
|
|
18
|
+
'omitted when creating one.'),
|
|
19
|
+
root: z.string().optional().describe('Workspace directory. Defaults to the session workspace.'),
|
|
20
|
+
};
|
|
21
|
+
export const specDescription = 'Get or put a Spec as a whole opaque document (conventionally with YAML frontmatter). ' +
|
|
22
|
+
'Nothing edits a Spec section by section — an Effort may hold both a Map and a Spec. ' +
|
|
23
|
+
'Puts pass expected_revision from a prior read so concurrent sessions cannot clobber each other.';
|
|
24
|
+
export function renderSpec(effort, document) {
|
|
25
|
+
return [`effort: ${effort}`, `spec revision: ${document.revision}`, '', document.body].join('\n');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/tools/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACpE,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mFAAmF,CAAC;IAChG,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0FAA0F;QACxF,4CAA4C,CAC/C;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E;QAC7E,4BAA4B,CAC/B;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAChG,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,uFAAuF;IACvF,sFAAsF;IACtF,iGAAiG,CAAC;AAEpG,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,QAAsB;IAC/D,OAAO,CAAC,WAAW,MAAM,EAAE,EAAE,kBAAkB,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Ticket, TicketEdit } from '../domain.ts';
|
|
3
|
+
import type { TriageRole } from '../domain.ts';
|
|
4
|
+
export declare const updateTicketInputSchema: {
|
|
5
|
+
id: z.ZodString;
|
|
6
|
+
claim: z.ZodOptional<z.ZodObject<{
|
|
7
|
+
by: z.ZodString;
|
|
8
|
+
}, z.core.$strip>>;
|
|
9
|
+
resolve: z.ZodOptional<z.ZodObject<{
|
|
10
|
+
answer_gist: z.ZodString;
|
|
11
|
+
answer: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>>;
|
|
13
|
+
drop: z.ZodOptional<z.ZodObject<{
|
|
14
|
+
reason: z.ZodString;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
status: z.ZodOptional<z.ZodEnum<{
|
|
17
|
+
claimed: "claimed";
|
|
18
|
+
dropped: "dropped";
|
|
19
|
+
open: "open";
|
|
20
|
+
resolved: "resolved";
|
|
21
|
+
}>>;
|
|
22
|
+
triage: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
"needs-info": "needs-info";
|
|
24
|
+
"needs-triage": "needs-triage";
|
|
25
|
+
"ready-for-agent": "ready-for-agent";
|
|
26
|
+
"ready-for-human": "ready-for-human";
|
|
27
|
+
wontfix: "wontfix";
|
|
28
|
+
}>>;
|
|
29
|
+
blocked_by: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
comment: z.ZodOptional<z.ZodString>;
|
|
31
|
+
tick: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
32
|
+
root: z.ZodOptional<z.ZodString>;
|
|
33
|
+
};
|
|
34
|
+
export declare const updateTicketDescription: string;
|
|
35
|
+
export interface UpdateRequest {
|
|
36
|
+
readonly claim?: {
|
|
37
|
+
by: string;
|
|
38
|
+
} | undefined;
|
|
39
|
+
readonly resolve?: {
|
|
40
|
+
answer_gist: string;
|
|
41
|
+
answer?: string | undefined;
|
|
42
|
+
} | undefined;
|
|
43
|
+
readonly drop?: {
|
|
44
|
+
reason: string;
|
|
45
|
+
} | undefined;
|
|
46
|
+
readonly triage?: TriageRole | undefined;
|
|
47
|
+
readonly status?: string | undefined;
|
|
48
|
+
readonly blocked_by?: readonly string[] | undefined;
|
|
49
|
+
readonly comment?: string | undefined;
|
|
50
|
+
readonly tick?: readonly string[] | undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Turn a request into the edit the driver applies, refusing anything the Status
|
|
54
|
+
* model or the Edge graph does not allow. Validation lives here rather than in
|
|
55
|
+
* the driver because it is a rule about the domain, not about storage.
|
|
56
|
+
*
|
|
57
|
+
* `all` is every Ticket in the workspace, because Edges resolve repo-wide and a
|
|
58
|
+
* cycle can run through an Effort this call never names.
|
|
59
|
+
*/
|
|
60
|
+
export declare function editFor(ticket: Ticket, all: readonly Ticket[], request: UpdateRequest, now: string): TicketEdit;
|
|
61
|
+
export declare function renderUpdate(ticket: Ticket, warnings?: readonly string[]): string;
|
|
62
|
+
//# sourceMappingURL=update-ticket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-ticket.d.ts","sourceRoot":"","sources":["../../src/tools/update-ticket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,eAAO,MAAM,uBAAuB;IAClC,EAAE;IACF,KAAK;;;IAIL,OAAO;;;;IAOP,IAAI;;;IAIJ,MAAM;;;;;;IAIN,MAAM;;;;;;;IAIN,UAAU;IAOV,OAAO;IAKP,IAAI;IAQJ,IAAI;CACL,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAIuC,CAAC;AAE5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,GACV,UAAU,CA+DZ;AAsDD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAYrF"}
|