Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion internal/cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func newInitCmd(svc *workspace.Service) *cobra.Command {
if name != "" {
ref = name
}
ui.Printf("\n Next: %s\n", ui.Code("flow state "+ref))
ui.Printf("\n Next: %s\n", ui.Code("flow edit state "+ref))

return nil
},
Expand Down
11 changes: 10 additions & 1 deletion internal/workspace/workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,16 @@ func (s *Service) Create(id string, st *state.State) error {
return err
}

return state.Save(s.Config.StatePath(id), st)
if err := state.Save(s.Config.StatePath(id), st); err != nil {
return err
}

// Set up Claude agent files immediately so skills are available before render
if err := agents.SetupWorkspaceClaude(wsDir, s.Config.AgentsDir, st, id); err != nil {
return fmt.Errorf("setting up claude files: %w", err)
}

return nil
}

// List returns info for all workspaces.
Expand Down
51 changes: 51 additions & 0 deletions internal/workspace/workspace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,57 @@ func TestGenerateUniqueIDAvoidsExisting(t *testing.T) {
}
}

func TestCreateSetsUpClaudeFiles(t *testing.T) {
svc, _ := testService(t)

st := state.NewState("create-claude", "Test Claude setup on create", []state.Repo{
{URL: "github.com/org/repo-a", Branch: "main", Path: "./repo-a"},
{URL: "github.com/org/repo-b", Branch: "feat/x", Path: "./repo-b"},
})

if err := svc.Create("create-claude-ws", st); err != nil {
t.Fatal(err)
}

wsDir := svc.Config.WorkspacePath("create-claude-ws")

// Workspace CLAUDE.md should exist with repo info
data, err := os.ReadFile(filepath.Join(wsDir, "CLAUDE.md"))
if err != nil {
t.Fatal("workspace CLAUDE.md not created by Create()")
}
content := string(data)
if !strings.Contains(content, "create-claude") {
t.Error("workspace CLAUDE.md missing name")
}
if !strings.Contains(content, "repo-a") {
t.Error("workspace CLAUDE.md missing repo-a")
}
if !strings.Contains(content, "repo-b") {
t.Error("workspace CLAUDE.md missing repo-b")
}

// .claude/CLAUDE.md should be a symlink to shared
target, err := os.Readlink(filepath.Join(wsDir, ".claude", "CLAUDE.md"))
if err != nil {
t.Fatal(".claude/CLAUDE.md symlink not created by Create()")
}
expected := filepath.Join(svc.Config.AgentsDir, "claude", "CLAUDE.md")
if target != expected {
t.Errorf(".claude/CLAUDE.md target = %q, want %q", target, expected)
}

// .claude/skills should be a symlink to shared
target, err = os.Readlink(filepath.Join(wsDir, ".claude", "skills"))
if err != nil {
t.Fatal(".claude/skills symlink not created by Create()")
}
expected = filepath.Join(svc.Config.AgentsDir, "claude", "skills")
if target != expected {
t.Errorf(".claude/skills target = %q, want %q", target, expected)
}
}

func TestRenderCreatesClaudeFiles(t *testing.T) {
svc, _ := testService(t)
ctx := context.Background()
Expand Down