things-api 0.9.0 → 0.11.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 (261) hide show
  1. package/README.md +57 -12
  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/clock.d.ts +8 -0
  8. package/dist/cli/clock.js +24 -0
  9. package/dist/cli/clock.js.map +1 -0
  10. package/dist/cli/commands/area.d.ts +26 -3
  11. package/dist/cli/commands/area.js +129 -75
  12. package/dist/cli/commands/area.js.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts +1 -1
  14. package/dist/cli/commands/doctor.js +44 -5
  15. package/dist/cli/commands/doctor.js.map +1 -1
  16. package/dist/cli/commands/install-skill.d.ts +45 -0
  17. package/dist/cli/commands/install-skill.js +207 -0
  18. package/dist/cli/commands/install-skill.js.map +1 -0
  19. package/dist/cli/commands/mcp.js +23 -4
  20. package/dist/cli/commands/mcp.js.map +1 -1
  21. package/dist/cli/commands/project.d.ts +18 -1
  22. package/dist/cli/commands/project.js +74 -35
  23. package/dist/cli/commands/project.js.map +1 -1
  24. package/dist/cli/commands/reads.d.ts +15 -2
  25. package/dist/cli/commands/reads.js +459 -165
  26. package/dist/cli/commands/reads.js.map +1 -1
  27. package/dist/cli/commands/repeat-flags.d.ts +20 -0
  28. package/dist/cli/commands/repeat-flags.js +76 -0
  29. package/dist/cli/commands/repeat-flags.js.map +1 -0
  30. package/dist/cli/commands/setup.js +8 -4
  31. package/dist/cli/commands/setup.js.map +1 -1
  32. package/dist/cli/commands/show.js +53 -30
  33. package/dist/cli/commands/show.js.map +1 -1
  34. package/dist/cli/commands/todo.d.ts +1 -1
  35. package/dist/cli/commands/todo.js +20 -13
  36. package/dist/cli/commands/todo.js.map +1 -1
  37. package/dist/cli/commands/writes.js +388 -161
  38. package/dist/cli/commands/writes.js.map +1 -1
  39. package/dist/cli/did-you-mean.d.ts +1 -1
  40. package/dist/cli/excess-args.d.ts +15 -0
  41. package/dist/cli/excess-args.js +51 -0
  42. package/dist/cli/excess-args.js.map +1 -0
  43. package/dist/cli/glyphs.d.ts +55 -2
  44. package/dist/cli/glyphs.js +114 -21
  45. package/dist/cli/glyphs.js.map +1 -1
  46. package/dist/cli/help.d.ts +54 -0
  47. package/dist/cli/help.js +405 -0
  48. package/dist/cli/help.js.map +1 -0
  49. package/dist/cli/main.js +64 -26
  50. package/dist/cli/main.js.map +1 -1
  51. package/dist/cli/move-hint.d.ts +45 -0
  52. package/dist/cli/move-hint.js +196 -0
  53. package/dist/cli/move-hint.js.map +1 -0
  54. package/dist/cli/period.d.ts +9 -8
  55. package/dist/cli/period.js +56 -30
  56. package/dist/cli/period.js.map +1 -1
  57. package/dist/cli/read-driver.d.ts +26 -19
  58. package/dist/cli/read-driver.js +77 -33
  59. package/dist/cli/read-driver.js.map +1 -1
  60. package/dist/cli/render.d.ts +92 -28
  61. package/dist/cli/render.js +333 -103
  62. package/dist/cli/render.js.map +1 -1
  63. package/dist/cli/resolve-invocation.d.ts +42 -4
  64. package/dist/cli/resolve-invocation.js +97 -14
  65. package/dist/cli/resolve-invocation.js.map +1 -1
  66. package/dist/cli/skill-check.d.ts +21 -0
  67. package/dist/cli/skill-check.js +82 -0
  68. package/dist/cli/skill-check.js.map +1 -0
  69. package/dist/cli/skill.d.ts +62 -0
  70. package/dist/cli/skill.js +142 -0
  71. package/dist/cli/skill.js.map +1 -0
  72. package/dist/cli/tag-filters.d.ts +63 -0
  73. package/dist/cli/tag-filters.js +59 -0
  74. package/dist/cli/tag-filters.js.map +1 -0
  75. package/dist/cli/verb-hint.d.ts +25 -0
  76. package/dist/cli/verb-hint.js +163 -0
  77. package/dist/cli/verb-hint.js.map +1 -0
  78. package/dist/cli/version.d.ts +4 -0
  79. package/dist/cli/version.js +18 -0
  80. package/dist/cli/version.js.map +1 -0
  81. package/dist/cli/width.d.ts +135 -0
  82. package/dist/cli/width.js +313 -0
  83. package/dist/cli/width.js.map +1 -0
  84. package/dist/client.d.ts +160 -24
  85. package/dist/client.js +132 -19
  86. package/dist/client.js.map +1 -1
  87. package/dist/config.d.ts +11 -0
  88. package/dist/config.js +3 -0
  89. package/dist/config.js.map +1 -1
  90. package/dist/contracts.d.ts +97 -17
  91. package/dist/contracts.js +44 -1
  92. package/dist/contracts.js.map +1 -1
  93. package/dist/db/fingerprint.d.ts +12 -0
  94. package/dist/db/fingerprint.js +15 -1
  95. package/dist/db/fingerprint.js.map +1 -1
  96. package/dist/db/locate.js +1 -1
  97. package/dist/db/locate.js.map +1 -1
  98. package/dist/diagnose.d.ts +63 -0
  99. package/dist/diagnose.js +38 -1
  100. package/dist/diagnose.js.map +1 -1
  101. package/dist/index.d.ts +36 -5
  102. package/dist/index.js +38 -2
  103. package/dist/index.js.map +1 -1
  104. package/dist/mcp/server.d.ts +9 -1
  105. package/dist/mcp/server.js +1038 -436
  106. package/dist/mcp/server.js.map +1 -1
  107. package/dist/model/clock.d.ts +61 -0
  108. package/dist/model/clock.js +71 -0
  109. package/dist/model/clock.js.map +1 -0
  110. package/dist/model/dates.d.ts +26 -3
  111. package/dist/model/dates.js +84 -3
  112. package/dist/model/dates.js.map +1 -1
  113. package/dist/model/entities.d.ts +48 -10
  114. package/dist/model/entities.js.map +1 -1
  115. package/dist/model/mappers.d.ts +9 -2
  116. package/dist/model/mappers.js +32 -9
  117. package/dist/model/mappers.js.map +1 -1
  118. package/dist/model/serialize.d.ts +28 -0
  119. package/dist/model/serialize.js +80 -0
  120. package/dist/model/serialize.js.map +1 -0
  121. package/dist/model/when-sugar.d.ts +47 -0
  122. package/dist/model/when-sugar.js +45 -0
  123. package/dist/model/when-sugar.js.map +1 -0
  124. package/dist/read/area-view.d.ts +8 -1
  125. package/dist/read/area-view.js +55 -17
  126. package/dist/read/area-view.js.map +1 -1
  127. package/dist/read/detail.d.ts +1 -1
  128. package/dist/read/detail.js +11 -4
  129. package/dist/read/detail.js.map +1 -1
  130. package/dist/read/filter-contract.d.ts +117 -0
  131. package/dist/read/filter-contract.js +78 -0
  132. package/dist/read/filter-contract.js.map +1 -0
  133. package/dist/read/log-boundary.d.ts +1 -1
  134. package/dist/read/log-boundary.js +13 -3
  135. package/dist/read/log-boundary.js.map +1 -1
  136. package/dist/read/predicates.d.ts +30 -0
  137. package/dist/read/predicates.js +30 -0
  138. package/dist/read/predicates.js.map +1 -1
  139. package/dist/read/project-view.d.ts +12 -1
  140. package/dist/read/project-view.js +45 -12
  141. package/dist/read/project-view.js.map +1 -1
  142. package/dist/read/queries.d.ts +152 -7
  143. package/dist/read/queries.js +277 -36
  144. package/dist/read/queries.js.map +1 -1
  145. package/dist/read/sections.d.ts +51 -0
  146. package/dist/read/sections.js +37 -0
  147. package/dist/read/sections.js.map +1 -0
  148. package/dist/read/sidebar-order.js +2 -1
  149. package/dist/read/sidebar-order.js.map +1 -1
  150. package/dist/read/snapshot.d.ts +1 -1
  151. package/dist/read/snapshot.js +9 -2
  152. package/dist/read/snapshot.js.map +1 -1
  153. package/dist/read/tags.d.ts +27 -3
  154. package/dist/read/tags.js +83 -12
  155. package/dist/read/tags.js.map +1 -1
  156. package/dist/read/truncation.d.ts +71 -0
  157. package/dist/read/{pagination.js → truncation.js} +103 -94
  158. package/dist/read/truncation.js.map +1 -0
  159. package/dist/read/views.d.ts +147 -22
  160. package/dist/read/views.js +282 -80
  161. package/dist/read/views.js.map +1 -1
  162. package/dist/surface-copy.d.ts +19 -0
  163. package/dist/surface-copy.js +32 -0
  164. package/dist/surface-copy.js.map +1 -1
  165. package/dist/sync-health.d.ts +78 -0
  166. package/dist/sync-health.js +312 -0
  167. package/dist/sync-health.js.map +1 -0
  168. package/dist/write/accessibility-probe.d.ts +12 -0
  169. package/dist/write/accessibility-probe.js +71 -0
  170. package/dist/write/accessibility-probe.js.map +1 -0
  171. package/dist/write/automation-probe.d.ts +8 -1
  172. package/dist/write/automation-probe.js +16 -1
  173. package/dist/write/automation-probe.js.map +1 -1
  174. package/dist/write/batch.js +5 -2
  175. package/dist/write/batch.js.map +1 -1
  176. package/dist/write/capabilities.d.ts +8 -0
  177. package/dist/write/capabilities.js +13 -6
  178. package/dist/write/capabilities.js.map +1 -1
  179. package/dist/write/commands.d.ts +3 -1
  180. package/dist/write/commands.js +602 -49
  181. package/dist/write/commands.js.map +1 -1
  182. package/dist/write/edit-checklist.js +3 -2
  183. package/dist/write/edit-checklist.js.map +1 -1
  184. package/dist/write/guards.d.ts +2 -7
  185. package/dist/write/guards.js +87 -6
  186. package/dist/write/guards.js.map +1 -1
  187. package/dist/write/heading.js +2 -0
  188. package/dist/write/heading.js.map +1 -1
  189. package/dist/write/lock.d.ts +40 -2
  190. package/dist/write/lock.js +91 -14
  191. package/dist/write/lock.js.map +1 -1
  192. package/dist/write/make-repeating-project.d.ts +4 -0
  193. package/dist/write/make-repeating-project.js +253 -0
  194. package/dist/write/make-repeating-project.js.map +1 -0
  195. package/dist/write/operations.d.ts +145 -1
  196. package/dist/write/operations.js +48 -0
  197. package/dist/write/operations.js.map +1 -1
  198. package/dist/write/pipeline.d.ts +73 -2
  199. package/dist/write/pipeline.js +218 -43
  200. package/dist/write/pipeline.js.map +1 -1
  201. package/dist/write/planner.js +8 -1
  202. package/dist/write/planner.js.map +1 -1
  203. package/dist/write/pre-state.d.ts +105 -3
  204. package/dist/write/pre-state.js +144 -3
  205. package/dist/write/pre-state.js.map +1 -1
  206. package/dist/write/recurrence-rule-blob.d.ts +65 -0
  207. package/dist/write/recurrence-rule-blob.js +150 -0
  208. package/dist/write/recurrence-rule-blob.js.map +1 -0
  209. package/dist/write/reopen.js +3 -2
  210. package/dist/write/reopen.js.map +1 -1
  211. package/dist/write/reorder.js +27 -17
  212. package/dist/write/reorder.js.map +1 -1
  213. package/dist/write/repeat-rule.d.ts +22 -0
  214. package/dist/write/repeat-rule.js +258 -0
  215. package/dist/write/repeat-rule.js.map +1 -0
  216. package/dist/write/reversibility.js +49 -0
  217. package/dist/write/reversibility.js.map +1 -1
  218. package/dist/write/tag-refs.d.ts +47 -0
  219. package/dist/write/tag-refs.js +126 -0
  220. package/dist/write/tag-refs.js.map +1 -0
  221. package/dist/write/undo.d.ts +74 -5
  222. package/dist/write/undo.js +493 -80
  223. package/dist/write/undo.js.map +1 -1
  224. package/dist/write/vectors/registry.d.ts +15 -1
  225. package/dist/write/vectors/registry.js +65 -2
  226. package/dist/write/vectors/registry.js.map +1 -1
  227. package/dist/write/vectors/simulator.d.ts +44 -0
  228. package/dist/write/vectors/simulator.js +1136 -0
  229. package/dist/write/vectors/simulator.js.map +1 -0
  230. package/dist/write/vectors/types.d.ts +154 -3
  231. package/dist/write/vectors/ui-certification.d.ts +54 -0
  232. package/dist/write/vectors/ui-certification.js +43 -0
  233. package/dist/write/vectors/ui-certification.js.map +1 -0
  234. package/dist/write/vectors/ui-drag.d.ts +188 -0
  235. package/dist/write/vectors/ui-drag.js +1095 -0
  236. package/dist/write/vectors/ui-drag.js.map +1 -0
  237. package/dist/write/vectors/ui-recipes.d.ts +83 -0
  238. package/dist/write/vectors/ui-recipes.js +610 -0
  239. package/dist/write/vectors/ui-recipes.js.map +1 -0
  240. package/dist/write/vectors/ui.d.ts +152 -0
  241. package/dist/write/vectors/ui.js +704 -0
  242. package/dist/write/vectors/ui.js.map +1 -0
  243. package/dist/write/verify/delta.d.ts +141 -4
  244. package/dist/write/verify/delta.js +199 -21
  245. package/dist/write/verify/delta.js.map +1 -1
  246. package/dist/write/verify/poller.d.ts +7 -1
  247. package/dist/write/verify/poller.js +21 -1
  248. package/dist/write/verify/poller.js.map +1 -1
  249. package/package.json +18 -3
  250. package/skills/things-cli/SKILL.md +53 -0
  251. package/skills/things-cli/references/contracts.md +41 -0
  252. package/skills/things-cli/references/gui.md +11 -0
  253. package/skills/things-cli/references/model.md +51 -0
  254. package/dist/cli/exit-codes.d.ts +0 -26
  255. package/dist/cli/exit-codes.js +0 -26
  256. package/dist/cli/exit-codes.js.map +0 -1
  257. package/dist/cli/output.d.ts +0 -42
  258. package/dist/cli/output.js +0 -16
  259. package/dist/cli/output.js.map +0 -1
  260. package/dist/read/pagination.d.ts +0 -104
  261. package/dist/read/pagination.js.map +0 -1
