things-api 0.8.0 → 0.10.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 (238) hide show
  1. package/README.md +31 -11
  2. package/dist/audit/log.js +56 -2
  3. package/dist/audit/log.js.map +1 -1
  4. package/dist/audit/schema.d.ts +26 -8
  5. package/dist/audit/schema.js +42 -1
  6. package/dist/audit/schema.js.map +1 -1
  7. package/dist/cli/commands/area.d.ts +34 -2
  8. package/dist/cli/commands/area.js +140 -28
  9. package/dist/cli/commands/area.js.map +1 -1
  10. package/dist/cli/commands/doctor.d.ts +1 -1
  11. package/dist/cli/commands/doctor.js +44 -5
  12. package/dist/cli/commands/doctor.js.map +1 -1
  13. package/dist/cli/commands/mcp.js +23 -4
  14. package/dist/cli/commands/mcp.js.map +1 -1
  15. package/dist/cli/commands/project.d.ts +23 -1
  16. package/dist/cli/commands/project.js +82 -15
  17. package/dist/cli/commands/project.js.map +1 -1
  18. package/dist/cli/commands/reads.d.ts +6 -125
  19. package/dist/cli/commands/reads.js +649 -657
  20. package/dist/cli/commands/reads.js.map +1 -1
  21. package/dist/cli/commands/repeat-flags.d.ts +20 -0
  22. package/dist/cli/commands/repeat-flags.js +76 -0
  23. package/dist/cli/commands/repeat-flags.js.map +1 -0
  24. package/dist/cli/commands/setup.js +2 -3
  25. package/dist/cli/commands/setup.js.map +1 -1
  26. package/dist/cli/commands/show.d.ts +1 -1
  27. package/dist/cli/commands/show.js +169 -18
  28. package/dist/cli/commands/show.js.map +1 -1
  29. package/dist/cli/commands/snapshot.js +1 -1
  30. package/dist/cli/commands/snapshot.js.map +1 -1
  31. package/dist/cli/commands/todo.d.ts +1 -1
  32. package/dist/cli/commands/todo.js +21 -9
  33. package/dist/cli/commands/todo.js.map +1 -1
  34. package/dist/cli/commands/writes.js +378 -148
  35. package/dist/cli/commands/writes.js.map +1 -1
  36. package/dist/cli/did-you-mean.d.ts +29 -0
  37. package/dist/cli/did-you-mean.js +53 -0
  38. package/dist/cli/did-you-mean.js.map +1 -0
  39. package/dist/cli/excess-args.d.ts +15 -0
  40. package/dist/cli/excess-args.js +51 -0
  41. package/dist/cli/excess-args.js.map +1 -0
  42. package/dist/cli/glyphs.d.ts +67 -7
  43. package/dist/cli/glyphs.js +202 -19
  44. package/dist/cli/glyphs.js.map +1 -1
  45. package/dist/cli/help.d.ts +54 -0
  46. package/dist/cli/help.js +355 -0
  47. package/dist/cli/help.js.map +1 -0
  48. package/dist/cli/main.js +36 -21
  49. package/dist/cli/main.js.map +1 -1
  50. package/dist/cli/period.d.ts +39 -0
  51. package/dist/cli/period.js +141 -0
  52. package/dist/cli/period.js.map +1 -0
  53. package/dist/cli/read-driver.d.ts +83 -0
  54. package/dist/cli/read-driver.js +215 -0
  55. package/dist/cli/read-driver.js.map +1 -0
  56. package/dist/cli/render.d.ts +246 -0
  57. package/dist/cli/render.js +806 -0
  58. package/dist/cli/render.js.map +1 -0
  59. package/dist/cli/resolve-invocation.d.ts +116 -0
  60. package/dist/cli/resolve-invocation.js +261 -0
  61. package/dist/cli/resolve-invocation.js.map +1 -0
  62. package/dist/cli/shell-quote.d.ts +9 -0
  63. package/dist/cli/shell-quote.js +12 -0
  64. package/dist/cli/shell-quote.js.map +1 -0
  65. package/dist/cli/tag-filters.d.ts +59 -0
  66. package/dist/cli/tag-filters.js +57 -0
  67. package/dist/cli/tag-filters.js.map +1 -0
  68. package/dist/cli/verb-hint.d.ts +25 -0
  69. package/dist/cli/verb-hint.js +138 -0
  70. package/dist/cli/verb-hint.js.map +1 -0
  71. package/dist/cli/width.d.ts +135 -0
  72. package/dist/cli/width.js +313 -0
  73. package/dist/cli/width.js.map +1 -0
  74. package/dist/client.d.ts +146 -24
  75. package/dist/client.js +106 -16
  76. package/dist/client.js.map +1 -1
  77. package/dist/config.d.ts +11 -0
  78. package/dist/config.js +3 -0
  79. package/dist/config.js.map +1 -1
  80. package/dist/contracts.d.ts +136 -1
  81. package/dist/contracts.js +44 -1
  82. package/dist/contracts.js.map +1 -1
  83. package/dist/db/fingerprint.d.ts +12 -0
  84. package/dist/db/fingerprint.js +15 -1
  85. package/dist/db/fingerprint.js.map +1 -1
  86. package/dist/db/locate.js +1 -1
  87. package/dist/db/locate.js.map +1 -1
  88. package/dist/diagnose.d.ts +63 -0
  89. package/dist/diagnose.js +38 -1
  90. package/dist/diagnose.js.map +1 -1
  91. package/dist/index.d.ts +30 -4
  92. package/dist/index.js +35 -2
  93. package/dist/index.js.map +1 -1
  94. package/dist/mcp/server.d.ts +9 -1
  95. package/dist/mcp/server.js +850 -128
  96. package/dist/mcp/server.js.map +1 -1
  97. package/dist/model/entities.d.ts +40 -7
  98. package/dist/model/entities.js.map +1 -1
  99. package/dist/model/mappers.d.ts +7 -0
  100. package/dist/model/mappers.js +20 -3
  101. package/dist/model/mappers.js.map +1 -1
  102. package/dist/model/occurrences.d.ts +6 -1
  103. package/dist/model/occurrences.js +9 -5
  104. package/dist/model/occurrences.js.map +1 -1
  105. package/dist/model/recurrence.d.ts +17 -8
  106. package/dist/model/recurrence.js.map +1 -1
  107. package/dist/model/serialize.d.ts +28 -0
  108. package/dist/model/serialize.js +80 -0
  109. package/dist/model/serialize.js.map +1 -0
  110. package/dist/model/when-sugar.d.ts +47 -0
  111. package/dist/model/when-sugar.js +45 -0
  112. package/dist/model/when-sugar.js.map +1 -0
  113. package/dist/read/area-view.d.ts +8 -1
  114. package/dist/read/area-view.js +49 -13
  115. package/dist/read/area-view.js.map +1 -1
  116. package/dist/read/caps.d.ts +14 -0
  117. package/dist/read/caps.js +21 -0
  118. package/dist/read/caps.js.map +1 -0
  119. package/dist/read/filter-contract.d.ts +117 -0
  120. package/dist/read/filter-contract.js +78 -0
  121. package/dist/read/filter-contract.js.map +1 -0
  122. package/dist/read/log-boundary.d.ts +9 -4
  123. package/dist/read/log-boundary.js.map +1 -1
  124. package/dist/read/predicates.d.ts +61 -0
  125. package/dist/read/predicates.js +78 -0
  126. package/dist/read/predicates.js.map +1 -0
  127. package/dist/read/project-view.d.ts +12 -1
  128. package/dist/read/project-view.js +39 -8
  129. package/dist/read/project-view.js.map +1 -1
  130. package/dist/read/queries.d.ts +156 -8
  131. package/dist/read/queries.js +261 -38
  132. package/dist/read/queries.js.map +1 -1
  133. package/dist/read/search-rank.d.ts +36 -0
  134. package/dist/read/search-rank.js +31 -0
  135. package/dist/read/search-rank.js.map +1 -0
  136. package/dist/read/sections.d.ts +51 -0
  137. package/dist/read/sections.js +37 -0
  138. package/dist/read/sections.js.map +1 -0
  139. package/dist/read/show-target.d.ts +13 -4
  140. package/dist/read/show-target.js +11 -2
  141. package/dist/read/show-target.js.map +1 -1
  142. package/dist/read/sidebar-order.d.ts +19 -0
  143. package/dist/read/sidebar-order.js +93 -0
  144. package/dist/read/sidebar-order.js.map +1 -0
  145. package/dist/read/tags.d.ts +27 -3
  146. package/dist/read/tags.js +83 -12
  147. package/dist/read/tags.js.map +1 -1
  148. package/dist/read/truncation.d.ts +71 -0
  149. package/dist/read/truncation.js +217 -0
  150. package/dist/read/truncation.js.map +1 -0
  151. package/dist/read/views.d.ts +177 -19
  152. package/dist/read/views.js +390 -213
  153. package/dist/read/views.js.map +1 -1
  154. package/dist/surface-copy.d.ts +42 -0
  155. package/dist/surface-copy.js +55 -0
  156. package/dist/surface-copy.js.map +1 -1
  157. package/dist/sync-health.d.ts +78 -0
  158. package/dist/sync-health.js +312 -0
  159. package/dist/sync-health.js.map +1 -0
  160. package/dist/write/accessibility-probe.d.ts +12 -0
  161. package/dist/write/accessibility-probe.js +63 -0
  162. package/dist/write/accessibility-probe.js.map +1 -0
  163. package/dist/write/automation-probe.d.ts +7 -0
  164. package/dist/write/automation-probe.js +8 -1
  165. package/dist/write/automation-probe.js.map +1 -1
  166. package/dist/write/batch.js +4 -2
  167. package/dist/write/batch.js.map +1 -1
  168. package/dist/write/capabilities.d.ts +8 -0
  169. package/dist/write/capabilities.js +13 -5
  170. package/dist/write/capabilities.js.map +1 -1
  171. package/dist/write/commands.d.ts +2 -0
  172. package/dist/write/commands.js +562 -48
  173. package/dist/write/commands.js.map +1 -1
  174. package/dist/write/edit-checklist.js +3 -2
  175. package/dist/write/edit-checklist.js.map +1 -1
  176. package/dist/write/guards.d.ts +2 -7
  177. package/dist/write/guards.js +64 -6
  178. package/dist/write/guards.js.map +1 -1
  179. package/dist/write/heading.js +2 -0
  180. package/dist/write/heading.js.map +1 -1
  181. package/dist/write/lock.d.ts +40 -2
  182. package/dist/write/lock.js +91 -14
  183. package/dist/write/lock.js.map +1 -1
  184. package/dist/write/make-repeating-project.d.ts +4 -0
  185. package/dist/write/make-repeating-project.js +253 -0
  186. package/dist/write/make-repeating-project.js.map +1 -0
  187. package/dist/write/operations.d.ts +145 -1
  188. package/dist/write/operations.js +48 -0
  189. package/dist/write/operations.js.map +1 -1
  190. package/dist/write/pipeline.d.ts +19 -0
  191. package/dist/write/pipeline.js +109 -26
  192. package/dist/write/pipeline.js.map +1 -1
  193. package/dist/write/pre-state.d.ts +68 -3
  194. package/dist/write/pre-state.js +102 -3
  195. package/dist/write/pre-state.js.map +1 -1
  196. package/dist/write/reopen.js +3 -2
  197. package/dist/write/reopen.js.map +1 -1
  198. package/dist/write/reorder.js +27 -17
  199. package/dist/write/reorder.js.map +1 -1
  200. package/dist/write/repeat-rule.d.ts +22 -0
  201. package/dist/write/repeat-rule.js +258 -0
  202. package/dist/write/repeat-rule.js.map +1 -0
  203. package/dist/write/reversibility.js +49 -0
  204. package/dist/write/reversibility.js.map +1 -1
  205. package/dist/write/tag-refs.d.ts +47 -0
  206. package/dist/write/tag-refs.js +126 -0
  207. package/dist/write/tag-refs.js.map +1 -0
  208. package/dist/write/undo.d.ts +74 -5
  209. package/dist/write/undo.js +494 -80
  210. package/dist/write/undo.js.map +1 -1
  211. package/dist/write/vectors/registry.d.ts +17 -1
  212. package/dist/write/vectors/registry.js +18 -2
  213. package/dist/write/vectors/registry.js.map +1 -1
  214. package/dist/write/vectors/types.d.ts +119 -3
  215. package/dist/write/vectors/ui-certification.d.ts +48 -0
  216. package/dist/write/vectors/ui-certification.js +46 -0
  217. package/dist/write/vectors/ui-certification.js.map +1 -0
  218. package/dist/write/vectors/ui-drag.d.ts +188 -0
  219. package/dist/write/vectors/ui-drag.js +1095 -0
  220. package/dist/write/vectors/ui-drag.js.map +1 -0
  221. package/dist/write/vectors/ui-recipes.d.ts +70 -0
  222. package/dist/write/vectors/ui-recipes.js +558 -0
  223. package/dist/write/vectors/ui-recipes.js.map +1 -0
  224. package/dist/write/vectors/ui.d.ts +137 -0
  225. package/dist/write/vectors/ui.js +656 -0
  226. package/dist/write/vectors/ui.js.map +1 -0
  227. package/dist/write/verify/delta.d.ts +31 -3
  228. package/dist/write/verify/delta.js +22 -6
  229. package/dist/write/verify/delta.js.map +1 -1
  230. package/dist/write/verify/poller.js +1 -0
  231. package/dist/write/verify/poller.js.map +1 -1
  232. package/package.json +1 -1
  233. package/dist/cli/exit-codes.d.ts +0 -26
  234. package/dist/cli/exit-codes.js +0 -26
  235. package/dist/cli/exit-codes.js.map +0 -1
  236. package/dist/cli/output.d.ts +0 -42
  237. package/dist/cli/output.js +0 -16
  238. package/dist/cli/output.js.map +0 -1
