Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .changeset/rename-framework-objectstack-refs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Repository-reference update for the GitHub rename `objectstack-ai/framework` -> `objectstack-ai/objectstack` (package.json repository/bugs URLs, doc links, CHANGELOG, skills-install commands, workspace file). Metadata and docs only, with no package code changes, so this releases nothing.
2 changes: 1 addition & 1 deletion .claude/skills/dogfood-verification/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ description: >
a change in the running app. NOT a customer-published skill — this is internal
agent tooling (lives in .claude/, never in the published `skills/` dir).
metadata:
# Hides this skill from interactive `npx skills add objectstack-ai/framework`
# Hides this skill from interactive `npx skills add objectstack-ai/objectstack`
# discovery. NOTE: the skills CLI's `--all` implies `--skill '*'`, which
# includes internal skills — so the hard boundary against leaking into
# customer projects is the `/skills` subpath in every advertised install
Expand Down
2 changes: 1 addition & 1 deletion .claude/workflows/docs-accuracy-audit.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const HOUSE_FACTS = `ESTABLISHED CORRECTIONS from prior doc-accuracy audits (PR
- Console/portal path is /_console — NOT /_studio.
- REST data path is /api/v1/data/{object} — NOT /api/v1/{object}. REST routes carry the /v1 prefix.
- Env vars are OS_AUTH_SECRET (not AUTH_SECRET) and OS_PORT (not PORT); nested keys use single underscore unless the schema says otherwise. Mock-server toggle is VITE_USE_MOCK_SERVER (no VITE_RUNTIME_MODE or ?mode= switch).
- The repo is github.com/objectstack-ai/framework (NOT objectstack-ai/spec). Fix broken cross-repo links/paths accordingly.
- The repo is github.com/objectstack-ai/objectstack (NOT objectstack-ai/spec). Fix broken cross-repo links/paths accordingly.
- Package names: @objectstack/<x> (e.g. @objectstack/service-cache, NOT @objectstack/services/service-cache). Some types only export via subpaths (e.g. @objectstack/spec/ui).
- Auto-generated reference docs live in content/docs/references/ and are OUT OF SCOPE — never edit them.`

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:
# Same class, same reasoning, different surface: skills/*/references/_index.md
# and the objectstack-ui react-blocks contract are generated from
# packages/spec/src and committed, and nothing regenerated them either. These
# ship to third parties via `npx skills add objectstack-ai/framework`, so the
# ship to third parties via `npx skills add objectstack-ai/objectstack`, so the
# drift is served straight to consumers' agents — 6 of 113 schema pointers named
# files the spec had already deleted or renamed.
#
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@ Other scripts: `objectui:bump` (pull only), `objectui:build`, `objectui:clean`.

