Skip to content

Commit cfe05ec

Browse files
committed
Merge origin/main into claude/issue-20586-forced-local-refuses-sync-url
Claude-Session: https://claude.ai/code/session_01DEvba2nBuD4tWzfq8r8NFY Co-authored-by: Claude <noreply@anthropic.com>
2 parents 7ee1acb + 6bff748 commit cfe05ec

94 files changed

Lines changed: 360 additions & 350 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@objectstack/cli': patch
3+
---
4+
5+
Provenance comments in `@objectstack/cli` were re-anchored
6+
7+
Comment and docblock lines under `src/` that cited tracker numbers which no
8+
longer resolve on GitHub now cite the commit in this repository's history that
9+
decided the matter, and say in their own words what was decided. Two strings
10+
move with them: the `os i18n extract --source-hashes` help text now says what
11+
the provenance companion records instead of citing a number, and the header
12+
that flag writes into each `<locale>.source-hashes.generated.ts` cites the
13+
commit that introduced the companion. No command, flag, exit code, error code,
14+
type, export or runtime behaviour changes.

‎packages/cli/src/commands/cloud/login.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* ## `--json` here is NDJSON — a declared exception, same as `os login` (#6730)
1313
*
1414
* Everywhere else in this CLI `--json` means "stdout is exactly one JSON
15-
* document" (#6217). Both device-flow login commands are declared exceptions to
15+
* document" (commit 2b641ddd4). Both device-flow login commands are declared exceptions to
1616
* that, and they are the SAME exception: one compact JSON document per line.
1717
*
1818
* ### What was broken

‎packages/cli/src/commands/compile.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export default class Compile extends Command {
228228
// one. See `printAuthoringAdvisories` for the measurement.
229229
printAuthoringAdvisories(ruleAdvisories);
230230
};
231-
// [#12125] The ADR-0087 D2 conversion notices, hoisted for the SAME reason
231+
// [commit 79cf692b0] The ADR-0087 D2 conversion notices, hoisted for the SAME reason
232232
// and under the SAME ruling as the four lists above — one field over. The
233233
// notices were computed at step 2 (below) and reached the terminal SUCCESS
234234
// payload alone, so all nine failure exits dropped a list already in hand.

