Files
Trevin Chow 18dabdbe61 fix(config-read): read config via native tool, not $() pre-resolution
Skills read `.compound-engineering/config.local.yaml` with a `!` pre-resolution
command that embeds `$()` command substitution. On environments whose skill-load
permission checker rejects `$()` (reported on Windows / Claude Code 2.1.63 in
issue #920), this aborts skill load before the body runs, making the skill
unusable.

Pre-resolve only the repo root (`!`git rev-parse --show-toplevel 2>/dev/null ||
true``, which has no `$()` or `;`), then read the config file with the native
file-read tool in the skill body. Applied to ce-plan, ce-brainstorm, ce-ideate,
ce-work-beta, and ce-product-pulse. This matches the existing ce-sessions
root-pre-resolution pattern and aligns with the "prefer native tools" rule.

Cross-platform: `!` pre-resolution is Claude-Code-only and is not translated by
the converters, so on Codex/Gemini/Pi/OpenCode the line is literal text. The
skill body therefore falls back to resolving the repo root at runtime (`git
rev-parse --show-toplevel` via the shell tool) when the pre-resolved value is
empty or an unresolved command string, so config loads on every platform instead
of silently defaulting outside Claude.

Also add a `;`-separator enforcement test to skill-shell-safety.test.ts: the
suite had no semicolon check, so the `Unhandled node type: ;` regression from
PR #934 (a reintroduction of issue #758) would have passed CI. Fix a
false-positive in the pre-resolution extractor that scanned inline-code prose as
a command.

Update plugins/compound-engineering/AGENTS.md to bless the new pattern and
document the converter behavior and runtime fallback.

Closes #920
2026-06-14 16:46:21 -07:00
..