@@ -1,29 +1,107 @@
1
1
  import { q, selectList } from "../db/schema.js";
2
2
  /** Rows that repeat via a template are normal; template rows are invisible in list views. */
3
3
  export const NOT_TEMPLATE = "(t.rt1_recurrenceRule IS NULL AND t.repeater IS NULL)";
4
+ /** ` AND col IN (…)` for the restricted form; empty for the tag-agnostic form. */
5
+ const tagIn = (col, set) => set === null ? "" : ` AND ${col} IN ${set}`;
6
+ /**
7
+ * Clause 1 — the item's OWN direct `TMTaskTag` assignments. Named apart from the
8
+ * rest because it is ALSO the whole story for the CONTAINER `--tag`/`--untagged`
9
+ * projections (see {@link directTagScopeSql} / {@link directUntaggedScopeSql}).
10
+ */
11
+ const DIRECT_TAG_CLAUSE = {
12
+ exists: (set) => `EXISTS (SELECT 1 FROM TMTaskTag tt WHERE tt.tasks = t.uuid${tagIn("tt.tags", set)})`,
13
+ };
14
+ /**
15
+ * The full direct+inherited membership relation, heading → project → area
16
+ * (T18/U18/A13 — the same chain inheritedTagsFor() walks), written ONCE. Clause 1
17
+ * is the direct assignment; clauses 2–6 are the five container-inheritance hops.
18
+ */
19
+ const INHERITANCE_CLAUSES = [
20
+ // 1. the item's own direct tags.
21
+ DIRECT_TAG_CLAUSE,
22
+ // 2. inherited from the item's PROJECT's own direct tags.
23
+ {
24
+ exists: (set) => `EXISTS (SELECT 1 FROM TMTaskTag tt WHERE tt.tasks = t.project${tagIn("tt.tags", set)})`,
25
+ },
26
+ // 3. inherited from the item's AREA's tags.
27
+ {
28
+ exists: (set) => `EXISTS (SELECT 1 FROM TMAreaTag at WHERE at.areas = t.area${tagIn("at.tags", set)})`,
29
+ },
30
+ // 4. inherited from the item's PROJECT's AREA's tags.
31
+ {
32
+ exists: (set) => `EXISTS (SELECT 1 FROM TMTask p JOIN TMAreaTag at ON at.areas = p.area
33
+ WHERE p.uuid = t.project${tagIn("at.tags", set)})`,
34
+ },
35
+ // 5. inherited through the item's HEADING → that heading's project's direct tags.
36
+ {
37
+ exists: (set) => `EXISTS (SELECT 1 FROM TMTask h JOIN TMTaskTag tt ON tt.tasks = h.project
38
+ WHERE h.uuid = t.heading${tagIn("tt.tags", set)})`,
39
+ },
40
+ // 6. inherited through the item's HEADING → its project → that project's AREA's tags.
41
+ {
42
+ exists: (set) => `EXISTS (SELECT 1 FROM TMTask h JOIN TMTask p ON p.uuid = h.project
43
+ JOIN TMAreaTag at ON at.areas = p.area WHERE h.uuid = t.heading${tagIn("at.tags", set)})`,
44
+ },
45
+ ];
46
+ /** A `(?, ?, …)` placeholder list for a tag-uuid set of the given size. */
47
+ const placeholderSet = (uuidCount) => `(${Array.from({ length: uuidCount }, () => "?").join(", ")})`;
4
48
  /**
5
49
  * UI-faithful tag membership for list filtering: direct tag, or inherited
6
- * through the ancestor chain heading → project → area (T18/U18/A13 — the
7
- * same chain inheritedTagsFor() walks). Takes a SET of tag uuids (the target
8
- * plus its hierarchy descendants) each of the six clauses gets the full
9
- * set, so callers bind `uuids.length * 6` values via tagScopeBinds().
50
+ * through the ancestor chain heading → project → area — the OR of every
51
+ * {@link INHERITANCE_CLAUSES} hop. Takes a SET of tag uuids (the target plus its
52
+ * hierarchy descendants); each hop gets the full set, so callers bind
53
+ * `uuids.length * INHERITANCE_CLAUSES.length` values via {@link tagScopeBinds}.
10
54
  */
