Add tm_server with SQLite, Svelte UI, and task-master TUI sync.

Introduces the web backend (auth, RBAC, project tokens, revisions),
YouTrack-or-taskmaster backend choice in the TUI, and a first-pass
embedded Svelte UI. The frontend is functional but needs a major rework.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-27 22:23:11 +01:00
co-authored by Cursor
parent 98d2253f44
commit 4adfcdb95a
67 changed files with 7188 additions and 129 deletions
+19 -1
View File
@@ -9,6 +9,7 @@ import (
func TestProjectEditMetaKeepsToken(t *testing.T) {
prev := project.Meta{
Backend: project.BackendYouTrack,
YouTrack: &project.YouTrack{
BaseURL: "https://yt.example",
Token: "secret",
@@ -31,10 +32,27 @@ func TestProjectEditMetaKeepsToken(t *testing.T) {
}
func TestProjectEditValidateIncomplete(t *testing.T) {
f := views.NewProjectEditForm("inbox", project.Meta{}, 80)
f := views.NewProjectEditForm("inbox", project.Meta{Backend: project.BackendYouTrack}, 80)
f.BackendIdx = 1 // youtrack
f.Backend = project.BackendYouTrack
f.Inputs[views.FieldRemoteURL].SetValue("https://yt.example")
// missing token + key
if err := f.Validate(project.Meta{}); err == nil {
t.Fatal("expected incomplete error")
}
}
func TestProjectEditTaskMaster(t *testing.T) {
prev := project.Meta{
Backend: project.BackendTaskMaster,
TaskMaster: &project.TaskMaster{
BaseURL: "http://127.0.0.1:8080", Token: "tm_secret", ProjectID: "abc",
},
}
f := views.NewProjectEditForm("inbox", prev, 80)
f.Inputs[views.FieldToken].SetValue("")
meta := f.Meta(prev)
if meta.TaskMaster == nil || meta.TaskMaster.Token != "tm_secret" {
t.Fatalf("expected kept tm token, got %+v", meta.TaskMaster)
}
}