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
73 changes: 0 additions & 73 deletions .surface
Original file line number Diff line number Diff line change
Expand Up @@ -682,9 +682,6 @@ CMD basecamp connect shadow
CMD basecamp connect shadow promote
CMD basecamp connect show
CMD basecamp connect status
CMD basecamp connect worktrees
CMD basecamp connect worktrees list
CMD basecamp connect worktrees prune
CMD basecamp docs
CMD basecamp docs archive
CMD basecamp docs doc
Expand Down Expand Up @@ -5524,7 +5521,6 @@ FLAG basecamp connect setup --trust type=string
FLAG basecamp connect setup --verbose type=count
FLAG basecamp connect setup --watch-completions type=stringArray
FLAG basecamp connect setup --worker type=string
FLAG basecamp connect setup --worktrees type=bool
FLAG basecamp connect shadow --account type=string
FLAG basecamp connect shadow --agent type=bool
FLAG basecamp connect shadow --cache-dir type=string
Expand Down Expand Up @@ -5610,72 +5606,6 @@ FLAG basecamp connect status --stats type=bool
FLAG basecamp connect status --styled type=bool
FLAG basecamp connect status --todolist type=string
FLAG basecamp connect status --verbose type=count
FLAG basecamp connect worktrees --account type=string
FLAG basecamp connect worktrees --agent type=bool
FLAG basecamp connect worktrees --cache-dir type=string
FLAG basecamp connect worktrees --count type=bool
FLAG basecamp connect worktrees --help type=bool
FLAG basecamp connect worktrees --hints type=bool
FLAG basecamp connect worktrees --ids-only type=bool
FLAG basecamp connect worktrees --in type=string
FLAG basecamp connect worktrees --jq type=string
FLAG basecamp connect worktrees --json type=bool
FLAG basecamp connect worktrees --markdown type=bool
FLAG basecamp connect worktrees --md type=bool
FLAG basecamp connect worktrees --no-hints type=bool
FLAG basecamp connect worktrees --no-stats type=bool
FLAG basecamp connect worktrees --profile type=string
FLAG basecamp connect worktrees --project type=string
FLAG basecamp connect worktrees --quiet type=bool
FLAG basecamp connect worktrees --stats type=bool
FLAG basecamp connect worktrees --styled type=bool
FLAG basecamp connect worktrees --todolist type=string
FLAG basecamp connect worktrees --verbose type=count
FLAG basecamp connect worktrees list --account type=string
FLAG basecamp connect worktrees list --agent type=bool
FLAG basecamp connect worktrees list --cache-dir type=string
FLAG basecamp connect worktrees list --count type=bool
FLAG basecamp connect worktrees list --help type=bool
FLAG basecamp connect worktrees list --hints type=bool
FLAG basecamp connect worktrees list --ids-only type=bool
FLAG basecamp connect worktrees list --in type=string
FLAG basecamp connect worktrees list --jq type=string
FLAG basecamp connect worktrees list --json type=bool
FLAG basecamp connect worktrees list --markdown type=bool
FLAG basecamp connect worktrees list --md type=bool
FLAG basecamp connect worktrees list --no-hints type=bool
FLAG basecamp connect worktrees list --no-stats type=bool
FLAG basecamp connect worktrees list --profile type=string
FLAG basecamp connect worktrees list --project type=string
FLAG basecamp connect worktrees list --quiet type=bool
FLAG basecamp connect worktrees list --shadow type=bool
FLAG basecamp connect worktrees list --stats type=bool
FLAG basecamp connect worktrees list --styled type=bool
FLAG basecamp connect worktrees list --todolist type=string
FLAG basecamp connect worktrees list --verbose type=count
FLAG basecamp connect worktrees prune --account type=string
FLAG basecamp connect worktrees prune --agent type=bool
FLAG basecamp connect worktrees prune --cache-dir type=string
FLAG basecamp connect worktrees prune --count type=bool
FLAG basecamp connect worktrees prune --force type=stringArray
FLAG basecamp connect worktrees prune --help type=bool
FLAG basecamp connect worktrees prune --hints type=bool
FLAG basecamp connect worktrees prune --ids-only type=bool
FLAG basecamp connect worktrees prune --in type=string
FLAG basecamp connect worktrees prune --jq type=string
FLAG basecamp connect worktrees prune --json type=bool
FLAG basecamp connect worktrees prune --markdown type=bool
FLAG basecamp connect worktrees prune --md type=bool
FLAG basecamp connect worktrees prune --no-hints type=bool
FLAG basecamp connect worktrees prune --no-stats type=bool
FLAG basecamp connect worktrees prune --profile type=string
FLAG basecamp connect worktrees prune --project type=string
FLAG basecamp connect worktrees prune --quiet type=bool
FLAG basecamp connect worktrees prune --shadow type=bool
FLAG basecamp connect worktrees prune --stats type=bool
FLAG basecamp connect worktrees prune --styled type=bool
FLAG basecamp connect worktrees prune --todolist type=string
FLAG basecamp connect worktrees prune --verbose type=count
FLAG basecamp docs --account type=string
FLAG basecamp docs --agent type=bool
FLAG basecamp docs --cache-dir type=string
Expand Down Expand Up @@ -18865,9 +18795,6 @@ SUB basecamp connect shadow
SUB basecamp connect shadow promote
SUB basecamp connect show
SUB basecamp connect status
SUB basecamp connect worktrees
SUB basecamp connect worktrees list
SUB basecamp connect worktrees prune
SUB basecamp docs
SUB basecamp docs archive
SUB basecamp docs doc
Expand Down
73 changes: 73 additions & 0 deletions .surface-breaking
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ CMD basecamp card move
CMD basecamp card mv
CMD basecamp card update
CMD basecamp comment
CMD basecamp connect worktrees
CMD basecamp connect worktrees list
CMD basecamp connect worktrees prune
CMD basecamp done
CMD basecamp mcp
CMD basecamp message
Expand Down Expand Up @@ -479,6 +482,73 @@ FLAG basecamp comments --on type=string
FLAG basecamp comments --page type=int
FLAG basecamp comments list --on type=string
FLAG basecamp comments update --content type=string
FLAG basecamp connect setup --worktrees type=bool
FLAG basecamp connect worktrees --account type=string
FLAG basecamp connect worktrees --agent type=bool
FLAG basecamp connect worktrees --cache-dir type=string
FLAG basecamp connect worktrees --count type=bool
FLAG basecamp connect worktrees --help type=bool
FLAG basecamp connect worktrees --hints type=bool
FLAG basecamp connect worktrees --ids-only type=bool
FLAG basecamp connect worktrees --in type=string
FLAG basecamp connect worktrees --jq type=string
FLAG basecamp connect worktrees --json type=bool
FLAG basecamp connect worktrees --markdown type=bool
FLAG basecamp connect worktrees --md type=bool
FLAG basecamp connect worktrees --no-hints type=bool
FLAG basecamp connect worktrees --no-stats type=bool
FLAG basecamp connect worktrees --profile type=string
FLAG basecamp connect worktrees --project type=string
FLAG basecamp connect worktrees --quiet type=bool
FLAG basecamp connect worktrees --stats type=bool
FLAG basecamp connect worktrees --styled type=bool
FLAG basecamp connect worktrees --todolist type=string
FLAG basecamp connect worktrees --verbose type=count
FLAG basecamp connect worktrees list --account type=string
FLAG basecamp connect worktrees list --agent type=bool
FLAG basecamp connect worktrees list --cache-dir type=string
FLAG basecamp connect worktrees list --count type=bool
FLAG basecamp connect worktrees list --help type=bool
FLAG basecamp connect worktrees list --hints type=bool
FLAG basecamp connect worktrees list --ids-only type=bool
FLAG basecamp connect worktrees list --in type=string
FLAG basecamp connect worktrees list --jq type=string
FLAG basecamp connect worktrees list --json type=bool
FLAG basecamp connect worktrees list --markdown type=bool
FLAG basecamp connect worktrees list --md type=bool
FLAG basecamp connect worktrees list --no-hints type=bool
FLAG basecamp connect worktrees list --no-stats type=bool
FLAG basecamp connect worktrees list --profile type=string
FLAG basecamp connect worktrees list --project type=string
FLAG basecamp connect worktrees list --quiet type=bool
FLAG basecamp connect worktrees list --shadow type=bool
FLAG basecamp connect worktrees list --stats type=bool
FLAG basecamp connect worktrees list --styled type=bool
FLAG basecamp connect worktrees list --todolist type=string
FLAG basecamp connect worktrees list --verbose type=count
FLAG basecamp connect worktrees prune --account type=string
FLAG basecamp connect worktrees prune --agent type=bool
FLAG basecamp connect worktrees prune --cache-dir type=string
FLAG basecamp connect worktrees prune --count type=bool
FLAG basecamp connect worktrees prune --force type=stringArray
FLAG basecamp connect worktrees prune --help type=bool
FLAG basecamp connect worktrees prune --hints type=bool
FLAG basecamp connect worktrees prune --ids-only type=bool
FLAG basecamp connect worktrees prune --in type=string
FLAG basecamp connect worktrees prune --jq type=string
FLAG basecamp connect worktrees prune --json type=bool
FLAG basecamp connect worktrees prune --markdown type=bool
FLAG basecamp connect worktrees prune --md type=bool
FLAG basecamp connect worktrees prune --no-hints type=bool
FLAG basecamp connect worktrees prune --no-stats type=bool
FLAG basecamp connect worktrees prune --profile type=string
FLAG basecamp connect worktrees prune --project type=string
FLAG basecamp connect worktrees prune --quiet type=bool
FLAG basecamp connect worktrees prune --shadow type=bool
FLAG basecamp connect worktrees prune --stats type=bool
FLAG basecamp connect worktrees prune --styled type=bool
FLAG basecamp connect worktrees prune --todolist type=string
FLAG basecamp connect worktrees prune --verbose type=count
FLAG basecamp docs doc create --content type=string
FLAG basecamp docs doc create --title type=string
FLAG basecamp docs document create --content type=string
Expand Down Expand Up @@ -1005,6 +1075,9 @@ SUB basecamp card move
SUB basecamp card mv
SUB basecamp card update
SUB basecamp comment
SUB basecamp connect worktrees
SUB basecamp connect worktrees list
SUB basecamp connect worktrees prune
SUB basecamp done
SUB basecamp mcp
SUB basecamp message
Expand Down
8 changes: 0 additions & 8 deletions e2e/smoke/smoke_lifecycle.bats
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,6 @@ load smoke_helper
mark_out_of_scope "Applies a reconciliation file to a local connector ledger — covered by Go tests in internal/commands and internal/connector"
}

