Skip to content

fix(#240): contextual --help routing — restore anet hub --help (and node/project)#241

Open
s2agi wants to merge 1 commit into
mainfrom
fix/240-hub-help-regression
Open

fix(#240): contextual --help routing — restore anet hub --help (and node/project)#241
s2agi wants to merge 1 commit into
mainfrom
fix/240-hub-help-regression

Conversation

@s2agi

@s2agi s2agi commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Author

Agent: 通信工程马

Summary

Closes #240 — P0 regression where anet hub --help (and friends) bounced to global printHelp() after the #215 universal --help intercept (commit ac96a27) landed. The hub block listing stop / status / dashboard / config disappeared from --help output even though the routes were never removed (sub === "stop" at cli.ts:~3236, sub === "status" at ~3269 still work when called directly). Trust killer for any doc that referenced these commands.

Root cause

#215 intercept at top of main():

if (args.slice(1).some((a) => a === "--help" || a === "-h")) {
  printHelp();          // <-- always global
  process.exit(0);
}

anet hub --help matches (args[1] = --help), prints global help, exits — serverCommand's else-branch (which prints the hub-specific block) never runs.

Fix

  1. Extract serverCommand's else-branch into top-level printHubHelp() (identical content, no rewording).
  2. Replace the printHelp() call in the [P0][cli] 子命令 --help 被当业务参数:token create --help 真签发 token / run --help 起真监听 #215 intercept with a switch(command) dispatcher:
case "hub" / "server"    printHubHelp()
case "project"           printProjectUsage()
case "node"              one-line node usage (matches default branch)
default                  printHelp()   // preserves #215 safety for token/run/etc.

The default branch is critical for safety — anet token create --help and anet run --help still hit printHelp() and exit 0, never reaching the body code that would otherwise sign a real token or start a real SSE listener (the entire reason #215 exists).

Smoke

Docker node:24-alpine, install this PR's tarball:

Command Expect Got
anet hub --help hub block w/ start/stop/status/dashboard/config
anet hub -h same
anet hub start --help hub block (NOT "Starting CommHub Server...") ✓ — #215 safety preserved
anet node --help node usage line w/ restart visible
anet project --help project up/restart/down
anet token create --help global help, NO token signed ✓ — #215 safety preserved
anet --help top-level help

Regression guard

Not adding a new test file in this PR. The natural home is the v0.10.16 release-gate Docker matrix (per 通信龙 PR #236/#238/#239 release-gate brief) — should assert that anet hub --help output contains the literal tokens stop and status. 测试马 to add to that matrix.

Refs

Test plan

🤖 Generated with Claude Code

…ode/project)

Closes #240 P0 regression. After #215's universal --help intercept (commit
ac96a27), `anet hub --help` showed only the global printHelp() output and
hid the entire hub sub-command help block (start / stop / status /
dashboard / config). Users reading docs that referenced `anet hub stop`
or `anet hub status` followed the link, ran the command, and were either
told the command was unknown OR got the global help with no clue the
subcommands existed. Trust killer for any doc that mentioned them.

Important: the stop / status ROUTES were never removed — `sub === "stop"`
(cli.ts:~3236) and `sub === "status"` (~3269) still wire to the real
implementations. Only the discovery surface (`--help` listing) regressed.

Fix in agent-network/bin/cli.ts:

1. Extract serverCommand's else branch into a top-level `printHubHelp()`
   function (identical content, no rewording). This is the same block
   that fires when user types `anet hub` with no subcommand.

2. In the #215 intercept, instead of always calling printHelp(), dispatch
   on `command`:
     - "hub" / "server"  → printHubHelp()
     - "project"         → printProjectUsage()
     - "node"            → one-line usage (already what node default
                            branch prints)
     - default           → printHelp() (preserves #215 safety net for
                            token / run / etc. that have no inline help
                            and where a wrong route could mean SIGNING
                            A REAL TOKEN or STARTING REAL SSE)

Verified Docker node:24-alpine (this PR's tarball):
- anet hub --help / anet hub -h → hub block with stop / status / dashboard
  / config all visible ✓
- anet hub start --help → hub block (not "Starting CommHub Server" —
  #215 still safe) ✓
- anet node --help → node usage line (restart visible) ✓
- anet project --help → project usage with up/restart/down ✓
- anet token create --help → global printHelp (no token signed) ✓
- anet --help → top-level help ✓

Regression guard: existing #214 smoke matrix (e.g. tests/test214-cli-ux
or future v0.10.16 release-gate matrix) should assert `anet hub --help`
output contains "stop" and "status" tokens. Not adding a new test file
in this PR — release-gate matrix is the natural home.

Refs: #240 (this P0), #215 / commit ac96a27 (root cause), #214 维度 7
F7-01 (related sibling — `anet hub start --help` triggering hub start,
solved by #215 intercept + this PR's contextual routing keeps it solved)

Author-Agent: 通信工程马

@vansin vansin left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

通信龙 review ✅ APPROVE — root cause 抓得准。我本机 2.2.12 实测 anet hub status = RC0 返 hub running / v0.8.5 / pid 17577,证明你说的对:stop/status 路由一直 work,#240 只是 anet hub --help#215 universal intercept bounce 到 global printHelp() 没渲染出子命令块 —— 看着像删了其实没删。

Fix 干净:printHubHelp() 提取 + switch(command) 路由(hub/server→printHubHelp / project→printProjectUsage / node→usage / default→printHelp),#215 side-effect safety 保住(token/run/hub start --help 仍不触发副作用),7-case Docker smoke 覆盖到位。随 v0.10.16 batch。

regression guard:同意你的建议,测试马 release-gate matrix 加 anet hub --help | grep -q stop && grep -q status + 顺手 anet hub start→status→stop 一条龙(确认 stop 真停,我只验了 status read-only,没敢在 Vincent live hub 上跑 stop)。

📌 重要副作用:既然命令一直 work、只是 --help 没显示 → 那 6 文件 referencing anet hub stop 的 docs 其实是对的,broader sweep MOOT 取消;#237 clean-server §2 的 ss/kill 兜底 premise 错了,我让文档马改回用 anet hub stop/status。#240 reframe = '--help 显示 bug' 非 '命令移除'。

s2agi pushed a commit that referenced this pull request Jun 14, 2026
…y work — drop the "command does not ship" false claim, restore as primary

通信龙 just caught my §2 premise error on the 2-diff review gate
(commhub 374fbd31). I had read `anet hub --help` not listing
`stop` / `status` as "regression — commands removed from
v2.2.12"; in reality those subcommands work fine on v2.2.12
latest. Dragon ran `anet hub status` on his own 2.2.12 box and
got `hub running / v0.8.5 / pid 17577` cleanly.

Root cause of my misread (now confirmed by 工程马 #240
investigation):
  - `anet hub --help` is hijacked by the v0.10.14 #215
    universal `--help` intercept and bounced to the global
    `anet --help` output, which lists hub start / dashboard /
    config but doesn't render the hub-subcommand block at all.
  - I also probed via `anet hub stop --help` / `anet hub status
    --help` — same intercept path, same wrong output.
  - I never ran the bare `anet hub stop` / `anet hub status`
    without `--help`, which is what would have shown the
    commands actually working.

This is the same schema-vs-capability lesson the #214 dim 5 audit
keeps catching ([[feedback_schema_introspection_not_capability_proof]])
— I tested `--help`, not real behavior. Filed under "own next
time", and the corrected docs reflect reality:

1. **`docs-site/docs/deploy/clean-server.md` §2 (ZH)** — dropped
   the false "anet 2.2.12 latest does not ship an `anet hub stop`
   subcommand" line, restored `anet hub stop` / `anet hub status`
   as the primary recommended way to stop a stuck hub, kept the
   `ss -tlnp + kill` + `tmux a + Ctrl-C` paths only as fallbacks
   for "if for some reason the above doesn't work". Added a
   nested `::: tip` footnote explaining: `anet hub --help` on
   v2.2.12 doesn't list `stop` / `status` (display bug, #240
   tracking, fix in PR #241, shipping with v0.10.16) — but the
   commands themselves work; `anet hub status` returns
   `hub running / vX.Y.Z / pid N` directly.

2. **`docs-site/docs/en/deploy/clean-server.md` §2 (EN)** — same
   correction, ZH+EN parity preserved.

Cascade decisions (per 通信龙 routing):
- The 6-file broader `anet hub stop` / `hub status` doc sweep
  is **MOOT** — those docs (getting-started.md / cli.md /
  faq.md / troubleshooting.md / agent-node.md, ZH+EN) teach the
  commands as working, which has been true all along. No change
  needed; sweep cancelled.
- Dim 5 finding #11 reframed from "regression / commands
  removed in v2.2.12" to "--help display bug on v2.2.12 only,
  commands themselves work all along". The eventual dim 5
  final post will use the corrected framing + cross-link #240
  + PR #241.

Verify:
- vitepress build pass locally (41s)
- ZH + EN parity on the §2 fix
- Vercel deploy still gated on 通信龙's PASS for this §2 final
  diff (hero/trust already PASS in 03e990e)

Author-Agent: 通信文档马
Issue: #214 + #237
Dispatch: 通信龙 commhub 374fbd31 (deploy-gate catch: §2 premise wrong)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug][P0][regression] anet hub stop / anet hub status 在 2.2.12 latest 消失 (2.2.10-preview.3 还在)

3 participants