11
55
  export function tagScopeSql(uuidCount) {
12
- const set = `(${Array.from({ length: uuidCount }, () => "?").join(", ")})`;
13
- return `(
14
- EXISTS (SELECT 1 FROM TMTaskTag tt WHERE tt.tasks = t.uuid AND tt.tags IN ${set})
15
- OR EXISTS (SELECT 1 FROM TMTaskTag tt WHERE tt.tasks = t.project AND tt.tags IN ${set})
16
- OR EXISTS (SELECT 1 FROM TMAreaTag at WHERE at.areas = t.area AND at.tags IN ${set})
17
- OR EXISTS (SELECT 1 FROM TMTask p JOIN TMAreaTag at ON at.areas = p.area
18
- WHERE p.uuid = t.project AND at.tags IN ${set})
19
- OR EXISTS (SELECT 1 FROM TMTask h JOIN TMTaskTag tt ON tt.tasks = h.project
20
- WHERE h.uuid = t.heading AND tt.tags IN ${set})
21
- OR EXISTS (SELECT 1 FROM TMTask h JOIN TMTask p ON p.uuid = h.project
22
- JOIN TMAreaTag at ON at.areas = p.area WHERE h.uuid = t.heading AND at.tags IN ${set})
23
- )`;
56
+ const set = placeholderSet(uuidCount);
57
+ return `(\n ${INHERITANCE_CLAUSES.map((c) => c.exists(set)).join("\n OR ")}\n)`;
24
58
  }
