Skip to content

cli README: documents -h / -v short flags that exit 2, and says there is no os plugin command group while os plugin build|sign|publish is registered #21310

Description

@objectstack-fleet

Filing-gate class: ① a defect with a named landing site and a measured reach (class a, a public door).
Body last written 2026-10-02T04:47Z: unblocked. #21285 closed completed when PR #21306 merged as dabd1c5be7. Blockers were re-derived with no new one, and the card was dispatched in the same act.
Routing: the maintainer direct-dispatch channel (session_018gA1pE6eJtwHhqx72G8U9X) routes it to domain:cli; triage grades the priority.

Measured (#21306's os-dev, from an empty cwd on the built entry, @oclif/core 5.1.2)

  • Short flags. packages/cli/README.md → ### Global documents -v, --version and -h, --help.
  • Plugin group. ### Plugin Management says "There is no os plugin command group in v1". But os plugin build|sign|publish is registered, and the plugin topic shows in os --help.

What to do (shapes, not a ruling)

  1. Make ### Global true. Either:
    • drop -h / -v from the README (docs follow the implementation); or
    • make them work with additionalHelpFlags: ["-h"] / additionalVersionFlags: ["-v"] in oclif. That is a small product change, so report the four-axis reasoning for whichever is chosen.
  2. Correct ### Plugin Management to the registered os plugin commands. Read them off os plugin --help, not off memory.
  3. Re-read the rest of the README's command tables against os --help while in the file, and give each mismatch a conclusion in the PR body.

Dedup: 450 objectstack issues and PRs listed over REST, titles and bodies grepped for additionalHelpFlags, additionalVersionFlags, command -h not found, os -h, os plugin build and "no os plugin command group". The only hits are #21306's own report and an unrelated lint PR. No card covers this.

Dedupe words: os -h command not found · README Global short flags · additionalHelpFlags · os plugin build sign publish README


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5
    Session: session_018gA1pE6eJtwHhqx72G8U9X
    Account: os-bill (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-21310-cli-readme-flags
    Worktree: objectstack-issue-21310
    Domain: domain:cli
    Seat: domain:devx#3 (the maintainer's direct-dispatch session; it holds no seat post, so #3 collides with no post: objectstack devx seats 1 and 2 are #6023 and #20163)
    Provenance:

  2. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 21310,
    "status": "done",
    "branch": "claude/issue-21310-cli-readme-flags",
    "pr": "#21354",
    "session": "session_018gA1pE6eJtwHhqx72G8U9X",
    "premise_still_valid": true,
    "summary": "packages/cli/README.md now states what the built os does, read off os --help, os plugin --help and each documented command's --help on bin/run.js from an empty cwd. ### Global lists --version and --help only, says there is no short form, and names the commands that own -v. ### Plugin Management lists the registered os plugin build|sign|publish group in place of the false "There is no os plugin command group in v1"; it notes the group has no install (ADR-0025 status line) and is unrelated to os plugins. Two command-table rows were false and are rewritten (os init [name], os dev [package]), and a patch changeset .changeset/21310-cli-readme-flags.md was added. packages/cli/package.json is untouched (README route), and no code, flag, exit code or help page changes. The newest Claim (comment 5945814810) names this branch. Before any edit the branch was fast-forwarded from 6091136 to 1caa603, which contains #21167 (landed as bcd68a2); BASE was recorded there. origin/main was merged twice more, with a5f7446 as the head at PR open.",
    "claim_verified": "Newest Claim: comment 5945814810 (objectstack-fleet[bot], session_018gA1pE6eJtwHhqx72G8U9X, Branch claude/issue-21310-cli-readme-flags). It matches; no second claim was posted, and the card assignee was not written.",
    "short_flag_choice": {
    "route": "README route for both -h and -v (docs follow the implementation); packages/cli/package.json oclif keys NOT added",
    "ruling_check": "Six commands already own -v. It is --verbose on os dev (dev.ts:212), os serve (serve.ts:1209), os start (start.ts:93) and os doctor (doctor.ts:1905). It is --version VALUE on os package publish (package/publish.ts:315) and os package install (package/install.ts:57). Found with git grep char: 'v' in packages/cli/src and read back in each --help. No command owns -h. Under the ruling ("If one does, choose the README route and say why"), -v takes the README route. -h was eligible on its own and was declined on the axes below.",
    "before_after": "Built entry, empty cwd. Before = 1caa603, after = a5f7446. os -h: exit 2 "command -h not found" before and after. os -v: exit 2 "command -v not found" before and after (unchanged by design). os --help: exit 0, 3712 bytes, md5 1855676fe5a2bb87aa5871fc1bed196f, byte-identical before and after. os --version: exit 0 before and after. os plugin --help: md5 f8d980cadbc9b10110a734b402e687e9, byte-identical.",
    "alternative_measured": "oclif 5.1.2 lib/main.js versionAddition/helpAddition were evaluated in memory on the loaded Config of packages/cli with additionalVersionFlags [-v] and additionalHelpFlags [-h]; no file was written. Results: argv [-v, serve] gives version=true, so it prints the version, exits 0 and serve never runs (today it exits 2). argv [serve, -v] stays verbose, because only argv[0] is checked. argv [serve, -h] gives help=true (today it exits 2 with Nonexistent flag: -h).",
    "four_axes": {
    "real_business_need": "Zero measured pull. git grep over the whole tree (content/docs, skills, examples, packages, scripts) for os -h, os -v and objectstack -h|-v finds no occurrence. The README ### Global was the only text that named the short forms.",
    "long_term": "-v already means verbose on four commands and a package version on two. A third meaning that applies only at argv[0] would make the flag position-dependent. Docs-follow-implementation removes the false claim with zero runtime change.",
    "ai_error_resistance": "Today a mistaken os -v serve fails loudly (exit 2). With the key it would exit 0 after printing a version and start nothing, turning a loud failure into a silent one. The README now states the absence, so an agent uses --help and --version, which work in every position.",
    "no_scope_expansion": "New flags are a capability with no measured pull, and the default is tight. A -h-only split would make ### Global asymmetric for no measured user."
    }
    },
    "os_plugin_commands_verbatim": "os plugin --help (exit 0): "Compile a plugin into a signed-ready .osplugin artifact (ADR-0025 §3.4) / USAGE $ os plugin COMMAND / COMMANDS: plugin build — Compile a plugin into a signed-ready .osplugin artifact (ADR-0025 §3.4); plugin publish — Publish a signed .osplugin to ObjectStack Cloud (ADR-0025 §3.4); plugin sign — Sign a built .osplugin with a publisher Ed25519 key (ADR-0025 §3.4)". Usage lines: os plugin build [DIR] [-e VALUE] [-o VALUE] [--minify]; os plugin sign ARTIFACT -k VALUE [--key-id VALUE] [-o VALUE]; os plugin publish [ARTIFACT] [-s VALUE] [-t VALUE] [--sig VALUE] ... There is no install.",
    "hypotheses": {
    "H1": "Holds. os -h and os -v exit 2 with command -h not found / command -v not found on the built entry from an empty cwd. @oclif/core 5.1.2 merges only additionalHelpFlags / additionalVersionFlags into --help / --version (help/util.js getHelpFlagAdditions, main.js versionAddition). packages/cli/package.json oclif sets neither.",
    "H2": "Holds. The plugin topic is listed in os --help, and os plugin --help lists plugin build, plugin publish and plugin sign (verbatim above).",
    "H3": "Holds. os plugins, os plugins install foo, os plugins link . and os help each exit 2 with command ... not found. package.json has no oclif.plugins, and the only @oclif dependency is @oclif/core. The sections were not re-edited."
    },
    "per_row_conclusions": [
    "Development · os init [name] · CHANGED: it said "in the current directory"; --help says a new directory is created when NAME is given",
    "Development · os dev [package] · CHANGED: it said "with hot reload"; --help says watch, rebuild and restart the server; dev.ts says the old auto-reload line "advertised a hot reload the runtime only partially performs"",
    "Development · os serve [config] · ALREADY TRUE: "plugin auto-detection" = serve.ts:11 imports isHostConfig/shouldBootWithLibrary (utils/plugin-detection.ts); the row omits the artifact fallback, which is an omission, not a false claim",
    "Build & Validate · os compile [config] · ALREADY TRUE (-o default dist/objectstack.json)",
    "Build & Validate · os validate [config] · ALREADY TRUE (the help also names CEL and widget bindings)",
    "Build & Validate · os info [config] · ALREADY TRUE (info.ts:117 prints agents)",
    "Scaffolding · os generate TYPE NAME · LEFT per the ruling (#21167, landed bcd68a2). Also already true: generate.ts refuses a metadata type without a name; NAME is optional only for types/client/migration",
    "Scaffolding · os create TYPE [name] · ALREADY TRUE",
    "Cloud · os cloud login · ALREADY TRUE (-e/--email and -p/--password skip the browser; ~/.objectstack/cloud.json)",
    "Cloud · os cloud whoami / logout · ALREADY TRUE",
    "Cloud · os environments create --org ID --name N · ALREADY TRUE (both flags required; no projects topic)",
    "Cloud · os environments list / show ID · ALREADY TRUE",
    "Cloud · os package publish [artifact] · ALREADY TRUE (default dist/objectstack.json)",
    "Plugin Management · prose · CHANGED",
    "Quality · os test [files], os doctor, os lint [config], os diff [before] [after] · ALREADY TRUE",
    "Reference · os explain [schema] · ALREADY TRUE",
    "CLI Options · ### Global · CHANGED",
    "CLI Options · os plugins and os help (not commands) · ALREADY TRUE since #21306, not re-edited",
    "Outside the tables (OUT OF SCOPE, not a command-table row): the Cloud lead sentence names --server/OS_CLOUD_API_KEY, while os environments uses -u/--url and -t/--token (env OS_TOKEN); the ### os serve --ui text says Studio UI where --help says Console portal; registered commands with no row are omissions"
    ],
    "pr_subscribed": "Subscribed to activity on #21354. Comments, CI status changes, reviews, and other PR events will now be delivered into this conversation as wake reason=external-event envelopes.",
    "tests": "All at head a5f7446 unless noted. (1) pnpm turbo run build --filter=!@objectstack/docs --concurrency=2: Tasks 72 successful, 72 total; VERDICT command-exit 0. (2) node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands: 51 commands (21 pnpm, 30 node); all 51 exit 0, captured before any pipe. --ran reconciliation: "51 derived, 51 run, 0 NOT-MEASURED, 0 UNRUN", a DERIVED zero with every entry carrying an exit code. Earlier, at pre-merge head 4e7e91f, check:dual-build-cjs-loads answered PREREQUISITE NOT MET (exit 3) with nine packages unbuilt; I built them and it passed, and at a5f7446 it exited 0 directly ("105 published require entry point(s) across 66 package(s) load"). PM's derivation gave 67 because the planned surface included packages/cli/package.json; the real diff is README.md plus the changeset. (3) pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2: Test Files 244 passed (244), Tests 3461 passed (3461), VERDICT command-exit 0, run at 4e7e91f. git diff 4e7e91f a5f7446 -- packages/cli is empty, so per AGENTS.md section 10 it was not re-run after the merges. The integration tier is left to CI. (4) pnpm --filter @objectstack/cli typecheck: exit 0 at 4e7e91f. No ablation applies, because no code or test changed. No pin test was added because the diff changes no behaviour; packages/cli/test/plugin-commands.test.ts is the precedent if the seat wants the no-short-flag state held.",
    "mcp_calls": "1 — mcp__claude-code-remote__subscribe_pr_activity (a session subscription, not a GitHub write). GitHub MCP calls: 0. No MCP write tool was used.",
    "api_writes": "3 relay writes as objectstack-fleet[bot], each one POST /repos/objectstack-ai/objectstack/dispatches (fleet-write): (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, giving #21354, draft, with 11202 bytes sent and stored identical; (2) assign via label-write.mjs, POST /repos//issues/21354/assignees [os-bill], read back as a MATCH; (3) this os-dev-report comment, POST /repos//issues/21310/comments via post-stamped.mjs. Zero label writes: the dispatch named none, and skip-changeset does not apply because a changeset is present. git pushes (not REST): the empty branch probe, the commit, and two merges of main.",
    "deviations": [
    "The first commit was written with the harness reminder's model-bearing Co-Authored-By trailer. It was amended before any push to the model-free pair AGENTS.md requires, so no pushed commit carries a model identifier.",
    "One build attempt was killed by my own outer timeout 595 after waiting 417s for the lock (exit 124). It was re-run to completion. The CLI unit run exceeded the 600s tool cap while queued (it waited 395s, held 375s); the harness moved it to the background, and I waited on it in the foreground with tail --pid until it exited, then read its VERDICT."
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted in PR Acceptance notes, not filed — the README Cloud section lead names --token/OS_CLOUD_API_KEY and --server/OS_CLOUD_URL for all cloud commands, but os environments * spell them -t/--token [env OS_TOKEN] and -u/--url [env OS_CLOUD_URL]. The CLI itself carries two spellings, which is a CLI-surface choice, not a README fact. Dedupe words: cloud auth flag spelling, --server vs --url, OS_TOKEN OS_CLOUD_API_KEY",
    "carrier: none · noted, not filed — the README ### os serve section says --ui means "Enable Studio UI" while --help says "Enable the bundled Console portal" (naming drift)"
    ]
    }

  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 21310,
    "patch_round": 1,
    "status": "done",
    "branch": "claude/issue-21310-cli-readme-flags",
    "pr": "#21354",
    "head": "9bdb092ca",
    "session": "session_018gA1pE6eJtwHhqx72G8U9X",
    "premise_still_valid": true,
    "summary": "REWORK comment 5946805321 is folded in; README facts only, with no flag or env var changed in code. (1) The Cloud section no longer says every cloud command reads os cloud login's session or --token/OS_CLOUD_API_KEY and --server/OS_CLOUD_URL. A new "Credentials and server URL" table gives, per command, the URL flag, the token flag and the stored session each one authenticates with. The typical flow now says its os environments create step does not read the os cloud login session, which was measured: with only cloud.json present, all five os environments subcommands exit 1 with "Authentication required. Please run os login or set OS_TOKEN". The "Set OS_CLOUD_URL (or --server)" sentence now names which commands read OS_CLOUD_URL and which flag each spells. (2) os serve --ui uses the --help wording ("Enable the bundled Console portal at /_console/ when @object-ui/console is installed (default: true)"). (3) The changeset counts five false claims, one bullet each. Commit ebe3797, then a merge of origin/main as 9bdb092; no rebase, no force. The PR's draft state and labels were not touched.",
    "cloud_flag_table": [
    "os cloud login · URL: -u, --url (env OS_CLOUD_URL, default https://cloud.objectos.ai) · token: none (-e/--email, -p/--password, or the device flow) · session: writes ~/.objectstack/cloud.json",
    "os cloud whoami / os cloud logout · URL: none · token: none (--json only) · session: read / delete cloud.json (cloud/whoami.ts:26, cloud/logout.ts:29,39)",
    "os package publish · URL: -s, --server (env OS_CLOUD_URL, default https://cloud.objectos.ai; with neither set, the URL in cloud.json) · token: -t, --token (env OS_CLOUD_API_KEY, then OS_TOKEN) · session: cloud.json. MEASURED with an echo server: credentials.json only gives exit 1 "Not logged in to ObjectStack Cloud. Run os cloud login first" and 0 requests; cloud.json only gives POST /api/v1/cloud/packages with Bearer cloud-token-probe to the cloud.json URL; OS_CLOUD_API_KEY gives Bearer env-api-key; OS_TOKEN gives Bearer env-os-token",
    "os plugin publish · URL: -s, --server (env OS_CLOUD_URL) · token: -t, --token (env OS_CLOUD_API_KEY) · session: cloud.json by the same precedence code (plugin/publish.ts:170-178) — code-read only, not run (it needs a built .osplugin)",
    "os environments list/show/create/bind/switch · URL: -u, --url (env OS_CLOUD_URL), else the URL in credentials.json, else http://localhost:3000 (api-client.ts:56-85) · token: -t, --token (env OS_TOKEN) · session: ~/.objectstack/credentials.json, the os login session. MEASURED: cloud.json only gives exit 1 "Authentication required" for all five before any request; credentials.json only makes list send GET /api/v1/cloud/environments with Bearer runtime-token-probe to the credentials.json URL; OS_TOKEN+OS_CLOUD_URL gives Bearer env-os-token; OS_CLOUD_API_KEY alone gives exit 1 "Authentication required"",
    "os package install (a runtime command, not cloud) · URL: -r, --runtime (env OS_RUNTIME_URL, default http://localhost:3000) · token: none; --email/--password (env OS_RUNTIME_EMAIL/OS_RUNTIME_PASSWORD) · session: none",
    "Not in the README Cloud section, read for completeness: os whoami, os data *, os meta list/get/register/delete · -u, --url (env OS_CLOUD_URL) · -t, --token (env OS_TOKEN) · credentials.json via createApiClient (code-read)",
    "os datasource introspect/list-tables/validate · -u, --url (env OS_CLOUD_URL, else http://localhost:3000) · -t, --token (env OS_TOKEN) · no stored session; flags and env only (datasource/introspect.ts:10-13, code-read)",
    "os login · -u, --url (env OS_RUNTIME_URL, default http://localhost:3000) · writes credentials.json; os register · -u, --url (env OS_CLOUD_URL, default http://localhost:3000) · writes credentials.json"
    ],
    "readme_changes_this_round": [
    "Cloud lead sentence: replaced with a pointer to #### Credentials and server URL",
    "Typical flow: the os cloud login and os environments create lines are annotated, plus a paragraph saying environments create needs --url/--token (OS_CLOUD_URL/OS_TOKEN) or an os login session, and otherwise exits 1 with Authentication required",
    "Publish paragraph: "Set OS_CLOUD_URL (or --server)" now says os cloud login, os package publish and os environments read OS_CLOUD_URL, with --server on publish and --url on the other two",
    "New #### Credentials and server URL table (4 rows) plus an os package install note",
    "### os serve --ui: the help wording"
    ],
    "runtime_unchanged": "os --help at 9bdb092: exit 0, 3712 bytes, md5 1855676fe5a2bb87aa5871fc1bed196f, byte-identical (cmp) to the 1caa603 capture. os -h / os -v still exit 2. os serve --help still reads "Enable the bundled Console portal at /_console/ when @object-ui/console is installed (default: true)".",
    "tests": "At 9bdb092: (1) pnpm turbo run build --filter=!@objectstack/docs --concurrency=2: 72/72 tasks (0 cached after the main merge), verify-lock VERDICT command-exit 0. (2) Gates: dispatch-gates --commands derives 52 commands at 9bdb092; the merged main added node scripts/check-dts-emitted.mjs --self-test. All 52 exit 0, captured before any pipe. The same gates were also all green at the intermediate head ebe3797 (51 of 51). (3) The CLI unit tier is not re-run this round: it last ran at 4e7e91f (244 files / 3461 tests passed). git diff 4e7e91f 9bdb092 -- packages/cli touches only packages/cli/README.md, and no CLI test reads that file; tests mentioning README read the os create emitted README. The integration tier is left to CI.",
    "gate_reconciliation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran (52 lines "COMMAND :: exit N") at 9bdb092: "Run reconciliation — 52 derived, 52 run, 0 NOT-MEASURED, 0 UNRUN"; "✓ ... a DERIVED zero — all 52 recorded an exit code and none of them is 3". The same run flagged STALE TREE: origin/main moved 2 commits during the gate run (96b12b5 adds a pm-roster self-test step to .github/workflows/lint.yml for scripts/pm/issue-transfer; 23365ea is spec). Neither touches packages/cli or this changeset, and I did not chase a third merge; the queue rebuilds on current main.",
    "pr_body": "NOT PATCHED by this dev — CONFLICT NOTED: the coordinator asked for a body refresh, but the standing os-dev rule says the dev writes the PR body once at pr_create, never PATCHes it, and the seat writes later edits. Per that rule's precedence the rule was followed. The refreshed body matching 9bdb092 is ready (pre-scanned: no angle-bracket fragments, no closing keyword other than line 1, no model id), and its relay action passed a dispatch --dry-run validation. Seat command: node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file /tmp/claude-0/-home-user/66328d89-6fb8-50a7-a74b-97fb5ec277ec/scratchpad/issue-21310/actions-pr-body-r1.json (op issue_patch on #21354; the body file is pr-body-r1.md in the same directory, 15822 bytes). The current PR body still describes head a5f7446 and lacks the cloud-table and --ui sections.",
    "mcp_calls": "0 this round (GitHub MCP 0; no MCP write tool). Round 0: 1 (mcp__claude-code-remote__subscribe_pr_activity).",
    "api_writes": "1 this round: the round report comment, POST /repos//issues/21310/comments via post-stamped.mjs through the fleet-write relay (one POST /repos/objectstack-ai/objectstack/dispatches). Zero label, draft, assignee or body writes. git pushes (not REST): ebe3797 and the merge 9bdb092.",
    "deviations": [
    "The PR body was not refreshed by me; see pr_body. The conflict is between the coordinator message and the os-dev standing rule.",
    "Merge chase stopped after one merge: main moved by 2 commits during the gate run. They are named above and are disjoint from this diff."
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: public door, measured. With only os cloud login done (HOME holding only ~/.objectstack/cloud.json), os environments create --org org_x --name Dev (and list/show/bind/switch) exits 1 with "Authentication required. Please run os login or set OS_TOKEN environment variable." before any request. Yet os login --help says "For the hosted package registry, use os cloud login instead". The two help texts send a user of the README/cli.mdx Cloud flow in a circle, and the environments commands never read the cloud session that cloud.json holds. Evidence: packages/cli/src/utils/api-client.ts:56-85 (createApiClient reads only credentials.json) and environments/create.ts:15-30 (writes the active env into cloud.json when the control plane matches, so it is designed to run against the cloud control plane). The remedy direction (environments fall back to cloud.json like publish does, or os login is the documented route for the hosted control plane) is a product decision; this PR only documents the current behaviour. Dedupe words: os environments cloud login session · Authentication required os login · credentials.json cloud.json environments",
    "carrier: none · noted, not filed — os package publish against a server that answers {success:true} with no package id POSTs to /api/v1/cloud/packages/undefined/versions and exits 0 (seen against my echo server, which is not the real control-plane contract; a read-only inference, so not filed)"
    ]
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:cli

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions