things-api 0.12.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli/canonical-ref.d.ts +21 -0
- package/dist/cli/canonical-ref.js +23 -0
- package/dist/cli/canonical-ref.js.map +1 -0
- package/dist/cli/commands/area.d.ts +5 -5
- package/dist/cli/commands/area.js +39 -18
- package/dist/cli/commands/area.js.map +1 -1
- package/dist/cli/commands/install-skill.d.ts +2 -2
- package/dist/cli/commands/install-skill.js +29 -0
- package/dist/cli/commands/install-skill.js.map +1 -1
- package/dist/cli/commands/mcp.js +12 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/project.js +74 -22
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.d.ts +5 -1
- package/dist/cli/commands/reads.js +31 -15
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/setup.js +11 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +51 -32
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/todo.js +2 -2
- package/dist/cli/commands/todo.js.map +1 -1
- package/dist/cli/commands/writes.js +138 -67
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/did-you-mean.js +19 -5
- package/dist/cli/did-you-mean.js.map +1 -1
- package/dist/cli/dry-run.d.ts +55 -0
- package/dist/cli/dry-run.js +92 -0
- package/dist/cli/dry-run.js.map +1 -0
- package/dist/cli/glyphs.d.ts +9 -2
- package/dist/cli/glyphs.js +11 -5
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.js +7 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +7 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/read-driver.d.ts +47 -7
- package/dist/cli/read-driver.js +43 -21
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/ref-render.d.ts +14 -0
- package/dist/cli/ref-render.js +9 -0
- package/dist/cli/ref-render.js.map +1 -0
- package/dist/cli/render.d.ts +39 -25
- package/dist/cli/render.js +102 -62
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/resolve-invocation.d.ts +5 -3
- package/dist/cli/resolve-invocation.js +13 -4
- package/dist/cli/resolve-invocation.js.map +1 -1
- package/dist/client.d.ts +100 -32
- package/dist/client.js +63 -19
- package/dist/client.js.map +1 -1
- package/dist/contracts.d.ts +34 -33
- package/dist/contracts.js +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/db/baselines/db-v26.js +4 -1
- package/dist/db/baselines/db-v26.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +192 -139
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/dates.d.ts +26 -0
- package/dist/model/dates.js +46 -4
- package/dist/model/dates.js.map +1 -1
- package/dist/model/entities.d.ts +11 -1
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.js +3 -0
- package/dist/model/mappers.js.map +1 -1
- package/dist/model/serialize.js +15 -3
- package/dist/model/serialize.js.map +1 -1
- package/dist/read/area-filter.d.ts +2 -2
- package/dist/read/area-filter.js +3 -3
- package/dist/read/area-filter.js.map +1 -1
- package/dist/read/project-view.d.ts +76 -1
- package/dist/read/project-view.js +80 -9
- package/dist/read/project-view.js.map +1 -1
- package/dist/read/queries.d.ts +71 -2
- package/dist/read/queries.js +199 -10
- package/dist/read/queries.js.map +1 -1
- package/dist/read/scope.d.ts +2 -2
- package/dist/read/scope.js +3 -3
- package/dist/read/scope.js.map +1 -1
- package/dist/read/shape.d.ts +87 -9
- package/dist/read/shape.js +483 -124
- package/dist/read/shape.js.map +1 -1
- package/dist/read/show-target.js +52 -33
- package/dist/read/show-target.js.map +1 -1
- package/dist/read/truncation.d.ts +73 -7
- package/dist/read/truncation.js +62 -29
- package/dist/read/truncation.js.map +1 -1
- package/dist/read/views.d.ts +20 -7
- package/dist/read/views.js +7 -7
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +13 -0
- package/dist/surface-copy.js +13 -0
- package/dist/surface-copy.js.map +1 -1
- package/dist/write/batch.js +0 -1
- package/dist/write/batch.js.map +1 -1
- package/dist/write/commands.d.ts +25 -1
- package/dist/write/commands.js +259 -122
- package/dist/write/commands.js.map +1 -1
- package/dist/write/guards.js +27 -11
- package/dist/write/guards.js.map +1 -1
- package/dist/write/move.d.ts +34 -9
- package/dist/write/move.js +730 -78
- package/dist/write/move.js.map +1 -1
- package/dist/write/operations.d.ts +50 -20
- package/dist/write/operations.js +2 -2
- package/dist/write/operations.js.map +1 -1
- package/dist/write/pipeline.js +25 -4
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/pre-state.d.ts +58 -28
- package/dist/write/pre-state.js +247 -49
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/reorder.js +266 -32
- package/dist/write/reorder.js.map +1 -1
- package/dist/write/resolution-timestamps.d.ts +34 -0
- package/dist/write/resolution-timestamps.js +286 -0
- package/dist/write/resolution-timestamps.js.map +1 -0
- package/dist/write/reversibility.js +5 -5
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/scope-guard.js +0 -5
- package/dist/write/scope-guard.js.map +1 -1
- package/dist/write/undo.d.ts +0 -6
- package/dist/write/undo.js +44 -4
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/applescript.js +14 -4
- package/dist/write/vectors/applescript.js.map +1 -1
- package/dist/write/vectors/url-scheme.js +0 -8
- package/dist/write/vectors/url-scheme.js.map +1 -1
- package/dist/write/verify/delta.d.ts +16 -2
- package/dist/write/verify/delta.js +21 -2
- package/dist/write/verify/delta.js.map +1 -1
- package/package.json +1 -1
- package/schema/envelope.schema.json +16 -78
- package/skills/things-cli/SKILL.md +10 -6
- package/skills/things-cli/references/contracts.md +3 -2
- package/skills/things-cli/references/errors.md +9 -1
- package/skills/things-cli/references/model.md +9 -7
- package/skills/things-cli/references/ordering.md +36 -10
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { resolveProjectWriteTarget, resolveTaskUuidPrefix } from "../read/queries.js";
|
|
2
|
+
import { resolutionDeltaDate } from "./commands.js";
|
|
3
|
+
import { loadTarget, projectChildren } from "./pre-state.js";
|
|
4
|
+
import { fingerprintLabel, runMutation, } from "./pipeline.js";
|
|
5
|
+
/** Dispatch a cataloged op with dynamic (op-erased) params. */
|
|
6
|
+
function exec(deps, op, params, options) {
|
|
7
|
+
return runMutation(deps, op, params, options);
|
|
8
|
+
}
|
|
9
|
+
function newTxnId(now) {
|
|
10
|
+
return `txn-${now.getTime().toString(36)}-${process.pid.toString(36)}`;
|
|
11
|
+
}
|
|
12
|
+
function legOptions(base, txnId, vector) {
|
|
13
|
+
const out = { txn: { id: txnId, role: "leg" }, vector };
|
|
14
|
+
if (base.actor !== undefined)
|
|
15
|
+
out.actor = base.actor;
|
|
16
|
+
if (base.verifyTimeoutMs !== undefined)
|
|
17
|
+
out.verifyTimeoutMs = base.verifyTimeoutMs;
|
|
18
|
+
if (base.maxDisruption !== undefined)
|
|
19
|
+
out.maxDisruption = base.maxDisruption;
|
|
20
|
+
if (base.zone !== undefined)
|
|
21
|
+
out.zone = base.zone;
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
function blocked(op, detail, remediation) {
|
|
25
|
+
return { kind: "blocked", op, reason: "hazard", hazard: "H-BACKDATE-OPEN", detail, remediation };
|
|
26
|
+
}
|
|
27
|
+
function resolveTarget(deps, kind, ref) {
|
|
28
|
+
return kind === "project"
|
|
29
|
+
? resolveProjectWriteTarget(deps.db, ref)
|
|
30
|
+
: resolveTaskUuidPrefix(deps.db, ref, "to-do");
|
|
31
|
+
}
|
|
32
|
+
function statusOf(deps, uuid) {
|
|
33
|
+
const t = loadTarget(deps.db, uuid);
|
|
34
|
+
return t !== null && t.type !== "heading" ? t.status : null;
|
|
35
|
+
}
|
|
36
|
+
/** A dry-run MutationResult that discloses the whole leg sequence. */
|
|
37
|
+
function dryRunComposite(summaryOp, uuid, legs, delta) {
|
|
38
|
+
return {
|
|
39
|
+
kind: "dry-run",
|
|
40
|
+
op: summaryOp,
|
|
41
|
+
plan: {
|
|
42
|
+
op: summaryOp,
|
|
43
|
+
vector: legs.some((l) => l.vector === "applescript") ? "applescript" : "url-scheme",
|
|
44
|
+
tier: 0,
|
|
45
|
+
invocation: `${legs.length}-leg sequence (not atomic): ` +
|
|
46
|
+
legs.map((l, i) => `${i + 1}. ${l.describe}`).join(" → "),
|
|
47
|
+
expectedDelta: delta,
|
|
48
|
+
hazardsChecked: ["H-BACKDATE-OPEN", "H-UNKNOWN-DESTINATION"],
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function appendSummary(deps, args) {
|
|
53
|
+
const fp = deps.fingerprint();
|
|
54
|
+
const record = {
|
|
55
|
+
v: 1,
|
|
56
|
+
ts: args.startedAt.toISOString(),
|
|
57
|
+
actor: deps.config.actor,
|
|
58
|
+
host: deps.config.host,
|
|
59
|
+
op: args.op,
|
|
60
|
+
uuid: args.uuid,
|
|
61
|
+
vector: "applescript",
|
|
62
|
+
disruption: 0,
|
|
63
|
+
invocation: args.invocation,
|
|
64
|
+
requested: {},
|
|
65
|
+
txn: { id: args.txnId, role: "summary" },
|
|
66
|
+
pre: null,
|
|
67
|
+
observed: { uuid: args.uuid },
|
|
68
|
+
result: "ok",
|
|
69
|
+
verify: null,
|
|
70
|
+
durationMs: (deps.now?.() ?? new Date()).getTime() - args.startedAt.getTime(),
|
|
71
|
+
env: {
|
|
72
|
+
pkg: deps.pkgVersion ?? "0.0.1",
|
|
73
|
+
dbVersion: fp.observation.databaseVersion,
|
|
74
|
+
fingerprint: fingerprintLabel(fp, deps.config),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
deps.audit.append(record);
|
|
78
|
+
return args.txnId;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Execute a leg sequence: each leg one at a time (the mutation lock + verify
|
|
82
|
+
* must never race), stopping on the first non-ok result and reporting the exact
|
|
83
|
+
* recovery state. On success, append a txn SUMMARY and return an ok result whose
|
|
84
|
+
* undoToken targets the summary (replayed leg-by-leg in reverse).
|
|
85
|
+
*/
|
|
86
|
+
async function runComposite(deps, summaryOp, uuid, legs, finalDelta, options) {
|
|
87
|
+
if (options.dryRun === true)
|
|
88
|
+
return dryRunComposite(summaryOp, uuid, legs, finalDelta);
|
|
89
|
+
const startedAt = deps.now?.() ?? new Date();
|
|
90
|
+
const txnId = newTxnId(startedAt);
|
|
91
|
+
const disclosure = legs.map((l, i) => `${i + 1}. ${l.describe}`).join(" → ");
|
|
92
|
+
let last = null;
|
|
93
|
+
for (let i = 0; i < legs.length; i++) {
|
|
94
|
+
const leg = legs[i];
|
|
95
|
+
const result = await exec(deps, leg.op, leg.params, legOptions(options, txnId, leg.vector));
|
|
96
|
+
last = result;
|
|
97
|
+
if (result.kind !== "ok") {
|
|
98
|
+
const done = legs.slice(0, i).map((l) => l.describe);
|
|
99
|
+
const recovery = done.length === 0
|
|
100
|
+
? "nothing was applied — the item is unchanged"
|
|
101
|
+
: `applied so far: ${done.join("; ")} — leg ${i + 1} (${leg.describe}) failed; the item is left mid-sequence`;
|
|
102
|
+
return {
|
|
103
|
+
kind: "verify-failed",
|
|
104
|
+
op: summaryOp,
|
|
105
|
+
reason: result.kind === "verify-failed" ? result.reason : "mismatch",
|
|
106
|
+
expected: finalDelta,
|
|
107
|
+
observed: result.kind === "verify-failed" ? result.observed : null,
|
|
108
|
+
detail: `${result.kind === "blocked" ? result.detail : "a leg did not verify"} — ${recovery}`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
appendSummary(deps, {
|
|
113
|
+
startedAt,
|
|
114
|
+
op: summaryOp,
|
|
115
|
+
uuid,
|
|
116
|
+
txnId,
|
|
117
|
+
invocation: `${summaryOp} (${legs.length}-leg): ${disclosure}`,
|
|
118
|
+
});
|
|
119
|
+
const ok = last;
|
|
120
|
+
return {
|
|
121
|
+
...ok,
|
|
122
|
+
op: summaryOp,
|
|
123
|
+
uuid,
|
|
124
|
+
undoToken: txnId,
|
|
125
|
+
warnings: [...(ok.warnings ?? []), `applied as ${legs.length} non-atomic legs: ${disclosure}`],
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ------------------------------------------------------------------ helpers
|
|
129
|
+
function completeOp(kind) {
|
|
130
|
+
return kind === "project" ? "project.complete" : "todo.complete";
|
|
131
|
+
}
|
|
132
|
+
function cancelOp(kind) {
|
|
133
|
+
return kind === "project" ? "project.cancel" : "todo.cancel";
|
|
134
|
+
}
|
|
135
|
+
function setDatesOp(kind) {
|
|
136
|
+
return kind === "project" ? "project.set-dates" : "todo.set-dates";
|
|
137
|
+
}
|
|
138
|
+
/** The children param a project complete/cancel leg needs; empty for to-dos. */
|
|
139
|
+
function childrenParam(kind, children) {
|
|
140
|
+
return kind === "project" ? { children } : {};
|
|
141
|
+
}
|
|
142
|
+
function completeLeg(kind, uuid, children) {
|
|
143
|
+
return {
|
|
144
|
+
op: completeOp(kind),
|
|
145
|
+
params: { uuid, ...childrenParam(kind, children) },
|
|
146
|
+
vector: "url-scheme",
|
|
147
|
+
describe: `flip → completed (stopDate preserved)`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function cancelLeg(kind, uuid, children) {
|
|
151
|
+
return {
|
|
152
|
+
op: cancelOp(kind),
|
|
153
|
+
params: { uuid, ...childrenParam(kind, children) },
|
|
154
|
+
vector: "url-scheme",
|
|
155
|
+
describe: `flip → canceled (stopDate preserved)`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function setDatesLeg(kind, uuid, dates) {
|
|
159
|
+
const parts = [
|
|
160
|
+
...(dates.completionDate !== undefined ? [`completion=${dates.completionDate}`] : []),
|
|
161
|
+
...(dates.creationDate !== undefined ? [`creation=${dates.creationDate}`] : []),
|
|
162
|
+
];
|
|
163
|
+
return {
|
|
164
|
+
op: setDatesOp(kind),
|
|
165
|
+
params: { uuid, ...dates },
|
|
166
|
+
vector: "applescript",
|
|
167
|
+
describe: `AS set ${parts.join(" + ")} (completed row)`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** Refuse a project whose through-completed transit would strand open children. */
|
|
171
|
+
function projectOpenChildrenBlock(deps, kind, uuid, op) {
|
|
172
|
+
if (kind !== "project")
|
|
173
|
+
return null;
|
|
174
|
+
const open = projectChildren(deps.db, uuid).filter((c) => c.status === "open");
|
|
175
|
+
if (open.length === 0)
|
|
176
|
+
return null;
|
|
177
|
+
return blocked(op, `backdating this project requires flipping it through completed, which would complete its ${open.length} ` +
|
|
178
|
+
"open child to-do(s) — a canceled/backdated project cannot leave them open", "resolve or cancel the open children first (e.g. `project cancel --children auto-cancel` without a timestamp), then backdate");
|
|
179
|
+
}
|
|
180
|
+
function stopDelta(uuid, status, stoppedDate) {
|
|
181
|
+
return {
|
|
182
|
+
mode: "state",
|
|
183
|
+
uuid,
|
|
184
|
+
assert: [
|
|
185
|
+
{ field: "status", equals: status },
|
|
186
|
+
{ field: "stoppedDate", equals: stoppedDate },
|
|
187
|
+
],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// ------------------------------------------------------------------ entries
|
|
191
|
+
/**
|
|
192
|
+
* `complete [--completed-at]` for both kinds (plan §2). No timestamp → a single
|
|
193
|
+
* plain `complete` (unchanged). With a timestamp → reach completed (if not
|
|
194
|
+
* already), then AS-backdate the completed row.
|
|
195
|
+
*/
|
|
196
|
+
export async function runCompleteWithDate(deps, kind, ref, args, options = {}) {
|
|
197
|
+
const children = args.children ?? "require-resolved";
|
|
198
|
+
if (args.completedAt === undefined) {
|
|
199
|
+
return exec(deps, completeOp(kind), { uuid: ref, ...childrenParam(kind, children) }, options);
|
|
200
|
+
}
|
|
201
|
+
const uuid = resolveTarget(deps, kind, ref);
|
|
202
|
+
const status = statusOf(deps, uuid);
|
|
203
|
+
const legs = [];
|
|
204
|
+
if (status !== "completed")
|
|
205
|
+
legs.push(completeLeg(kind, uuid, children));
|
|
206
|
+
legs.push(setDatesLeg(kind, uuid, { completionDate: args.completedAt }));
|
|
207
|
+
const delta = stopDelta(uuid, "completed", resolutionDeltaDate(args.completedAt, options.zone));
|
|
208
|
+
return runComposite(deps, completeOp(kind), uuid, legs, delta, options);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* `cancel [--completed-at]` for both kinds (plan §2). No timestamp → a single
|
|
212
|
+
* plain `cancel`. With a timestamp → end canceled with the backdated stopDate:
|
|
213
|
+
* reach completed (unless already), AS-backdate, then flip back to canceled (the
|
|
214
|
+
* flip-dance). Refuses a project whose transit would strand open children.
|
|
215
|
+
*/
|
|
216
|
+
export async function runCancelWithDate(deps, kind, ref, args, options = {}) {
|
|
217
|
+
const children = args.children ?? "require-resolved";
|
|
218
|
+
if (args.completedAt === undefined) {
|
|
219
|
+
return exec(deps, cancelOp(kind), { uuid: ref, ...childrenParam(kind, children) }, options);
|
|
220
|
+
}
|
|
221
|
+
const uuid = resolveTarget(deps, kind, ref);
|
|
222
|
+
const status = statusOf(deps, uuid);
|
|
223
|
+
const legs = [];
|
|
224
|
+
if (status !== "completed") {
|
|
225
|
+
// Cancel the OPEN children as the user asked BEFORE the completed transit —
|
|
226
|
+
// otherwise refuse rather than silently completing them.
|
|
227
|
+
if (status === "open") {
|
|
228
|
+
const stranded = projectOpenChildrenBlock(deps, kind, uuid, cancelOp(kind));
|
|
229
|
+
if (stranded !== null)
|
|
230
|
+
return stranded;
|
|
231
|
+
}
|
|
232
|
+
legs.push(completeLeg(kind, uuid, "require-resolved"));
|
|
233
|
+
}
|
|
234
|
+
legs.push(setDatesLeg(kind, uuid, { completionDate: args.completedAt }));
|
|
235
|
+
legs.push(cancelLeg(kind, uuid, "require-resolved"));
|
|
236
|
+
const delta = stopDelta(uuid, "canceled", resolutionDeltaDate(args.completedAt, options.zone));
|
|
237
|
+
return runComposite(deps, cancelOp(kind), uuid, legs, delta, options);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* `update --created-at/--completed-at` for both kinds (plan §2/§3). `--created-at`
|
|
241
|
+
* is a status-safe single AS leg. `--completed-at` edits the timestamp of an
|
|
242
|
+
* ALREADY-resolved item: on a completed item a single AS leg; on a canceled item
|
|
243
|
+
* the 3-leg flip-dance preserving canceled; on an OPEN item it is REFUSED (the
|
|
244
|
+
* open↔resolved boundary belongs to `complete`/`cancel`, not `update`).
|
|
245
|
+
*/
|
|
246
|
+
export async function runUpdateDates(deps, kind, ref, args, options = {}) {
|
|
247
|
+
const op = kind === "project" ? "project.update" : "todo.update";
|
|
248
|
+
const uuid = resolveTarget(deps, kind, ref);
|
|
249
|
+
const status = statusOf(deps, uuid);
|
|
250
|
+
if (args.completedAt === undefined) {
|
|
251
|
+
// created-at only: status-safe single set-dates leg (own undo).
|
|
252
|
+
return exec(deps, setDatesOp(kind), { uuid, creationDate: args.createdAt }, options);
|
|
253
|
+
}
|
|
254
|
+
if (status === "open") {
|
|
255
|
+
return {
|
|
256
|
+
kind: "blocked",
|
|
257
|
+
op,
|
|
258
|
+
reason: "hazard",
|
|
259
|
+
hazard: "H-BACKDATE-OPEN",
|
|
260
|
+
detail: "update edits an already-resolved item's completion timestamp — it never crosses the " +
|
|
261
|
+
"open↔resolved boundary (the item here is open)",
|
|
262
|
+
remediation: "use `complete --completed-at` to resolve-and-backdate it completed, or `cancel --completed-at` " +
|
|
263
|
+
"to resolve-and-backdate it canceled",
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const dates = {
|
|
267
|
+
completionDate: args.completedAt,
|
|
268
|
+
...(args.createdAt !== undefined && { creationDate: args.createdAt }),
|
|
269
|
+
};
|
|
270
|
+
if (status === "completed") {
|
|
271
|
+
// Single AS leg: set both timestamps in place (own undo). Not composite.
|
|
272
|
+
return exec(deps, setDatesOp(kind), { uuid, ...dates }, options);
|
|
273
|
+
}
|
|
274
|
+
// canceled: the 3-leg flip-dance, creation date riding the middle leg.
|
|
275
|
+
const stranded = projectOpenChildrenBlock(deps, kind, uuid, op);
|
|
276
|
+
if (stranded !== null)
|
|
277
|
+
return stranded;
|
|
278
|
+
const legs = [
|
|
279
|
+
completeLeg(kind, uuid, "require-resolved"),
|
|
280
|
+
setDatesLeg(kind, uuid, dates),
|
|
281
|
+
cancelLeg(kind, uuid, "require-resolved"),
|
|
282
|
+
];
|
|
283
|
+
const delta = stopDelta(uuid, "canceled", resolutionDeltaDate(args.completedAt, options.zone));
|
|
284
|
+
return runComposite(deps, op, uuid, legs, delta, options);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=resolution-timestamps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolution-timestamps.js","sourceRoot":"","sources":["../../src/write/resolution-timestamps.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,6 @@ export const REVERSIBILITY = {
|
|
|
8
8
|
class: "reversible",
|
|
9
9
|
note: "inverse sends the created to-do to the Trash (restorable); irreversible only if the created uuid was never discovered",
|
|
10
10
|
},
|
|
11
|
-
"todo.add-logged": {
|
|
12
|
-
class: "reversible",
|
|
13
|
-
note: "inverse deletes the logged to-do to the Trash; irreversible only if the created uuid was never discovered",
|
|
14
|
-
},
|
|
15
11
|
"todo.duplicate": {
|
|
16
12
|
class: "reversible",
|
|
17
13
|
note: "inverse deletes the copy to the Trash; irreversible only if the copy's uuid was never discovered",
|
|
@@ -96,7 +92,11 @@ export const REVERSIBILITY = {
|
|
|
96
92
|
class: "reversible",
|
|
97
93
|
note: "inverse renames the heading back to the captured pre-op title",
|
|
98
94
|
},
|
|
99
|
-
"todo.
|
|
95
|
+
"todo.set-dates": {
|
|
96
|
+
class: "reversible-with-loss",
|
|
97
|
+
note: "inverse restores the completion/creation timestamps at DAY precision (noon local) — the original sub-day time is not recoverable",
|
|
98
|
+
},
|
|
99
|
+
"project.set-dates": {
|
|
100
100
|
class: "reversible-with-loss",
|
|
101
101
|
note: "inverse restores the completion/creation timestamps at DAY precision (noon local) — the original sub-day time is not recoverable",
|
|
102
102
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reversibility.js","sourceRoot":"","sources":["../../src/write/reversibility.ts"],"names":[],"mappings":"AA0CA;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA8C;IACtE,4EAA4E;IAC5E,UAAU,EAAE;QACV,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,uHAAuH;KAC9H;IACD,
|
|
1
|
+
{"version":3,"file":"reversibility.js","sourceRoot":"","sources":["../../src/write/reversibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,11 +32,6 @@ export function evaluateScope(db, op, params, pre, scope) {
|
|
|
32
32
|
return blocked("deleting a tag removes it from items outside the active scope and cascades to its descendants library-wide");
|
|
33
33
|
case "todo.restore":
|
|
34
34
|
return blocked("restore returns the item to the Inbox, which is outside the active scope");
|
|
35
|
-
case "todo.add-logged":
|
|
36
|
-
// A logged to-do is created loose in the Logbook with no container — it
|
|
37
|
-
// would land outside the scope and cannot be redirected (the operation
|
|
38
|
-
// has no destination parameter). Fail closed.
|
|
39
|
-
return blocked("a logged to-do is created loose in the Logbook and cannot be placed into the active scope");
|
|
40
35
|
default:
|
|
41
36
|
break;
|
|
42
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-guard.js","sourceRoot":"","sources":["../../src/write/scope-guard.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAsB,MAAM,kBAAkB,CAAC;AAMrE,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AAC3E,MAAM,oBAAoB,GAAG,qCAAqC,CAAC;AAEnE,SAAS,OAAO,CAAC,MAAc,EAAE,WAAW,GAAG,kBAAkB;IAC/D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAClD,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAAC,KAAoB,EAAE,QAAgB;IACzD,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC;AACvF,CAAC;AAED,6FAA6F;AAC7F,SAAS,OAAO;IACd,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAgB,EAChB,EAAiB,EACjB,MAA+B,EAC/B,GAAa,EACb,KAAoB;IAEpB,6EAA6E;IAC7E,uEAAuE;IACvE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,2DAA2D,CAAC,CAAC;QAC9E,KAAK,aAAa,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,OAAO,CACZ,mFAAmF,CACpF,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO,OAAO,CAAC,6DAA6D,CAAC,CAAC;QAChF,KAAK,aAAa;YAChB,OAAO,OAAO,CACZ,iHAAiH,CAClH,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,OAAO,CACZ,yGAAyG,CAC1G,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,OAAO,CACZ,4GAA4G,CAC7G,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO,OAAO,CAAC,0EAA0E,CAAC,CAAC;QAC7F
|
|
1
|
+
{"version":3,"file":"scope-guard.js","sourceRoot":"","sources":["../../src/write/scope-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/write/undo.d.ts
CHANGED
|
@@ -129,12 +129,6 @@ export declare function scanAuditIntegrity(records: AuditRecord[]): AuditIntegri
|
|
|
129
129
|
* `undo:<actor>` record — those are excluded from undoability entirely.
|
|
130
130
|
*/
|
|
131
131
|
export declare function selectUndoTargets(records: AuditRecord[], selector?: UndoSelector): AuditRecord[];
|
|
132
|
-
/**
|
|
133
|
-
* Operations with NO validated inverse surface — reported irreversible on
|
|
134
|
-
* sight, before any per-record analysis. The reversibility matrix cross-checks
|
|
135
|
-
* that these keys are EXACTLY the ops classed `irreversible` in
|
|
136
|
-
* `reversibility.ts`, so the two catalogs cannot drift.
|
|
137
|
-
*/
|
|
138
132
|
export declare const IRREVERSIBLE: Partial<Record<string, string>>;
|
|
139
133
|
/**
|
|
140
134
|
* Build the inverse plan for one audit record. Pure — unit-testable.
|
package/dist/write/undo.js
CHANGED
|
@@ -191,6 +191,20 @@ function filterRecordsByScope(db, scope, records) {
|
|
|
191
191
|
* that these keys are EXACTLY the ops classed `irreversible` in
|
|
192
192
|
* `reversibility.ts`, so the two catalogs cannot drift.
|
|
193
193
|
*/
|
|
194
|
+
/**
|
|
195
|
+
* Ops whose SUMMARY record heads a resolution-timestamp composite (the flip-dance
|
|
196
|
+
* legs of complete/cancel/update `--completed-at`). planUndo replays their legs
|
|
197
|
+
* in reverse; a leg record of the same op is a plain mutation (no summary role)
|
|
198
|
+
* and takes its ordinary case below.
|
|
199
|
+
*/
|
|
200
|
+
const RESOLUTION_COMPOSITE_OPS = new Set([
|
|
201
|
+
"todo.complete",
|
|
202
|
+
"todo.cancel",
|
|
203
|
+
"todo.update",
|
|
204
|
+
"project.complete",
|
|
205
|
+
"project.cancel",
|
|
206
|
+
"project.update",
|
|
207
|
+
]);
|
|
194
208
|
export const IRREVERSIBLE = {
|
|
195
209
|
"area.delete": "areas are deleted permanently — there is nothing to restore (A25)",
|
|
196
210
|
"tag.delete": "tags are deleted permanently — assignments already cascaded (A26)",
|
|
@@ -496,11 +510,33 @@ export function planUndo(record, now, allRecords = [], current) {
|
|
|
496
510
|
if (fixed !== undefined)
|
|
497
511
|
return irreversible(fixed);
|
|
498
512
|
const uuid = record.uuid;
|
|
513
|
+
// A resolution-timestamp composite (complete/cancel/update `--completed-at`
|
|
514
|
+
// with its flip-dance): the summary record heads a txn whose legs are ordinary
|
|
515
|
+
// undoable ops (complete/cancel/reopen/set-dates). Replay each leg's inverse in
|
|
516
|
+
// reverse order — the cancel/complete inverses no-op where the leg started
|
|
517
|
+
// already-resolved, so a flip-dance backdate cleanly reverses to the captured
|
|
518
|
+
// original stopDate while keeping the item's lifecycle state.
|
|
519
|
+
if (record.txn?.role === "summary" && RESOLUTION_COMPOSITE_OPS.has(record.op)) {
|
|
520
|
+
const legs = allRecords.filter((r) => r.txn?.id === record.txn?.id && r.txn?.role === "leg" && r.result === "ok");
|
|
521
|
+
if (legs.length === 0)
|
|
522
|
+
return irreversible("the composite's legs were not recorded");
|
|
523
|
+
const steps = [];
|
|
524
|
+
for (const leg of legs.toReversed()) {
|
|
525
|
+
const legPlan = planUndo(leg, now, allRecords);
|
|
526
|
+
if (legPlan.kind === "invertible")
|
|
527
|
+
steps.push(...legPlan.steps);
|
|
528
|
+
else
|
|
529
|
+
notes.push(`leg ${leg.op} (${leg.uuid ?? "?"}) is not invertible: skipped`);
|
|
530
|
+
}
|
|
531
|
+
if (steps.length === 0)
|
|
532
|
+
return irreversible("no composite leg was invertible");
|
|
533
|
+
notes.push(`replays ${legs.length} resolution leg(s) in reverse`);
|
|
534
|
+
return { target, kind: "invertible", steps, notes };
|
|
535
|
+
}
|
|
499
536
|
switch (record.op) {
|
|
500
537
|
// Creations: the inverse is deleting what appeared. To-dos/projects go
|
|
501
538
|
// to the Trash (restorable); areas/tags delete PERMANENTLY (ack needed).
|
|
502
539
|
case "todo.add":
|
|
503
|
-
case "todo.add-logged":
|
|
504
540
|
case "todo.duplicate": {
|
|
505
541
|
if (uuid === null)
|
|
506
542
|
return irreversible("the created uuid was never discovered");
|
|
@@ -949,12 +985,16 @@ export function planUndo(record, now, allRecords = [], current) {
|
|
|
949
985
|
}
|
|
950
986
|
return irreversible("the pre-op area was not captured");
|
|
951
987
|
}
|
|
952
|
-
case "todo.
|
|
988
|
+
case "todo.set-dates":
|
|
989
|
+
case "project.set-dates": {
|
|
953
990
|
if (uuid === null)
|
|
954
991
|
return irreversible("no target uuid recorded");
|
|
955
992
|
const patch = { uuid };
|
|
956
993
|
const stoppedPre = preField(record, "stoppedDate");
|
|
957
994
|
const createdPre = preField(record, "createdDate");
|
|
995
|
+
// Only restore the completion date onto a row that is STILL completed —
|
|
996
|
+
// the generalized WG-7 guard would refuse (and re-completing is wrong)
|
|
997
|
+
// otherwise. A creation-date restore is status-safe.
|
|
958
998
|
if (typeof stoppedPre === "string")
|
|
959
999
|
patch["completionDate"] = stoppedPre;
|
|
960
1000
|
if (typeof createdPre === "string")
|
|
@@ -964,7 +1004,7 @@ export function planUndo(record, now, allRecords = [], current) {
|
|
|
964
1004
|
}
|
|
965
1005
|
notes.push("timestamps restore at DAY precision (noon local) — the original sub-day time is " +
|
|
966
1006
|
"not recoverable");
|
|
967
|
-
return { target, kind: "invertible", steps: [{ op:
|
|
1007
|
+
return { target, kind: "invertible", steps: [{ op: record.op, params: patch }], notes };
|
|
968
1008
|
}
|
|
969
1009
|
case "todo.set-tags": {
|
|
970
1010
|
if (uuid === null)
|
|
@@ -1431,7 +1471,7 @@ const AXIS_LABEL = {
|
|
|
1431
1471
|
* these axes rely on the inverse's own verified read-after-write instead):
|
|
1432
1472
|
* - REPEAT rule / paused state (reschedule-repeat, pause/resume-repeat): the
|
|
1433
1473
|
* repeat axis is out of this guard's scope.
|
|
1434
|
-
* - todo.
|
|
1474
|
+
* - todo/project.set-dates timestamps (creation/completion date).
|
|
1435
1475
|
* - reorder / area.reorder RANKS: the inverse is a 3-way restore that already
|
|
1436
1476
|
* leaves non-targeted members in place; a rank precondition is not modeled.
|
|
1437
1477
|
* - area.update / tag.update fields: those steps address by `target`, not
|