summaryrefslogtreecommitdiff
path: root/cmd/ask
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-11 22:20:57 +0300
committerPaul Buetow <paul@buetow.org>2026-04-11 22:20:57 +0300
commit69d3ec004b8de3b9f7cfeb34686b9c344c787db4 (patch)
tree857101184293efa61f9d1caba4c3b80b31e89a37 /cmd/ask
parent5bc434d71fb5057131f1e5c0b2371db42d3b4ed4 (diff)
Rename task CLI binary from do back to ask
- Move cmd/do to cmd/ask; mage builds and installs ask; Fish completions to ask.fish - Update askcli help text, errors, executor default label, and Fish script (__ask_*) - Task alias cache subdirectory under XDG cache: hexai/ask/ - Rename integration test files and helpers; refresh README and docs - Rename plan-do-uuid-wrapper.md to plan-ask-uuid-wrapper.md Made-with: Cursor
Diffstat (limited to 'cmd/ask')
-rw-r--r--cmd/ask/main.go22
-rw-r--r--cmd/ask/main_test.go51
2 files changed, 73 insertions, 0 deletions
diff --git a/cmd/ask/main.go b/cmd/ask/main.go
new file mode 100644
index 0000000..afab992
--- /dev/null
+++ b/cmd/ask/main.go
@@ -0,0 +1,22 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "os"
+
+ "codeberg.org/snonux/hexai/internal/askcli"
+)
+
+func main() {
+ d := askcli.NewDispatcher(nil)
+ code, err := d.Dispatch(context.Background(), os.Args[1:], os.Stdin, os.Stdout, os.Stderr)
+ if err != nil {
+ // Print the internal error so callers get a useful diagnostic message.
+ fmt.Fprintln(os.Stderr, err)
+ os.Exit(code)
+ }
+ if code != 0 {
+ os.Exit(code)
+ }
+}
diff --git a/cmd/ask/main_test.go b/cmd/ask/main_test.go
new file mode 100644
index 0000000..db6b436
--- /dev/null
+++ b/cmd/ask/main_test.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+ "bytes"
+ "context"
+ "io"
+ "testing"
+
+ "codeberg.org/snonux/hexai/internal/askcli"
+)
+
+func TestMain_WiresDispatcher(t *testing.T) {
+ var gotArgs []string
+ d := askcli.NewDispatcher(&spyRunner{
+ runFn: func(_ context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
+ gotArgs = append([]string(nil), args...)
+ io.WriteString(stdout, `[{"uuid":"test-uuid","description":"Test","status":"pending","priority":"H","tags":["cli"],"urgency":15.0,"depends":[]}]`)
+ return 0, nil
+ },
+ })
+ code, err := d.Dispatch(context.Background(), []string{"list", "limit:1"}, nil, &bytes.Buffer{}, &bytes.Buffer{})
+ if err != nil {
+ t.Fatalf("dispatch returned error: %v", err)
+ }
+ if code != 0 {
+ t.Fatalf("exitCode = %d, want 0", code)
+ }
+ if len(gotArgs) < 1 || gotArgs[len(gotArgs)-1] != "export" {
+ t.Fatalf("args = %v, want [..., export]", gotArgs)
+ }
+}
+
+func TestMain_ExitsNonZero(t *testing.T) {
+ d := askcli.NewDispatcher(&spyRunner{
+ runFn: func(context.Context, []string, io.Reader, io.Writer, io.Writer) (int, error) {
+ return 1, nil
+ },
+ })
+ code, _ := d.Dispatch(context.Background(), []string{"list"}, nil, &bytes.Buffer{}, &bytes.Buffer{})
+ if code == 0 {
+ t.Fatalf("exitCode = 0, want non-zero")
+ }
+}
+
+type spyRunner struct {
+ runFn func(context.Context, []string, io.Reader, io.Writer, io.Writer) (int, error)
+}
+
+func (s *spyRunner) Run(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
+ return s.runFn(ctx, args, stdin, stdout, stderr)
+}