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.
- package/dist/commands/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +32 -10
- package/dist/commands/brain.js.map +1 -1
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +16 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/stack.d.ts +2 -0
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +26 -0
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/tasks.d.ts +37 -0
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +152 -18
- package/dist/commands/tasks.js.map +1 -1
- package/dist/generated/capability-registry.d.ts +148 -68
- package/dist/generated/capability-registry.d.ts.map +1 -1
- package/dist/generated/capability-registry.js +159 -68
- package/dist/generated/capability-registry.js.map +1 -1
- package/dist/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +46 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +18 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/brain/cache.d.ts +2 -2
- package/dist/lib/brain/cache.d.ts.map +1 -1
- package/dist/lib/brain/cache.js +4 -4
- package/dist/lib/brain/cache.js.map +1 -1
- package/dist/lib/brain/content.d.ts +51 -0
- package/dist/lib/brain/content.d.ts.map +1 -0
- package/dist/lib/brain/content.js +327 -0
- package/dist/lib/brain/content.js.map +1 -0
- package/dist/lib/brain/discovery.d.ts.map +1 -1
- package/dist/lib/brain/discovery.js +28 -11
- package/dist/lib/brain/discovery.js.map +1 -1
- package/dist/lib/brain/index.d.ts +1 -0
- package/dist/lib/brain/index.d.ts.map +1 -1
- package/dist/lib/brain/index.js +1 -0
- package/dist/lib/brain/index.js.map +1 -1
- package/dist/lib/brain/proposal.d.ts.map +1 -1
- package/dist/lib/brain/proposal.js +46 -5
- package/dist/lib/brain/proposal.js.map +1 -1
- package/dist/lib/brain/safe-open.d.ts +2 -0
- package/dist/lib/brain/safe-open.d.ts.map +1 -0
- package/dist/lib/brain/safe-open.js +77 -0
- package/dist/lib/brain/safe-open.js.map +1 -0
- package/dist/lib/brain/sync.d.ts +39 -0
- package/dist/lib/brain/sync.d.ts.map +1 -0
- package/dist/lib/brain/sync.js +136 -0
- package/dist/lib/brain/sync.js.map +1 -0
- package/dist/lib/daemon.js +1 -1
- package/dist/lib/daemon.js.map +1 -1
- package/dist/lib/orchestrator/loop.d.ts +7 -0
- package/dist/lib/orchestrator/loop.d.ts.map +1 -1
- package/dist/lib/orchestrator/loop.js +48 -0
- package/dist/lib/orchestrator/loop.js.map +1 -1
- package/dist/lib/orchestrator/run-journal.d.ts +113 -0
- package/dist/lib/orchestrator/run-journal.d.ts.map +1 -0
- package/dist/lib/orchestrator/run-journal.js +558 -0
- package/dist/lib/orchestrator/run-journal.js.map +1 -0
- package/dist/lib/orchestrator/tools.d.ts +2 -0
- package/dist/lib/orchestrator/tools.d.ts.map +1 -1
- package/dist/lib/orchestrator/tools.js +141 -1
- package/dist/lib/orchestrator/tools.js.map +1 -1
- package/dist/lib/taskLedgerProposal.d.ts +102 -0
- package/dist/lib/taskLedgerProposal.d.ts.map +1 -0
- package/dist/lib/taskLedgerProposal.js +400 -0
- package/dist/lib/taskLedgerProposal.js.map +1 -0
- package/dist/lib/tasksFile.d.ts +9 -0
- package/dist/lib/tasksFile.d.ts.map +1 -1
- package/dist/lib/tasksFile.js +83 -5
- package/dist/lib/tasksFile.js.map +1 -1
- package/native/prebuilds/darwin-universal/youmd_safe_open.node +0 -0
- package/native/safe-open/youmd_safe_open.c +224 -0
- package/package.json +8 -2
- package/scripts/build-safe-open.mjs +63 -0
- package/scripts/skillstack-sync/com.you.context-sync.plist +1 -1
- package/scripts/skillstack-sync/com.you.identity-sync.plist +1 -1
- package/scripts/skillstack-sync/com.you.orchestrator-watch.plist +1 -1
- package/scripts/skillstack-sync/com.you.realtime-sync.plist +7 -1
- package/scripts/skillstack-sync/com.you.skillstack-sync.plist +1 -1
- package/scripts/skillstack-sync/context-sync.sh +19 -7
- 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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"}
|
package/dist/lib/tasksFile.d.ts
CHANGED
|
@@ -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":"AAAA;;;GAGG;AAMH,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,aAAa,8EAA+E,CAAC;AAC1G,eAAO,MAAM,eAAe,8CAA+C,CAAC;AAE5E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,sBAAsB,GACtB,wBAAwB,GACxB,oBAAoB,GACpB,oBAAoB,GACpB,2BAA2B,GAC3B,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,GACvB,yBAAyB,GACzB,kBAAkB,GAClB,wBAAwB,CAAC;AAE7B,qBAAa,cAAe,SAAQ,KAAK;aACX,IAAI,EAAE,kBAAkB;gBAAxB,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM;CAItE;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"tasksFile.d.ts","sourceRoot":"","sources":["../../src/lib/tasksFile.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/tasksFile.js
CHANGED
|
@@ -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", "
|
|
82
|
-
"
|
|
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 [
|
|
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 = {
|
|
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,
|