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.
- package/README.md +57 -12
- 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/clock.d.ts +8 -0
- package/dist/cli/clock.js +24 -0
- package/dist/cli/clock.js.map +1 -0
- package/dist/cli/commands/area.d.ts +26 -3
- package/dist/cli/commands/area.js +129 -75
- 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/install-skill.d.ts +45 -0
- package/dist/cli/commands/install-skill.js +207 -0
- package/dist/cli/commands/install-skill.js.map +1 -0
- package/dist/cli/commands/mcp.js +23 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/project.d.ts +18 -1
- package/dist/cli/commands/project.js +74 -35
- package/dist/cli/commands/project.js.map +1 -1
- package/dist/cli/commands/reads.d.ts +15 -2
- package/dist/cli/commands/reads.js +459 -165
- 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 +8 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/show.js +53 -30
- package/dist/cli/commands/show.js.map +1 -1
- package/dist/cli/commands/todo.d.ts +1 -1
- package/dist/cli/commands/todo.js +20 -13
- package/dist/cli/commands/todo.js.map +1 -1
- package/dist/cli/commands/writes.js +388 -161
- package/dist/cli/commands/writes.js.map +1 -1
- package/dist/cli/did-you-mean.d.ts +1 -1
- 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 +55 -2
- package/dist/cli/glyphs.js +114 -21
- package/dist/cli/glyphs.js.map +1 -1
- package/dist/cli/help.d.ts +54 -0
- package/dist/cli/help.js +405 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.js +64 -26
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/move-hint.d.ts +45 -0
- package/dist/cli/move-hint.js +196 -0
- package/dist/cli/move-hint.js.map +1 -0
- package/dist/cli/period.d.ts +9 -8
- package/dist/cli/period.js +56 -30
- package/dist/cli/period.js.map +1 -1
- package/dist/cli/read-driver.d.ts +26 -19
- package/dist/cli/read-driver.js +77 -33
- package/dist/cli/read-driver.js.map +1 -1
- package/dist/cli/render.d.ts +92 -28
- package/dist/cli/render.js +333 -103
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/resolve-invocation.d.ts +42 -4
- package/dist/cli/resolve-invocation.js +97 -14
- package/dist/cli/resolve-invocation.js.map +1 -1
- package/dist/cli/skill-check.d.ts +21 -0
- package/dist/cli/skill-check.js +82 -0
- package/dist/cli/skill-check.js.map +1 -0
- package/dist/cli/skill.d.ts +62 -0
- package/dist/cli/skill.js +142 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/cli/tag-filters.d.ts +63 -0
- package/dist/cli/tag-filters.js +59 -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 +163 -0
- package/dist/cli/verb-hint.js.map +1 -0
- package/dist/cli/version.d.ts +4 -0
- package/dist/cli/version.js +18 -0
- package/dist/cli/version.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 +160 -24
- package/dist/client.js +132 -19
- 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 +97 -17
- 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 +36 -5
- package/dist/index.js +38 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -1
- package/dist/mcp/server.js +1038 -436
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/clock.d.ts +61 -0
- package/dist/model/clock.js +71 -0
- package/dist/model/clock.js.map +1 -0
- package/dist/model/dates.d.ts +26 -3
- package/dist/model/dates.js +84 -3
- package/dist/model/dates.js.map +1 -1
- package/dist/model/entities.d.ts +48 -10
- package/dist/model/entities.js.map +1 -1
- package/dist/model/mappers.d.ts +9 -2
- package/dist/model/mappers.js +32 -9
- package/dist/model/mappers.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 +55 -17
- package/dist/read/area-view.js.map +1 -1
- package/dist/read/detail.d.ts +1 -1
- package/dist/read/detail.js +11 -4
- package/dist/read/detail.js.map +1 -1
- 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 +1 -1
- package/dist/read/log-boundary.js +13 -3
- package/dist/read/log-boundary.js.map +1 -1
- package/dist/read/predicates.d.ts +30 -0
- package/dist/read/predicates.js +30 -0
- package/dist/read/predicates.js.map +1 -1
- package/dist/read/project-view.d.ts +12 -1
- package/dist/read/project-view.js +45 -12
- package/dist/read/project-view.js.map +1 -1
- package/dist/read/queries.d.ts +152 -7
- package/dist/read/queries.js +277 -36
- package/dist/read/queries.js.map +1 -1
- 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/sidebar-order.js +2 -1
- package/dist/read/sidebar-order.js.map +1 -1
- package/dist/read/snapshot.d.ts +1 -1
- package/dist/read/snapshot.js +9 -2
- package/dist/read/snapshot.js.map +1 -1
- 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/{pagination.js → truncation.js} +103 -94
- package/dist/read/truncation.js.map +1 -0
- package/dist/read/views.d.ts +147 -22
- package/dist/read/views.js +282 -80
- package/dist/read/views.js.map +1 -1
- package/dist/surface-copy.d.ts +19 -0
- package/dist/surface-copy.js +32 -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 +71 -0
- package/dist/write/accessibility-probe.js.map +1 -0
- package/dist/write/automation-probe.d.ts +8 -1
- package/dist/write/automation-probe.js +16 -1
- package/dist/write/automation-probe.js.map +1 -1
- package/dist/write/batch.js +5 -2
- package/dist/write/batch.js.map +1 -1
- package/dist/write/capabilities.d.ts +8 -0
- package/dist/write/capabilities.js +13 -6
- package/dist/write/capabilities.js.map +1 -1
- package/dist/write/commands.d.ts +3 -1
- package/dist/write/commands.js +602 -49
- 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 +87 -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 +73 -2
- package/dist/write/pipeline.js +218 -43
- package/dist/write/pipeline.js.map +1 -1
- package/dist/write/planner.js +8 -1
- package/dist/write/planner.js.map +1 -1
- package/dist/write/pre-state.d.ts +105 -3
- package/dist/write/pre-state.js +144 -3
- package/dist/write/pre-state.js.map +1 -1
- package/dist/write/recurrence-rule-blob.d.ts +65 -0
- package/dist/write/recurrence-rule-blob.js +150 -0
- package/dist/write/recurrence-rule-blob.js.map +1 -0
- 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 +493 -80
- package/dist/write/undo.js.map +1 -1
- package/dist/write/vectors/registry.d.ts +15 -1
- package/dist/write/vectors/registry.js +65 -2
- package/dist/write/vectors/registry.js.map +1 -1
- package/dist/write/vectors/simulator.d.ts +44 -0
- package/dist/write/vectors/simulator.js +1136 -0
- package/dist/write/vectors/simulator.js.map +1 -0
- package/dist/write/vectors/types.d.ts +154 -3
- package/dist/write/vectors/ui-certification.d.ts +54 -0
- package/dist/write/vectors/ui-certification.js +43 -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 +83 -0
- package/dist/write/vectors/ui-recipes.js +610 -0
- package/dist/write/vectors/ui-recipes.js.map +1 -0
- package/dist/write/vectors/ui.d.ts +152 -0
- package/dist/write/vectors/ui.js +704 -0
- package/dist/write/vectors/ui.js.map +1 -0
- package/dist/write/verify/delta.d.ts +141 -4
- package/dist/write/verify/delta.js +199 -21
- package/dist/write/verify/delta.js.map +1 -1
- package/dist/write/verify/poller.d.ts +7 -1
- package/dist/write/verify/poller.js +21 -1
- package/dist/write/verify/poller.js.map +1 -1
- package/package.json +18 -3
- package/skills/things-cli/SKILL.md +53 -0
- package/skills/things-cli/references/contracts.md +41 -0
- package/skills/things-cli/references/gui.md +11 -0
- package/skills/things-cli/references/model.md +51 -0
- 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/pagination.d.ts +0 -104
- package/dist/read/pagination.js.map +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `things install-skill` — place the bundled agent skill (`skills/things-cli/`)
|
|
3
|
+
* where coding agents discover it. Prefers the `skills` CLI (vercel-labs), which
|
|
4
|
+
* detects every installed agent harness and keeps one canonical copy under
|
|
5
|
+
* `~/.agents/skills/`; falls back to a plain copy into the two roots we can place
|
|
6
|
+
* without detection (`~/.agents` and `~/.claude`) when that tool or the network
|
|
7
|
+
* is unavailable. Re-running it IS the update: the skill directory is replaced
|
|
8
|
+
* wholesale, so a stale copy is cleanly overwritten.
|
|
9
|
+
*/
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
|
+
import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs";
|
|
12
|
+
import { dirname } from "node:path";
|
|
13
|
+
import { ExitCode, okEnvelope, simFenceActive } from "../../index.js";
|
|
14
|
+
import { bundledSkillDir, bundledSkillVersion, compareSemver, installedSkillVersion, resolveHome, skillLocations, } from "../skill.js";
|
|
15
|
+
/** Default `skills` shell-out: `npx -y skills add <dir> [-g] -y`, offline-safe. */
|
|
16
|
+
function defaultRunSkillsCli(skillDir, global) {
|
|
17
|
+
const args = ["-y", "skills", "add", skillDir, ...(global ? ["-g"] : []), "-y"];
|
|
18
|
+
try {
|
|
19
|
+
execFileSync("npx", args, { stdio: ["ignore", "ignore", "ignore"], timeout: 180000 });
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// npx missing, network dead, or the tool errored — fall back to a plain copy.
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Default plain copy: replace the destination directory wholesale. */
|
|
28
|
+
export function defaultCopyInto(skillDir, destDir) {
|
|
29
|
+
mkdirSync(dirname(destDir), { recursive: true });
|
|
30
|
+
rmSync(destDir, { recursive: true, force: true });
|
|
31
|
+
cpSync(skillDir, destDir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
function meta(started) {
|
|
34
|
+
return { dbVersion: null, fingerprint: "unknown", elapsedMs: Date.now() - started };
|
|
35
|
+
}
|
|
36
|
+
/** Classify an installed stamp against the bundled one for `--check`. */
|
|
37
|
+
function checkStatus(installed, bundled) {
|
|
38
|
+
if (installed === null)
|
|
39
|
+
return "absent";
|
|
40
|
+
if (installed === bundled)
|
|
41
|
+
return "up-to-date";
|
|
42
|
+
const cmp = compareSemver(installed, bundled);
|
|
43
|
+
if (cmp !== null && cmp < 0)
|
|
44
|
+
return "behind";
|
|
45
|
+
return cmp === 0 ? "up-to-date" : "differs";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The command core, side effects injected. Returns the structured result and the
|
|
49
|
+
* exit code; the caller renders it (human or --json).
|
|
50
|
+
*/
|
|
51
|
+
export function installSkill(opts, deps) {
|
|
52
|
+
const global = opts.project !== true;
|
|
53
|
+
const skillDir = bundledSkillDir();
|
|
54
|
+
const bundledVersion = bundledSkillVersion();
|
|
55
|
+
const locations = skillLocations(deps.home);
|
|
56
|
+
if (!existsSync(skillDir)) {
|
|
57
|
+
return {
|
|
58
|
+
exitCode: ExitCode.Environment,
|
|
59
|
+
data: {
|
|
60
|
+
mode: opts.check === true ? "check" : "install",
|
|
61
|
+
path: "check",
|
|
62
|
+
global,
|
|
63
|
+
bundledVersion,
|
|
64
|
+
locations: [],
|
|
65
|
+
detail: `bundled skill directory not found: ${skillDir}`,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// --check: read stamps, compare, never write.
|
|
70
|
+
if (opts.check === true) {
|
|
71
|
+
const rows = locations.map((loc) => {
|
|
72
|
+
const installed = installedSkillVersion(loc.dir);
|
|
73
|
+
return {
|
|
74
|
+
label: loc.label,
|
|
75
|
+
dir: loc.dir,
|
|
76
|
+
installedVersion: installed,
|
|
77
|
+
status: checkStatus(installed, bundledVersion),
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
const canonical = rows.find((_, i) => locations[i]?.canonical === true) ?? rows[0];
|
|
81
|
+
const ok = canonical !== undefined && canonical.status === "up-to-date";
|
|
82
|
+
return {
|
|
83
|
+
exitCode: ok ? ExitCode.Ok : ExitCode.Environment,
|
|
84
|
+
data: {
|
|
85
|
+
mode: "check",
|
|
86
|
+
path: "check",
|
|
87
|
+
global,
|
|
88
|
+
bundledVersion,
|
|
89
|
+
locations: rows,
|
|
90
|
+
detail: ok
|
|
91
|
+
? "installed skill is up to date"
|
|
92
|
+
: "run `things install-skill` to install or update the agent skill",
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Bench fence: never write into a real HOME during a simulated run.
|
|
97
|
+
if (deps.simulated) {
|
|
98
|
+
return {
|
|
99
|
+
exitCode: ExitCode.Ok,
|
|
100
|
+
data: {
|
|
101
|
+
mode: "install",
|
|
102
|
+
path: "simulated",
|
|
103
|
+
global,
|
|
104
|
+
bundledVersion,
|
|
105
|
+
locations: [],
|
|
106
|
+
detail: "simulated: no files were written (the skill roots were not touched)",
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Prefer the skills CLI; fall back to a plain copy into the two known roots.
|
|
111
|
+
const viaCli = deps.runSkillsCli(skillDir, global);
|
|
112
|
+
if (viaCli) {
|
|
113
|
+
const rows = locations
|
|
114
|
+
.filter((loc) => loc.canonical || existsSync(loc.dir))
|
|
115
|
+
.map((loc) => ({
|
|
116
|
+
label: loc.label,
|
|
117
|
+
dir: loc.dir,
|
|
118
|
+
installedVersion: installedSkillVersion(loc.dir),
|
|
119
|
+
status: "written",
|
|
120
|
+
}));
|
|
121
|
+
return {
|
|
122
|
+
exitCode: ExitCode.Ok,
|
|
123
|
+
data: {
|
|
124
|
+
mode: "install",
|
|
125
|
+
path: "skills-cli",
|
|
126
|
+
global,
|
|
127
|
+
bundledVersion,
|
|
128
|
+
locations: rows,
|
|
129
|
+
detail: "installed via the skills CLI (canonical ~/.agents + detected agent dirs)",
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const rows = locations.map((loc) => {
|
|
134
|
+
deps.copyInto(skillDir, loc.dir);
|
|
135
|
+
return {
|
|
136
|
+
label: loc.label,
|
|
137
|
+
dir: loc.dir,
|
|
138
|
+
installedVersion: installedSkillVersion(loc.dir),
|
|
139
|
+
status: "written",
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
exitCode: ExitCode.Ok,
|
|
144
|
+
data: {
|
|
145
|
+
mode: "install",
|
|
146
|
+
path: "builtin-copy",
|
|
147
|
+
global,
|
|
148
|
+
bundledVersion,
|
|
149
|
+
locations: rows,
|
|
150
|
+
detail: "skills CLI unavailable — used a built-in copy (install `skills` to cover other agents)",
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/** Human-readable rendering of the result. */
|
|
155
|
+
function render(data) {
|
|
156
|
+
const lines = [];
|
|
157
|
+
const ver = data.bundledVersion ?? "unstamped";
|
|
158
|
+
if (data.mode === "check") {
|
|
159
|
+
lines.push(`bundled skill version: ${ver}`);
|
|
160
|
+
for (const r of data.locations) {
|
|
161
|
+
const iv = r.installedVersion ?? "(not installed)";
|
|
162
|
+
lines.push(` ${r.label}: ${iv} — ${r.status}`);
|
|
163
|
+
}
|
|
164
|
+
lines.push("", data.detail);
|
|
165
|
+
return lines;
|
|
166
|
+
}
|
|
167
|
+
if (data.path === "simulated") {
|
|
168
|
+
lines.push(data.detail);
|
|
169
|
+
return lines;
|
|
170
|
+
}
|
|
171
|
+
lines.push(data.path === "skills-cli"
|
|
172
|
+
? "Installed the things-cli agent skill via the skills CLI."
|
|
173
|
+
: "Installed the things-cli agent skill (built-in copy).");
|
|
174
|
+
for (const r of data.locations)
|
|
175
|
+
lines.push(` ${r.label}: ${r.dir}`);
|
|
176
|
+
lines.push("", data.detail, "", "Re-run `things install-skill` any time to update; `--check` compares versions without writing.");
|
|
177
|
+
return lines;
|
|
178
|
+
}
|
|
179
|
+
export function registerInstallSkill(program) {
|
|
180
|
+
program
|
|
181
|
+
.command("install-skill")
|
|
182
|
+
.description("Install the bundled agent skill so coding agents can drive `things` with no " +
|
|
183
|
+
"out-of-band knowledge. Uses the skills CLI when available (covering every " +
|
|
184
|
+
"detected agent), otherwise a built-in copy into ~/.agents and ~/.claude. " +
|
|
185
|
+
"Re-run any time to update — the skill is replaced wholesale. --check compares " +
|
|
186
|
+
"the installed version against the bundled one without writing anything.")
|
|
187
|
+
.option("--check", "report installed vs bundled skill version without writing")
|
|
188
|
+
.option("--project", "install into the current project (.agents) instead of globally")
|
|
189
|
+
.option("--json", "emit versioned JSON envelope on stdout")
|
|
190
|
+
.action((opts) => {
|
|
191
|
+
const started = Date.now();
|
|
192
|
+
const { data, exitCode } = installSkill(opts, {
|
|
193
|
+
home: resolveHome(),
|
|
194
|
+
simulated: simFenceActive(),
|
|
195
|
+
runSkillsCli: defaultRunSkillsCli,
|
|
196
|
+
copyInto: defaultCopyInto,
|
|
197
|
+
});
|
|
198
|
+
if (opts.json === true) {
|
|
199
|
+
process.stdout.write(`${JSON.stringify(okEnvelope("install-skill", data, meta(started)))}\n`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
process.stdout.write(`${render(data).join("\n")}\n`);
|
|
203
|
+
}
|
|
204
|
+
process.exitCode = exitCode;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=install-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../../src/cli/commands/install-skill.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands/mcp.js
CHANGED
|
@@ -1,25 +1,44 @@
|
|
|
1
|
+
import { loadMcpServer } from "../../index.js";
|
|
1
2
|
export function registerMcp(program) {
|
|
2
3
|
program
|
|
3
4
|
.command("mcp")
|
|
4
5
|
.description("Serve the Things MCP server on stdio (Model Context Protocol). Tools cover the full " +
|
|
5
6
|
"surface: read views, search, changes, item detail, to-do/project/area/tag " +
|
|
6
7
|
"mutations, batch, reorder, undo, capabilities, doctor; the server instructions " +
|
|
7
|
-
"carry the user's live area/tag/project inventory.
|
|
8
|
-
|
|
8
|
+
"carry the user's live area/tag/project inventory. By default the server only makes " +
|
|
9
|
+
"changes that keep the app in the background; --allow-disruptive / " +
|
|
10
|
+
"--allow-very-disruptive raise that ceiling for the whole session (there is no " +
|
|
11
|
+
'per-request override). Configure in an MCP client as command `things` with args ["mcp"].')
|
|
9
12
|
.option("--db <path>", "explicit database path")
|
|
13
|
+
.option("--allow-disruptive", "permit changes that briefly steal window focus")
|
|
14
|
+
.option("--allow-very-disruptive", "permit changes that visibly drive the Things UI")
|
|
10
15
|
.action(async (opts) => {
|
|
11
16
|
// LAZY imports: the MCP SDK + zod load only when `things mcp` actually
|
|
12
17
|
// runs. Every other CLI command must work in environments that ship a
|
|
13
18
|
// minimal dependency set (the guest e2e bundle carries only commander).
|
|
19
|
+
// The server surface is reached through the library's lazy loader
|
|
20
|
+
// (loadMcpServer), keeping the air-gap boundary intact.
|
|
14
21
|
const [{ createThingsMcpServer }, { StdioServerTransport }] = await Promise.all([
|
|
15
|
-
|
|
22
|
+
loadMcpServer(),
|
|
16
23
|
import("@modelcontextprotocol/sdk/server/stdio.js"),
|
|
17
24
|
]);
|
|
18
|
-
|
|
25
|
+
// Same mapping the CLI's per-call write flags use (writeOptionsFrom):
|
|
26
|
+
// --allow-very-disruptive → 3, --allow-disruptive → 2, else the config
|
|
27
|
+
// default. Fixed for the process — the server has no per-request escalation.
|
|
28
|
+
const maxDisruption = opts.allowVeryDisruptive
|
|
29
|
+
? 3
|
|
30
|
+
: opts.allowDisruptive
|
|
31
|
+
? 2
|
|
32
|
+
: undefined;
|
|
33
|
+
const server = createThingsMcpServer({
|
|
34
|
+
...(opts.db !== undefined && { dbPath: opts.db }),
|
|
35
|
+
...(maxDisruption !== undefined && { maxDisruption }),
|
|
36
|
+
});
|
|
19
37
|
const transport = new StdioServerTransport();
|
|
20
38
|
await server.connect(transport);
|
|
21
39
|
process.stderr.write("things-api MCP server listening on stdio\n");
|
|
22
40
|
// The transport keeps the process alive; exit cleanly when it closes.
|
|
41
|
+
// oxlint-disable-next-line unicorn/prefer-add-event-listener -- MCP SDK Transport exposes an onclose property, not an EventTarget
|
|
23
42
|
transport.onclose = () => process.exit(0);
|
|
24
43
|
});
|
|
25
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,sFAAsF;QACpF,4EAA4E;QAC5E,iFAAiF;QACjF,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAuB,MAAM,gBAAgB,CAAC;AAEpE,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,sFAAsF;QACpF,4EAA4E;QAC5E,iFAAiF;QACjF,qFAAqF;QACrF,oEAAoE;QACpE,gFAAgF;QAChF,0FAA0F,CAC7F;SACA,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;SAC/C,MAAM,CAAC,oBAAoB,EAAE,gDAAgD,CAAC;SAC9E,MAAM,CAAC,yBAAyB,EAAE,iDAAiD,CAAC;SACpF,MAAM,CACL,KAAK,EAAE,IAA+E,EAAE,EAAE;QACxF,uEAAuE;QACvE,sEAAsE;QACtE,wEAAwE;QACxE,kEAAkE;QAClE,wDAAwD;QACxD,MAAM,CAAC,EAAE,qBAAqB,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9E,aAAa,EAAE;YACf,MAAM,CAAC,2CAA2C,CAAC;SACpD,CAAC,CAAC;QACH,sEAAsE;QACtE,uEAAuE;QACvE,6EAA6E;QAC7E,MAAM,aAAa,GAA+B,IAAI,CAAC,mBAAmB;YACxE,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,eAAe;gBACpB,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACjD,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACnE,sEAAsE;QACtE,kIAAkI;QAClI,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
* `things project show <uuid>` — the composite project view.
|
|
3
3
|
*/
|
|
4
4
|
import type { Command } from "commander";
|
|
5
|
-
import type
|
|
5
|
+
import { type ProjectView } from "../../index.ts";
|
|
6
|
+
import { type TagFlags } from "../tag-filters.ts";
|
|
6
7
|
export interface ProjectShowOpts {
|
|
7
8
|
showLater?: boolean;
|
|
8
9
|
/** Optional-value flag: bare = the FULL project logbook (finite lifespans), a count to cap it. */
|
|
9
10
|
showLogged?: boolean | string;
|
|
11
|
+
/** The user's invocation, echoed by the disclosure hints. */
|
|
12
|
+
hintBase?: string;
|
|
10
13
|
}
|
|
11
14
|
/** Reconstruct the show-toggle flags the user passed, for footer echoes. */
|
|
12
15
|
export declare function showToggleFlags(opts: {
|
|
@@ -21,4 +24,18 @@ export declare function showToggleFlags(opts: {
|
|
|
21
24
|
* them, `--show-logged` reveals the full logbook.
|
|
22
25
|
*/
|
|
23
26
|
export declare function renderProjectView(view: ProjectView, opts: ProjectShowOpts): string[];
|
|
27
|
+
/** Options accepted by the project-show code path (shared by `project show` and `projects <ref>`). */
|
|
28
|
+
export type ProjectShowActionOpts = ProjectShowOpts & TagFlags & {
|
|
29
|
+
json?: boolean;
|
|
30
|
+
db?: string;
|
|
31
|
+
all?: boolean;
|
|
32
|
+
/** Content scope: keep only child to-dos whose own deadline is overdue. */
|
|
33
|
+
overdue?: boolean;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* The `project show <ref>` action body, factored out so the pluralized
|
|
37
|
+
* `things projects <ref>` can delegate to the identical code path (a true
|
|
38
|
+
* synonym). Both echo the canonical `things project show …` hint.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runProjectShow(ref: string, rawOpts: ProjectShowActionOpts): void;
|
|
24
41
|
export declare function registerProjectCommands(program: Command): void;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { localToday } from "../../
|
|
1
|
+
import { localToday } from "../../index.js";
|
|
2
2
|
import { bold, dim, green, underline } from "../style.js";
|
|
3
|
-
import { countChip, deadlineDetail, loggedDate, projectCircle, thingsLink, whenValue, } from "../glyphs.js";
|
|
4
|
-
import { openInThings } from "./reads.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { countChip, deadlineDetail, inheritedChips, loggedDate, projectCircle, thingsLink, whenValue, } from "../glyphs.js";
|
|
4
|
+
import { openInThings, revealLine } from "./reads.js";
|
|
5
|
+
import { renderNow, renderZone } from "../clock.js";
|
|
6
|
+
import { invocation, runRead, shellQuote, withClient } from "../read-driver.js";
|
|
7
|
+
import { disclosureHint, formatItem, quoteTitle, uuidCol, uuidDisplayWidth } from "../render.js";
|
|
7
8
|
import { DidYouMeanError } from "../did-you-mean.js";
|
|
9
|
+
import { addTagFilterOptions, CONTAINER_TAG_HINT, tagFilterFields, tagFlagConflict, tagInvocationParts, } from "../tag-filters.js";
|
|
8
10
|
/** Reconstruct the show-toggle flags the user passed, for footer echoes. */
|
|
9
11
|
export function showToggleFlags(opts) {
|
|
10
12
|
return [
|
|
@@ -60,7 +62,7 @@ export function renderProjectView(view, opts) {
|
|
|
60
62
|
// share link, then labeled when/deadline/tags lines and the full note.
|
|
61
63
|
// The opened resource shows its tags green (GUI: list pills are gray).
|
|
62
64
|
const p = view.project;
|
|
63
|
-
const todayIso = localToday();
|
|
65
|
+
const todayIso = localToday(renderNow(), renderZone());
|
|
64
66
|
const areaSuffix = p.area === null ? "" : ` ${dim(`(${p.area.title})`)}`;
|
|
65
67
|
// In the Trash the card says so — the only view where the project's
|
|
66
68
|
// would-be-recovered (untrashed) children remain visible.
|
|
@@ -80,8 +82,10 @@ export function renderProjectView(view, opts) {
|
|
|
80
82
|
lines.push(` ${dim("logged:")} ${loggedDate(p.stopped, todayIso)} ${dim(`(${p.status})`)}`);
|
|
81
83
|
if (p.tags.length > 0)
|
|
82
84
|
lines.push(` ${dim("tags:")} ${green(`#${p.tags.map((t) => t.title).join(" #")}`)}`);
|
|
85
|
+
// Inherited (from the area) renders dim as plain tag names, only when
|
|
86
|
+
// present — a zero-inherited card is byte-identical to no line.
|
|
83
87
|
if (p.inheritedTags !== undefined && p.inheritedTags.length > 0)
|
|
84
|
-
lines.push(` ${dim("inherited:")} ${
|
|
88
|
+
lines.push(` ${dim("inherited:")} ${inheritedChips(p.inheritedTags)}`);
|
|
85
89
|
if (p.repeating.isTemplate)
|
|
86
90
|
lines.push(` ${dim("repeating:")} TEMPLATE (invisible in list views)`);
|
|
87
91
|
if (p.repeating.isInstance)
|
|
@@ -98,13 +102,17 @@ export function renderProjectView(view, opts) {
|
|
|
98
102
|
const members = [...group.items, ...(laterByHeading.get(group.heading.uuid) ?? [])];
|
|
99
103
|
lines.push("", `${dim(uuidCol(group.heading.uuid, w))} ${dim(underline(group.heading.title))}`, ...(members.length > 0 ? members.map(fmt) : ["(none)"]));
|
|
100
104
|
}
|
|
101
|
-
//
|
|
105
|
+
// The user's invocation, echoed by the disclosure hints (fallback for a
|
|
106
|
+
// caller that omits it, e.g. a direct unit test).
|
|
107
|
+
const base = opts.hintBase ?? `things project show ${quoteTitle(view.project.title)}`;
|
|
108
|
+
// Default-hidden rows are never silent — a HIDDEN-SECTION placeholder (flush,
|
|
109
|
+
// full command) stands where the later rows would render.
|
|
102
110
|
if (opts.showLater !== true) {
|
|
103
111
|
const hiddenLater = view.later.scheduled.reduce((n, d) => n + d.items.length, 0) +
|
|
104
112
|
view.later.repeating.length +
|
|
105
113
|
view.later.someday.length;
|
|
106
114
|
if (hiddenLater > 0)
|
|
107
|
-
lines.push("",
|
|
115
|
+
lines.push("", disclosureHint(hiddenLater, "later item", [{ command: `${base} --show-later` }]));
|
|
108
116
|
}
|
|
109
117
|
if (logged.length > 0) {
|
|
110
118
|
const header = logged.length < view.logged.length
|
|
@@ -113,45 +121,76 @@ export function renderProjectView(view, opts) {
|
|
|
113
121
|
lines.push("", bold(header), ...logged.map(fmt));
|
|
114
122
|
}
|
|
115
123
|
else if (view.logged.length > 0) {
|
|
116
|
-
|
|
124
|
+
// Bare `--show-logged` is the FULL project logbook, so the command reads
|
|
125
|
+
// its own effect — no label needed.
|
|
126
|
+
lines.push("", disclosureHint(view.logged.length, "logged item", [{ command: `${base} --show-logged` }]));
|
|
117
127
|
}
|
|
118
128
|
if (view.trashed.length)
|
|
119
129
|
lines.push("", bold(`── Trashed (${view.trashed.length}) ──`));
|
|
130
|
+
// PLOG1 discoverability advisory: a completed/canceled (incl. logged) project
|
|
131
|
+
// can still hold OPEN children — the app buries them in every live view, and
|
|
132
|
+
// they surface only here. A flush sibling of the disclosure-hint placeholder
|
|
133
|
+
// class (docs/design/render-language.md § Disclosure hints): the rows ARE on
|
|
134
|
+
// screen above, so it takes no `…` and no reveal command — it just names what
|
|
135
|
+
// the app hides.
|
|
136
|
+
if (view.openChildrenWhileResolved > 0) {
|
|
137
|
+
const n = view.openChildrenWhileResolved;
|
|
138
|
+
lines.push("", dim(`contains ${n} unfinished to-do${n === 1 ? "" : "s"} — invisible in the app's live views`));
|
|
139
|
+
}
|
|
120
140
|
return lines;
|
|
121
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* The `project show <ref>` action body, factored out so the pluralized
|
|
144
|
+
* `things projects <ref>` can delegate to the identical code path (a true
|
|
145
|
+
* synonym). Both echo the canonical `things project show …` hint.
|
|
146
|
+
*/
|
|
147
|
+
export function runProjectShow(ref, rawOpts) {
|
|
148
|
+
if (tagFlagConflict(rawOpts))
|
|
149
|
+
return;
|
|
150
|
+
// --all lifts the view's own default restriction (the hidden later rows).
|
|
151
|
+
// Logged is a SEPARATE content class and stays behind --show-logged.
|
|
152
|
+
const overdue = rawOpts.overdue === true;
|
|
153
|
+
const tagFilter = tagFilterFields(rawOpts);
|
|
154
|
+
const opts = {
|
|
155
|
+
...rawOpts,
|
|
156
|
+
showLater: rawOpts.showLater === true || rawOpts.all === true,
|
|
157
|
+
hintBase: invocation("project show", [
|
|
158
|
+
shellQuote(ref),
|
|
159
|
+
...showToggleFlags(rawOpts),
|
|
160
|
+
overdue && "--overdue",
|
|
161
|
+
...tagInvocationParts(rawOpts),
|
|
162
|
+
]),
|
|
163
|
+
};
|
|
164
|
+
runRead(opts, "project-view", (c) => {
|
|
165
|
+
try {
|
|
166
|
+
return { data: c.read.projectView(ref, { overdue, ...tagFilter }) };
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
// Not-found gets a type-scoped did-you-mean; ambiguity is verbatim.
|
|
170
|
+
if (err instanceof RangeError && !err.message.includes("ambiguous")) {
|
|
171
|
+
throw new DidYouMeanError(err.message, ref, c.read.liteTitleSearch(ref, { type: "project" }));
|
|
172
|
+
}
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
}, (d) => renderProjectView(d, opts));
|
|
176
|
+
}
|
|
122
177
|
export function registerProjectCommands(program) {
|
|
123
178
|
const project = program.command("project").description("Project-scoped operations");
|
|
124
|
-
project
|
|
179
|
+
const projectShow = project
|
|
125
180
|
.command("show <ref>")
|
|
126
181
|
.description("Composite project view mirroring the native UI: active items and headings. --show-later adds scheduled/repeating/someday rows inline under their headings; --show-logged adds the full logbook. Target by uuid or unique name.")
|
|
127
182
|
.option("--show-later", "include scheduled, repeating, and someday rows")
|
|
128
183
|
.option("--show-logged [n]", "include logged items (bare flag = all; pass a count to cap)")
|
|
184
|
+
.option("--overdue", "only child to-dos past their deadline (due today is not overdue)")
|
|
129
185
|
.option("--all", "reveal the later rows (same as --show-later; logged stays behind --show-logged)")
|
|
130
186
|
.option("--json", "emit versioned JSON envelope on stdout")
|
|
131
|
-
.option("--db <path>", "explicit database path")
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const opts = {
|
|
136
|
-
...rawOpts,
|
|
137
|
-
showLater: rawOpts.showLater === true || rawOpts.all === true,
|
|
138
|
-
};
|
|
139
|
-
runRead(opts, "project-view", (c) => {
|
|
140
|
-
try {
|
|
141
|
-
return { data: c.read.projectView(ref) };
|
|
142
|
-
}
|
|
143
|
-
catch (err) {
|
|
144
|
-
// Not-found gets a type-scoped did-you-mean; ambiguity is verbatim.
|
|
145
|
-
if (err instanceof RangeError && !err.message.includes("ambiguous")) {
|
|
146
|
-
throw new DidYouMeanError(err.message, ref, c.read.liteTitleSearch(ref, { type: "project" }));
|
|
147
|
-
}
|
|
148
|
-
throw err;
|
|
149
|
-
}
|
|
150
|
-
}, (d) => renderProjectView(d, opts));
|
|
151
|
-
});
|
|
187
|
+
.option("--db <path>", "explicit database path");
|
|
188
|
+
addTagFilterOptions(projectShow)
|
|
189
|
+
.addHelpText("after", CONTAINER_TAG_HINT)
|
|
190
|
+
.action((ref, rawOpts) => runProjectShow(ref, rawOpts));
|
|
152
191
|
project
|
|
153
192
|
.command("open <ref>")
|
|
154
|
-
.description("Open the project in the Things app
|
|
193
|
+
.description("Open the project in the Things app on this Mac (brings the window forward). Errors if the reference is not a project.")
|
|
155
194
|
.option("--json", "emit versioned JSON envelope on stdout")
|
|
156
195
|
.option("--db <path>", "explicit database path")
|
|
157
196
|
.action((ref, opts) => {
|
|
@@ -161,8 +200,8 @@ export function registerProjectCommands(program) {
|
|
|
161
200
|
const what = t.viaHeading === true ? "heading" : t.kind;
|
|
162
201
|
throw new RangeError(`"${ref}" is a ${what}, not a project (try \`things open\`)`);
|
|
163
202
|
}
|
|
164
|
-
return
|
|
165
|
-
}, (d) => [
|
|
203
|
+
return openInThings(t.uuid, opts.db);
|
|
204
|
+
}, (d) => [revealLine(d)]);
|
|
166
205
|
});
|
|
167
206
|
}
|
|
168
207
|
//# sourceMappingURL=project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/cli/commands/project.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/cli/commands/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,23 @@
|
|
|
6
6
|
* references) or a --json envelope.
|
|
7
7
|
*/
|
|
8
8
|
import { type Command } from "commander";
|
|
9
|
+
/** Result of an `open` command: the reveal URI, and whether it was simulated. */
|
|
10
|
+
export interface RevealResult {
|
|
11
|
+
uri: string;
|
|
12
|
+
/** true when the simulator fence is active: the URI was NOT opened. */
|
|
13
|
+
simulated: boolean;
|
|
14
|
+
}
|
|
9
15
|
/**
|
|
10
16
|
* Foreground the Things app on a resource via its share URI. A GUI action
|
|
11
17
|
* on this Mac — NOT headless; the shared implementation behind every
|
|
12
|
-
* `open` command.
|
|
18
|
+
* `open` command. The reveal is withheld (URI returned, app untouched)
|
|
19
|
+
* when the simulator fence is active OR when the database this command is
|
|
20
|
+
* reading — via `--db` or THINGS_DB — is a marked bench fixture: revealing
|
|
21
|
+
* a synthetic uuid in the operator's real app is always a bug (2026-07-17
|
|
22
|
+
* incident: a bare `--db <fixture>` invocation popped a "list does not
|
|
23
|
+
* exist" modal in the live app).
|
|
13
24
|
*/
|
|
14
|
-
export declare function openInThings(uuid: string):
|
|
25
|
+
export declare function openInThings(uuid: string, dbPath?: string): RevealResult;
|
|
26
|
+
/** One human-readable line describing an `open` result (simulated or real). */
|
|
27
|
+
export declare function revealLine(d: RevealResult): string;
|
|
15
28
|
export declare function registerReadCommands(program: Command): void;
|