github / github/spec-kit

[Bug]: Non-Latin feature descriptions produce a nameless branch/directory (001-, 004-, ...)

Offen
#4,574 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug-assess severity-low triage-nice-to-have
Vorherrschende Sprache
Python
Sterne
137k
Forks
12.3k
Ø Merge
2 T. 12 Std.
Gemergte PRs (30 T.)
159

Beschreibung

### What happened

A feature description written entirely in a non-Latin script produces a branch and directory with **no name at all** — just the number and a trailing dash. Every such feature looks identical apart from its number.

```
specify init demo --integration claude

./.specify/scripts/powershell/create-new-feature.ps1 -Json "给倒推引擎加正推能力"
# {"BRANCH_NAME":"001-", ... "specs\\001-\\spec.md"}

./.specify/scripts/powershell/create-new-feature.ps1 -Json "客户邮件审核队列"
# {"BRANCH_NAME":"004-", ... "specs\\004-\\spec.md"}
```

Resulting tree — two unrelated features, indistinguishable:

```
specs/
├── 001-/
├── 004-/
└── 005-mail-review-queue/ # same description, but with -ShortName
```

For comparison, on the same install:

| Description | BRANCH_NAME |
|---|---|
| `给倒推引擎加正推能力` | `001-` |
| `add forward scheduling engine` | `002-forward-scheduling-engine` |
| `forward 正推 engine` | `003-forward-engine` (Latin words kept, rest dropped) |

### Why this is not the already-known crash

`Get-BranchName` in `create-new-feature.ps1` already carries a comment describing this path — a previous fix stopped it throwing `ArgumentNullException` and made it return an empty suffix instead, matching the bash and Python twins. That fix is correct as far as it goes: the script no longer dies.

But the outcome it settles on is a directory name that carries no information. The empty suffix is a reasonable *internal* result; it just isn't a usable *name*. For a team working in Chinese, Japanese, Korean, Arabic, Hebrew, Thai, Greek, or Cyrillic, this is the default path, not an edge case — every feature they create lands in `NNN-`.

The root cause is the character class, in two places:

```powershell
# line 89
$Name.ToLower() -replace '[^a-z0-9]', '-' ...
# line 136
$Description.ToLower() -replace '[^a-z0-9\s]', ' '
```

Both drop every non-ASCII character, so a CJK description reduces to the empty string before stop-word filtering ever runs.

### Suggested directions

Listed roughly by cost; any one of them removes the nameless directory.

1. **Warn and point at the escape hatch.** `-ShortName` already works (`005-mail-review-queue` above). When the computed suffix is empty, print a line saying the description produced no usable branch name and that `-ShortName ` sets one. Cheapest fix, and it turns a silent surprise into a choice.
2. **Fall back to something stable instead of nothing.** A short hash or timestamp of the description — `001-f3a9c2`, `001-20260914` — is still opaque, but at least distinct per feature.
3. **Widen the character class.** Keep Unicode letters and digits (`\p{L}\p{N}`) and percent-encode or transliterate what git cannot take. Git branch names do accept UTF-8, so `001-客户邮件审核队列` is a legal ref; whether it is *desirable* is a separate call, and tooling downstream may not all agree.

(1) alone would have saved the confusion here. (3) is the real fix but needs a decision about non-ASCII refs that is yours to make, not mine.

### Environment

- specify-cli `1.0.7.dev0` (git `d848fb4`), installed via `uv tool install`
- Windows 11, PowerShell 5.1, Python 3.13.7, git 2.49.0.windows.1
- `--script` auto-selected `powershell`

Not PowerShell-specific — reproduced on both script backends:

```
specify init demo-sh --integration claude --script sh
bash .specify/scripts/bash/create-new-feature.sh --json "给倒推引擎加正推能力"
# {"BRANCH_NAME":"001-", ... "specs/001-/spec.md"}
```

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Start with Get-BranchName in .specify/scripts/powershell/create-new-feature.ps1, then compare the corresponding Bash and Python implementations. Reproduce the empty suffix with a CJK-only description, decide which suggested behavior is acceptable, and add regression coverage showing that the generated branch and directory are no longer nameless.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
bash, git, powershell, python
Bereich
cli, tooling
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Aktiv
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.