Replace UUID-looking sync labels in TUI and web with keys like TAS-1, while keeping the remote UUID for task-master matching. Co-authored-by: Cursor <cursoragent@cursor.com>
50 lines
1.0 KiB
Go
50 lines
1.0 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
// DeriveProjectCode builds a 3-letter uppercase code from a project name.
|
|
// Non-letters are skipped; short results are padded with X.
|
|
func DeriveProjectCode(name string) string {
|
|
var b strings.Builder
|
|
for _, r := range strings.ToUpper(name) {
|
|
if unicode.IsLetter(r) && r < unicode.MaxASCII {
|
|
b.WriteRune(r)
|
|
if b.Len() == 3 {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
code := b.String()
|
|
for len(code) < 3 {
|
|
code += "X"
|
|
}
|
|
return code
|
|
}
|
|
|
|
// nextUniqueCode returns base or a nearby 3-char variant until unused.
|
|
// used maps existing codes (uppercase) → true.
|
|
func nextUniqueCode(base string, used map[string]bool) string {
|
|
base = DeriveProjectCode(base)
|
|
if !used[base] {
|
|
return base
|
|
}
|
|
prefix := base[:2]
|
|
for _, c := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" {
|
|
cand := prefix + string(c)
|
|
if !used[cand] {
|
|
return cand
|
|
}
|
|
}
|
|
for i := 0; i < 1000; i++ {
|
|
cand := fmt.Sprintf("%c%02d", base[0], i)
|
|
if !used[cand] {
|
|
return cand
|
|
}
|
|
}
|
|
return fmt.Sprintf("X%02d", len(used)%100)
|
|
}
|