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
12 changes: 12 additions & 0 deletions cmd/entire/cli/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,18 @@ func GetAgentsWithHooksInstalled(ctx context.Context) []types.AgentName {
return installed
}

// InstalledAgentDisplayNames returns user-facing display names for agents with hooks installed.
func InstalledAgentDisplayNames(ctx context.Context) []string {
installedNames := GetAgentsWithHooksInstalled(ctx)
displayNames := make([]string, 0, len(installedNames))
for _, name := range installedNames {
if ag, err := agent.Get(name); err == nil {
displayNames = append(displayNames, string(ag.Type()))
}
}
return displayNames
}

// JoinAgentNames joins agent names into a comma-separated string.
func JoinAgentNames(names []types.AgentName) string {
strs := make([]string, len(names))
Expand Down
9 changes: 1 addition & 8 deletions cmd/entire/cli/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -697,14 +697,7 @@ func runEnableInteractive(ctx context.Context, w io.Writer, agents []agent.Agent

// printEnabledStatus prints agents and a hint about `entire configure`.
func printEnabledStatus(ctx context.Context, w io.Writer) {
installedNames := GetAgentsWithHooksInstalled(ctx)
if len(installedNames) > 0 {
displayNames := make([]string, 0, len(installedNames))
for _, name := range installedNames {
if ag, agErr := agent.Get(name); agErr == nil {
displayNames = append(displayNames, string(ag.Type()))
}
}
if displayNames := InstalledAgentDisplayNames(ctx); len(displayNames) > 0 {
fmt.Fprintf(w, "Agents: %s\n", strings.Join(displayNames, ", "))
}
fmt.Fprintln(w, "\nTo add more agents, run `entire configure`.")
Expand Down
10 changes: 10 additions & 0 deletions cmd/entire/cli/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,16 @@ func formatSettingsStatusShort(ctx context.Context, s *EntireSettings, sty statu
}
}

// Show enabled agents
if s.Enabled {
if displayNames := InstalledAgentDisplayNames(ctx); len(displayNames) > 0 {
b.WriteString("\n")
b.WriteString(sty.render(sty.dim, " Agents · "))

b.WriteString(strings.Join(displayNames, ", "))
}
}

return b.String()
}

Expand Down
86 changes: 86 additions & 0 deletions cmd/entire/cli/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,92 @@ func TestFormatSettingsStatusShort_Disabled(t *testing.T) {
}
}

func TestRunStatus_ShowsEnabledAgents(t *testing.T) {
setupTestRepo(t)
writeSettings(t, testSettingsEnabled)
writeClaudeHooksFixture(t)

var stdout bytes.Buffer
if err := runStatus(context.Background(), &stdout, false); err != nil {
t.Fatalf("runStatus() error = %v", err)
}

output := stdout.String()
if !strings.Contains(output, "Agents ·") {
t.Errorf("Expected 'Agents ·' in output, got: %s", output)
}
if !strings.Contains(output, "Claude Code") {
t.Errorf("Expected 'Claude Code' in output, got: %s", output)
}
}

func TestRunStatus_EnabledNoAgentsHidesHooksLine(t *testing.T) {
setupTestRepo(t)
writeSettings(t, testSettingsEnabled)
// No agent hooks installed

var stdout bytes.Buffer
if err := runStatus(context.Background(), &stdout, false); err != nil {
t.Fatalf("runStatus() error = %v", err)
}

output := stdout.String()
if strings.Contains(output, "Agents ·") {
t.Errorf("Should not show hooks line when no agents installed, got: %s", output)
}
}

func TestRunStatus_DetailedShowsEnabledAgents(t *testing.T) {
setupTestRepo(t)
writeSettings(t, testSettingsEnabled)
writeClaudeHooksFixture(t)

var stdout bytes.Buffer
if err := runStatus(context.Background(), &stdout, true); err != nil {
t.Fatalf("runStatus() error = %v", err)
}

output := stdout.String()
if !strings.Contains(output, "Agents ·") {
t.Errorf("Expected 'Agents ·' in detailed output, got: %s", output)
}
if !strings.Contains(output, "Claude Code") {
t.Errorf("Expected 'Claude Code' in detailed output, got: %s", output)
}
}

func TestRunStatus_DetailedDisabledDoesNotShowAgents(t *testing.T) {
setupTestRepo(t)
writeSettings(t, testSettingsDisabled)
writeClaudeHooksFixture(t)

var stdout bytes.Buffer
if err := runStatus(context.Background(), &stdout, true); err != nil {
t.Fatalf("runStatus() error = %v", err)
}

output := stdout.String()
if strings.Contains(output, "Agents ·") {
t.Errorf("Disabled detailed status should not show agents, got: %s", output)
}
}

func TestRunStatus_DisabledDoesNotShowAgents(t *testing.T) {
setupTestRepo(t)
writeSettings(t, testSettingsDisabled)
writeClaudeHooksFixture(t)

var stdout bytes.Buffer
if err := runStatus(context.Background(), &stdout, false); err != nil {
t.Fatalf("runStatus() error = %v", err)
}

output := stdout.String()
if strings.Contains(output, "Agents ·") {
t.Errorf("Disabled status should not show agents, got: %s", output)
}
}

func TestFormatSettingsStatus_Project(t *testing.T) {
t.Parallel()

Expand Down
Loading