@@ -1,15 +1,14 @@
1
- import { ExitCode } from "../../contracts.js";
2
- import { localToday } from "../../model/dates.js";
3
1
  import { bold, dim, green } from "../style.js";
4
2
  import { areaMark, thingsLink } from "../glyphs.js";
5
3
  import { Option } from "commander";
6
- import { capAreaSections } from "../../read/pagination.js";
7
- import { openInThings } from "./reads.js";
8
- import { invocation, parseCap, runRead, shellQuote, withClient } from "../read-driver.js";
9
- import { formatItem, uuidDisplayWidth } from "../render.js";
4
+ import { openInThings, revealLine } from "./reads.js";
5
+ import { renderNow, renderZone } from "../clock.js";
6
+ import { invocation, parseCap, runRead, shellQuote, usageError, withClient, } from "../read-driver.js";
7
+ import { disclosureHint, formatItem, quoteTitle, uuidDisplayWidth } from "../render.js";
10
8
  import { DidYouMeanError } from "../did-you-mean.js";
11
9
  import { showToggleFlags } from "./project.js";
12
- import { AREA_PREVIEW_LIMIT, GROUPED_ALL_DESC } from "../../surface-copy.js";
10
+ import { AREA_PREVIEW_LIMIT, GROUPED_ALL_DESC, isActiveProjectRow, isScheduledProjectRow, isSomedayProjectRow, localToday, } from "../../index.js";
11
+ import { addTagFilterOptions, CONTAINER_TAG_HINT, tagFilterFields, tagFlagConflict, tagInvocationParts, } from "../tag-filters.js";
13
12
  /** Bare `--show-logged` shows this many recent entries (areas accumulate thousands). */
