frontier-mcp 0.5.0 → 0.6.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 +33 -15
- package/dist/domain.d.ts +11 -0
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js.map +1 -1
- package/dist/frontier.d.ts +8 -0
- package/dist/frontier.d.ts.map +1 -1
- package/dist/frontier.js +33 -4
- package/dist/frontier.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -1
- package/dist/server.js.map +1 -1
- package/dist/storage/driver.d.ts +25 -0
- package/dist/storage/driver.d.ts.map +1 -1
- package/dist/storage/driver.js +14 -0
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/markdown/create.d.ts +2 -1
- package/dist/storage/markdown/create.d.ts.map +1 -1
- package/dist/storage/markdown/create.js +2 -1
- package/dist/storage/markdown/create.js.map +1 -1
- package/dist/storage/markdown/driver.d.ts.map +1 -1
- package/dist/storage/markdown/driver.js +128 -27
- package/dist/storage/markdown/driver.js.map +1 -1
- package/dist/storage/markdown/migrate.d.ts +2 -0
- package/dist/storage/markdown/migrate.d.ts.map +1 -1
- package/dist/storage/markdown/migrate.js +3 -2
- package/dist/storage/markdown/migrate.js.map +1 -1
- package/dist/storage/markdown/ticket.d.ts +2 -0
- package/dist/storage/markdown/ticket.d.ts.map +1 -1
- package/dist/storage/markdown/ticket.js +5 -0
- package/dist/storage/markdown/ticket.js.map +1 -1
- package/dist/tools/create-tickets.d.ts +12 -1
- package/dist/tools/create-tickets.d.ts.map +1 -1
- package/dist/tools/create-tickets.js +22 -5
- package/dist/tools/create-tickets.js.map +1 -1
- package/dist/tools/get-tickets.d.ts.map +1 -1
- package/dist/tools/get-tickets.js +30 -6
- package/dist/tools/get-tickets.js.map +1 -1
- package/dist/tools/migrate-effort.js +3 -0
- package/dist/tools/migrate-effort.js.map +1 -1
- package/dist/tools/update-ticket.js +3 -3
- package/dist/tools/update-ticket.js.map +1 -1
- package/dist/tools/workspace-line.d.ts +2 -2
- package/dist/tools/workspace-line.js +2 -2
- package/docs/agents/issue-tracker.md +49 -22
- package/package.json +1 -1
|
@@ -18,20 +18,32 @@ export function renderTickets(requested, found) {
|
|
|
18
18
|
// Addressable by id when it has one, and by its handle either way — an
|
|
19
19
|
// id-less Legacy Ticket has no other route to its own body.
|
|
20
20
|
const byName = new Map();
|
|
21
|
+
const add = (name, ticket) => {
|
|
22
|
+
const claimants = byName.get(name) ?? [];
|
|
23
|
+
if (!claimants.includes(ticket))
|
|
24
|
+
claimants.push(ticket);
|
|
25
|
+
byName.set(name, claimants);
|
|
26
|
+
};
|
|
21
27
|
for (const ticket of found) {
|
|
22
|
-
|
|
28
|
+
add(ticket.handle, ticket);
|
|
23
29
|
if (ticket.id !== undefined)
|
|
24
|
-
|
|
30
|
+
add(ticket.id, ticket);
|
|
25
31
|
}
|
|
26
32
|
const blocks = [];
|
|
27
33
|
const missing = [];
|
|
28
34
|
for (const name of requested) {
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
35
|
+
const claimants = byName.get(name);
|
|
36
|
+
if (claimants === undefined) {
|
|
31
37
|
missing.push(name);
|
|
32
38
|
continue;
|
|
33
39
|
}
|
|
34
|
-
|
|
40
|
+
// Every claimant of a duplicated id, never silently the first.
|
|
41
|
+
if (claimants.length > 1) {
|
|
42
|
+
blocks.push(`${name} is carried by ${String(claimants.length)} Tickets — writes to it are refused ` +
|
|
43
|
+
'until all but one are renumbered by hand');
|
|
44
|
+
}
|
|
45
|
+
for (const ticket of claimants)
|
|
46
|
+
blocks.push(renderOne(ticket));
|
|
35
47
|
}
|
|
36
48
|
if (missing.length > 0)
|
|
37
49
|
blocks.push(`not found: ${missing.join(' ')}`);
|
|
@@ -51,6 +63,18 @@ function renderOne(ticket) {
|
|
|
51
63
|
ticket.droppedReason === undefined ? undefined : `dropped_reason=${ticket.droppedReason}`,
|
|
52
64
|
ticket.legacy ? 'legacy' : undefined,
|
|
53
65
|
].filter(field => field !== undefined);
|
|
54
|
-
|
|
66
|
+
const head = `# ${ticket.handle} — ${ticket.title}\n${fields.join(' ')}\n\n${ticket.body}`;
|
|
67
|
+
return ticket.foreignFence === undefined
|
|
68
|
+
? head
|
|
69
|
+
: `${head}\n\n${renderFence(ticket.foreignFence)}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The fence verbatim, never re-serialized. Its delimiter outruns any backtick
|
|
73
|
+
* run inside it, so YAML holding a code fence cannot close the block early.
|
|
74
|
+
*/
|
|
75
|
+
function renderFence(raw) {
|
|
76
|
+
const longest = Math.max(0, ...(raw.match(/`+/g) ?? []).map(run => run.length));
|
|
77
|
+
const delimiter = '`'.repeat(Math.max(3, longest + 1));
|
|
78
|
+
return `## Foreign frontmatter (not imported; file unchanged)\n\n${delimiter}yaml\n${raw}\n${delimiter}`;
|
|
55
79
|
}
|
|
56
80
|
//# sourceMappingURL=get-tickets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-tickets.js","sourceRoot":"","sources":["../../src/tools/get-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,GAAG,EAAE,CAAC;SACH,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,oFAAoF;QAClF,8DAA8D,CACjE;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAChG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAChC,uFAAuF;IACvF,4BAA4B,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAA4B,EAAE,KAAwB;IAClF,uEAAuE;IACvE,4DAA4D;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"get-tickets.js","sourceRoot":"","sources":["../../src/tools/get-tickets.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,9 @@ function renderChange(change) {
|
|
|
47
47
|
was,
|
|
48
48
|
rename,
|
|
49
49
|
edges,
|
|
50
|
+
change.duplicateFiles === undefined
|
|
51
|
+
? undefined
|
|
52
|
+
: `duplicate id, carried by ${change.duplicateFiles.join(', ')} — a real run refuses`,
|
|
50
53
|
]
|
|
51
54
|
.filter(part => part !== undefined)
|
|
52
55
|
.join(' ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-effort.js","sourceRoot":"","sources":["../../src/tools/migrate-effort.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"migrate-effort.js","sourceRoot":"","sources":["../../src/tools/migrate-effort.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { STATUSES, TRIAGE_ROLES } from '../domain.js';
|
|
3
3
|
import { cycleThrough, renderCycle } from '../edges.js';
|
|
4
|
-
import {
|
|
4
|
+
import { claimantsById, edgesOfClaimants } from '../frontier.js';
|
|
5
5
|
export const updateTicketInputSchema = z.object({
|
|
6
6
|
id: z.string().describe('Ticket id, or the <effort>#<order> handle of a Legacy Ticket.'),
|
|
7
7
|
claim: z
|
|
@@ -173,8 +173,8 @@ function edgesFor(ticket, all, request) {
|
|
|
173
173
|
// Nothing can name an id-less Legacy Ticket, so no path leads back to it.
|
|
174
174
|
if (ticket.id === undefined)
|
|
175
175
|
return blockedBy;
|
|
176
|
-
const byId =
|
|
177
|
-
const edgesOf = id => (id === ticket.id ? blockedBy : (byId
|
|
176
|
+
const byId = claimantsById(all);
|
|
177
|
+
const edgesOf = id => (id === ticket.id ? blockedBy : edgesOfClaimants(byId, id));
|
|
178
178
|
const cycle = cycleThrough(ticket.id, edgesOf);
|
|
179
179
|
if (cycle !== undefined) {
|
|
180
180
|
throw new Error(`Those Edges would close a cycle: ${renderCycle(cycle)}. Nothing in a cycle is ever ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-ticket.js","sourceRoot":"","sources":["../../src/tools/update-ticket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"update-ticket.js","sourceRoot":"","sources":["../../src/tools/update-ticket.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* every write say it the same way and in the same place.
|
|
4
4
|
*
|
|
5
5
|
* A read has never needed it for safety — wrong repository, visibly wrong
|
|
6
|
-
* content. A write is the opposite: Ticket ids are
|
|
7
|
-
*
|
|
6
|
+
* content. A write is the opposite: Ticket ids are unique within a repository,
|
|
7
|
+
* not across repositories, so `T10 updated` is exactly as plausible against the
|
|
8
8
|
* wrong repository as the right one. It is the one result a caller cannot check
|
|
9
9
|
* from what it got back, which is how the T10 worktree escape stayed invisible.
|
|
10
10
|
*/
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* every write say it the same way and in the same place.
|
|
4
4
|
*
|
|
5
5
|
* A read has never needed it for safety — wrong repository, visibly wrong
|
|
6
|
-
* content. A write is the opposite: Ticket ids are
|
|
7
|
-
*
|
|
6
|
+
* content. A write is the opposite: Ticket ids are unique within a repository,
|
|
7
|
+
* not across repositories, so `T10 updated` is exactly as plausible against the
|
|
8
8
|
* wrong repository as the right one. It is the one result a caller cannot check
|
|
9
9
|
* from what it got back, which is how the T10 worktree escape stayed invisible.
|
|
10
10
|
*/
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
# Issue tracker — FrontierMCP and file fallback
|
|
2
2
|
|
|
3
|
+
Tracker doc revision 2. To check a vendored copy, compare this number with the one in the
|
|
4
|
+
`frontier://tracker-doc` resource of the server you run; a lower number, or no revision line, is
|
|
5
|
+
stale.
|
|
6
|
+
|
|
3
7
|
Use **FrontierMCP** as the issue tracker. Its canonical storage is markdown under `.scratch/`.
|
|
4
8
|
Vocabulary is defined in the project's `CONTEXT.md` when present — Effort, Board, Header doc, Map,
|
|
5
|
-
Spec, Ticket, Edge, Frontier.
|
|
9
|
+
Spec, Ticket, Edge, Frontier, Handle, Temporary key.
|
|
6
10
|
|
|
7
11
|
When **FrontierMCP** (server name `frontier`) is loaded in your session, use the tools below. They
|
|
8
12
|
own the schema, compute the graph, and answer orientation questions for a fraction of the token cost
|
|
@@ -30,7 +34,7 @@ session.** Moving to another worktree mid-session does not retarget it: pass `ro
|
|
|
30
34
|
reports no Efforts — that is the worktree being served correctly, not the tracker going missing.
|
|
31
35
|
|
|
32
36
|
**Every call that writes opens with `root: <path>`**, naming the repository it just changed. Read it
|
|
33
|
-
— a Ticket id is not
|
|
37
|
+
— a Ticket id is unique within a repository, not across them, so `T10 updated` looks the same whichever repository answered, and
|
|
34
38
|
this line is the only part of the result that tells you. Reads do not carry it, and neither do the
|
|
35
39
|
read paths of write-capable tools: `edit_map` with no section fields, `spec` with no `content`, and
|
|
36
40
|
`migrate_effort` with `preview`.
|
|
@@ -78,6 +82,14 @@ Eight tools permanently. Optional arguments extend an existing tool; there is no
|
|
|
78
82
|
| write or read the Spec | `spec` |
|
|
79
83
|
| normalize legacy files | `migrate_effort` |
|
|
80
84
|
|
|
85
|
+
Two Ticket files carrying one id are listed in each Board's warnings, with claimant files for the
|
|
86
|
+
first few, and every write addressed to that id is refused. Fix it by hand, giving all but one a new id; the server never
|
|
87
|
+
renumbers. Under a pattern whose only variable token is `<N>`, every `create_tickets` result carries
|
|
88
|
+
a standing warning that the pattern collides across branches — it describes the configuration, not
|
|
89
|
+
that call; the remedy is a mixed pattern such as `T<N>-<b36{4}>`. When a Ticket's frontmatter fence
|
|
90
|
+
is not in the schema, `get_tickets` appends it, unimported, as a fenced `yaml` block under a Foreign
|
|
91
|
+
frontmatter heading; the read leaves the file unchanged.
|
|
92
|
+
|
|
81
93
|
Claims are compare-and-set — a parallel session that already holds the Ticket wins. Writes carry the
|
|
82
94
|
`revision` from the last read; a mismatch is refused, never retried over the caller's edit.
|
|
83
95
|
|
|
@@ -87,41 +99,56 @@ These conventions are canonical whether FrontierMCP is loaded or not. FrontierMC
|
|
|
87
99
|
the same files; a session without the server still produces valid Tickets by following this section.
|
|
88
100
|
|
|
89
101
|
**Canonical is not licence to allocate ids by hand.** When FrontierMCP is loaded, ids come from
|
|
90
|
-
`create_tickets
|
|
91
|
-
repo
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
distinct ids, and duplicates are silent. A *guessed* id passed to `create_tickets` costs nothing;
|
|
96
|
-
the server allocates and discards the guess. Only the hand-written file breaks.
|
|
102
|
+
`create_tickets`, and you never scan for one: the server mints every id it is present for. It knows
|
|
103
|
+
the repo's id pattern, and under a pattern containing `<N>` it counts under a guard
|
|
104
|
+
(`.scratch/.frontier-id-N-<n>.guard`, keyed on the counter value) that a file written straight to
|
|
105
|
+
disk cannot take — ADR 0006 in the frontier-mcp repository. Hand-writing while the server is loaded
|
|
106
|
+
bypasses the mint whatever the pattern.
|
|
97
107
|
|
|
98
108
|
### Layout
|
|
99
109
|
|
|
100
|
-
- One Effort per directory: `.scratch/<effort-slug
|
|
110
|
+
- One Effort per directory: `.scratch/<effort-slug>/`.
|
|
111
|
+
- `.scratch/frontier.yml`, beside the Effort directories, is the one other file FrontierMCP reads.
|
|
112
|
+
Its one key, `id_pattern`, shapes Ticket ids. The server reads it once at start; restart a running
|
|
113
|
+
server after editing it.
|
|
101
114
|
- The header doc is `spec.md` (from `/to-spec`) or `map.md` (from `/wayfinder`). An Effort charted as a
|
|
102
115
|
Map may later gain a Spec — that is wayfinder's handoff, not a mistake.
|
|
103
116
|
- Tickets are one file per Ticket under `.scratch/<effort-slug>/issues/` — never a single combined
|
|
104
117
|
tickets file.
|
|
105
|
-
- Ticket filenames are `<NN
|
|
106
|
-
the identity and never changes.
|
|
107
|
-
- **Ticket ids are
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
118
|
+
- Ticket filenames are `<NN>-<id>-<slug>.md`. `NN` is sort order only and may be rewritten. The id
|
|
119
|
+
is the identity and never changes.
|
|
120
|
+
- **Ticket ids are unique across the whole repo**, so a bare id resolves anywhere in it, including
|
|
121
|
+
in commit messages. With FrontierMCP loaded, `create_tickets` assigns them. Only when the server is
|
|
122
|
+
absent, mint one by hand:
|
|
123
|
+
1. Read `id_pattern` from `.scratch/frontier.yml`. No file or no key means `T<b36{6}>`.
|
|
124
|
+
2. Check the pattern is legal: it begins with a literal letter or underscore; literals are only
|
|
125
|
+
`A-Z a-z 0-9 . _ -`; the tokens are `<N>`, `<b36{n}>` and `<b16{n}>` with n from 1 to 64, and
|
|
126
|
+
`<effort>` is refused; at most one `<N>`; at least one `<N>` or random token; a minted id is at
|
|
127
|
+
most 64 characters, counting `<N>` as one. If the file is not valid YAML, is not a mapping,
|
|
128
|
+
`id_pattern` is not a string, or the pattern breaks a rule, **do not mint** — fix the file first.
|
|
129
|
+
Never fall back to the default: an id minted in a format nobody asked for is permanent.
|
|
130
|
+
3. Render it. Every `<b36{n}>` is exactly n characters from `0-9a-z`, every `<b16{n}>` exactly n
|
|
131
|
+
from `0-9a-f`, lowercase always. `<N>` is decimal with no leading zeros. Anything outside `<>`
|
|
132
|
+
is literal.
|
|
133
|
+
4. **No `<N>` in the pattern:** draw the random tokens. Do not scan for a highest id.
|
|
134
|
+
5. **`<N>` in the pattern:** scan every `.scratch/*/issues/` for the highest `<N>` among ids that
|
|
135
|
+
match the whole pattern and add one; under a mixed pattern, count first, then draw the random
|
|
136
|
+
part. A hand-writer cannot take the server's guard, so if any session might be minting at the
|
|
137
|
+
same time you can both reach the same number unseen.
|
|
138
|
+
6. Check the id is not already in use anywhere in `.scratch/`.
|
|
112
139
|
- Formal metadata goes in YAML frontmatter. Prose stays prose.
|
|
113
140
|
|
|
114
141
|
### Ticket frontmatter
|
|
115
142
|
|
|
116
143
|
```yaml
|
|
117
144
|
---
|
|
118
|
-
id: T12 #
|
|
145
|
+
id: T12 # shaped by id_pattern; repo-unique, never reused or changed
|
|
119
146
|
title: Parse legacy tickets without frontmatter
|
|
120
147
|
kind: build # build | decision
|
|
121
148
|
type: research # decision only: research | prototype | grilling | task
|
|
122
149
|
status: open # open | claimed | resolved | dropped
|
|
123
150
|
triage: ready-for-agent # see triage-labels.md
|
|
124
|
-
blocked_by: [
|
|
151
|
+
blocked_by: [T9, T11] # plain ids, resolved repo-wide
|
|
125
152
|
claimed_by: # required when status: claimed
|
|
126
153
|
claimed_at: # timestamp, set with claimed_by
|
|
127
154
|
answer_gist: # required when status: resolved — one line, every kind
|
|
@@ -164,8 +191,8 @@ When FrontierMCP is loaded, prefer the MCP calls in the table above over hand-ed
|
|
|
164
191
|
|
|
165
192
|
**Everything below holds only while FrontierMCP is absent from the session.** With the server
|
|
166
193
|
loaded, `create_tickets` publishes the breakdown and is the only thing that may allocate an id;
|
|
167
|
-
hand-writing the file bypasses the
|
|
194
|
+
hand-writing the file bypasses the mint, per the File conventions preamble.
|
|
168
195
|
|
|
169
196
|
When a skill says "publish to the issue tracker" and FrontierMCP is not loaded, create
|
|
170
|
-
`.scratch/<effort-slug>/issues/<NN
|
|
171
|
-
|
|
197
|
+
`.scratch/<effort-slug>/issues/<NN>-<id>-<slug>.md` (creating directories as needed), mint the id
|
|
198
|
+
as the Layout steps above describe, and write frontmatter matching the template above.
|