@dalmasonto/taskflow-mcp 2.13.1 → 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.
- package/dist/client.d.ts +104 -1
- package/dist/client.js +101 -0
- package/dist/client.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +36 -1
- package/dist/instructions.js.map +1 -1
- package/dist/server.d.ts +13 -0
- package/dist/server.js +520 -18
- package/dist/server.js.map +1 -1
- package/dist/toolbox.d.ts +128 -0
- package/dist/toolbox.js +249 -0
- package/dist/toolbox.js.map +1 -0
- package/package.json +1 -1
package/dist/toolbox.js
ADDED
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AA2ChC,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAChE,CAAC;AAED;wEACwE;AACxE,MAAM,UAAU,aAAa,CAAC,KAA2E;IACvG,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;IAC5D,MAAM,MAAM,GACV,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IACnH,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAA;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAA;QAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAA;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;QACpE,sCAAsC;IACxC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,SAAS,CAAC,KAAuB,EAAE,UAAkB;IACnE,MAAM,KAAK,GAAG;QACZ,KAAK,KAAK,CAAC,KAAK,EAAE;QAClB,EAAE;QACF,KAAK,CAAC,WAAW;QACjB,EAAE;QACF,qDAAqD,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,QAAQ,KAAK,CAAC,YAAY,IAAI;QACjH,0GAA0G;QAC1G,EAAE;QACF,QAAQ;QACR,EAAE;QACF,OAAO;QACP,UAAU;QACV,KAAK;KACN,CAAA;IACD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,CAAA;QACnC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;YACpD,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACnG,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,sGAAsG,EAAE,EAAE,CAAC,CAAA;QAChJ,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAOnC;IACC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,UAAU,GAAG,uBAAuB,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAA;IAE9D,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/E,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAA;IAE7E,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,MAAM,EAAE,KAAK,CAAC,YAAY;QAC1B,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,UAAU;KACxB,CAAA;IACD,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAA;IAE9F,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC5D,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IACnE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;QACrB,WAAW,EAAE,UAAU;QACvB,MAAM;QACN,WAAW;QACX,iBAAiB,EAAE,gBAAgB;KACpC,CAAA;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA8C;IAClF,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/C,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAChF,MAAM,SAAS,CACb,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,EAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACxC,MAAM,CACP,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,oBAAoB,CAAA;IACjC,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzG,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,IAAI,CAAA;IACjG,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACnC,OAAO,IAAI,CAAA;AACb,CAAC;AAaD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAGrC;IACC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;IAC9C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;YACxI,SAAQ;QACV,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;QACvF,MAAM,KAAK,GAAmB,SAAS;YACrC,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;gBAClC,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,SAAS,CAAA;QACf,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK;YACL,iBAAiB,EAAE,SAAS,CAAC,OAAO;YACpC,cAAc,EAAE,MAAM,CAAC,OAAO;YAC9B,UAAU,EAAE,SAAS;SACtB,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,WAAmB,EACnB,IAAY,EACZ,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAA;QAChD,yEAAyE;QACzE,+DAA+D;QAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,eAAe,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;QACzD,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,WAAW,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,EAAU;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxB,MAAM,GAAG,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACnG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YAClB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACvB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;gBAAE,SAAQ;YAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACxB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACvB,CAAC,IAAI,CAAC,CAAA;YACN,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;YACvB,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;YACxB,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACpD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dalmasonto/taskflow-mcp",
|
|
3
|
-
"version": "2.
|
|
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": {
|