@dalmasonto/taskflow-mcp 2.13.0 → 2.14.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.
@@ -0,0 +1,249 @@
1
+ /**
2
+ * #617: installing vetted toolbox scripts into the local checkout.
3
+ *
4
+ * TaskFlow never runs a script; what it can do is put a REVIEWED one where the
5
+ * agent (or the human) can run it directly. That is this module:
6
+ *
7
+ * <project_root>/.taskflow/scripts/<name>/
8
+ * <entrypoint> the script itself
9
+ * README.md what it does, its params, its requires_env
10
+ * <project_root>/.taskflow/scripts/manifest.json
11
+ * per script: name, version, sha256, author, installed_at, vetted_by,
12
+ * vetted_note
13
+ *
14
+ * The manifest is what makes an install auditable later: the sha256 catches a
15
+ * file edited in place (which must be pushed as a new version or reinstalled,
16
+ * never run silently), and `vetted_*` records who read which version before it
17
+ * was allowed to run. The directory is git-ignored by default — TaskFlow is the
18
+ * source of truth for shared scripts, and two copies drifting is worse than
19
+ * none.
20
+ */
21
+ import { createHash } from "node:crypto";
22
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
23
+ import { join } from "node:path";
24
+ export function scriptsRoot(projectRoot) {
25
+ return join(projectRoot, ".taskflow", "scripts");
26
+ }
27
+ export function sha256Hex(text) {
28
+ return createHash("sha256").update(text, "utf8").digest("hex");
29
+ }
30
+ /** The entrypoint a script installs under. Defaults to the name, with a
31
+ * language-appropriate suffix so the file is runnable/recognisable. */
32
+ export function entrypointFor(entry) {
33
+ if (entry.entrypoint?.trim())
34
+ return entry.entrypoint.trim();
35
+ const suffix = entry.language === "python" ? ".py" : entry.language === "node" ? ".mjs" : entry.language === "bash" ? ".sh" : "";
36
+ return `${entry.name}${suffix}`;
37
+ }
38
+ export async function readManifest(projectRoot) {
39
+ try {
40
+ const raw = await readFile(join(scriptsRoot(projectRoot), "manifest.json"), "utf8");
41
+ const parsed = JSON.parse(raw);
42
+ if (parsed && parsed.version === 1 && parsed.scripts)
43
+ return parsed;
44
+ }
45
+ catch {
46
+ // No manifest yet (or one we cannot read): start clean. A corrupted
47
+ // manifest must not block installing.
48
+ }
49
+ return { version: 1, scripts: {} };
50
+ }
51
+ /** Everything a human needs to run the script without reading it first. */
52
+ export function readmeFor(entry, runCommand) {
53
+ const lines = [
54
+ `# ${entry.title}`,
55
+ "",
56
+ entry.description,
57
+ "",
58
+ `Installed by TaskFlow from the project toolbox: \`${entry.name}\` v${entry.version} (by ${entry.author_label}).`,
59
+ "Reinstalling after a new version replaces this folder; local edits are detected by checksum, not merged.",
60
+ "",
61
+ "## Run",
62
+ "",
63
+ "```sh",
64
+ runCommand,
65
+ "```",
66
+ ];
67
+ if (entry.params.length) {
68
+ lines.push("", "## Parameters", "");
69
+ for (const param of entry.params) {
70
+ const required = param.required ? " (required)" : "";
71
+ lines.push(`- \`${param.name}\`${required}${param.description ? ` — ${param.description}` : ""}`);
72
+ }
73
+ }
74
+ if (entry.requires_env.length) {
75
+ lines.push("", "## Environment", "", "The script reads these from the machine it runs on. TaskFlow stores their NAMES, never their values:", "");
76
+ for (const name of entry.requires_env)
77
+ lines.push(`- \`${name}\``);
78
+ }
79
+ if (entry.body_markdown.trim())
80
+ lines.push("", "## Notes", "", entry.body_markdown.trim());
81
+ lines.push("");
82
+ return lines.join("\n");
83
+ }
84
+ /**
85
+ * Install (or reinstall) one script. Returns the path, the run command and
86
+ * which required variables are missing here — the agent tells its human about
87
+ * those; the values are never read, stored or printed.
88
+ */
89
+ export async function installScript(options) {
90
+ const { projectRoot, entry, vettedBy, vettedNote } = options;
91
+ const env = options.env ?? process.env;
92
+ const root = scriptsRoot(projectRoot);
93
+ const dir = join(root, entry.name);
94
+ const file = entrypointFor(entry);
95
+ const runCommand = `./.taskflow/scripts/${entry.name}/${file}`;
96
+ await mkdir(dir, { recursive: true });
97
+ await writeFile(join(dir, file), entry.code, { encoding: "utf8", mode: 0o755 });
98
+ await writeFile(join(dir, "README.md"), readmeFor(entry, runCommand), "utf8");
99
+ const manifest = await readManifest(projectRoot);
100
+ const sha256 = sha256Hex(entry.code);
101
+ manifest.scripts[entry.name] = {
102
+ name: entry.name,
103
+ version: entry.version,
104
+ sha256,
105
+ author: entry.author_label,
106
+ installed_at: new Date().toISOString(),
107
+ vetted_by: vettedBy,
108
+ vetted_note: vettedNote,
109
+ };
110
+ await mkdir(root, { recursive: true });
111
+ await writeFile(join(root, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8");
112
+ const gitignoreUpdated = await ensureGitignored(projectRoot);
113
+ const missing_env = entry.requires_env.filter((name) => !env[name]);
114
+ return {
115
+ name: entry.name,
116
+ version: entry.version,
117
+ path: join(dir, file),
118
+ run_command: runCommand,
119
+ sha256,
120
+ missing_env,
121
+ gitignore_updated: gitignoreUpdated,
122
+ };
123
+ }
124
+ /** Remove an installed script (its folder and its manifest row). */
125
+ export async function uninstallScript(options) {
126
+ const { projectRoot, name } = options;
127
+ const manifest = await readManifest(projectRoot);
128
+ const existed = Boolean(manifest.scripts[name]);
129
+ delete manifest.scripts[name];
130
+ await rm(join(scriptsRoot(projectRoot), name), { recursive: true, force: true });
131
+ await writeFile(join(scriptsRoot(projectRoot), "manifest.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8").catch(() => { });
132
+ return { removed: existed };
133
+ }
134
+ /**
135
+ * Add `.taskflow/scripts/` to the project's `.gitignore`, once. Returns whether
136
+ * the file was changed.
137
+ */
138
+ export async function ensureGitignored(projectRoot) {
139
+ const path = join(projectRoot, ".gitignore");
140
+ const line = ".taskflow/scripts/";
141
+ let content = "";
142
+ try {
143
+ content = await readFile(path, "utf8");
144
+ }
145
+ catch {
146
+ // No .gitignore yet: create one with the rule.
147
+ }
148
+ const lines = content.split("\n").map((l) => l.trim());
149
+ if (lines.includes(line) || lines.includes("/.taskflow/scripts/") || lines.includes(".taskflow/scripts")) {
150
+ return false;
151
+ }
152
+ const next = content && !content.endsWith("\n") ? `${content}\n${line}\n` : `${content}${line}\n`;
153
+ await writeFile(path, next, "utf8");
154
+ return true;
155
+ }
156
+ /**
157
+ * Compare the manifest with the server's index: what is installed, what has a
158
+ * newer version, and what was edited in place. The agent reports this at
159
+ * connect — especially "update available", which is installed ONLY after the
160
+ * agent re-vets the diff.
161
+ */
162
+ export async function installedStatus(options) {
163
+ const { projectRoot, serverScripts } = options;
164
+ const manifest = await readManifest(projectRoot);
165
+ const statuses = [];
166
+ for (const script of serverScripts) {
167
+ const installed = manifest.scripts[script.name];
168
+ if (!installed) {
169
+ statuses.push({ name: script.name, state: "not-installed", installed_version: null, server_version: script.version, local_edit: false });
170
+ continue;
171
+ }
172
+ const localEdit = await installedFileEdited(projectRoot, script.name, installed.sha256);
173
+ const state = localEdit
174
+ ? "locally-edited"
175
+ : installed.version < script.version
176
+ ? "update-available"
177
+ : "current";
178
+ statuses.push({
179
+ name: script.name,
180
+ state,
181
+ installed_version: installed.version,
182
+ server_version: script.version,
183
+ local_edit: localEdit,
184
+ });
185
+ }
186
+ return statuses;
187
+ }
188
+ /** Was the installed file changed on disk since it was written? */
189
+ export async function installedFileEdited(projectRoot, name, expectedSha) {
190
+ try {
191
+ const dir = join(scriptsRoot(projectRoot), name);
192
+ // The manifest does not name the entrypoint's file; the folder holds the
193
+ // script plus README.md, so hash the one file that is neither.
194
+ const { readdir } = await import("node:fs/promises");
195
+ const files = await readdir(dir);
196
+ const [script] = files.filter((f) => f !== "README.md" && f !== "manifest.json");
197
+ if (!script)
198
+ return true;
199
+ const content = await readFile(join(dir, script), "utf8");
200
+ return sha256Hex(content) !== expectedSha;
201
+ }
202
+ catch {
203
+ return false;
204
+ }
205
+ }
206
+ /**
207
+ * A compact line diff — enough to re-vet a script that changed, without
208
+ * pulling a diff library into the MCP. Plain LCS over lines.
209
+ */
210
+ export function diffLines(from, to) {
211
+ const a = from.split("\n");
212
+ const b = to.split("\n");
213
+ const lcs = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
214
+ for (let i = a.length - 1; i >= 0; i -= 1) {
215
+ for (let j = b.length - 1; j >= 0; j -= 1) {
216
+ const row = lcs[i];
217
+ const next = lcs[i + 1];
218
+ if (!row || !next)
219
+ continue;
220
+ row[j] = a[i] === b[j] ? (next[j + 1] ?? 0) + 1 : Math.max(next[j] ?? 0, row[j + 1] ?? 0);
221
+ }
222
+ }
223
+ const lines = [];
224
+ let i = 0;
225
+ let j = 0;
226
+ while (i < a.length && j < b.length) {
227
+ const left = a[i] ?? "";
228
+ const right = b[j] ?? "";
229
+ if (left === right) {
230
+ lines.push(` ${left}`);
231
+ i += 1;
232
+ j += 1;
233
+ }
234
+ else if ((lcs[i + 1]?.[j] ?? 0) >= (lcs[i]?.[j + 1] ?? 0)) {
235
+ lines.push(`- ${left}`);
236
+ i += 1;
237
+ }
238
+ else {
239
+ lines.push(`+ ${right}`);
240
+ j += 1;
241
+ }
242
+ }
243
+ while (i < a.length)
244
+ lines.push(`- ${a[i++] ?? ""}`);
245
+ while (j < b.length)
246
+ lines.push(`+ ${b[j++] ?? ""}`);
247
+ return lines;
248
+ }
249
+ //# sourceMappingURL=toolbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbox.js","sourceRoot":"","sources":["../src/toolbox.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dalmasonto/taskflow-mcp",
3
- "version": "2.13.0",
3
+ "version": "2.14.0",
4
4
  "description": "TaskFlow MCP server for AI coding agents (Claude Code, Codex, Gemini CLI, Cursor, opencode) — multi-agent task board, realtime chat, reviews, terminal streaming, activity logging, plus Claude Code hooks and a taskflow init setup walkthrough.",
5
5
  "type": "module",
6
6
  "bin": {