5 Commits
Author SHA1 Message Date
Sunil 5beffaeb17 Merge remote-tracking branch 'upstream/main' into fix/simplify-ignore-git-revert
# Conflicts:
#	hooks/simplify-ignore-test.sh
#	hooks/simplify-ignore.sh
2026-10-10 17:11:41 +05:30
Sunil e9e172d909 fix(hooks): simplify-ignore keeps a change reverted with git and re-hides the file 2026-10-06 00:14:30 +05:30
Sunil 807bba68af fix(hooks): simplify-ignore never loses a block whose placeholder was removed 2026-10-05 23:55:43 +05:30
Sunil 21fea4d528 fix: clean up throwaway workspace directories after eval runs
materializeWorkspace() creates directories in os.tmpdir() but
runBehavioral() never cleans them up on success or failure. If
execFileSync throws (timeout, signal, OOM), the workspace persists
in /tmp indefinitely with fixture data. The test file
run-evals-test.js uses try/finally cleanup (line 234), proving
the pattern was known but omitted in production code.

Fix: Wrap eval execution in try/finally with best-effort
fs.rmSync cleanup.
2026-08-05 22:37:48 +05:30
Sunil 4b3122e65f security: validate --behavioral skillName to prevent path traversal
The skillName argument from --behavioral has zero validation and is
used directly in path.join() for reading .json files, reading
SKILL.md, and WRITING .grading.json results. A value like
'../../etc/passwd' traverses outside the project directory for
both reads and writes.

Fix: Validate skillName against /^[a-z0-9]+(-[a-z0-9]+)*$/ before
any filesystem operations. This matches the existing KEBAB_CASE
validation in skill-lint.js.
2026-08-05 22:35:47 +05:30