* test(#4109): add zsh regression coverage for gate-check and invoke_reviewers dispatch Extends tests/review-plan-coverage-manifest.test.cjs to cover the two DISPATCH_SLUGS consumption sites the existing #3301 coverage-check tests don't reach: the write_reviews gate-check block (ALL_LANES_SKIPPED / TOTAL_LANE_FAILURE counting) and invoke_reviewers' dispatch + join loops. Both extract the real shipped bash from review.md and run it under bash and zsh, same convention as the existing coverage-check rows. Expected RED under zsh pre-fix, GREEN post-fix. * fix(#4109): rewrap unquoted DISPATCH_SLUGS-shaped consumption to survive zsh Bash word-splits an unquoted scalar on IFS by default; zsh does not (no setopt SH_WORD_SPLIT anywhere in these files), so a scalar accumulated from multiple space-separated tokens and then consumed via bare `for x in $VAR` collapses onto one bogus iteration under zsh whenever it holds 2+ tokens. Fixes all four review.md sites reported by #4108/#4109 (invoke_reviewers dispatch + join loops, the gate-check block, and the #3301 coverage-check block), plus the identical pattern found by a repo-wide sweep in complete-milestone.md, code-review.md, pr-branch.md, sync-skills.md, and execute-phase/steps/per-plan-worktree-gate.md. Each site is rewrapped in unquoted command substitution (`$(printf '%s' "$VAR")`), which re-splits identically under both shells regardless of SH_WORD_SPLIT — the same mechanism that already made the accumulator-building loops in these files shell-safe. * test(#4109): warn loudly when the zsh probe fails instead of skipping silently detectShells() drops the zsh test lane whenever a live zsh probe fails (e.g. on a CI runner without zsh installed), and a dropped lane reads identically to a passing one in the suite's own output — exactly the blind spot that let #4109's bug class ship undetected. Both copies of this helper (this file and its byte-identical duplicate in review-build-prompt-optional-sections.test.cjs) now emit a greppable console.warn when the probe fails, so a run without zsh reads as "zsh coverage unknown" rather than "all lanes green". * ci(#4109): gate workflows/*.md's embedded bash blocks in lint:ci Adds scripts/lint-workflow-shellcheck.cjs, wired into npm run lint:ci, so this bug class can't land undetected a third time. Two independent checks run over every ```bash block in gsd-core/workflows/**/*.md: - ShellCheck (new `shellcheck` devDependency, downloads and caches the real koalaman/shellcheck binary) catches the general unquoted-expansion/ word-splitting family in argument position. 212 pre-existing findings across the tree are absorbed into scripts/lint-workflow-shellcheck-baseline.json (matched on {file, code, message}, not line number, so unrelated edits elsewhere in a file can't spuriously un-baseline anything) — fixing all of them is out of scope for this issue; only NEW findings fail the build. - A custom structural check specifically for #4109's own shape: ShellCheck does not flag a bare `for x in $VAR` word-list — it treats that as an intentional idiom under any ruleset (confirmed empirically). This check does, and gates the build on any occurrence, with zero tolerance (no baseline) since every known site was already swept and fixed on this branch. * test(#4109): update pr-branch cherry-pick loop test anchor for the zsh fix extractPickLoop()'s PICK_LOOP_MARKER located the create_pr_branch cherry-pick loop by the literal substring "for HASH in $INCLUDED_COMMITS", which no longer appears verbatim after this issue's fix rewrapped that loop in unquoted command substitution. Updates the anchor (and its error message, now derived from the same constant instead of duplicating stale text) to the new literal form. No behavior change to the extraction logic itself. Emitted-Drift-Ack-Growth: review.md — #4109's fix adds explanatory comments at 4 sites; net code is functionally equivalent, comment expansion grows the file Emitted-Drift-Ack-Growth: complete-milestone.md — #4109's fix adds explanatory comments at 3 sites documenting the zsh word-splitting divergence Emitted-Drift-Ack-Growth: code-review.md — #4109's fix adds an explanatory comment documenting the zsh word-splitting divergence Emitted-Drift-Ack-Growth: pr-branch.md — #4109's fix adds explanatory comments at 3 sites (TRANSIENT_DIRS, INCLUDED_COMMITS, FILTER_PATHS) Emitted-Drift-Ack-Growth: sync-skills.md — #4109's fix adds explanatory comments at 2 sites (CREATE_LIST/UPDATE_LIST, REMOVE_LIST) * test(#4109): cover lint-workflow-shellcheck parsers + add timeout Adds tests/lint-workflow-shellcheck.test.cjs covering the hand-rolled parser/logic functions exported by scripts/lint-workflow-shellcheck.cjs (stripCommandSubstitutions, stripShellComments, substitutePlaceholders, extractForLoops, findBareForLoopSplits, findingKey, partitionAgainstBaseline) that shipped with zero coverage — CLAUDE.md requires at least one fast-check property test for parsers, included here (bare/braced forms always flagged naming the variable; quoted/substituted/literal forms never are). Also bounds runShellcheck's subprocess with a 60s timeout: the `shellcheck` npm package's own API has no timeout option and internally blocks on a synchronous spawnSync, so this reimplements the binary resolve/download step via the package's own exported config/download and calls spawnSync directly with a native timeout. And guards the CLI entry point with `if (require.main === module)`, matching this repo's sibling dual-purpose lint scripts — without it, requiring the module for its exported functions (as the new test file does) also triggered a live ShellCheck run as a side effect. * docs(#4109): add changeset for the zsh word-splitting fix * chore(#4109): backfill changeset PR number (#4116) --------- Co-authored-by: sim <sim@local>
1063 lines
33 KiB
JSON
1063 lines
33 KiB
JSON
[
|
|
{
|
|
"file": "gsd-core/workflows/add-tests.md",
|
|
"code": "2035",
|
|
"message": "Use ./*glob* or -- *glob* so names with dashes won't become options."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/add-todo.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ai-integration-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/autonomous.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/check-todos.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/check-todos.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/cleanup.md",
|
|
"code": "1083",
|
|
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1009",
|
|
"message": "The mentioned syntax error was in this then clause."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1036",
|
|
"message": "'(' is invalid here. Did you forget to escape it?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1061",
|
|
"message": "Couldn't find 'done' for this 'do'."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1062",
|
|
"message": "Expected 'done' matching previously mentioned 'do'."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1065",
|
|
"message": "Trying to declare parameters? Don't. Use () and refer to params as $1, $2.."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1072",
|
|
"message": "Expected 'done'. Fix any mentioned problems and try again."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review-fix.md",
|
|
"code": "1073",
|
|
"message": "Couldn't parse this while loop. Fix to allow more checks."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1009",
|
|
"message": "The mentioned syntax error was in this test expression."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1035",
|
|
"message": "You need a space after the [ and before the ]."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1072",
|
|
"message": "Expected end of single quoted string. Fix any mentioned problems and try again."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1073",
|
|
"message": "Couldn't parse this single quoted string. Fix to allow more checks."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1078",
|
|
"message": "Did you forget to close this single quoted string?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1078",
|
|
"message": "Did you forget to close this single quoted string?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1079",
|
|
"message": "This is actually an end quote, but due to next char it looks suspect."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "1079",
|
|
"message": "This is actually an end quote, but due to next char it looks suspect."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "2088",
|
|
"message": "Tilde does not expand in quotes. Use $HOME."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review.md",
|
|
"code": "2153",
|
|
"message": "Possible misspelling: DEPTH_OVERRIDE may not be assigned. Did you mean DEPTH_OVERRIDES?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1036",
|
|
"message": "'(' is invalid here. Did you forget to escape it?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1046",
|
|
"message": "Couldn't find 'fi' for this 'if'."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1047",
|
|
"message": "Expected 'fi' matching previously mentioned 'if'."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1065",
|
|
"message": "Trying to declare parameters? Don't. Use () and refer to params as $1, $2.."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1072",
|
|
"message": "Expected 'fi'. Fix any mentioned problems and try again."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
|
|
"code": "1073",
|
|
"message": "Couldn't parse this if expression. Fix to allow more checks."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "1009",
|
|
"message": "The mentioned syntax error was in this variable assignment."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "1036",
|
|
"message": "'(' is invalid here. Did you forget to escape it?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "1072",
|
|
"message": "Expected end of $(..) expression. Fix any mentioned problems and try again."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "1073",
|
|
"message": "Couldn't parse this command expansion. Fix to allow more checks."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
|
|
"code": "2157",
|
|
"message": "Argument to -z is always false due to literal strings."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2001",
|
|
"message": "See if you can use ${variable//search/replace} instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2001",
|
|
"message": "See if you can use ${variable//search/replace} instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2038",
|
|
"message": "Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/complete-milestone.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/debug.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase-assumptions.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/discuss-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md",
|
|
"code": "2043",
|
|
"message": "This loop will only ever run once. Bad quoting or missing glob/expansion?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/eval-review.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/eval-review.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2016",
|
|
"message": "Expressions don't expand in single quotes, use double quotes for that."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2043",
|
|
"message": "This loop will only ever run once. Bad quoting or missing glob/expansion?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
|
|
"code": "2016",
|
|
"message": "Expressions don't expand in single quotes, use double quotes for that."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
|
|
"code": "2016",
|
|
"message": "Expressions don't expand in single quotes, use double quotes for that."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-plan.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-plan.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/execute-plan.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/forensics.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/health.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/health.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/import.md",
|
|
"code": "2194",
|
|
"message": "This word is constant. Did you forget the $ on a variable?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ingest-docs.md",
|
|
"code": "2157",
|
|
"message": "Argument to -n is always true due to literal strings."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ingest-docs.md",
|
|
"code": "2194",
|
|
"message": "This word is constant. Did you forget the $ on a variable?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ingest-docs.md",
|
|
"code": "2194",
|
|
"message": "This word is constant. Did you forget the $ on a variable?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/milestone-summary.md",
|
|
"code": "2046",
|
|
"message": "Quote this to prevent word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/milestone-summary.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/milestone-summary.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/milestone-summary.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/new-milestone.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/new-project.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/new-project.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/new-workspace.md",
|
|
"code": "2164",
|
|
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/new-workspace.md",
|
|
"code": "2164",
|
|
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/next.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/next.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1102",
|
|
"message": "Shells disambiguate $(( differently or not at all. For $(command substitution), add space after $( . For $((arithmetics)), fix parsing errors."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1102",
|
|
"message": "Shells disambiguate $(( differently or not at all. For $(command substitution), add space after $( . For $((arithmetics)), fix parsing errors."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1102",
|
|
"message": "Shells disambiguate $(( differently or not at all. For $(command substitution), add space after $( . For $((arithmetics)), fix parsing errors."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1106",
|
|
"message": "In arithmetic contexts, use < instead of -lt"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1106",
|
|
"message": "In arithmetic contexts, use < instead of -lt"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "1106",
|
|
"message": "In arithmetic contexts, use < instead of -lt"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "2205",
|
|
"message": "(..) is a subshell. Did you mean [ .. ], a test expression?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "2205",
|
|
"message": "(..) is a subshell. Did you mean [ .. ], a test expression?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pause-work.md",
|
|
"code": "2205",
|
|
"message": "(..) is a subshell. Did you mean [ .. ], a test expression?"
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase.md",
|
|
"code": "2235",
|
|
"message": "Use { ..; } instead of (..) to avoid subshell overhead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md",
|
|
"code": "1009",
|
|
"message": "The mentioned syntax error was in this if expression."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md",
|
|
"code": "1048",
|
|
"message": "Can't have empty then clauses (use 'true' as a no-op)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md",
|
|
"code": "1072",
|
|
"message": "Unexpected keyword/token. Fix any mentioned problems and try again."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md",
|
|
"code": "1073",
|
|
"message": "Couldn't parse this then clause. Fix to allow more checks."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md",
|
|
"code": "2105",
|
|
"message": "continue is only valid in loops."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-review-convergence.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-review-convergence.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-review-convergence.md",
|
|
"code": "2327",
|
|
"message": "This command substitution will be empty because the command's output gets redirected away."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plan-review-convergence.md",
|
|
"code": "2328",
|
|
"message": "This redirection takes output away from the command substitution (use tee to duplicate)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plant-seed.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/plant-seed.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pr-branch.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/pr-branch.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/progress.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/progress.md",
|
|
"code": "2102",
|
|
"message": "Ranges can only match single chars (mentioned due to duplicates)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/quick.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/quick.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/quick.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/reapply-patches.md",
|
|
"code": "2088",
|
|
"message": "Tilde does not expand in quotes. Use $HOME."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/remove-workspace.md",
|
|
"code": "2164",
|
|
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/review.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/secure-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings-advanced.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/settings.md",
|
|
"code": "2261",
|
|
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ship.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sketch.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/spec-phase.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/spec-phase.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/spike.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2010",
|
|
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2115",
|
|
"message": "Use \"${var:?}\" to ensure this never expands to / ."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2115",
|
|
"message": "Use \"${var:?}\" to ensure this never expands to / ."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2181",
|
|
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2199",
|
|
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2199",
|
|
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2199",
|
|
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2199",
|
|
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/sync-skills.md",
|
|
"code": "2207",
|
|
"message": "Prefer mapfile or read -a to split command output (or quote to avoid splitting)."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ui-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ui-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ui-review.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/ui-review.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/undo.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/undo.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/update.md",
|
|
"code": "2046",
|
|
"message": "Quote this to prevent word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/update.md",
|
|
"code": "2046",
|
|
"message": "Quote this to prevent word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/update.md",
|
|
"code": "2088",
|
|
"message": "Tilde does not expand in quotes. Use $HOME."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/validate-phase.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work/steps/automated-ui-verification.md",
|
|
"code": "2012",
|
|
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
|
|
},
|
|
{
|
|
"file": "gsd-core/workflows/verify-work/steps/mvp-uat-framing.md",
|
|
"code": "2086",
|
|
"message": "Double quote to prevent globbing and word splitting."
|
|
}
|
|
]
|