fix(cli): escape literal # in packages help string - #2760
Conversation
Lucee's CFML parser interpreted `#2345)` in the packages-command help text as the start of an expression interpolation and aborted compilation of the whole Module.cfc with `Invalid Syntax Closing [#] not found at [2165:82]`. This crashed Phase 3 of tools/ci/smoke-test-module.sh ("Scaffold a scratch app") because `wheels new` triggers eager Module.cfc compilation as soon as LuCLI loads the wheels module — see the failing snapshot run 26050790202 / job 76587148389. The repo's CLAUDE.md anti-pattern #14 covers this exactly: literal `#` in a string literal MUST be escaped as `##` (the form Lucee 5/6/7, Adobe CF 2018–2025, and BoxLang all agree on). Comments are fine — which is why the 15+ other `#NNNN` issue refs in Module.cfc compile without trouble; they all live in `//` or `/* */` blocks. Why this slipped past PR CI: smoke-test-distribution is only wired into release.yml's job graph, which runs on push-to-main or via workflow_call from snapshot.yml. PR CI exercises the framework test suite but not the built-and-installed distribution. So parse errors in cli/lucli/Module.cfc surface only after merge to develop, when the next snapshot build kicks off. Signed-off-by: Peter Amiri <peter@alurium.com>
There was a problem hiding this comment.
Wheels Bot — Reviewer A
TL;DR: One-character hotfix that escapes a literal # in a CFML double-quoted string; the root cause, CI gap, and blast radius are all well-documented. No correctness, cross-engine, or security concerns. Approving.
Correctness
The change is exactly right. CFML's universal escape for a literal # inside a double-quoted string is ## — valid on Lucee 5/6/7, Adobe CF 2018–2025, and BoxLang. The author's follow-up grep confirms all other #NNNN refs in Module.cfc live inside // or /* */ comment blocks (I independently reproduced the grep and found the only non-comment hit at line 5293 is inside a /** */ doc-comment block — not a string literal). Nothing slipped through.
Cross-engine
## is the canonical cross-engine escape (CLAUDE.md anti-pattern 14). No engine-specific concern.
Commits
fix(cli): escape literal # in packages help string — valid type, optional scope, 52-char header, not ALL-CAPS. DCO Signed-off-by trailer present. Commit message body explains the why (Lucee interpolation parser, failing snapshot run 26050790202, why PR CI didn't catch it) — exemplary.
Tests
No test added, which is appropriate: this is a help-string literal fix with no behavioral surface to assert against. The manual grep verification in the test plan is sufficient.
Docs
The help text itself is the documentation; the fix restores it to the correct human-readable content.
Wheels Bot — Reviewer B (round 1)A's review is substantively correct and the approval is well-founded. One false citation noted, but it has no bearing on the verdict. Converging on approve. SycophancyNone detected. A provides specific, concrete evidence: independently ran the grep, cited the exact line number (5293), confirmed it falls inside a False positivesOne minor citation error: A writes Missed issuesNone detected. The diff is a single character substitution in a help-string literal. A correctly notes that the rendered output will be Verdict alignmentA's ConvergenceAligned on approve. The only finding is a wrong anti-pattern number in A's review text -- the underlying technical analysis is sound and the fix is correct. No changes needed to the PR. |
Summary
Snapshot CI (run 26050790202 / job 76587148389, the
smoke-test-distributionjob in release.yml) broke after merging #2759because of a pre-existing CFML
#-in-string bug that PR CI doesn'texercise:
cli/lucli/Module.cfc:2165has a literal `#2345` inside a double-quotedstring. Lucee reads `#2345)` as the start of an expression
interpolation, doesn't find a closing `#`, and aborts compiling the
entire Module.cfc. That makes `wheels new` fail at Phase 3 of
`tools/ci/smoke-test-module.sh` ("Scaffold a scratch app") because LuCLI
eagerly parses the wheels module on startup.
Fix is per the repo's CLAUDE.md anti-pattern #14: escape literal `#` in
strings as `##`. Comments are fine (which is why the 15+ other `#NNNN`
refs in Module.cfc compile — they all live inside
//or/* */).Why this slipped past PR CI
smoke-test-distributionlives in the release-time job graph(`release.yml`, invoked on `push: main` or via `workflow_call` from
`snapshot.yml` on develop pushes), not on `pull_request`. PR CI
exercises the framework test suite, not the built-and-installed
distribution. So parse errors in
cli/lucli/Module.cfconly surfaceafter merge → next snapshot.
Worth filing a follow-up to add this smoke test to PR CI so we catch
it pre-merge next time. Out of scope here.
Test plan
is on develop's tip without this fix — re-running won't help; only
a new develop push will exercise it)
— all 15+ remaining hits are in comments (`//` / `/*`), which
Lucee doesn't scan for interpolation