You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit f6e37e9
Browse filesBrowse the repository at this point in the historyBrowse files
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>
@@ -1400,8 +1402,35 @@ os lint --score # Append a 0-100 metadata quality score (letter-graded)
1400
1402
os lint --fix # Show what would be fixed (dry-run)
1401
1403
os lint --strict # Warnings fail the run too (exit 1); suggestions stay advisory
1402
1404
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
1403
1408
```
1404
1409
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 |
|`--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
+
1405
1434
It does not replace `os validate`: `os lint` never parses the stack against the
1406
1435
Zod schema (a schema error is `os validate`'s verdict to give), and it emits no
1407
1436
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`.
1750
1779
|`artifact` (positional) | — | Path to the compiled artifact (default `dist/objectstack.json`) |
1751
1780
|`-s, --server <url>`|`OS_CLOUD_URL`| Control-plane URL. Default `https://cloud.objectos.ai`, or the URL recorded by `os cloud login`|
1752
1781
|`-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|
1754
1783
|`-v, --version <semver>`| — | Version to publish. Default: `artifact.manifest.version`, else `0.0.0-dev.` + a timestamp |
1755
1784
|`--display-name <name>`| — | Name shown in the Marketplace (default `artifact.manifest.name`) |
1756
1785
|`--description <text>`| — | Short package description |
@@ -1772,6 +1801,20 @@ token at all the command exits `1` and tells you to run `os cloud login`.
1772
1801
|`-n, --note <markdown>`| — | Release notes |
1773
1802
|`--timeout <ms>`|`OS_CLOUD_TIMEOUT_MS`| HTTP timeout in milliseconds, default `120000`. `0` disables it |
1774
1803
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
+
1775
1818
**`objectstack.manifest.json` supplies the listing fields.** When that file is
1776
1819
present in the working directory, publish reads `manifestId`, `displayName`,
0 commit comments