frontier-mcp 0.6.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 +33 -0
- package/dist/domain.d.ts +62 -29
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +9 -0
- package/dist/domain.js.map +1 -1
- package/dist/frontier.js +1 -1
- package/dist/frontier.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +14 -8
- package/dist/server.js.map +1 -1
- package/dist/storage/driver.d.ts +36 -6
- package/dist/storage/driver.d.ts.map +1 -1
- package/dist/storage/driver.js +53 -5
- package/dist/storage/driver.js.map +1 -1
- package/dist/storage/markdown/create.d.ts +0 -2
- package/dist/storage/markdown/create.d.ts.map +1 -1
- package/dist/storage/markdown/create.js +0 -10
- 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 +36 -18
- 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 +11 -3
- package/dist/storage/markdown/migrate.d.ts.map +1 -1
- package/dist/storage/markdown/migrate.js +69 -80
- 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 -6
- package/dist/storage/markdown/ticket.d.ts.map +1 -1
- package/dist/storage/markdown/ticket.js +100 -33
- 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.js +1 -1
- 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 +16 -9
- 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 +59 -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 +11 -4
- package/dist/tools/update-ticket.js.map +1 -1
- 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 +15 -9
- package/package.json +11 -11
- package/scripts/frontier-setup.cjs +451 -18
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { TicketSummary } from '../../domain.ts';
|
|
1
|
+
import type { TicketSummary, UnimportedFrontmatter } from '../../domain.ts';
|
|
2
2
|
export interface TicketFile {
|
|
3
3
|
readonly filename: string;
|
|
4
4
|
readonly contents: string;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
7
|
* Parse one Ticket file into everything but its prose. Schema-conformant files
|
|
8
|
-
* read from their frontmatter; everything else falls through to the
|
|
8
|
+
* read from their frontmatter; everything else falls through to the prose
|
|
9
9
|
* parser and is flagged, because a server that is useless until its repo is
|
|
10
10
|
* migrated never gets installed.
|
|
11
11
|
*
|
|
@@ -13,13 +13,36 @@ export interface TicketFile {
|
|
|
13
13
|
* workspace, and almost nothing above the seam reads prose. {@link ticketBody}
|
|
14
14
|
* takes it out of the same contents for the few Tickets actually being worked.
|
|
15
15
|
*/
|
|
16
|
-
export declare function parseTicketSummary(effort: string, file: TicketFile, fallbackOrder: number, revision: string):
|
|
16
|
+
export declare function parseTicketSummary(effort: string, file: TicketFile, fallbackOrder: number, revision: string): ParsedTicket;
|
|
17
|
+
/**
|
|
18
|
+
* A Ticket as one file reads, before its Effort is known: prose sub-slice
|
|
19
|
+
* references are still as declared, because only the siblings can say whether
|
|
20
|
+
* `T38.1` names a slice of a Ticket here.
|
|
21
|
+
*/
|
|
22
|
+
export interface ParsedTicket {
|
|
23
|
+
readonly ticket: TicketSummary;
|
|
24
|
+
readonly subSlices: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decided once, over one Effort, so the Board, the Frontier, a lazy write and
|
|
28
|
+
* migration all see the same Edges (T82). A prose `T38.1` coarsens to `T38`
|
|
29
|
+
* only when `T38` is a Ticket of this Effort — ids read from prose headings
|
|
30
|
+
* included, which is why this runs after every file is parsed. Otherwise it
|
|
31
|
+
* stays as declared and dangles: a milestone label coarsened onto another
|
|
32
|
+
* Effort's resolved `T1` grants an Edge the file never declared.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveSubSlices(parsed: readonly ParsedTicket[]): TicketSummary[];
|
|
17
35
|
/**
|
|
18
36
|
* A Ticket's prose. A schema file's body is what sits below the frontmatter; a
|
|
19
|
-
*
|
|
37
|
+
* fenceless file has no fence, so its whole contents are the prose — the same
|
|
20
38
|
* split {@link parseTicketSummary} makes, taken from the other side.
|
|
21
39
|
*/
|
|
22
40
|
export declare function ticketBody(contents: string): string;
|
|
23
|
-
/**
|
|
24
|
-
|
|
41
|
+
/**
|
|
42
|
+
* The frontmatter keys this schema does not import, and the file's own text for
|
|
43
|
+
* them. A foreign fence is shown whole, byte for byte; a fence with an id shows
|
|
44
|
+
* only its unimported entries, each sliced from the source rather than
|
|
45
|
+
* re-serialized. Undefined for a conforming Ticket and for a fenceless file.
|
|
46
|
+
*/
|
|
47
|
+
export declare function unimportedFrontmatter(contents: string): UnimportedFrontmatter | undefined;
|
|
25
48
|
//# sourceMappingURL=ticket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../../src/storage/markdown/ticket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ticket.d.ts","sourceRoot":"","sources":["../../../src/storage/markdown/ticket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,aAAa,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAS1F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,YAAY,CAmCd;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,aAAa,EAAE,CAyBjF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAUzF"}
|
|
@@ -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,29 +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
|
-
|
|
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) {
|
|
74
103
|
const { fields, raw } = splitFrontmatter(contents);
|
|
75
|
-
|
|
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 };
|
|
76
115
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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 = {
|
|
80
144
|
id: inferred.id,
|
|
81
145
|
handle: handleFor(inferred.id, effort, order),
|
|
82
146
|
title: inferred.title,
|
|
@@ -84,7 +148,7 @@ function parseLegacy(effort, order, contents, revision) {
|
|
|
84
148
|
type: inferred.type,
|
|
85
149
|
status: inferred.status,
|
|
86
150
|
triage: inferred.triage,
|
|
87
|
-
// A
|
|
151
|
+
// A fenceless file records its answer as prose in the body, not as a field.
|
|
88
152
|
answerGist: undefined,
|
|
89
153
|
droppedReason: undefined,
|
|
90
154
|
claimedBy: undefined,
|
|
@@ -92,14 +156,17 @@ function parseLegacy(effort, order, contents, revision) {
|
|
|
92
156
|
blockedBy: inferred.blockedBy,
|
|
93
157
|
effort,
|
|
94
158
|
order,
|
|
95
|
-
|
|
159
|
+
foreign: true,
|
|
160
|
+
foreignFenced: false,
|
|
96
161
|
unrecognizedStatus: inferred.unrecognizedStatus,
|
|
97
|
-
collapsedRefs:
|
|
162
|
+
collapsedRefs: [],
|
|
163
|
+
keptSubSlices: [],
|
|
98
164
|
revision,
|
|
99
165
|
};
|
|
166
|
+
return { ticket, subSlices: inferred.subSlices };
|
|
100
167
|
}
|
|
101
168
|
/**
|
|
102
|
-
* 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
|
|
103
170
|
* has no route to its own bodies. `<effort>#<order>` is that fallback — an
|
|
104
171
|
* address, deliberately not an id: it is not repo-stable and never appears as
|
|
105
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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"}
|
|
@@ -141,7 +141,7 @@ 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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tickets.js","sourceRoot":"","sources":["../../src/tools/create-tickets.ts"],"names":[],"mappings":"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
|
|
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":"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;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,uDAAuD,CAAC;IACpE,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,wFAAwF,CACzF;IACH,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,kFAAkF;QAChF,4BAA4B,CAC/B;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;CAChG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,4FAA4F;IAC5F,2FAA2F;IAC3F,mFAAmF;IACnF,sGAAsG,CAAC;AAUzG,2DAA2D;AAC3D,MAAM,UAAU,UAAU,CAAC,OAAuB;IAChD,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,QAAqB;IAC7D,MAAM,KAAK,GAAG,CAAC,WAAW,MAAM,EAAE,EAAE,iBAAiB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE1E,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;QAC7D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,eAAe;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IAE9E,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;QACxD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -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"}
|
package/dist/tools/get-board.js
CHANGED
|
@@ -112,11 +112,19 @@ function renderEdge(id, from, board) {
|
|
|
112
112
|
return `${id}?`;
|
|
113
113
|
return blocker.effort === from.effort ? id : `${id}@${blocker.effort}`;
|
|
114
114
|
}
|
|
115
|
+
/** The field each lifecycle Status requires, as the tracker doc states it. */
|
|
116
|
+
const LIFECYCLE_FIELDS = [
|
|
117
|
+
['resolved', 'answer_gist', ticket => ticket.answerGist],
|
|
118
|
+
['dropped', 'dropped_reason', ticket => ticket.droppedReason],
|
|
119
|
+
['claimed', 'claimed_by', ticket => ticket.claimedBy],
|
|
120
|
+
// Without it a claim can never be flagged stale.
|
|
121
|
+
['claimed', 'claimed_at', ticket => ticket.claimedAt],
|
|
122
|
+
];
|
|
115
123
|
/**
|
|
116
124
|
* Broken Edges surface here rather than through a separate validation tool,
|
|
117
125
|
* because a validation tool nobody calls is a validator that does not exist.
|
|
118
126
|
*
|
|
119
|
-
* Every warning is grouped, never itemized per Ticket. An Effort of
|
|
127
|
+
* Every warning is grouped, never itemized per Ticket. An Effort of Foreign
|
|
120
128
|
* Tickets can carry a dangling Edge on nearly every one of them, and a warnings
|
|
121
129
|
* block longer than the Board it annotates would undo the saving the Board
|
|
122
130
|
* exists to deliver.
|
|
@@ -174,13 +182,32 @@ function collectWarnings(board) {
|
|
|
174
182
|
warnings.push(`stale claim, held longer than ${String(STALE_AFTER_HOURS)}h (${String(stale.size)}): ` +
|
|
175
183
|
`${[...stale].toSorted().join(' ')} — flagged only, never released; ask the holder`);
|
|
176
184
|
}
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
179
|
-
warnings.push(`${String(
|
|
180
|
-
'status and Edges are inferred from
|
|
185
|
+
const foreign = board.tickets.filter(ticket => ticket.foreign && !ticket.foreignFenced);
|
|
186
|
+
if (foreign.length > 0) {
|
|
187
|
+
warnings.push(`${String(foreign.length)}/${String(board.tickets.length)} Tickets are Foreign — title, ` +
|
|
188
|
+
'status and Edges are inferred, not read from schema frontmatter. Run migrate_effort to normalize.');
|
|
181
189
|
}
|
|
182
|
-
//
|
|
183
|
-
//
|
|
190
|
+
// Counted apart from the prose-inferred ones: these fields were read from a
|
|
191
|
+
// fence, so pointing a reader at prose would send them after a `Status:` line
|
|
192
|
+
// that is not there.
|
|
193
|
+
const fenced = board.tickets.filter(ticket => ticket.foreignFenced);
|
|
194
|
+
if (fenced.length > 0) {
|
|
195
|
+
warnings.push(`${String(fenced.length)}/${String(board.tickets.length)} Tickets have a foreign fence — ` +
|
|
196
|
+
'title, status and Edges came from frontmatter that was not imported; get_tickets shows ' +
|
|
197
|
+
'the rest of it. Run migrate_effort to normalize.');
|
|
198
|
+
}
|
|
199
|
+
// A file with no fence records its answer as prose, so it never carries these
|
|
200
|
+
// fields; counting it would repeat the Foreign warning above as a false alarm.
|
|
201
|
+
const fielded = board.tickets.filter(ticket => !ticket.foreign || ticket.foreignFenced);
|
|
202
|
+
for (const [status, field, value] of LIFECYCLE_FIELDS) {
|
|
203
|
+
const holding = fielded.filter(ticket => ticket.status === status);
|
|
204
|
+
const missing = holding.filter(ticket => value(ticket) === undefined).length;
|
|
205
|
+
if (missing > 0) {
|
|
206
|
+
warnings.push(`${String(missing)}/${String(holding.length)} ${status} Tickets carry no ${field}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Tracked separately from Foreign, because normalizing a Foreign file gives it
|
|
210
|
+
// frontmatter without giving it an id. It would otherwise leave the Foreign
|
|
184
211
|
// count and take its need for migration silently with it, while still being
|
|
185
212
|
// unaddressable by anything but its handle.
|
|
186
213
|
const unidentified = board.tickets.filter(ticket => ticket.id === undefined);
|