@thenavidm/slipway 0.1.16 → 0.1.18
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/CHANGELOG.md +9 -0
- package/dist/cli/help.js +14 -16
- package/dist/search.js +3 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
What changed in Slipway, newest first.
|
|
4
4
|
|
|
5
|
+
## 0.1.18, 2026-10-05: what Wistia and Testimonial.to needed
|
|
6
|
+
|
|
7
|
+
- **A command's help never lists `--confirm` as the only required flag.** Wistia's import takes its URL as a flag or inside `--payload`, so no flag is required, and its help showed a Required section holding only `--confirm`. That reads as if nothing else were needed: every Codex run then read the command's schema as well, and finding the command and its flags cost a median of 105,140 input tokens, where Wistia's own 2.x CLI cost 86,365. Alone, `--confirm` now closes the options, where 2.x listed it, and the usage line still ends with it; two runs then took 83,069 and 82,817.
|
|
8
|
+
- **The general help leaves the flags to each command.** Each command's `--help` lists the flags it can use, `--agent` among them, so the general help's line of them repeated what an agent reads one step later, after carrying that line through every step in between. Without it the general help is 35 tokens shorter on every server: Testimonial.to's goes from 324 to 289.
|
|
9
|
+
|
|
10
|
+
## 0.1.17, 2026-10-05: what Google Photos needed
|
|
11
|
+
|
|
12
|
+
- **`which` reads an argument by its own words, not through a synonym.** Since 0.1.14 a tool's argument names count toward finding it, and a synonym reached them too. Google Photos says "photos" means media, so `get_media_item`, which takes a `media_item_id`, drew level with the photo picker for "let me choose photos" and was listed first. An argument now counts only for the words it is made of, so the picker is first again. Buffer's "schedule a post to a channel" still reads `channelId` and `schedulingType`, and the first answer to every task measured on the other servers is unchanged.
|
|
13
|
+
|
|
5
14
|
## 0.1.16, 2026-10-05: what Flodesk needed
|
|
6
15
|
|
|
7
16
|
- **`which` says a title once.** Each answer line printed a tool's title and then the first sentence of its description, and many descriptions open with the title itself: 24 of Flodesk's 32 tools, 10 of Firefly's 14, and nearly every tool on Beehiiv, Calendly and Circle. Where the sentence opens with the title's words, the line now prints the sentence alone. Flodesk's answer to `which add a subscriber to a segment` goes from 52 tokens to 36 and Firefly's to `which image model 5` from 90 to 77, and an agent carries that answer through each step after it. A description that adds something new still follows its title.
|
package/dist/cli/help.js
CHANGED
|
@@ -174,8 +174,17 @@ export function renderToolHelp(tool, bin, aliases = {}) {
|
|
|
174
174
|
}
|
|
175
175
|
lines.push(...after, ``);
|
|
176
176
|
};
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
const confirm = tool.requireConfirm ? line(" --confirm", "it runs only with this; --agent never adds it") : [];
|
|
178
|
+
// A Required section holding only --confirm reads as if nothing else were needed, when a write's body
|
|
179
|
+
// often comes as flags or as one --payload: Codex then read Wistia's schema to check, one more step.
|
|
180
|
+
// Alone, --confirm closes the options instead, and the usage line still ends with it.
|
|
181
|
+
if (required.length) {
|
|
182
|
+
describe(required, "Required", confirm);
|
|
183
|
+
describe(optional, "Options");
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
describe(optional, "Options", confirm);
|
|
187
|
+
}
|
|
179
188
|
if (tool.paginate) {
|
|
180
189
|
lines.push(`Pages:`, ...line(" --all", "follow every page and print all items"), ...line(" --max-items <n>", "stop after this many items"), ``);
|
|
181
190
|
}
|
|
@@ -208,13 +217,12 @@ export function renderGeneralHelp(app, bin) {
|
|
|
208
217
|
const applies = switchesThatApply(app.allTools);
|
|
209
218
|
const cache = app.allTools.some((tool) => tool.cache);
|
|
210
219
|
const sync = app.allTools.some((tool) => tool.sync);
|
|
211
|
-
const jobs = app.allTools.some((tool) => tool.job);
|
|
212
220
|
// An agent often reads this first and pays for it again on every later step, so the
|
|
213
221
|
// rarely needed commands share one line, an older name for a command is left out, and
|
|
214
222
|
// Slipway's settings past the two safety switches are named on one line.
|
|
215
223
|
const commands = [
|
|
216
224
|
[app.bins.cli, "list the commands"],
|
|
217
|
-
[`${bin} <command> --help`, "what one takes"],
|
|
225
|
+
[`${bin} <command> --help`, "what one takes, and its flags"],
|
|
218
226
|
[`${bin} which <words>`, "find the command for a task"],
|
|
219
227
|
[`${bin} doctor${app.definition.doctorNetwork ? "" : " [--network]"}`, "check the setup"],
|
|
220
228
|
typeof app.definition.login === "object"
|
|
@@ -261,16 +269,6 @@ export function renderGeneralHelp(app, bin) {
|
|
|
261
269
|
...(app.allTools.some((tool) => tool.tags.length > 0) ? [[`${names.toolsets}=a,b`, "only these toolsets, or all"]] : []),
|
|
262
270
|
];
|
|
263
271
|
const more = tuning.length + 4;
|
|
264
|
-
// The list formats appear in the help of the commands that list; flags that cannot apply
|
|
265
|
-
// here (jobs, the cache) are left out. agent-context lists every one.
|
|
266
|
-
const flags = GLOBAL_FLAGS.map(([flag]) => flag).filter((flag) => flag !== "--agent" &&
|
|
267
|
-
flag !== "--jsonl" &&
|
|
268
|
-
flag !== "--csv / --tsv" &&
|
|
269
|
-
flag !== "--quiet" &&
|
|
270
|
-
flag !== "--out <file>" &&
|
|
271
|
-
flag !== "--timeout <ms>" &&
|
|
272
|
-
(flag !== "--wait" || jobs) &&
|
|
273
|
-
(flag !== "--refresh" || cache));
|
|
274
272
|
const commandRow = table(commands);
|
|
275
273
|
const settingRow = table(settings);
|
|
276
274
|
const lines = [
|
|
@@ -280,8 +278,8 @@ export function renderGeneralHelp(app, bin) {
|
|
|
280
278
|
...commands.map(commandRow),
|
|
281
279
|
` Also: schema <command>, agent-context (all of this as JSON), completion <shell>.`,
|
|
282
280
|
``,
|
|
283
|
-
|
|
284
|
-
|
|
281
|
+
// No flags line: each command's own --help shows the flags it can use, --agent among them,
|
|
282
|
+
// and an agent reading this first carried those 44 tokens through every later step.
|
|
285
283
|
`Settings:`,
|
|
286
284
|
...settings.map(settingRow),
|
|
287
285
|
` And ${more} more, for tuning and --http: agent-context describes each.`,
|
package/dist/search.js
CHANGED
|
@@ -94,12 +94,14 @@ export function searchTools(tools, query, limit = 10, synonyms = {}) {
|
|
|
94
94
|
const tags = tool.tags.flatMap(words);
|
|
95
95
|
const description = words(tool.description);
|
|
96
96
|
// What a tool takes says what it is for: `channelId` and `schedulingType` find the post tool for "schedule a post to a channel".
|
|
97
|
+
// Only the words themselves count there. Through a synonym, Google Photos' "photos" read as `media_item_id`
|
|
98
|
+
// and put get_media_item level with the picker for "let me choose photos".
|
|
97
99
|
const args = Object.keys(tool.jsonSchema.properties ?? {}).filter((key) => key !== "confirm").flatMap(words);
|
|
98
100
|
let score = 0;
|
|
99
101
|
let matched = 0;
|
|
100
102
|
for (const term of terms) {
|
|
101
103
|
// A term that is the tool's name is not a hint, it is the answer.
|
|
102
|
-
const got = (named(tool, term) ? 20 : 0) + hits(term, name, extra) * 5 + hits(term, title, extra) * 4 + hits(term, tags, extra) * 3 +
|
|
104
|
+
const got = (named(tool, term) ? 20 : 0) + hits(term, name, extra) * 5 + hits(term, title, extra) * 4 + hits(term, tags, extra) * 3 + exact(term, args) * 2 + hits(term, description, extra);
|
|
103
105
|
if (got > 0)
|
|
104
106
|
matched++;
|
|
105
107
|
score += got;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thenavidm/slipway",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.18",
|
|
4
4
|
"description": "Slipway, the TypeScript framework for MCP servers and agent-native CLIs. One tool definition ships an MCP server and a CLI, with write safety, typed results and release checks built in.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|