Skip to content

Commit f6e37e9

Browse files
claude[bot]claude
andauthored
docs(deployment/cli): complete two under-documented enumerations and state the manifest-id fallback's condition (#17722)
`content/docs/deployment/cli.mdx` was short in three places, all derived from the sources rather than hand-added: 1. The scaffolded-scripts sentence said "these" (three author-time commands) and then named two scripts. Every scaffolder in the tree declares all three: the `os init` templates `app`, `plugin` and `empty`, and the `create-objectstack` blank template. 2. `os lint` documented 4 of the 11 flags it declares. The section now enumerates all 11 plus its positional, including `--include-platform`, which the command's own hidden-i18n hint tells the reader to re-run with, and `--eval`/`--generator`, whose precondition is now stated. 3. The `--manifest-id` row presented `local.` + a slug as an unconditional default. It is not one: a derived id is held to `PackageSchema.manifestId` exactly as an explicit one is, and a manifest name that slugifies to a digit-first segment is refused before any network call. That is a missing CONDITION, not a missing list member, so it is stated as one. Docs-only; no published package changes. Claude-Session: https://claude.ai/code/session_01TSf4DV7ziu4V5j73e46b7c Co-authored-by: Claude <noreply@anthropic.com>
1 parent 6644014 commit f6e37e9

1 file changed

Lines changed: 46 additions & 3 deletions

File tree