14
13
  const RECENT_LOGGED_DEFAULT = 15;
15
14
  function loggedCount(showLogged) {
@@ -26,22 +25,28 @@ function loggedCount(showLogged) {
26
25
  * (future-scheduled projects, to-dos, and repeating templates intermixed in
27
26
  * date order) and Someday (someday projects as a leading block, then
28
27
  * someday to-dos). `--show-logged` reveals the full logbook.
28
+ *
29
+ * `view` is the already-bounded card (its ACTIVE project rows and direct to-dos
30
+ * capped; scheduled/someday project rows and the later/logged/trashed sections
31
+ * intact) and `grouped` the per-block metadata carrying each capped section's
32
+ * pre-cap total — so the "… N more" footers derive from metadata, never a
33
+ * pre-cap copy of the view.
29
34
  */
30
- export function renderAreaView(view, opts) {
31
- const todayIso = localToday();
32
- // Closed-but-unswept projects always sit in the active block (checked),
33
- // never in Upcoming/Someday start/startDate only classify OPEN rows.
34
- const isSomedayProject = (p) => p.status === "open" && p.start === "someday" && p.startDate === null;
35
- const isScheduledProject = (p) => p.status === "open" && p.startDate !== null && p.startDate > todayIso;
36
- const activeProjects = view.projects.filter((p) => !isSomedayProject(p) && !isScheduledProject(p));
37
- const somedayProjects = view.projects.filter(isSomedayProject);
35
+ export function renderAreaView(view, grouped, opts) {
36
+ const todayIso = localToday(renderNow(), renderZone());
37
+ // The card's ACTIVE project rows are already capped in `view`; scheduled and
38
+ // someday rows always survive and route to the Upcoming/Someday sections.
39
+ const activeProjects = view.projects.filter((p) => isActiveProjectRow(p, todayIso));
40
+ const somedayProjects = view.projects.filter(isSomedayProjectRow);
38
41
  // Upcoming intermixes scheduled projects, scheduled to-dos, and repeating
39
42
  // templates in date order (templates sort by their next occurrence).
40
43
  const upcoming = [
41
- ...view.projects.filter(isScheduledProject).map((p) => ({ date: p.startDate ?? "", item: p })),
44
+ ...view.projects
45
+ .filter((p) => isScheduledProjectRow(p, todayIso))
46
+ .map((p) => ({ date: p.startDate ?? "", item: p })),
42
47
  ...view.later.scheduled.flatMap((d) => d.items.map((t) => ({ date: d.date, item: t }))),
43
48
  ...view.later.repeating.map((t) => ({ date: t.repeating.nextOccurrence ?? "9999", item: t })),
44
- ].sort((a, b) => a.date.localeCompare(b.date));
49
+ ].toSorted((a, b) => a.date.localeCompare(b.date));
45
50
  const logged = view.logged.slice(0, loggedCount(opts.showLogged));
46
51
  const shown = [
47
52
  ...activeProjects,
@@ -55,18 +60,32 @@ export function renderAreaView(view, opts) {
55
60
  // Per-section caps (this view's sections are containers, so there is no
56
61
  // strict total limit): the project-ROWS block and the direct-to-dos block
57
62
  // truncate independently, each with its own exact-count footer. The card
58
- // preamble and the toggled later/logged sections are never capped here.
63
+ // preamble and the toggled later/logged sections are never capped. The pre-cap
64
+ // totals come from the metadata; `limits` supplies the footer's doubling.
59
65
  const limits = opts.limits ?? { area: null, project: null };
60
- const shownProjects = limits.project === null ? activeProjects : activeProjects.slice(0, limits.project);
61
- const shownActive = limits.area === null ? view.active : view.active.slice(0, limits.area);
66
+ const projectsBlock = grouped.blocks.find((b) => b.kind === "projects");
67
+ const activeBlock = grouped.blocks.find((b) => b.kind === "area");
68
+ const hiddenProjects = projectsBlock ? projectsBlock.total - projectsBlock.shown : 0;
69
+ const hiddenActive = activeBlock ? activeBlock.total - activeBlock.shown : 0;
70
+ // The user's invocation, echoed by every disclosure hint (falls back to a
71
+ // canonical typed command when a caller omits it, e.g. a direct unit test).
72
+ const base = opts.hintBase ?? `things area show ${quoteTitle(view.area.title)}`;
73
+ // A per-block TRUNCATION FOOTER (indented two spaces under its partially-
74
+ // shown block): ` … N more <noun>s — `<base> <flag> <bigger>``.
62
75
  const sectionMore = (hidden, noun, flag, cap) => {
63
76
  if (hidden <= 0 || opts.hintBase === undefined || cap === null)
64
77
  return;
65
- lines.push(dim(` … ${hidden} more ${noun}${hidden === 1 ? "" : "s"} — \`${opts.hintBase} ${flag} ${cap * 2}\``));
78
+ lines.push(disclosureHint(hidden, `more ${noun}`, [{ command: `${opts.hintBase} ${flag} ${cap * 2}` }], {
79
+ indent: true,
80
+ }));
66
81
  };
67
- // Rows inside this view never repeat the area's own name.
82
+ // Rows inside this view never repeat the area's own name. The area's top
83
+ // projects are plain ROWS here (not group headings — they don't head a to-do
84
+ // group in this view), so they get the bold project title from delta 1 but NO
85
+ // underline; only ANYTIME treats projects as headings. So a project renders
86
+ // exactly like any other row here — no projectTitle opt.
68
87
  const fmt = (i) => formatItem(i, w, { suppressArea: view.area.uuid });
69
- const fmtProject = (i) => formatItem(i, w, { projectTitle: true, suppressArea: view.area.uuid });
88
+ const fmtProject = fmt;
70
89
  // Card header: glyph + name, the GUI's share link (carries the uuid — it
71
90
  // pastes back into any ref argument), then labeled meta lines. The opened
72
91
  // resource shows its tags green (GUI: list pills are gray).
@@ -80,10 +99,10 @@ export function renderAreaView(view, opts) {
80
99
  if (rows.length > 0)
81
100
  lines.push("", ...rows);
82
101
  };
83
- block(shownProjects.map(fmtProject));
84
- sectionMore(activeProjects.length - shownProjects.length, "project", "--project-limit", limits.project);
85
- block(shownActive.map(fmt));
86
- sectionMore(view.active.length - shownActive.length, "to-do", "--area-limit", limits.area);
102
+ block(activeProjects.map(fmtProject));
103
+ sectionMore(hiddenProjects, "project", "--project-limit", limits.project);
104
+ block(view.active.map(fmt));
105
+ sectionMore(hiddenActive, "to-do", "--area-limit", limits.area);
87
106
  if (activeProjects.length === 0 && view.active.length === 0)
88
107
  lines.push("", "(no active items)");
89
108
  if (opts.showLater === true) {
@@ -99,80 +118,115 @@ export function renderAreaView(view, opts) {
99
118
  }
100
119
  }
101
120
  }
102
- // Default-hidden rows are never silent — a muted count names the toggle.
121
+ // Default-hidden rows are never silent — a HIDDEN-SECTION placeholder (flush,
122
+ // full command) stands where the Upcoming/Someday sections would render.
103
123
  if (opts.showLater !== true) {
104
124
  const hiddenLater = upcoming.length + somedayProjects.length + view.later.someday.length;
105
125
  if (hiddenLater > 0)
106
- lines.push("", dim(`…${hiddenLater} later item${hiddenLater === 1 ? "" : "s"} (--show-later)`));
126
+ lines.push("", disclosureHint(hiddenLater, "later item", [{ command: `${base} --show-later` }]));
107
127
  }
128
+ // The full archive belongs to `things logbook --area <ref>` — echoed
129
+ // ready-to-paste with the real area name, like every other drill hint.
130
+ const logbookCmd = `things logbook --area ${quoteTitle(view.area.title)}`;
108
131
  if (logged.length > 0) {
109
- // Truncation is loud: areas accumulate years of history the full
110
- // archive belongs to `things logbook --area`.
111
- const header = logged.length < view.logged.length
112
- ? `── Logged (${logged.length} of ${view.logged.length} — see things logbook --area) ──`
132
+ // Truncation is loud: areas accumulate years of history. The header keeps
133
+ // the shown-of-total count for orientation; the actionable drill rides a
134
+ // section footer (matching the other truncated sections), never the header.
135
+ const more = view.logged.length - logged.length;
136
+ const header = more > 0
137
+ ? `── Logged (${logged.length} of ${view.logged.length}) ──`
113
138
  : `── Logged (${view.logged.length}) ──`;
114
139
  lines.push("", bold(header), ...logged.map(fmt));
140
+ if (more > 0)
141
+ lines.push(dim(`… ${more} more — \`${logbookCmd}\``));
115
142
  }
116
143
  else if (view.logged.length > 0) {
117
- lines.push("", dim(`…${view.logged.length} logged (--show-logged; full history: things logbook --area)`));
144
+ // Hidden-section placeholder: `--show-logged` reveals only the RECENT 15
145
+ // (areas accumulate years), so it is labeled; the logbook drill reads its
146
+ // own effect and needs none.
147
+ lines.push("", disclosureHint(view.logged.length, "logged item", [
148
+ { label: "recent", command: `${base} --show-logged` },
149
+ { command: logbookCmd },
150
+ ]));
118
151
  }
119
152
  if (view.trashed.length)
120
153
  lines.push("", bold(`── Trashed (${view.trashed.length}) ──`));
121
154
  return lines;
122
155
  }
156
+ /**
157
+ * The `area show <ref>` action body, factored out so the pluralized
158
+ * `things areas <ref>` can delegate to the identical code path (a true synonym,
159
+ * not a reimplementation). Both echo the canonical `things area show …` hint.
160
+ */
161
+ export function runAreaShow(ref, opts) {
162
+ if (tagFlagConflict(opts))
163
+ return;
164
+ if (opts.limit !== undefined) {
165
+ usageError(opts, "--limit is not available on area show — cap sections with --area-limit / --project-limit, or pass --all");
166
+ return;
167
+ }
168
+ const areaCap = parseCap("--area-limit", opts.areaLimit, AREA_PREVIEW_LIMIT, opts.all === true, opts.json === true);
169
+ if (!areaCap.ok)
170
+ return;
171
+ const projectCap = parseCap("--project-limit", opts.projectLimit, AREA_PREVIEW_LIMIT, opts.all === true, opts.json === true);
172
+ if (!projectCap.ok)
173
+ return;
174
+ const overdue = opts.overdue === true;
175
+ const tagFilter = tagFilterFields(opts);
176
+ const limits = { area: areaCap.limit, project: projectCap.limit };
177
+ const hintBase = invocation("area show", [
178
+ shellQuote(ref),
179
+ ...showToggleFlags(opts),
180
+ overdue && "--overdue",
181
+ ...tagInvocationParts(opts),
182
+ ]);
183
+ runRead(opts, "area-view", (c) => {
184
+ let bounded;
185
+ try {
186
+ bounded = c.read.areaView(ref, {
187
+ overdue,
188
+ ...tagFilter,
189
+ areaLimit: areaCap.limit,
190
+ projectLimit: projectCap.limit,
191
+ });
192
+ }
193
+ catch (err) {
194
+ // Not-found gets a type-scoped did-you-mean; ambiguity is verbatim.
195
+ if (err instanceof RangeError && !err.message.includes("ambiguous")) {
196
+ throw new DidYouMeanError(err.message, ref, c.read.liteTitleSearch(ref, { type: "area" }));
197
+ }
198
+ throw err;
199
+ }
200
+ return {
201
+ data: bounded.view,
202
+ grouped: bounded.grouped,
203
+ lines: renderAreaView(bounded.view, bounded.grouped, { ...opts, limits, hintBase }),
204
+ };
205
+ }, () => []);
206
+ }
123
207
  export function registerAreaCommands(program) {
124
208
  const area = program.command("area").description("Area-scoped operations");
125
- area
209
+ const areaShow = area
126
210
  .command("show <ref>")
127
211
  .description("Composite area view mirroring the native UI: active projects first, then the " +
128
212
  "area's direct to-dos. --show-later adds the Upcoming (date-ordered) and " +
129
- "Someday sections; --show-logged adds the full logbook. Target by uuid or " +
130
- "unique name.")
213
+ "Someday sections; --show-logged adds the full logbook. Tag filters match rows " +
214
+ "directly and never descend into project contents. Target by uuid or unique name.")
131
215
  .option("--show-later", "include Upcoming and Someday sections")
132
216
  .option("--show-logged [n]", "include the n most recently logged items (bare flag = 15; full history via `things logbook --area`)")
133
217
  .option("--project-limit <n>", `maximum project rows to show (default ${AREA_PREVIEW_LIMIT})`)
134
218
  .option("--area-limit <n>", `maximum direct to-dos to show (default ${AREA_PREVIEW_LIMIT})`)
219
+ .option("--overdue", "only rows whose own deadline is past (due today is not overdue)")
135
220
  .option("--all", GROUPED_ALL_DESC)
136
221
  .addOption(new Option("--limit <n>").hideHelp())
137
222
  .option("--json", "emit versioned JSON envelope on stdout")
138
- .option("--db <path>", "explicit database path")
139
- .action((ref, opts) => {
140
- if (opts.limit !== undefined) {
141
- process.stderr.write("error: --limit is not available on area show — cap sections with --area-limit / --project-limit, or pass --all\n");
142
- process.exitCode = ExitCode.Usage;
143
- return;
144
- }
145
- const areaCap = parseCap("--area-limit", opts.areaLimit, AREA_PREVIEW_LIMIT, opts.all === true);
146
- if (!areaCap.ok)
147
- return;
148
- const projectCap = parseCap("--project-limit", opts.projectLimit, AREA_PREVIEW_LIMIT, opts.all === true);
149
- if (!projectCap.ok)
150
- return;
151
- const limits = { area: areaCap.limit, project: projectCap.limit };
152
- const hintBase = invocation("area show", [shellQuote(ref), ...showToggleFlags(opts)]);
153
- runRead(opts, "area-view", (c) => {
154
- let view;
155
- try {
156
- view = c.read.areaView(ref);
157
- }
158
- catch (err) {
159
- // Not-found gets a type-scoped did-you-mean; ambiguity is verbatim.
160
- if (err instanceof RangeError && !err.message.includes("ambiguous")) {
161
- throw new DidYouMeanError(err.message, ref, c.read.liteTitleSearch(ref, { type: "area" }));
162
- }
163
- throw err;
164
- }
165
- const { data, grouped } = capAreaSections(view, limits);
166
- return {
167
- data,
168
- grouped,
169
- lines: renderAreaView(view, { ...opts, limits, hintBase }),
170
- };
171
- }, () => []);
172
- });
223
+ .option("--db <path>", "explicit database path");
224
+ addTagFilterOptions(areaShow)
225
+ .addHelpText("after", CONTAINER_TAG_HINT)
226
+ .action((ref, opts) => runAreaShow(ref, opts));
173
227
  area
174
228
  .command("open <ref>")
175
- .description("Open the area in the Things app — foregrounds the GUI on this Mac (NOT headless). Errors when the reference is not an area.")
229
+ .description("Open the area in the Things app on this Mac (brings the window forward). Errors if the reference is not an area.")
176
230
  .option("--json", "emit versioned JSON envelope on stdout")
177
231
  .option("--db <path>", "explicit database path")
178
232
  .action((ref, opts) => {
@@ -180,8 +234,8 @@ export function registerAreaCommands(program) {
180
234
  const t = c.read.showTarget(ref);
181
235
  if (t.kind !== "area")
182
236
  throw new RangeError(`"${ref}" is a ${t.viaHeading === true ? "heading" : t.kind}, not an area (try \`things open\`)`);
183
- return { uri: openInThings(t.uuid) };
184
- }, (d) => [`opened ${d.uri}`]);
237
+ return openInThings(t.uuid, opts.db);
238
+ }, (d) => [revealLine(d)]);
185
239
  });
