Screens 1 and 4 running as TUIOS panes: reply screen, adopt-or-create launcher, layout script
This commit is contained in:
73
tui/main.go
73
tui/main.go
@@ -1,8 +1,8 @@
|
||||
// Command harness is the terminal front end for the Paperclip coding factory.
|
||||
//
|
||||
// This file only wires flags and starts the program. The screens live in
|
||||
// model.go. Every fact the program shows comes from the Paperclip API; nothing
|
||||
// is stored locally.
|
||||
// One screen per run. Each screen is meant to run in its own TUIOS pane, on a
|
||||
// workspace named after it; the layout script in bin/ opens and adopts them.
|
||||
// This file only wires flags. The screens live in model.go and reply.go.
|
||||
package main
|
||||
|
||||
import (
|
||||
@@ -16,8 +16,10 @@ import (
|
||||
)
|
||||
|
||||
func main() {
|
||||
project := flag.String("project", "", "project id or url key (for example spike-2026-11-10)")
|
||||
dump := flag.Bool("dump", false, "print the task tree as plain text and exit (no full-screen interface)")
|
||||
screen := flag.String("screen", "tree", "which screen to run: tree or reply")
|
||||
project := flag.String("project", "", "project id or url key, for the tree screen")
|
||||
issue := flag.String("issue", "", "task id or identifier such as AUD-160, for the reply screen")
|
||||
dump := flag.Bool("dump", false, "print the tree as plain text and exit (no full-screen interface)")
|
||||
flag.Parse()
|
||||
|
||||
client, err := paperclip.New()
|
||||
@@ -29,32 +31,67 @@ func main() {
|
||||
fmt.Fprintln(os.Stderr, "warning: PAPERCLIP_BOARD_KEY is not set, so replies and status changes will be refused")
|
||||
}
|
||||
|
||||
proj, err := client.ResolveProject(*project)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if *dump {
|
||||
if err := dumpTree(client, proj); err != nil {
|
||||
var m tea.Model
|
||||
switch *screen {
|
||||
case "tree":
|
||||
proj, err := client.ResolveProject(*project)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
return
|
||||
if *dump {
|
||||
if err := dumpTree(client, proj); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
return
|
||||
}
|
||||
m = newModel(client, proj)
|
||||
|
||||
case "reply":
|
||||
task, err := resolveIssue(client, *issue)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
m = newReplyModel(client, task.ID)
|
||||
|
||||
default:
|
||||
fmt.Fprintf(os.Stderr, "unknown screen %q: use tree or reply\n", *screen)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Alternate screen: TUIOS keeps its own scrollback, and a full-screen
|
||||
// program that redraws in place must not fight it.
|
||||
p := tea.NewProgram(newModel(client, proj),
|
||||
tea.WithAltScreen(),
|
||||
tea.WithMouseCellMotion(),
|
||||
)
|
||||
p := tea.NewProgram(m, tea.WithAltScreen(), tea.WithMouseCellMotion())
|
||||
if _, err := p.Run(); err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// resolveIssue accepts a task id or an identifier such as AUD-160.
|
||||
func resolveIssue(c *paperclip.Client, ref string) (paperclip.Issue, error) {
|
||||
if ref == "" {
|
||||
return paperclip.Issue{}, fmt.Errorf("no task given: use -issue AUD-160 or a task id")
|
||||
}
|
||||
if len(ref) == 36 { // looks like a uuid; ask directly
|
||||
if is, err := c.Issue(ref); err == nil && is.ID != "" {
|
||||
return is, nil
|
||||
}
|
||||
}
|
||||
issues, err := c.Issues()
|
||||
if err != nil {
|
||||
return paperclip.Issue{}, err
|
||||
}
|
||||
for _, is := range issues {
|
||||
if is.Identifier == ref || is.ID == ref {
|
||||
return is, nil
|
||||
}
|
||||
}
|
||||
return paperclip.Issue{}, fmt.Errorf("no task matches %q", ref)
|
||||
}
|
||||
|
||||
// dumpTree prints the tree without starting the interface. It is how the data
|
||||
// path is checked from a script or over ssh.
|
||||
func dumpTree(c *paperclip.Client, proj paperclip.Project) error {
|
||||
|
||||
Reference in New Issue
Block a user