Skip to content

docs(ui): 给 apps.mdx 补 contextSelectors / defaultAgent 两个作者面键 (#5891) - #5984

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-5891-apps-mdx-missing-keys
Aug 6, 2026
Merged

docs(ui): 给 apps.mdx 补 contextSelectors / defaultAgent 两个作者面键 (#5891)#5984
hotlong merged 1 commit into
mainfrom
claude/issue-5891-apps-mdx-missing-keys

Conversation

@hotlong

@hotlong hotlong commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #5891

为什么

content/docs/ui/apps.mdx 的 App Properties 表是作者写 app 的唯一手写入口,读起来像作者面的全集;而 packages/spec/src/ui/app.zod.tsAPP_KEYS 里的 contextSelectorsdefaultAgent 既不在这张表里,也在整个手写文档树零覆盖(此前只存在于生成的 content/docs/references/ui/app.mdx)。对作者来说这不是「少写一行」,而是把两个键变成不可发现 —— 与 #4880 / PR #5890 处理的 areas[] 完全同一形状的缺口。

改了什么

只动 content/docs/ui/apps.mdx 一个文件,体例照 PR #5890(## Areas)的先例:表格行 + 需要展开的键单独小节。

  1. App Properties 表补两行,各自链到自己的小节:contextSelectors(排在 areas 之后)、defaultAgent(排在 requiredPermissions 之后)。
  2. 新增 ## Context Selectors
    • 语义:侧边栏顶部(导航树之上)的作用域下拉;当前值以选择器自身的 id 命名发布,按模板变量注入导航项 —— 与 current_user_id / current_org_id 同一套替换。
    • 注入落点逐条列出:object 项的 recordIdfilters 各值、page / component 项的字符串 params 值;解析不到的变量整条从 URL 里丢掉,而不是留空。
    • optionsSource 子表(endpoint / valueKey 默认 id / labelKey 默认 name / filter),以及 filter 谓词的 eq(默认)ne in nin
    • 「选择器是强制作用域」一节:没有 All 行、也没有键能要一个;列表解析出来且尚无具体选中时壳层自动选中第一项;allValue 是「尚未具体选中」的哨兵值而不是 All 选项。
    • 「Retired selector keys」callout:17.0.0(#4488 审计发现的四个"授权门断连":email_template / job / validation 的元数据条目到不了执行点,action 导航项点不动 #4509 / ADR-0049)退休的 includeAll / placement,连同各自的处方 —— 与页面既有的 app 级 / area 级退休 callout 同体例。
    • 例子取平台自身 Studio 的 package scope(packages/platform-objects/src/apps/studio.app.ts 的真实形状),带 {/* os:check */} 标记。
  3. 新增 ## Default Agent:可解析值只有 ask / build 两个平台 agent —— 数据类 app 省略即得 ask,授权类(authoring)surface 写 'build';ADR-0063 撤回了租户/包级自定义 agent,所以表外的名字(如 sales_copilot)parse 得过但绑不上,解析时回落平台默认。附一条 callout 说明它绑的 in-product chat runtime 属 ObjectOS,开源版没有可绑的 chat surface。
  4. Related 补一条到 AI Agents 的链接。

事实来源(每条断言都在 origin/main 上核过)

断言 出处
键集 / 必填性 / 默认值 packages/spec/src/ui/app.zod.ts AppContextSelectorSchema(id label optionsSource 必填;allValue 默认 ''persist 默认 'query';valueKey/labelKey 默认 id/name)
模板变量注入语义 同上 AppContextSelectorSchema 的 JSDoc + AppSchema.contextSelectors.describe
注入落点 / 解析不到即丢弃 objectui packages/layout/src/NavigationRenderer.tsxapplyNavTemplateresolveHref(object recordId、object filters、page params、component params)
侧边栏渲染位置、自动选中第一项、无 All 行 objectui packages/app-shell/src/layout/ContextSelectors.tsx(useAppContextSelectors / SelectorControl),挂载点见 AppSidebar.tsx / UnifiedSidebar.tsx
includeAll / placement 退休处方 app.zod.tsCONTEXT_SELECTOR_RETIRED_KEY_GUIDANCE
Studio package scope 的真实用法 packages/platform-objects/src/apps/studio.app.ts
defaultAgent 绑定语义与可解析集合 app.zod.ts defaultAgent 的 JSDoc/.describe(ADR-0063 §1/§2);解析链见 cloud packages/service-ai/src/agent-runtime.ts resolveDefaultAgent(app.defaultAgent → ask → 首个 active);「表外名字回落平台默认」另有 cloud 用例 agent-load-platform-gate.test.ts 直接盯住
开源版无 in-product chat content/docs/ai/agents.mdx 既有 callout

新增的「One scope per app today」callout 同样是核过的实现事实,不是推测:ContextSelectors.tsx 把选中值反射到 URL 上一个固定 query key,而每个声明的 selector 都从同一个 key 读回(contextValues[sel.id] = (params.get('package') ?? saved) || …),所以第二个 selector 会镜像第一个而不是独立作用域。写进文档是为了不让作者照着数组类型声明出一份静默失效的元数据;objectui 侧的实现缺陷另行归档,不在本 PR 修。

自验

  • node scripts/check-doc-authoring.mjs --self-test && node scripts/check-doc-authoring.mjs✓ doc authoring guard: 362 files clean
  • pnpm --filter @objectstack/spec run check:skill-examples✅ 208 prose examples type-check against @objectstack/spec;抽取清单里本页从 3 块变 4 块(新增 content/docs/ui/apps.mdx:512),即新例子确实被对着真实 spec 的 d.ts 编译过
  • 反向验证(方向预判:红):往新例子里塞一个已退休的 placement: 'topbar',门禁如期转红,并且报错把 selector 的合法键集原样列了出来 —— error TS2353: … 'placement' does not exist in type '{ id: string; label: string; optionsSource: {…}; icon?…; allValue?…; persist?… }',反过来证实了本 PR 表格里的键集与「退休键在 parse 期被拒」的说法;移除探针后复跑回绿
  • node scripts/docs-audit/check-audit-scope.mjs✓ docs-accuracy-audit scope is in sync with content/docs/: 178 hand-written doc(s)
  • MDX 语法:用 @mdx-js/mdx@3.1.1compile() 单独编译本页通过(并用一份故意写坏的 MDX 验证过该 harness 不是空跑)
  • node scripts/check-nul-bytes.mjs 通过;另按控制字节纪律对本文件跑了 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]',零命中

Changeset

不带 changeset,按 PM 裁定走 skip-changeset 标签路线:本 PR 只改手写文档页,不发布任何包(空 changeset 会滞留发布,#4898,所以不提交空文件)。标签已在 PR 建好后由本 agent 补上(读回既有标签后写并集,避免覆盖 bot 刚打的 size/* 等)。

范围

严格按分诊裁定只做 contextSelectors / defaultAgent 两键。⛔ hidden 没有写 —— 其语义正由 #4829 争议中(filterAppForUser 当 builder-only 访问闸门 vs spec .describe 的「只从 App Switcher 隐藏」),先定语义再写散文。⛔ 未碰 packages/spec/**、未碰 content/docs/releases/


🤖 Generated with Claude Code

https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3


Generated by Claude Code

`content/docs/ui/apps.mdx` 的 App Properties 表读起来像 App 作者面的全集,
但 `APP_KEYS` 里的 `contextSelectors` 与 `defaultAgent` 两键既不在表里,
也在整个手写文档树零覆盖(此前只存在于生成的 content/docs/references/)。
对作者而言这不是"少写一行",而是把键变成不可发现。

- App Properties 表补两行,各自链到自己的小节;
- 新增 `## Context Selectors`:模板变量注入语义(值以 `id` 命名注入,
  与 `{current_user_id}` 同一套替换)、`optionsSource` 子表、
  "强制作用域、无 All 行、首项自动选中"、以及 17.0.0 退休的
  `includeAll` / `placement` 两键;例子取平台自身 Studio 的 package scope,
  带 `os:check` 标记,由 check:skill-examples 对着真实 spec 编译;
- 新增 `## Default Agent`:可解析值只有 `ask` / `build` 两个平台 agent
  (ADR-0063 撤回租户自定义 agent,表外的名字解析不到,回落平台默认)。

`hidden` 按分诊裁定不在本单范围(语义正由 #4829 争议中)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 6, 2026 1:52pm

Request Review

@github-actions github-actions Bot added the size/m label Aug 6, 2026
@hotlong hotlong added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 6, 2026 — with Claude
@github-actions github-actions Bot added documentation Improvements or additions to documentation and removed skip-changeset PR has no user-facing published change; bypasses the changeset gate labels Aug 6, 2026
@hotlong hotlong added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 6, 2026 — with Claude
@hotlong
hotlong marked this pull request as ready for review August 6, 2026 14:07
@hotlong
hotlong added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit a2d9351 Aug 6, 2026
30 of 32 checks passed
@hotlong
hotlong deleted the claude/issue-5891-apps-mdx-missing-keys branch August 6, 2026 14:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

content/docs/ui/apps.mdx 的 App Properties 表漏了三个可作者化键;contextSelectors / defaultAgent 全手写文档树零覆盖

2 participants