things-api 0.13.0 → 0.15.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 +3 -3
- package/dist/cli/commands/area.d.ts +5 -5
- package/dist/cli/commands/area.js +13 -8
- package/dist/cli/commands/area.js.map +1 -1
- package/dist/cli/commands/project.js +2 -2
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.js +94 -16
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/show.js +6 -2
- 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 +136 -70
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/glyphs.d.ts +9 -2
- package/dist/cli/glyphs.js +20 -15
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.js +4 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/read-driver.d.ts +45 -9
- package/dist/cli/read-driver.js +39 -16
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/render.d.ts +57 -27
- package/dist/cli/render.js +117 -65
- package/dist/cli/render.js.map +1 -1
- package/dist/client.d.ts +127 -38
- package/dist/client.js +86 -22
- package/dist/client.js.map +1 -1
- package/dist/contracts.d.ts +35 -34
- package/dist/contracts.js +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +212 -148
- 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 +61 -39
- package/dist/model/entities.js +0 -4
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.js +24 -43
- package/dist/model/mappers.js.map +1 -1
- package/dist/read/area-filter.d.ts +1 -1
- package/dist/read/area-filter.js +5 -4
- package/dist/read/area-filter.js.map +1 -1
- package/dist/read/area-view.d.ts +0 -11
- package/dist/read/area-view.js +7 -11
- package/dist/read/area-view.js.map +1 -1
- package/dist/read/detail.js +2 -2
- package/dist/read/detail.js.map +1 -1
- package/dist/read/filter-contract.d.ts +1 -1
- package/dist/read/filter-contract.js +3 -0
- package/dist/read/filter-contract.js.map +1 -1
- package/dist/read/log-boundary.d.ts +46 -2
- package/dist/read/log-boundary.js +43 -2
- package/dist/read/log-boundary.js.map +1 -1
- package/dist/read/predicates.d.ts +13 -0
- package/dist/read/predicates.js +13 -0
- package/dist/read/predicates.js.map +1 -1
- package/dist/read/project-view.d.ts +34 -19
- package/dist/read/project-view.js +31 -25
- package/dist/read/project-view.js.map +1 -1
- package/dist/read/scope.d.ts +1 -1
- package/dist/read/scope.js +5 -4
- package/dist/read/scope.js.map +1 -1
- package/dist/read/search-rank.js +2 -2
- package/dist/read/search-rank.js.map +1 -1
- package/dist/read/shape.d.ts +78 -18
- package/dist/read/shape.js +496 -185
- package/dist/read/shape.js.map +1 -1
- package/dist/read/snapshot.js +2 -2
- package/dist/read/snapshot.js.map +1 -1
- package/dist/read/stage.d.ts +31 -13
- package/dist/read/stage.js +28 -11
- package/dist/read/stage.js.map +1 -1
- package/dist/read/truncation.d.ts +75 -2
- package/dist/read/truncation.js +69 -46
- package/dist/read/truncation.js.map +1 -1
- package/dist/read/views.d.ts +81 -18
- package/dist/read/views.js +136 -17
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +6 -0
- package/dist/surface-copy.js +6 -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/clear-reminder.js +3 -1
- package/dist/write/clear-reminder.js.map +1 -1
- package/dist/write/commands.d.ts +25 -1
- package/dist/write/commands.js +350 -134
- package/dist/write/commands.js.map +1 -1
- package/dist/write/guards.js +36 -16
- package/dist/write/guards.js.map +1 -1
- package/dist/write/move.d.ts +26 -5
- package/dist/write/move.js +358 -2
- package/dist/write/move.js.map +1 -1
- package/dist/write/operations.d.ts +50 -19
- package/dist/write/operations.js +3 -2
- package/dist/write/operations.js.map +1 -1
- package/dist/write/pipeline.js +28 -7
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/pre-state.d.ts +89 -28
- package/dist/write/pre-state.js +197 -19
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/reorder.js +52 -5
- 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 +10 -5
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/scope-guard.js +2 -5
- package/dist/write/scope-guard.js.map +1 -1
- package/dist/write/undo.d.ts +1 -7
- package/dist/write/undo.js +63 -16
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/applescript.js +23 -4
- package/dist/write/vectors/applescript.js.map +1 -1
- package/dist/write/vectors/simulator.js +210 -9
- package/dist/write/vectors/simulator.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 +71 -12
- package/dist/write/verify/delta.js +94 -12
- package/dist/write/verify/delta.js.map +1 -1
- package/package.json +1 -1
- package/schema/envelope.schema.json +19 -70
- package/skills/things-cli/SKILL.md +13 -9
- package/skills/things-cli/references/contracts.md +3 -4
- package/skills/things-cli/references/{model.md → data-model.md} +10 -8
- package/skills/things-cli/references/ordering.md +18 -7
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type MutationResult, type WriteDeps, type WriteOptions } from "./pipeline.ts";
|
|
2
|
+
export type ResolutionKind = "todo" | "project";
|
|
3
|
+
export type CompleteChildren = "require-resolved" | "auto-complete";
|
|
4
|
+
export type CancelChildren = "require-resolved" | "auto-cancel";
|
|
5
|
+
/**
|
|
6
|
+
* `complete [--completed-at]` for both kinds (plan §2). No timestamp → a single
|
|
7
|
+
* plain `complete` (unchanged). With a timestamp → reach completed (if not
|
|
8
|
+
* already), then AS-backdate the completed row.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runCompleteWithDate(deps: WriteDeps, kind: ResolutionKind, ref: string, args: {
|
|
11
|
+
completedAt?: string;
|
|
12
|
+
children?: CompleteChildren;
|
|
13
|
+
}, options?: WriteOptions): Promise<MutationResult>;
|
|
14
|
+
/**
|
|
15
|
+
* `cancel [--completed-at]` for both kinds (plan §2). No timestamp → a single
|
|
16
|
+
* plain `cancel`. With a timestamp → end canceled with the backdated stopDate:
|
|
17
|
+
* reach completed (unless already), AS-backdate, then flip back to canceled (the
|
|
18
|
+
* flip-dance). Refuses a project whose transit would strand open children.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runCancelWithDate(deps: WriteDeps, kind: ResolutionKind, ref: string, args: {
|
|
21
|
+
completedAt?: string;
|
|
22
|
+
children?: CancelChildren;
|
|
23
|
+
}, options?: WriteOptions): Promise<MutationResult>;
|
|
24
|
+
/**
|
|
25
|
+
* `update --created-at/--completed-at` for both kinds (plan §2/§3). `--created-at`
|
|
26
|
+
* is a status-safe single AS leg. `--completed-at` edits the timestamp of an
|
|
27
|
+
* ALREADY-resolved item: on a completed item a single AS leg; on a canceled item
|
|
28
|
+
* the 3-leg flip-dance preserving canceled; on an OPEN item it is REFUSED (the
|
|
29
|
+
* open↔resolved boundary belongs to `complete`/`cancel`, not `update`).
|
|
30
|
+
*/
|
|
31
|
+
export declare function runUpdateDates(deps: WriteDeps, kind: ResolutionKind, ref: string, args: {
|
|
32
|
+
createdAt?: string;
|
|
33
|
+
completedAt?: string;
|
|
34
|
+
}, options?: WriteOptions): Promise<MutationResult>;
|
|
@@ -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.completedAt !== undefined ? [`completion=${dates.completedAt}`] : []),
|
|
161
|
+
...(dates.createdAt !== undefined ? [`creation=${dates.createdAt}`] : []),
|
|
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, { completedAt: 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, { completedAt: 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, createdAt: 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
|
+
completedAt: args.completedAt,
|
|
268
|
+
...(args.createdAt !== undefined && { createdAt: 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
|
},
|
|
@@ -217,6 +217,11 @@ export const REVERSIBILITY = {
|
|
|
217
217
|
class: "reversible",
|
|
218
218
|
note: "inverse pauses the project's repeat (UIC2-a): resume clears the paused flag, pause re-sets it",
|
|
219
219
|
},
|
|
220
|
+
// ---- irreversible: the log-move boundary only advances ------------------
|
|
221
|
+
"log-now": {
|
|
222
|
+
class: "irreversible",
|
|
223
|
+
note: "logging moves completed items into the Logbook by advancing the log-move boundary (TMSettings.manualLogDate); no official surface can rewind it (TIMEZ/settings-stamp laws), so there is no inverse. Nothing is deleted — the items simply become logged",
|
|
224
|
+
},
|
|
220
225
|
};
|
|
221
226
|
/** The ops whose class is `irreversible` — must equal undo.ts's IRREVERSIBLE keys. */
|
|
222
227
|
export function irreversibleOps() {
|
|
@@ -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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"}
|
|
@@ -26,17 +26,14 @@ export function evaluateScope(db, op, params, pre, scope) {
|
|
|
26
26
|
return blocked("the sidebar area order is global, above any container scope");
|
|
27
27
|
case "trash.empty":
|
|
28
28
|
return blocked("emptying the Trash permanently deletes every trashed item library-wide, including ones outside the active scope");
|
|
29
|
+
case "log-now":
|
|
30
|
+
return blocked("logging moves every completed item library-wide into the Logbook, including ones outside the active scope");
|
|
29
31
|
case "tag.update":
|
|
30
32
|
return blocked("renaming or re-nesting a tag changes shared state visible to every tagged item across the whole library");
|
|
31
33
|
case "tag.delete":
|
|
32
34
|
return blocked("deleting a tag removes it from items outside the active scope and cascades to its descendants library-wide");
|
|
33
35
|
case "todo.restore":
|
|
34
36
|
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
37
|
default:
|
|
41
38
|
break;
|
|
42
39
|
}
|
|
@@ -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,
|
|
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
|
@@ -24,7 +24,7 @@ export interface UndoStep {
|
|
|
24
24
|
/**
|
|
25
25
|
* STRUCTURAL axes this step overwrites (getField paths into the decoded
|
|
26
26
|
* target: `status`, `trashed`, `project`/`project.uuid`, `area`/`area.uuid`,
|
|
27
|
-
* `heading.uuid`, `start`/`startDate`/`
|
|
27
|
+
* `heading.uuid`, `start`/`startDate`/`today`/`evening`). Before executing,
|
|
28
28
|
* `checkStepPrecondition` verifies the target's CURRENT value on each still
|
|
29
29
|
* equals the recorded `observed` after-value — an out-of-band move/status/
|
|
30
30
|
* schedule change already there blocks rather than being clobbered. Set only
|
|
@@ -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.
|