‎packages/cli/src/commands/create.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* ObjectStack is a developer tool, so a documented developer-facing command has
3939
* to work for the developer who follows the docs. This command is documented on
4040
* four public doc pages (`deployment/cli`, `plugins/index`, the two
41-
* `protocol/kernel` pages) and, until #14824, every one of those readers got a
41+
* `protocol/kernel` pages) and, until commit cf6b67164, every one of those readers got a
4242
* project that CANNOT INSTALL:
4343
*
4444
* - the emitted `package.json` declared `@objectstack/spec` and
@@ -81,7 +81,7 @@
8181
*
8282
* ## The emitted package NAME follows the placement too (#15530)
8383
*
84-
* The audience decides the name, and #14824 moved the audience without moving
84+
* The audience decides the name, and commit cf6b67164 moved the audience without moving
8585
* the name: the standalone default kept stamping `@objectstack/plugin-<name>`
8686
* — a scope the developer it now scaffolds for cannot publish to — onto every
8787
* project, with the emitted README telling them to install it from there. The
@@ -321,9 +321,9 @@ function pluginDirName(name: string): string {
321321
* ## Why the standalone name is unscoped
322322
*
323323
* `@objectstack` is a scope the developer this command scaffolds FOR cannot
324-
* publish to. Until #14824 that was arguably fine, because the default output
324+
* publish to. Until commit cf6b67164 that was arguably fine, because the default output
325325
* landed inside this monorepo, where every sibling really does carry the scope.
326-
* That ruling pointed the default at the developer's own directory and the name
326+
* That commit pointed the default at the developer's own directory and the name
327327
* did not move with the audience — so the standalone emission stamped a scope
328328
* its owner does not own onto every project generated from it. ⚠️ Nothing in
329329
* this repository can see that: the name is never resolved from a registry

‎packages/cli/src/commands/database-driver-allowlist.pin.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@
3636
* `start.ts` and once in `dev.ts`, and that duplication is exactly how the two
3737
* can drift apart from each other as well as from the resolver.
3838
*
39-
* SCOPE (#6860 vs #6345): this pins the CANONICAL kinds — the `driverId` values
39+
* SCOPE (#6860 vs commit e2798fab7): this pins the CANONICAL kinds — the `driverId` values
4040
* the resolver produces. The resolver also accepts aliases (`pg`, `mysql2`,
4141
* `libsql`, `mingo`, `wasm`, …) which the flag deliberately does not offer;
42-
* converging that vocabulary is #6345's job, and this pin is written so it does
42+
* converging that vocabulary was commit e2798fab7's job, and this pin is written so it does
4343
* not prejudge it — an alias collapses to its canonical id and is not demanded
4444
* of the flag.
4545
*/
@@ -101,7 +101,7 @@ function candidateTokens(): string[] {
101101
* is supplied so it resolves normally; the catch is kept so the derivation
102102
* survives another kind growing the same "recognized but unusable" shape.
103103
*
104-
* `err.recognized` is what keeps that catch honest (#6345). The resolver now
104+
* `err.recognized` is what keeps that catch honest (commit e2798fab7). The resolver now
105105
* ALSO throws `UnsupportedDriverError` for a spelling nothing claims — the CLI
106106
* half of "both hosts refuse the same input", which replaced a silent fall-through
107107
* to the dev SQLite default. Reading `driverType` off that error would report the

‎packages/cli/src/commands/database-driver-flag-derivation.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* Deriving the flag from the CONFIG-CONTRACT face (`DRIVER_ID_ALIASES` /
2525
* `resolveDriverId`) instead of the SELECTION face would offer `sqlite3`,
2626
* `better-sqlite3`, `mariadb` and `inmemory` — spellings neither boot host has
27-
* ever accepted as a selection (#6345 fixes the selection face as the union of
27+
* ever accepted as a selection (commit e2798fab7 fixes the selection face as the union of
2828
* what the two hosts accepted the day the ruling was written). The last case here
2929
* drives oclif's real parser to prove they are still refused at parse time.
3030
*/

‎packages/cli/src/commands/doctor-organizations-message-spelling.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
*
77
* ── What this closes ─────────────────────────────────────────────────────
88
*
9-
* PR #12463 (#12151) single-sourced every operator-facing occurrence in
9+
* Commit 27b690272 (PR #12463) single-sourced every operator-facing occurrence in
1010
* `serve.ts` onto `Serve.ORGANIZATIONS_RUNTIME_PKG` and pinned what those
11-
* messages render. `doctor.ts` sat outside that card's file surface and kept
11+
* messages render. `doctor.ts` sat outside that commit's file surface and kept
1212
* its own bare `@objectstack/organizations` literal inside
1313
* `TENANCY_POSTURE_FIX_HINTS`, under no check of any kind — so a roster-key
1414
* rename left `os doctor` printing a package name that boot no longer

‎packages/cli/src/commands/environments/environments.test.ts‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ describe('os environments commands', () => {
7777
});
7878

7979
/**
80-
* Pin (#10967): every `examples` entry on EVERY CLI command source names a
80+
* Pin (commit e4a71d418): every `examples` entry on EVERY CLI command source names a
8181
* command id THIS CLI ACTUALLY REGISTERS.
8282
*
8383
* ## The failure this exists to refuse
@@ -94,7 +94,7 @@ describe('os environments commands', () => {
9494
* exactly as before while any `examples` string spelling the OLD topic
9595
* silently stops being true — not a parse error, not a type error, nothing
9696
* a build catches. A user who copy-pastes the stale line hits `Error:
97-
* Command projects:bind not found.` (exit 2). That is the shape #10967
97+
* Command projects:bind not found.` (exit 2). That is the shape commit e4a71d418
9898
* fixed under `environments/*.ts`; this pin targets the MECHANISM (an
9999
* example naming an id this CLI does not register), not the literal string
100100
* `os projects`, so it keeps working for a topic nobody has renamed yet —
@@ -123,7 +123,7 @@ describe('os environments commands', () => {
123123
* ## Population: EVERY command source, via AST — not via `import`
124124
*
125125
* The property is checked against every non-test file under
126-
* `packages/cli/src/commands/**`, not just the five #10967 touches — a
126+
* `packages/cli/src/commands/**`, not just the five commit e4a71d418 touched — a
127127
* five-file population is exactly the set that is already correct, so it
128128
* cannot catch the defect class returning anywhere else (it did not catch
129129
* it in `register.ts`/`whoami.ts`/`logout.ts`, discovered by hand below).
@@ -157,23 +157,23 @@ describe('os environments commands', () => {
157157
* `examples` USED TO say `os auth register` / `os auth whoami` / `os auth
158158
* logout`, though no `auth` topic has ever existed for them (confirmed via
159159
* `--help`: `Error: Command auth:whoami not found.`) — the same defect
160-
* class as #10967, found by scanning the whole tree, but not #10967's to
161-
* fix (outside its dispatched file surface). Filed as #11221 and fixed
162-
* there, so `EXCLUDED` is now empty and all three are scanned by the main
160+
* class commit e4a71d418 fixed, found by scanning the whole tree, but not that commit's to
161+
* fix (outside its dispatched file surface). Fixed separately by commit e278a2970,
162+
* so `EXCLUDED` is now empty and all three are scanned by the main
163163
* assertion like every other command source.
164164
*
165165
* The mechanism stays, because it is what made that handoff safe: a silent,
166166
* permanent exemption is its own defect — a file excluded here stops being
167167
* checked by this pin forever, even after the excluded condition no longer
168168
* holds. So a second `it.each` re-runs the SAME predicate over the excluded
169169
* files and asserts it still finds an unresolved entry. That is not
170-
* hypothetical here: when #11221's fix removed the last unresolved entry,
170+
* hypothetical here: when commit e278a2970 removed the last unresolved entry,
171171
* this assertion went red on purpose for all three files, and its message
172172
* ("remove it from EXCLUDED above") is what retired them. The pattern
173173
* (map-of-reason + filtered main assertion + a "still needs its exclusion"
174174
* retiring assertion) matches
175175
* `packages/create-objectstack/src/starter-comments-self-contained.test.ts`'s
176-
* `EXCLUDED`, which has retired this same way before (#11022).
176+
* `EXCLUDED`, which has retired this same way before (commit 21756b325).
177177
*/
178178
describe('#10967 pin: examples resolve to a real command id', () => {
179179
const ENVIRONMENTS_DIR = fileURLToPath(new URL('.', import.meta.url));
@@ -293,7 +293,7 @@ describe('#10967 pin: examples resolve to a real command id', () => {
293293
/**
294294
* Nothing is excluded — every command source is scanned. `register.ts` /
295295
* `whoami.ts` / `logout.ts` each carried a self-retiring entry here while
296-
* their `os auth …` examples were #11221's to fix; that fix landed, the
296+
* their `os auth …` examples awaited commit e278a2970's fix; that fix landed, the
297297
* retiring assertion below went red exactly as designed, and the map goes
298298
* back to empty rather than staying around as a silent exemption over three
299299
* root-level commands. The assertion stays, so the next entry added here is

‎packages/cli/src/commands/explain.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ export const SCHEMAS: Record<string, SchemaInfo> = {
218218
{ name: 'description', type: 'string', description: 'App description' },
219219
{ name: 'navigation', type: 'NavItem[]', description: 'Menu tree. Every item needs `id` (snake_case) + `label` + a discriminant `type`, plus that type\'s own target key: object -> `objectName`, dashboard -> `dashboardName`, page -> `pageName`, url -> `url`, report -> `reportName`.' },
220220
// `theme` here described a key that is only an alias of `branding`; the
221-
// `themes` metadata surface itself was retired at #10485 (ADR-0049) —
221+
// `themes` metadata surface itself was retired by commit 35ad101bc (ADR-0049) —
222222
// `app.branding` is the one colour surface. `logo` and `defaultRoute`
223223
// were the same class of row: neither is an AppSchema key, and both are
224224
// now rejected by name (`logo` -> `branding`).

‎packages/cli/src/commands/generate-builtin-id-column.pin.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
22

33
/**
4-
* THE #15040 PIN: the `id` column both migration generators emit is the column
4+
* THE commit 8644d1d33 PIN: the `id` column both migration generators emit is the column
55
* `driver-sql` actually creates.
66
*
77
* ## The defect
@@ -46,7 +46,7 @@
4646
*
4747
* ## The audit-stamp columns: all three rows now ruled (#15521)
4848
*
49-
* #15040 measured a THIRD disagreement in the same pass and recorded it here
49+
* Commit 8644d1d33 measured a THIRD disagreement in the same pass and recorded it here
5050
* without correcting it. #15521 split that record into rows and has now ruled
5151
* every one of them the same way — the generator follows the driver:
5252
*

0 commit comments

Comments
 (0)