@deskwork/core 0.14.1 → 0.16.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/dist/entry/annotations.d.ts +38 -3
- package/dist/entry/annotations.d.ts.map +1 -1
- package/dist/entry/annotations.js +139 -3
- package/dist/entry/annotations.js.map +1 -1
- package/dist/entry/create.d.ts +56 -0
- package/dist/entry/create.d.ts.map +1 -0
- package/dist/entry/create.js +42 -0
- package/dist/entry/create.js.map +1 -0
- package/dist/ingest-derive.d.ts +1 -1
- package/dist/ingest-derive.d.ts.map +1 -1
- package/dist/ingest-derive.js +10 -7
- package/dist/ingest-derive.js.map +1 -1
- package/dist/ingest-id.d.ts +33 -0
- package/dist/ingest-id.d.ts.map +1 -0
- package/dist/ingest-id.js +60 -0
- package/dist/ingest-id.js.map +1 -0
- package/dist/ingest.d.ts.map +1 -1
- package/dist/ingest.js +23 -0
- package/dist/ingest.js.map +1 -1
- package/dist/iterate/iterate.d.ts.map +1 -1
- package/dist/iterate/iterate.js +10 -12
- package/dist/iterate/iterate.js.map +1 -1
- package/dist/rehype-rewrite-scrapbook-images.mjs +78 -0
- package/dist/review/render.d.ts +11 -1
- package/dist/review/render.d.ts.map +1 -1
- package/dist/review/render.js +27 -5
- package/dist/review/render.js.map +1 -1
- package/dist/review/types.d.ts +37 -1
- package/dist/review/types.d.ts.map +1 -1
- package/dist/review/types.js.map +1 -1
- package/dist/schema/draft-annotation.d.ts +89 -26
- package/dist/schema/draft-annotation.d.ts.map +1 -1
- package/dist/schema/draft-annotation.js +16 -0
- package/dist/schema/draft-annotation.js.map +1 -1
- package/dist/schema/journal-events.d.ts +215 -114
- package/dist/schema/journal-events.d.ts.map +1 -1
- package/dist/scrapbook/crud-at-dir.d.ts +47 -0
- package/dist/scrapbook/crud-at-dir.d.ts.map +1 -0
- package/dist/scrapbook/crud-at-dir.js +114 -0
- package/dist/scrapbook/crud-at-dir.js.map +1 -0
- package/dist/scrapbook/crud-slug.d.ts +33 -0
- package/dist/scrapbook/crud-slug.d.ts.map +1 -0
- package/dist/scrapbook/crud-slug.js +99 -0
- package/dist/scrapbook/crud-slug.js.map +1 -0
- package/dist/scrapbook/format.d.ts +10 -0
- package/dist/scrapbook/format.d.ts.map +1 -0
- package/dist/scrapbook/format.js +41 -0
- package/dist/scrapbook/format.js.map +1 -0
- package/dist/scrapbook/listing.d.ts +94 -0
- package/dist/scrapbook/listing.d.ts.map +1 -0
- package/dist/scrapbook/listing.js +167 -0
- package/dist/scrapbook/listing.js.map +1 -0
- package/dist/scrapbook/paths.d.ts +115 -0
- package/dist/scrapbook/paths.d.ts.map +1 -0
- package/dist/scrapbook/paths.js +149 -0
- package/dist/scrapbook/paths.js.map +1 -0
- package/dist/scrapbook/read.d.ts +54 -0
- package/dist/scrapbook/read.d.ts.map +1 -0
- package/dist/scrapbook/read.js +62 -0
- package/dist/scrapbook/read.js.map +1 -0
- package/dist/scrapbook/seed.d.ts +19 -0
- package/dist/scrapbook/seed.d.ts.map +1 -0
- package/dist/scrapbook/seed.js +46 -0
- package/dist/scrapbook/seed.js.map +1 -0
- package/dist/scrapbook/types.d.ts +44 -0
- package/dist/scrapbook/types.d.ts.map +1 -0
- package/dist/scrapbook/types.js +11 -0
- package/dist/scrapbook/types.js.map +1 -0
- package/dist/scrapbook/validation.d.ts +28 -0
- package/dist/scrapbook/validation.d.ts.map +1 -0
- package/dist/scrapbook/validation.js +98 -0
- package/dist/scrapbook/validation.js.map +1 -0
- package/dist/scrapbook.d.ts +43 -217
- package/dist/scrapbook.d.ts.map +1 -1
- package/dist/scrapbook.js +42 -488
- package/dist/scrapbook.js.map +1 -1
- package/package.json +10 -1
|
@@ -16,19 +16,54 @@
|
|
|
16
16
|
* entry-keyed here) intentionally do not interoperate — workflow
|
|
17
17
|
* annotations are NOT visible from the entry-keyed listing, and vice
|
|
18
18
|
* versa. See the `routes/api.ts` header for the split contract.
|
|
19
|
+
*
|
|
20
|
+
* Phase 35 (issue #199) — append-only edit + delete journal:
|
|
21
|
+
* - `edit-comment` annotations replace a prior comment's text /
|
|
22
|
+
* range / category / anchor in the FOLDED view.
|
|
23
|
+
* - `delete-comment` annotations tombstone a prior comment in the
|
|
24
|
+
* FOLDED view.
|
|
25
|
+
*
|
|
26
|
+
* `listEntryAnnotations` returns the FOLDED view by default. The raw
|
|
27
|
+
* unfolded stream (for audit views) is accessible via
|
|
28
|
+
* `listEntryAnnotationsRaw`.
|
|
19
29
|
*/
|
|
20
30
|
import type { DraftAnnotation } from '../review/types.ts';
|
|
21
31
|
/**
|
|
22
32
|
* Append an entry-keyed annotation. The annotation should already have
|
|
23
33
|
* its `id` and `createdAt` minted (use `mintEntryAnnotation`).
|
|
34
|
+
*
|
|
35
|
+
* Phase 35: validates that `edit-comment` and `delete-comment`
|
|
36
|
+
* annotations reference an existing `comment` annotation in the same
|
|
37
|
+
* entry's stream. Throws when the referent is missing — preferable to
|
|
38
|
+
* silently persisting an orphan that the folder will skip over.
|
|
24
39
|
*/
|
|
25
40
|
export declare function addEntryAnnotation(projectRoot: string, entryId: string, annotation: DraftAnnotation): Promise<void>;
|
|
26
41
|
/**
|
|
27
|
-
* List every entry-keyed annotation
|
|
28
|
-
*
|
|
29
|
-
*
|
|
42
|
+
* List the FOLDED active-comment view of every entry-keyed annotation
|
|
43
|
+
* for `entryId`, in chronological order:
|
|
44
|
+
*
|
|
45
|
+
* - For each `comment`, apply every later `edit-comment` whose
|
|
46
|
+
* `commentId` matches (in journal order). Missing fields preserve
|
|
47
|
+
* the prior value.
|
|
48
|
+
* - Drop any `comment` for which a `delete-comment` annotation
|
|
49
|
+
* exists.
|
|
50
|
+
*
|
|
51
|
+
* Non-comment annotations (resolve / address / approve / reject / edit
|
|
52
|
+
* / orphaned edit-comment / delete-comment) pass through unchanged so
|
|
53
|
+
* the renderer can still see them. (Edit-comment / delete-comment that
|
|
54
|
+
* fail validation at write time can never reach this code — only ones
|
|
55
|
+
* whose target later disappeared via journal damage would surface.)
|
|
56
|
+
*
|
|
57
|
+
* Returns an empty array when there are none — never throws, never
|
|
58
|
+
* returns null.
|
|
30
59
|
*/
|
|
31
60
|
export declare function listEntryAnnotations(projectRoot: string, entryId: string): Promise<DraftAnnotation[]>;
|
|
61
|
+
/**
|
|
62
|
+
* List the RAW (unfolded) entry-keyed annotation stream — every
|
|
63
|
+
* `comment` / `edit-comment` / `delete-comment` / etc. as recorded on
|
|
64
|
+
* disk, in chronological order. Useful for audit views.
|
|
65
|
+
*/
|
|
66
|
+
export declare function listEntryAnnotationsRaw(projectRoot: string, entryId: string): Promise<DraftAnnotation[]>;
|
|
32
67
|
/**
|
|
33
68
|
* Mint a server-assigned `id` and `createdAt` onto a draft annotation.
|
|
34
69
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/entry/annotations.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/entry/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAMH,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,oBAAoB,CAAC;AA8F5B;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAG5B;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAS5B;AA0ED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,WAAW,CAAC,EACnD,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMnD"}
|
|
@@ -16,6 +16,16 @@
|
|
|
16
16
|
* entry-keyed here) intentionally do not interoperate — workflow
|
|
17
17
|
* annotations are NOT visible from the entry-keyed listing, and vice
|
|
18
18
|
* versa. See the `routes/api.ts` header for the split contract.
|
|
19
|
+
*
|
|
20
|
+
* Phase 35 (issue #199) — append-only edit + delete journal:
|
|
21
|
+
* - `edit-comment` annotations replace a prior comment's text /
|
|
22
|
+
* range / category / anchor in the FOLDED view.
|
|
23
|
+
* - `delete-comment` annotations tombstone a prior comment in the
|
|
24
|
+
* FOLDED view.
|
|
25
|
+
*
|
|
26
|
+
* `listEntryAnnotations` returns the FOLDED view by default. The raw
|
|
27
|
+
* unfolded stream (for audit views) is accessible via
|
|
28
|
+
* `listEntryAnnotationsRaw`.
|
|
19
29
|
*/
|
|
20
30
|
import { randomUUID } from 'node:crypto';
|
|
21
31
|
import { appendJournalEvent } from "../journal/append.js";
|
|
@@ -76,13 +86,43 @@ function toDraftAnnotation(stored) {
|
|
|
76
86
|
disposition: stored.disposition,
|
|
77
87
|
...(stored.reason !== undefined ? { reason: stored.reason } : {}),
|
|
78
88
|
};
|
|
89
|
+
case 'edit-comment':
|
|
90
|
+
return {
|
|
91
|
+
...base,
|
|
92
|
+
type: 'edit-comment',
|
|
93
|
+
commentId: stored.commentId,
|
|
94
|
+
...(stored.text !== undefined ? { text: stored.text } : {}),
|
|
95
|
+
...(stored.range !== undefined
|
|
96
|
+
? { range: { start: stored.range.start, end: stored.range.end } }
|
|
97
|
+
: {}),
|
|
98
|
+
...(stored.category !== undefined ? { category: stored.category } : {}),
|
|
99
|
+
...(stored.anchor !== undefined ? { anchor: stored.anchor } : {}),
|
|
100
|
+
};
|
|
101
|
+
case 'delete-comment':
|
|
102
|
+
return {
|
|
103
|
+
...base,
|
|
104
|
+
type: 'delete-comment',
|
|
105
|
+
commentId: stored.commentId,
|
|
106
|
+
};
|
|
79
107
|
}
|
|
80
108
|
}
|
|
81
109
|
/**
|
|
82
110
|
* Append an entry-keyed annotation. The annotation should already have
|
|
83
111
|
* its `id` and `createdAt` minted (use `mintEntryAnnotation`).
|
|
112
|
+
*
|
|
113
|
+
* Phase 35: validates that `edit-comment` and `delete-comment`
|
|
114
|
+
* annotations reference an existing `comment` annotation in the same
|
|
115
|
+
* entry's stream. Throws when the referent is missing — preferable to
|
|
116
|
+
* silently persisting an orphan that the folder will skip over.
|
|
84
117
|
*/
|
|
85
118
|
export async function addEntryAnnotation(projectRoot, entryId, annotation) {
|
|
119
|
+
if (annotation.type === 'edit-comment' || annotation.type === 'delete-comment') {
|
|
120
|
+
const raw = await listEntryAnnotationsRaw(projectRoot, entryId);
|
|
121
|
+
const referent = raw.find((a) => a.type === 'comment' && a.id === annotation.commentId);
|
|
122
|
+
if (!referent) {
|
|
123
|
+
throw new Error(`addEntryAnnotation refused: ${annotation.type} references unknown commentId ${annotation.commentId}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
86
126
|
await appendJournalEvent(projectRoot, {
|
|
87
127
|
kind: 'entry-annotation',
|
|
88
128
|
at: annotation.createdAt,
|
|
@@ -91,11 +131,34 @@ export async function addEntryAnnotation(projectRoot, entryId, annotation) {
|
|
|
91
131
|
});
|
|
92
132
|
}
|
|
93
133
|
/**
|
|
94
|
-
* List every entry-keyed annotation
|
|
95
|
-
*
|
|
96
|
-
*
|
|
134
|
+
* List the FOLDED active-comment view of every entry-keyed annotation
|
|
135
|
+
* for `entryId`, in chronological order:
|
|
136
|
+
*
|
|
137
|
+
* - For each `comment`, apply every later `edit-comment` whose
|
|
138
|
+
* `commentId` matches (in journal order). Missing fields preserve
|
|
139
|
+
* the prior value.
|
|
140
|
+
* - Drop any `comment` for which a `delete-comment` annotation
|
|
141
|
+
* exists.
|
|
142
|
+
*
|
|
143
|
+
* Non-comment annotations (resolve / address / approve / reject / edit
|
|
144
|
+
* / orphaned edit-comment / delete-comment) pass through unchanged so
|
|
145
|
+
* the renderer can still see them. (Edit-comment / delete-comment that
|
|
146
|
+
* fail validation at write time can never reach this code — only ones
|
|
147
|
+
* whose target later disappeared via journal damage would surface.)
|
|
148
|
+
*
|
|
149
|
+
* Returns an empty array when there are none — never throws, never
|
|
150
|
+
* returns null.
|
|
97
151
|
*/
|
|
98
152
|
export async function listEntryAnnotations(projectRoot, entryId) {
|
|
153
|
+
const raw = await listEntryAnnotationsRaw(projectRoot, entryId);
|
|
154
|
+
return foldAnnotations(raw);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* List the RAW (unfolded) entry-keyed annotation stream — every
|
|
158
|
+
* `comment` / `edit-comment` / `delete-comment` / etc. as recorded on
|
|
159
|
+
* disk, in chronological order. Useful for audit views.
|
|
160
|
+
*/
|
|
161
|
+
export async function listEntryAnnotationsRaw(projectRoot, entryId) {
|
|
99
162
|
const events = await readJournalEvents(projectRoot, { entryId });
|
|
100
163
|
const out = [];
|
|
101
164
|
for (const event of events) {
|
|
@@ -105,6 +168,79 @@ export async function listEntryAnnotations(projectRoot, entryId) {
|
|
|
105
168
|
}
|
|
106
169
|
return out;
|
|
107
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Pure fold over the raw annotation stream. Single pass to gather
|
|
173
|
+
* edit + delete journals indexed by `commentId`, then one walk to emit
|
|
174
|
+
* either the (possibly-edited) comment or skip it (if deleted) — and
|
|
175
|
+
* pass non-comment annotations through unchanged.
|
|
176
|
+
*
|
|
177
|
+
* Chronological order is taken from the input array's order (callers
|
|
178
|
+
* must pass the journal-sorted stream from `readJournalEvents`).
|
|
179
|
+
*/
|
|
180
|
+
function foldAnnotations(raw) {
|
|
181
|
+
const editsByCommentId = new Map();
|
|
182
|
+
const deletedCommentIds = new Set();
|
|
183
|
+
for (const a of raw) {
|
|
184
|
+
if (a.type === 'edit-comment') {
|
|
185
|
+
const arr = editsByCommentId.get(a.commentId) ?? [];
|
|
186
|
+
arr.push(a);
|
|
187
|
+
editsByCommentId.set(a.commentId, arr);
|
|
188
|
+
}
|
|
189
|
+
else if (a.type === 'delete-comment') {
|
|
190
|
+
deletedCommentIds.add(a.commentId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const out = [];
|
|
194
|
+
for (const a of raw) {
|
|
195
|
+
if (a.type === 'edit-comment' || a.type === 'delete-comment') {
|
|
196
|
+
// Fold-only events; not surfaced in the active view.
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (a.type === 'comment') {
|
|
200
|
+
if (deletedCommentIds.has(a.id))
|
|
201
|
+
continue;
|
|
202
|
+
const edits = editsByCommentId.get(a.id);
|
|
203
|
+
if (!edits || edits.length === 0) {
|
|
204
|
+
out.push(a);
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
out.push(applyEdits(a, edits));
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
out.push(a);
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
function applyEdits(comment, edits) {
|
|
215
|
+
let text = comment.text;
|
|
216
|
+
let range = comment.range;
|
|
217
|
+
let category = comment.category;
|
|
218
|
+
let anchor = comment.anchor;
|
|
219
|
+
for (const e of edits) {
|
|
220
|
+
if (e.type !== 'edit-comment')
|
|
221
|
+
continue;
|
|
222
|
+
if (e.text !== undefined)
|
|
223
|
+
text = e.text;
|
|
224
|
+
if (e.range !== undefined)
|
|
225
|
+
range = { start: e.range.start, end: e.range.end };
|
|
226
|
+
if (e.category !== undefined)
|
|
227
|
+
category = e.category;
|
|
228
|
+
if (e.anchor !== undefined)
|
|
229
|
+
anchor = e.anchor;
|
|
230
|
+
}
|
|
231
|
+
const out = {
|
|
232
|
+
id: comment.id,
|
|
233
|
+
workflowId: comment.workflowId,
|
|
234
|
+
createdAt: comment.createdAt,
|
|
235
|
+
type: 'comment',
|
|
236
|
+
version: comment.version,
|
|
237
|
+
range,
|
|
238
|
+
text,
|
|
239
|
+
...(category !== undefined ? { category } : {}),
|
|
240
|
+
...(anchor !== undefined ? { anchor } : {}),
|
|
241
|
+
};
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
108
244
|
/**
|
|
109
245
|
* Mint a server-assigned `id` and `createdAt` onto a draft annotation.
|
|
110
246
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/entry/annotations.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/entry/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAsBvD,SAAS,iBAAiB,CAAC,MAAwB;IACjD,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IACF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAoB;gBAC3B,GAAG,IAAI;gBACP,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC3D,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;YACF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,MAAM;YACT,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,MAAM;gBACZ,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS;oBAC5B,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE;oBACjE,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC;QACJ,KAAK,gBAAgB;YACnB,OAAO;gBACL,GAAG,IAAI;gBACP,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,OAAe,EACf,UAA2B;IAE3B,IAAI,UAAU,CAAC,IAAI,KAAK,cAAc,IAAI,UAAU,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC/E,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CACvB,CAAC,CAAC,EAA0B,EAAE,CAC5B,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,CACxD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,+BAA+B,UAAU,CAAC,IAAI,iCAAiC,UAAU,CAAC,SAAS,EAAE,CACtG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,kBAAkB,CAAC,WAAW,EAAE;QACpC,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,UAAU,CAAC,SAAS;QACxB,OAAO;QACP,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,OAAe;IAEf,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,OAAe;IAEf,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,GAAsB;IAC7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACvC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC7D,qDAAqD;YACrD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,SAAS;YAC1C,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CACjB,OAA0B,EAC1B,KAAwB;IAExB,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACxB,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QACxC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACxC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9E,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;YAAE,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,CAAC;IACD,MAAM,GAAG,GAAsB;QAC7B,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK;QACL,IAAI;QACJ,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAEjC,OAAU;IACV,OAAO;QACL,GAAG,OAAO;QACV,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Entry, ReviewState, Stage } from '../schema/entry.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Inputs for a freshly-minted entry sidecar.
|
|
4
|
+
*
|
|
5
|
+
* Both `deskwork add` and `deskwork ingest --apply` produce new entries
|
|
6
|
+
* that need a sidecar written under the Phase 30 contract. They differ
|
|
7
|
+
* in the optional fields (ingest knows an `artifactPath`; published
|
|
8
|
+
* candidates carry a `datePublishedDate`; legacy `Review` mapping
|
|
9
|
+
* produces a `reviewState`), but the required-field shape and the
|
|
10
|
+
* defaults (`keywords=[]`, `iterationByStage={}`, `createdAt=updatedAt=now`)
|
|
11
|
+
* are identical. This helper is the single point that knows the new-entry
|
|
12
|
+
* shape so both call sites stay aligned.
|
|
13
|
+
*/
|
|
14
|
+
export interface CreateEntryParams {
|
|
15
|
+
readonly uuid: string;
|
|
16
|
+
readonly slug: string;
|
|
17
|
+
readonly title: string;
|
|
18
|
+
readonly description?: string;
|
|
19
|
+
readonly currentStage: Stage;
|
|
20
|
+
readonly source: string;
|
|
21
|
+
readonly reviewState?: ReviewState;
|
|
22
|
+
readonly artifactPath?: string;
|
|
23
|
+
/**
|
|
24
|
+
* YYYY-MM-DD; the helper converts to a full ISO datetime so the
|
|
25
|
+
* `Entry.datePublished` schema (`z.string().datetime()`) accepts it.
|
|
26
|
+
* Only honored when `currentStage === 'Published'`.
|
|
27
|
+
*/
|
|
28
|
+
readonly datePublishedDate?: string;
|
|
29
|
+
readonly keywords?: readonly string[];
|
|
30
|
+
/**
|
|
31
|
+
* Test seam — defaults to `new Date()` when omitted. Lets unit tests
|
|
32
|
+
* pin `createdAt`/`updatedAt`/`datePublished`-derived ISO without
|
|
33
|
+
* stubbing globals.
|
|
34
|
+
*/
|
|
35
|
+
readonly now?: Date;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build a fresh `Entry` from the supplied params, write it to
|
|
39
|
+
* `.deskwork/entries/<uuid>.json`, and return the constructed Entry
|
|
40
|
+
* (callers don't need the return value but it's cheap to provide and
|
|
41
|
+
* useful in tests).
|
|
42
|
+
*
|
|
43
|
+
* Defaults:
|
|
44
|
+
* - `keywords` → `[]`
|
|
45
|
+
* - `iterationByStage` → `{}`
|
|
46
|
+
* - `createdAt` / `updatedAt` → `now.toISOString()`
|
|
47
|
+
* - `datePublished` (only if `currentStage === 'Published'` and
|
|
48
|
+
* `datePublishedDate` is supplied) → `${datePublishedDate}T00:00:00.000Z`
|
|
49
|
+
*
|
|
50
|
+
* Phase 30 contract: every UUID in `calendar.md` must have a sidecar.
|
|
51
|
+
* Both `deskwork add` and `deskwork ingest --apply` MUST pair their
|
|
52
|
+
* calendar.md write with a `createFreshEntrySidecar` call to satisfy
|
|
53
|
+
* doctor's `calendar-sidecar` validator.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createFreshEntrySidecar(projectRoot: string, params: CreateEntryParams): Promise<Entry>;
|
|
56
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/entry/create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,KAAK,CAAC,CAqBhB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { writeSidecar } from "../sidecar/write.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build a fresh `Entry` from the supplied params, write it to
|
|
4
|
+
* `.deskwork/entries/<uuid>.json`, and return the constructed Entry
|
|
5
|
+
* (callers don't need the return value but it's cheap to provide and
|
|
6
|
+
* useful in tests).
|
|
7
|
+
*
|
|
8
|
+
* Defaults:
|
|
9
|
+
* - `keywords` → `[]`
|
|
10
|
+
* - `iterationByStage` → `{}`
|
|
11
|
+
* - `createdAt` / `updatedAt` → `now.toISOString()`
|
|
12
|
+
* - `datePublished` (only if `currentStage === 'Published'` and
|
|
13
|
+
* `datePublishedDate` is supplied) → `${datePublishedDate}T00:00:00.000Z`
|
|
14
|
+
*
|
|
15
|
+
* Phase 30 contract: every UUID in `calendar.md` must have a sidecar.
|
|
16
|
+
* Both `deskwork add` and `deskwork ingest --apply` MUST pair their
|
|
17
|
+
* calendar.md write with a `createFreshEntrySidecar` call to satisfy
|
|
18
|
+
* doctor's `calendar-sidecar` validator.
|
|
19
|
+
*/
|
|
20
|
+
export async function createFreshEntrySidecar(projectRoot, params) {
|
|
21
|
+
const at = (params.now ?? new Date()).toISOString();
|
|
22
|
+
const entry = {
|
|
23
|
+
uuid: params.uuid,
|
|
24
|
+
slug: params.slug,
|
|
25
|
+
title: params.title,
|
|
26
|
+
...(params.description ? { description: params.description } : {}),
|
|
27
|
+
keywords: params.keywords ? [...params.keywords] : [],
|
|
28
|
+
source: params.source,
|
|
29
|
+
currentStage: params.currentStage,
|
|
30
|
+
iterationByStage: {},
|
|
31
|
+
...(params.reviewState !== undefined ? { reviewState: params.reviewState } : {}),
|
|
32
|
+
...(params.artifactPath !== undefined ? { artifactPath: params.artifactPath } : {}),
|
|
33
|
+
...(params.currentStage === 'Published' && params.datePublishedDate
|
|
34
|
+
? { datePublished: `${params.datePublishedDate}T00:00:00.000Z` }
|
|
35
|
+
: {}),
|
|
36
|
+
createdAt: at,
|
|
37
|
+
updatedAt: at,
|
|
38
|
+
};
|
|
39
|
+
await writeSidecar(projectRoot, entry);
|
|
40
|
+
return entry;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/entry/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAuCnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,MAAyB;IAEzB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,KAAK,GAAU;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QACrD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,gBAAgB,EAAE,EAAE;QACpB,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,WAAW,IAAI,MAAM,CAAC,iBAAiB;YACjE,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,iBAAiB,gBAAgB,EAAE;YAChE,CAAC,CAAC,EAAE,CAAC;QACP,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;KACd,CAAC;IACF,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/ingest-derive.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ import type { FrontmatterData } from './frontmatter.ts';
|
|
|
14
14
|
* Where a derived value came from. `'frontmatter'` is reserved for
|
|
15
15
|
* values that actually appear in the file's frontmatter — when a field
|
|
16
16
|
* is absent and we substitute a hardcoded fallback (e.g. defaulting
|
|
17
|
-
* state to `
|
|
17
|
+
* state to `Drafting` when the frontmatter has no `state:` key), the
|
|
18
18
|
* source is `'default'`. The dry-run plan surfaces this so the
|
|
19
19
|
* operator can tell at a glance whether a row reflects the file or
|
|
20
20
|
* was filled in by the ingest layer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-derive.d.ts","sourceRoot":"","sources":["../src/ingest-derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,MAAM,GACN,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAKD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAe/C,CAAC;AAMF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAYjE;AA0HD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,GAAG,eAAe,CAAC;IAC3C,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"ingest-derive.d.ts","sourceRoot":"","sources":["../src/ingest-derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB,aAAa,GACb,MAAM,GACN,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAKD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAe/C,CAAC;AAMF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAYjE;AA0HD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,eAAe,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,GAAG,eAAe,CAAC;IAC3C,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,CAkCpE;AAiBD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CA8BjE;AAMD,wBAAgB,WAAW,CACzB,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,MAAM,CAWR;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,MAAM,GAChB,MAAM,CAER"}
|
package/dist/ingest-derive.js
CHANGED
|
@@ -175,10 +175,12 @@ export function deriveState(input) {
|
|
|
175
175
|
if (input.stateFrom === 'frontmatter') {
|
|
176
176
|
const raw = readStringField(input.frontmatter, input.stateField);
|
|
177
177
|
if (raw === undefined) {
|
|
178
|
-
// No state field — default to
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
|
|
178
|
+
// No state field — default to Drafting. `/deskwork:ingest` is for
|
|
179
|
+
// existing content with body text; `/deskwork:add` is the path
|
|
180
|
+
// for new ideas. Default to Drafting per the semantic distinction
|
|
181
|
+
// (#206). The value did NOT come from the file; mark the source
|
|
182
|
+
// as `'default'` so the audit trail doesn't lie (#23).
|
|
183
|
+
return { value: 'Drafting', source: 'default' };
|
|
182
184
|
}
|
|
183
185
|
const normalized = normalizeStateString(raw);
|
|
184
186
|
if (normalized === null) {
|
|
@@ -189,9 +191,10 @@ export function deriveState(input) {
|
|
|
189
191
|
// stateFrom === 'datePublished'
|
|
190
192
|
const dateRaw = readDateField(input.frontmatter, input.dateField);
|
|
191
193
|
if (dateRaw === undefined) {
|
|
192
|
-
// No datePublished — same
|
|
193
|
-
//
|
|
194
|
-
|
|
194
|
+
// No datePublished — same Drafting fallback as above per the
|
|
195
|
+
// add/ingest semantic distinction (#206); provenance still honest
|
|
196
|
+
// (#23).
|
|
197
|
+
return { value: 'Drafting', source: 'default' };
|
|
195
198
|
}
|
|
196
199
|
const today = (input.now ?? new Date()).toISOString().slice(0, 10);
|
|
197
200
|
if (dateRaw <= today) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest-derive.js","sourceRoot":"","sources":["../src/ingest-derive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAoCxD,MAAM,SAAS,GAAG,gCAAgC,CAAC;AACnD,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B;IAClD,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,OAAO;IACnB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,QAAQ;IACnB,WAAW,EAAE,QAAQ;IACrB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,WAAW;CACrB,CAAC;AAeF;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAClD,CAAC;QACD,yDAAyD;IAC3D,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,IAAY;IAClD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,YAAsB,CAAC;IAC3B,IAAI,WAAqB,CAAC;IAE1B,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACpD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,2DAA2D;YAC3D,6DAA6D;YAC7D,4DAA4D;YAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,GAAG,QAAQ,qEAAqE;iBACzF,CAAC;YACJ,CAAC;YACD,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1B,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,YAAY,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3C,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,2DAA2D;IAC3D,6DAA6D;IAC7D,kEAAkE;IAClE,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,iEAAiE;IACjE,gEAAgE;IAChE,mEAAmE;IACnE,kEAAkE;IAClE,6DAA6D;IAC7D,IAAI,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,uDAAuD;YACvD,2DAA2D;YAC3D,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,SAAS,2BAA2B,CAAC,GAAW;IAC9C,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,KAAK,KAAK,QAAQ,GAAG,EAAE,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAeD,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,
|
|
1
|
+
{"version":3,"file":"ingest-derive.js","sourceRoot":"","sources":["../src/ingest-derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ingest-id.ts — UUID-from-frontmatter helper for the ingest pipeline.
|
|
3
|
+
*
|
|
4
|
+
* The `/dw-lifecycle:setup` skill stamps `deskwork.id` into a freshly
|
|
5
|
+
* scaffolded PRD's frontmatter so that the subsequent `deskwork ingest`
|
|
6
|
+
* call can bind the calendar entry, sidecar, and journal record to the
|
|
7
|
+
* same UUID the bootstrap chose. Issue #197: pre-fix, ingest ignored
|
|
8
|
+
* the existing UUID and minted a fresh one with `randomUUID()`, then
|
|
9
|
+
* silently rewrote the source file's frontmatter — breaking the
|
|
10
|
+
* setup → ingest handoff documented in `.claude/CLAUDE.md`.
|
|
11
|
+
*
|
|
12
|
+
* This helper centralizes the read-and-validate step. Two regression
|
|
13
|
+
* shapes live elsewhere (`content-index.ts` for index population,
|
|
14
|
+
* `doctor/rules/missing-frontmatter-id.ts` for candidate filtering);
|
|
15
|
+
* keep this one focused on the "is the UUID present + valid" question
|
|
16
|
+
* the ingest layer needs.
|
|
17
|
+
*
|
|
18
|
+
* Sibling-relative imports per the project convention — `@/` doesn't
|
|
19
|
+
* resolve under tsx at runtime in this package's `src/`, only in tests.
|
|
20
|
+
*/
|
|
21
|
+
import type { FrontmatterData } from './frontmatter.ts';
|
|
22
|
+
/**
|
|
23
|
+
* Read `deskwork.id` from a markdown file's parsed frontmatter and
|
|
24
|
+
* return it iff it's a valid UUID. Returns `null` when the field is
|
|
25
|
+
* absent, malformed, or not a UUID — the caller mints a fresh UUID in
|
|
26
|
+
* that case.
|
|
27
|
+
*
|
|
28
|
+
* The frontmatter shape is `Record<string, unknown>`, so this helper
|
|
29
|
+
* narrows `frontmatter.deskwork` via a type predicate rather than a
|
|
30
|
+
* synthetic `as` cast.
|
|
31
|
+
*/
|
|
32
|
+
export declare function readExistingDeskworkId(frontmatter: FrontmatterData): string | null;
|
|
33
|
+
//# sourceMappingURL=ingest-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-id.d.ts","sourceRoot":"","sources":["../src/ingest-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAoBxD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,GAC3B,MAAM,GAAG,IAAI,CASf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ingest-id.ts — UUID-from-frontmatter helper for the ingest pipeline.
|
|
3
|
+
*
|
|
4
|
+
* The `/dw-lifecycle:setup` skill stamps `deskwork.id` into a freshly
|
|
5
|
+
* scaffolded PRD's frontmatter so that the subsequent `deskwork ingest`
|
|
6
|
+
* call can bind the calendar entry, sidecar, and journal record to the
|
|
7
|
+
* same UUID the bootstrap chose. Issue #197: pre-fix, ingest ignored
|
|
8
|
+
* the existing UUID and minted a fresh one with `randomUUID()`, then
|
|
9
|
+
* silently rewrote the source file's frontmatter — breaking the
|
|
10
|
+
* setup → ingest handoff documented in `.claude/CLAUDE.md`.
|
|
11
|
+
*
|
|
12
|
+
* This helper centralizes the read-and-validate step. Two regression
|
|
13
|
+
* shapes live elsewhere (`content-index.ts` for index population,
|
|
14
|
+
* `doctor/rules/missing-frontmatter-id.ts` for candidate filtering);
|
|
15
|
+
* keep this one focused on the "is the UUID present + valid" question
|
|
16
|
+
* the ingest layer needs.
|
|
17
|
+
*
|
|
18
|
+
* Sibling-relative imports per the project convention — `@/` doesn't
|
|
19
|
+
* resolve under tsx at runtime in this package's `src/`, only in tests.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* UUID v4 shape check — 36 chars, hex with hyphens at positions
|
|
23
|
+
* 8/13/18/23. Matches the permissive shape used by `content-index.ts`
|
|
24
|
+
* so values that round-tripped through other tooling continue to be
|
|
25
|
+
* accepted (we don't gatekeep on the variant nibbles).
|
|
26
|
+
*/
|
|
27
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
28
|
+
/**
|
|
29
|
+
* Type predicate: true when `value` is a non-null, non-array object.
|
|
30
|
+
* Used to type-narrow the `deskwork` block of frontmatter from
|
|
31
|
+
* `unknown` to `Record<string, unknown>` without a synthetic cast.
|
|
32
|
+
*/
|
|
33
|
+
function isPlainRecord(value) {
|
|
34
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read `deskwork.id` from a markdown file's parsed frontmatter and
|
|
38
|
+
* return it iff it's a valid UUID. Returns `null` when the field is
|
|
39
|
+
* absent, malformed, or not a UUID — the caller mints a fresh UUID in
|
|
40
|
+
* that case.
|
|
41
|
+
*
|
|
42
|
+
* The frontmatter shape is `Record<string, unknown>`, so this helper
|
|
43
|
+
* narrows `frontmatter.deskwork` via a type predicate rather than a
|
|
44
|
+
* synthetic `as` cast.
|
|
45
|
+
*/
|
|
46
|
+
export function readExistingDeskworkId(frontmatter) {
|
|
47
|
+
const block = frontmatter.deskwork;
|
|
48
|
+
if (!isPlainRecord(block))
|
|
49
|
+
return null;
|
|
50
|
+
const id = block.id;
|
|
51
|
+
if (typeof id !== 'string')
|
|
52
|
+
return null;
|
|
53
|
+
const trimmed = id.trim();
|
|
54
|
+
if (trimmed === '')
|
|
55
|
+
return null;
|
|
56
|
+
if (!UUID_RE.test(trimmed))
|
|
57
|
+
return null;
|
|
58
|
+
return trimmed;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ingest-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-id.js","sourceRoot":"","sources":["../src/ingest-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH;;;;;GAKG;AACH,MAAM,OAAO,GACX,iEAAiE,CAAC;AAEpE;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAA4B;IAE5B,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC;IACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/ingest.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"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"}
|
package/dist/ingest.js
CHANGED
|
@@ -34,6 +34,7 @@ import { readFileSync } from 'node:fs';
|
|
|
34
34
|
import { parseFrontmatter } from "./frontmatter.js";
|
|
35
35
|
import { collectMarkdownFiles } from "./ingest-paths.js";
|
|
36
36
|
import { deriveDate, deriveDescription, deriveSlug, deriveState, deriveTitle, } from "./ingest-derive.js";
|
|
37
|
+
import { readExistingDeskworkId } from "./ingest-id.js";
|
|
37
38
|
// ---------------------------------------------------------------------------
|
|
38
39
|
// Constants
|
|
39
40
|
// ---------------------------------------------------------------------------
|
|
@@ -162,6 +163,28 @@ export function discoverIngestCandidates(paths, options) {
|
|
|
162
163
|
});
|
|
163
164
|
continue;
|
|
164
165
|
}
|
|
166
|
+
// Issue #197: if the source file's frontmatter already declares a
|
|
167
|
+
// valid `deskwork.id`, prefer that UUID over a freshly-minted one
|
|
168
|
+
// (the apply layer reads it back). However, if that UUID already
|
|
169
|
+
// belongs to a DIFFERENT calendar entry (different slug), do NOT
|
|
170
|
+
// silently re-bind — surface as a skip so the operator can resolve
|
|
171
|
+
// the collision intentionally. The duplicate-slug check above
|
|
172
|
+
// covers the same-slug case (it would skip first, so by the time
|
|
173
|
+
// we get here we know the slug is new).
|
|
174
|
+
const existingId = readExistingDeskworkId(parsed.data);
|
|
175
|
+
if (existingId !== null && options.calendar) {
|
|
176
|
+
const owner = options.calendar.entries.find((e) => e.id === existingId);
|
|
177
|
+
if (owner !== undefined && owner.slug !== slug.value) {
|
|
178
|
+
skips.push({
|
|
179
|
+
filePath,
|
|
180
|
+
relativePath: relPath,
|
|
181
|
+
slug: slug.value,
|
|
182
|
+
reason: `frontmatter deskwork.id ${existingId} already belongs to ` +
|
|
183
|
+
`entry with slug "${owner.slug}"`,
|
|
184
|
+
});
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
165
188
|
const state = deriveState({
|
|
166
189
|
frontmatter: parsed.data,
|
|
167
190
|
stateField: fields.state,
|