@test "connect worktrees list is out of scope" {
mark_out_of_scope "Reads a local connector's ledger — covered by Go tests in internal/commands and internal/connector"
}

@test "connect worktrees prune is out of scope" {
mark_out_of_scope "Removes local git worktrees a connector kept — covered by Go tests in internal/commands and internal/connector"
}

@test "auth refresh is out of scope" {
mark_out_of_scope "Requires OAuth credentials"
}
Expand Down
2 changes: 1 addition & 1 deletion internal/commands/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func CommandCategories() []CommandCategory {
{Name: "bonfire", Category: "additional", Description: "Multi-chat orchestration", Actions: []string{"split", "layout"}, Experimental: true, DevOnly: true},
{Name: "api", Category: "additional", Description: "Raw API access"},
{Name: "mcp", Category: "additional", Description: "Serve Basecamp to MCP clients over stdio"},
{Name: "connect", Category: "additional", Description: "Run a local agent connector for a Basecamp agent, and see and decide what it runs", Actions: []string{"setup", "show", "status", "doctor", "redispatch", "discard", "release", "shadow", "import", "worktrees"}},
{Name: "connect", Category: "additional", Description: "Run a local agent connector for a Basecamp agent, and see and decide what it runs", Actions: []string{"setup", "show", "status", "doctor", "redispatch", "discard", "release", "shadow", "import"}},
{Name: "help", Category: "additional", Description: "Show help"},
{Name: "version", Category: "additional", Description: "Show version"},
},
Expand Down
40 changes: 12 additions & 28 deletions internal/commands/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ wait for review, until basecamp connect release. Linux only.
}
addConnectRunFlags(cmd, &run)
cmd.AddCommand(newConnectSetupCmd(), newConnectWorkerMCPCmd(), newConnectShowCmd(), newConnectStatusCmd(), newConnectDoctorCmd(),
newConnectRedispatchCmd(), newConnectDiscardCmd(), newConnectReleaseCmd(), newConnectShadowCmd(), newConnectImportCmd(),
newConnectWorktreesCmd())
newConnectRedispatchCmd(), newConnectDiscardCmd(), newConnectReleaseCmd(), newConnectShadowCmd(), newConnectImportCmd())
return cmd
}