When renaming a legacy var, use `readEnvWithDeprecation('OS_NEW', 'LEGACY')` from `@objectstack/types` (keeps legacy working one release). Third-party exceptions kept as-is: `NODE_ENV`, `HOME`, `OPENAI_API_KEY`, `TURSO_*`, OAuth `*_CLIENT_ID/SECRET`, `RESEND_API_KEY`, `POSTMARK_TOKEN`, `AI_GATEWAY_*`, `SMTP_*`. See #1382.
10. **File issues for out-of-scope findings — don't silently expand scope or leave them buried.** When you hit a bug, gap, or unenforced capability that's unrelated to the current task, or too large to fix in scope, open a GitHub issue (`gh issue create`) with a clear repro/decision and link it from your PR. Corollary: **never advertise or demo a capability the runtime doesn't actually deliver** (declared ≠ enforced) — fix it, trim it, or file an issue, but don't fake coverage. Example: the spec once declared 9 validation-rule types while the write-path validator enforced only 3 (`state_machine`/`script`/`cross_field`); the gap was filed as #1475 rather than demoed in the showcase, then closed by **trimming** what could never be enforced (`unique`/`async`/`custom`) and **implementing** the rest — the spec now declares 6 and `rule-validator.ts` handles all 6. Note how narrow that claim stayed even so: the evaluator was wired into insert and single-id update only, so a bulk `updateMany` silently skipped every rule — a second `declared ≠ enforced` gap one layer down, at the **call site** rather than the `switch`; filed as #3106 and closed by evaluating the bulk match set per row. A `case` label is not enforcement; check the **call site**.
11. **Worktree-first — never edit on the shared `main` checkout.** This repo is edited by **multiple agents at once**; the shared `main` tree has its HEAD switched and reset *under you*, silently clobbering uncommitted work. Before your **first file edit**, you MUST be in a dedicated worktree on a feature branch: `git worktree add ../framework-<task> -b <branch> main && cd ../framework-<task> && pnpm install`. A PreToolUse hook (`.claude/hooks/guard-main-checkout.sh`) **enforces** this — it blocks `Edit`/`Write`/`NotebookEdit` unless the edited file is in a dedicated **worktree** — a feature branch on the *shared* checkout is **not** enough (it still gets switched under you) — and it checks the **edited file's own repo**, so sibling repos (`objectui`/`cloud`) you touch are covered too (override for a deliberate non-task fix with `OS_ALLOW_MAIN_EDITS=1`). Full playbook below.
11. **Worktree-first — never edit on the shared `main` checkout.** This repo is edited by **multiple agents at once**; the shared `main` tree has its HEAD switched and reset *under you*, silently clobbering uncommitted work. Before your **first file edit**, you MUST be in a dedicated worktree on a feature branch: `git worktree add ../objectstack-<task> -b <branch> main && cd ../objectstack-<task> && pnpm install`. A PreToolUse hook (`.claude/hooks/guard-main-checkout.sh`) **enforces** this — it blocks `Edit`/`Write`/`NotebookEdit` unless the edited file is in a dedicated **worktree** — a feature branch on the *shared* checkout is **not** enough (it still gets switched under you) — and it checks the **edited file's own repo**, so sibling repos (`objectui`/`cloud`) you touch are covered too (override for a deliberate non-task fix with `OS_ALLOW_MAIN_EDITS=1`). Full playbook below.
12. **Contract-first — fix the metadata, not the runtime.** This is a metadata-driven framework: `packages/spec` is the one contract between metadata *producers* and the runtime/renderers that *consume* it. When a piece of metadata "doesn't work," ask **first**: *is it spec-compliant? is this the long-term-correct direction?* If the metadata is wrong, fix it at the **producer** and **reject it at authoring/publish** (validation / lint) so the error surfaces loudly — do **not** add a lenient alias or `??` fallback in the consumer (a node executor, the REST layer, a renderer) to tolerate off-spec input. A tolerant fallback fossilizes the wrong convention into a second de-facto contract, dilutes the spec, and hides the producer's bug — one strict contract beats N dialects. This is an **internal** contract (we own both ends), so "be liberal in what you accept" (Postel) does **not** apply — that's for untrusted boundaries. Change the **spec** only when the spec itself is genuinely wrong, and then deliberately (edit the Zod schema + migrate), never by accreting consumer-side fallbacks. The existing `cfg.filter ?? cfg.filters` / `cfg.objectName ?? cfg.object` in the flow executors are **debt to pay down, not a pattern to copy**. *Worked example:* an AI-authored `create_record` used `fieldValues` / `today()` / `{{trigger.record.id}}` while the executor reads `fields` / `{TODAY()}` / `{record.id}` → the fix was correcting the authoring skill + a publish-gate lint that rejects the wrong shape (cloud#688), **not** a `cfg.fields ?? cfg.fieldValues` runtime alias (framework#2419, rejected). Strengthens #5.

---

## Multi-agent working discipline

This repo is worked on by **multiple agents in parallel**. **Use one git
worktree per agent/task** (`git worktree add ../framework-<task> -b <branch>`;
worktree per agent/task** (`git worktree add ../objectstack-<task> -b <branch>`;
run `pnpm install` in the new tree) so file systems are physically isolated —
this is mandatory, not a preference (Prime Directive #11), and a PreToolUse hook
blocks edits made while on the shared `main` branch. Working in the shared `main`
Expand Down
10 changes: 5 additions & 5 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ required for the new Public Forms endpoints to apply guest defaults.

### Removed — Cloud control plane moved to private `objectstack-ai/cloud` repo

The framework repository (`objectstack-ai/framework`) is now open-core only.
The framework repository (`objectstack-ai/objectstack`) is now open-core only.
The hosted Cloud control plane — `apps/cloud` and
`@objectstack/service-cloud` — has been extracted to a separate, private
repository (`objectstack-ai/cloud`). Production traffic on
Expand Down Expand Up @@ -1247,7 +1247,7 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
- **Client Hono integration test timeout** — Fixed `afterAll` hook timeout in `client.hono.test.ts` by racing `kernel.shutdown()` against a 10s deadline. The shutdown can hang when pino's worker-thread flush callback never fires in CI, so the race ensures the hook completes within the 30s vitest limit.
- **CI: Replace `pnpm/action-setup@v6` with corepack** — Switched all GitHub Actions workflows (`ci.yml`, `lint.yml`, `release.yml`, `validate-deps.yml`, `pr-automation.yml`) from `pnpm/action-setup@v6` to `corepack enable` to fix persistent `ERR_PNPM_BROKEN_LOCKFILE` errors. Corepack reads the exact `packageManager` field from `package.json` (including SHA verification), ensuring the correct pnpm version is used in CI. Also bumped pnpm store cache keys to v3 and added a pnpm version verification step.
- **Broken pnpm lockfile** — Regenerated `pnpm-lock.yaml` from scratch to fix `ERR_PNPM_BROKEN_LOCKFILE` ("expected a single document in the stream, but found more") that was causing all CI jobs to fail. The previous merge of PR #1117 only included workflow cache key changes but did not carry over the regenerated lockfile.
- **service-ai: Fix navigation item labels using deprecated i18n object format** — Replaced `{ key, defaultValue }` i18n objects with plain string labels in `AIServicePlugin`'s Setup App navigation contributions, completing the `I18nLabelSchema` migration from [#1054](https://github.com/objectstack-ai/framework/issues/1054).
- **service-ai: Fix navigation item labels using deprecated i18n object format** — Replaced `{ key, defaultValue }` i18n objects with plain string labels in `AIServicePlugin`'s Setup App navigation contributions, completing the `I18nLabelSchema` migration from [#1054](https://github.com/objectstack-ai/objectstack/issues/1054).

### Added
- **MCP Runtime Server Plugin (`plugin-mcp-server`)** — New kernel plugin that exposes ObjectStack
Expand Down Expand Up @@ -1327,7 +1327,7 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
- Supports custom model selection via `AI_MODEL` environment variable
- Consistent behavior across CLI, Vercel, Docker, and custom deployments
- Dynamic import failures are handled as soft errors with automatic fallback
([#1067](https://github.com/objectstack-ai/framework/issues/1067))
([#1067](https://github.com/objectstack-ai/objectstack/issues/1067))

- **Metadata Versioning & History** — Comprehensive version history tracking and rollback capabilities
for metadata items. Key features include:
Expand Down Expand Up @@ -1359,7 +1359,7 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
union type has been replaced with `z.string()`. i18n translation keys will be auto-generated
by the framework at registration time; developers only need to provide the default-language
string value. Translations are managed through translation files, not inline i18n objects.
([#1054](https://github.com/objectstack-ai/framework/issues/1054))
([#1054](https://github.com/objectstack-ai/objectstack/issues/1054))

**Migration:** Replace any `label: { key: '...', defaultValue: 'X' }` with `label: 'X'`.
Existing plain-string labels require no changes.
Expand All @@ -1371,7 +1371,7 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
- `@objectstack/plugin-audit` — navigation item labels

### Documentation
- **README rewrite** — Rewrote `README.md` to accurately reflect the `objectstack-ai/framework`
- **README rewrite** — Rewrote `README.md` to accurately reflect the `objectstack-ai/objectstack`
repository. Updates include: corrected title ("ObjectStack Framework"), updated badges
(v4.0.1, 6,507 tests passing), fixed stale clone URL (`spec.git` → `framework.git`),
added all missing packages (`driver-sql`, `driver-turso`, `plugin-audit`, `plugin-setup`,
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,8 @@ See [Self-Hosted Deployment](https://objectstack.ai/docs/deployment/self-hosting
## Working on the framework itself

```bash
git clone https://github.com/objectstack-ai/framework.git
cd framework
git clone https://github.com/objectstack-ai/objectstack.git
cd objectstack
pnpm install # Node 18+, pnpm 8+ (corepack enable)
pnpm build # build all packages
pnpm dev # run the showcase example (REST + Console on :3000)
Expand Down Expand Up @@ -374,7 +374,7 @@ Run locally: `pnpm docs:dev`
## Community

- ⭐ **Star this repo** if ObjectStack is useful — it helps others find it.
- 🐛 Questions, bugs, or feature requests → [open an issue](https://github.com/objectstack-ai/framework/issues).
- 🐛 Questions, bugs, or feature requests → [open an issue](https://github.com/objectstack-ai/objectstack/issues).
- 🤝 Want to contribute? See [CONTRIBUTING.md](./CONTRIBUTING.md).

## License
Expand Down
4 changes: 2 additions & 2 deletions content/blog/context-window-is-the-constraint.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ truth is that "how many lines would the traditional version have been?" is a
counterfactual nobody can measure — because that version doesn't exist.

Here's what *can* be measured. This is a real, working CRM in this repository —
[`examples/app-crm`](https://github.com/objectstack-ai/framework/tree/main/examples/app-crm):
[`examples/app-crm`](https://github.com/objectstack-ai/objectstack/tree/main/examples/app-crm):
accounts, contacts, leads, opportunities with line items, activities. Views,
a dashboard, a lead-conversion flow, permission sets, an action, translations.

Expand Down Expand Up @@ -148,4 +148,4 @@ Small enough to fit. Strict enough to be worth fitting. That's the whole bet.
**Try the measurement yourself:** `npm create objectstack@latest my-app`, build
something with your agent, then count the lines. If the whole app doesn't fit in
your agent's context window, we'd like to hear about it — that's a bug in the
target format, and the format is [open](https://github.com/objectstack-ai/framework).
target format, and the format is [open](https://github.com/objectstack-ai/objectstack).
4 changes: 2 additions & 2 deletions content/docs/ai/agents.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ framework, which uses `@objectstack/mcp` (BYO-AI) instead. The next two sections
describe that ObjectOS runtime.
</Callout>

Per [ADR-0063](https://github.com/objectstack-ai/framework/blob/main/docs/adr/0063-two-kernel-agents-skills-are-the-extension-primitive.md)
Per [ADR-0063](https://github.com/objectstack-ai/objectstack/blob/main/docs/adr/0063-two-kernel-agents-skills-are-the-extension-primitive.md)
the ObjectOS runtime ships **exactly two** platform agents, bound by the
*surface* the user is in — the user never picks from a roster:

Expand Down Expand Up @@ -117,7 +117,7 @@ your Actions / Flows / queries; it then attaches to `ask`. Every skill declares
`surface: 'ask' | 'build' | 'both'`, and an agent's tool set is the **union of its
surface-compatible skills' tools** — there is no global fall-through, so a skill
reaches an agent only when their surfaces match
([ADR-0064](https://github.com/objectstack-ai/framework/blob/main/docs/adr/0064-tool-scoping-to-agent.md)).
([ADR-0064](https://github.com/objectstack-ai/objectstack/blob/main/docs/adr/0064-tool-scoping-to-agent.md)).
Both `surface:'ask'` and `surface:'build'` skills run only where the in-UI AI
runtime exists — **ObjectOS**. On the open framework
there is no in-product agent to attach them to; author capability
Expand Down
2 changes: 1 addition & 1 deletion content/docs/ai/connect-mcp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ This is the default policy, not a ceiling. A finer, **metadata-declared** exposu
config (opt objects out, curate the exposed set, promote a few high-value actions
to typed per-action tools) is the planned next step, consistent with ADR-0097's
"what is exposed should itself be authorable" — tracked in
[#3167](https://github.com/objectstack-ai/framework/issues/3167).
[#3167](https://github.com/objectstack-ai/objectstack/issues/3167).
</Callout>

## The security model
Expand Down
6 changes: 3 additions & 3 deletions content/docs/ai/skills-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ ObjectStack ships a set of **domain-specific skills** that teach AI assistants (

## Installing skills

Skills install into a project from the [skills.sh](https://skills.sh) registry, reading the `skills/` directory of the [`objectstack-ai/framework`](https://github.com/objectstack-ai/framework) repository.
Skills install into a project from the [skills.sh](https://skills.sh) registry, reading the `skills/` directory of the [`objectstack-ai/objectstack`](https://github.com/objectstack-ai/objectstack) repository.

**New projects — installed automatically.** `create-objectstack` runs the install step for you during scaffolding:

Expand All @@ -26,10 +26,10 @@ npm create objectstack@latest my-app
**Existing projects — install the whole bundle:**

```bash
npx skills add objectstack-ai/framework/skills --all
npx skills add objectstack-ai/objectstack/skills --all
```

Run the same command again at any time to pull the latest versions — `--all` is idempotent, so updating is one command regardless of how many skills the bundle contains. To choose which skills to add instead of the full set, run `npx skills add objectstack-ai/framework/skills` without `--all`. (The `/skills` subpath scopes discovery to the published catalog — always keep it in the command.)
Run the same command again at any time to pull the latest versions — `--all` is idempotent, so updating is one command regardless of how many skills the bundle contains. To choose which skills to add instead of the full set, run `npx skills add objectstack-ai/objectstack/skills` without `--all`. (The `/skills` subpath scopes discovery to the published catalog — always keep it in the command.)

<Callout type="info">
Skills are versioned as **one bundle**. You do not track or update each skill individually — `--all` always installs the matching set for the `@objectstack/spec` version in your project.
Expand Down
4 changes: 2 additions & 2 deletions content/docs/ai/skills.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ See [Agents](/docs/ai/agents#you-extend-the-platform-with-skills-not-agents) for

## Installing skills

Skills are distributed through the [skills.sh](https://skills.sh) registry from the [`objectstack-ai/framework`](https://github.com/objectstack-ai/framework) repository's `skills/` directory.
Skills are distributed through the [skills.sh](https://skills.sh) registry from the [`objectstack-ai/objectstack`](https://github.com/objectstack-ai/objectstack) repository's `skills/` directory.

```bash
# New project — create-objectstack installs skills automatically
npm create objectstack@latest my-app

# Existing project — add the whole bundle (re-run to update)
npx skills add objectstack-ai/framework/skills --all
npx skills add objectstack-ai/objectstack/skills --all
```

The bundle is versioned and updated as **one unit** — `--all` is idempotent, so you never track skills individually. For the full per-skill catalog and install options, see the [AI Skills Reference](/docs/ai/skills-reference#installing-skills).
Expand Down
Loading