While vendoring assign-to-workforce into a downstream repo (Tipalti data-askpm-agent, PR #230124 on internal TFS), 4 portability issues surfaced. Filing them upstream so future re-vendoring stays clean.
Findings + suggested fixes (each one validated against the downstream repo):
1. scripts/assign-to-workforce.sh:105 — empty-array expansion breaks macOS /bin/bash 3.2
The canonical happy-path assign-to-workforce.sh split-plan (no extra args) enters cmd_split_plan with extra_args=(), then this line:
waves_json="$("${DEVAGUE[@]}" plan waves --json "${extra_args[@]}" 2>"$tmp_err")"
aborts under set -euo pipefail with extra_args[@]: unbound variable on bash 3.2.57 (the stock macOS shell — #!/usr/bin/env bash resolves there on default installs). Bash 4+ relaxed this, but the operator environment is bash 3.2.
Fix: guard the expansion with the + parameter substitution form.
- waves_json="$("${DEVAGUE[@]}" plan waves --json "${extra_args[@]}" 2>"$tmp_err")"
+ waves_json="$("${DEVAGUE[@]}" plan waves --json "${extra_args[@]+"${extra_args[@]}"}" 2>"$tmp_err")"
Verified on GNU bash 3.2.57(1)-release (arm64-apple-darwin25).
2. SKILL.md:225 — dead workflow.sh open reference in the worked example
The end-to-end worked example tells the operator to open the final PR with:
bash .claude/skills/cicd/scripts/workflow.sh open
…but no workflow.sh ships in any downstream cicd skill (and agentculture/devague itself doesn't ship one either). Executing the example as written fails with bash: .../workflow.sh: No such file or directory.
Suggested fix: keep the example downstream-agnostic — either drop the literal command and just say "open the PR via your repo's cicd/PR-creation skill", or use a clearly-templated placeholder so it doesn't read as a real path.
3. SKILL.md:156 — agex pr open reference
a PR via the cicd skill (agex pr open).
agex is a sibling tool but it isn't documented as a hard dependency of assign-to-workforce, and downstream repos using this skill won't necessarily have it. Same as (2) — drop the concrete invocation or template it.
4. scripts/assign-to-workforce.sh:76 — same agex pr open in help text
The help text under Human gates mirrors the SKILL.md L156 reference.
3. The final PR (opened by the main agent via \`cicd\` / \`agex pr open\`).
Same fix as (3) — keep it agnostic so the help text matches whatever cicd-flavored skill the host repo actually ships.
Context
The downstream PR (#230124, internal TFS) applies all four fixes locally to unblock the vendoring. Filing here so the same fixes can land upstream — otherwise the next devague learn skills:all re-vendoring would re-introduce the bugs.
Happy to PR these upstream if useful — let me know.
While vendoring
assign-to-workforceinto a downstream repo (Tipaltidata-askpm-agent, PR #230124 on internal TFS), 4 portability issues surfaced. Filing them upstream so future re-vendoring stays clean.Findings + suggested fixes (each one validated against the downstream repo):
1.
scripts/assign-to-workforce.sh:105— empty-array expansion breaks macOS/bin/bash3.2The canonical happy-path
assign-to-workforce.sh split-plan(no extra args) enterscmd_split_planwithextra_args=(), then this line:waves_json="$("${DEVAGUE[@]}" plan waves --json "${extra_args[@]}" 2>"$tmp_err")"aborts under
set -euo pipefailwithextra_args[@]: unbound variableon bash 3.2.57 (the stock macOS shell —#!/usr/bin/env bashresolves there on default installs). Bash 4+ relaxed this, but the operator environment is bash 3.2.Fix: guard the expansion with the
+parameter substitution form.Verified on
GNU bash 3.2.57(1)-release (arm64-apple-darwin25).2.
SKILL.md:225— deadworkflow.sh openreference in the worked exampleThe end-to-end worked example tells the operator to open the final PR with:
…but no
workflow.shships in any downstreamcicdskill (andagentculture/devagueitself doesn't ship one either). Executing the example as written fails withbash: .../workflow.sh: No such file or directory.Suggested fix: keep the example downstream-agnostic — either drop the literal command and just say "open the PR via your repo's
cicd/PR-creation skill", or use a clearly-templated placeholder so it doesn't read as a real path.3.
SKILL.md:156—agex pr openreferenceagexis a sibling tool but it isn't documented as a hard dependency ofassign-to-workforce, and downstream repos using this skill won't necessarily have it. Same as (2) — drop the concrete invocation or template it.4.
scripts/assign-to-workforce.sh:76— sameagex pr openin help textThe help text under
Human gatesmirrors the SKILL.md L156 reference.Same fix as (3) — keep it agnostic so the help text matches whatever
cicd-flavored skill the host repo actually ships.Context
The downstream PR (#230124, internal TFS) applies all four fixes locally to unblock the vendoring. Filing here so the same fixes can land upstream — otherwise the next
devague learn skills:allre-vendoring would re-introduce the bugs.Happy to PR these upstream if useful — let me know.