Expand Down Expand Up @@ -181,10 +180,6 @@ func connectShowDisplay(path string, f setup.File, markdown bool) map[string]any
}
trust += ": people " + strings.Join(ids, ", ")
}
worktrees := "off"
if f.Worktrees {
worktrees = "on"
}
d := map[string]any{
"file": exact(path),
"account": f.AccountID,
Expand All @@ -195,7 +190,7 @@ func connectShowDisplay(path string, f setup.File, markdown bool) map[string]any
// agent the driver runs, and a file written before that field
// existed still means the default, which is what a person reading
// show needs to see.
"workers": fmt.Sprintf("%s running %s, concurrency %d, deadline %s, worktrees %s", f.Driver, f.WorkerName(), f.Concurrency, time.Duration(f.Deadline), worktrees),
"workers": fmt.Sprintf("%s running %s, concurrency %d, deadline %s", f.Driver, f.WorkerName(), f.Concurrency, time.Duration(f.Deadline)),
"projects": strconv.Itoa(len(f.Projects)) + " routed",
}
for id, r := range f.Projects {
Expand Down Expand Up @@ -265,16 +260,15 @@ type connectSetupFlags struct {
trust string
allow []string

routes []string
classes []string
watch []string
unwatch []string
unroute []string
driver string
worker string
parallel int
deadline time.Duration
worktrees bool
routes []string
classes []string
watch []string
unwatch []string
unroute []string
driver string
worker string
parallel int
deadline time.Duration
}

func newConnectSetupCmd() *cobra.Command {
Expand Down Expand Up @@ -331,7 +325,7 @@ Examples:
basecamp connect setup -P agent --operator-profile me --route 12345=~/Work/app
basecamp connect setup -P agent --operator-profile me --trust allowlist --allow 111 --allow 222
basecamp connect setup -P bot --operator-profile me --expect-identity 4242 --route 12345=~/Work/app
basecamp connect setup -P agent --class 12345=internal --deadline 90m --worktrees`,
basecamp connect setup -P agent --class 12345=internal --deadline 90m`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
app := appctx.FromContext(cmd.Context())
Expand All @@ -357,7 +351,6 @@ Examples:
fl.StringVar(&f.worker, "worker", "", fmt.Sprintf("The coding agent workers run: %s (default %s)", strings.Join(setup.Workers, ", "), setup.DefaultWorker))
fl.IntVar(&f.parallel, "concurrency", 0, fmt.Sprintf("Workers at once (default %d)", setup.DefaultConcurrency))
fl.DurationVar(&f.deadline, "deadline", 0, fmt.Sprintf("Deadline per task (default %s)", setup.DefaultDeadline))
fl.BoolVar(&f.worktrees, "worktrees", false, "Give each task its own git worktree")
cmd.MarkFlagsMutuallyExclusive("operator", "operator-profile")

return cmd
Expand All @@ -381,7 +374,6 @@ func runConnectSetup(cmd *cobra.Command, app *appctx.App, f *connectSetupFlags)
if err != nil {
return err
}
worktreesChanged(cmd, f, &changes)
expect, err := parseExpectIdentity(f.expectIdentity)
if err != nil {
return err
Expand Down Expand Up @@ -810,14 +802,6 @@ func (f *connectSetupFlags) changes(cmd *cobra.Command) (setup.Changes, error) {
return ch, nil
}

// worktreesChanged wires --worktrees, which is only a change when typed.
func worktreesChanged(cmd *cobra.Command, f *connectSetupFlags, ch *setup.Changes) {
if cmd.Flags().Changed("worktrees") {
v := f.worktrees
ch.Worktrees = &v
}
}

// parseProjectPairs parses repeatable <project-id>=<value> flags.
func parseProjectPairs(flag string, raw []string) (map[int64]string, error) {
return parseProjectPairsWith(flag, raw, false)
Expand Down
Loading
Loading