youmd 0.10.2 → 0.11.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.
Files changed (84) hide show
  1. package/dist/commands/brain.d.ts.map +1 -1
  2. package/dist/commands/brain.js +32 -10
  3. package/dist/commands/brain.js.map +1 -1
  4. package/dist/commands/doctor.d.ts +1 -0
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +16 -1
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/stack.d.ts +2 -0
  9. package/dist/commands/stack.d.ts.map +1 -1
  10. package/dist/commands/stack.js +26 -0
  11. package/dist/commands/stack.js.map +1 -1
  12. package/dist/commands/tasks.d.ts +37 -0
  13. package/dist/commands/tasks.d.ts.map +1 -1
  14. package/dist/commands/tasks.js +152 -18
  15. package/dist/commands/tasks.js.map +1 -1
  16. package/dist/generated/capability-registry.d.ts +148 -68
  17. package/dist/generated/capability-registry.d.ts.map +1 -1
  18. package/dist/generated/capability-registry.js +159 -68
  19. package/dist/generated/capability-registry.js.map +1 -1
  20. package/dist/index.js +20 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/lib/api.d.ts +46 -0
  23. package/dist/lib/api.d.ts.map +1 -1
  24. package/dist/lib/api.js +18 -0
  25. package/dist/lib/api.js.map +1 -1
  26. package/dist/lib/brain/cache.d.ts +2 -2
  27. package/dist/lib/brain/cache.d.ts.map +1 -1
  28. package/dist/lib/brain/cache.js +4 -4
  29. package/dist/lib/brain/cache.js.map +1 -1
  30. package/dist/lib/brain/content.d.ts +51 -0
  31. package/dist/lib/brain/content.d.ts.map +1 -0
  32. package/dist/lib/brain/content.js +327 -0
  33. package/dist/lib/brain/content.js.map +1 -0
  34. package/dist/lib/brain/discovery.d.ts.map +1 -1
  35. package/dist/lib/brain/discovery.js +28 -11
  36. package/dist/lib/brain/discovery.js.map +1 -1
  37. package/dist/lib/brain/index.d.ts +1 -0
  38. package/dist/lib/brain/index.d.ts.map +1 -1
  39. package/dist/lib/brain/index.js +1 -0
  40. package/dist/lib/brain/index.js.map +1 -1
  41. package/dist/lib/brain/proposal.d.ts.map +1 -1
  42. package/dist/lib/brain/proposal.js +46 -5
  43. package/dist/lib/brain/proposal.js.map +1 -1
  44. package/dist/lib/brain/safe-open.d.ts +2 -0
  45. package/dist/lib/brain/safe-open.d.ts.map +1 -0
  46. package/dist/lib/brain/safe-open.js +77 -0
  47. package/dist/lib/brain/safe-open.js.map +1 -0
  48. package/dist/lib/brain/sync.d.ts +39 -0
  49. package/dist/lib/brain/sync.d.ts.map +1 -0
  50. package/dist/lib/brain/sync.js +136 -0
  51. package/dist/lib/brain/sync.js.map +1 -0
  52. package/dist/lib/daemon.js +1 -1
  53. package/dist/lib/daemon.js.map +1 -1
  54. package/dist/lib/orchestrator/loop.d.ts +7 -0
  55. package/dist/lib/orchestrator/loop.d.ts.map +1 -1
  56. package/dist/lib/orchestrator/loop.js +48 -0
  57. package/dist/lib/orchestrator/loop.js.map +1 -1
  58. package/dist/lib/orchestrator/run-journal.d.ts +113 -0
  59. package/dist/lib/orchestrator/run-journal.d.ts.map +1 -0
  60. package/dist/lib/orchestrator/run-journal.js +558 -0
  61. package/dist/lib/orchestrator/run-journal.js.map +1 -0
  62. package/dist/lib/orchestrator/tools.d.ts +2 -0
  63. package/dist/lib/orchestrator/tools.d.ts.map +1 -1
  64. package/dist/lib/orchestrator/tools.js +141 -1
  65. package/dist/lib/orchestrator/tools.js.map +1 -1
  66. package/dist/lib/taskLedgerProposal.d.ts +102 -0
  67. package/dist/lib/taskLedgerProposal.d.ts.map +1 -0
  68. package/dist/lib/taskLedgerProposal.js +400 -0
  69. package/dist/lib/taskLedgerProposal.js.map +1 -0
  70. package/dist/lib/tasksFile.d.ts +9 -0
  71. package/dist/lib/tasksFile.d.ts.map +1 -1
  72. package/dist/lib/tasksFile.js +83 -5
  73. package/dist/lib/tasksFile.js.map +1 -1
  74. package/native/prebuilds/darwin-universal/youmd_safe_open.node +0 -0
  75. package/native/safe-open/youmd_safe_open.c +224 -0
  76. package/package.json +8 -2
  77. package/scripts/build-safe-open.mjs +63 -0
  78. package/scripts/skillstack-sync/com.you.context-sync.plist +1 -1
  79. package/scripts/skillstack-sync/com.you.identity-sync.plist +1 -1
  80. package/scripts/skillstack-sync/com.you.orchestrator-watch.plist +1 -1
  81. package/scripts/skillstack-sync/com.you.realtime-sync.plist +7 -1
  82. package/scripts/skillstack-sync/com.you.skillstack-sync.plist +1 -1
  83. package/scripts/skillstack-sync/context-sync.sh +19 -7
  84. package/scripts/skillstack-sync/install-daemons-linux.sh +6 -0
