Skip to content

Commit f8021ab

Browse files
committed
refactor(cli): remove start alias and update CLI help text
- remove `start` as an alias of `serve` - refresh docs and install script to use `serve` - update CLI help text for IM room/user commands
1 parent 1ce98bb commit f8021ab

11 files changed

Lines changed: 33 additions & 40 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ build: boxlite-setup
5555
env GOCACHE=$(GOCACHE) $(GO) build -ldflags "$(LDFLAGS)" -o $(BIN) ./cmd/csgclaw
5656

5757
run: boxlite-setup
58-
env GOCACHE=$(GOCACHE) $(GO) run -ldflags "$(LDFLAGS)" ./cmd/csgclaw start
58+
env GOCACHE=$(GOCACHE) $(GO) run -ldflags "$(LDFLAGS)" ./cmd/csgclaw serve
5959

6060
onboard: boxlite-setup
6161
env GOCACHE=$(GOCACHE) $(GO) run -ldflags "$(LDFLAGS)" ./cmd/csgclaw onboard \

cli/app.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (a *App) Execute(ctx context.Context, args []string) error {
5656
switch rest[0] {
5757
case "onboard":
5858
return a.runOnboard(rest[1:], globals)
59-
case "serve", "start":
59+
case "serve":
6060
if a.serveFunc != nil {
6161
return a.serveFunc(ctx, rest[1:], globals)
6262
}
@@ -147,11 +147,10 @@ func (a *App) usage() {
147147
fmt.Fprintln(a.stderr, "Available Commands:")
148148
fmt.Fprintln(a.stderr, " onboard Initialize local config and bootstrap state")
149149
fmt.Fprintln(a.stderr, " serve Start the local HTTP server")
150-
fmt.Fprintln(a.stderr, " start Alias for serve")
151150
fmt.Fprintln(a.stderr, " stop Stop the local HTTP server")
152151
fmt.Fprintln(a.stderr, " agent Manage agents")
153-
fmt.Fprintln(a.stderr, " room Manage rooms")
154-
fmt.Fprintln(a.stderr, " user Manage users")
152+
fmt.Fprintln(a.stderr, " room Manage IM rooms")
153+
fmt.Fprintln(a.stderr, " user Manage IM users")
155154
fmt.Fprintln(a.stderr)
156155
fmt.Fprintln(a.stderr, "Examples:")
157156
fmt.Fprintln(a.stderr, " csgclaw -h")

cli/app_test.go

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,8 @@ func TestUsageIncludesTopLevelCommandIndex(t *testing.T) {
359359
for _, want := range []string{
360360
"Available Commands:",
361361
"agent Manage agents",
362-
"room Manage rooms",
363-
"user Manage users",
362+
"room Manage IM rooms",
363+
"user Manage IM users",
364364
} {
365365
if !strings.Contains(got, want) {
366366
t.Fatalf("usage = %q, want substring %q", got, want)
@@ -385,8 +385,8 @@ func TestRootHelpIncludesAvailableCommands(t *testing.T) {
385385
for _, want := range []string{
386386
"Available Commands:",
387387
"agent Manage agents",
388-
"room Manage rooms",
389-
"user Manage users",
388+
"room Manage IM rooms",
389+
"user Manage IM users",
390390
} {
391391
if !strings.Contains(got, want) {
392392
t.Fatalf("help = %q, want substring %q", got, want)
@@ -488,29 +488,23 @@ func TestAgentSubcommandHelpIncludesUsageAndFlags(t *testing.T) {
488488
}
489489
}
490490

491-
func TestExecuteStartRemainsServeAlias(t *testing.T) {
492-
called := false
491+
func TestExecuteStartIsRejected(t *testing.T) {
492+
var stderr bytes.Buffer
493493
app := &App{
494494
stdout: &bytes.Buffer{},
495-
stderr: &bytes.Buffer{},
495+
stderr: &stderr,
496496
httpClient: roundTripFunc(func(req *http.Request) (*http.Response, error) { return nil, nil }),
497-
serveFunc: func(_ context.Context, args []string, globals GlobalOptions) error {
498-
called = true
499-
if len(args) != 0 {
500-
t.Fatalf("args = %v, want empty", args)
501-
}
502-
if globals.Config != "/tmp/test.toml" {
503-
t.Fatalf("globals.Config = %q, want /tmp/test.toml", globals.Config)
504-
}
505-
return nil
506-
},
507497
}
508498

509-
if err := app.Execute(context.Background(), []string{"--config", "/tmp/test.toml", "start"}); err != nil {
510-
t.Fatalf("Execute() error = %v", err)
499+
err := app.Execute(context.Background(), []string{"--config", "/tmp/test.toml", "start"})
500+
if err == nil {
501+
t.Fatal("Execute() error = nil, want unknown command")
502+
}
503+
if !strings.Contains(err.Error(), `unknown command "start"`) {
504+
t.Fatalf("Execute() error = %v, want unknown command start", err)
511505
}
512-
if !called {
513-
t.Fatal("serveFunc was not called for start alias")
506+
if !strings.Contains(stderr.String(), " serve Start the local HTTP server") {
507+
t.Fatalf("stderr = %q, want serve command in usage", stderr.String())
514508
}
515509
}
516510

cli/room.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import (
1111

1212
func (a *App) runRoom(ctx context.Context, args []string, globals GlobalOptions) error {
1313
if len(args) == 0 {
14-
a.usageCommandGroup("room", "Manage rooms.", "csgclaw room <subcommand> [flags]", []string{
14+
a.usageCommandGroup("room", "Manage IM rooms.", "csgclaw room <subcommand> [flags]", []string{
1515
"list List rooms",
1616
"create Create a room",
1717
"delete <id> Delete a room",
1818
})
1919
return flag.ErrHelp
2020
}
2121
if isHelpArg(args[0]) {
22-
a.usageCommandGroup("room", "Manage rooms.", "csgclaw room <subcommand> [flags]", []string{
22+
a.usageCommandGroup("room", "Manage IM rooms.", "csgclaw room <subcommand> [flags]", []string{
2323
"list List rooms",
2424
"create Create a room",
2525
"delete <id> Delete a room",
@@ -35,7 +35,7 @@ func (a *App) runRoom(ctx context.Context, args []string, globals GlobalOptions)
3535
case "delete":
3636
return a.runRoomDelete(ctx, args[1:], globals)
3737
default:
38-
a.usageCommandGroup("room", "Manage rooms.", "csgclaw room <subcommand> [flags]", []string{
38+
a.usageCommandGroup("room", "Manage IM rooms.", "csgclaw room <subcommand> [flags]", []string{
3939
"list List rooms",
4040
"create Create a room",
4141
"delete <id> Delete a room",

cli/user.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import (
1010

1111
func (a *App) runUser(ctx context.Context, args []string, globals GlobalOptions) error {
1212
if len(args) == 0 {
13-
a.usageCommandGroup("user", "Manage users.", "csgclaw user <subcommand> [flags]", []string{
13+
a.usageCommandGroup("user", "Manage IM users.", "csgclaw user <subcommand> [flags]", []string{
1414
"list List users",
1515
"kick <id> Remove a user",
1616
})
1717
return flag.ErrHelp
1818
}
1919
if isHelpArg(args[0]) {
20-
a.usageCommandGroup("user", "Manage users.", "csgclaw user <subcommand> [flags]", []string{
20+
a.usageCommandGroup("user", "Manage IM users.", "csgclaw user <subcommand> [flags]", []string{
2121
"list List users",
2222
"kick <id> Remove a user",
2323
})
@@ -30,7 +30,7 @@ func (a *App) runUser(ctx context.Context, args []string, globals GlobalOptions)
3030
case "kick":
3131
return a.runUserKick(ctx, args[1:], globals)
3232
default:
33-
a.usageCommandGroup("user", "Manage users.", "csgclaw user <subcommand> [flags]", []string{
33+
a.usageCommandGroup("user", "Manage IM users.", "csgclaw user <subcommand> [flags]", []string{
3434
"list List users",
3535
"kick <id> Remove a user",
3636
})

docs/README.go.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
This repository now includes a minimal Go implementation for:
44

55
- `csgclaw onboard`
6-
- `csgclaw start`
6+
- `csgclaw serve`
77
- `POST /api/v1/workers`
88

99
Notes:

docs/architecture.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Both capabilities are exposed through a unified HTTP server and a single CLI bin
2727
┌──────────▼──────┐ ┌────────▼──────────┐
2828
│ Agent Manager │ │ IM System │
2929
│ │ │ │
30-
start / stop │ │ rooms / users │
30+
serve / stop │ │ rooms / users │
3131
│ status / logs │ │ messaging / push │
3232
└──────┬──────────┘ └────────┬───────────┘
3333
│ │
@@ -392,4 +392,4 @@ User A sends message (WebSocket)
392392
| Sandbox | Boxlite | Fixed choice; called directly, no abstraction layer needed |
393393
| Storage | Filesystem | Simple, zero dependencies, sufficient for project scale |
394394
| WebSocket | `gorilla/websocket` or stdlib | Managed in `hub.go`; one goroutine per connection |
395-
| Frontend | Framework of choice | Served as static assets by the HTTP server |
395+
| Frontend | Framework of choice | Served as static assets by the HTTP server |

docs/design/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
1. Server: 支持通过REST API创建一个Agent,一个Agent包括name, image等必要参数
66
2. CLI: 支持两个子命令
77
- csgclaw onboard: 初始化 ~/.csgclaw/config.toml(里面最基本可以配置llm model的base_url、api_key和model_id)
8-
- csgclaw start: 以daemon形式启动上述Server
8+
- csgclaw serve: 启动上述 Server(可通过 `-d` 以 daemon 形式运行)
99

1010
## Go SDK用法
1111

docs/design/progress.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
- [x] 明确首期目标是建设一个标准 Go 项目,同时覆盖 Server 与 CLI 两部分能力。
1414
- [x] 明确 Server 侧核心职责:通过 REST API 创建 Agent,并支持 `name``image` 等必要参数。
15-
- [x] 定义 CLI 主流程,包括 `onboard``start``create` 三个子命令,分别对应本地配置初始化、守护进程启动和 Agent 创建。
15+
- [x] 定义 CLI 主流程,包括 `onboard``serve``create` 三个子命令,分别对应本地配置初始化、服务启动和 Agent 创建。
1616
- [x] 初步确定配置方案,`~/.csgclaw/config.toml` 用于承载模型接入所需的 `base_url``api_key``model_id` 等基础参数。
1717
- [x] 完成 BoxLite Go SDK 与 Python SDK 的技术调研,并确认 vendored SDK、`go generate`、运行时创建 box、端口映射、数据卷挂载等关键集成点。
1818
- [x] 沉淀容器化运行 OpenClaw / Agent Gateway 的配置与启动样例,可作为后续 Server daemon 化和本地开发联调的实现参考。

docs/progress.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
当前项目已经具备一个最小闭环,但与 `docs/architecture.md` 的目标架构相比,仍然更接近“单二进制 + 内嵌服务对象 + 面向当前 IM/PicoClaw 场景的专用 API”:
1515

16-
- CLI 入口集中在 `cmd/csgclaw/main.go`当前只有 `onboard``start``_serve` 三类命令
16+
- CLI 入口集中在 `cmd/csgclaw/main.go`当前对外入口以 `onboard``serve``stop` 与资源型子命令为主,内部仍保留 `_serve` 作为守护进程子进程入口
1717
- HTTP 路由与 handler 已拆到 `internal/api/``internal/server/` 主要负责 server lifecycle、mux 装配与 UI 托管。
1818
- Agent 能力目前以 `worker` 为中心暴露,核心入口是 `GET/POST /api/v1/workers`
1919
- IM 能力目前以 `/api/v1/im/*` 命名空间和 SSE 为主,不是目标文档里的扁平 REST + WebSocket 结构。
@@ -34,7 +34,7 @@
3434
- `现状`[`cmd/csgclaw/main.go`](/Users/russellluo/Projects/work/opencsg/projects/csgclaw/cmd/csgclaw/main.go) 已切到 `cli.New().Execute(...)`[`cli/`](/Users/russellluo/Projects/work/opencsg/projects/csgclaw/cli) 中已经补齐 `agent create/delete/status``room list/create/delete``user list/kick``message` 命令树和 `agent logs` 仍未实现。
3535
- `影响`:CLI 和服务端生命周期耦合,后续很难平滑过渡到“远程可调用”的命令模型。
3636
- `推荐增量步骤`
37-
- [x] A01-1 新增 `serve` 命令,内部先复用当前 `start` 逻辑,保留 `start` 作为兼容别名
37+
- [x] A01-1 新增 `serve` 命令并承接服务启动入口;后续已移除 `start` 兼容别名
3838
- [x] A01-2 新增 `stop` 命令,先基于当前后台进程管理方式落地,哪怕暂时仍沿用现有状态目录。
3939
- [x] A01-3 引入 `cli/` 目录并抽出 root/serve/stop 的命令注册,`main.go` 只保留启动装配。
4040
- [x] A01-4 为后续资源型命令准备统一 HTTP client 和全局 flag 骨架。

0 commit comments

Comments
 (0)