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.
- package/README.md +31 -11
- package/dist/audit/log.js +56 -2
- package/dist/audit/log.js.map +1 -1
- package/dist/audit/schema.d.ts +26 -8
- package/dist/audit/schema.js +42 -1
- package/dist/audit/schema.js.map +1 -1
- package/dist/cli/commands/area.d.ts +34 -2
- package/dist/cli/commands/area.js +140 -28
- package/dist/cli/commands/area.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -1
- package/dist/cli/commands/doctor.js +44 -5
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/mcp.js +23 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/project.d.ts +23 -1
- package/dist/cli/commands/project.js +82 -15
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.d.ts +6 -125
- package/dist/cli/commands/reads.js +649 -657
- package/dist/cli/commands/reads.js.map +1 -1
- package/dist/cli/commands/repeat-flags.d.ts +20 -0
- package/dist/cli/commands/repeat-flags.js +76 -0
- package/dist/cli/commands/repeat-flags.js.map +1 -0
- package/dist/cli/commands/setup.js +2 -3
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.d.ts +1 -1
- package/dist/cli/commands/show.js +169 -18
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/snapshot.js +1 -1
- package/dist/cli/commands/snapshot.js.map +1 -1
- package/dist/cli/commands/todo.d.ts +1 -1
- package/dist/cli/commands/todo.js +21 -9
- package/dist/cli/commands/todo.js.map +1 -1
- package/dist/cli/commands/writes.js +378 -148
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/did-you-mean.d.ts +29 -0
- package/dist/cli/did-you-mean.js +53 -0
- package/dist/cli/did-you-mean.js.map +1 -0
- package/dist/cli/excess-args.d.ts +15 -0
- package/dist/cli/excess-args.js +51 -0
- package/dist/cli/excess-args.js.map +1 -0
- package/dist/cli/glyphs.d.ts +67 -7
- package/dist/cli/glyphs.js +202 -19
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.d.ts +54 -0
- package/dist/cli/help.js +355 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.js +36 -21
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/period.d.ts +39 -0
- package/dist/cli/period.js +141 -0
- package/dist/cli/period.js.map +1 -0
- package/dist/cli/read-driver.d.ts +83 -0
- package/dist/cli/read-driver.js +215 -0
- package/dist/cli/read-driver.js.map +1 -0
- package/dist/cli/render.d.ts +246 -0
- package/dist/cli/render.js +806 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/resolve-invocation.d.ts +116 -0
- package/dist/cli/resolve-invocation.js +261 -0
- package/dist/cli/resolve-invocation.js.map +1 -0
- package/dist/cli/shell-quote.d.ts +9 -0
- package/dist/cli/shell-quote.js +12 -0
- package/dist/cli/shell-quote.js.map +1 -0
- package/dist/cli/tag-filters.d.ts +59 -0
- package/dist/cli/tag-filters.js +57 -0
- package/dist/cli/tag-filters.js.map +1 -0
- package/dist/cli/verb-hint.d.ts +25 -0
- package/dist/cli/verb-hint.js +138 -0
- package/dist/cli/verb-hint.js.map +1 -0
- package/dist/cli/width.d.ts +135 -0
- package/dist/cli/width.js +313 -0
- package/dist/cli/width.js.map +1 -0
- package/dist/client.d.ts +146 -24
- package/dist/client.js +106 -16
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/contracts.d.ts +136 -1
- package/dist/contracts.js +44 -1
- package/dist/contracts.js.map +1 -1
- package/dist/db/fingerprint.d.ts +12 -0
- package/dist/db/fingerprint.js +15 -1
- package/dist/db/fingerprint.js.map +1 -1
- package/dist/db/locate.js +1 -1
- package/dist/db/locate.js.map +1 -1
- package/dist/diagnose.d.ts +63 -0
- package/dist/diagnose.js +38 -1
- package/dist/diagnose.js.map +1 -1
- package/dist/index.d.ts +30 -4
- package/dist/index.js +35 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -1
- package/dist/mcp/server.js +850 -128
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/entities.d.ts +40 -7
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.d.ts +7 -0
- package/dist/model/mappers.js +20 -3
- package/dist/model/mappers.js.map +1 -1
- package/dist/model/occurrences.d.ts +6 -1
- package/dist/model/occurrences.js +9 -5
- package/dist/model/occurrences.js.map +1 -1
- package/dist/model/recurrence.d.ts +17 -8
- package/dist/model/recurrence.js.map +1 -1
- package/dist/model/serialize.d.ts +28 -0
- package/dist/model/serialize.js +80 -0
- package/dist/model/serialize.js.map +1 -0
- package/dist/model/when-sugar.d.ts +47 -0
- package/dist/model/when-sugar.js +45 -0
- package/dist/model/when-sugar.js.map +1 -0
- package/dist/read/area-view.d.ts +8 -1
- package/dist/read/area-view.js +49 -13
- package/dist/read/area-view.js.map +1 -1
- package/dist/read/caps.d.ts +14 -0
- package/dist/read/caps.js +21 -0
- package/dist/read/caps.js.map +1 -0
- package/dist/read/filter-contract.d.ts +117 -0
- package/dist/read/filter-contract.js +78 -0
- package/dist/read/filter-contract.js.map +1 -0
- package/dist/read/log-boundary.d.ts +9 -4
- package/dist/read/log-boundary.js.map +1 -1
- package/dist/read/predicates.d.ts +61 -0
- package/dist/read/predicates.js +78 -0
- package/dist/read/predicates.js.map +1 -0
- package/dist/read/project-view.d.ts +12 -1
- package/dist/read/project-view.js +39 -8
- package/dist/read/project-view.js.map +1 -1
- package/dist/read/queries.d.ts +156 -8
- package/dist/read/queries.js +261 -38
- package/dist/read/queries.js.map +1 -1
- package/dist/read/search-rank.d.ts +36 -0
- package/dist/read/search-rank.js +31 -0
- package/dist/read/search-rank.js.map +1 -0
- package/dist/read/sections.d.ts +51 -0
- package/dist/read/sections.js +37 -0
- package/dist/read/sections.js.map +1 -0
- package/dist/read/show-target.d.ts +13 -4
- package/dist/read/show-target.js +11 -2
- package/dist/read/show-target.js.map +1 -1
- package/dist/read/sidebar-order.d.ts +19 -0
- package/dist/read/sidebar-order.js +93 -0
- package/dist/read/sidebar-order.js.map +1 -0
- package/dist/read/tags.d.ts +27 -3
- package/dist/read/tags.js +83 -12
- package/dist/read/tags.js.map +1 -1
- package/dist/read/truncation.d.ts +71 -0
- package/dist/read/truncation.js +217 -0
- package/dist/read/truncation.js.map +1 -0
- package/dist/read/views.d.ts +177 -19
- package/dist/read/views.js +390 -213
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +42 -0
- package/dist/surface-copy.js +55 -0
- package/dist/surface-copy.js.map +1 -1
- package/dist/sync-health.d.ts +78 -0
- package/dist/sync-health.js +312 -0
- package/dist/sync-health.js.map +1 -0
- package/dist/write/accessibility-probe.d.ts +12 -0
- package/dist/write/accessibility-probe.js +63 -0
- package/dist/write/accessibility-probe.js.map +1 -0
- package/dist/write/automation-probe.d.ts +7 -0
- package/dist/write/automation-probe.js +8 -1
- package/dist/write/automation-probe.js.map +1 -1
- package/dist/write/batch.js +4 -2
- package/dist/write/batch.js.map +1 -1
- package/dist/write/capabilities.d.ts +8 -0
- package/dist/write/capabilities.js +13 -5
- package/dist/write/capabilities.js.map +1 -1
- package/dist/write/commands.d.ts +2 -0
- package/dist/write/commands.js +562 -48
- package/dist/write/commands.js.map +1 -1
- package/dist/write/edit-checklist.js +3 -2
- package/dist/write/edit-checklist.js.map +1 -1
- package/dist/write/guards.d.ts +2 -7
- package/dist/write/guards.js +64 -6
- package/dist/write/guards.js.map +1 -1
- package/dist/write/heading.js +2 -0
- package/dist/write/heading.js.map +1 -1
- package/dist/write/lock.d.ts +40 -2
- package/dist/write/lock.js +91 -14
- package/dist/write/lock.js.map +1 -1
- package/dist/write/make-repeating-project.d.ts +4 -0
- package/dist/write/make-repeating-project.js +253 -0
- package/dist/write/make-repeating-project.js.map +1 -0
- package/dist/write/operations.d.ts +145 -1
- package/dist/write/operations.js +48 -0
- package/dist/write/operations.js.map +1 -1
- package/dist/write/pipeline.d.ts +19 -0
- package/dist/write/pipeline.js +109 -26
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/pre-state.d.ts +68 -3
- package/dist/write/pre-state.js +102 -3
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/reopen.js +3 -2
- package/dist/write/reopen.js.map +1 -1
- package/dist/write/reorder.js +27 -17
- package/dist/write/reorder.js.map +1 -1
- package/dist/write/repeat-rule.d.ts +22 -0
- package/dist/write/repeat-rule.js +258 -0
- package/dist/write/repeat-rule.js.map +1 -0
- package/dist/write/reversibility.js +49 -0
- package/dist/write/reversibility.js.map +1 -1
- package/dist/write/tag-refs.d.ts +47 -0
- package/dist/write/tag-refs.js +126 -0
- package/dist/write/tag-refs.js.map +1 -0
- package/dist/write/undo.d.ts +74 -5
- package/dist/write/undo.js +494 -80
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/registry.d.ts +17 -1
- package/dist/write/vectors/registry.js +18 -2
- package/dist/write/vectors/registry.js.map +1 -1
- package/dist/write/vectors/types.d.ts +119 -3
- package/dist/write/vectors/ui-certification.d.ts +48 -0
- package/dist/write/vectors/ui-certification.js +46 -0
- package/dist/write/vectors/ui-certification.js.map +1 -0
- package/dist/write/vectors/ui-drag.d.ts +188 -0
- package/dist/write/vectors/ui-drag.js +1095 -0
- package/dist/write/vectors/ui-drag.js.map +1 -0
- package/dist/write/vectors/ui-recipes.d.ts +70 -0
- package/dist/write/vectors/ui-recipes.js +558 -0
- package/dist/write/vectors/ui-recipes.js.map +1 -0
- package/dist/write/vectors/ui.d.ts +137 -0
- package/dist/write/vectors/ui.js +656 -0
- package/dist/write/vectors/ui.js.map +1 -0
- package/dist/write/verify/delta.d.ts +31 -3
- package/dist/write/verify/delta.js +22 -6
- package/dist/write/verify/delta.js.map +1 -1
- package/dist/write/verify/poller.js +1 -0
- package/dist/write/verify/poller.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/exit-codes.d.ts +0 -26
- package/dist/cli/exit-codes.js +0 -26
- package/dist/cli/exit-codes.js.map +0 -1
- package/dist/cli/output.d.ts +0 -42
- package/dist/cli/output.js +0 -16
- package/dist/cli/output.js.map +0 -1
package/dist/read/queries.js
CHANGED
|
@@ -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
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
/**
|
|
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.
|
|
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) ?? [];
|
package/dist/read/queries.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/read/queries.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIhD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,uDAAuD,CAAC;AAEpF;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3E,OAAO;8EACqE,GAAG;oFACG,GAAG;iFACN,GAAG;;uDAE7B,GAAG;;uDAEH,GAAG;;8FAEoC,GAAG;EAC/F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB,EAAE,IAAY;IAC/D,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;4BAGsB,CACvB;SACA,GAAG,CAAC,IAAI,CAAuB,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,sFAAsF;AACtF;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAgB,EAAE,MAAc;IACpE,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,GAAG,CAE7D,CAAC;IACd,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,wBAAwB,GAAG,yCAAyC,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,+EAA+E,CAAC;SACxF,GAAG,CAAC,GAAG,EAAE,KAAK,CAA6C,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,kCAAkC,GAAG,GAAG,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,IAAI,UAAU,CAAC,gBAAgB,GAAG,6BAA6B,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,CAAC;SACL,SAAS,CAAC,KAAK,CAAC;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAQhC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAgB,EAChB,KAAa,EACb,UAAkB,EAClB,UAA+B,EAC/B,MAAc;IAEd,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,QAA6B,EAAE,EAAS,EAAE,CACnE,EAAE;SACC,OAAO,CAAC,2BAA2B,KAAK,UAAU,UAAU,QAAQ,IAAI,EAAE,CAAC;SAC3E,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,KAAK,CAAqB,CAAC;IAEtD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAExE,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,IAAI,GAAG,GAAG,CAAC,wBAAwB,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CACzB,EAAgB,EAChB,KAAa,EACb,UAAkB,EAClB,GAAW,EACX,IAAY,EACZ,OAAe;IAEf,MAAM,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IAChD,MAAM,IAAI,UAAU,CAClB,CAAC,CAAC,OAAO,KAAK,CAAC;QACb,CAAC,CAAC,GAAG,IAAI,eAAe,GAAG,UAAU,IAAI,YAAY,OAAO,KAAK;QACjE,CAAC,CAAC,GAAG,IAAI,4BAA4B,GAAG,KAAK,CAAC,CAAC,OAAO,wCAAwC,CACjG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAgB,EAAE,GAAW;IAC1D,OAAO,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAgB,EAChB,GAAW,EACX,OAA+B;IAE/B,OAAO,kBAAkB,CACvB,EAAE,EACF,QAAQ,EACR,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,EACnE,GAAG,EACH,SAAS,EACT,iBAAiB,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,GAAW;IAC3D,OAAO,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,KAAa,EAAE,SAAoB,EAAE;IACnF,MAAM,GAAG,GAAG,UAAU,UAAU,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;SACpB,IAAI,CAAC,IAAI,CAAC,wBAAwB,KAAK,EAAE,CAAC;IAC7C,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAI,MAAkB,CAAyB,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,IAAY;IAC5D,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAgB,EAAE,QAAgB;IACnE,MAAM,GAAG,GAAG,UAAU,UAAU,CAAC,iBAAiB,CAAC,iDAAiD,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACrH,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA8B,CAAC;AACpE,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,iBAAiB,CAAC,EAAgB,EAAE,SAAmB;IACrE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiB,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACvC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG;;oCAEsB,YAAY;iCACf,CAAC;IAChC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAI3C,CAAC;IACH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAChD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,EAAgB;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,4GAA4G,CAC7G,CAAC;IACF,OAAO,CAAC,WAAW,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAuD,CAAC;QACxF,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,EAAgB;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IAC7E,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAExC,CAAC;QACd,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
|
|
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
|
|
5
|
-
* that has a show view
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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 {
|