‎content/docs/deployment/cli.mdx‎

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,10 @@ stopping at the first, so one pass shows the whole hole.
570570
`os validate`, `os build` and `os lint` share one rule registry, so a config that
571571
passes any of them will not fail another on schema/predicate/binding grounds — a
572572
CLI test fails the build if a rule that can gate runs on fewer than all three
573-
(#4409). In a scaffolded project these are wired as `npm run validate` and
574-
`npm run build`; your `AGENTS.md` tells coding agents to run `npm run validate`
573+
(#4409). In a scaffolded project all three are wired as `npm run validate`,
574+
`npm run build` and `npm run lint` — the three `os init` templates (`app`,
575+
`plugin`, `empty`) and the `create-objectstack` blank template each declare all
576+
three scripts; your `AGENTS.md` tells coding agents to run `npm run validate`
575577
after editing metadata. See
576578
[Validating metadata](/docs/deployment/validating-metadata).
577579
</Callout>
@@ -1400,8 +1402,35 @@ os lint --score # Append a 0-100 metadata quality score (letter-graded)
14001402
os lint --fix # Show what would be fixed (dry-run)
14011403
os lint --strict # Warnings fail the run too (exit 1); suggestions stay advisory
14021404
os lint --json # JSON output for CI
1405+
os lint --skip-i18n # Skip the translation coverage checks entirely
1406+
os lint --include-platform # Audit the platform built-in i18n keys too
1407+
os lint --eval --eval-min 80 # Score the bundled generation corpus instead
14031408
```
14041409

1410+
**Options.** Every flag the command declares, and its one positional:
1411+
1412+
| Flag | What it does |
1413+
|---|---|
1414+
| `config` (positional) | Configuration file path. Omitted, the config is auto-detected — see [Config File Auto-Detection](#config-file-auto-detection) |
1415+
| `--json` | Output as JSON, for CI. The verdict fields are described below |
1416+
| `--fix` | Show what would be fixed (dry-run). It prints the suggested fix; it never writes your sources |
1417+
| `--strict` | Fail the run (exit 1) on warning-severity findings too, exactly as an error does; suggestions stay advisory. Without it only errors fail |
1418+
| `--score` | Print a 0-100 metadata-quality score (the lint rubric) for this project |
1419+
| `--skip-i18n` | Skip translation coverage checks |
1420+
| `--include-platform` | Also report i18n coverage for the platform built-in metadata forms — hidden by default because the platform packages ship those translations. This is the flag the `N i18n issue(s) hidden — rerun with --include-platform` hint names |
1421+
| `--i18n-strict` | Treat missing translations in non-default locales as errors |
1422+
| `--default-locale <code>` | Default locale for i18n coverage (the one that must be 100% translated). Defaults to the config's `i18n.defaultLocale`, else `en` |
1423+
| `--eval` | Run the metadata-generation eval over the bundled golden corpus and report scores — a different run, see below |
1424+
| `--eval-min <n>` | Minimum passing score per eval case (default `75`) |
1425+
| `--generator <path>` | Path to a module that default-exports `(prompt, id) => stack`; enables live eval, scoring generated output instead of fixtures. Requires `--eval` |
1426+
1427+
**`--eval` is a different run, not an extra check.** It short-circuits the
1428+
project lint entirely and scores the bundled generation corpus, so it does not
1429+
combine with the style flags above. `--generator` applies only inside it:
1430+
passed without `--eval` the run exits **1** and says so on both faces, rather
1431+
than accepting a flag nothing outside eval mode reads (which is what it did
1432+
before #15550 — including for a generator path that did not exist).
1433+
14051434
It does not replace `os validate`: `os lint` never parses the stack against the
14061435
Zod schema (a schema error is `os validate`'s verdict to give), and it emits no
14071436
artifact. What it does guarantee is the direction that matters for a pre-flight
@@ -1750,7 +1779,7 @@ token at all the command exits `1` and tells you to run `os cloud login`.
17501779
| `artifact` (positional) | — | Path to the compiled artifact (default `dist/objectstack.json`) |
17511780
| `-s, --server <url>` | `OS_CLOUD_URL` | Control-plane URL. Default `https://cloud.objectos.ai`, or the URL recorded by `os cloud login` |
17521781
| `-t, --token <key>` | `OS_CLOUD_API_KEY` | Bearer token; `$OS_TOKEN` and `~/.objectstack/cloud.json` are the fallbacks |
1753-
| `--manifest-id <id>` | `OS_PACKAGE_MANIFEST_ID` | Reverse-domain package id. Default: `artifact.manifest.id`, else `local.` + a slug of the artifact name |
1782+
| `--manifest-id <id>` | `OS_PACKAGE_MANIFEST_ID` | Reverse-domain package id. Default: `artifact.manifest.id`, else `local.` + a slug of `manifest.name`, else `local.` + a slug of the artifact filename. A derived default is **not guaranteed usable** — see below |
17541783
| `-v, --version <semver>` | — | Version to publish. Default: `artifact.manifest.version`, else `0.0.0-dev.` + a timestamp |
17551784
| `--display-name <name>` | — | Name shown in the Marketplace (default `artifact.manifest.name`) |
17561785
| `--description <text>` | — | Short package description |
@@ -1772,6 +1801,20 @@ token at all the command exits `1` and tells you to run `os cloud login`.
17721801
| `-n, --note <markdown>` | — | Release notes |
17731802
| `--timeout <ms>` | `OS_CLOUD_TIMEOUT_MS` | HTTP timeout in milliseconds, default `120000`. `0` disables it |
17741803

1804+
**The derived `local.` id is a candidate, not a guaranteed default.** A derived
1805+
id is held to exactly the rule an explicit one is — `PackageSchema.manifestId`,
1806+
the schema for the very column publish writes — and slugifying has no
1807+
letter-first rule, so a manifest named `2024 App` derives `local.2024-app`,
1808+
which that schema rejects. `os package publish` then **refuses before any
1809+
network call**, quoting the schema and naming which of the three sources above
1810+
the id came from, rather than normalising it into a different permanent
1811+
identifier or forwarding one the control plane would reject: `manifest_id` is
1812+
immutable once published, so an id nobody wrote cannot be renamed afterwards.
1813+
The remedy is the one the refusal prints for that source — pass
1814+
`--manifest-id`, set `manifestId` in `objectstack.manifest.json`, or declare
1815+
`manifest.id` in `objectstack.config.ts` and rebuild. A declared
1816+
`manifest.id` is used or refused, never silently replaced by a derived one.
1817+
17751818
**`objectstack.manifest.json` supplies the listing fields.** When that file is
17761819
present in the working directory, publish reads `manifestId`, `displayName`,
17771820
`description`, `category`, `tagline`, `iconUrl`, `homepageUrl`, `license`,

0 commit comments

Comments
 (0)