things-api 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -0
  3. package/bin/things.js +9 -0
  4. package/dist/audit/log.d.ts +10 -0
  5. package/dist/audit/log.js +31 -0
  6. package/dist/audit/log.js.map +1 -0
  7. package/dist/audit/schema.d.ts +37 -0
  8. package/dist/audit/schema.js +9 -0
  9. package/dist/audit/schema.js.map +1 -0
  10. package/dist/cli/commands/doctor.d.ts +9 -0
  11. package/dist/cli/commands/doctor.js +60 -0
  12. package/dist/cli/commands/doctor.js.map +1 -0
  13. package/dist/cli/commands/mcp.d.ts +7 -0
  14. package/dist/cli/commands/mcp.js +26 -0
  15. package/dist/cli/commands/mcp.js.map +1 -0
  16. package/dist/cli/commands/project.d.ts +5 -0
  17. package/dist/cli/commands/project.js +50 -0
  18. package/dist/cli/commands/project.js.map +1 -0
  19. package/dist/cli/commands/reads.d.ts +21 -0
  20. package/dist/cli/commands/reads.js +295 -0
  21. package/dist/cli/commands/reads.js.map +1 -0
  22. package/dist/cli/commands/snapshot.d.ts +7 -0
  23. package/dist/cli/commands/snapshot.js +22 -0
  24. package/dist/cli/commands/snapshot.js.map +1 -0
  25. package/dist/cli/commands/todo.d.ts +6 -0
  26. package/dist/cli/commands/todo.js +43 -0
  27. package/dist/cli/commands/todo.js.map +1 -0
  28. package/dist/cli/commands/writes.d.ts +9 -0
  29. package/dist/cli/commands/writes.js +994 -0
  30. package/dist/cli/commands/writes.js.map +1 -0
  31. package/dist/cli/exit-codes.d.ts +26 -0
  32. package/dist/cli/exit-codes.js +26 -0
  33. package/dist/cli/exit-codes.js.map +1 -0
  34. package/dist/cli/main.d.ts +4 -0
  35. package/dist/cli/main.js +73 -0
  36. package/dist/cli/main.js.map +1 -0
  37. package/dist/cli/output.d.ts +42 -0
  38. package/dist/cli/output.js +16 -0
  39. package/dist/cli/output.js.map +1 -0
  40. package/dist/cli/style.d.ts +6 -0
  41. package/dist/cli/style.js +25 -0
  42. package/dist/cli/style.js.map +1 -0
  43. package/dist/client.d.ts +184 -0
  44. package/dist/client.js +187 -0
  45. package/dist/client.js.map +1 -0
  46. package/dist/config.d.ts +31 -0
  47. package/dist/config.js +76 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/contracts.d.ts +79 -0
  50. package/dist/contracts.js +46 -0
  51. package/dist/contracts.js.map +1 -0
  52. package/dist/db/baselines/db-v26.d.ts +8 -0
  53. package/dist/db/baselines/db-v26.js +16 -0
  54. package/dist/db/baselines/db-v26.js.map +1 -0
  55. package/dist/db/baselines/index.d.ts +3 -0
  56. package/dist/db/baselines/index.js +4 -0
  57. package/dist/db/baselines/index.js.map +1 -0
  58. package/dist/db/connection.d.ts +22 -0
  59. package/dist/db/connection.js +40 -0
  60. package/dist/db/connection.js.map +1 -0
  61. package/dist/db/fingerprint.d.ts +42 -0
  62. package/dist/db/fingerprint.js +82 -0
  63. package/dist/db/fingerprint.js.map +1 -0
  64. package/dist/db/locate.d.ts +13 -0
  65. package/dist/db/locate.js +44 -0
  66. package/dist/db/locate.js.map +1 -0
  67. package/dist/db/schema.d.ts +37 -0
  68. package/dist/db/schema.js +81 -0
  69. package/dist/db/schema.js.map +1 -0
  70. package/dist/diagnose.d.ts +67 -0
  71. package/dist/diagnose.js +143 -0
  72. package/dist/diagnose.js.map +1 -0
  73. package/dist/index.d.ts +46 -0
  74. package/dist/index.js +23 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/mcp/server.d.ts +8 -0
  77. package/dist/mcp/server.js +1002 -0
  78. package/dist/mcp/server.js.map +1 -0
  79. package/dist/model/dates.d.ts +38 -0
  80. package/dist/model/dates.js +104 -0
  81. package/dist/model/dates.js.map +1 -0
  82. package/dist/model/entities.d.ts +117 -0
  83. package/dist/model/entities.js +21 -0
  84. package/dist/model/entities.js.map +1 -0
  85. package/dist/model/mappers.d.ts +55 -0
  86. package/dist/model/mappers.js +105 -0
  87. package/dist/model/mappers.js.map +1 -0
  88. package/dist/model/occurrences.d.ts +46 -0
  89. package/dist/model/occurrences.js +164 -0
  90. package/dist/model/occurrences.js.map +1 -0
  91. package/dist/model/recurrence.d.ts +52 -0
  92. package/dist/model/recurrence.js +164 -0
  93. package/dist/model/recurrence.js.map +1 -0
  94. package/dist/paths.d.ts +6 -0
  95. package/dist/paths.js +30 -0
  96. package/dist/paths.js.map +1 -0
  97. package/dist/read/detail.d.ts +8 -0
  98. package/dist/read/detail.js +34 -0
  99. package/dist/read/detail.js.map +1 -0
  100. package/dist/read/project-view.d.ts +34 -0
  101. package/dist/read/project-view.js +87 -0
  102. package/dist/read/project-view.js.map +1 -0
  103. package/dist/read/queries.d.ts +39 -0
  104. package/dist/read/queries.js +134 -0
  105. package/dist/read/queries.js.map +1 -0
  106. package/dist/read/snapshot.d.ts +25 -0
  107. package/dist/read/snapshot.js +39 -0
  108. package/dist/read/snapshot.js.map +1 -0
  109. package/dist/read/tags.d.ts +17 -0
  110. package/dist/read/tags.js +64 -0
  111. package/dist/read/tags.js.map +1 -0
  112. package/dist/read/views.d.ts +152 -0
  113. package/dist/read/views.js +322 -0
  114. package/dist/read/views.js.map +1 -0
  115. package/dist/surface-copy.d.ts +15 -0
  116. package/dist/surface-copy.js +16 -0
  117. package/dist/surface-copy.js.map +1 -0
  118. package/dist/write/automation-probe.d.ts +12 -0
  119. package/dist/write/automation-probe.js +59 -0
  120. package/dist/write/automation-probe.js.map +1 -0
  121. package/dist/write/batch.d.ts +51 -0
  122. package/dist/write/batch.js +97 -0
  123. package/dist/write/batch.js.map +1 -0
  124. package/dist/write/capabilities.d.ts +16 -0
  125. package/dist/write/capabilities.js +16 -0
  126. package/dist/write/capabilities.js.map +1 -0
  127. package/dist/write/commands.d.ts +32 -0
  128. package/dist/write/commands.js +1274 -0
  129. package/dist/write/commands.js.map +1 -0
  130. package/dist/write/environment.d.ts +29 -0
  131. package/dist/write/environment.js +105 -0
  132. package/dist/write/environment.js.map +1 -0
  133. package/dist/write/experimental.d.ts +7 -0
  134. package/dist/write/experimental.js +39 -0
  135. package/dist/write/experimental.js.map +1 -0
  136. package/dist/write/failure-hints.d.ts +32 -0
  137. package/dist/write/failure-hints.js +71 -0
  138. package/dist/write/failure-hints.js.map +1 -0
  139. package/dist/write/guards.d.ts +21 -0
  140. package/dist/write/guards.js +312 -0
  141. package/dist/write/guards.js.map +1 -0
  142. package/dist/write/lock.d.ts +10 -0
  143. package/dist/write/lock.js +70 -0
  144. package/dist/write/lock.js.map +1 -0
  145. package/dist/write/operations.d.ts +262 -0
  146. package/dist/write/operations.js +34 -0
  147. package/dist/write/operations.js.map +1 -0
  148. package/dist/write/pipeline.d.ts +90 -0
  149. package/dist/write/pipeline.js +375 -0
  150. package/dist/write/pipeline.js.map +1 -0
  151. package/dist/write/planner.d.ts +40 -0
  152. package/dist/write/planner.js +57 -0
  153. package/dist/write/planner.js.map +1 -0
  154. package/dist/write/pre-state.d.ts +125 -0
  155. package/dist/write/pre-state.js +299 -0
  156. package/dist/write/pre-state.js.map +1 -0
  157. package/dist/write/reopen.d.ts +29 -0
  158. package/dist/write/reopen.js +63 -0
  159. package/dist/write/reopen.js.map +1 -0
  160. package/dist/write/reorder.d.ts +19 -0
  161. package/dist/write/reorder.js +285 -0
  162. package/dist/write/reorder.js.map +1 -0
  163. package/dist/write/undo.d.ts +53 -0
  164. package/dist/write/undo.js +703 -0
  165. package/dist/write/undo.js.map +1 -0
  166. package/dist/write/vectors/applescript.d.ts +5 -0
  167. package/dist/write/vectors/applescript.js +216 -0
  168. package/dist/write/vectors/applescript.js.map +1 -0
  169. package/dist/write/vectors/registry.d.ts +2 -0
  170. package/dist/write/vectors/registry.js +11 -0
  171. package/dist/write/vectors/registry.js.map +1 -0
  172. package/dist/write/vectors/types.d.ts +48 -0
  173. package/dist/write/vectors/types.js +2 -0
  174. package/dist/write/vectors/types.js.map +1 -0
  175. package/dist/write/vectors/url-scheme.d.ts +3 -0
  176. package/dist/write/vectors/url-scheme.js +176 -0
  177. package/dist/write/vectors/url-scheme.js.map +1 -0
  178. package/dist/write/verify/delta.d.ts +126 -0
  179. package/dist/write/verify/delta.js +281 -0
  180. package/dist/write/verify/delta.js.map +1 -0
  181. package/dist/write/verify/poller.d.ts +24 -0
  182. package/dist/write/verify/poller.js +28 -0
  183. package/dist/write/verify/poller.js.map +1 -0
  184. package/package.json +52 -0
