Skip to content

Commit bcb84eb

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/project-thread-6djfn0
2 parents b2e7587 + c475b45 commit bcb84eb

9,352 files changed

Lines changed: 2588906 additions & 15312 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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/console': patch
3+
'@objectstack/cli': patch
4+
---
5+
6+
build(console): `@objectstack/console` is built in this workspace from `ui/apps/console`, and the Console no longer arrives through a pinned objectui commit
7+
8+
Clause-②: no
9+
Metadata-protocol: none
10+
11+
- **The package.** `@objectstack/console` ships the same `dist/` it shipped at 18.1.0: the built Console (`index.html`, `assets/`, the manifests it served). Two files leave the tarball: `dist/.objectui-sha`, which named the objectui commit the Console was built from, and `dist/.objectstack-injection.json`, which recorded the spec and client dists injected into that build. Both described a pin that no longer exists: the Console is built from the `ui/` tree of the same commit as the framework, so its version is the framework's version.
12+
- **The CLI.** When a framework checkout has no built Console, `objectstack serve` / `objectstack dev` and the 503 at `/_console/` now name `pnpm console:build`, which builds `ui/apps/console` and copies its dist into `packages/console`. The remedy used to be `pnpm objectui:build`, which cloned objectui at the pinned commit.
13+
- **One version.** The `@object-ui/*` packages and the private VS Code extension join the `@objectstack/*` fixed group, so every public package of both scopes publishes at one version and the extension ships at it.
14+
15+
What to do: nothing as a consumer; install `@objectstack/console` as before. In a framework checkout, run `pnpm console:build` where you ran `pnpm objectui:build`.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
'@objectstack/spec': minor
3+
'@objectstack/lint': minor
4+
---
5+
6+
feat(spec,lint): a list-view grouping level can order its groups by another field (`grouping.fields[].orderBy`)
7+
8+
Clause-②: yes
9+
Metadata-protocol: added
10+
11+
- **Before.** A grouping level ordered its groups only by its own key. A period label grouped as text (`Nov 2026`, `Oct 2026`, `Q1 2027`, `Q4 2025`), so putting periods in time order took a second, outer grouping level on the period start, which showed two header rows for every group.
12+
- **Now.** `GroupingFieldSchema` gains `orderBy`, the name of a field on the same object whose value orders this level's groups: `{ field: 'period_label', orderBy: 'period_start', order: 'desc' }`. When it is absent, or names the grouping field itself, the groups order by their own key as before. Nothing is defaulted in.
13+
- **What the header query carries.** The consumer still sorts the header rows. `compileListViewGroupQuery` now adds the value to sort by: one `min` node over `orderBy` for `order: 'asc'`, or one `max` node for `'desc'`, under `min_<field>` / `max_<field>`. Each group sits where its first row would sit if the rows were sorted by `orderBy` in `order`. The grouping key stays the only `groupBy` column, so there is one header per label. A column summary that already declares the same `min` is the same node and the same column. In a multi-level grouping the outer level's value folds exactly from the leaf rows (the `min` of mins, the `max` of maxes).
14+
- **`listViewGroupOrderColumn(grouping, level)`** (`@objectstack/spec/ui`) names the header-row column a level sorts by: the grouping field itself, or the order node's alias. A consumer reads this instead of rebuilding the alias. A group whose order value is `null` sorts last in both directions, and equal values fall back to the group key in the same direction.
15+
- **Refused, at compile and at authoring.** An empty `orderBy` is refused by the schema (`too_small`), and a padded one, whitespace-only included, by name, as a padded `field` is, because the name is compiled verbatim. The compiler refuses a blank one in-process (`grouping_order_by_blank`, `INVALID_QUERY` / 400). An order alias that lands on a grouped field's own column is `alias_collision`. `os validate`, `os build` and the runtime save door judge `orderBy` the way the server doors do. An unknown name is `list-view-field-unknown`. A dotted path is `list-view-field-dotted`, because the header query compiles no join. A field whose type `min` / `max` cannot order on every backend is the new `list-view-group-order-unorderable` (`error`). That covers the string classes, whose order depends on the collation, the virtual `formula`, and every other type outside the numeric, temporal and boolean classes. Each of these is refused `400 INVALID_FIELD` on the server, so the grouped view would render no group: an unknown or dotted name by the data door's ingress (`findData`), and an unorderable type by `engine.aggregate`'s type door.
16+
- **Unchanged.** `order` and `collapsed` keep their meaning and defaults. The row page query (`compileListViewGroupRowsQuery`) does not change. `EngineAggregateOptions` gains no `orderBy`, because the group sort stays the consumer's. That sort is right only over the whole header set, which is what the compiler asks for: a `limit` on the header query is sliced by `findData` before any sort, so a paged header set honours neither `order` nor `orderBy`, the limit already recorded on `GroupingConfigSchema`. The new key is purely additive, so a grouping declared today compiles to exactly the same query.

