Skip to content

Commit c7c51c4

Browse files
os-zhuangclaude
andauthored
docs(releases): add Releases section with curated v9.0.0 release notes (#1702)
Adds a per-version release-notes section to the docs site for third-party developers. One page per release train version (all @objectstack/* packages are changesets-fixed), covering both the framework packages and the Console UI delta (derived from the .objectui-sha pin range). - content/docs/releases/v9.mdx — v9.0.0 notes: breaking changes with migration tables (ADR-0021 single-form cutover, ChartTypeSchema trim, OS_* settings env vars, @object-ui/plugin-workflow removal), framework and Console features, fixes, upgrade checklist. - content/docs/releases/index.mdx — section overview, versioning policy, pointers to per-package changelogs and ADRs. - scripts/collect-release-notes.sh — collects the raw material for the next release page: changesets consumed in a tag range plus the objectui commit range between the .objectui-sha pins. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent c1698df commit c7c51c4

5 files changed

Lines changed: 301 additions & 1 deletion

File tree

content/docs/meta.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"---",
88
"protocol",
99
"---",
10-
"references"
10+
"references",
11+
"---",
12+
"releases"
1113
]
1214
}

content/docs/releases/index.mdx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: Overview
3+
description: Release notes for the ObjectStack platform — framework packages and the Console UI, summarized per version for app and plugin developers.
4+
---
5+
6+
ObjectStack ships as a single release train: all `@objectstack/*` packages are
7+
version-locked, so one version number describes the whole platform. The
8+
Console UI (built from the [objectui](https://github.com/objectstack-ai/objectui)
9+
repository) is frozen into `@objectstack/console` at release time, so each
10+
release note here also covers what changed in Studio/Console.
11+
12+
Each release page is written for **third-party developers** building apps,
13+
plugins, or clients on ObjectStack. It leads with breaking changes and
14+
migration steps, then covers new capabilities and notable fixes.
15+
16+
## Versions
17+
18+
- [v9.0.0](/docs/releases/v9) — Analytics single-form cutover (ADR-0021), honest chart taxonomy, canonical `OS_*` settings env vars, Google sign-in, AI build experience.
19+
20+
## Where the fine-grained changelogs live
21+
22+
These pages are curated summaries. For exhaustive, per-package detail:
23+
24+
- **Framework packages** — every package ships a `CHANGELOG.md` generated from
25+
[changesets](https://github.com/changesets/changesets), visible on npm and in
26+
the [framework repository](https://github.com/objectstack-ai/framework).
27+
- **Console UI** — the [objectui CHANGELOG](https://github.com/objectstack-ai/objectui/blob/main/CHANGELOG.md)
28+
follows Keep a Changelog.
29+
- **Design decisions** — breaking changes reference their
30+
[ADRs](https://github.com/objectstack-ai/framework/tree/main/docs/adr), which
31+
record the rationale.
32+
33+
## Versioning policy
34+
35+
ObjectStack follows [Semantic Versioning](https://semver.org). A **major**
36+
release may remove or change schemas in `@objectstack/spec`, public APIs, CLI
37+
flags, or environment variables — always with a migration path documented in
38+
the release notes. **Minor** releases add capabilities without breaking
39+
existing metadata or code. **Patch** releases fix bugs.

content/docs/releases/meta.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"title": "Releases",
3+
"pages": ["index", "v9"]
4+
}

content/docs/releases/v9.mdx

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
---
2+
title: v9.0.0
3+
description: Analytics single-form cutover (ADR-0021), honest chart taxonomy, canonical OS_* settings env vars, Google sign-in, and a smarter AI build experience in Console.
4+
---
5+
6+
**Released June 10, 2026.** All `@objectstack/*` packages are published at 9.0.0. This is a major
7+
release: the analytics authoring surface completes its cutover to the dataset
8+
semantic layer, the chart taxonomy is trimmed to what actually renders, and
9+
settings environment variables move to their canonical `OS_*` form.
10+
11+
**TL;DR for upgraders:** if your app defines dashboards, reports, or list
12+
charts with inline queries (`object` + `aggregate` + field names), you must
13+
migrate them to named datasets. If you configure settings via environment
14+
variables, rename them to `OS_<NAMESPACE>_<KEY>`. Everything else is additive.
15+
16+
## Breaking changes
17+
18+
### 1. Analytics single-form cutover — datasets are now required (ADR-0021)
19+
20+
The inline analytics author surface is removed from `@objectstack/spec`. Every
21+
dashboard widget, report, and list chart must now bind a semantic **dataset**
22+
and select dimensions/measures **by name**. Define a metric once, reference it
23+
everywhere.
24+
25+
Removed from the spec:
26+
27+
| Schema | Removed properties | Now required |
28+
|:---|:---|:---|
29+
| `DashboardWidget` | `object`, `categoryField`, `categoryGranularity`, `valueField`, `aggregate`, `measures` (and the `WidgetMeasure` type) | `dataset` + `values` |
30+
| `Report` | top-level and joined-block `objectName`, `columns`, `groupingsDown`, `groupingsAcross`, `filter` | `dataset` + `values` (`rows` are the dimensions) |
31+
| `ListChart` | `xAxisField`, `yAxisFields`, `aggregation`, `groupByField` | `dataset` + `values` |
32+
33+
**Migration:**
34+
35+
1. For each inline query, create a dataset with `defineDataset(...)` declaring
36+
its dimensions and measures. See the
37+
[Analytics Datasets guide](/docs/guides/analytics-datasets).
38+
2. Point the widget/report/chart at it: `dataset: "<name>"`, pick `values`
39+
(measure names) and `dimensions`/`rows` (dimension names).
40+
3. Presentation-scope filtering goes through the widget's `filter`, which is
41+
applied as the dataset's `runtimeFilter`.
42+
4. A flat record listing (the former `tabular` report or inline list) is not an
43+
analytics dataset — model it as an object-bound **ListView** (ADR-0017).
44+
45+
> Rationale: [ADR-0021 — Analytics: one semantic dataset layer](https://github.com/objectstack-ai/framework/blob/main/docs/adr/0021-analytics-dataset-semantic-layer.md)
46+
47+
### 2. `ChartTypeSchema` trimmed to distinctly-renderable families
48+
49+
Eight chart types that only ever rendered as their base chart are removed, so
50+
the taxonomy no longer advertises variants the renderer doesn't draw. Update
51+
any widget or series using a removed type to its base:
52+
53+
| Removed type | Use instead |
54+
|:---|:---|
55+
| `grouped-bar`, `stacked-bar`, `bi-polar-bar` | `bar` |
56+
| `stacked-area` | `area` |
57+
| `step-line`, `spline` | `line` |
58+
| `pyramid` | `funnel` |
59+
| `bubble` | `scatter` |
60+
61+
Kept: `bar` / `horizontal-bar` / `column`, `line` / `area`, `pie` / `donut` /
62+
`funnel`, `scatter`, `treemap` / `sankey`, `radar`, `table` / `pivot`, and the
63+
single-value performance family (`metric` / `kpi` / `gauge` / `solid-gauge` /
64+
`bullet`). Removed variants can return behind an opt-in renderer once a real
65+
renderer and data model back them.
66+
67+
### 3. Settings env overrides: canonical `OS_<NAMESPACE>_<KEY>` only
68+
69+
`@objectstack/service-settings` no longer accepts unprefixed aliases for
70+
settings-namespace environment overrides. Rename your deployment variables:
71+
72+
| Before | After |
73+
|:---|:---|
74+
| `AI_OPENAI_BASE_URL` (or `ai.openai_base_url`) | `OS_AI_OPENAI_BASE_URL` |
75+
| `FEATURE_FLAGS_AI_ENABLED` | `OS_FEATURE_FLAGS_AI_ENABLED` |
76+
77+
The general rule: `OS_` + namespace + key, upper-snake-cased. See the
78+
[Environment Variables guide](/docs/guides/environment-variables).
79+
80+
### 4. `@object-ui/plugin-workflow` removed
81+
82+
The package authored BPMN-style workflow shapes the ObjectStack automation
83+
engine does not execute (ADR-0020, ADR-0031). If you imported it in a custom
84+
UI, the replacements ship already: flow authoring is the metadata-admin
85+
`FlowCanvas` (engine-registry-driven palette) in `@object-ui/app-shell`, run
86+
history is `FlowRunsPanel`, and approval UI comes from the framework's
87+
`@objectstack/plugin-approvals`.
88+
89+
## New in the framework
90+
91+
### Analytics results are now presentation-ready
92+
93+
Three `@objectstack/service-analytics` improvements make charts and reports
94+
human-readable with no frontend work:
95+
96+
- **Dimension display labels.** A `select` dimension shows its option label
97+
(`Backlog`, not `backlog`); a `lookup`/`master_detail` dimension shows the
98+
related record's display name instead of its foreign-key id. Resolution
99+
happens server-side in `queryDataset`.
100+
- **Date dimensions bucket and format by granularity.** A monthly trend chart
101+
now yields one point per month with sort-stable labels (`2026`, `2026-Q2`,
102+
`2026-04`) — no more raw epoch milliseconds on the axis.
103+
- **Measure label and format travel with the result.** `AnalyticsResult.fields[]`
104+
gains optional `label` and `format`, so a chart can display "Tasks" and
105+
"$616,000" while keeping raw numbers for plotting.
106+
107+
### Auth: Google sign-in and an extension hook
108+
109+
`@objectstack/plugin-auth` binds the `auth` settings namespace to better-auth
110+
runtime configuration and exposes an extension hook for provider packages.
111+
Google sign-in works out of the box — configure it in **Setup →
112+
Authentication** or via deployment-level `GOOGLE_CLIENT_ID` /
113+
`GOOGLE_CLIENT_SECRET`. See [Auth & SSO](/docs/guides/auth-sso).
114+
115+
### CLI: AI provider SDKs bundled
116+
117+
The CLI now ships `@ai-sdk/openai`, `@ai-sdk/anthropic`, and `@ai-sdk/google`
118+
as direct dependencies. A globally-installed CLI can configure any
119+
OpenAI-compatible provider (DeepSeek, DashScope, SiliconFlow, OpenRouter,
120+
Cloudflare) without the previous "Could not build adapter for provider=…"
121+
failure.
122+
123+
## New in Console (Studio)
124+
125+
The Console build frozen into `@objectstack/console` 9.0.0 picks up the
126+
dataset cutover end-to-end, plus a round of AI-builder and designer
127+
improvements:
128+
129+
- **Dataset widgets render as their true chart type** — pie, donut, funnel,
130+
line, area, scatter, radar, treemap, sankey, table, and pivot all route to
131+
their real renderer, and metric cards display the measure's label and format.
132+
- **Reports render the dataset form** (ADR-0021), including matrix and joined
133+
variants; widget filters apply as dataset runtime filters.
134+
- **Flow designer aligned with the engine vocabulary**, with a runs panel for
135+
inspecting executions; toolbar flow/script actions now resolve the selected
136+
record correctly.
137+
- **Build-with-AI**: a live build tree streams progress while the agent
138+
scaffolds an app, finished apps can auto-publish in chat, seed-data results
139+
are surfaced, and the consumer panel no longer dumps raw tool JSON.
140+
- **Marketplace**: when cloud-bound, the Installed view reads the
141+
control-plane's install list (ADR-0007).
142+
- **Forms**: conditional rules in inline grids can now reference parent-record
143+
fields (`parent.<field>` scope).
144+
- **Pages**: `PageView` gains a console action runtime, so page-embedded
145+
actions behave like their grid/detail counterparts.
146+
- **Charts**: crowded bar-chart x-axis labels angle and truncate instead of
147+
overlapping.
148+
149+
## Notable fixes
150+
151+
- Publishing pending drafts by ref so package-less drafts can't get stuck in
152+
the metadata-admin publish queue.
153+
- `FlowRunner` closes cleanly when a terminal resume fails instead of leaving
154+
a dead dialog.
155+
- The AI service treats a stored or env-locked `provider=memory` as an explicit
156+
override, while manifest defaults keep boot-time provider auto-detection
157+
intact.
158+
159+
## Upgrade checklist
160+
161+
1. Update all `@objectstack/*` dependencies to `^9.0.0` (they are
162+
version-locked — upgrade them together).
163+
2. Migrate inline dashboard widgets, reports, and list charts to named
164+
datasets ([guide](/docs/guides/analytics-datasets)).
165+
3. Replace removed chart types with their base family (table above).
166+
4. Rename settings env vars to the `OS_<NAMESPACE>_<KEY>` form.
167+
5. Re-run your app's spec validation (`os validate`) — it will flag any
168+
metadata still using removed properties.

scripts/collect-release-notes.sh

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env bash
2+
# Collect the raw material for a release-notes page in content/docs/releases/.
3+
#
4+
# Aggregates, for the release between two framework refs:
5+
# 1. The changesets consumed by the release (full text, grouped as the
6+
# per-package CHANGELOGs were generated from them).
7+
# 2. The objectui (Console UI) commit range, derived from the .objectui-sha
8+
# pin at each ref, with feat/fix commits listed first.
9+
#
10+
# Usage:
11+
# scripts/collect-release-notes.sh <prev-ref> [<new-ref>]
12+
# scripts/collect-release-notes.sh "@objectstack/spec@8.0.1" "@objectstack/spec@9.0.0"
13+
# scripts/collect-release-notes.sh "@objectstack/spec@9.0.0" # new-ref defaults to HEAD
14+
#
15+
# Output is markdown on stdout — pipe it to a file and write the curated
16+
# release page from it:
17+
# scripts/collect-release-notes.sh "@objectstack/spec@9.0.0" > /tmp/v10-material.md
18+
19+
set -euo pipefail
20+
21+
FRAMEWORK_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
22+
OBJECTUI_ROOT="${OBJECTUI_ROOT:-$(cd "${FRAMEWORK_ROOT}/../objectui" 2>/dev/null && pwd || true)}"
23+
24+
PREV_REF="${1:?usage: collect-release-notes.sh <prev-ref> [<new-ref>]}"
25+
NEW_REF="${2:-HEAD}"
26+
27+
cd "$FRAMEWORK_ROOT"
28+
29+
echo "# Release material: ${PREV_REF}${NEW_REF}"
30+
echo
31+
32+
echo "## Framework changesets consumed in this release"
33+
echo
34+
35+
# Changesets deleted anywhere in the range were consumed by `changeset
36+
# version` for this release. (An endpoint diff would miss files added and
37+
# consumed within the same dev cycle, so walk the log instead.)
38+
consumed=$(git log --diff-filter=D --name-only --pretty=format: "${PREV_REF}".."${NEW_REF}" -- '.changeset/*.md' \
39+
| grep -v 'README' | grep . | sort -u || true)
40+
41+
if [[ -z "$consumed" ]]; then
42+
echo "_None found — is ${NEW_REF} past the 'chore: version packages' commit?_"
43+
else
44+
while IFS= read -r f; do
45+
echo "### ${f}"
46+
echo
47+
echo '```md'
48+
# The file may have been added after PREV_REF; show its last pre-deletion state.
49+
git show "$(git log --diff-filter=D --pretty=%H -1 "${NEW_REF}" -- "$f")~1:$f" 2>/dev/null \
50+
|| git show "${PREV_REF}:${f}"
51+
echo '```'
52+
echo
53+
done <<< "$consumed"
54+
fi
55+
56+
echo "## Console UI (objectui) commit range"
57+
echo
58+
59+
prev_sha=$(git show "${PREV_REF}:.objectui-sha" 2>/dev/null || true)
60+
new_sha=$(git show "${NEW_REF}:.objectui-sha" 2>/dev/null || cat .objectui-sha)
61+
62+
echo "- previous pin: \`${prev_sha:-<none>}\`"
63+
echo "- this release: \`${new_sha}\`"
64+
echo
65+
66+
if [[ -z "$prev_sha" ]]; then
67+
echo "_No .objectui-sha at ${PREV_REF}; cannot compute the range._"
68+
elif [[ "$prev_sha" == "$new_sha" ]]; then
69+
echo "_Console pin unchanged — no objectui delta in this release._"
70+
elif [[ -z "$OBJECTUI_ROOT" || ! -d "$OBJECTUI_ROOT/.git" ]]; then
71+
echo "_objectui checkout not found (set OBJECTUI_ROOT); range is ${prev_sha}..${new_sha}_"
72+
else
73+
echo "### feat / fix"
74+
echo
75+
git -C "$OBJECTUI_ROOT" log --no-merges --pretty='- %h %s' "${prev_sha}..${new_sha}" \
76+
| grep -E '^- [0-9a-f]+ (feat|fix)' || echo "_none_"
77+
echo
78+
echo "### everything else"
79+
echo
80+
git -C "$OBJECTUI_ROOT" log --no-merges --pretty='- %h %s' "${prev_sha}..${new_sha}" \
81+
| grep -Ev '^- [0-9a-f]+ (feat|fix)' || echo "_none_"
82+
fi
83+
84+
echo
85+
echo "---"
86+
echo "_Write the curated page at content/docs/releases/, register it in"
87+
echo "content/docs/releases/meta.json, and link it from index.mdx._"

0 commit comments

Comments
 (0)