Assign readable ticket keys from project code and sequence.
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>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user