You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Security & correctness
- skill-writer: cap on UTF-8 byte length (not String.length) so a
multi-byte payload can't bypass the 64 KB limit
- skill-writer: reject reserved /skills subcommand names (info, edit,
delete, list) to prevent shadowing the CLI surface
- skill-writer: reject description/triggers containing newlines or
a bare '---' line so they can't break out of YAML frontmatter
- slash-commands /skills info|edit|delete: validate <name> via
validateSkillName before any filesystem join — closes the path
traversal vector pointed out by the reviewer
UX correctness
- index.ts generate_skill: surface an 'Overwrite existing user
skill?' confirmation when overwrite=true and the file already
exists
- slash-commands /save-skill: pass skipAutoSuggest=true so the
synthetic prompt's scaffolding terms don't trigger unrelated
skills via runSuggestApproach
- slash-commands /new: also reset currentUserPrompt + lastGuidance
- slash-commands /resume: reset toolCallHistory, mcpServersUsed,
modulesRegistered, currentUserPrompt, lastGuidance — local
session-learning state can't be reconstructed from a resumed
remote session
- slash-commands /save-skill: fix 'distinct tools' status line to
count the full tool history, not the bounded topTools view
- session-context: truncate currentUserPrompt to 2000 chars with
an ellipsis so a giant paste can't dominate the prompt
MCP session-learning correctness
- mcp/plugin-adapter: add optional onCall observer; agent wires it
to state.mcpServersUsed so calls made from inside
execute_javascript via host:mcp-<name> imports are now tracked
- state.ts: add skipNextAutoSuggest flag (consumed in
onUserPromptSubmitted)
Documentation
- docs/TESTING-USER-SKILLS.md: drop branch-name reference, switch
override example from non-existent 'code-review' to bundled
'kql-expert', clarify '/skills edit' prints a path (no $EDITOR),
describe the now-correct overwrite confirmation flow, note that
the override badge surfaces in '/skills' list view, fix approval
prompt wording (summary, not full content)
Tests
- Reserved-name rejection
- YAML-unsafe newline rejection (description + trigger)
- UTF-8 byte-length cap (32 KB of 4-byte chars)
- User-prompt truncation contract
Quality gate: 2448 TS tests pass (+5), 124 Rust tests pass.
Signed-off-by: Simon Davies <simongdavies@users.noreply.github.com>
|`/save-skill info`| Rejected — reserved subcommand name |
145
+
|`/save-skill fetch-page-title` (second time, fresh session) |`generate_skill` first errors with "already exists — set overwrite=true"; the LLM retries with `overwrite=true`, and you get an **"Overwrite existing user skill?"** confirmation before the file is replaced |
0 commit comments