@@ -0,0 +1,400 @@
1
+ "use strict";
2
+ /**
3
+ * Read-only validation and exact migration proposals for repository task ledgers.
4
+ *
5
+ * This module deliberately has no write or apply function. A proposal is review
6
+ * evidence only; repository mutation remains governed by the existing task_write
7
+ * and Project Brain approval contracts.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.TASK_LEDGER_FIX_PROPOSAL_VERSION = exports.TASK_LEDGER_VALIDATION_VERSION = void 0;
44
+ exports.taskLedgerContextDirs = taskLedgerContextDirs;
45
+ exports.validateTaskLedgers = validateTaskLedgers;
46
+ exports.mechanicalTaskLedgerRepair = mechanicalTaskLedgerRepair;
47
+ exports.proposeTaskLedgerFixes = proposeTaskLedgerFixes;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const canonical_1 = require("./brain/canonical");
51
+ const projectContext_1 = require("./projectContext");
52
+ const tasksFile_1 = require("./tasksFile");
53
+ exports.TASK_LEDGER_VALIDATION_VERSION = "you-md/task-ledger-validation/v1";
54
+ exports.TASK_LEDGER_FIX_PROPOSAL_VERSION = "you-md/task-ledger-fix-proposal/v1";
55
+ const TASK_ID = /^t-[A-Za-z0-9][A-Za-z0-9_-]{0,94}$/;
56
+ const DOC_KEYS = new Set(["$schema", "project", "updatedAt", "tasks", "notes"]);
57
+ const TASK_KEYS = new Set([
58
+ "id", "title", "description", "goal", "successCriteria", "parentId", "dependencyIds",
59
+ "scope", "blockers", "clarification", "review", "evidence", "status", "priority",
60
+ "owner", "ownerLabel", "tags", "source", "verify", "createdAt", "updatedAt", "completedAt",
61
+ ]);
62
+ function compareText(a, b) {
63
+ return a < b ? -1 : a > b ? 1 : 0;
64
+ }
65
+ function compareValidation(a, b) {
66
+ return compareText(a.project.toLowerCase(), b.project.toLowerCase())
67
+ || compareText(a.contextDir, b.contextDir);
68
+ }
69
+ function contentHash(content) {
70
+ return content === null ? null : `sha256:${(0, canonical_1.sha256)(content)}`;
71
+ }
72
+ function regularFileContent(filePath) {
73
+ let stat;
74
+ try {
75
+ stat = fs.lstatSync(filePath);
76
+ }
77
+ catch (error) {
78
+ if (error.code === "ENOENT")
79
+ return { content: null };
80
+ return { content: null, failure: { code: "TASKS_READ_FAILED", message: `cannot inspect ${path.basename(filePath)}` } };
81
+ }
82
+ if (!stat.isFile() || stat.isSymbolicLink()) {
83
+ return { content: null, failure: { code: "TASKS_SYMLINK_REFUSED", message: `${path.basename(filePath)} is not a regular non-symlink file` } };
84
+ }
85
+ try {
86
+ return { content: fs.readFileSync(filePath, "utf8") };
87
+ }
88
+ catch {
89
+ return { content: null, failure: { code: "TASKS_READ_FAILED", message: `cannot read ${path.basename(filePath)}` } };
90
+ }
91
+ }
92
+ function requiresAdoption(contextDir) {
93
+ try {
94
+ (0, tasksFile_1.resolveTaskWriteGrant)(contextDir);
95
+ return false;
96
+ }
97
+ catch {
98
+ return true;
99
+ }
100
+ }
101
+ function asFailure(error) {
102
+ return {
103
+ code: error instanceof tasksFile_1.TasksFileError ? error.code : "TASKS_READ_FAILED",
104
+ message: error instanceof Error ? error.message : "unknown task-ledger read failure",
105
+ };
106
+ }
107
+ function semanticMigrationFailure(content) {
108
+ let raw;
109
+ try {
110
+ raw = JSON.parse(content);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ if (!isRecord(raw) || !Array.isArray(raw.tasks))
116
+ return null;
117
+ const semanticFields = new Set();
118
+ for (const task of raw.tasks) {
119
+ if (!isRecord(task))
120
+ continue;
121
+ for (const field of ["promptPath", "planPath", "prompt_path", "plan_path", "source_prompts", "completion_criteria"]) {
122
+ if (Object.prototype.hasOwnProperty.call(task, field))
123
+ semanticFields.add(field);
124
+ }
125
+ }
126
+ if (semanticFields.size === 0)
127
+ return null;
128
+ return {
129
+ code: "TASKS_SEMANTIC_MIGRATION_REQUIRED",
130
+ message: `task fields require explicit semantic mapping: ${[...semanticFields].sort(compareText).join(", ")}`,
131
+ };
132
+ }
133
+ function inspectTaskLedger(contextDir) {
134
+ const resolvedContextDir = path.resolve(contextDir);
135
+ const project = (0, projectContext_1.deriveProjectName)(path.dirname(resolvedContextDir));
136
+ const jsonPath = path.join(resolvedContextDir, "tasks.json");
137
+ const mdPath = path.join(resolvedContextDir, "tasks.md");
138
+ const jsonRead = regularFileContent(jsonPath);
139
+ const mdRead = regularFileContent(mdPath);
140
+ const failures = [];
141
+ let doc = null;
142
+ if (jsonRead.failure)
143
+ failures.push(jsonRead.failure);
144
+ if (mdRead.failure)
145
+ failures.push(mdRead.failure);
146
+ if (!jsonRead.failure && jsonRead.content === null) {
147
+ failures.push({
148
+ code: "TASKS_JSON_MISSING",
149
+ message: mdRead.content === null
150
+ ? "canonical tasks.json and generated tasks.md are missing"
151
+ : "canonical tasks.json is missing; legacy tasks.md adoption requires review",
152
+ });
153
+ }
154
+ else if (!jsonRead.failure && jsonRead.content !== null) {
155
+ try {
156
+ doc = (0, tasksFile_1.parseTasksJson)(jsonRead.content, project);
157
+ }
158
+ catch (error) {
159
+ failures.push(asFailure(error));
160
+ }
161
+ const semanticFailure = semanticMigrationFailure(jsonRead.content);
162
+ if (semanticFailure)
163
+ failures.push(semanticFailure);
164
+ }
165
+ if (doc && !mdRead.failure) {
166
+ if (mdRead.content === null) {
167
+ failures.push({ code: "TASKS_MD_MISSING", message: "generated tasks.md is missing" });
168
+ }
169
+ else if (mdRead.content !== (0, tasksFile_1.renderTasksMd)(doc)) {
170
+ failures.push({ code: "TASKS_MD_DRIFT", message: "tasks.md differs from deterministic tasks.json rendering" });
171
+ }
172
+ }
173
+ failures.sort((a, b) => compareText(a.code, b.code) || compareText(a.message, b.message));
174
+ const base = {
175
+ tasksJson: { path: jsonPath, exists: jsonRead.content !== null, contentHash: contentHash(jsonRead.content) },
176
+ tasksMd: { path: mdPath, exists: mdRead.content !== null, contentHash: contentHash(mdRead.content) },
177
+ };
178
+ const validation = {
179
+ project,
180
+ contextDir: resolvedContextDir,
181
+ status: failures.length === 0 ? "valid" : "invalid",
182
+ valid: failures.length === 0,
183
+ taskCount: doc?.tasks.length ?? rawTaskCount(jsonRead.content),
184
+ adoptionRequired: requiresAdoption(resolvedContextDir),
185
+ base,
186
+ failures,
187
+ };
188
+ return { validation, jsonContent: jsonRead.content, mdContent: mdRead.content, doc };
189
+ }
190
+ function rawTaskCount(content) {
191
+ if (content === null)
192
+ return null;
193
+ try {
194
+ const value = JSON.parse(content);
195
+ return Array.isArray(value?.tasks) ? value.tasks.length : null;
196
+ }
197
+ catch {
198
+ return null;
199
+ }
200
+ }
201
+ function taskLedgerContextDirs(contextDirs) {
202
+ return [...new Set(contextDirs.map((contextDir) => path.resolve(contextDir)))]
203
+ .filter((contextDir) => fs.existsSync(path.join(contextDir, "tasks.json")) || fs.existsSync(path.join(contextDir, "tasks.md")))
204
+ .sort(compareText);
205
+ }
206
+ function validateTaskLedgers(contextDirs, scope) {
207
+ const ledgers = contextDirs.map(inspectTaskLedger).map((entry) => entry.validation).sort(compareValidation);
208
+ const valid = ledgers.filter((entry) => entry.valid).length;
209
+ return {
210
+ schemaVersion: exports.TASK_LEDGER_VALIDATION_VERSION,
211
+ kind: "task-ledger-validation",
212
+ scope,
213
+ ok: valid === ledgers.length,
214
+ counts: { ledgers: ledgers.length, valid, invalid: ledgers.length - valid },
215
+ ledgers,
216
+ };
217
+ }
218
+ function isRecord(value) {
219
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
220
+ }
221
+ function replacementId(oldId, project, index, occupied) {
222
+ const prefixed = `t-${oldId}`;
223
+ if (TASK_ID.test(prefixed) && !occupied.has(prefixed))
224
+ return prefixed;
225
+ let salt = 0;
226
+ while (true) {
227
+ const digest = (0, canonical_1.sha256)((0, canonical_1.canonicalize)({ project, index, oldId, salt })).slice(0, 20);
228
+ const candidate = `t-migrate-${digest}`;
229
+ if (!occupied.has(candidate))
230
+ return candidate;
231
+ salt += 1;
232
+ }
233
+ }
234
+ function mechanicalTaskLedgerRepair(content, expectedProject) {
235
+ let raw;
236
+ try {
237
+ raw = JSON.parse(content);
238
+ }
239
+ catch {
240
+ return null;
241
+ }
242
+ if (!isRecord(raw) || raw.$schema !== tasksFile_1.TASKS_SCHEMA || raw.project !== expectedProject || !Array.isArray(raw.tasks))
243
+ return null;
244
+ if (Object.keys(raw).some((key) => !DOC_KEYS.has(key)))
245
+ return null;
246
+ if (raw.tasks.some((task) => !isRecord(task) || Object.keys(task).some((key) => !TASK_KEYS.has(key))))
247
+ return null;
248
+ const taskRecords = raw.tasks;
249
+ const oldTaskIds = taskRecords.map((task) => task.id);
250
+ if (oldTaskIds.some((id) => typeof id !== "string" || !id))
251
+ return null;
252
+ const oldIds = oldTaskIds;
253
+ if (new Set(oldIds).size !== oldIds.length)
254
+ return null;
255
+ const invalidIds = oldIds.filter((id) => !TASK_ID.test(id));
256
+ if (invalidIds.length === 0)
257
+ return null;
258
+ const occupied = new Set(oldIds.filter((id) => TASK_ID.test(id)));
259
+ const replacements = new Map();
260
+ for (let index = 0; index < oldIds.length; index += 1) {
261
+ const oldId = oldIds[index];
262
+ if (TASK_ID.test(oldId))
263
+ continue;
264
+ const next = replacementId(oldId, expectedProject, index, occupied);
265
+ replacements.set(oldId, next);
266
+ occupied.add(next);
267
+ }
268
+ const transformed = JSON.parse(content);
269
+ const transformedTasks = transformed.tasks;
270
+ const operations = [];
271
+ const replaceValue = (pointer, container, key, oldValue) => {
272
+ const next = replacements.get(oldValue);
273
+ if (!next)
274
+ return;
275
+ operations.push({ op: "test", path: pointer, value: oldValue });
276
+ operations.push({ op: "replace", path: pointer, value: next });
277
+ container[key] = next;
278
+ };
279
+ for (let index = 0; index < transformedTasks.length; index += 1) {
280
+ const task = transformedTasks[index];
281
+ replaceValue(`/tasks/${index}/id`, task, "id", String(task.id));
282
+ if (typeof task.parentId === "string")
283
+ replaceValue(`/tasks/${index}/parentId`, task, "parentId", task.parentId);
284
+ if (Array.isArray(task.dependencyIds)) {
285
+ for (let dependencyIndex = 0; dependencyIndex < task.dependencyIds.length; dependencyIndex += 1) {
286
+ const dependencyId = task.dependencyIds[dependencyIndex];
287
+ if (typeof dependencyId === "string") {
288
+ replaceValue(`/tasks/${index}/dependencyIds/${dependencyIndex}`, task.dependencyIds, dependencyIndex, dependencyId);
289
+ }
290
+ }
291
+ }
292
+ // Older otherwise-v1 ledgers recorded completed work without completedAt.
293
+ // Reusing the task's own updatedAt is deterministic and does not invent a
294
+ // new event time; anything less mechanical remains manual review.
295
+ if (task.status === "done" && task.completedAt === undefined && typeof task.updatedAt === "string") {
296
+ operations.push({ op: "add", path: `/tasks/${index}/completedAt`, value: task.updatedAt });
297
+ task.completedAt = task.updatedAt;
298
+ }
299
+ }
300
+ try {
301
+ const normalized = (0, tasksFile_1.parseTasksJson)(JSON.stringify(transformed), expectedProject);
302
+ return { doc: normalized, content: `${JSON.stringify(transformed, null, 2)}\n`, operations };
303
+ }
304
+ catch {
305
+ return null;
306
+ }
307
+ }
308
+ function proposalPreimage(proposal) {
309
+ return proposal;
310
+ }
311
+ function proposalFor(inspected) {
312
+ const { validation, jsonContent, doc } = inspected;
313
+ let classification = "manual_review";
314
+ let level = "high";
315
+ let review = "manual_review";
316
+ let reason = "The ledger contains semantic or ownership decisions that cannot be mapped without human review.";
317
+ let operations = [];
318
+ let resultJsonContent = null;
319
+ let generatedDoc = null;
320
+ const failureCodes = validation.failures.map((failure) => failure.code);
321
+ if (doc && failureCodes.every((code) => code === "TASKS_MD_DRIFT" || code === "TASKS_MD_MISSING")) {
322
+ classification = "generator_drift";
323
+ level = "low";
324
+ review = "exact_patch";
325
+ reason = "Canonical tasks.json is valid; only its deterministic tasks.md companion needs replacement.";
326
+ resultJsonContent = jsonContent;
327
+ generatedDoc = doc;
328
+ }
329
+ else if (jsonContent !== null) {
330
+ const repair = mechanicalTaskLedgerRepair(jsonContent, validation.project);
331
+ if (repair) {
332
+ classification = "mechanical_id_migration";
333
+ level = "medium";
334
+ review = "exact_patch";
335
+ reason = "Noncanonical task IDs can be deterministically prefixed or hashed while preserving exact relationship references; legacy done rows reuse their existing updatedAt as completedAt.";
336
+ operations = repair.operations;
337
+ resultJsonContent = repair.content;
338
+ generatedDoc = repair.doc;
339
+ }
340
+ }
341
+ if (failureCodes.includes("TASKS_SEMANTIC_MIGRATION_REQUIRED")) {
342
+ reason = "Prompt/plan provenance or completion-criteria fields require an explicit semantic mapping; no lossy patch is emitted.";
343
+ }
344
+ else if (validation.failures.some((failure) => /project must equal/.test(failure.message))) {
345
+ reason = "The repository and ledger disagree on logical project identity; project naming requires an owner decision.";
346
+ }
347
+ const replacement = generatedDoc ? (0, tasksFile_1.renderTasksMd)(generatedDoc) : null;
348
+ const patchDigest = `sha256:${(0, canonical_1.sha256)((0, canonical_1.canonicalize)(operations))}`;
349
+ const withoutRef = {
350
+ schemaVersion: exports.TASK_LEDGER_FIX_PROPOSAL_VERSION,
351
+ kind: "task-ledger-fix-proposal",
352
+ project: validation.project,
353
+ contextDir: validation.contextDir,
354
+ status: "proposed",
355
+ authority: "review_only",
356
+ applySupported: false,
357
+ classification,
358
+ adoptionRequired: validation.adoptionRequired,
359
+ risk: { level, review, reason },
360
+ failures: validation.failures,
361
+ base: validation.base,
362
+ tasksJson: {
363
+ path: validation.base.tasksJson.path,
364
+ patchFormat: "rfc6902",
365
+ operations,
366
+ patchDigest,
367
+ resultContentHash: resultJsonContent === null ? null : contentHash(resultJsonContent),
368
+ },
369
+ tasksMd: {
370
+ path: validation.base.tasksMd.path,
371
+ replacement,
372
+ baseContentHash: validation.base.tasksMd.contentHash,
373
+ replacementContentHash: replacement === null ? null : contentHash(replacement),
374
+ generatedFromTasksJsonHash: resultJsonContent === null ? null : contentHash(resultJsonContent),
375
+ },
376
+ };
377
+ return {
378
+ ...withoutRef,
379
+ proposalRef: `proposal:tasks/${(0, canonical_1.sha256)((0, canonical_1.canonicalize)(proposalPreimage(withoutRef)))}`,
380
+ };
381
+ }
382
+ function proposeTaskLedgerFixes(contextDirs, scope) {
383
+ const inspected = contextDirs.map(inspectTaskLedger).sort((a, b) => compareValidation(a.validation, b.validation));
384
+ const proposals = inspected.filter((entry) => !entry.validation.valid).map(proposalFor);
385
+ const exactPatch = proposals.filter((proposal) => proposal.risk.review === "exact_patch").length;
386
+ return {
387
+ schemaVersion: "you-md/task-ledger-fix-proposal-generation/v1",
388
+ kind: "task-ledger-fix-proposal-generation",
389
+ scope,
390
+ ok: true,
391
+ counts: {
392
+ invalid: proposals.length,
393
+ proposals: proposals.length,
394
+ exactPatch,
395
+ manualReview: proposals.length - exactPatch,
396
+ },
397
+ proposals,
398
+ };
399
+ }
400
+ //# sourceMappingURL=taskLedgerProposal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskLedgerProposal.js","sourceRoot":"","sources":["../../src/lib/taskLedgerProposal.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,15 @@ export interface TaskEntry {
11
11
  id: string;
12
12
  title: string;
13
13
  description?: string;
14
+ goal?: string;
15
+ successCriteria?: string;
16
+ parentId?: string;
17
+ dependencyIds?: string[];
18
+ scope?: string;
19
+ blockers?: string[];
20
+ clarification?: string;
21
+ review?: string;
22
+ evidence?: string[];
14
23
  status: TaskStatus;
15
24
  priority: TaskPriority;
16
25
  owner: "human" | "agent";
@@ -1 +1 @@
1
- {"version":3,"file":"tasksFile.d.ts","sourceRoot":"","sources":["../../src/lib/tasksFile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasksFile.d.ts","sourceRoot":"","sources":["../../src/lib/tasksFile.ts"],"names":[],"mappings":"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"}
@@ -78,8 +78,9 @@ const SAFE_RELATIVE_PATH = /^(?!\/)(?![A-Za-z]:)(?!.*\\)(?!.*\/\/)(?!.*(?:^|\/)(
78
78
  const OPEN_STATUSES = ["proposed", "open", "in_progress", "snoozed"];
79
79
  const DOC_KEYS = new Set(["$schema", "project", "updatedAt", "tasks", "notes"]);
80
80
  const TASK_KEYS = new Set([
81
- "id", "title", "description", "status", "priority", "owner", "ownerLabel", "tags",
82
- "source", "verify", "createdAt", "updatedAt", "completedAt",
81
+ "id", "title", "description", "goal", "successCriteria", "parentId", "dependencyIds",
82
+ "scope", "blockers", "clarification", "review", "evidence", "status", "priority",
83
+ "owner", "ownerLabel", "tags", "source", "verify", "createdAt", "updatedAt", "completedAt",
83
84
  ]);
84
85
  function nowIso(now = new Date()) { return now.toISOString(); }
85
86
  function isRecord(value) {
@@ -96,6 +97,11 @@ function boundedText(value, max, optional = false) {
96
97
  return undefined;
97
98
  return value;
98
99
  }
100
+ function boundedTextList(value, maxItems, maxText) {
101
+ return Array.isArray(value)
102
+ && value.length <= maxItems
103
+ && value.every((item) => Boolean(boundedText(item, maxText)));
104
+ }
99
105
  function assertNoUnknown(record, allowed, code, where) {
100
106
  const unknown = Object.keys(record).filter((key) => !allowed.has(key));
101
107
  if (unknown.includes("remoteId"))
@@ -128,6 +134,26 @@ function parseTask(value, index) {
128
134
  }
129
135
  if (new Set(value.tags).size !== value.tags.length)
130
136
  throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].tags must be unique`);
137
+ if (value.parentId !== undefined && (typeof value.parentId !== "string" || !TASK_ID.test(value.parentId) || value.parentId === value.id)) {
138
+ throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].parentId is invalid`);
139
+ }
140
+ if (value.dependencyIds !== undefined) {
141
+ if (!Array.isArray(value.dependencyIds) || value.dependencyIds.length > 256
142
+ || value.dependencyIds.some((id) => typeof id !== "string" || !TASK_ID.test(id) || id === value.id)) {
143
+ throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].dependencyIds are invalid`);
144
+ }
145
+ if (new Set(value.dependencyIds).size !== value.dependencyIds.length) {
146
+ throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].dependencyIds must be unique`);
147
+ }
148
+ }
149
+ for (const [field, maxItems, maxText] of [["blockers", 128, 2000], ["evidence", 256, 4000]]) {
150
+ if (value[field] !== undefined && !boundedTextList(value[field], maxItems, maxText)) {
151
+ throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].${field} is invalid`);
152
+ }
153
+ if (Array.isArray(value[field]) && new Set(value[field]).size !== value[field].length) {
154
+ throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].${field} must be unique`);
155
+ }
156
+ }
131
157
  if (!exactIso(value.createdAt) || !exactIso(value.updatedAt))
132
158
  throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}] timestamps are invalid`);
133
159
  if (value.completedAt !== undefined && !exactIso(value.completedAt))
@@ -136,7 +162,11 @@ function parseTask(value, index) {
136
162
  throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}] done status requires completedAt`);
137
163
  if (value.status !== "done" && value.completedAt !== undefined)
138
164
  throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}] non-done status forbids completedAt`);
139
- for (const [field, max] of [["description", 10000], ["ownerLabel", 120], ["source", 120], ["verify", 2000]]) {
165
+ for (const [field, max] of [
166
+ ["description", 10000], ["goal", 10000], ["successCriteria", 10000],
167
+ ["scope", 4000], ["clarification", 10000], ["review", 10000],
168
+ ["ownerLabel", 120], ["source", 120], ["verify", 2000],
169
+ ]) {
140
170
  if (value[field] !== undefined && !boundedText(value[field], max, true))
141
171
  throw new TasksFileError("TASKS_INVALID_TASK", `tasks[${index}].${field} is invalid`);
142
172
  }
@@ -144,6 +174,15 @@ function parseTask(value, index) {
144
174
  id: value.id,
145
175
  title,
146
176
  ...(value.description !== undefined ? { description: value.description } : {}),
177
+ ...(value.goal !== undefined ? { goal: value.goal } : {}),
178
+ ...(value.successCriteria !== undefined ? { successCriteria: value.successCriteria } : {}),
179
+ ...(value.parentId !== undefined ? { parentId: value.parentId } : {}),
180
+ ...(value.dependencyIds !== undefined ? { dependencyIds: [...value.dependencyIds] } : {}),
181
+ ...(value.scope !== undefined ? { scope: value.scope } : {}),
182
+ ...(value.blockers !== undefined ? { blockers: [...value.blockers] } : {}),
183
+ ...(value.clarification !== undefined ? { clarification: value.clarification } : {}),
184
+ ...(value.review !== undefined ? { review: value.review } : {}),
185
+ ...(value.evidence !== undefined ? { evidence: [...value.evidence] } : {}),
147
186
  status: value.status,
148
187
  priority: value.priority,
149
188
  owner: value.owner,
@@ -241,20 +280,44 @@ function statusLabel(task) {
241
280
  bits.push(task.tags.map((tag) => `#${tag}`).join(" "));
242
281
  return bits.join(" · ");
243
282
  }
283
+ function renderOptionalTaskDetails(task) {
284
+ const lines = [];
285
+ const text = (label, value) => {
286
+ if (value)
287
+ lines.push(` ${label}: ${value.replace(/\r?\n/g, "\n ")}`);
288
+ };
289
+ const list = (label, values) => {
290
+ if (values?.length)
291
+ lines.push(` ${label}: ${values.join(" | ")}`);
292
+ };
293
+ text("goal", task.goal);
294
+ text("success", task.successCriteria);
295
+ text("scope", task.scope);
296
+ text("parent", task.parentId);
297
+ list("dependencies", task.dependencyIds);
298
+ list("blockers", task.blockers);
299
+ text("clarification", task.clarification);
300
+ text("review", task.review);
301
+ list("evidence", task.evidence);
302
+ return lines;
303
+ }
244
304
  function renderTasksMd(doc) {
245
305
  const active = doc.tasks.filter((task) => OPEN_STATUSES.includes(task.status)).sort(compareTask);
246
306
  const closed = doc.tasks.filter((task) => !OPEN_STATUSES.includes(task.status)).sort(compareTask);
247
307
  const lines = [`# Tasks — ${doc.project}`, "", GENERATED_MARKER, " regenerate with `you tasks`; manual changes are rejected. -->", "", `## Active (${active.length})`, ""];
248
308
  for (const task of active) {
249
309
  lines.push(`- [ ] ${task.title} <!-- id:${task.id} -->`, ` ${statusLabel(task)}`);
310
+ lines.push(...renderOptionalTaskDetails(task));
250
311
  if (task.verify)
251
312
  lines.push(` verify: ${task.verify}`);
252
313
  if (task.description)
253
314
  lines.push(` ${task.description}`);
254
315
  }
255
316
  lines.push("", `## Done (${closed.length})`, "");
256
- for (const task of closed)
317
+ for (const task of closed) {
257
318
  lines.push(`- [${task.status === "done" ? "x" : " "}] ${task.title}${task.status === "done" ? "" : ` (${task.status})`} <!-- id:${task.id} -->`);
319
+ lines.push(...renderOptionalTaskDetails(task));
320
+ }
258
321
  lines.push("", NOTES_START, doc.notes || "", NOTES_END, "");
259
322
  return lines.join("\n");
260
323
  }
@@ -405,7 +468,17 @@ function writeTasksDoc(contextDir, input, options = {}) {
405
468
  const mdPath = tasksMdPath(contextDir);
406
469
  assertRegularOrMissing(grant.repoRoot, jsonPath);
407
470
  assertRegularOrMissing(grant.repoRoot, mdPath);
408
- const doc = { ...input, updatedAt: nowIso(options.now), tasks: input.tasks.map((task) => ({ ...task, tags: [...task.tags] })) };
471
+ const doc = {
472
+ ...input,
473
+ updatedAt: nowIso(options.now),
474
+ tasks: input.tasks.map((task) => ({
475
+ ...task,
476
+ tags: [...task.tags],
477
+ ...(task.dependencyIds ? { dependencyIds: [...task.dependencyIds] } : {}),
478
+ ...(task.blockers ? { blockers: [...task.blockers] } : {}),
479
+ ...(task.evidence ? { evidence: [...task.evidence] } : {}),
480
+ })),
481
+ };
409
482
  const json = JSON.stringify(doc, null, 2) + "\n";
410
483
  const validated = parseTasksJson(json, input.project);
411
484
  const markdown = renderTasksMd(validated);
@@ -481,6 +554,11 @@ function addTask(doc, input) {
481
554
  const status = input.status ?? "open";
482
555
  const task = {
483
556
  id: input.id ?? generateTaskId(), title: input.title.trim(), ...(input.description ? { description: input.description } : {}),
557
+ ...(input.goal ? { goal: input.goal } : {}), ...(input.successCriteria ? { successCriteria: input.successCriteria } : {}),
558
+ ...(input.parentId ? { parentId: input.parentId } : {}), ...(input.dependencyIds ? { dependencyIds: [...input.dependencyIds] } : {}),
559
+ ...(input.scope ? { scope: input.scope } : {}), ...(input.blockers ? { blockers: [...input.blockers] } : {}),
560
+ ...(input.clarification ? { clarification: input.clarification } : {}), ...(input.review ? { review: input.review } : {}),
561
+ ...(input.evidence ? { evidence: [...input.evidence] } : {}),
484
562
  status, priority: input.priority ?? "normal", owner: input.owner ?? "human", ...(input.ownerLabel ? { ownerLabel: input.ownerLabel } : {}),
485
563
  tags: [...(input.tags ?? [])], ...(input.source ? { source: input.source } : {}), ...(input.verify ? { verify: input.verify } : {}),
486
564
  createdAt: input.createdAt ?? timestamp, updatedAt: timestamp,