@@ -0,0 +1,295 @@
1
+ import { openThings } from "../../client.js";
2
+ import { ThingsDbNotFoundError } from "../../db/locate.js";
3
+ import { ThingsDbOpenError } from "../../db/connection.js";
4
+ import { isTodayMember } from "../../read/views.js";
5
+ import { bold, cyan, dim, magenta, red, yellow } from "../style.js";
6
+ import { errorEnvelope, ExitCode, okEnvelope } from "../../contracts.js";
7
+ export function withClient(opts, kind, fn, render) {
8
+ const started = Date.now();
9
+ let client = null;
10
+ try {
11
+ client = openThings(opts.db ? { dbPath: opts.db } : {});
12
+ const fp = client.fingerprint();
13
+ const data = fn(client);
14
+ const meta = {
15
+ dbVersion: fp.observation.databaseVersion,
16
+ fingerprint: fp.kind === "ok" ? "ok" : fp.kind === "drift" ? "drift" : "unknown",
17
+ elapsedMs: Date.now() - started,
18
+ };
19
+ if (fp.kind !== "ok") {
20
+ process.stderr.write(`warning: schema fingerprint ${meta.fingerprint} — reads best-effort, writes disabled (run \`things doctor\`)\n`);
21
+ }
22
+ if (opts.json) {
23
+ process.stdout.write(`${JSON.stringify(okEnvelope(kind, data, meta))}\n`);
24
+ }
25
+ else {
26
+ process.stdout.write(`${render(data).join("\n")}\n`);
27
+ }
28
+ process.exitCode = ExitCode.Ok;
29
+ }
30
+ catch (err) {
31
+ const meta = {
32
+ dbVersion: null,
33
+ fingerprint: "unknown",
34
+ elapsedMs: Date.now() - started,
35
+ };
36
+ const isEnv = err instanceof ThingsDbNotFoundError || err instanceof ThingsDbOpenError;
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ if (opts.json) {
39
+ process.stdout.write(`${JSON.stringify(errorEnvelope({ code: isEnv ? "environment" : "unexpected", message }, meta))}\n`);
40
+ }
41
+ else {
42
+ process.stderr.write(`error: ${message}\n`);
43
+ }
44
+ process.exitCode = isEnv ? ExitCode.Environment : ExitCode.Unexpected;
45
+ }
46
+ finally {
47
+ client?.close();
48
+ }
49
+ }
50
+ /**
51
+ * One item line: `<uuid> <marker> [meta …] <title> (container)`. The uuid
52
+ * column pads to `uuidWidth` (uuids vary 21–22 chars) so the marker column
53
+ * aligns; exactly one space separates every following token. Meta tokens are
54
+ * colorized on a TTY only (see ../style.ts) — piped output stays plain.
55
+ */
56
+ export function formatItem(item, uuidWidth = 0) {
57
+ const marker = (item.type === "project" ? "P" : "-") + (item.repeating.isTemplate ? "↻" : "");
58
+ const meta = [
59
+ item.deadline ? red(`!${item.deadline}`) : null,
60
+ item.startDate ? yellow(`@${item.startDate}`) : null,
61
+ item.tags.length > 0 ? cyan(`#${item.tags.map((t) => t.title).join(",#")}`) : null,
62
+ item.status !== "open" ? magenta(`[${item.status}]`) : null,
63
+ ].filter((s) => s !== null);
64
+ const context = item.type === "to-do" && item.project
65
+ ? ` (${item.project.title})`
66
+ : item.area
67
+ ? ` (${item.area.title})`
68
+ : "";
69
+ return [
70
+ `${dim(item.uuid.padEnd(uuidWidth))} `,
71
+ marker,
72
+ ...meta,
73
+ context === "" ? item.title : `${item.title}${dim(context)}`,
74
+ ].join(" ");
75
+ }
76
+ function uuidWidth(items) {
77
+ return items.reduce((w, i) => Math.max(w, i.uuid.length), 0);
78
+ }
79
+ function renderList(items) {
80
+ const w = uuidWidth(items);
81
+ return items.length === 0 ? ["(empty)"] : items.map((i) => formatItem(i, w));
82
+ }
83
+ /**
84
+ * Sidebar-grouped views (anytime/someday): the area-less block renders
85
+ * headerless first, then one `── <area> ──` header per area, mirroring the
86
+ * app's layout. `star` prefixes each line with the Today-membership star.
87
+ */
88
+ function renderSections(sections, star = false) {
89
+ const all = sections.flatMap((s) => s.items);
90
+ if (all.length === 0)
91
+ return ["(empty)"];
92
+ const w = uuidWidth(all);
93
+ const lines = [];
94
+ for (const section of sections) {
95
+ if (section.area !== null)
96
+ lines.push(bold(`── ${section.area.title} ──`));
97
+ for (const item of section.items) {
98
+ const prefix = star ? `${isTodayMember(item) ? yellow("★") : " "} ` : "";
99
+ lines.push(`${prefix}${formatItem(item, w)}`);
100
+ }
101
+ }
102
+ return lines;
103
+ }
104
+ export function registerReadCommands(program) {
105
+ const listCommands = [
106
+ {
107
+ name: "today",
108
+ description: "The Today list, split into Today and This Evening (evening expires daily), with the sidebar badge split (red = deadline due/overdue)",
109
+ fetch: (c, tag, exactTag) => c.read.today(tag === undefined ? undefined : { tag, ...(exactTag === true && { exactTag }) }),
110
+ render: (data) => [
111
+ `── Today (badge: ${data.badge.dueOrOverdue} due/overdue · ${data.badge.other} other) ──`,
112
+ ...renderList(data.today),
113
+ "── This Evening ──",
114
+ ...renderList(data.evening),
115
+ ],
116
+ },
117
+ {
118
+ name: "inbox",
119
+ description: "Unprocessed captures (Inbox)",
120
+ fetch: (c, tag, exactTag) => c.read.inbox(tag === undefined ? undefined : { tag, ...(exactTag === true && { exactTag }) }),
121
+ },
122
+ {
123
+ name: "anytime",
124
+ description: "All active items in the UI's sidebar-mirroring order (area-less first, then per " +
125
+ "area: direct to-dos, then each project with its members). Today members are " +
126
+ "starred (★). Children of someday/future-scheduled projects are excluded — the " +
127
+ "project row represents them",
128
+ fetch: (c, tag, exactTag) => c.read.anytime(tag === undefined ? undefined : { tag, ...(exactTag === true && { exactTag }) }),
129
+ render: (sections) => renderSections(sections, true),
130
+ },
131
+ {
132
+ name: "someday",
133
+ description: "Someday items (incubated, undated) in sidebar order. Project children are " +
134
+ "represented by their project row; --active-project-items also lists someday " +
135
+ "to-dos inside active projects (the UI's 'Show items from active projects' toggle)",
136
+ fetch: (c, tag, exactTag, activeProjectItems) => c.read.someday({
137
+ ...(tag !== undefined && { tag }),
138
+ ...(exactTag === true && { exactTag }),
139
+ ...(activeProjectItems === true && { activeProjectItems }),
140
+ }),
141
+ render: (sections) => renderSections(sections),
142
+ extraOption: [
143
+ "--active-project-items",
144
+ "also list someday to-dos inside active projects",
145
+ "activeProjectItems",
146
+ ],
147
+ },
148
+ ];
149
+ for (const cmd of listCommands) {
150
+ const command = program
151
+ .command(cmd.name)
152
+ .description(cmd.description)
153
+ .option("--tag <ref>", "filter by tag (uuid or unique name): direct, inherited, or descendant-tagged")
154
+ .option("--exact-tag", "match the named tag only — exclude hierarchy descendants")
155
+ .option("--json", "emit versioned JSON envelope on stdout")
156
+ .option("--db <path>", "explicit database path");
157
+ if (cmd.extraOption)
158
+ command.option(cmd.extraOption[0], cmd.extraOption[1]);
159
+ command.action((opts) => {
160
+ const extra = cmd.extraOption ? opts[cmd.extraOption[2]] === true : undefined;
161
+ withClient(opts, cmd.name, (c) => cmd.fetch(c, opts.tag, opts.exactTag, extra), (cmd.render ?? renderList));
162
+ });
163
+ }
164
+ program
165
+ .command("upcoming")
166
+ .description("Future-scheduled items in date order, INCLUDING each repeating item's next " +
167
+ "occurrence (↻ marker; deadline derived from the repeat rule). --horizon <n> also " +
168
+ "PROJECTS the following n-1 occurrences per repeating item from its decoded rule " +
169
+ "(fixed rules only, max 10) — projections are host math the app has not " +
170
+ "materialized yet.")
171
+ .option("--tag <ref>", "filter by tag (uuid or unique name): direct, inherited, or descendant-tagged")
172
+ .option("--exact-tag", "match the named tag only — exclude hierarchy descendants")
173
+ .option("--horizon <n>", "occurrences per repeating item (default 1 = UI parity)")
174
+ .option("--json", "emit versioned JSON envelope on stdout")
175
+ .option("--db <path>", "explicit database path")
176
+ .action((opts) => {
177
+ withClient(opts, "upcoming", (c) => c.read.upcoming({
178
+ ...(opts.tag !== undefined && { tag: opts.tag }),
179
+ ...(opts.exactTag === true && { exactTag: true }),
180
+ ...(opts.horizon !== undefined && { horizon: Number(opts.horizon) }),
181
+ }), renderList);
182
+ });
183
+ for (const cmd of [
184
+ {
185
+ name: "logbook",
186
+ description: "Completed and canceled items, most recent first",
187
+ fetch: (c, limit, tag, exactTag) => c.read.logbook({
188
+ limit,
189
+ ...(tag !== undefined && { tag }),
190
+ ...(exactTag === true && { exactTag }),
191
+ }),
192
+ defaultLimit: 100,
193
+ },
194
+ {
195
+ name: "trash",
196
+ description: "Trashed items (trashed=1 flag, any status), most recently modified first",
197
+ fetch: (c, limit, _tag, _exactTag) => c.read.trash({ limit }),
198
+ defaultLimit: 200,
199
+ },
200
+ ]) {
201
+ program
202
+ .command(cmd.name)
203
+ .description(cmd.description)
204
+ .option("--limit <n>", "maximum items to return", String(cmd.defaultLimit))
205
+ .option("--tag <ref>", "filter by tag (uuid or unique name), direct OR inherited — logbook only")
206
+ .option("--exact-tag", "match the named tag only — exclude hierarchy descendants")
207
+ .option("--json", "emit versioned JSON envelope on stdout")
208
+ .option("--db <path>", "explicit database path")
209
+ .action((opts) => {
210
+ withClient(opts, cmd.name, (c) => cmd.fetch(c, Number(opts.limit), opts.tag, opts.exactTag), renderList);
211
+ });
212
+ }
213
+ program
214
+ .command("projects")
215
+ .description("Active projects (optionally scoped to --area <uuid>)")
216
+ .option("--area <uuid>", "filter by area uuid")
217
+ .option("--json", "emit versioned JSON envelope on stdout")
218
+ .option("--db <path>", "explicit database path")
219
+ .action((opts) => {
220
+ withClient(opts, "projects", (c) => c.read.projects(opts.area ? { areaUuid: opts.area } : {}), renderList);
221
+ });
222
+ program
223
+ .command("areas")
224
+ .description("All areas with their direct tags")
225
+ .option("--json", "emit versioned JSON envelope on stdout")
226
+ .option("--db <path>", "explicit database path")
227
+ .action((opts) => {
228
+ withClient(opts, "areas", (c) => c.read.areas(), ((data) => data.map((a) => `${a.uuid} ${a.title}${a.tags.length ? ` #${a.tags.map((t) => t.title).join(" #")}` : ""}`)));
229
+ });
230
+ program
231
+ .command("tags")
232
+ .description("Tag taxonomy (parent → child hierarchy flattened with refs)")
233
+ .option("--json", "emit versioned JSON envelope on stdout")
234
+ .option("--db <path>", "explicit database path")
235
+ .action((opts) => {
236
+ withClient(opts, "tags", (c) => c.read.tags(), ((data) => data.map((t) => `${t.uuid} ${t.parent ? `${t.parent.title}/` : ""}${t.title}`)));
237
+ });
238
+ program
239
+ .command("changes")
240
+ .description("Everything created or modified since a moment (--since), newest first — INCLUDES " +
241
+ "trashed, logged, and repeating-template rows so agents can sync state; check " +
242
+ "trashed/status/repeating on each item. Caveats: tag/area edits and checklist-item " +
243
+ "edits don't bump tasks and are invisible here.")
244
+ .requiredOption("--since <when>", "ISO date/datetime (e.g. 2026-07-05T14:30:00)")
245
+ .option("--limit <n>", "maximum items", "200")
246
+ .option("--json", "emit versioned JSON envelope on stdout")
247
+ .option("--db <path>", "explicit database path")
248
+ .action((opts) => {
249
+ const since = new Date(opts.since);
250
+ if (Number.isNaN(since.getTime())) {
251
+ process.stderr.write(`error: --since is not a parseable date: ${opts.since}\n`);
252
+ process.exitCode = ExitCode.Usage;
253
+ return;
254
+ }
255
+ withClient(opts, "changes", (c) => c.read.changes({ since, limit: Number(opts.limit) }), ((items) => items.length === 0
256
+ ? ["(no changes)"]
257
+ : items.map((i) => `${i.changeKind === "created" ? "+" : "~"} ${formatItem(i)}${i.trashed ? " [trashed]" : ""}`)));
258
+ });
259
+ program
260
+ .command("search <query>")
261
+ .description("Title/notes substring search, most recently modified first. Default scope: OPEN + " +
262
+ "untrashed items only — widen with --logged / --trashed / --all. Scope with " +
263
+ "--project / --area / --tag (tag matches include hierarchy descendants) / --type.")
264
+ .option("--project <ref>", "restrict to one project's children (uuid or unique name)")
265
+ .option("--area <ref>", "restrict to one area's direct members (uuid or unique name)")
266
+ .option("--tag <ref>", "restrict by tag: direct, inherited, or descendant-tagged")
267
+ .option("--exact-tag", "match the named tag only — exclude hierarchy descendants")
268
+ .option("--type <kind>", "todo | project")
269
+ .option("--logged", "include completed/canceled items")
270
+ .option("--trashed", "include trashed items")
271
+ .option("--all", "legacy behavior: everything (open + logged + trashed)")
272
+ .option("--limit <n>", "maximum results", "50")
273
+ .option("--json", "emit versioned JSON envelope on stdout")
274
+ .option("--db <path>", "explicit database path")
275
+ .action((query, opts) => {
276
+ const type = opts["type"];
277
+ if (type !== undefined && type !== "todo" && type !== "project") {
278
+ process.stderr.write("error: --type must be todo or project\n");
279
+ process.exitCode = 2;
280
+ return;
281
+ }
282
+ withClient(opts, "search", (c) => c.read.search(query, {
283
+ limit: Number(opts["limit"] ?? 50),
284
+ ...(opts["project"] !== undefined && { project: opts["project"] }),
285
+ ...(opts["area"] !== undefined && { area: opts["area"] }),
286
+ ...(opts["tag"] !== undefined && { tag: opts["tag"] }),
287
+ ...(opts["exactTag"] === true && { exactTag: true }),
288
+ ...(type !== undefined && { type: type === "todo" ? "to-do" : "project" }),
289
+ ...(opts["logged"] === true && { logged: true }),
290
+ ...(opts["trashed"] === true && { trashed: true }),
291
+ ...(opts["all"] === true && { all: true }),
292
+ }), renderList);
293
+ });
294
+ }
295
+ //# sourceMappingURL=reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reads.js","sourceRoot":"","sources":["../../../src/cli/commands/reads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `things snapshot` — full normalized dump (all rows, all states) for
3
+ * diffing, backup forensics, and the lab harness. Human output shows counts;
4
+ * use --json for the data.
5
+ */
6
+ import type { Command } from "commander";
7
+ export declare function registerSnapshot(program: Command): void;
@@ -0,0 +1,22 @@
1
+ import { withClient } from "./reads.js";
2
+ function renderCounts(snapshot) {
3
+ const c = snapshot.counts;
4
+ return [
5
+ `areas: ${c.areas} tags: ${c.tags}`,
6
+ `todos: ${c.todos} projects: ${c.projects} headings: ${c.headings}`,
7
+ `checklist items: ${c.checklistItems}`,
8
+ `trashed: ${c.trashed} repeating templates: ${c.repeatingTemplates}`,
9
+ `(use --json for the full dump)`,
10
+ ];
11
+ }
12
+ export function registerSnapshot(program) {
13
+ program
14
+ .command("snapshot")
15
+ .description("Full normalized dump of the library: every task row (all types/states incl. repeating templates and trashed), areas, tags, checklist items — uuid-ordered for stable diffs")
16
+ .option("--json", "emit versioned JSON envelope on stdout")
17
+ .option("--db <path>", "explicit database path")
18
+ .action((opts) => {
19
+ withClient(opts, "snapshot", (c) => c.read.snapshot(), renderCounts);
20
+ });
21
+ }
22
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/cli/commands/snapshot.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,SAAS,YAAY,CAAC,QAAkB;IACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC1B,OAAO;QACL,UAAU,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,EAAE;QACpC,UAAU,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ,EAAE;QACrE,oBAAoB,CAAC,CAAC,cAAc,EAAE;QACtC,YAAY,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,kBAAkB,EAAE;QACrE,gCAAgC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CACV,4KAA4K,CAC7K;SACA,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;SAC/C,MAAM,CAAC,CAAC,IAAqC,EAAE,EAAE;QAChD,UAAU,CACR,IAAI,EACJ,UAAU,EACV,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EACxB,YAAsC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `things todo show <uuid>` — full detail for one record, including checklist,
3
+ * inherited tags, and repeating flags (works on templates too).
4
+ */
5
+ import type { Command } from "commander";
6
+ export declare function registerTodoCommands(program: Command): void;
@@ -0,0 +1,43 @@
1
+ import { withClient } from "./reads.js";
2
+ function renderDetail(item) {
3
+ if (!item)
4
+ return ["(not found)"];
5
+ if (item.type === "heading") {
6
+ return [
7
+ `${item.uuid} [heading] ${item.title}`,
8
+ ` project: ${item.project?.title ?? "—"} index: ${item.index}`,
9
+ ];
10
+ }
11
+ const lines = [
12
+ `${item.uuid} [${item.type}] ${item.title}`,
13
+ ` status: ${item.status}${item.trashed ? " (trashed)" : ""} start: ${item.start}`,
14
+ ` when: ${item.startDate ?? "—"}${item.todaySection === "evening" ? " (this evening)" : ""} deadline: ${item.deadline ?? "—"}`,
15
+ ` area: ${item.area?.title ?? "—"}${item.type === "to-do" ? ` project: ${item.project?.title ?? "—"} heading: ${item.heading?.title ?? "—"}` : ""}`,
16
+ ` tags: ${item.tags.map((t) => t.title).join(", ") || "—"} inherited: ${(item.inheritedTags ?? []).map((t) => t.title).join(", ") || "—"}`,
17
+ ];
18
+ if (item.repeating.isTemplate)
19
+ lines.push(" repeating: TEMPLATE (invisible in list views)");
20
+ if (item.repeating.isInstance)
21
+ lines.push(` repeating: instance of ${item.repeating.templateUuid}`);
22
+ if (item.notes)
23
+ lines.push(` notes: ${item.notes.length > 200 ? `${item.notes.slice(0, 200)}…` : item.notes}`);
24
+ if (item.type === "to-do" && item.checklist && item.checklist.length > 0) {
25
+ lines.push(" checklist:");
26
+ for (const c of item.checklist) {
27
+ lines.push(` [${c.status === "completed" ? "x" : c.status === "canceled" ? "~" : " "}] ${c.title}`);
28
+ }
29
+ }
30
+ return lines;
31
+ }
32
+ export function registerTodoCommands(program) {
33
+ const todo = program.command("todo").description("To-do–scoped operations");
34
+ todo
35
+ .command("show <uuid>")
36
+ .description("Full detail for one record by UUID — includes checklist items, inherited tags, and repeating flags; finds records list views hide (templates, trashed)")
37
+ .option("--json", "emit versioned JSON envelope on stdout")
38
+ .option("--db <path>", "explicit database path")
39
+ .action((uuid, opts) => {
40
+ withClient(opts, "todo-detail", (c) => c.read.byUuid(uuid), renderDetail);
41
+ });
42
+ }
43
+ //# sourceMappingURL=todo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo.js","sourceRoot":"","sources":["../../../src/cli/commands/todo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Write commands. Help text is the agent API: every command's --help states
3
+ * its behavior, side effects, and required confirmation flags in consumer
4
+ * voice (docs/design/surface-copy.md) — internals stay in docs/ and the
5
+ * capabilities/dry-run OUTPUT. No interactive prompts: risky semantics
6
+ * require explicit flags.
7
+ */
8
+ import type { Command } from "commander";
9
+ export declare function registerWriteCommands(program: Command): void;