‎.changeset/config.json‎

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,52 @@
8080
"@objectstack/account",
8181
"create-objectstack",
8282
"@objectstack/connector-openapi",
83-
"@objectstack/verify"
83+
"@objectstack/verify",
84+
"@object-ui/app-shell",
85+
"@object-ui/auth",
86+
"@object-ui/cli",
87+
"@object-ui/collaboration",
88+
"@object-ui/components",
89+
"@object-ui/console",
90+
"@object-ui/core",
91+
"@object-ui/create-plugin",
92+
"@object-ui/data-objectstack",
93+
"@object-ui/fields",
94+
"@object-ui/i18n",
95+
"@object-ui/layout",
96+
"@object-ui/mobile",
97+
"@object-ui/permissions",
98+
"@object-ui/plugin-ai",
99+
"@object-ui/plugin-calendar",
100+
"@object-ui/plugin-charts",
101+
"@object-ui/plugin-chatbot",
102+
"@object-ui/plugin-dashboard",
103+
"@object-ui/plugin-designer",
104+
"@object-ui/plugin-detail",
105+
"@object-ui/plugin-editor",
106+
"@object-ui/plugin-form",
107+
"@object-ui/plugin-gantt",
108+
"@object-ui/plugin-grid",
109+
"@object-ui/plugin-kanban",
110+
"@object-ui/plugin-list",
111+
"@object-ui/plugin-map",
112+
"@object-ui/plugin-markdown",
113+
"@object-ui/plugin-report",
114+
"@object-ui/plugin-timeline",
115+
"@object-ui/plugin-tree",
116+
"@object-ui/plugin-view",
117+
"@object-ui/providers",
118+
"@object-ui/react",
119+
"@object-ui/react-runtime",
120+
"@object-ui/sdui-parser",
121+
"@object-ui/types",
122+
"object-ui"
84123
]
85124
],
86125
"linked": [],
87126
"access": "public",
88127
"baseBranch": "main",
89128
"updateInternalDependencies": "patch",
90-
"ignore": [],
129+
"ignore": ["@object-ui/example-*", "@object-ui/site", "@object-ui/runner", "@object-ui/test-support"],
91130
"privatePackages": { "version": true, "tag": false }
92131
}

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
135135
- `Blocked-by:` 行是机器可 grep 的反向索引,一遍读喂三个职责,⛔ 只做第一件。
136136
- 三职责:上游关单放回解锁卡;按解锁扇出排序;在合并后的 ref 上重验回队卡文件面。
137137
- 一个标签存在当且仅当有具名读者;`pm:blocking` 即其推导缓存,读者以词表脚本注为权威。
138-
- 跨仓解锁判据是消费方可安装,⛔ 不是上游已合并。
138+
- 跨仓解锁判据是消费方可安装,⛔ 不是上游已合并;探针:装上的包是否接受新键/新行为。
139139
- 以发布包消费上游的仓,解锁放回前先验修复已进可安装的发行版。
140-
- 安装面探针:装上的包是否接受新键/新行为。
141140
- 未发版 ⇒ 转 `pm:on-hold` + `Restart-when:` 加消费方安装面判据,⛔ 不回 `pm:queue`。
142141
- 该 hold 评论预写唤醒后的派发形状;pin 消费的仓不适用:pin 移动即可安装,走 pin 滞后读数。
143142
- 状态变更不过夜:标签无评论、assignee 无认领评论、结论只在 chat,都是半状态。
@@ -183,6 +182,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
183182
- 路径面用 `get_files` 取,⛔ 不看报告自述;动手之前先分,不是事后对照。
184183
- governed 面统一定义:`docs/adr/**`+`.claude/**`(全量)+`skills/**`+`docs/NORTH-STAR.md`+`.github/workflows/**`。
185184
- governed 面同含 `AGENTS.md`+`CLAUDE.md`;`GOVERNED_REPOS` 同治理、行可限仓,执行席恒随落地仓车道。
185+
- 另含 `ui/docs/adr/**`+`ui/.claude/**`+`ui/skills/**`+`ui/AGENTS.md`+`ui/CLAUDE.md`+`ui/.github/workflows/**`。
186186
- 路径面命中 Tier H ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。
187187
- 改动 >3000 行(含生成物)同换终局四件套,⛔ 无 Tier S 例外;读数 = PR additions+deletions。
188188
- ① 席位记录一条落 PR,两层同欠:Tier H 置顶速读五段,其下 `## 席位核对`;卡只留指针行。

