[Bug]: `create-new-feature.sh` rejects the feature descriptions `-n`, `-e` and `-E`, which the Python script accepts

Abierto Apto para principiantes
#5,096 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@WOLIKIMCHENG ya está trabajando en esto.

Desde el 26/10/2026.

  • #5124 de @WOLIKIMCHENG — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
82/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
bash, python
Área
cli

Línea de trabajo

Lee scripts/bash/create-new-feature.sh alrededor de la línea 93, donde se recorta la descripción, y compáralo con el comportamiento de Python en scripts/python/create_new_feature.py. Empieza ejecutando la reproducción del issue o las pruebas de paridad en tests/test_create_new_feature_python_parity.py. Se considera terminado cuando bash acepta descripciones como -n y -e y produce la misma salida que Python; el comportamiento de los argumentos vacíos también se señala como una brecha de paridad relacionada.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

triage-can-wait
Bug Description

scripts/bash/create-new-feature.sh:93 trims the description with FEATURE_DESCRIPTION=$(echo "$FEATURE_DESCRIPTION" | sed -E ...). When the description is exactly an echo option word (-n, -e, -E, or a combination such as -neE), bash's builtin echo treats it as an option and prints nothing. The script then exits 1 with "Feature description cannot be empty or contain only whitespace". The Python twin, scripts/python/create_new_feature.py, accepts the same input and creates 001-n. The two variants therefore disagree.

Steps to Reproduce

From a fresh clone, after uv sync, save the script below and run uv run python -I repro.py from the repository root. It copies both script variants into a temporary project and runs them with --json --dry-run.

import shutil, subprocess, sys, tempfile
from pathlib import Path

repo = Path(tempfile.mkdtemp())
for sub, files in [("bash", ["common.sh", "create-new-feature.sh"]),
                   ("python", ["common.py", "create_new_feature.py"])]:
    d = repo / ".specify" / "scripts" / sub
    d.mkdir(parents=True)
    for f in files:
        shutil.copy(Path("scripts") / sub / f, d / f)

for desc in ["-n", "-e", "-E", "-neE"]:
    for name, cmd in [
        ("bash", ["bash", ".specify/scripts/bash/create-new-feature.sh"]),
        ("python", [sys.executable, ".specify/scripts/python/create_new_feature.py"]),
    ]:
        r = subprocess.run(cmd + ["--json", "--dry-run", desc], cwd=repo,
                           capture_output=True, text=True)
        out = (r.stdout or r.stderr).strip()
        print(f"{desc:5} {name:6} rc={r.returncode} {out[:80]}")
Expected Behavior

Both variants should treat the description as text and produce the same branch name (for example 001-n). The bash script's own comment at scripts/bash/create-new-feature.sh:220-221 says it uses "printf instead of echo, so a name of "-n"/"-e"/"-E" is text, not options". tests/test_create_new_feature_python_parity.py asserts that the variants produce identical output (for example lines 444 and 752).

Actual Behavior
-n    bash   rc=1 Error: Feature description cannot be empty or contain only whitespace
-n    python rc=0 {"BRANCH_NAME":"001-n","SPEC_FILE":"/tmp/tmpimfdrmab/specs/001-n/spec.md","FEATU
-e    bash   rc=1 Error: Feature description cannot be empty or contain only whitespace
-e    python rc=0 {"BRANCH_NAME":"001-e","SPEC_FILE":"/tmp/tmpimfdrmab/specs/001-e/spec.md","FEATU
-E    bash   rc=1 Error: Feature description cannot be empty or contain only whitespace
-E    python rc=0 {"BRANCH_NAME":"001-e","SPEC_FILE":"/tmp/tmpimfdrmab/specs/001-e/spec.md","FEATU
-neE  bash   rc=1 Error: Feature description cannot be empty or contain only whitespace
-neE  python rc=0 {"BRANCH_NAME":"001-nee","SPEC_FILE":"/tmp/tmpimfdrmab/specs/001-nee/spec.md","F
Specify CLI Version

1.2.4.dev0 (main at 27d14e2)

AI Agent

Not applicable

Operating System

Linux 6.18 (Ubuntu container)

Python Version

Python 3.12.3

Error Logs
Error: Feature description cannot be empty or contain only whitespace
Additional Context

Using printf '%s\n' "$FEATURE_DESCRIPTION" on line 93 would match the approach the script already uses elsewhere.

A smaller related parity gap: for a single empty argument (create-new-feature.sh ""), bash prints the Usage line, while the Python script prints "Error: Feature description cannot be empty or contain only whitespace" (scripts/python/create_new_feature.py:150-156). Both exit 1.

Also reproduced on macOS (Darwin 25.6, arm64) with Python 3.14.4 and uv run python -I repro.py against 27d14e2; the output matches the above.

AI Disclosure

Found and reproduced with Claude Code (model: Claude Opus 4.8), run autonomously under human supervision. The human reporter re-ran every reproduction above before filing.

Lenguaje dominante
Python
Estrellas
144k
Forks
12.9k
Merge medio
1 d 4 h
PR fusionados (30 d)
181

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de github/spec-kit

Todos los issues de github/spec-kit

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.