frontier-mcp 0.5.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -15
- package/dist/domain.d.ts +69 -25
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +9 -0
- 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 +26 -9
- package/dist/server.js.map +1 -1
- package/dist/storage/driver.d.ts +61 -6
- package/dist/storage/driver.d.ts.map +1 -1
- package/dist/storage/driver.js +67 -5
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/markdown/create.d.ts +2 -3
- package/dist/storage/markdown/create.d.ts.map +1 -1
- package/dist/storage/markdown/create.js +2 -11
- 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 +155 -36
- package/dist/storage/markdown/driver.js.map +1 -1
- package/dist/storage/markdown/frontmatter.js +1 -1
- package/dist/storage/markdown/header-doc.d.ts.map +1 -1
- package/dist/storage/markdown/header-doc.js +13 -11
- package/dist/storage/markdown/header-doc.js.map +1 -1
- package/dist/storage/markdown/legacy.d.ts +8 -4
- package/dist/storage/markdown/legacy.d.ts.map +1 -1
- package/dist/storage/markdown/legacy.js +20 -15
- package/dist/storage/markdown/legacy.js.map +1 -1
- package/dist/storage/markdown/migrate.d.ts +13 -3
- package/dist/storage/markdown/migrate.d.ts.map +1 -1
- package/dist/storage/markdown/migrate.js +69 -79
- package/dist/storage/markdown/migrate.js.map +1 -1
- package/dist/storage/markdown/schema.d.ts +9 -0
- package/dist/storage/markdown/schema.d.ts.map +1 -0
- package/dist/storage/markdown/schema.js +21 -0
- package/dist/storage/markdown/schema.js.map +1 -0
- package/dist/storage/markdown/serialize.d.ts +1 -1
- package/dist/storage/markdown/serialize.d.ts.map +1 -1
- package/dist/storage/markdown/serialize.js +110 -24
- package/dist/storage/markdown/serialize.js.map +1 -1
- package/dist/storage/markdown/ticket.d.ts +29 -4
- package/dist/storage/markdown/ticket.d.ts.map +1 -1
- package/dist/storage/markdown/ticket.js +102 -30
- package/dist/storage/markdown/ticket.js.map +1 -1
- package/dist/storage/markdown/watcher.d.ts +1 -1
- package/dist/storage/markdown/watcher.d.ts.map +1 -1
- package/dist/storage/markdown/watcher.js +91 -11
- package/dist/storage/markdown/watcher.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 +23 -6
- package/dist/tools/create-tickets.js.map +1 -1
- package/dist/tools/edit-map.d.ts.map +1 -1
- package/dist/tools/edit-map.js +6 -2
- package/dist/tools/edit-map.js.map +1 -1
- package/dist/tools/get-board.d.ts.map +1 -1
- package/dist/tools/get-board.js +34 -7
- package/dist/tools/get-board.js.map +1 -1
- package/dist/tools/get-tickets.d.ts.map +1 -1
- package/dist/tools/get-tickets.js +42 -11
- package/dist/tools/get-tickets.js.map +1 -1
- package/dist/tools/list-efforts.d.ts +7 -0
- package/dist/tools/list-efforts.d.ts.map +1 -1
- package/dist/tools/list-efforts.js +15 -0
- package/dist/tools/list-efforts.js.map +1 -1
- package/dist/tools/migrate-effort.d.ts +6 -1
- package/dist/tools/migrate-effort.d.ts.map +1 -1
- package/dist/tools/migrate-effort.js +62 -20
- package/dist/tools/migrate-effort.js.map +1 -1
- package/dist/tools/update-ticket.d.ts +2 -0
- package/dist/tools/update-ticket.d.ts.map +1 -1
- package/dist/tools/update-ticket.js +14 -7
- 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/dist/workspace.d.ts +11 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +17 -5
- package/dist/workspace.js.map +1 -1
- package/docs/agents/issue-tracker.md +60 -27
- package/package.json +11 -11
- package/scripts/frontier-setup.cjs +451 -18
|
@@ -1,28 +1,13 @@
|
|
|
1
|
+
import { isMap, isScalar, parseDocument } from 'yaml';
|
|
1
2
|
import { STATUSES } from '../../domain.js';
|
|
2
|
-
import {
|
|
3
|
+
import { parseProseBody } from './legacy.js';
|
|
3
4
|
import { splitFrontmatter } from './frontmatter.js';
|
|
5
|
+
import { SCHEMA_KEYS } from './schema.js';
|
|
4
6
|
/** `<NN>-<rest>.md` — `NN` carries sort order and nothing else. */
|
|
5
7
|
const FILENAME_ORDER = /^(\d+)/;
|
|
6
|
-
/**
|
|
7
|
-
* Keys a schema Ticket may carry. Same set as FIELD_ORDER in serialize.ts,
|
|
8
|
-
* duplicated here so parse does not depend on the write module.
|
|
9
|
-
*/
|
|
10
|
-
const SCHEMA_KEYS = new Set([
|
|
11
|
-
'id',
|
|
12
|
-
'title',
|
|
13
|
-
'kind',
|
|
14
|
-
'type',
|
|
15
|
-
'status',
|
|
16
|
-
'triage',
|
|
17
|
-
'blocked_by',
|
|
18
|
-
'answer_gist',
|
|
19
|
-
'dropped_reason',
|
|
20
|
-
'claimed_by',
|
|
21
|
-
'claimed_at',
|
|
22
|
-
]);
|
|
23
8
|
/**
|
|
24
9
|
* Parse one Ticket file into everything but its prose. Schema-conformant files
|
|
25
|
-
* read from their frontmatter; everything else falls through to the
|
|
10
|
+
* read from their frontmatter; everything else falls through to the prose
|
|
26
11
|
* parser and is flagged, because a server that is useless until its repo is
|
|
27
12
|
* migrated never gets installed.
|
|
28
13
|
*
|
|
@@ -34,12 +19,12 @@ export function parseTicketSummary(effort, file, fallbackOrder, revision) {
|
|
|
34
19
|
const { fields } = splitFrontmatter(file.contents);
|
|
35
20
|
const order = readOrder(file.filename) ?? fallbackOrder;
|
|
36
21
|
if (fields === undefined)
|
|
37
|
-
return
|
|
22
|
+
return parseUnfenced(effort, order, file.contents, revision);
|
|
38
23
|
const id = text(fields['id']);
|
|
39
24
|
const rawStatus = text(fields['status']);
|
|
40
25
|
const mappedStatus = readStatus(rawStatus);
|
|
41
26
|
const unrecognizedStatus = rawStatus !== undefined && mappedStatus === undefined ? rawStatus : undefined;
|
|
42
|
-
|
|
27
|
+
const ticket = {
|
|
43
28
|
id,
|
|
44
29
|
handle: handleFor(id, effort, order),
|
|
45
30
|
title: text(fields['title']) ?? '(untitled)',
|
|
@@ -54,24 +39,108 @@ export function parseTicketSummary(effort, file, fallbackOrder, revision) {
|
|
|
54
39
|
blockedBy: readEdgeList(fields['blocked_by']),
|
|
55
40
|
effort,
|
|
56
41
|
order,
|
|
57
|
-
|
|
42
|
+
foreign: isForeignFence(fields),
|
|
43
|
+
foreignFenced: isForeignFence(fields),
|
|
58
44
|
unrecognizedStatus,
|
|
59
45
|
collapsedRefs: [],
|
|
46
|
+
keptSubSlices: [],
|
|
60
47
|
revision,
|
|
61
48
|
};
|
|
49
|
+
return { ticket, subSlices: [] };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Decided once, over one Effort, so the Board, the Frontier, a lazy write and
|
|
53
|
+
* migration all see the same Edges (T82). A prose `T38.1` coarsens to `T38`
|
|
54
|
+
* only when `T38` is a Ticket of this Effort — ids read from prose headings
|
|
55
|
+
* included, which is why this runs after every file is parsed. Otherwise it
|
|
56
|
+
* stays as declared and dangles: a milestone label coarsened onto another
|
|
57
|
+
* Effort's resolved `T1` grants an Edge the file never declared.
|
|
58
|
+
*/
|
|
59
|
+
export function resolveSubSlices(parsed) {
|
|
60
|
+
const local = new Set(parsed.map(entry => entry.ticket.id).filter(id => id !== undefined));
|
|
61
|
+
return parsed.map(({ ticket, subSlices }) => {
|
|
62
|
+
if (subSlices.length === 0)
|
|
63
|
+
return ticket;
|
|
64
|
+
const slices = new Set(subSlices);
|
|
65
|
+
const collapsed = [];
|
|
66
|
+
const kept = [];
|
|
67
|
+
const edges = ticket.blockedBy.map(edge => {
|
|
68
|
+
if (!slices.has(edge))
|
|
69
|
+
return edge;
|
|
70
|
+
const parent = edge.slice(0, edge.indexOf('.'));
|
|
71
|
+
// Its own id is no parent: `T5` blocked by `T5.2` would become a self-Edge.
|
|
72
|
+
if (!local.has(parent) || parent === ticket.id) {
|
|
73
|
+
kept.push(edge);
|
|
74
|
+
return edge;
|
|
75
|
+
}
|
|
76
|
+
collapsed.push(edge);
|
|
77
|
+
return parent;
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
...ticket,
|
|
81
|
+
blockedBy: [...new Set(edges)],
|
|
82
|
+
collapsedRefs: collapsed,
|
|
83
|
+
keptSubSlices: kept,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
62
86
|
}
|
|
63
87
|
/**
|
|
64
88
|
* A Ticket's prose. A schema file's body is what sits below the frontmatter; a
|
|
65
|
-
*
|
|
89
|
+
* fenceless file has no fence, so its whole contents are the prose — the same
|
|
66
90
|
* split {@link parseTicketSummary} makes, taken from the other side.
|
|
67
91
|
*/
|
|
68
92
|
export function ticketBody(contents) {
|
|
69
93
|
const { fields, body } = splitFrontmatter(contents);
|
|
70
94
|
return (fields === undefined ? contents : body).trim();
|
|
71
95
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
/**
|
|
97
|
+
* The frontmatter keys this schema does not import, and the file's own text for
|
|
98
|
+
* them. A foreign fence is shown whole, byte for byte; a fence with an id shows
|
|
99
|
+
* only its unimported entries, each sliced from the source rather than
|
|
100
|
+
* re-serialized. Undefined for a conforming Ticket and for a fenceless file.
|
|
101
|
+
*/
|
|
102
|
+
export function unimportedFrontmatter(contents) {
|
|
103
|
+
const { fields, raw } = splitFrontmatter(contents);
|
|
104
|
+
if (fields === undefined || raw === undefined)
|
|
105
|
+
return undefined;
|
|
106
|
+
const keys = Object.keys(fields).filter(key => !SCHEMA_KEYS.has(key));
|
|
107
|
+
if (keys.length === 0)
|
|
108
|
+
return undefined;
|
|
109
|
+
if (isForeignFence(fields))
|
|
110
|
+
return { keys, yaml: raw, whole: true };
|
|
111
|
+
const entries = unimportedEntries(raw);
|
|
112
|
+
return entries === undefined
|
|
113
|
+
? { keys, yaml: raw, whole: true }
|
|
114
|
+
: { keys, yaml: entries, whole: false };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The unimported pairs cut from the fence's own text, or undefined when one of
|
|
118
|
+
* them cannot be cut cleanly — a non-scalar or explicit (`? key`) key — in which
|
|
119
|
+
* case the caller shows the whole fence rather than a block that disagrees with
|
|
120
|
+
* the keys it names.
|
|
121
|
+
*/
|
|
122
|
+
function unimportedEntries(raw) {
|
|
123
|
+
const doc = parseDocument(raw);
|
|
124
|
+
if (!isMap(doc.contents))
|
|
125
|
+
return undefined;
|
|
126
|
+
const slices = [];
|
|
127
|
+
for (const pair of doc.contents.items) {
|
|
128
|
+
if (isScalar(pair.key) && SCHEMA_KEYS.has(String(pair.key.value)))
|
|
129
|
+
continue;
|
|
130
|
+
const start = isScalar(pair.key) ? pair.key.range?.[0] : undefined;
|
|
131
|
+
const value = pair.value;
|
|
132
|
+
const end = value?.range?.[2] ?? (isScalar(pair.key) ? pair.key.range?.[2] : undefined);
|
|
133
|
+
if (start === undefined || end === undefined)
|
|
134
|
+
return undefined;
|
|
135
|
+
if (raw.slice(raw.lastIndexOf('\n', start - 1) + 1, start).trim() !== '')
|
|
136
|
+
return undefined;
|
|
137
|
+
slices.push(raw.slice(start, end).replace(/\s+$/, ''));
|
|
138
|
+
}
|
|
139
|
+
return slices.join(raw.includes('\r\n') ? '\r\n' : '\n');
|
|
140
|
+
}
|
|
141
|
+
function parseUnfenced(effort, order, contents, revision) {
|
|
142
|
+
const inferred = parseProseBody(contents);
|
|
143
|
+
const ticket = {
|
|
75
144
|
id: inferred.id,
|
|
76
145
|
handle: handleFor(inferred.id, effort, order),
|
|
77
146
|
title: inferred.title,
|
|
@@ -79,7 +148,7 @@ function parseLegacy(effort, order, contents, revision) {
|
|
|
79
148
|
type: inferred.type,
|
|
80
149
|
status: inferred.status,
|
|
81
150
|
triage: inferred.triage,
|
|
82
|
-
// A
|
|
151
|
+
// A fenceless file records its answer as prose in the body, not as a field.
|
|
83
152
|
answerGist: undefined,
|
|
84
153
|
droppedReason: undefined,
|
|
85
154
|
claimedBy: undefined,
|
|
@@ -87,14 +156,17 @@ function parseLegacy(effort, order, contents, revision) {
|
|
|
87
156
|
blockedBy: inferred.blockedBy,
|
|
88
157
|
effort,
|
|
89
158
|
order,
|
|
90
|
-
|
|
159
|
+
foreign: true,
|
|
160
|
+
foreignFenced: false,
|
|
91
161
|
unrecognizedStatus: inferred.unrecognizedStatus,
|
|
92
|
-
collapsedRefs:
|
|
162
|
+
collapsedRefs: [],
|
|
163
|
+
keptSubSlices: [],
|
|
93
164
|
revision,
|
|
94
165
|
};
|
|
166
|
+
return { ticket, subSlices: inferred.subSlices };
|
|
95
167
|
}
|
|
96
168
|
/**
|
|
97
|
-
* A Ticket with no id still has to be nameable, or a whole Effort of
|
|
169
|
+
* A Ticket with no id still has to be nameable, or a whole Effort of Foreign Tickets
|
|
98
170
|
* has no route to its own bodies. `<effort>#<order>` is that fallback — an
|
|
99
171
|
* address, deliberately not an id: it is not repo-stable and never appears as
|
|
100
172
|
* an Edge.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../../src/storage/markdown/ticket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ticket.js","sourceRoot":"","sources":["../../../src/storage/markdown/ticket.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ export interface WatchStorageOptions {
|
|
|
19
19
|
* answer, handed down.
|
|
20
20
|
*
|
|
21
21
|
* If the storage directory does not exist yet, the workspace root is watched
|
|
22
|
-
* until it appears, then the
|
|
22
|
+
* until it appears, then the storage watch is attached.
|
|
23
23
|
*
|
|
24
24
|
* **A watch is not live the moment `watch()` returns.** On macOS libuv
|
|
25
25
|
* registers the FSEvents stream off-thread, and multiplexes every watch in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/storage/markdown/watcher.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAIlC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACnD;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/storage/markdown/watcher.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAIlC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACnD;AAwFD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,IAAI,EACtB,EAAE,UAAgC,EAAE,QAA4B,EAAE,GAAE,mBAAwB,GAC3F,cAAc,CA8GhB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, watch } from 'node:fs';
|
|
1
|
+
import { existsSync, readdirSync, watch } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
/**
|
|
4
4
|
* Long enough to coalesce the burst a branch switch makes, short enough that a
|
|
@@ -23,6 +23,69 @@ const DEFAULT_DEBOUNCE_MS = 50;
|
|
|
23
23
|
* it is per watch, not per event.
|
|
24
24
|
*/
|
|
25
25
|
const DEFAULT_SETTLE_MS = [50, 250, 1000];
|
|
26
|
+
/**
|
|
27
|
+
* Where `{ recursive: true }` is Node's own watch. Elsewhere — Linux — it is
|
|
28
|
+
* `lib/internal/fs/recursive_watch.js`, which from 24.22.0 throws inside its
|
|
29
|
+
* own event callback when a watched directory is replaced by a same-named
|
|
30
|
+
* file (`ENOTDIR`, nodejs/node#66791). No `error` listener sees that throw,
|
|
31
|
+
* so it kills the process; there we watch each directory ourselves instead.
|
|
32
|
+
*/
|
|
33
|
+
const NATIVE_RECURSIVE = process.platform === 'darwin' || process.platform === 'win32';
|
|
34
|
+
/**
|
|
35
|
+
* One non-recursive watch per directory under `dir`. The set of directories is
|
|
36
|
+
* re-synced on `resync()`, which the caller runs before each invalidation, so a
|
|
37
|
+
* directory created during a debounce is watched before the scan that reads
|
|
38
|
+
* it. Every filesystem call is caught: this runs in our own event callback,
|
|
39
|
+
* which is the whole point. Returns undefined when `dir` cannot be watched.
|
|
40
|
+
*/
|
|
41
|
+
function watchDirectories(dir, onEvent) {
|
|
42
|
+
const watchers = new Map();
|
|
43
|
+
const resync = () => {
|
|
44
|
+
const seen = new Set();
|
|
45
|
+
const visit = (path) => {
|
|
46
|
+
seen.add(path);
|
|
47
|
+
if (!watchers.has(path)) {
|
|
48
|
+
try {
|
|
49
|
+
const watcher = watch(path, onEvent);
|
|
50
|
+
watcher.on('error', () => {
|
|
51
|
+
watcher.close();
|
|
52
|
+
if (watchers.get(path) === watcher)
|
|
53
|
+
watchers.delete(path);
|
|
54
|
+
});
|
|
55
|
+
watchers.set(path, watcher);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
seen.delete(path);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
let entries;
|
|
63
|
+
try {
|
|
64
|
+
entries = readdirSync(path, { withFileTypes: true });
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
for (const entry of entries)
|
|
70
|
+
if (entry.isDirectory())
|
|
71
|
+
visit(join(path, entry.name));
|
|
72
|
+
};
|
|
73
|
+
visit(dir);
|
|
74
|
+
for (const [path, watcher] of watchers) {
|
|
75
|
+
if (seen.has(path))
|
|
76
|
+
continue;
|
|
77
|
+
watcher.close();
|
|
78
|
+
watchers.delete(path);
|
|
79
|
+
}
|
|
80
|
+
return watchers.has(dir);
|
|
81
|
+
};
|
|
82
|
+
const close = () => {
|
|
83
|
+
for (const watcher of watchers.values())
|
|
84
|
+
watcher.close();
|
|
85
|
+
watchers.clear();
|
|
86
|
+
};
|
|
87
|
+
return resync() ? { close, resync } : (close(), undefined);
|
|
88
|
+
}
|
|
26
89
|
/**
|
|
27
90
|
* Watch `storageDir` under a resolved workspace and call `invalidate` when it
|
|
28
91
|
* changes. Never writes — only schedules invalidation after debouncing.
|
|
@@ -37,7 +100,7 @@ const DEFAULT_SETTLE_MS = [50, 250, 1000];
|
|
|
37
100
|
* answer, handed down.
|
|
38
101
|
*
|
|
39
102
|
* If the storage directory does not exist yet, the workspace root is watched
|
|
40
|
-
* until it appears, then the
|
|
103
|
+
* until it appears, then the storage watch is attached.
|
|
41
104
|
*
|
|
42
105
|
* **A watch is not live the moment `watch()` returns.** On macOS libuv
|
|
43
106
|
* registers the FSEvents stream off-thread, and multiplexes every watch in the
|
|
@@ -53,6 +116,7 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
53
116
|
const storagePath = join(root, storageDir);
|
|
54
117
|
let timer;
|
|
55
118
|
let storageWatcher;
|
|
119
|
+
let resyncDirectories;
|
|
56
120
|
let rootWatcher;
|
|
57
121
|
// Held so close() can clear them: a settle timer that outlives the driver
|
|
58
122
|
// keeps a test worker's event loop alive long after the workspace is gone.
|
|
@@ -62,6 +126,11 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
62
126
|
clearTimeout(timer);
|
|
63
127
|
timer = setTimeout(() => {
|
|
64
128
|
timer = undefined;
|
|
129
|
+
if (resyncDirectories?.() === false) {
|
|
130
|
+
storageWatcher?.close();
|
|
131
|
+
storageWatcher = undefined;
|
|
132
|
+
resyncDirectories = undefined;
|
|
133
|
+
}
|
|
65
134
|
invalidate();
|
|
66
135
|
}, debounceMs);
|
|
67
136
|
};
|
|
@@ -73,7 +142,7 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
73
142
|
* Each pass retries the attach before dropping the scan, because the event a
|
|
74
143
|
* root watch is warming up to miss is "the storage directory appeared" — and
|
|
75
144
|
* losing that one costs more than a stale scan. Nothing would ever call
|
|
76
|
-
* {@link attachStorageWatcher} again, so the
|
|
145
|
+
* {@link attachStorageWatcher} again, so the storage watch would never take
|
|
77
146
|
* over and every later change would go unseen. Re-attaching here is idempotent:
|
|
78
147
|
* a watch already in place returns immediately.
|
|
79
148
|
*/
|
|
@@ -91,13 +160,23 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
91
160
|
if (storageWatcher !== undefined || !existsSync(storagePath))
|
|
92
161
|
return;
|
|
93
162
|
try {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
163
|
+
if (NATIVE_RECURSIVE) {
|
|
164
|
+
const watcher = watch(storagePath, { recursive: true }, () => {
|
|
165
|
+
scheduleInvalidate();
|
|
166
|
+
});
|
|
167
|
+
watcher.on('error', () => {
|
|
168
|
+
watcher.close();
|
|
169
|
+
storageWatcher = undefined;
|
|
170
|
+
});
|
|
171
|
+
storageWatcher = watcher;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const tree = watchDirectories(storagePath, scheduleInvalidate);
|
|
175
|
+
if (tree === undefined)
|
|
176
|
+
return;
|
|
177
|
+
storageWatcher = tree;
|
|
178
|
+
resyncDirectories = tree.resync;
|
|
179
|
+
}
|
|
101
180
|
rootWatcher?.close();
|
|
102
181
|
rootWatcher = undefined;
|
|
103
182
|
settle();
|
|
@@ -113,7 +192,7 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
113
192
|
rootWatcher = watch(root, (_event, filename) => {
|
|
114
193
|
// One segment deep, so the name a root watch reports can match it
|
|
115
194
|
// whole. A nested path would never match, and the watch would never
|
|
116
|
-
// hand over to the
|
|
195
|
+
// hand over to the storage one.
|
|
117
196
|
if (filename !== storageDir)
|
|
118
197
|
return;
|
|
119
198
|
attachStorageWatcher();
|
|
@@ -142,6 +221,7 @@ export function watchStorage(root, storageDir, invalidate, { debounceMs = DEFAUL
|
|
|
142
221
|
storageWatcher?.close();
|
|
143
222
|
rootWatcher?.close();
|
|
144
223
|
storageWatcher = undefined;
|
|
224
|
+
resyncDirectories = undefined;
|
|
145
225
|
rootWatcher = undefined;
|
|
146
226
|
},
|
|
147
227
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/storage/markdown/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../../src/storage/markdown/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,10 +54,21 @@ export interface PlannedBatch {
|
|
|
54
54
|
* the driver mints one the only rule left to check is the one that needed it.
|
|
55
55
|
*/
|
|
56
56
|
export declare function planBatch(requests: readonly DraftRequest[], existing: readonly TicketSummary[], isId: (name: string) => boolean): PlannedBatch;
|
|
57
|
+
/**
|
|
58
|
+
* Rides every create under a counted-only pattern and never a read: minting is
|
|
59
|
+
* where the collision is realised, and a once-per-process suppression would
|
|
60
|
+
* hide it from every agent connecting later. The closing clause keeps an agent
|
|
61
|
+
* from reporting a standing property as this call's failure. It never mentions
|
|
62
|
+
* duplicates; the Board's duplicate warning points back here instead (T56).
|
|
63
|
+
*/
|
|
64
|
+
export declare function countedPatternWarning(pattern: string, configuredIn: string): string;
|
|
57
65
|
/**
|
|
58
66
|
* One line per Ticket: the id it was minted and the Edges as resolved — the two
|
|
59
67
|
* things a caller cannot work out for itself. The filename is deliberately not
|
|
60
68
|
* here: it is cosmetic, and the id is what everything addresses a Ticket by.
|
|
61
69
|
*/
|
|
62
|
-
export declare function renderCreated(effort: string, created: readonly TicketSummary[]
|
|
70
|
+
export declare function renderCreated(effort: string, created: readonly TicketSummary[], colliding?: {
|
|
71
|
+
readonly pattern: string;
|
|
72
|
+
readonly configuredIn: string;
|
|
73
|
+
}): string;
|
|
63
74
|
//# sourceMappingURL=create-tickets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tickets.d.ts","sourceRoot":"","sources":["../../src/tools/create-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAKjF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;iBAuCnC,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAGmD,CAAC;AAEzF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,KAAK,IAAI,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC9B,YAAY,CAgBd;AA6HD;;;;GAIG;AACH,wBAAgB,aAAa,
|
|
1
|
+
{"version":3,"file":"create-tickets.d.ts","sourceRoot":"","sources":["../../src/tools/create-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAKjF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;iBAuCnC,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAGmD,CAAC;AAEzF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,aAAa,EAAE,KAAK,IAAI,CAAC;CACxF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC9B,YAAY,CAgBd;AA6HD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAQnF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,SAAS,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACtE,MAAM,CAsBR"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { TRIAGE_ROLES } from '../domain.js';
|
|
3
3
|
import { cycleThrough, renderCycle, resolveDraftEdges } from '../edges.js';
|
|
4
|
-
import {
|
|
4
|
+
import { claimantsById, edgesOfClaimants } from '../frontier.js';
|
|
5
5
|
export const createTicketsInputSchema = z.object({
|
|
6
6
|
effort: z.string().describe('Effort slug to create them in.'),
|
|
7
7
|
create: z
|
|
@@ -103,7 +103,7 @@ function declaredKeys(drafts, isId, existing) {
|
|
|
103
103
|
* mistyped key into a dangling Edge nobody notices.
|
|
104
104
|
*/
|
|
105
105
|
function checkEdges(drafts, keys, existing, isId) {
|
|
106
|
-
const ids =
|
|
106
|
+
const ids = claimantsById(existing);
|
|
107
107
|
for (const draft of drafts) {
|
|
108
108
|
for (const edge of draft.blockedBy) {
|
|
109
109
|
if (keys.has(edge) || ids.has(edge) || isId(edge))
|
|
@@ -122,7 +122,7 @@ function checkEdges(drafts, keys, existing, isId) {
|
|
|
122
122
|
* already on disk.
|
|
123
123
|
*/
|
|
124
124
|
function checkCycles(drafts, names, existing, resolve = edge => edge) {
|
|
125
|
-
const ids =
|
|
125
|
+
const ids = claimantsById(existing);
|
|
126
126
|
const nodes = new Map();
|
|
127
127
|
const edges = new Map();
|
|
128
128
|
drafts.forEach((draft, index) => {
|
|
@@ -130,7 +130,7 @@ function checkCycles(drafts, names, existing, resolve = edge => edge) {
|
|
|
130
130
|
nodes.set(name, draft);
|
|
131
131
|
edges.set(name, draft.blockedBy.map(resolve));
|
|
132
132
|
});
|
|
133
|
-
const edgesOf = id => edges.get(id) ?? ids
|
|
133
|
+
const edgesOf = id => edges.get(id) ?? edgesOfClaimants(ids, id);
|
|
134
134
|
for (const [node, draft] of nodes) {
|
|
135
135
|
const cycle = cycleThrough(node, edgesOf);
|
|
136
136
|
if (cycle !== undefined) {
|
|
@@ -141,17 +141,31 @@ function checkCycles(drafts, names, existing, resolve = edge => edge) {
|
|
|
141
141
|
}
|
|
142
142
|
/** A name for a keyless draft that no Edge can collide with. */
|
|
143
143
|
function placeholderFor(index, keys) {
|
|
144
|
-
let name =
|
|
144
|
+
let name = `draft ${String(index + 1)}`;
|
|
145
145
|
while (keys.has(name))
|
|
146
146
|
name = `${name}.`;
|
|
147
147
|
return name;
|
|
148
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Rides every create under a counted-only pattern and never a read: minting is
|
|
151
|
+
* where the collision is realised, and a once-per-process suppression would
|
|
152
|
+
* hide it from every agent connecting later. The closing clause keeps an agent
|
|
153
|
+
* from reporting a standing property as this call's failure. It never mentions
|
|
154
|
+
* duplicates; the Board's duplicate warning points back here instead (T56).
|
|
155
|
+
*/
|
|
156
|
+
export function countedPatternWarning(pattern, configuredIn) {
|
|
157
|
+
return (`id pattern \`${pattern}\` mints by counting the Tickets already in this working tree, so a ` +
|
|
158
|
+
'branch that counts the same tree mints the same ids and a merge leaves two Tickets on one ' +
|
|
159
|
+
'id — a regression from random ids. `T<N>-<b36{4}>` keeps the readable number and cannot ' +
|
|
160
|
+
`collide across branches. Set in ${configuredIn}. No action is required here — this ` +
|
|
161
|
+
'describes the pattern, not this call.');
|
|
162
|
+
}
|
|
149
163
|
/**
|
|
150
164
|
* One line per Ticket: the id it was minted and the Edges as resolved — the two
|
|
151
165
|
* things a caller cannot work out for itself. The filename is deliberately not
|
|
152
166
|
* here: it is cosmetic, and the id is what everything addresses a Ticket by.
|
|
153
167
|
*/
|
|
154
|
-
export function renderCreated(effort, created) {
|
|
168
|
+
export function renderCreated(effort, created, colliding) {
|
|
155
169
|
const lines = [`${effort}: ${String(created.length)} created`];
|
|
156
170
|
for (const ticket of created) {
|
|
157
171
|
lines.push([
|
|
@@ -162,6 +176,9 @@ export function renderCreated(effort, created) {
|
|
|
162
176
|
.filter(part => part !== undefined)
|
|
163
177
|
.join(' '));
|
|
164
178
|
}
|
|
179
|
+
if (colliding !== undefined) {
|
|
180
|
+
lines.push('warnings:', `- ${countedPatternWarning(colliding.pattern, colliding.configuredIn)}`);
|
|
181
|
+
}
|
|
165
182
|
return lines.join('\n');
|
|
166
183
|
}
|
|
167
184
|
//# sourceMappingURL=create-tickets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tickets.js","sourceRoot":"","sources":["../../src/tools/create-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAgB,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-tickets.js","sourceRoot":"","sources":["../../src/tools/create-tickets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-map.d.ts","sourceRoot":"","sources":["../../src/tools/edit-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,eAAO,MAAM,kBAAkB;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"edit-map.d.ts","sourceRoot":"","sources":["../../src/tools/edit-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEzD,eAAO,MAAM,kBAAkB;;;;;;;;;;iBAsC7B,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAIyE,CAAC;AAEzG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAQ3D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAwBvE"}
|
package/dist/tools/edit-map.js
CHANGED
|
@@ -9,7 +9,11 @@ export const editMapInputSchema = z.object({
|
|
|
9
9
|
'existing Map; create with no section fields reads an existing Map like a plain read.'),
|
|
10
10
|
destination: z.string().optional().describe('Replace the Destination section.'),
|
|
11
11
|
notes: z.string().optional().describe('Replace the Notes section.'),
|
|
12
|
-
add_fog: z
|
|
12
|
+
add_fog: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Append a fog patch under Not yet specified. One line.'),
|
|
13
17
|
graduate_fog: z
|
|
14
18
|
.string()
|
|
15
19
|
.min(1)
|
|
@@ -19,7 +23,7 @@ export const editMapInputSchema = z.object({
|
|
|
19
23
|
.string()
|
|
20
24
|
.min(1)
|
|
21
25
|
.optional()
|
|
22
|
-
.describe('Append a hand-ruled item under Out of scope. Never touches Decisions-so-far.'),
|
|
26
|
+
.describe('Append a hand-ruled item under Out of scope. Never touches Decisions-so-far. One line.'),
|
|
23
27
|
expected_revision: z
|
|
24
28
|
.string()
|
|
25
29
|
.min(1)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-map.js","sourceRoot":"","sources":["../../src/tools/edit-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACrE,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,kFAAkF;QAChF,uFAAuF;QACvF,sFAAsF,CACzF;IACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC/E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACnE,OAAO,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"edit-map.js","sourceRoot":"","sources":["../../src/tools/edit-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,EAAU,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlE,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,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;IAClD,gFAAgF;IAChF,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,aAAa,EAAE,EAC7B,iBAAiB,GAAE,SAAS,MAAM,EAAO,GACxC,KAAK,CAQP;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAgChD"}
|