@krapht/ork 0.3.0 → 1.0.0-alpha.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 (39) hide show
  1. package/README.md +16 -12
  2. package/dist/__build_info__-DdTVd2p5.mjs +615 -0
  3. package/dist/bin.mjs +1572 -909
  4. package/dist/clean-NnboOuz6.mjs +88 -0
  5. package/dist/completion-snnYGjgK.mjs +405 -0
  6. package/dist/{context-BFGC_C02.mjs → context-DO3sBy9v.mjs} +30 -191
  7. package/dist/decide-B81wCZQg.mjs +113 -0
  8. package/dist/{find-BcvhT6UN.mjs → find-BKW-uGey.mjs} +1 -1
  9. package/dist/{format-DqpObyMl.mjs → format-CmTlTOjT.mjs} +72 -198
  10. package/dist/help-groups-BwYoAWsh.mjs +354 -0
  11. package/dist/{in-a-run-BbLhZOFW.mjs → in-a-run-BPXX09Bs.mjs} +1 -1
  12. package/dist/{limits-BKYAmqCR.mjs → limits-JCve2QpI.mjs} +1 -1
  13. package/dist/list-C7UEgmtd.mjs +110 -0
  14. package/dist/{mcp-BWsdQyri.mjs → mcp-CKPyNaKD.mjs} +7 -7
  15. package/dist/{output-Q2EdeVUt.mjs → output-B1V6ZJSx.mjs} +130 -36
  16. package/dist/{pause-DKACDfV1.mjs → pause-B_SL_yDz.mjs} +4 -4
  17. package/dist/{relay-CbK-Wme9.mjs → relay-o-Luee1c.mjs} +2 -2
  18. package/dist/remove-DAZ7ZCzt.mjs +194 -0
  19. package/dist/{send-C6yr04Fe.mjs → send-3B64fBNB.mjs} +3 -3
  20. package/dist/{src-D5ruZFgD.mjs → src-BJTegEzY.mjs} +1212 -57
  21. package/dist/{src-DtN1k-B3.mjs → src-C38BPzit.mjs} +251 -18
  22. package/dist/{src-Cz1yOUTg.mjs → src-DHvWU4tX.mjs} +2742 -1659
  23. package/dist/{src-CZOVF2yU.mjs → src-Dyz_Gy1q.mjs} +35 -8
  24. package/dist/ui/THIRD_PARTY_LICENSES.txt +2 -2
  25. package/dist/ui/assets/app-C8nJ6NpT.js +67 -0
  26. package/dist/ui/assets/app-CH7YC3in.css +1 -0
  27. package/dist/ui/assets/{index-BiO54L90.css → index-BPIbqRRb.css} +1 -1
  28. package/dist/ui/assets/{index-BoG6O-Lp.js → index-D83F2OKZ.js} +2 -2
  29. package/dist/ui/index.html +2 -3
  30. package/dist/ui-CY4xxJUu.mjs +472 -0
  31. package/dist/{usage-BIjf9Xdt.mjs → usage-CJnytoe4.mjs} +6 -5
  32. package/dist/{watch-B8o4Szd_.mjs → watch-BJB82ZJ7.mjs} +7 -7
  33. package/dist/workflows-CiM7S3l0.mjs +88 -0
  34. package/dist/worktrees-86ySXxR6.mjs +212 -0
  35. package/package.json +6 -6
  36. package/dist/__build_info__-CXXMLvjt.mjs +0 -104
  37. package/dist/ui/assets/app-BlDdP396.js +0 -61
  38. package/dist/ui/assets/app-C722xNZ3.css +0 -1
  39. package/dist/ui-CZS1XKla.mjs +0 -160
