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 4daad78
Browse filesBrowse the repository at this point in the historyBrowse files
docs: fold the ui/ top-level docs into the root README, ROADMAP and CONTRIBUTING (#26080 slice 1) (#27001)
Part of #26080
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:`ui/` 下的 README、ROADMAP、CONTRIBUTING、QUICK_REFERENCE
四份顶层文档并入根目录同名文档后删除;`ui/CHANGELOG.md` 保留为冻结历史并加一行说明;README 里的代码示例搬到
`ui/content/docs/guide/quick-start.md`。
- 为什么改:裁决 6417494426(A,「其他同意」)第 1 片:一个仓一套贡献说明和路线图,不再有两份入门步骤、两份 ROADMAP。
- 风险与回滚:纯文档和测试改动,外加 33 个 `@object-ui/*` 包 README 里的两条链接(指向已归档的 objectui
仓 → 指向本仓根目录),带 patch changeset;回滚就是 revert 本 PR。
- 先看:① `ui/scripts/check-doc-component-types.mjs` 等三个门禁把 `ROOT_PAGES`
清空(README 示例改由 content/docs 那条腿判);②
`ui/scripts/__tests__/quick-reference-commands-4149.test.ts` 改读根
CONTRIBUTING 的 UI 小节;③ `CONTRIBUTING.md` 新增的 “UI Workspace (`ui/`)” 小节。
- 两分钟验证:在 `ui/` 下跑 `pnpm docs:check-links`,预期输出 `Links are valid across
13 scan roots.`。
- 需要你做的:无,席位落地。
## What changes
Slice 1 of ruling A on #26080 (comment 6417494426), verbatim: 「其他同意」.
The four `ui/` top-level documents are folded into the repository root
and deleted.
- **Root `README.md`** gains an "ObjectUI (`ui/`)" subsection under
*Hack on the framework*: a workspace description (not a product pitch:
no badge row, no three-product block, no links to the archived
repository), the hero screenshot, and the two start paths.
- **Root `CONTRIBUTING.md`** gains a "UI Workspace (`ui/`)" section: the
UI-only delta of the old `ui/CONTRIBUTING.md` and the whole of
`ui/QUICK_REFERENCE.md` (turbo commands, the vitest-from-`ui/` rule and
the guard text, examples, layout, docs conventions). A second Package
Directory block lists every `@object-ui/*` package, and the License
section says contributions under `ui/` are MIT. The root's own setup
steps are kept and not duplicated; the stale parts of the old file
(fork-from-objectui, the `.objectstack-sha` pin, the `pnpm-merge`
driver, objectui's own CI and coverage thresholds) are not carried over.
- **Root `ROADMAP.md`**: the Console bullet and the documentation rule
no longer send readers to the sibling `../objectui` repository, and a
short "ObjectUI (`ui/`)" section carries the old pointer file's content.
- **`ui/content/docs/guide/quick-start.md`** takes the README's code
examples: an "Expression Scope" section ("Basic Usage") and "Copy-Paste
Schemas" (Contact Form, Data Grid, Dashboard, Kanban Board). The
README's ObjectStack-adapter and custom-`DataSource` snippets are not
moved: the quick-start's "Connect a Data Source" and
`guide/data-source.md` already carry them.
- **`ui/CHANGELOG.md`** stays, with a one-line frozen-history header.
- **Gates and pins retargeted, none deleted.** `ROOT_PAGES` is emptied
in `check-doc-component-types`, `check-doc-snippet-types` and
`check-doc-fence-languages` (the guard over it stays);
`check-doc-json-fences` drops its root-README leg and that leg's anchor;
`check-doc-links` drops the four `SCAN_ROOTS` rows. The pins that
asserted the README fences (`page-body-single-node-8310`,
`page-body-arity-8310`, `readme-kanban-example-8256`, the 7115 pins in
three gate suites) assert the same fences on the quick-start page;
`quick-reference-commands-4149` holds the root CONTRIBUTING's UI section
to the same anchors (ui scripts, ui workspace packages, paths spelled
`ui/...` and resolved in the tree);
`object-calendar-container-by-reference-6152` stops adding the deleted
README to its corpus. Fixtures that stood a root README / CONTRIBUTING /
ROADMAP / QUICK_REFERENCE on the disk rule now use `AGENTS.md`,
`CLAUDE.md` and `CHANGELOG.md`, the root-level rows that remain. The
`markdown-test-inputs` ledger is re-adjudicated against the scanner.
- **Links repointed.** 71 links in 36 files to
`objectstack-ai/objectui/blob/main/CONTRIBUTING.md` / `ROADMAP.md` (the
archived repository; the link gate resolved them against the deleted
`ui/` files) now point at this repository's root documents, and so do
the relative links in `ui/apps/console/README.md`,
`ui/packages/plugin-gantt/ROADMAP.md`,
`ui/packages/vscode-extension/{README,DESIGN}.md`,
`ui/.changeset/README.md` and `ui/CHANGELOG.md` (a relative path out of
`ui/` is refused by the link gate). Three anti-vacuity floors over
judged-link counts move down by the measured amount, each with its
reason in the comment.
- **One example fixed in place.** Moving "Basic Usage" into
`content/docs` put it under the objectui#11436 walk, which reds a taught
`page` node that writes `title` with no `pageType` (a record page draws
no heading). The README had taught that shape unseen; the example now
says `pageType: "app"`. The 8310 pins assert substrings that are
unchanged.
- **Changeset** `ui/.changeset/26080-readme-contributing-links.md`:
`patch` for the 33 published packages whose shipped `README.md` changed.
No code, export or behaviour changes.
Not touched: `ui/lychee.toml` and `ui/turbo.objectui.json` keep live
readers (re-confirmed on this head: `ui/scripts/workspace-root.mjs`
reads `turbo.objectui.json`, with
`ui/scripts/__tests__/helpers/turbo-inputs.ts` and
`workspace-root.test.ts`;
`ui/scripts/__tests__/check-links-workflow.test.ts` reads
`ui/lychee.toml`), so the ruling's delete condition does not hold and
they stay on the card. `ui/.claude/**`, the `ui/docs/adr` index prefix,
`ui/AGENTS.md` and every governed path are untouched
(`check-governed-merges --test`: 0 of 71 paths governed).
Overlap: draft PR #26365 edits `ui/README.md` (drops the
`@object-ui/plugin-ai` row) and `ui/QUICK_REFERENCE.md` (the
`packages/*` count). This PR deletes both files, which subsumes those
two hunks; the `plugin-ai` row now lives in the root CONTRIBUTING's
ObjectUI package directory, so whichever of the two lands second removes
it there. #26073's edits (root README Community line, `ROADMAP.md:4`,
`CONTRIBUTING.md:114`) are in regions this PR does not touch.
## Tests
<details><summary>ui scripts suite and the affected package tests, on
head 70e7d98</summary>
`os-verify-lock.sh -c 'cd ui && pnpm exec vitest run --maxWorkers=2
scripts/ ...'` plus the four retargeted package tests,
`page-node-headings-drawn-11436`,
`registered-types-validate-ratchet-10859` and the tests the ledger lists
as readers of the edited pages:
```text
Test Files 187 passed | 2 skipped (189)
Tests 5349 passed | 2 skipped (5351)
os-verify-lock: VERDICT command-exit 0
```
`pnpm --dir ui run type-check:scripts` (tsc over the scripts and their
tests): exit 0.
</details>
## Acceptance notes
- `ui/.gitattributes` still routes `pnpm-lock.yaml` through a
`pnpm-merge` driver, and its comment cites the deleted CONTRIBUTING
section that defined the driver; `ui/` has no `pnpm-lock.yaml`, so the
line matches nothing. Dead config of the same family as
`ui/lychee.toml`; left for the card's remaining item.
`ui/content/docs/guide/ci-cd-pipeline.md` (its "Lockfile Merge Driver"
passage) still describes that CONTRIBUTING instruction.
- `ui/scripts/setup.sh` advertises `pnpm build`, `pnpm lint` and `pnpm
create-plugin`, which `ui/package.json` does not declare. Only its two
"read this file" lines are repointed here.
- `ui/.changeset/README.md` cites
`.github/workflows/changeset-release.yml`, which is gone from `ui/`.
- Package READMEs still link issues and examples in the archived
objectui repository; only the CONTRIBUTING / ROADMAP links, which the
link gate resolves into this tree, are repointed.
- The README's comparison table against other renderers and its "Why
Object UI" form snippet are not carried over (a product pitch, per the
card's brand note 6416758216); the four Shadcn / backend / control /
typed bullets are folded into the root README paragraph.
## Verification
<details><summary>Local gates: dispatch-gates derivation, 27 families,
each exit code captured before any pipe</summary>
`node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--ran`: `27 derived famil(ies) accounted for — 27 run, 0 NOT-MEASURED (a
DERIVED zero — all 27 recorded an exit code and none of them is 3)`.
Every family exited 0: check-adr-links (+ self-test),
check-closing-keyword-parity (+ self-test), check-comment-mask-corpus,
check-sdui-manifest (+ self-test), spec check:duration-unit-keys,
check:cross-package-test-inputs, check:dispatcher-error-vocabulary,
check:doc-anchors, check:driver-memory-census,
check:engine-double-contract, check:gitlink-declared, check:nul-bytes,
check:published-files, check:query-options-erasure,
check:refd-timer-probe, check:skill-identifier-liveness,
check:test-source-alias, check:tier-file-adoption,
check:type-check-coverage, check:type-check-debt,
check:undeclared-dep-imports, check:watch-hint-literal,
check:where-matcher, and the ui scripts vitest run above. The check:*
families ran on 657dff2; the last commit touches only the quick-start
page and one test file, and nul-bytes, doc-anchors and
cross-package-test-inputs were re-run on 70e7d98 (exit 0).
Also on 70e7d98, each exit 0: ui `check:doc-types`,
`check:doc-fences`, `docs:check-links` (`Links are valid across 13 scan
roots.`), `markdown-test-inputs.mjs --audit` (`107 candidate test files,
all adjudicated; 71 declared entries, all present.`),
`check-doc-expression-carriage.mjs`, and the ui changeset gates
(`check-changeset-fixed`, `check-changeset-no-major`,
`check-changeset-claims`, `check-pending-changeset-literals`).
NOT MEASURED locally: ui `check:doc-json` and `check:doc-snippets` (they
need the ui package builds); CI's `Lint UI` / `Test UI` run them. The
full farm is CI's.
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
docs: the README's Contributing Guide and Roadmap links point at the ObjectStack repository (objectstack#26080)
38
+
39
+
Every package README linked its "Contributing Guide" and "Roadmap" to `CONTRIBUTING.md` and `ROADMAP.md` in the archived `objectstack-ai/objectui` repository. Those documents now live at the root of `objectstack-ai/objectstack`, which is where the links point; the `@object-ui/console` README's roadmap links move there too. No code, export or behaviour changes.
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+181-1Lines changed: 181 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,6 +21,7 @@ each with its pointer.
21
21
-[Making a Change](#making-a-change)
22
22
-[Human Minimum](#human-minimum)
23
23
-[Where Things Live](#where-things-live)
24
+
-[UI Workspace (`ui/`)](#ui-workspace-ui)
24
25
-[Package Directory](#package-directory)
25
26
-[Pull Request Process](#pull-request-process)
26
27
-[Community](#community)
@@ -197,11 +198,117 @@ same list.
197
198
|`content/docs/references/`| Generated from the Zod schemas by `packages/spec/scripts/build-docs.ts`. Never edit it by hand. |
198
199
|`content/docs/releases/`| Written at release time from changesets. Never edit it in a code pull request. |
199
200
|`examples/`| The example apps. The *Examples* table in the [package directory](#package-directory) describes each one. |
201
+
|`ui/`| ObjectUI: the `@object-ui/*` packages, the Console's source and the objectui.org docs site. [UI Workspace](#ui-workspace-ui) below covers working there. |
200
202
|[ARCHITECTURE.md](./ARCHITECTURE.md)| Design details, the plugin lifecycle and the dependency graph. |
201
203
202
204
AGENTS.md (*Documentation Guardrails*) has the rules for every docs path, including what a
203
205
new page needs before it shows up in the navigation.
204
206
207
+
## UI Workspace (`ui/`)
208
+
209
+
`ui/` holds ObjectUI, the view layer: the `@object-ui/*` packages, the Console
210
+
(`ui/apps/console`) and the objectui.org docs site (`ui/apps/site`). It is a member of this
211
+
workspace, so the root `pnpm install` above installs it too, and
212
+
[ui/AGENTS.md](./ui/AGENTS.md) adds that tree's own rules to AGENTS.md: the spec-first and
213
+
contract-first commandments, Shadcn-native styling, actions as data. Its code is MIT-licensed
214
+
([License](#license)). What follows is only what differs from the rest of this guide.
215
+
216
+
### UI commands
217
+
218
+
Run these from `ui/`:
219
+
220
+
```bash
221
+
pnpm exec turbo run build --filter='./*/*' --filter='!@object-ui/site'# Build every ui package (turbo, parallel & cached)
222
+
pnpm exec turbo run type-check --filter='./*/*'# Run tsc --noEmit across the ui packages (turbo)
223
+
pnpm exec turbo run lint --filter='./*/*'# Run eslint across the ui packages (turbo)
224
+
pnpm dev # The Console's Vite dev server, on :5180
225
+
pnpm site:dev # The docs site, on http://localhost:3000
226
+
pnpm docs:check-links # The internal-link check CI runs on ui docs
227
+
pnpm test:e2e # End-to-end tests (playwright)
228
+
```
229
+
230
+
turbo resolves a relative filter against the directory it is launched from, so the filter above
231
+
selects every package under `ui/packages/`, `ui/apps/` and `ui/examples/`. The tree has no
232
+
`build`, `type-check` or `lint` script of its own, because a `turbo run` in a member's script
233
+
would nest inside the root's. The ui packages spell the type-check task `type-check`, with a
234
+
hyphen. The Console dev server proxies its API calls to a backend as
235
+
[Getting Started](#getting-started) describes.
236
+
237
+
### UI tests
238
+
239
+
Run vitest **from `ui/`**, with paths written relative to it and **no `--`** before them:
240
+
241
+
```bash
242
+
pnpm test# Run every vitest project (CI runs this)
243
+
pnpm exec vitest run packages/core/ # Run a single package's tests
244
+
pnpm exec vitest run packages/core/src/<file>.test.ts # Run a single test file
245
+
pnpm exec vitest run apps/console/ # Run just the Console's tests
246
+
```
247
+
248
+
`pnpm --filter <pkg> test` and `turbo run test` are fine too: every package's `test` script
249
+
names the ui root (`vitest run --root ../.. packages/<pkg>/`), so they run the same single
250
+
config CI does. What is still wrong is `cd packages/x && pnpm exec vitest`, and a path behind
251
+
`--`. Each of those moves vitest's root into a package, where the `unit` / `dom` / `dom-heavy`
252
+
projects match nothing and only `ui/apps/console` resolves: foreign files pass, your package
253
+
never runs, and the output is green. A guard **exits non-zero** on them and prints the
254
+
correct invocation. It is wired into every file vitest can pick up as a config:
255
+
`ui/vitest.config.mts`, `ui/apps/console/vitest.config.ts`, and every
256
+
`ui/packages/<pkg>/vite.config.ts`. The rejection looks like this:
pnpm exec vitest run packages/<pkg>/src/<file>.test.ts # 只跑一个文件
263
+
pnpm exec vitest run packages/<pkg>/ # 只跑一个包
264
+
pnpm test # 全量(CI 跑的就是它)
265
+
```
266
+
267
+
Its "repository root" is `ui/`. The guard is `ui/scripts/vitest-invocation-guard.mjs`.
268
+
269
+
### UI examples
270
+
271
+
No directory under `ui/examples/` is a dev server: `hello-world` is a snippet to paste into
272
+
your own Vite or Next.js app (copy its app component and its schema), and `schema-catalog` is
273
+
a data package, the canonical JSON schemas the docs render, a smoke test mounts and AI agents
274
+
use as a few-shot corpus. Neither declares a `dev` script.
275
+
[`ui/examples/README.md`](./ui/examples/README.md) is the index. The app to run is the Console
276
+
(`pnpm dev` above).
277
+
278
+
### UI layout
279
+
280
+
| Path | Purpose |
281
+
| --- | --- |
282
+
|`ui/packages/*`| The published `@object-ui/*` packages, plus the private `vscode-extension`, `test-support` (test-only, never released), `runner` (workspace demo app, never released) and `app-shell` (the Console's shell and views, no longer published after 18.2.0) |
283
+
|`ui/apps/console`| The Console app (Vite + React), which `pnpm console:build` builds into the `@objectstack/console` package |
284
+
|`ui/apps/site`| The public docs site at <https://www.objectui.org> (fumadocs) |
285
+
|`ui/examples/*`| The snippet and the schema catalog, see [UI examples](#ui-examples)|
286
+
|`ui/content/docs/`| The docs site's pages |
287
+
|`ui/docs/`| Internal engineering material (ADRs, audits); not part of the site |
288
+
|`ui/e2e/`| Playwright end-to-end tests |
289
+
290
+
The [package directory](#package-directory) lists every `@object-ui/*` package by layer.
291
+
292
+
### UI documentation
293
+
294
+
The docs site's pages live in `ui/content/docs/`, and a page's path below it becomes its
295
+
route under the site's /docs base, so an internal link between pages is written
296
+
`[Quick Start](/docs/guide/quick-start)`, with the prefix. `ui/docs/` is not part of the site.
297
+
298
+
-**A code block in an ADR or a dated audit is a specimen, not an example to copy.** Fence it
299
+
`plaintext`, never `ts` / `tsx`: a gate compiles the code fences of `ui/content/docs/`, and
300
+
a record edited until it compiles says something it never said. Code a reader may copy
301
+
belongs in `ui/content/docs/` or the skills tree.
302
+
-**A `json` fence must pass a strict `JSON.parse`.** A block annotated with comments or
303
+
trailing commas is fenced `jsonc`, and must still be one JSON document once those are
304
+
removed; a `${…}` expression stays on one line inside its string.
305
+
-**Internal links are checked offline.**`pnpm docs:check-links` resolves every relative
306
+
path and site route against the checkout, and CI runs it on every change.
307
+
308
+
ObjectUI's [Quick Start](./ui/content/docs/guide/quick-start.md) and
309
+
[Component Registry](./ui/content/docs/guide/component-registry.md) guides are the place to
310
+
start when you add a component.
311
+
205
312
## Package Directory
206
313
207
314
<details>
@@ -331,6 +438,77 @@ new page needs before it shows up in the navigation.
331
438
332
439
</details>
333
440
441
+
<details>
442
+
<summary><b>Everything in <code>ui/packages/</code></b> (ObjectUI, <code>@object-ui/*</code>, MIT), grouped by dependency weight — click to expand.</summary>
443
+
444
+
Atoms and fields stay light; heavy widgets live in lazy-loaded plugins.
445
+
446
+
#### Core
447
+
448
+
| Package | Description |
449
+
| :--- | :--- |
450
+
|[`@object-ui/types`](ui/packages/types)| Pure TypeScript definitions — the protocol layer |
451
+
|[`@object-ui/core`](ui/packages/core)| Registry, validation, expression evaluation; zero React |
452
+
|[`@object-ui/react`](ui/packages/react)| React bindings and `SchemaRenderer`|
453
+
|[`@object-ui/components`](ui/packages/components)| Standard UI components (Tailwind + Shadcn) |
454
+
|[`@object-ui/fields`](ui/packages/fields)| Field renderers and registry |
455
+
|[`@object-ui/layout`](ui/packages/layout)| Layout components with React Router integration |
456
+
457
+
#### Application shell
458
+
459
+
| Package | Description |
460
+
| :--- | :--- |
461
+
|[`@object-ui/app-shell`](ui/packages/app-shell)| The Console's shell, views and Studio; a private workspace package, last published to npm as 18.2.0 |
462
+
|[`@object-ui/providers`](ui/packages/providers)| The upload adapter context the file and image fields upload through |
463
+
|[`@object-ui/auth`](ui/packages/auth)|`AuthProvider`, `useAuth`, `AuthGuard`, sign-in forms |
464
+
|[`@object-ui/permissions`](ui/packages/permissions)| Object / field / row-level permission guards and hooks |
465
+
|[`@object-ui/i18n`](ui/packages/i18n)| Language packs, RTL layout, date and currency formatting |
Copy file name to clipboardExpand all lines: ui/CHANGELOG.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,7 @@
1
1
# Changelog
2
2
3
+
> **Frozen history.** This file is no longer updated: current `@object-ui/*` history is each package's own `CHANGELOG.md`, and the plan is the repository [ROADMAP.md](https://github.com/objectstack-ai/objectstack/blob/main/ROADMAP.md).
4
+
3
5
This file is a **hand-curated summary** of notable changes across the monorepo. It is
4
6
updated at release time by whoever cuts the release — it is not generated. The `Auto
5
7
Changelog` workflow (`.github/workflows/changelog.yml`) exists to regenerate it with
0 commit comments