‎.claude/skills/pm-dispatch/references/platform-readings.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,9 @@
387387
- 本车道强制多是过宽的回忆:`dispatch-gates.mjs --tier PATH` 逐路径现推,路径线是下限非放行。
388388
- 该脚本只答自己那棵树:姊妹仓路径回 absent from this tree,姊妹仓的档位与条款②只能手推。
389389
- `os-verify-lock.sh` 只住 objectstack:objectui 无它,跑本仓副本读的是容器级锁,非该仓深度。
390-
- required checks 的名单是每仓事实,objectstack 五个:
391-
`TypeScript Type Check` · `Lint & Repo Gates` · `Test Core` ·
392-
`Build Core` · `Governed Surface Queue Guard`。
390+
- required checks 的名单是每仓事实,objectstack 七个:
391+
`TypeScript Type Check` · `Lint & Repo Gates` · `Test Core` · `Build Core` ·
392+
`Governed Surface Queue Guard` · `Lint UI` · `Build & E2E UI`。
393393
- ⭐ 本表的 `mustName` 声明 `statesTheSet` ⇒ 必须逐字等于注册表,加注册行不跟改本表即红。
394394
- ⇒ 门绿即名单逐字齐全的读数;⛔ 但数量词未钉:实测 七→六 照绿,只能手跟改。
395395
- ⛔ 聚合命令同样不作判定:`check:type-check-debt` 可在包级 typecheck 绿时红。

‎.github/CODEOWNERS‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@
4646
/docs/NORTH-STAR.md @os-zhuang @hotlong
4747
/.github/workflows/ @os-zhuang @hotlong
4848

49+
# Tier H governed surfaces of the nested `ui/` workspace (#25712) — the same
50+
# register rows, under `ui/`; `ui/.claude/` is Tier H, unlike the root tree
51+
/ui/docs/adr/ @os-zhuang @hotlong
52+
/ui/.claude/ @os-zhuang @hotlong
53+
/ui/skills/ @os-zhuang @hotlong
54+
/ui/AGENTS.md @os-zhuang @hotlong
55+
/ui/CLAUDE.md @os-zhuang @hotlong
56+
/ui/.github/workflows/ @os-zhuang @hotlong
57+
4958
# The enforcement chain
5059
/.github/CODEOWNERS @os-zhuang @hotlong
5160
/scripts/pm/check-governed-merges.mjs @os-zhuang @hotlong

0 commit comments

Comments
 (0)