59
+ /**
60
+ * The bind list for {@link tagScopeSql}: the uuid set repeated once per hop, in
61
+ * clause order. Derived from the clause count so the bind multiplicity can never
62
+ * drift from the number of hops the SQL actually emits.
63
+ */
25
64
  export function tagScopeBinds(uuids) {
26
- return Array.from({ length: 6 }, () => uuids).flat();
65
+ return Array.from({ length: INHERITANCE_CLAUSES.length }, () => uuids).flat();
66
+ }
67
+ /**
68
+ * The DIRECT-ONLY projection of {@link tagScopeSql}: {@link DIRECT_TAG_CLAUSE}
69
+ * alone — the item's own `TMTaskTag` assignments — WITHOUT the five container-
70
+ * inheritance hops (project/area/heading). This is the SQL behind the CONTAINER
71
+ * `--tag` (the `project show` / `area show` / `projects` list views): every
72
+ * child inherits its container's tags, so the inheritance-inclusive relation is
73
+ * vacuous there — matching a DIRECT assignment is the useful, GUI-faithful
74
+ * behavior. It keeps tag-hierarchy descendant expansion (the uuid SET is still
75
+ * the tag plus its descendants, OR-matched) but drops container inheritance, so
76
+ * an item matches only when it is DIRECTLY tagged. Takes the uuid set once, so
77
+ * callers bind `uuids` exactly one time (not `× 6`).
78
+ */
79
+ export function directTagScopeSql(uuidCount) {
80
+ return DIRECT_TAG_CLAUSE.exists(placeholderSet(uuidCount));
81
+ }
82
+ /**
83
+ * The negation of tag membership — the SQL behind the `untagged` filter (the
84
+ * GUI's "No Tag"). It negates the SAME {@link INHERITANCE_CLAUSES} relation with
85
+ * the tag-set restriction dropped: "carries ANY tag by any hop", wrapped in NOT.
86
+ * An item is untagged iff NO possible `--tag X` could ever match it — so this
87
+ * negates the whole membership relation, not merely the row's own direct
88
+ * assignments. Takes no binds.
89
+ */
90
+ export function untaggedScopeSql() {
91
+ return `NOT (\n ${INHERITANCE_CLAUSES.map((c) => c.exists(null)).join("\n OR ")}\n)`;
92
+ }
93
+ /**
94
+ * The DIRECT-ONLY counterpart of {@link untaggedScopeSql} — the SQL behind the
95
+ * CONTAINER `--untagged` (the GUI's in-context "No Tag" inside a project/area
96
+ * card). It negates only {@link DIRECT_TAG_CLAUSE} (the item's OWN direct
97
+ * assignments), leaving container inheritance untouched: an item qualifies when
98
+ * it carries no DIRECT tag, even if it inherits one from its project/area/
99
+ * heading. Every child inherits the container's tags, so the whole-relation
100
+ * {@link untaggedScopeSql} would exclude every row there — direct-only is the
101
+ * useful negation. Takes no binds.
102
+ */
103
+ export function directUntaggedScopeSql() {
104
+ return `NOT ${DIRECT_TAG_CLAUSE.exists(null)}`;
27
105
  }
28
106
  /**
29
107
  * A tag plus every hierarchy descendant. Filtering by a parent tag matches
@@ -70,23 +148,61 @@ export function stripThingsUri(ref) {
70
148
  }
71
149
  return s;
72
150
  }
73
- export function resolveTaskUuidPrefix(db, refRaw) {
151
+ /**
152
+ * The single source for uuid-miss not-found copy. Reused by the read-side
153
+ * resolvers, the write guards, and the MCP item lookups so a uuid/partial-uuid
154
+ * that matches nothing reads identically wherever the miss is reported.
155
+ */
156
+ export function noUuidMatch(entity, ref) {
157
+ return `no ${entity} matching uuid or partial-uuid "${ref}"`;
158
+ }
159
+ /**
160
+ * A reference (uuid / partial-uuid / name) that did not resolve to exactly one
161
+ * entity. Extends RangeError so every existing `instanceof RangeError` handler
162
+ * keeps treating it as a usage-class failure — but the surfaces that know about
163
+ * it (CLI --json envelope, MCP tool result) additionally lift the structured
164
+ * `candidates` onto `error.details.candidates` so an agent can self-correct
165
+ * without re-parsing the prose message. `code` mirrors the envelope error code.
166
+ *
167
+ * PUBLIC API — exported from src/index.ts. This is the one error the consumer
168
+ * surfaces catch to render structured disambiguation; its `code`
169
+ * ("not-found" | "ambiguous") and `candidates` ({@link RefCandidate}[]) are the
170
+ * documented machine shape (docs/design/architecture.md, Consumer boundary).
171
+ */
172
+ export class ReferenceResolutionError extends RangeError {
173
+ code;
174
+ ref;
175
+ candidates;
176
+ constructor(message, opts) {
177
+ super(message);
178
+ this.name = "ReferenceResolutionError";
179
+ this.code = opts.code;
180
+ this.ref = opts.ref;
181
+ this.candidates = opts.candidates ?? [];
182
+ }
183
+ }
184
+ export function resolveTaskUuidPrefix(db, refRaw, entity = "to-do") {
74
185
  const ref = stripThingsUri(refRaw);
75
186
  const exact = db.prepare("SELECT uuid FROM TMTask WHERE uuid = ?").get(ref);
76
187
  if (exact !== undefined)
77
188
  return exact.uuid;
78
189
  if (ref.length < 6) {
79
- throw new RangeError(`no record with uuid "${ref}" (prefixes need at least 6 characters)`);
190
+ throw new RangeError(`${noUuidMatch(entity, ref)} (a partial-uuid needs at least 6 characters)`);
80
191
  }
81
192
  const upper = ref.slice(0, -1) + String.fromCharCode(ref.charCodeAt(ref.length - 1) + 1);
82
193
  const rows = db
83
194
  .prepare("SELECT t.uuid, t.title FROM TMTask t WHERE t.uuid >= ? AND t.uuid < ? LIMIT 6")
84
195
  .all(ref, upper);
85
- if (rows.length === 0)
86
- throw new RangeError(`no record with uuid or prefix "${ref}"`);
196
+ if (rows.length === 0) {
197
+ throw new ReferenceResolutionError(noUuidMatch(entity, ref), { code: "not-found", ref });
198
+ }
87
199
  if (rows.length > 1) {
88
200
  const list = rows.map((r) => `${r.uuid} (${r.title ?? ""})`).join("; ");
89
- throw new RangeError(`uuid prefix "${ref}" is ambiguous — matches: ${list}`);
201
+ throw new ReferenceResolutionError(`partial-uuid "${ref}" is ambiguous — matches: ${list}`, {
202
+ code: "ambiguous",
203
+ ref,
204
+ candidates: rows.map((r) => ({ uuid: r.uuid, title: r.title ?? "" })),
205
+ });
90
206
  }
91
207
  return rows[0]?.uuid ?? ref;
92
208
  }