186
240
  }
187
241
  //# sourceMappingURL=area.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"area.js","sourceRoot":"","sources":["../../../src/cli/commands/area.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"area.js","sourceRoot":"","sources":["../../../src/cli/commands/area.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Exit codes: 0 healthy; 5 drift/unknown-version; 7 environment problems.
4
4
  */
5
5
  import type { Command } from "commander";
6
- import { type DiagnoseReport, type DiagnoseResult } from "../../diagnose.ts";
6
+ import { type DiagnoseReport, type DiagnoseResult } from "../../index.ts";
7
7
  export type DoctorReport = DiagnoseReport;
8
8
  export declare const runDoctor: (dbPath?: string) => DiagnoseResult;
9
9
  export declare function registerDoctor(program: Command): void;
@@ -1,6 +1,4 @@
1
- import { diagnose } from "../../diagnose.js";
2
- import { describeEnvironmentChanges } from "../../write/environment.js";
3
- import { errorEnvelope, okEnvelope } from "../../contracts.js";
1
+ import { describeEnvironmentChanges, diagnose, errorEnvelope, okEnvelope, } from "../../index.js";
4
2
  export const runDoctor = diagnose;
5
3
  function environmentLine(env) {
6
4
  if (env.lastVerifiedWrite === null) {
@@ -11,22 +9,53 @@ function environmentLine(env) {
11
9
  return (`CHANGED since the last verified write — ${describeEnvironmentChanges(env.changes)} ` +
12
10
  "(a macOS consent prompt may reappear on the next automation call)");
13
11
  }
12
+ /** The `── Sync health ──` section: freshness proxies + the cloud last-attempt signal. */
13
+ function syncHealthLines(sh) {
14
+ return [
15
+ "── Sync health ──",
16
+ `app: ${sh.appRunning.verdict}`,
17
+ `wal: ${sh.wal.verdict}`,
18
+ `last edit: ${sh.lastLocalEdit.verdict}`,
19
+ `foreground: ${sh.lastForeground.verdict}`,
20
+ `cloud: ${sh.cloud.verdict}`,
21
+ ];
22
+ }
23
+ /** The `── ui vector ──` section: config + app + Accessibility + certification. */
24
+ function uiVectorLines(ui) {
25
+ const total = ui.certification.length;
26
+ const certified = ui.certification.filter((c) => c.status === "certified").length;
27
+ const lab = ui.certification.filter((c) => c.status === "lab-certified").length;
28
+ return [
29
+ "── ui vector (Accessibility GUI) ──",
30
+ `enabled: ${ui.enabled ? "yes" : "no"} — ${ui.reason}`,
31
+ `app running: ${ui.appRunning ? "yes" : "no"}`,
32
+ `accessibility: ${ui.accessibility.status} — ${ui.accessibility.detail}`,
33
+ `certification: ${certified} on-device + ${lab} lab-verified of ${total} (${ui.certificationProfile}) — ` +
34
+ "lab-verified recipes ran end-to-end in a disposable VM; on-device confirmation is the " +
35
+ "final step (docs/lab/ui-certification-runbook.md)",
36
+ ];
37
+ }
14
38
  export function registerDoctor(program) {
15
39
  program
16
40
  .command("doctor")
17
41
  .description("Check environment health: database location, database schema compatibility, app " +
18
42
  "presence, any one-time setup still needed (macOS permissions, the app's " +
19
- "'Enable Things URLs' setting), and whether the environment changed since the last " +
20
- "successful write with steps to fix. " +
43
+ "'Enable Things URLs' setting), whether the environment changed since the last " +
44
+ "successful write, and a sync-health summary (whether the app is running, how recently " +
45
+ "the data changed, and — when a Things Cloud account is attached — the last sync " +
46
+ "attempt) — with steps to fix. " +
21
47
  "Exit 0 healthy; 5 schema drift (writes disabled); 7 environment problem.")
22
48
  .option("--json", "emit versioned JSON envelope on stdout")
23
49
  .option("--db <path>", "explicit database path (overrides THINGS_DB and discovery)")
24
50
  .option("--probe-automation", "actively test whether automation of Things is authorized (may show a one-time macOS " +
25
51
  "consent prompt; skipped when Things is not running)")
52
+ .option("--probe-accessibility", "actively test whether the ui vector's Accessibility access is granted and its GUI " +
53
+ "recipe resolves (may show a one-time macOS prompt; skipped when Things is not running)")
26
54
  .action((opts) => {
27
55
  const started = Date.now();
28
56
  const { report, error, exitCode, meta } = diagnose(opts.db, {
29
57
  ...(opts.probeAutomation === true && { probeAutomation: true }),
58
+ ...(opts.probeAccessibility === true && { probeAccessibility: true }),
30
59
  });
31
60
  const fullMeta = { ...meta, elapsedMs: Date.now() - started };
32
61
  if (opts.json) {
@@ -54,6 +83,16 @@ export function registerDoctor(program) {
54
83
  `shortcuts: ${report.availability.shortcuts.present.length}/${report.availability.shortcuts.present.length +
55
84
  report.availability.shortcuts.missing.length} proxies installed — ${report.availability.shortcuts.detail}`,
56
85
  `repeats: ${report.recurrence.templates} template(s), ${report.recurrence.undecodable} undecodable${report.recurrence.undecodable > 0 ? ` — ${report.recurrence.detail}` : ""}`,
86
+ ...(report.audit.orphanedIntents > 0
87
+ ? [
88
+ `changes: ${report.audit.orphanedIntents} change(s) were started but their ` +
89
+ `result was not recorded (newest ${report.audit.newestOrphanIntent}) — a ` +
90
+ `change may have been applied in Things without being saved to the local ` +
91
+ `history; review your recent changes in Things`,
92
+ ]
93
+ : []),
94
+ ...syncHealthLines(report.syncHealth),
95
+ ...uiVectorLines(report.ui),
57
96
  ];
58
97
  process.stdout.write(`${lines.join("\n")}\n`);
59
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Command } from "commander";
2
+ import { ExitCode } from "../../index.ts";
3
+ /** How the skill was placed (or would have been). */
4
+ type InstallPath = "skills-cli" | "builtin-copy" | "simulated" | "check";
5
+ /** Per-location report row. */
6
+ interface LocationReport {
7
+ label: string;
8
+ dir: string;
9
+ installedVersion: string | null;
10
+ /** up-to-date | behind | differs | absent (check); written (install copy). */
11
+ status: "up-to-date" | "behind" | "differs" | "absent" | "written";
12
+ }
13
+ interface InstallSkillData {
14
+ mode: "install" | "check";
15
+ path: InstallPath;
16
+ global: boolean;
17
+ bundledVersion: string | null;
18
+ locations: LocationReport[];
19
+ detail: string;
20
+ }
21
+ /** Injectable side effects, so the integration test never touches the network. */
22
+ export interface InstallSkillDeps {
23
+ home: string;
24
+ /** True to simulate without touching HOME (bench fence). */
25
+ simulated: boolean;
26
+ /** Run `skills add`; returns true on success, false when unavailable/failed. */
27
+ runSkillsCli: (skillDir: string, global: boolean) => boolean;
28
+ /** Plain-copy the bundled skill into a destination directory (clean overwrite). */
29
+ copyInto: (skillDir: string, destDir: string) => void;
30
+ }
31
+ /** Default plain copy: replace the destination directory wholesale. */
32
+ export declare function defaultCopyInto(skillDir: string, destDir: string): void;
33
+ /**
34
+ * The command core, side effects injected. Returns the structured result and the
35
+ * exit code; the caller renders it (human or --json).
36
+ */
37
+ export declare function installSkill(opts: {
38
+ check?: boolean;
39
+ project?: boolean;
40
+ }, deps: InstallSkillDeps): {
41
+ data: InstallSkillData;
42
+ exitCode: ExitCode;
43
+ };
44
+ export declare function registerInstallSkill(program: Command): void;
45
+ export {};