@@ -0,0 +1,354 @@
1
+ // src/completion/scripts.ts
2
+ /**
3
+ * @file The tab-completion scripts `ork completion <shell>` prints, one per
4
+ * shell. Each is thin: it runs `ork __complete -- <words…>` with the word
5
+ * under the cursor last, and offers the lines it prints, `value<TAB>
6
+ * description`. A line `:group <title>` starts a group (zsh labels the menu
7
+ * with it); `:files` asks for file names too. A new shell is one more entry.
8
+ */
9
+ /** The hidden command the scripts run. */
10
+ const COMPLETE_COMMAND = "__complete";
11
+ /** Each shell's script, by the name `ork completion` takes. */
12
+ const SHELL_SCRIPTS = {
13
+ zsh: `#compdef ork
14
+ # Tab completion for ork, in zsh. Save it as _ork in a folder on your fpath
15
+ # (ork completion zsh > ~/.zsh/completions/_ork), or source it.
16
+
17
+ _ork() {
18
+ local -a lines cands
19
+ local line group=commands files=0 n=0 ret=1
20
+ lines=("\${(@f)$("\${words[1]}" ${COMPLETE_COMMAND} -- "\${(@)words[2,CURRENT]}" 2>/dev/null)}")
21
+ for line in "\${lines[@]}"; do
22
+ case $line in
23
+ (:files) files=1 ;;
24
+ (:group\\ *)
25
+ if (( \${#cands} )); then
26
+ _describe -V -t "ork-$(( ++n ))" "$group" cands && ret=0
27
+ fi
28
+ cands=()
29
+ group=\${line#:group }
30
+ ;;
31
+ (?*) cands+=("\${\${line%%$'\\t'*}//:/\\\\:}:\${line#*$'\\t'}") ;;
32
+ esac
33
+ done
34
+ if (( \${#cands} )); then
35
+ _describe -V -t "ork-$(( ++n ))" "$group" cands && ret=0
36
+ fi
37
+ if (( files )); then
38
+ _files && ret=0
39
+ fi
40
+ return ret
41
+ }
42
+
43
+ if [[ "\${funcstack[1]}" == _ork ]]; then
44
+ _ork "$@"
45
+ else
46
+ compdef _ork ork
47
+ fi
48
+ `,
49
+ bash: `# Tab completion for ork, in bash. Add to your ~/.bashrc:
50
+ # eval "$(ork completion bash)"
51
+ # (macOS's bash 3.2 can't source <(…); saving it to a file and sourcing that
52
+ # works too.) Every expansion is quoted and lines are read with read -r, so a
53
+ # candidate is never split or glob-expanded.
54
+
55
+ _ork() {
56
+ local line="\${COMP_LINE:0:COMP_POINT}" cur files=0 strip="" out
57
+ local -a words
58
+ read -r -a words <<< "$line"
59
+ if [[ "$line" == *[[:space:]] ]]; then words+=(""); fi
60
+ cur="\${words[\${#words[@]}-1]}"
61
+ COMPREPLY=()
62
+ # bash splits a word at ":" (ork:feature); offer only what follows it.
63
+ if [[ "$cur" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
64
+ strip="\${cur%"\${cur##*:}"}"
65
+ fi
66
+ out="$("\${words[0]}" ${COMPLETE_COMMAND} -- "\${words[@]:1}" 2>/dev/null)"
67
+ while IFS= read -r line; do
68
+ case "$line" in
69
+ :files) files=1 ;;
70
+ :* | "") ;;
71
+ *)
72
+ line="\${line%%$'\\t'*}"
73
+ COMPREPLY+=("\${line#"$strip"}")
74
+ ;;
75
+ esac
76
+ done <<< "$out"
77
+ if (( files )); then
78
+ out="$(compgen -f -- "$cur")"
79
+ while IFS= read -r line; do
80
+ if [[ -n "$line" ]]; then COMPREPLY+=("\${line#"$strip"}"); fi
81
+ done <<< "$out"
82
+ fi
83
+ }
84
+
85
+ complete -F _ork ork
86
+ `,
87
+ fish: `# Tab completion for ork, in fish. Save it as
88
+ # ~/.config/fish/completions/ork.fish (ork completion fish > …), or source it.
89
+
90
+ function __ork_complete
91
+ # -x is fish 4's name for -o, which it deprecates; fish 3 has only -o.
92
+ set -l tokens (commandline -xpc 2>/dev/null; or commandline -opc)
93
+ set -l current (commandline -ct)
94
+ set -l out ($tokens[1] ${COMPLETE_COMMAND} -- $tokens[2..-1] "$current" 2>/dev/null)
95
+ string match -v -r '^:' -- $out
96
+ if contains -- :files $out
97
+ __fish_complete_path "$current"
98
+ end
99
+ end
100
+
101
+ complete -c ork -f -a '(__ork_complete)'
102
+ `
103
+ };
104
+ /** The shells there is a script for. */
105
+ const SHELLS = Object.keys(SHELL_SCRIPTS);
106
+ // src/command-tree.ts
107
+ /** How a flag that only Ork passes to itself starts its description. */
108
+ const INTERNAL = "Internal:";
109
+ /** Whether citty was given a function that gives the value. */
110
+ const isThunk = (value) => typeof value === "function";
111
+ /** A value citty lets be given as is, as a promise, or as a function. */
112
+ const resolved = (value) => Promise.resolve(isThunk(value) ? value() : value);
113
+ /** `args` without the flags only Ork passes to itself. */
114
+ const publicArgs = (args) => Object.fromEntries(Object.entries(args).filter(([, def]) => !(def.description ?? "").startsWith(INTERNAL)));
115
+ /** A command's flags and positionals, which citty lets be given lazily. */
116
+ const argsOf = (cmd) => cmd.args === void 0 ? Promise.resolve({}) : resolved(cmd.args);
117
+ const listOf = (value) => value === void 0 ? [] : [value].flat();
118
+ const flagOf = (name, def) => ({
119
+ name,
120
+ description: def.description ?? "",
121
+ takesValue: def.type === "string" || def.type === "enum",
122
+ aliases: "alias" in def ? listOf(def.alias) : [],
123
+ options: def.type === "enum" ? def.options ?? [] : [],
124
+ negatable: def.type === "boolean" && def.default === true
125
+ });
126
+ /** A command's public flags and positionals, in the order it defines them. */
127
+ const argInfoOf = async (cmd) => {
128
+ const entries = Object.entries(publicArgs(await argsOf(cmd)));
129
+ return {
130
+ flags: entries.filter(([, def]) => def.type !== "positional").map(([name, def]) => flagOf(name, def)),
131
+ positionals: entries.filter(([, def]) => def.type === "positional").map(([name, def]) => ({
132
+ name,
133
+ description: def.description ?? ""
134
+ }))
135
+ };
136
+ };
137
+ /**
138
+ * A command's subcommands, in order, loaded ones resolved. A name whose
139
+ * definition is one listed before it (`wt`, `worktrees`'s) is an alias of that
140
+ * one, not an entry of its own.
141
+ */
142
+ const subcommandsOf = async (cmd) => {
143
+ const subs = cmd.subCommands === void 0 ? {} : await resolved(cmd.subCommands);
144
+ const loaded = await Promise.all(Object.entries(subs).map(async ([name, sub]) => {
145
+ const def = await resolved(sub);
146
+ return {
147
+ name,
148
+ def,
149
+ meta: def.meta === void 0 ? {} : await resolved(def.meta)
150
+ };
151
+ }));
152
+ const entries = [];
153
+ for (const { name, def, meta } of loaded) {
154
+ const same = entries.find((entry) => entry.def === def);
155
+ if (same === void 0) entries.push({
156
+ name,
157
+ aliases: listOf(meta.alias),
158
+ description: meta.description ?? "",
159
+ hidden: meta.hidden === true,
160
+ def
161
+ });
162
+ else same.aliases.push(name);
163
+ }
164
+ return entries;
165
+ };
166
+ /** The subcommand `name` (or one of its aliases) of `entries`. */
167
+ const findEntry = (entries, name) => entries.find((entry) => entry.name === name || entry.aliases.includes(name));
168
+ // src/help-groups.ts
169
+ const HELP_GROUPS = [
170
+ {
171
+ title: "Get started",
172
+ commands: [
173
+ {
174
+ name: "init",
175
+ short: "Set up Ork in this repository, in .ork/"
176
+ },
177
+ {
178
+ name: "doctor",
179
+ short: "Check Node, git and your own logins"
180
+ },
181
+ {
182
+ name: "ui",
183
+ short: "Open Ork's local UI in the browser"
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ title: "Workflows",
189
+ commands: [
190
+ {
191
+ name: "validate",
192
+ short: "Check workflow files"
193
+ },
194
+ {
195
+ name: "run",
196
+ short: "Run a workflow, or one node of it"
197
+ },
198
+ {
199
+ name: "agents",
200
+ short: "List, show, add and remove agents"
201
+ },
202
+ {
203
+ name: "context",
204
+ short: "Show what a node's session loads"
205
+ },
206
+ {
207
+ name: "watch",
208
+ short: "Start runs from each project's triggers"
209
+ }
210
+ ]
211
+ },
212
+ {
213
+ title: "Runs",
214
+ commands: [
215
+ {
216
+ name: "ps",
217
+ short: "List this project's runs"
218
+ },
219
+ {
220
+ name: "logs",
221
+ short: "Print a run's transcript"
222
+ },
223
+ {
224
+ name: "tree",
225
+ short: "Show a run's tree, tokens and cost"
226
+ },
227
+ {
228
+ name: "usage",
229
+ short: "Show what runs spent over time"
230
+ },
231
+ {
232
+ name: "resume",
233
+ short: "Continue a run that didn't succeed"
234
+ }
235
+ ]
236
+ },
237
+ {
238
+ title: "Steer a running run",
239
+ commands: [
240
+ {
241
+ name: "decide",
242
+ short: "Answer a run's open decisions"
243
+ },
244
+ {
245
+ name: "chat",
246
+ short: "Talk to a node of a run"
247
+ },
248
+ {
249
+ name: "pause",
250
+ short: "Pause a run, or one node"
251
+ },
252
+ {
253
+ name: "continue",
254
+ short: "Let a paused run or node go on"
255
+ },
256
+ {
257
+ name: "stop",
258
+ short: "Stop a run, or one node"
259
+ },
260
+ {
261
+ name: "relay",
262
+ short: "Let nodes of two runs message each other"
263
+ }
264
+ ]
265
+ },
266
+ {
267
+ title: "After runs",
268
+ commands: [
269
+ {
270
+ name: "feedback",
271
+ short: "What got in the way in your runs"
272
+ },
273
+ {
274
+ name: "worktrees",
275
+ short: "Track and clean up Ork's worktrees"
276
+ },
277
+ {
278
+ name: "prune",
279
+ short: "Forget old runs' transcripts"
280
+ }
281
+ ]
282
+ },
283
+ {
284
+ title: "Projects",
285
+ commands: [
286
+ {
287
+ name: "projects",
288
+ short: "List, forget or move registered projects"
289
+ },
290
+ {
291
+ name: "register",
292
+ short: "Attach a project from outside it"
293
+ },
294
+ {
295
+ name: "migrate",
296
+ short: "Move an attached project into its .ork/"
297
+ },
298
+ {
299
+ name: "link",
300
+ short: "Point tools' agent folders at .ork/"
301
+ }
302
+ ]
303
+ },
304
+ {
305
+ title: "Ork itself",
306
+ commands: [
307
+ {
308
+ name: "upgrade",
309
+ short: "Upgrade Ork, the way it was installed"
310
+ },
311
+ {
312
+ name: "mcp",
313
+ short: "Serve Ork's tools to Claude Code (MCP)"
314
+ },
315
+ {
316
+ name: "send",
317
+ short: "Write to a session from a tool node's program"
318
+ },
319
+ {
320
+ name: "completion",
321
+ short: "Print a tab-completion script"
322
+ }
323
+ ]
324
+ }
325
+ ];
326
+ /** What a command not in any group is listed under. */
327
+ const OTHER_GROUP = "Other";
328
+ /** The group a root command is in, and its short line, if it has them. */
329
+ const groupOf = (name) => {
330
+ for (const group of HELP_GROUPS) {
331
+ const found = group.commands.find((command) => command.name === name);
332
+ if (found !== void 0) return {
333
+ title: group.title,
334
+ short: found.short
335
+ };
336
+ }
337
+ };
338
+ /**
339
+ * The shown commands in `HELP_GROUPS`'s order, then any in no group under
340
+ * "Other", in the order the root command lists them.
341
+ */
342
+ const groupedEntries = (entries) => {
343
+ const shown = entries.filter((entry) => !entry.hidden);
344
+ const grouped = HELP_GROUPS.map((group) => ({
345
+ title: group.title,
346
+ entries: group.commands.flatMap((command) => shown.find((entry) => entry.name === command.name) ?? [])
347
+ }));
348
+ const other = shown.filter((entry) => groupOf(entry.name) === void 0);
349
+ return [...grouped, {
350
+ title: OTHER_GROUP,
351
+ entries: other
352
+ }].filter((group) => group.entries.length > 0);
353
+ };
354
+ export { findEntry as a, subcommandsOf as c, SHELL_SCRIPTS as d, argsOf as i, COMPLETE_COMMAND as l, groupedEntries as n, publicArgs as o, argInfoOf as r, resolved as s, groupOf as t, SHELLS as u };
@@ -1,4 +1,4 @@
1
- import { p as runMarkerIn } from "./src-DtN1k-B3.mjs";
1
+ import { p as runMarkerIn } from "./src-C38BPzit.mjs";
2
2
  // src/commands/in-a-run.ts
3
3
  /**
4
4
  * @file The commands that act as the user refuse a program or an agent in a run
@@ -1,4 +1,4 @@
1
- import { a as limitsNow, i as NOT_STARTED, o as limitsReport, r as capsHere } from "./src-Cz1yOUTg.mjs";
1
+ import { a as limitsNow, i as NOT_STARTED, o as limitsReport, r as capsHere } from "./src-DHvWU4tX.mjs";
2
2
  // src/run/limits.ts
3
3
  /**
4
4
  * @file The limits across runs that apply here (RFC-007): the user's settings
@@ -0,0 +1,110 @@
1
+ import { A as gitOk, j as lines, k as git } from "./src-DHvWU4tX.mjs";
2
+ import { existsSync } from "node:fs";
3
+ // ../core/src/worktree/list.ts
4
+ /**
5
+ * @file What `ork worktrees` shows: every worktree and branch Ork's runs
6
+ * recorded creating, whatever the project's git rules named them, and any
7
+ * `ork/*` branch besides, with their state read from git itself. What clean
8
+ * and remove do with them is clean.ts.
9
+ */
10
+ /**
11
+ * The worktrees the project's runs recorded creating, oldest run first; one
12
+ * entry per branch or folder, from the latest run that created it.
13
+ */
14
+ const createdWorktrees = (store, project) => {
15
+ const byName = /* @__PURE__ */ new Map();
16
+ for (const run of store.runs({ project }).toReversed()) for (const { event } of store.events(run.id)) {
17
+ if (event.type !== "worktree" || event.action !== "created") continue;
18
+ byName.set(event.branch ?? event.path, {
19
+ runId: run.id,
20
+ nodeId: event.id,
21
+ path: event.path,
22
+ ...event.branch === void 0 ? {} : { branch: event.branch }
23
+ });
24
+ }
25
+ return [...byName.values()];
26
+ };
27
+ const parsePorcelain = (text) => text.split("\n\n").map((block) => lines(block)).map((fields) => {
28
+ const value = (key) => fields.find((f) => f.startsWith(`${key} `))?.slice(key.length + 1);
29
+ return {
30
+ path: value("worktree") ?? "",
31
+ branch: (value("branch") ?? "").replace(/^refs\/heads\//u, ""),
32
+ prunable: fields.some((f) => f.startsWith("prunable"))
33
+ };
34
+ }).filter((entry) => entry.path !== "");
35
+ /**
36
+ * The `ork/<run>/<node>` branches of runs that recorded nothing; with no path
37
+ * recorded, the worktree is whichever has the branch checked out.
38
+ */
39
+ const prefixed = (branch) => {
40
+ const [, runId = "", ...rest] = branch.split("/");
41
+ return {
42
+ runId,
43
+ nodeId: rest.join("/"),
44
+ path: "",
45
+ branch
46
+ };
47
+ };
48
+ /** How many commits a detached worktree holds that no branch, tag or remote has. */
49
+ const onNoBranch = async (entry) => entry === void 0 ? "0" : (await git(entry.path, [
50
+ "rev-list",
51
+ "--count",
52
+ "HEAD",
53
+ "--not",
54
+ "--branches",
55
+ "--tags",
56
+ "--remotes"
57
+ ])).stdout;
58
+ /** One created worktree or branch, with its state read from git. */
59
+ const stateOf = async (root, entries, item) => {
60
+ const { branch } = item;
61
+ const entry = branch === void 0 || item.path !== "" ? entries.find((e) => e.path === item.path) : entries.find((e) => e.branch === branch);
62
+ const holder = branch === void 0 ? void 0 : entries.find((e) => e.branch === branch && e.path !== entry?.path);
63
+ const missing = entry !== void 0 && (entry.prunable || !existsSync(entry.path));
64
+ const status = entry === void 0 || missing ? "" : (await git(entry.path, ["status", "--porcelain"])).stdout;
65
+ const checkedOut = branch === void 0 && entry !== void 0 && entry.branch !== "" ? entry.branch : void 0;
66
+ const on = branch ?? checkedOut;
67
+ const counted = on === void 0 ? await onNoBranch(entry === void 0 || missing ? void 0 : entry) : (await git(root, [
68
+ "rev-list",
69
+ "--count",
70
+ `HEAD..${on}`
71
+ ])).stdout;
72
+ const ahead = Number(counted);
73
+ const changes = lines(status).length;
74
+ return {
75
+ ...branch === void 0 ? {} : { branch },
76
+ ...checkedOut === void 0 ? {} : { checkedOut },
77
+ runId: item.runId,
78
+ nodeId: item.nodeId,
79
+ path: entry?.path ?? null,
80
+ missing,
81
+ dirty: changes > 0,
82
+ changes,
83
+ ahead: Number.isNaN(ahead) ? 0 : ahead,
84
+ merged: on !== void 0 && ahead === 0,
85
+ inMainCheckout: entry?.path === root || holder?.path === root,
86
+ ...holder === void 0 || holder.path === root ? {} : { heldBy: holder.path }
87
+ };
88
+ };
89
+ /**
90
+ * Every worktree and branch Ork's runs created in the repository at `root`,
91
+ * with its state: those the runs recorded (`created`, whatever the project's
92
+ * git rules named them), and any `ork/` branch besides. A recorded one that git
93
+ * no longer has is left out.
94
+ */
95
+ const listOrkWorktrees = async (root, created = []) => {
96
+ const entries = parsePorcelain(await gitOk(root, [
97
+ "worktree",
98
+ "list",
99
+ "--porcelain"
100
+ ]));
101
+ const branches = lines(await gitOk(root, [
102
+ "for-each-ref",
103
+ "--format=%(refname:short)",
104
+ "refs/heads/"
105
+ ]));
106
+ const recordedBranches = new Set(created.flatMap((c) => c.branch ?? []));
107
+ const items = [...created.filter((c) => c.branch === void 0 ? entries.some((e) => e.path === c.path) : branches.includes(c.branch)), ...branches.filter((b) => b.startsWith("ork/") && !recordedBranches.has(b)).map((b) => prefixed(b))];
108
+ return Promise.all(items.map((item) => stateOf(root, entries, item)));
109
+ };
110
+ export { listOrkWorktrees as n, createdWorktrees as t };
@@ -1,10 +1,10 @@
1
- import "./src-Cz1yOUTg.mjs";
2
- import { n as ORK_VERSION } from "./__build_info__-CXXMLvjt.mjs";
3
- import { a as openMcp, c as refused, o as tool, s as answer } from "./src-D5ruZFgD.mjs";
4
- import { n as explainNode, p as isNewer } from "./context-BFGC_C02.mjs";
5
- import { p as runMarkerIn } from "./src-DtN1k-B3.mjs";
6
- import { defineCommand } from "citty";
1
+ import { h as isNewer } from "./src-DHvWU4tX.mjs";
2
+ import { n as ORK_VERSION } from "./__build_info__-DdTVd2p5.mjs";
3
+ import { a as openMcp, c as refused, o as tool, s as answer } from "./src-BJTegEzY.mjs";
4
+ import { n as explainNode } from "./context-DO3sBy9v.mjs";
5
+ import { p as runMarkerIn } from "./src-C38BPzit.mjs";
7
6
  import { z } from "zod";
7
+ import { defineCommand } from "citty";
8
8
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
10
  // src/commands/mcp.ts
@@ -43,7 +43,7 @@ const orkMcpServer = (options = {}) => {
43
43
  ...options.script === void 0 ? {} : { script: options.script }
44
44
  });
45
45
  const all = [...opened.tools, explainTool(opened, options.home)];
46
- const tools = options.expects !== void 0 && isNewer(options.expects, "0.3.0") ? tooOld(all, options.expects) : all;
46
+ const tools = options.expects !== void 0 && isNewer(options.expects, "1.0.0-alpha.0") ? tooOld(all, options.expects) : all;
47
47
  const server = new McpServer({
48
48
  name: "ork",
49
49
  version: ORK_VERSION