@@ -110,7 +226,7 @@ const BASE62 = /^[0-9A-Za-z]+$/;
110
226
  * ambiguous; no tier is not-found. Shared by the read-side `resolve*Uuid`
111
227
  * throwers and the write-side `resolve*` (ContainerResolution) helpers.
112
228
  */
113
- export function resolveNamedRef(db, table, extraWhere, extraBinds, refRaw) {
229
+ export function resolveNamedRef(db, table, extraWhere, extraBinds, refRaw, options) {
114
230
  const ref = stripThingsUri(refRaw);
115
231
  const sel = (cond, extra = []) => db
116
232
  .prepare(`SELECT uuid, title FROM ${table} WHERE ${extraWhere} AND ${cond}`)
@@ -123,7 +239,7 @@ export function resolveNamedRef(db, table, extraWhere, extraBinds, refRaw) {
123
239
  if (rows.length === 1)
124
240
  return { resolved: rows[0] ?? null, matches: 1 };
125
241
  if (rows.length > 1)
126
- return { resolved: null, matches: rows.length };
242
+ return { resolved: null, matches: rows.length, candidates: rows };
127
243
  }
128
244
  const key = normalizeNameKey(ref);
129
245
  if (key !== "") {
@@ -131,25 +247,84 @@ export function resolveNamedRef(db, table, extraWhere, extraBinds, refRaw) {
131
247
  if (hits.length === 1)
132
248
  return { resolved: hits[0] ?? null, matches: 1 };
133
249
  if (hits.length > 1)
134
- return { resolved: null, matches: hits.length };
250
+ return { resolved: null, matches: hits.length, candidates: hits };
135
251
  }
136
- if (ref.length >= 6 && BASE62.test(ref)) {
252
+ // The uuid-prefix tier is suppressed on the sugar routing path (bare-noun /
253
+ // loose-show): there, a NAME subject resolves through exact/case/normalized
254
+ // only, and the did-you-mean substring fallback supersedes prefix guessing.
255
+ // Typed commands keep the historical tier.
256
+ if (options?.prefixTier !== false && ref.length >= 6 && BASE62.test(ref)) {
137
257
  const upper = ref.slice(0, -1) + String.fromCharCode(ref.charCodeAt(ref.length - 1) + 1);
138
258
  const rows = sel("uuid >= ? AND uuid < ?", [ref, upper]);
139
259
  if (rows.length === 1)
140
260
  return { resolved: rows[0] ?? null, matches: 1 };
141
261
  if (rows.length > 1)
142
- return { resolved: null, matches: rows.length };
262
+ return { resolved: null, matches: rows.length, candidates: rows };
143
263
  }
144
264
  return { resolved: null, matches: 0 };
145
265
  }
146
- function resolveUuidOrThrow(db, table, extraWhere, ref, kind, listCmd) {
147
- const r = resolveNamedRef(db, table, extraWhere, [], ref);
266
+ /** The accepted-forms clause for a name-accepting resolver's not-found copy. */
267
+ function acceptedForms(prefixTier) {
268
+ return prefixTier ? "tried uuid, partial-uuid, and name" : "tried uuid and name";
269
+ }
270
+ function resolveUuidOrThrow(db, table, extraWhere, ref, kind, listCmd, options) {
271
+ const r = resolveNamedRef(db, table, extraWhere, [], ref, options);
272
+ if (r.resolved !== null)
273
+ return r.resolved.uuid;
274
+ if (r.matches === 0) {
275
+ throw new ReferenceResolutionError(`no ${kind} matching "${ref}" — ${acceptedForms(options?.prefixTier !== false)} (list ${kind}s with \`${listCmd}\`)`, { code: "not-found", ref });
276
+ }
277
+ throw new ReferenceResolutionError(`"${ref}" matches ${r.matches} ${kind}s — use the exact name or a uuid`, {
278
+ code: "ambiguous",
279
+ ref,
280
+ candidates: (r.candidates ?? []).map((c) => ({ uuid: c.uuid, title: c.title })),
281
+ });
282
+ }
283
+ /**
284
+ * Resolve a PROJECT write target from a uuid, partial-uuid, or unique name.
285
+ * Project write verbs (`things project update <ref>`, etc.) accept names
286
+ * through this; to-do and heading write targets stay uuid-only.
287
+ *
288
+ * A uuid / unique uuid-prefix resolves FIRST over every task (reusing
289
+ * {@link resolveTaskUuidPrefix}), so a wrong-TYPE id — a to-do uuid handed to a
290
+ * project verb — passes through to the op's own guard, which reports it with a
291
+ * targeted "that is a to-do, not a project" message rather than a misleading
292
+ * not-found. Otherwise the ref resolves as a project NAME through the SAME
293
+ * tiered {@link resolveNamedRef} matching the read side uses (shared core, not
294
+ * a fork) across projects (trashed included, for `project restore`), fail-
295
+ * closed with a candidate listing on an ambiguous name so a duplicated project
296
+ * title is disambiguated by uuid rather than guessed.
297
+ */
298
+ export function resolveProjectWriteTarget(db, refRaw) {
299
+ const ref = stripThingsUri(refRaw);
300
+ try {
301
+ return resolveTaskUuidPrefix(db, ref, "project");
302
+ }
303
+ catch (err) {
304
+ // An ambiguous uuid-prefix is a real conflict — surface it verbatim. A
305
+ // plain not-found (or too-short) ref is not a uuid: fall to the name tiers.
306
+ if (err instanceof RangeError && err.message.includes("ambiguous"))
307
+ throw err;
308
+ }
309
+ const r = resolveNamedRef(db, "TMTask", "type = 1", [], ref, { prefixTier: false });
148
310
  if (r.resolved !== null)
149
311
  return r.resolved.uuid;
150
- throw new RangeError(r.matches === 0
151
- ? `${kind} not found: ${ref} (list ${kind}s with \`${listCmd}\`)`
152
- : `${kind} reference is ambiguous: ${ref} (${r.matches} matches — use the exact name or uuid)`);
312
+ if (r.matches === 0) {
313
+ throw new ReferenceResolutionError(`no project matching "${ref}" — tried uuid, partial-uuid, and name (list projects with \`things projects\`)`, { code: "not-found", ref });
314
+ }
315
+ const candidates = describeProjectCandidates(db, r.candidates ?? []);
316
+ const lines = candidates
317
+ .map((c) => ` ${c.uuid.slice(0, 8)} — ${c.title}${c.context !== undefined ? ` (in ${c.context})` : ""}`)
318
+ .join("\n");
319
+ throw new ReferenceResolutionError(`"${ref}" matches ${r.matches} projects — disambiguate with a uuid or partial-uuid:\n${lines}`, { code: "ambiguous", ref, candidates });
320
+ }
321
+ /** Short-uuid + area-context candidates for an ambiguous project name. */
322
+ function describeProjectCandidates(db, candidates) {
323
+ const areaStmt = db.prepare("SELECT a.title AS title FROM TMTask p LEFT JOIN TMArea a ON a.uuid = p.area WHERE p.uuid = ?");
324
+ return candidates.map((c) => {
325
+ const area = areaStmt.get(c.uuid)?.title ?? null;
326
+ return { uuid: c.uuid, title: c.title, ...(area !== null && { context: area }) };
327
+ });
153
328
  }
154
329
  export function resolveTagUuid(db, ref) {
155
330
  return resolveUuidOrThrow(db, "TMTag", "1=1", ref, "tag", "things tags");
@@ -160,16 +335,34 @@ export function resolveTagUuid(db, ref) {
160
335
  * viewed — its would-be-recovered children are only visible there.
161
336
  */
162
337
  export function resolveProjectUuid(db, ref, options) {
163
- return resolveUuidOrThrow(db, "TMTask", options?.trashed === true ? "type = 1" : "type = 1 AND trashed = 0", ref, "project", "things projects");
338
+ return resolveUuidOrThrow(db, "TMTask", options?.trashed === true ? "type = 1" : "type = 1 AND trashed = 0", ref, "project", "things projects", options);
164
339
  }
165
- export function resolveAreaUuid(db, ref) {
166
- return resolveUuidOrThrow(db, "TMArea", "1=1", ref, "area", "things areas");
340
+ export function resolveAreaUuid(db, ref, options) {
341
+ return resolveUuidOrThrow(db, "TMArea", "1=1", ref, "area", "things areas", options);
167
342
  }
343
+ /**
344
+ * A row's EFFECTIVE area: its own `area` link, else the area of its project,
345
+ * else the area of its heading's project. To-dos nested in a project (or under a
346
+ * heading) carry `area = NULL` in the DB — the area lives on the container — so
347
+ * this resolves the nearest area walking the SAME chain the tag-inheritance SQL
348
+ * uses (t.area → t.project's area → t.heading's project's area). Projects carry
349
+ * their area directly (project/heading are NULL), so COALESCE returns `t.area`
350
+ * unchanged for them — areas are not inherited. Surfaced as the entity's `area`
351
+ * Ref (mappers.ts); whether it is direct vs effective stays derivable from
352
+ * whether `project`/`heading` is set. Emitted as the extra `effectiveArea`
353
+ * column so the raw `t.area` (which tag inheritance and the write layer read)
354
+ * stays available.
355
+ */
356
+ export const EFFECTIVE_AREA = `COALESCE(
357
+ t.area,
358
+ (SELECT p.area FROM TMTask p WHERE p.uuid = t.project),
359
+ (SELECT hp.area FROM TMTask h JOIN TMTask hp ON hp.uuid = h.project WHERE h.uuid = t.heading)
360
+ )`;
168
361
  export function fetchTaskRows(db, where, params = []) {
169
362
  const sql = `SELECT ${selectList("TMTask")
170
363
  .split(", ")
171
364
  .map((c) => `t.${c}`)
172
- .join(", ")} FROM TMTask t WHERE ${where}`;
365
+ .join(", ")}, ${EFFECTIVE_AREA} AS effectiveArea FROM TMTask t WHERE ${where}`;
173
366
  return db.prepare(sql).all(...params);
174
367
  }
175
368
  export function fetchTaskByUuid(db, uuid) {
@@ -180,7 +373,37 @@ export function fetchChecklistRows(db, taskUuid) {
180
373
  const sql = `SELECT ${selectList("TMChecklistItem")} FROM TMChecklistItem WHERE task = ? ORDER BY ${q("index")} ASC`;
181
374
  return db.prepare(sql).all(taskUuid);
182
375
  }
183
- /** Direct tags for a set of tasks, in one query. Returns uuid -> Ref[] (sorted by tag title). */
376
+ /**
377
+ * Direct tags for a set of tasks, in one query. Returns uuid -> Ref[] in the
378
+ * app's CANONICAL tag order.
379
+ *
380
+ * CANONICAL ORDER (ratified 2026-07-14; tiebreak corrected 2026-07-15 by
381
+ * TAGORD1): `TMTag."index"` (INTEGER, often negative) is the user-draggable
382
+ * order from the app's Tags window, and the GUI renders every multi-tag pill row
383
+ * in ascending `index`. Live oracle: the `Replace CPAP mask & air filter` to-do
384
+ * shows `#recurring #home #housekeeping`, matching the tags' indexes, NOT their
385
+ * alphabetical order.
386
+ *
387
+ * TIEBREAK = `uuid`, NOT `title` (TAGORD1 lab oracle, docs/lab/taglab-probes.md).
388
+ * Never-dragged tags ubiquitously tie at `index = 0`; the app breaks that tie by
389
+ * the tag's UUID (ascending ASCII), NOT alphabetically. Proven across three
390
+ * surfaces in a VM (Tags window, a to-do's multi-tag pill row — input-order
391
+ * independent, and the list filter-bar chips): 8 tags seeded reverse-alpha all
392
+ * tied at 0 displayed in exact uuid order, and `ORDER BY "index", uuid`
393
+ * reproduced the whole Tags-window order byte-for-byte where `ORDER BY "index",
394
+ * title` diverged. TMTag has no creation-date column, so creation order is not
395
+ * even a candidate comparator.
396
+ *
397
+ * NESTED-TAG CAVEAT (open question, deliberately unsolved): child tags' indexes
398
+ * interleave globally with top-level ones — CONFIRMED by TAGORD1: `TMTag."index"`
399
+ * is a single GLOBAL space, not per-parent (a seeded child landed at -378 among
400
+ * root tags at 0/-35/-67). So a flat-index sort can place a child BEFORE its
401
+ * parent in a multi-tag row. No live item carries a nested tag alongside another
402
+ * tag, so there is no GUI oracle for the interleaved case — flat ascending
403
+ * `index` is the ratified comparator, isolated HERE. If a GUI oracle ever
404
+ * contradicts it, the fix is a DFS-rank swap in this one ORDER BY (rank children
405
+ * after parents).
406
+ */
184
407
  export function fetchTagsForTasks(db, taskUuids) {
185
408
  const map = new Map();
186
409
  if (taskUuids.length === 0)
@@ -189,7 +412,7 @@ export function fetchTagsForTasks(db, taskUuids) {
189
412
  const sql = `SELECT tt.tasks AS task, tg.uuid AS uuid, tg.title AS title
190
413
  FROM TMTaskTag tt JOIN TMTag tg ON tg.uuid = tt.tags
191
414
  WHERE tt.tasks IN (${placeholders})
192
- ORDER BY tg.title`;
415
+ ORDER BY tg.${q("index")}, tg.uuid`;
193
416
  const rows = db.prepare(sql).all(...taskUuids);
194
417
  for (const row of rows) {
195
418
  const list = map.get(row.task) ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/read/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/read/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The deterministic composite ranking for `things search` (docs/design/
3
+ * cli-grammar.md → search doctrine), replacing plain recency. A pure
4
+ * comparator so it is unit-testable in isolation and cannot drift from the
5
+ * documented order. Ranking runs BEFORE any row cap.
6
+ *
7
+ * Order (first differing key wins):
8
+ * 1. match field — title > notes > heading-via-project > checklist
9
+ * 2. type — projects/areas above to-dos
10
+ * 3. status — active above someday; logged/trashed last
11
+ * 4. tiebreak — most-recently-modified
12
+ *
13
+ * Consequence (deliberate): a someday TITLE match outranks an active NOTES
14
+ * match — field trumps status.
15
+ */
16
+ import type { ListItem } from "./views.ts";
17
+ /** Which text carried the match. `heading` = a heading title, credited to its parent project. */
18
+ export type MatchField = "title" | "notes" | "heading" | "checklist";
19
+ export interface SearchMatch {
20
+ item: ListItem;
21
+ field: MatchField;
22
+ /** Present when `field === "heading"`: the heading whose title matched. */
23
+ matchedVia?: {
24
+ kind: "heading";
25
+ title: string;
26
+ };
27
+ }
28
+ export declare function fieldRank(field: MatchField): number;
29
+ /** Containers (projects, areas) sort above to-dos. */
30
+ export declare function typeRank(type: ListItem["type"] | "area"): number;
31
+ export type MatchStatus = "active" | "someday" | "logged" | "trashed";
32
+ /** Derive the ranking status bucket from an item's own state. */
33
+ export declare function matchStatus(item: ListItem): MatchStatus;
34
+ export declare function statusRank(status: MatchStatus): number;
35
+ /** The composite comparator. Stable and total: ties fall through to the uuid. */
36
+ export declare function compareSearchMatches(a: SearchMatch, b: SearchMatch): number;
@@ -0,0 +1,31 @@
1
+ const FIELD_ORDER = { title: 0, notes: 1, heading: 2, checklist: 3 };
2
+ export function fieldRank(field) {
3
+ return FIELD_ORDER[field];
4
+ }
5
+ /** Containers (projects, areas) sort above to-dos. */
6
+ export function typeRank(type) {
7
+ return type === "to-do" ? 1 : 0;
8
+ }
9
+ /** Derive the ranking status bucket from an item's own state. */
10
+ export function matchStatus(item) {
11
+ if (item.trashed)
12
+ return "trashed";
13
+ if (item.status !== "open")
14
+ return "logged";
15
+ if (item.start === "someday")
16
+ return "someday";
17
+ return "active";
18
+ }
19
+ const STATUS_ORDER = { active: 0, someday: 1, logged: 2, trashed: 3 };
20
+ export function statusRank(status) {
21
+ return STATUS_ORDER[status];
22
+ }
23
+ /** The composite comparator. Stable and total: ties fall through to the uuid. */
24
+ export function compareSearchMatches(a, b) {
25
+ return (fieldRank(a.field) - fieldRank(b.field) ||
26
+ typeRank(a.item.type) - typeRank(b.item.type) ||
27
+ statusRank(matchStatus(a.item)) - statusRank(matchStatus(b.item)) ||
28
+ b.item.modified.getTime() - a.item.modified.getTime() ||
29
+ a.item.uuid.localeCompare(b.item.uuid));
30
+ }
31
+ //# sourceMappingURL=search-rank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-rank.js","sourceRoot":"","sources":["../../src/read/search-rank.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,GAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAEjG,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,QAAQ,CAAC,IAA+B;IACtD,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAID,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,IAAc;IACxC,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,YAAY,GAAgC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAEnG,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,CAAc,EAAE,CAAc;IACjE,OAAO,CACL,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QACvC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7C,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;QACrD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Pure STRUCTURAL decomposition of the sidebar catalogues (anytime/someday)
3
+ * into their innermost item blocks, plus the per-block cap shape the bounding
4
+ * layer applies. No capping and no counts live here — this module only splits a
5
+ * section into (direct/loose to-dos, per-project child lists); the actual
6
+ * truncation is layered on top in ./truncation.ts. Split out so the human
7
+ * renderers (src/cli/render.ts) can re-derive block structure WITHOUT importing
8
+ * the truncation module (the surface/library layering boundary).
9
+ */
10
+ import type { Ref } from "../model/entities.ts";
11
+ import type { ListItem, SidebarSection } from "./views.ts";
12
+ /**
13
+ * Per-block caps for the grouped catalogues: `area` bounds each area-direct
14
+ * block (and the leading loose block), `project` each project's to-do list.
15
+ * `null` = uncapped (the caller passed --all / all: true, or — for someday's
16
+ * active-projects section — asked for every item).
17
+ */
18
+ export interface GroupedLimits {
19
+ area: number | null;
20
+ project: number | null;
21
+ }
22
+ /**
23
+ * Split one sidebar section into its innermost item blocks: the direct
24
+ * to-dos that precede any project row, then one block per project (the
25
+ * project row plus the to-dos that follow it until the next project).
26
+ */
27
+ export interface SectionBlocks {
28
+ direct: ListItem[];
29
+ projects: Array<{
30
+ project: ListItem;
31
+ items: ListItem[];
32
+ }>;
33
+ }
34
+ export declare function splitSectionBlocks(section: SidebarSection): SectionBlocks;
35
+ /**
36
+ * Someday sections split differently from anytime: PROJECT rows there are
37
+ * plain ITEMS (a someday project stands for itself — its children are never
38
+ * inline), so a section's "own" block is its project rows + container-less
39
+ * to-dos together, and the to-dos that DO carry a project reference (the
40
+ * activeProjectItems toggle) form separate per-project child groups.
41
+ */
42
+ export interface SomedayPartition {
43
+ /** Project rows + direct to-dos, in section order. */
44
+ own: ListItem[];
45
+ /** Someday to-dos inside active projects, clustered per project. */
46
+ children: Array<{
47
+ project: Ref;
48
+ items: ListItem[];
49
+ }>;
50
+ }
51
+ export declare function partitionSomedaySection(section: SidebarSection): SomedayPartition;
@@ -0,0 +1,37 @@
1
+ export function splitSectionBlocks(section) {
2
+ const direct = [];
3
+ const projects = [];
4
+ let cur = null;
5
+ for (const item of section.items) {
6
+ if (item.type === "project") {
7
+ cur = { project: item, items: [] };
8
+ projects.push(cur);
9
+ }
10
+ else if (cur === null) {
11
+ direct.push(item);
12
+ }
13
+ else {
14
+ cur.items.push(item);
15
+ }
16
+ }
17
+ return { direct, projects };
18
+ }
19
+ export function partitionSomedaySection(section) {
20
+ const own = [];
21
+ const byProject = new Map();
22
+ for (const item of section.items) {
23
+ const container = item.type === "to-do" ? (item.project ?? item.headingProject ?? null) : null;
24
+ if (container === null) {
25
+ own.push(item);
26
+ continue;
27
+ }
28
+ let group = byProject.get(container.uuid);
29
+ if (group === undefined) {
30
+ group = { project: container, items: [] };
31
+ byProject.set(container.uuid, group);
32
+ }
33
+ group.items.push(item);
34
+ }
35
+ return { own, children: [...byProject.values()] };
36
+ }
37
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/read/sections.ts"],"names":[],"mappings":"AAiCA,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAoD,EAAE,CAAC;IACrE,IAAI,GAAG,GAAoD,IAAI,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAgBD,MAAM,UAAU,uBAAuB,CAAC,OAAuB;IAC7D,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+C,CAAC;IACzE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC1C,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;AACpD,CAAC"}
@@ -1,10 +1,19 @@
1
1
  /**
2
2
  * Loose reference classification for `things show` / the `open` commands:
3
3
  * anything a user might copy — a full uuid, a >=6-char uuid prefix, a
4
- * things:/// share link, or an area name — resolves to the resource class
5
- * that has a show view. Headings resolve to their CONTAINING PROJECT (they
6
- * have no view of their own); tags and checklist items are rejected (no
7
- * show view; their uuids simply never match TMTask/TMArea).
4
+ * things:/// share link, or a unique area/project name — resolves to the
5
+ * resource class that has a show view (an area wins over a same-named
6
+ * project). Headings resolve to their CONTAINING PROJECT (they have no view
7
+ * of their own); tags and checklist items are rejected (no show view; their
8
+ * uuids simply never match TMTask/TMArea).
9
+ *
10
+ * NAME resolution on this loose/sugar path is deliberately narrower than the
11
+ * typed commands' (docs/design/cli-grammar.md): only AREAS and PROJECTS
12
+ * resolve by name (to-do TITLES never route here — a to-do is reachable only
13
+ * by uuid/prefix/share-link, or from the did-you-mean list), and the
14
+ * uuid-PREFIX tier is dropped (`prefixTier: false`) so the did-you-mean
15
+ * substring fallback supersedes prefix guessing. Task uuid prefixes still
16
+ * resolve up front via {@link resolveTaskUuidPrefix}.
8
17
  */
9
18
  import type { DatabaseSync } from "node:sqlite";
10
19
  export interface ShowTarget {