[Bug] create-new-feature.sh uses ${word^^} (bash 4+) and silently drops acronyms on macOS (bash 3.2)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 84/100
Direção de pesquisa
Comece em .specify/scripts/bash/create-new-feature.sh, por volta da linha 231, e inspecione o caminho do nome da branch para acrônimos. Execute os comandos fornecidos --json --dry-run no /bin/bash 3.2 do macOS e compare com o Bash 5.x. Está concluído quando acrônimos curtos em maiúsculas permanecem em BRANCH_NAME e stderr não contém nenhum aviso de substituição inválida.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Summary
create-new-feature.sh (line 231) uses ${word^^}, a bash 4+ uppercase expansion. macOS ships bash 3.2.57 (Apple's last GPLv2 build) and the script fails silently on that line: stderr is full of bad substitution warnings, the script keeps running, and the generated branch name silently drops acronyms that were short (≤2 chars) and uppercase in the original description.
Because the script still emits valid JSON and the resulting branch name is plausible, end users on macOS get a quietly truncated branch without realizing it.
Environment
- macOS (any current version; bash 3.2.57 has been the system bash on every macOS since 2007)
- Any git repo initialised with
specify init - No
bashfrom Homebrew installed (or installed but not first inPATHfor the running shell)
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24)
$ bash .specify/scripts/bash/create-new-feature.sh --json --dry-run \
"Transparencia Art. 50 AI Act: aviso de interaccion con IA"
{"BRANCH_NAME":"001-transparencia-art-act", ...} # ← missing "AI"
$ bash .specify/scripts/bash/create-new-feature.sh --json --dry-run "AI Act transparency"
{"BRANCH_NAME":"001-act-transparency", ...} # ← missing "AI" (top-3 cutoff also affected)
bad substitution # (only visible in stderr; the JSON looks fine)
The same inputs against bash 5.x preserve the acronym:
$ bash .specify/scripts/bash/create-new-feature.sh --json --dry-run "AI Act transparency"
{"BRANCH_NAME":"001-ai-act-transparency", ...} # ← "ai" preserved
Root cause
create-new-feature.sh, line 231:
elif echo "$description" | grep -q "\b${word^^}\b"; then
# Keep short words if they appear as uppercase in original (likely acronyms)
meaningful_words+=("$word")
fi
${word^^} is case-conversion syntax introduced in bash 4.0 (2009). It is not available in bash 3.2. On bash 3.2 the line errors out, grep runs with the literal placeholder string, the grep returns non-zero, the elif is false, and the short word is silently dropped from meaningful_words[]. The same ${var^^} / ${var,,} pattern likely exists in other vendored scripts; I have not audited them all.
The shebang #!/usr/bin/env bash does not protect against this — env picks whatever bash resolves to in the current PATH, and on a stock macOS that is the system's bash 3.2.
Suggested fix
Two options, in order of preference:
- POSIX-portable — replace
${word^^}with a portable uppercase conversion, e.g.echo "$word" | tr '[:lower:]' '[:upper:]', so the script works on bash 3.2 too. This is a one-line change per occurrence and removes the silent failure mode entirely. - Bash 4+ required — if the project decides to require bash 4+ intentionally, make the failure loud: at the top of every vendored script, add a runtime check that fails fast with a clear message and a hint to install bash from Homebrew (
brew install bash). Currently the failure is silent and the user has no way to know their branch name is wrong.
I'd recommend option 1 (POSIX-portable) — the function is a small, isolated transformation and the project already has a clean_branch_name that uses tr '[:upper:]' '[:lower:]' to do the inverse. Symmetry argues for replacing the bash-only expansion with tr as well.
Workaround on macOS today
Install bash 5.x via Homebrew and ensure it is first in PATH for the shell that runs Spec-Kit:
brew install bash
# ~/.zshrc or ~/.bashrc, idempotent:
case "$PATH" in
/opt/homebrew/bin:*) ;;
/opt/homebrew/bin) ;;
*) export PATH="/opt/homebrew/bin${PATH:+:$PATH}" ;;
esac
Note that on login shells, /etc/zprofile runs path_helper which re-derives PATH from /etc/paths + /etc/paths.d/* and puts /opt/homebrew/bin at the end — so the prefix must be re-asserted in a file that runs after /etc/zprofile (e.g. ~/.zshrc).
Impact
This affects every macOS developer or agent using Spec-Kit with a description containing acronyms (e.g. "AI Act", "RGPD", "GDPR", "API", "OAuth", "HIPAA", "PCI"). The "feature name" used downstream in specs/NNN-short-name/spec.md is the same truncated string, so the spec file itself also loses the acronym, and any tooling that relies on the branch/spec name to understand the feature (e.g. CI labels, dashboards, search) gets the wrong subject.
Discovered while piloting Spec-Kit on ada-legal-ai (PR #11 in the HOILAB org). Same root cause likely affects any other team running Spec-Kit on macOS.
- Linguagem predominante
- Python
- Estrelas
- 140k
- Forks
- 12.6k
- Merge médio
- 1d 11h
- PRs com merge (30d)
- 184
Preparar o ambiente
Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/spec-kit
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
feature-assess feature-go triage-can-wait
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
github/spec-kit#4804 · 6 comentários ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: specify init writes speckit.manifest.json without the speckit-converge skill it just installedTalvez livre de novo Um pull request para esta issue foi fechado sem ser mesclado. Abertabug-assess severity-medium
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4273 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
-
[Bug]: /speckit-implement counts checkbox markers inside fenced code blocks — example checkboxes can falsely block implementationTalvez já em andamento @ntdatt812 assumiu há 32 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
Mantenedores costumam responder em até 1 dia
-
[Extension]: Jira Integration (Sync Engine) v0.5.0 (version update of jira-sync)Talvez já em andamento @github-actions assumiu há 56 dias. Abertaextension-submission validation-passed
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/spec-kit#4099 · 3 comentários ·
Mantenedores costumam responder em até 1 dia
Todas as issues de github/spec-kit
Issues semelhantes
-
area: agents area: docs good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 88/100
openapi/gknowledge#23 ·
-
get() for StrEnumTalvez já em andamento @FeJo5952 assumiu hoje. Abertagood first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
collective/icalendar#1921 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Improvement Python Spans
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
getsentry/sentry-python#7994 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
alphagov/notifications-api#5004 ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
equinor/radix-flux#3922 ·
Mantenedores costumam responder em até 1 dia