fix: shell commands silently broken — run() used execFileSync without shell#46
Closed
TerminalGravity wants to merge 6 commits intomainfrom
Closed
fix: shell commands silently broken — run() used execFileSync without shell#46TerminalGravity wants to merge 6 commits intomainfrom
TerminalGravity wants to merge 6 commits intomainfrom
Conversation
… and contracts The README references .preflight/ config extensively but there were no concrete example files to copy. This adds a ready-to-use examples/.preflight/ directory with annotated config.yml, triage.yml, and contracts/api.yml, plus a README explaining how to use them.
Created examples/USAGE_EXAMPLES.md with 8 real-world scenarios showing what each tool looks like in practice: preflight_check catching vague prompts, scope_work creating execution plans, enrich_agent_task for sub-agents, sharpen_followup resolving ambiguity, session health checks, semantic history search, weekly scorecards, and prompt grading. Added link to usage examples in README nav bar.
- Reorder options: npx (zero install) → npm global → clone - Add -y flag to npx for non-interactive use - Explain what CLAUDE_PROJECT_DIR enables - Note that .mcp.json paths must be absolute - Use 'absolute' in path placeholders to prevent confusion
- Export scorePrompt for testability - 11 tests for prompt scoring: grades, specificity, scope, actionability, done conditions - 8 tests for pattern matching: keyword overlap, case insensitivity, formatting - All 62 tests passing
run() uses execFileSync without a shell, so pipes (|), redirects (2>/dev/null), and logical operators (||) were silently broken — args like '|' and 'tail' were passed as git arguments instead of being interpreted as shell syntax. Added shellRun() that uses execSync with shell interpretation for commands that need pipes/redirects. Updated 11 tool files that were affected. Also fixed session-health.ts 'git diff --stat | tail -1' to use array args and manual last-line extraction instead of shell pipe.
Collaborator
Author
|
Superseded by newer PRs. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
run()inlib/git.tsusesexecFileSync(no shell), but 11 tool files were passing shell syntax to it:git diff --stat | tail -1git status --porcelain 2>/dev/null... || echo ''find tests ... | wc -lThese all silently broke —
|,tail,-1,2>/dev/nulletc. were passed as literal git arguments, causing git to either error (caught silently) or return wrong results.Fix
shellRun()inlib/git.ts— usesexecSyncwith shell interpretation for commands that genuinely need shell featuresshellRun()for shell-syntax commandssession-health.tsto use array args + JS last-line extraction instead of pipeFiles changed
11 files, 52 insertions, 25 deletions. Build + all 62 tests pass.