diff --git a/store/session.go b/store/session.go index 211194c..67a5f49 100644 --- a/store/session.go +++ b/store/session.go @@ -336,6 +336,7 @@ func (s *SessionStore) createSession(args []string) error { } } + cwd = paths.ExpandHome(os.ExpandEnv(cwd)) if cwd == "" { return fmt.Errorf("cwd is required (e.g. new cwd=/path/to/project)") } diff --git a/store/store_test.go b/store/store_test.go index 71fedb3..f1aefc0 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -1402,6 +1402,61 @@ func TestSessionStoreCreateSessionUnknownKey(t *testing.T) { } } +func TestSessionStoreCreateSessionEnvExpansion(t *testing.T) { + home, err := os.UserHomeDir() + if err != nil { + t.Skip("no home dir") + } + t.Setenv("HOME", home) + var gotCwd string + sink := testSink() + s := store.NewSessionStore(store.SessionStoreConfig{ + Log: sink.NewLogger("test"), + Sink: sink, + ReadFile: func(string) ([]byte, error) { return []byte("#!/bin/sh\n"), nil }, + MkdirAll: func(string, os.FileMode) error { return nil }, + NewCore: func(sessionID, agentName, cwd string) (agent.Core, error) { + gotCwd = cwd + return &stubCore{state: "idle", backend: "stub", model: "m", agentName: agentName, cwd: cwd}, nil + }, + }) + e, _ := s.Open("new") + if err := e.Write([]byte("name=envtest cwd=$HOME/")); err != nil { + t.Fatalf("Write(new): %v", err) + } + if gotCwd != home+"/" { + t.Errorf("cwd env not expanded: got %q, want %q", gotCwd, home+"/") + } + s.KillSession("envtest") +} + +func TestSessionStoreCreateSessionTildeExpansion(t *testing.T) { + home, err := os.UserHomeDir() + if err != nil { + t.Skip("no home dir") + } + var gotCwd string + sink := testSink() + s := store.NewSessionStore(store.SessionStoreConfig{ + Log: sink.NewLogger("test"), + Sink: sink, + ReadFile: func(string) ([]byte, error) { return []byte("#!/bin/sh\n"), nil }, + MkdirAll: func(string, os.FileMode) error { return nil }, + NewCore: func(sessionID, agentName, cwd string) (agent.Core, error) { + gotCwd = cwd + return &stubCore{state: "idle", backend: "stub", model: "m", agentName: agentName, cwd: cwd}, nil + }, + }) + e, _ := s.Open("new") + if err := e.Write([]byte("name=tildetest cwd=~/")); err != nil { + t.Fatalf("Write(new): %v", err) + } + if gotCwd != home+"/" { + t.Errorf("cwd not expanded: got %q, want %q", gotCwd, home+"/") + } + s.KillSession("tildetest") +} + // ===== openEntry not-found ===== func TestSessionStoreOpenEntryNotFound(t *testing.T) {