zames_pro 2.82.88 → 2.82.90

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 CHANGED
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.82.90] - 2026-10-24
11
+
12
+ ### Fixed
13
+
14
+ - **commands:** a dynamic hint name is normalized to a slash command
15
+
16
+ ## [2.82.89] - 2026-10-24
17
+
18
+ ### Fixed
19
+
20
+ - **self-review:** collapse whitespace in the focus text
21
+
10
22
  ## [2.82.88] - 2026-10-24
11
23
 
12
24
  ### Fixed
package/dist/commands.js CHANGED
@@ -1213,15 +1213,23 @@ export function buildSlashCommandHints(opts) {
1213
1213
  .filter((c) => !(hideModel && c.name === '/model'))
1214
1214
  .map((c) => ({ name: c.name, description: t(c.key) }));
1215
1215
  const known = new Set(base.map((c) => c.name.toLowerCase()));
1216
- for (const d of opts.dynamic ?? []) {
1217
- if (known.has(d.name.toLowerCase()))
1216
+ for (const raw of opts.dynamic ?? []) {
1217
+ // A slash hint must BE a slash command: a custom command whose name
1218
+ // omitted the leading `/` showed up as a bare word (`nosl`) that no
1219
+ // `/nosl` invocation ever matched, and an EMPTY name produced a blank row.
1220
+ const trimmed = String(raw.name ?? '').trim();
1221
+ if (!trimmed)
1222
+ continue;
1223
+ const name = trimmed.startsWith('/') ? trimmed : '/' + trimmed;
1224
+ const key = name.toLowerCase();
1225
+ if (known.has(key))
1218
1226
  continue;
1219
1227
  // Remember the DYNAMIC name too: two entries that differ only by case
1220
1228
  // (`/foo` and `/FOO`) were both added, so the operator saw the same
1221
1229
  // command twice and the second was unreachable (a slash command is
1222
1230
  // resolved case-insensitively).
1223
- known.add(d.name.toLowerCase());
1224
- base.push(d);
1231
+ known.add(key);
1232
+ base.push({ ...raw, name });
1225
1233
  }
1226
1234
  return base;
1227
1235
  }
@@ -297,10 +297,23 @@ async function diffFiles(origDir, newDir) {
297
297
  }
298
298
  return changed;
299
299
  }
300
- function buildReviewPrompt({ focus, snapDir, }) {
301
- const focusLine = focus
302
- ? `\nThe user asked you to focus especially on: ${focus}\n`
300
+ /**
301
+ * The focus line of the self-review prompt. PURE. A NEWLINE in the focus used
302
+ * to start new lines of the prompt, so the operator's text could inject a
303
+ * whole extra instruction; collapse all whitespace into one sentence.
304
+ */
305
+ export function selfReviewFocusLine(focus) {
306
+ const f = String(focus ?? '')
307
+ .trim()
308
+ .replace(/\s+/g, ' ');
309
+ return f
310
+ ? `
311
+ The user asked you to focus especially on: ${f}
312
+ `
303
313
  : '';
314
+ }
315
+ function buildReviewPrompt({ focus, snapDir, }) {
316
+ const focusLine = selfReviewFocusLine(focus);
304
317
  return `You are a senior JavaScript/Node.js engineer. You are reviewing your own source code — a Playwright-based coding agent that talks to the DeepSeek web chat as an LLM backend.
305
318
 
306
319
  All source files are in your working directory: ${snapDir}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zames_pro",
3
- "version": "2.82.88",
3
+ "version": "2.82.90",
4
4
  "description": "Terminal coding agent that drives a real browser to chat with DeepSeek, Qwen and other web LLMs — no API key required. Reads and edits files, runs commands, commits to git, like Claude Code / Codex CLI.",
5
5
  "type": "module",
6
6
  "bin": {