From 82f04f64dd7850685a91370c1c07ed0eabf0c8c0 Mon Sep 17 00:00:00 2001 From: Virgil Date: Wed, 1 Apr 2026 13:20:05 +0000 Subject: [PATCH] feat(agentic): add ReadStatus wrapper Co-Authored-By: Virgil --- pkg/agentic/status.go | 19 +++++++++++++++++ pkg/agentic/status_example_test.go | 21 ++++++++++++++++++ pkg/agentic/status_test.go | 34 ++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/pkg/agentic/status.go b/pkg/agentic/status.go index c62e7dc..eba6ac8 100644 --- a/pkg/agentic/status.go +++ b/pkg/agentic/status.go @@ -91,6 +91,25 @@ func ReadStatusResult(workspaceDir string) core.Result { return core.Result{Value: &workspaceStatus, OK: true} } +// read, err := ReadStatus("/path/to/workspace") +// if err == nil { core.Println(read.Status) } +func ReadStatus(workspaceDir string) (*WorkspaceStatus, error) { + result := ReadStatusResult(workspaceDir) + if !result.OK { + err, _ := result.Value.(error) + if err == nil { + err = core.E("ReadStatus", "failed to read status", nil) + } + return nil, err + } + + workspaceStatus, ok := workspaceStatusValue(result) + if !ok { + return nil, core.E("ReadStatus", "invalid status payload", nil) + } + return workspaceStatus, nil +} + // result := ReadStatusResult("/path/to/workspace") // workspaceStatus, ok := workspaceStatusValue(result) func workspaceStatusValue(result core.Result) (*WorkspaceStatus, bool) { diff --git a/pkg/agentic/status_example_test.go b/pkg/agentic/status_example_test.go index 109bcd6..58b2fae 100644 --- a/pkg/agentic/status_example_test.go +++ b/pkg/agentic/status_example_test.go @@ -44,3 +44,24 @@ func ExampleReadStatusResult() { // true // go-io } + +func ExampleReadStatus() { + fsys := (&core.Fs{}).NewUnrestricted() + dir := fsys.TempDir("agentic-status") + defer fsys.DeleteAll(dir) + + status := &WorkspaceStatus{ + Status: "blocked", + Agent: "claude", + Repo: "go-io", + } + core.Println(fs.Write(core.JoinPath(dir, "status.json"), core.JSONMarshalString(status)).OK) + + read, err := ReadStatus(dir) + core.Println(err == nil) + core.Println(read.Repo) + // Output: + // true + // true + // go-io +} diff --git a/pkg/agentic/status_test.go b/pkg/agentic/status_test.go index 6527c28..2839279 100644 --- a/pkg/agentic/status_test.go +++ b/pkg/agentic/status_test.go @@ -184,6 +184,40 @@ func TestStatus_ReadStatus_Good_BlockedWithQuestion(t *testing.T) { assert.Equal(t, "Which interface should I implement?", read.Question) } +func TestStatus_ReadStatus_Good_Wrapper(t *testing.T) { + dir := t.TempDir() + + status := &WorkspaceStatus{ + Status: "completed", + Agent: "codex", + Repo: "go-io", + Task: "add logging", + } + + require.True(t, fs.Write(core.JoinPath(dir, "status.json"), core.JSONMarshalString(status)).OK) + + read, err := ReadStatus(dir) + require.NoError(t, err) + require.NotNil(t, read) + assert.Equal(t, "completed", read.Status) + assert.Equal(t, "go-io", read.Repo) +} + +func TestStatus_ReadStatus_Bad_NoFile_Wrapper(t *testing.T) { + read, err := ReadStatus(t.TempDir()) + assert.Nil(t, read) + require.Error(t, err) +} + +func TestStatus_ReadStatus_Ugly_InvalidJSON_Wrapper(t *testing.T) { + dir := t.TempDir() + require.True(t, fs.Write(core.JoinPath(dir, "status.json"), "not json{").OK) + + read, err := ReadStatus(dir) + assert.Nil(t, read) + require.Error(t, err) +} + func TestStatus_WriteRead_Good_Roundtrip(t *testing.T) { dir := t.TempDir()