diff --git a/.changeset/27522-inventory-counts.md b/.changeset/27522-inventory-counts.md new file mode 100644 index 00000000000..05e4d53376d --- /dev/null +++ b/.changeset/27522-inventory-counts.md @@ -0,0 +1,21 @@ +--- +'@objectstack/skills': patch +'@objectstack/spec': patch +'@objectstack/metadata': patch +'@object-ui/i18n': patch +'@object-ui/plugin-grid': patch +'@object-ui/components': patch +'@object-ui/fields': patch +'@object-ui/types': patch +'@object-ui/plugin-form': patch +'@object-ui/console': patch +--- + +docs(skills): hand-written inventory counts are deleted; the names and the source of truth stay + +Clause-②: no +Metadata-protocol: none + +- **Before.** `objectstack-data` counted its field types ("49") in SKILL.md and in `rules/field-types.md`, and its lifecycle events ("8") in SKILL.md and `references/data-hooks.md`; `objectstack-automation` counted its built-in node types ("20"); `objectui/README.md` counted its plugins ("18"); `objectui/guides/schema-expressions.md` counted the formula registry ("30 functions"); `objectstack-query` counted the aggregate functions ("six"). No gate reads any of those numbers against the tree, so each one goes wrong the moment the inventory moves, and a wrong count misleads the reader more than no count. +- **Now.** The numbers are gone; every enumeration that taught something (the node-type tables, the plugin names, the function table, the aggregate names) stays, and each page still points at the file or schema that is the source of truth. Deletion only: every touched file shrinks under its unchanged token ceiling. +- The same deletion in shipped READMEs and one shipped source comment: `@objectstack/spec` (a `//` comment in `src/kernel/metadata-plugin.zod.ts`, which ships), `@objectstack/metadata` (README), and the `@object-ui/*` READMEs of i18n, plugin-grid, components, fields, types, plugin-form and console. No schema, key or behaviour changes. diff --git a/content/docs/api/error-catalog.mdx b/content/docs/api/error-catalog.mdx index 81d301bc5da..469fc7d2421 100644 --- a/content/docs/api/error-catalog.mdx +++ b/content/docs/api/error-catalog.mdx @@ -4,7 +4,7 @@ navTitle: Error Code Catalog description: Complete reference for all ObjectStack error codes with causes, fixes, and retry strategies --- -ObjectStack uses a structured error system with **9 error categories** and **56 error codes reachable on the wire**. Every error includes a machine-readable code, HTTP status mapping, and retry guidance. +ObjectStack uses a structured error system of **error categories** and **56 error codes reachable on the wire**, catalogued in full below (that count is pinned by `packages/spec/src/api/error-catalog-docs.test.ts` against the wire face). Every error includes a machine-readable code, HTTP status mapping, and retry guidance. This catalog documents the **wire face** — the codes a client can actually receive. That is not quite the `StandardErrorCode` enum: the enum also carries in-process spellings the REST door translates at the diff --git a/content/docs/capabilities/analytics.mdx b/content/docs/capabilities/analytics.mdx index da44162f12b..0b1c38b6955 100644 --- a/content/docs/capabilities/analytics.mdx +++ b/content/docs/capabilities/analytics.mdx @@ -1,7 +1,7 @@ --- title: Analytics — dashboards, reports and charts navTitle: Analytics & Dashboards -description: ~20 chart families, period-over-period comparison, runtime filters, TV display pages, and four report shapes +description: Chart families, period-over-period comparison, runtime filters, TV display pages, and the report shapes --- @@ -9,7 +9,7 @@ The executive cockpit and the ops detail report are both configured, not built. ## Dashboards -Compose from roughly twenty chart families: +Compose from the chart families: - **Single values**: KPI tiles, gauges, progress rings — total pipeline, quarter-to-date closed, target attainment. - **Comparisons**: bar and column by stage, rep, or product line. @@ -26,7 +26,7 @@ Dashboard extras that matter in practice: ## Reports -Four shapes — **tabular** (detail rows), **summary** (grouped totals), **matrix** (regions × quarters), and **joined** (several dataset panels) — with runtime filters and export. +The shapes — **tabular** (detail rows), **summary** (grouped totals), **matrix** (regions × quarters), and **joined** (several dataset panels) — with runtime filters and export. > **In HotCRM**: four dashboards (executive, sales, service, CRM overview) and six reports (lead, opportunity, account, case, churn), fed by six shared datasets covering accounts, contacts, leads, opportunities, products, and cases. The executive dashboard carries quarter and owner filters plus the funnel and trend widgets described above. diff --git a/content/docs/capabilities/approvals.mdx b/content/docs/capabilities/approvals.mdx index 893d82c1e22..6ad9cc229bd 100644 --- a/content/docs/capabilities/approvals.mdx +++ b/content/docs/capabilities/approvals.mdx @@ -1,13 +1,13 @@ --- title: Approvals — routing, queues and audit trail navTitle: Approvals -description: Seven ways to pick approvers, four decision modes including group sign-off, record locking, overdue escalation, and send-back-for-revision +description: Ways to pick approvers, decision modes including group sign-off, record locking, overdue escalation, and send-back-for-revision --- Discounts, contracts, spend — anything that needs a human "yes" becomes an approval step in a flow, replacing the group-chat shoulder tap with a tracked, enforceable decision. -## Who approves — seven resolution styles +## Who approves — the resolution styles A specific person · everyone holding a position (e.g. sales managers) · the submitter's direct manager (needs each user's manager set — see below) · a team · a department (optionally including sub-departments) · organization leadership · **a person named on the record itself** (e.g. the "regional director" field). @@ -23,7 +23,7 @@ request opens and waits for an administrator. The details, and the fallback that data at all, are in [Automation → Approvals](/docs/automation/approvals). -## How it passes — four decision modes +## How it passes — the decision modes | Mode | Rule | Fits | |---|---|---| diff --git a/content/docs/capabilities/automation.mdx b/content/docs/capabilities/automation.mdx index 42cd9c0abcb..1e312f42f85 100644 --- a/content/docs/capabilities/automation.mdx +++ b/content/docs/capabilities/automation.mdx @@ -1,7 +1,7 @@ --- title: Automation — processes that run themselves navTitle: Automation — Processes That Run Themselves -description: Five trigger styles, visual flow diagrams, notifications, branching, loops, waits, and external calls — the work nobody should have to remember +description: Trigger styles, visual flow diagrams, notifications, branching, loops, waits, and external calls — the work nobody should have to remember --- diff --git a/content/docs/capabilities/data.mdx b/content/docs/capabilities/data.mdx index 570dc513787..9640b9b8c58 100644 --- a/content/docs/capabilities/data.mdx +++ b/content/docs/capabilities/data.mdx @@ -1,7 +1,7 @@ --- title: Business data — objects, fields and records navTitle: Manage Business Data -description: Objects, 40+ field types, auto-computed fields, and relationships — every spreadsheet you run the business on, structured and governed +description: Objects, field types, auto-computed fields, and relationships — every spreadsheet you run the business on, structured and governed --- diff --git a/content/docs/capabilities/index.mdx b/content/docs/capabilities/index.mdx index 7e3dd53c788..26616bf32d9 100644 --- a/content/docs/capabilities/index.mdx +++ b/content/docs/capabilities/index.mdx @@ -12,13 +12,13 @@ If you are a developer, the [Build sections](/docs/data-modeling) cover the same ## The capabilities - - + + - - - - + + + + diff --git a/content/docs/capabilities/views.mdx b/content/docs/capabilities/views.mdx index e22e2fa403b..811b2172127 100644 --- a/content/docs/capabilities/views.mdx +++ b/content/docs/capabilities/views.mdx @@ -27,7 +27,7 @@ One object can carry many named views at once — "My open deals (table)", "East - **Global search** (`⌘K`) spans objects and understands partial matches — including **pinyin search**, so typing `zhangsan` finds 张三. - **Filters** combine any fields with and/or logic and a full operator set (equals, contains, greater than, between, is empty…). -- **Relative dates**: "this quarter", "last month", "past 7 days", "next 30 days" — 36 built-in tokens plus custom offsets. A saved view filtered on "this quarter" rolls forward every day by itself. +- **Relative dates**: "this quarter", "last month", "past 7 days", "next 30 days" — built-in tokens plus custom offsets. A saved view filtered on "this quarter" rolls forward every day by itself. - **Per-person scoping**: views like "My accounts" or "My team's opportunities" resolve per viewer automatically, following the permission model. > **In HotCRM**: twelve view files cover every object — open the Opportunity object and switch between its pipeline kanban, forecast table, and close-date calendar to feel the difference lenses make. diff --git a/content/docs/frontend/architecture-overview.mdx b/content/docs/frontend/architecture-overview.mdx index 37aa504d861..192fca05dd7 100644 --- a/content/docs/frontend/architecture-overview.mdx +++ b/content/docs/frontend/architecture-overview.mdx @@ -314,20 +314,20 @@ packages/ │ ├── SchemaRenderer.tsx │ ├── LazyPluginLoader.tsx │ ├── context/ # All React contexts -│ └── hooks/ # 20+ hooks (useExpression, useActionRunner, etc.) -├── components/ # 91+ Shadcn UI atoms -├── fields/ # 35+ field renderers +│ └── hooks/ # Hooks (useExpression, useActionRunner, etc.) +├── components/ # Shadcn UI atoms +├── fields/ # Field renderers ├── layout/ # AppShell, Header, Sidebar ├── i18n/ # Internationalization ├── auth/ # AuthContext + providers ├── permissions/ # RBAC/ABAC -└── plugin-*/ # 20 plugin packages +└── plugin-*/ # Plugin packages ├── plugin-grid/ ├── plugin-kanban/ ├── plugin-charts/ ├── plugin-dashboard/ ├── plugin-form/ - └── ... (15 more) + └── ... ``` ## Further Reading diff --git a/content/docs/frontend/plugins/index.mdx b/content/docs/frontend/plugins/index.mdx index aff53f7650e..09a7dd8b901 100644 --- a/content/docs/frontend/plugins/index.mdx +++ b/content/docs/frontend/plugins/index.mdx @@ -21,7 +21,7 @@ Plugins are lazy-loaded component packages that: ## Official Plugins -ObjectUI provides 14+ official plugins for common use cases: +ObjectUI provides official plugins for common use cases: ### Data Visualization & Dashboards diff --git a/content/docs/plugins/packages.mdx b/content/docs/plugins/packages.mdx index 6d9c8fdc29f..d1814340be0 100644 --- a/content/docs/plugins/packages.mdx +++ b/content/docs/plugins/packages.mdx @@ -4,7 +4,7 @@ navTitle: Package Overview description: Complete guide to all ObjectStack packages, services, drivers, plugins, and adapters --- -ObjectStack is organized into **72 package manifests** across multiple categories. This guide provides an overview of the framework packages, services, drivers, plugins, and adapters in the [framework repository](https://github.com/objectstack-ai/objectstack/tree/main/packages). +ObjectStack is organized into package manifests across multiple categories. This guide provides an overview of the framework packages, services, drivers, plugins, and adapters in the [framework repository](https://github.com/objectstack-ai/objectstack/tree/main/packages). ### Package categories at a glance @@ -24,7 +24,7 @@ ObjectStack is organized into **72 package manifests** across multiple categorie **The Constitution** — Protocol schemas, types, and constants for the entire ObjectStack ecosystem. -- **Purpose**: Zod-first schema definitions for all 15 protocol domains +- **Purpose**: Zod-first schema definitions for every protocol domain - **Exports**: Builder functions (`defineStack`, `defineView`, `defineApp`, `defineFlow`, `defineAgent`, `defineTool`, `defineSkill`) from the root entry, plus `ObjectSchema.create()` for objects from the `@objectstack/spec/data` subpath. Protocol namespaces (Data, UI, System, Automation, AI, API, Identity, Security, Kernel, Marketplace, QA, Contracts, Integration, Studio, Shared) are not re-exported from the top-level entry for tree-shaking reasons — import them from subpaths such as `@objectstack/spec/data` and `@objectstack/spec/ui`. - **When to use**: Import types, schemas, and builder functions when authoring metadata. - **Documentation**: [Protocol Reference](/docs/references) diff --git a/content/docs/protocol/kernel/config-resolution.mdx b/content/docs/protocol/kernel/config-resolution.mdx index 60d49e00fe2..6025289e000 100644 --- a/content/docs/protocol/kernel/config-resolution.mdx +++ b/content/docs/protocol/kernel/config-resolution.mdx @@ -146,7 +146,7 @@ settings.registerManifest(crmSettingsManifest); ``` Keys are `snake_case` storage paths inside the namespace — `(namespace, key)`, -not a dotted global path. The full specifier vocabulary (19 types, visibility +not a dotted global path. The full specifier vocabulary (specifier types, visibility expressions, action buttons, per-key permissions) is documented in the [Settings Manifest reference](/docs/references/system/settings-manifest). diff --git a/content/docs/protocol/objectql/index.mdx b/content/docs/protocol/objectql/index.mdx index fd77bfb5462..2500763151e 100644 --- a/content/docs/protocol/objectql/index.mdx +++ b/content/docs/protocol/objectql/index.mdx @@ -111,7 +111,7 @@ fields: ### 2. Fields: Rich Type System -ObjectQL provides 20+ field types that encode business semantics: +ObjectQL's field types encode business semantics: | Field Type | Business Meaning | Example | |------------|------------------|---------| diff --git a/content/docs/protocol/objectql/query-syntax.mdx b/content/docs/protocol/objectql/query-syntax.mdx index ca8f98a9e91..ed169b6e2b9 100644 --- a/content/docs/protocol/objectql/query-syntax.mdx +++ b/content/docs/protocol/objectql/query-syntax.mdx @@ -347,7 +347,7 @@ metacharacters — `{ name: { $icontains: 'a.b' } }` matches `a.b` and not `axb` **If you were relying on `$contains` being loose on the in-memory driver, that is a row-set change: write `$icontains` when you want a fold.** The shared standard both halves are measured against is `FILTER_TEXT_CASES` - (`@objectstack/spec/data`), which all five drivers now run. + (`@objectstack/spec/data`), which every driver now runs. ### `$regex` — removed @@ -1038,7 +1038,7 @@ const query: QueryAST = { **Schema enum:** `count`, `sum`, `avg`, `min`, `max`, `count_distinct`. -All six functions are computed on every backend. `count_distinct` lowers to +All of them are computed on every backend. `count_distinct` lowers to `COUNT(DISTINCT field)` on `SqlDriver` and on the Turso driver (both transports), and is computed by the MongoDB driver, the in-memory driver and the engine's in-memory aggregation fallback. A function the schema enum never declared (`median`) is @@ -1214,7 +1214,7 @@ label→value mapping in the expansion rather than by the operator. `driver-memory` used on its query and analytics faces. **On CASE** — this callout's subject — the divergence it warned about is closed: running your tests on the in-memory double no longer returns rows a SQL or MongoDB deployment would not - because of a fold, and `FILTER_TEXT_CASES` holds all five drivers to that rule. + because of a fold, and `FILTER_TEXT_CASES` holds every driver to that rule. ⚠️ **One axis is NOT aligned, it is not a case question, and which answer you see depends on how you reach the data.** **Through the engine** — `ql.find()` and every surface above it (REST `where` / `$filter`, flow node filters, list views) — a text diff --git a/content/docs/protocol/objectql/schema.mdx b/content/docs/protocol/objectql/schema.mdx index 77b10e8f1ab..eafa8e74776 100644 --- a/content/docs/protocol/objectql/schema.mdx +++ b/content/docs/protocol/objectql/schema.mdx @@ -1033,7 +1033,7 @@ indexes: z.enum([ 'object', // Business entity definition (ObjectSchema) 'field', // Standalone field definition (FieldSchema) // ADR-0088: there is no `trigger` metadata type — sync data-layer logic is a - // `hook` (24 lifecycle events); async automation is a `record_change` flow. + // `hook`; async automation is a `record_change` flow. // (The `triggers` capability token in `requires:` is a different namespace.) // ADR-0088 (#4509): there is no `validation` metadata type — validation rules // are authored INLINE as `object.validations[]`, which is the only shape the diff --git a/skills/objectstack-automation/SKILL.md b/skills/objectstack-automation/SKILL.md index b77e944670f..f62b522677f 100644 --- a/skills/objectstack-automation/SKILL.md +++ b/skills/objectstack-automation/SKILL.md @@ -51,7 +51,7 @@ A **Flow** is a directed graph of nodes — the primary automation building bloc ### Flow Node Types -Flows are built from **20 built-in node types** (plugins register more, e.g. +Flows are built from **built-in node types** (plugins register more, e.g. `approval`): #### Control Flow diff --git a/skills/objectstack-data/SKILL.md b/skills/objectstack-data/SKILL.md index 3513dbc6467..fc622adefed 100644 --- a/skills/objectstack-data/SKILL.md +++ b/skills/objectstack-data/SKILL.md @@ -38,12 +38,12 @@ metadata: For comprehensive documentation with incorrect/correct examples: - **[Naming Conventions](./rules/naming.md)** — snake_case rules, option values, config properties -- **[Field Types](./rules/field-types.md)** — All 49 field types and configs +- **[Field Types](./rules/field-types.md)** — All field types and configs - **[Relationships](./rules/relationships.md)** — lookup vs master_detail, junction patterns, delete behaviors - **[Validation Rules](./rules/validation.md)** — All validation types, script inversion, severity levels - **[Index Strategy](./rules/indexing.md)** — btree/gin/gist/fulltext, composite indexes, partial indexes - **[Data Lifecycle & Retention](./rules/lifecycle.md)** — `lifecycle` classes (record/audit/telemetry/transient/event), retention/TTL/rotation/archive policies; ❗ append-only objects must declare one (distinct from lifecycle *hooks* below) -- **[Lifecycle Hooks](./references/data-hooks.md)** — the 8 lifecycle events, `handler` vs sandboxed `body` (ctx + capability contract), registration, canonical patterns +- **[Lifecycle Hooks](./references/data-hooks.md)** — the lifecycle events, `handler` vs sandboxed `body` (ctx + capability contract), registration, canonical patterns - **[Datasources & Federation](./rules/datasources.md)** — `defineDatasource`, external/federated objects (`remoteName`/`columnMap`), auto-connect gating, credentials; ❌ no `field.columnName` on external objects - **[Security & Access Control](./rules/security.md)** — permission sets, assignment rows, RLS policies, `secret` / `requiredPermissions`, `tenancy`, platform-global posture @@ -294,7 +294,7 @@ lowercase option values — incorrect/correct examples: [rules/naming.md](./rule ### Field Type Selection -49 types — the full table, per-type config and traps: [rules/field-types.md](./rules/field-types.md). +The full table, per-type config and traps: [rules/field-types.md](./rules/field-types.md). From here, three to get right: credentials are `secret` (reversible, **encrypted-at-rest** via the registered `ICryptoProvider`, masked on read, fail-closed, ADR-0100) — never `password`, which on a generic object is **plaintext at rest**; `user` is a person picker diff --git a/skills/objectstack-data/references/data-hooks.md b/skills/objectstack-data/references/data-hooks.md index 397cf30f330..5cd76cd243f 100644 --- a/skills/objectstack-data/references/data-hooks.md +++ b/skills/objectstack-data/references/data-hooks.md @@ -7,7 +7,7 @@ - [Best Practices](#best-practices) · [Error Handling](#error-handling) · [References](#references) Reference companion to `objectstack-data/SKILL.md`, and the catalog's anchor for -data hooks. Covers the 8 lifecycle events, the inline `handler` and sandboxed +data hooks. Covers the lifecycle events, the inline `handler` and sandboxed `body` forms, the `HookContext` API, registration, and the canonical patterns (delete guards, audit trails, cross-object writes, read masking). @@ -28,7 +28,7 @@ They intercept operations at specific points (before/after) and can: ### Hook Lifecycle Events -ObjectStack provides **8 lifecycle events** organized by operation type: +ObjectStack provides lifecycle events organized by operation type: | Event | When It Fires | Use Cases | |:------|:--------------|:----------| @@ -43,7 +43,7 @@ ObjectStack provides **8 lifecycle events** organized by operation type: | `beforeDelete` | Before deleting a record (single **or** bulk `multi:true`) | Check dependencies, prevent deletion | | `afterDelete` | After deleting a record (single **or** bulk) | Clean up related data, notify users | -> **Why only 8?** The read events fire for `findOne` as well as `find` (the event +> **Why so few?** The read events fire for `findOne` as well as `find` (the event > attaches to record materialization, not the engine method), so one subscription > covers every read shape — there is no `beforeFindOne`/`afterFindOne`. Likewise the > write events fire on bulk `multi:true` operations, so there is no `*Many` event. A diff --git a/skills/objectstack-data/rules/field-types.md b/skills/objectstack-data/rules/field-types.md index 2e9cf5472ed..780dc0ed9b7 100644 --- a/skills/objectstack-data/rules/field-types.md +++ b/skills/objectstack-data/rules/field-types.md @@ -6,7 +6,7 @@ - [Common Field Configurations](#common-field-configurations) - [Incorrect vs Correct](#incorrect-vs-correct) -Quick reference for choosing the right field type from 49 available options. +Quick reference for choosing the right field type from the available options. ## Two spellings: `Field.*` factory or object literal diff --git a/skills/objectstack-query/SKILL.md b/skills/objectstack-query/SKILL.md index 4d1685427d2..41745bea948 100644 --- a/skills/objectstack-query/SKILL.md +++ b/skills/objectstack-query/SKILL.md @@ -22,7 +22,7 @@ metadata: | Surface | Shape | Legal option keys | |:--|:--|:--| -| engine `find` / `findOne` | `engine.find('task', {…}, { context })` | `context`, `where`, `fields`, `orderBy`, `limit`, `offset`, `search`, `searchFields`, `expand` — **plus** the six driver passthrough keys `transaction`, `tenantId`, `tenantIds`, `timezone`, `bypassTenantAudit`, `preserveAudit` | +| engine `find` / `findOne` | `engine.find('task', {…}, { context })` | `context`, `where`, `fields`, `orderBy`, `limit`, `offset`, `search`, `searchFields`, `expand` — **plus** the driver passthrough keys `transaction`, `tenantId`, `tenantIds`, `timezone`, `bypassTenantAudit`, `preserveAudit` | | engine `aggregate` | `engine.aggregate('deal', {…})` | `context`, `where`, `groupBy`, `aggregations`, `having`, `timezone`, `search`, `searchFields` — the two search keys filter the input rows **before** grouping, AND-ed with `where`, exactly as on `find` | | engine `count` | `engine.count('task', {…})` | `context`, `where` | | protocol / REST | `findData({ object: 'task', query: {…} })` | `object` sits OUTSIDE the query | @@ -235,7 +235,7 @@ rule and the pitfalls are **[pagination rules](./rules/pagination.md)**. ## Aggregation -The six functions (`count`, `sum`, `avg`, `min`, `max`, `count_distinct`), date +The functions (`count`, `sum`, `avg`, `min`, `max`, `count_distinct`), date bucketing, `having`, and the per-measure `filter` are **[aggregation rules](./rules/aggregation.md)**. The call shape: diff --git a/skills/objectui/README.md b/skills/objectui/README.md index fe084fb37fd..a30202ffa7e 100644 --- a/skills/objectui/README.md +++ b/skills/objectui/README.md @@ -55,7 +55,7 @@ The published packages this skill covers. Nothing checks this list against the - **Parsing & runtime:** `@objectstack/sdui-parser`, `react-runtime` - **Integration:** `@object-ui/app-shell`, `providers`, `data-objectstack` - **Platform features:** `@object-ui/auth`, `permissions`, `i18n`, `mobile`, `collaboration` -- **Plugins (18):** `plugin-{grid, list, detail, form, kanban, calendar, timeline, gantt, dashboard, report, charts, map, editor, markdown, view, tree, designer, chatbot}` +- **Plugins:** `plugin-{grid, list, detail, form, kanban, calendar, timeline, gantt, dashboard, report, charts, map, editor, markdown, view, tree, designer, chatbot}` - **Tooling:** `@object-ui/cli`, `create-plugin` ## Reference diff --git a/skills/objectui/guides/plugin-development.md b/skills/objectui/guides/plugin-development.md index fed0ac9fb12..2a96ac8c91f 100644 --- a/skills/objectui/guides/plugin-development.md +++ b/skills/objectui/guides/plugin-development.md @@ -82,8 +82,8 @@ ComponentRegistry.register('my-widget', MyWidgetRenderer, { | `tags` | `string[]` | Free-form grouping tags | | `description` | `string` | Longer description for the designer | -Sixteen keys in total: the eleven on `ComponentMeta` (`@object-ui/types` -`base.ts`) plus the five `RegistryComponentMetaExtras` the registry adds +The keys in total: those on `ComponentMeta` (`@object-ui/types` +`base.ts`) plus the `RegistryComponentMetaExtras` the registry adds (`tier`, `namespace`, `skipFallback`, `labelling`, `deprecated`). ### ComponentInput types @@ -92,14 +92,14 @@ Sixteen keys in total: the eleven on `ComponentMeta` (`@object-ui/types` ```typescript import type { ComponentInput, ComponentInputControlType } from '@object-ui/types'; -// The eleven control kinds, taken from the published union rather than retyped. +// The control kinds, taken from the published union rather than retyped. const controlTypes: ComponentInputControlType[] = [ 'string', 'number', 'boolean', 'enum', 'array', 'object', 'color', 'date', 'code', 'file', 'slot', ]; -// A manifest's inputs, checked against the published type. SIX keys are -// writable — `name`, `type`, `of`, `required`, `enum`, `description`. +// A manifest's inputs, checked against the published type. The writable +// keys — `name`, `type`, `of`, `required`, `enum`, `description`. const inputs: ComponentInput[] = [ { name: 'title', type: 'string', required: true, description: 'Heading text' }, // ONE control type, or an ARRAY of them when the input accepts several diff --git a/skills/objectui/guides/schema-expressions.md b/skills/objectui/guides/schema-expressions.md index 413df5b154b..74190d7c1d2 100644 --- a/skills/objectui/guides/schema-expressions.md +++ b/skills/objectui/guides/schema-expressions.md @@ -228,7 +228,7 @@ ${DATEDIFF(startDate, endDate, 'days')} ${DATEFORMAT(createdAt, 'YYYY-MM-DD')} ``` -That is the whole registry — **30 functions**, all of them registered by +That is the whole registry, all of it registered by `FormulaFunctions.registerDefaults()`. `register(name, fn)` upper-cases the name, so calls are case-insensitive. diff --git a/ui/apps/console/README.md b/ui/apps/console/README.md index 9e3adf06bf9..f7502770d75 100644 --- a/ui/apps/console/README.md +++ b/ui/apps/console/README.md @@ -8,7 +8,7 @@ The standard runtime UI for ObjectStack applications. This package provides the - **Server-Driven UI**: Renders objects, views, dashboards, reports, and pages from JSON schemas - **Multi-App Support**: Switch between apps defined in your stack, each with its own branding -- **Plugin Architecture**: 15+ view plugins (grid, kanban, calendar, timeline, chart, map, gantt, gallery, etc.) +- **Plugin Architecture**: view plugins (grid, kanban, calendar, timeline, chart, map, gantt, gallery, etc.) - **Expression Engine**: Dynamic visibility, disabled, and hidden expressions evaluated at runtime - **CRUD Operations**: Create, edit, delete records via schema-driven forms and dialogs - **Command Palette**: `⌘+K` for quick navigation across apps and objects diff --git a/ui/packages/app-shell/src/views/metadata-admin/i18n.ts b/ui/packages/app-shell/src/views/metadata-admin/i18n.ts index 4a1b77bcbfd..41adfa441fc 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/i18n.ts +++ b/ui/packages/app-shell/src/views/metadata-admin/i18n.ts @@ -3,7 +3,7 @@ /** * Metadata admin i18n bundle (Phase 3f). * - * Lightweight static label table for the 27 built-in metadata types, + * Lightweight static label table for the built-in metadata types, * plus a tiny `t()` helper for engine UI strings. * * Why not i18next? The engine already consumes `label` from the @@ -732,7 +732,7 @@ const ENUM_FIELD_TO_META: Record = { * Localized label for a raw JSON-Schema enum option in the metadata SchemaForm * (e.g. the flow `type` picker: `autolaunched` → 自动启动). Keyed by field name * so it's unambiguous; English (and any value not translated) shows the raw - * value, so unknown enums across the 27 metadata types are never hidden. Reuses + * value, so unknown enums across the metadata types are never hidden. Reuses * {@link FLOW_META_ZH} for type/status/runAs, plus an `engine.enum..` * strings-table extension point for anything else. */ diff --git a/ui/packages/app-shell/src/views/metadata-admin/registry.ts b/ui/packages/app-shell/src/views/metadata-admin/registry.ts index 254616551f7..e1029d6af16 100644 --- a/ui/packages/app-shell/src/views/metadata-admin/registry.ts +++ b/ui/packages/app-shell/src/views/metadata-admin/registry.ts @@ -4,7 +4,7 @@ * MetadataResourceRegistry — per-type overrides for the generic metadata * admin engine (Phase 3c). * - * The engine drives all 27 metadata types from a single ListPage / + * The engine drives every metadata type from a single ListPage / * EditPage / HistoryPage shell. By default everything is rendered via * a JSONSchema-driven AutoForm (using the rich `/meta/types` registry * row's `schema` field). Specialised editors (ObjectManager, diff --git a/ui/packages/components/README.md b/ui/packages/components/README.md index 06936761e45..84093f7eba5 100644 --- a/ui/packages/components/README.md +++ b/ui/packages/components/README.md @@ -6,7 +6,7 @@ Standard UI component library for Object UI, built with Shadcn UI + Tailwind CSS - 🎨 **Tailwind Native** - Built entirely with Tailwind CSS utility classes - 🧩 **Shadcn UI** - Based on Radix UI primitives for accessibility -- 📦 **60+ Components** - Complete set of UI components (46 from Shadcn + 14 custom) +- 📦 **Components** - A complete set of UI components, Shadcn's plus custom ones - ♿ **Accessible** - WCAG compliant components - 🎯 **Type-Safe** - Full TypeScript support - 🔌 **Extensible** - Easy to customize and extend diff --git a/ui/packages/fields/README.md b/ui/packages/fields/README.md index 60ed762b355..963ac486842 100644 --- a/ui/packages/fields/README.md +++ b/ui/packages/fields/README.md @@ -341,7 +341,7 @@ single dropdown does. `visibleWhen` CEL predicate (offered only when TRUE, evaluated against the live record + `current_user`) and a field-level `dependsOn`. Together they drive dependent selects (country → province → city) and role-gated options with no -bespoke matrix — the same primitives dependent lookups use. All four widgets +bespoke matrix — the same primitives dependent lookups use. All of these widgets resolve this through the shared [`useCascadingOptions`](./src/widgets/useCascadingOptions.ts) hook, which wraps the pure `resolveCascadingOptions` helper in `@object-ui/core` (also used by the form renderer's inline pre-filter, so gating and filtering @@ -351,7 +351,7 @@ change re-filters the list and clears a now-invalid value (scalar `select` / offered-out entries). An option whose `label` is blank (the empty string is a legal label; an absent one is not) displays its `value` instead of an empty row, on the editable and the read-only -path alike — all eight read sites across the four widgets share the one +path alike — every read site across these widgets shares the one `optionDisplayLabel` helper in `@object-ui/core` (objectui#9230). Client-side hiding is UX only — gate authorization-sensitive values on the server too. See diff --git a/ui/packages/i18n/README.md b/ui/packages/i18n/README.md index a8ba291fa1e..f604a144957 100644 --- a/ui/packages/i18n/README.md +++ b/ui/packages/i18n/README.md @@ -356,7 +356,7 @@ isRTL('en'); // false Server-driven metadata types a label as a plain string **or** an inline per-locale map (`{ en: 'Pricing', 'zh-CN': '定价' }`). An authoring surface that shows one locale in one text input has to answer three separate questions, so -there are three functions and each answers exactly one: +there is one function per question: ```tsx import { pickLocalized, setLocalized, clearLocalized } from '@object-ui/i18n'; diff --git a/ui/packages/i18n/src/namespaces/studio/zh.ts b/ui/packages/i18n/src/namespaces/studio/zh.ts index 558f5535d97..9cac5831f18 100644 --- a/ui/packages/i18n/src/namespaces/studio/zh.ts +++ b/ui/packages/i18n/src/namespaces/studio/zh.ts @@ -3187,7 +3187,7 @@ const STUDIO_ZH: Record = { // is a Chinese name and a short Chinese phrase. // // This is a translation, not an override. The English stays exactly where - // the other 21 node types keep theirs — `defineActionDescriptor` in the + // the other node types keep theirs — `defineActionDescriptor` in the // framework's plugin-approvals — and `translateNodeLabel`/`translateNodeHint` // fall back to it whenever this table has no row, which is the whole reason // the en table carries no `engine.flowNode.*` entry at all. Wording follows diff --git a/ui/packages/plugin-form/README.md b/ui/packages/plugin-form/README.md index e4178e88a66..c2984ff2902 100644 --- a/ui/packages/plugin-form/README.md +++ b/ui/packages/plugin-form/README.md @@ -965,7 +965,7 @@ with no adapter to fetch it and no host seam to hand the values to — **refuses the submit with `DataSource is required for form submission (inline mode not configured)`. The error reaches `schema.onError` and is rethrown. -This is uniform across all five renderers (`simple`, `tabbed`, `wizard`, +This is uniform across all renderers (`simple`, `tabbed`, `wizard`, `drawer`, `modal`). It used to be uniform in the other direction: the five variant renderers answered an adapter-less submit by calling `onSuccess` and returning, which reported a save that never happened and, through diff --git a/ui/packages/plugin-grid/README.md b/ui/packages/plugin-grid/README.md index fc381f8bc5f..a4163bd4eae 100644 --- a/ui/packages/plugin-grid/README.md +++ b/ui/packages/plugin-grid/README.md @@ -98,7 +98,7 @@ ComponentRegistry.register('my-grid', ObjectGridRenderer, { ### Exports -The complete public surface — 20 values and 29 types: +The complete public surface: ```typescript import { diff --git a/ui/packages/types/README.md b/ui/packages/types/README.md index ceef56ca4b9..4ee9fe79656 100644 --- a/ui/packages/types/README.md +++ b/ui/packages/types/README.md @@ -406,7 +406,7 @@ Full TypeScript support with discriminated unions: ```typescript import type { AnySchema, ButtonSchema, FormSchema, InputSchema } from '@object-ui/types'; -// The shipped `AnySchema` carries 50+ members. These three are a slice of it, +// The shipped `AnySchema` carries many members. These three are a slice of it, // and the assignment below is what proves the slice really is part of the union. type SchemaSlice = InputSchema | ButtonSchema | FormSchema; declare const slice: SchemaSlice;