Skip to content

fix(skill): run each Taskless command as its own shell call - #527

Merged
theCodeDrift merged 2 commits into
mainfrom
fix/skill-unchained-commands
Oct 17, 2026
Merged

theCodeDrift merged 2 commits into
mainfrom
fix/skill-unchained-commands

Conversation

@theCodeDrift

Copy link
Copy Markdown
Member

Onboarding sessions showed Error: Exit code 1 with the route recipe as the visible output, which read as the recipe failing. It wasn't. The agent had chained three commands into one call:

npx @taskless/cli@0.13.0 agent route; echo ======; npx @taskless/cli@0.13.0 detect --json

The host shell was zsh. There, a word beginning with = is equals expansion, so echo ====== looks up a command named =====, fails with (eval):1: ===== not found, and abandons the rest of the line. route had already printed, detect never ran, and the agent went on routing without its output.

Change

A short section in the installed skill: run every Taskless command as its own shell call, exactly as written, with no chaining, separators, pipes, or redirections. It also gives the reason, since the agent knew its shell was zsh and still wrote the separator.

Detecting the shell was considered and rejected. Claude Code already tells the agent its shell, so knowing it would not have prevented this, and the commands Taskless emits are plain invocations that behave the same in bash, zsh, and fish. A sweep of the recipes found no unquoted globs, [[ ]], process substitution, or inline VAR=… && chains in agent-run commands. The breakage is in the agent's glue, so the fix removes the glue.

The skill body is 94 lines, within its 150-line cap. A patch changeset is included.

Verification

  • pnpm typecheck and pnpm lint pass
  • the full CLI suite passes (2269 tests), including the skill-cap test

An agent chained `agent route; echo ======; detect --json` in one call.
zsh reads `======` as equals expansion, fails, and drops the rest of the
line, so detect never ran and the call reported exit 1 under the recipe
text. Tell agents to run each Taskless command alone: our commands are
shell-neutral, the glue around them is not.
@theCodeDrift

Copy link
Copy Markdown
Member Author

@claude /review

@github-actions

github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Claude finished @theCodeDrift's task in 1m 49s —— View job


Review: fix(skill): run each Taskless command as its own shell call

Review mode: incremental — read 0 prior review thread(s) before reviewing. .prior-review.json contained no prior review threads, reviews, or inline comments for this PR (only the triggering @claude /review comment itself), so this is the first review of this PR — there is nothing previously-raised to classify as addressed or still-open.

  • Read prior-review data (empty — first review)
  • Read PR diff (gh pr diff 527)
  • Read full skills/taskless/SKILL.md for context around the new section
  • Checked the 150-line body cap enforced by installed-documentation.test.ts
  • Posted findings

Findings

[New] Test-coverage gap on the new section (skills/taskless/SKILL.md:153-161) — posted inline. Every other normative instruction in this file (preflight, global-trust entry, menu suppression, etc.) is pinned by a toContain assertion in packages/cli/test/installed-documentation.test.ts, so a future edit can't silently reword or drop it. The new "Run each Taskless command on its own" section has no such assertion — a grep for its key phrases ("own shell call", "echo ======", "chain it with other commands") only matches SKILL.md and the changeset. The existing 150-line-cap test would catch a deletion that shortens the file, but not a rewrite that keeps the line count and loses the content. Given the whole point of this fix is a failure mode that reports nothing when it happens, locking the guidance down the same way the rest of the file is locked down seems worth doing here.

Everything else checks out:

  • The zsh equals-expansion mechanism described (====== parsed as =-expansion of a command named =====) matches the failure mode described in the PR body and is a real, known zsh gotcha — the explanation is accurate, not hand-wavy.
  • The new section's content (no chaining, no ;/&&/|/redirection glue, run exactly as written) is consistent with the rest of the skill's guidance to fetch-then-run one recipe at a time.
  • The body stays within the 150-line cap (149 lines after the new section, confirmed by direct count against the regex the test uses — the test should pass).
  • The changeset is patch on @taskless/cli, placed at the root of this (non-stacked) PR — correct per this repo's pre-1.0 semver guidance, since this is a prose/behavior fix rather than new surface.
  • No functional/runtime code changed — this is a docs-only fix to the installed skill text, so there's no build/runtime correctness surface beyond what's covered above.
    · branch

Comment thread skills/taskless/SKILL.md
Every other instruction in the skill is pinned by a toContain assertion.
This one guards a failure that reports nothing when it happens, so a
rewrite that dropped it would be just as silent.
@theCodeDrift

Copy link
Copy Markdown
Member Author

Re: @github-actions — "Claude finished @theCodeDrift's task in 1m 49s… Test-coverage gap on the new section"
#527 (comment)

Addressed in bd866e4, which pins the new section with toContain assertions like the rest of SKILL.md. The inline thread is resolved.

— AI Coding Agent

@theCodeDrift
theCodeDrift merged commit d6ed2d0 into main Oct 17, 2026
5 checks passed
@theCodeDrift
theCodeDrift deleted the fix/skill-unchained-commands branch October 17, 2026 05:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant