From 4ee7f43d8b12e2d2a6567caddd3fbccb2df9fd2f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Jul 2026 18:45:01 +0000 Subject: [PATCH] chore: version packages --- .../compose-drizzle-pglite-persistence.md | 7 -- .changeset/compose-extension-skills.md | 8 -- .../compose-extensions-vike-only-guard.md | 7 -- .changeset/compose-vike-crud-admin-ui.md | 7 -- .changeset/compose-vike-rbac-authz.md | 7 -- .../compose-vike-themes-layouts-shell.md | 7 -- .changeset/data-persona-prisma.md | 7 -- .../default-claude-code-session-link.md | 11 --- .changeset/existing-project-extend-framing.md | 11 --- .changeset/export-composer-personas.md | 7 -- .changeset/framework-extension-spi.md | 14 ---- .../help-compose-extensions-full-set.md | 7 -- .changeset/page-builder-rides-skill.md | 8 -- .changeset/persist-orchestration-state.md | 11 --- .changeset/scaffold-empty-workspace.md | 7 -- .changeset/stack-rationale-pros-cons.md | 15 ---- examples/autopilot-quickstart/CHANGELOG.md | 16 ++++ examples/autopilot-quickstart/package.json | 2 +- examples/bootstrap-quickstart/CHANGELOG.md | 16 ++++ examples/bootstrap-quickstart/package.json | 2 +- examples/framework-demo/CHANGELOG.md | 24 ++++++ examples/framework-demo/package.json | 2 +- .../framework-discovery-demo/CHANGELOG.md | 25 ++++++ .../framework-discovery-demo/package.json | 2 +- examples/framework-hello/CHANGELOG.md | 17 ++++ examples/framework-hello/package.json | 2 +- packages/ai-autopilot/CHANGELOG.md | 57 +++++++++++++ packages/ai-autopilot/package.json | 2 +- packages/framework/CHANGELOG.md | 83 +++++++++++++++++++ packages/framework/package.json | 2 +- 30 files changed, 245 insertions(+), 148 deletions(-) delete mode 100644 .changeset/compose-drizzle-pglite-persistence.md delete mode 100644 .changeset/compose-extension-skills.md delete mode 100644 .changeset/compose-extensions-vike-only-guard.md delete mode 100644 .changeset/compose-vike-crud-admin-ui.md delete mode 100644 .changeset/compose-vike-rbac-authz.md delete mode 100644 .changeset/compose-vike-themes-layouts-shell.md delete mode 100644 .changeset/data-persona-prisma.md delete mode 100644 .changeset/default-claude-code-session-link.md delete mode 100644 .changeset/existing-project-extend-framing.md delete mode 100644 .changeset/export-composer-personas.md delete mode 100644 .changeset/framework-extension-spi.md delete mode 100644 .changeset/help-compose-extensions-full-set.md delete mode 100644 .changeset/page-builder-rides-skill.md delete mode 100644 .changeset/persist-orchestration-state.md delete mode 100644 .changeset/scaffold-empty-workspace.md delete mode 100644 .changeset/stack-rationale-pros-cons.md create mode 100644 examples/framework-demo/CHANGELOG.md create mode 100644 examples/framework-discovery-demo/CHANGELOG.md create mode 100644 examples/framework-hello/CHANGELOG.md diff --git a/.changeset/compose-drizzle-pglite-persistence.md b/.changeset/compose-drizzle-pglite-persistence.md deleted file mode 100644 index e8aaeab..0000000 --- a/.changeset/compose-drizzle-pglite-persistence.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Teach the compose personas the opt-in real-persistence path (drizzle + pglite) - -The composed stack (vike-auth + the universal-orm data layer) runs on the memory adapter, which resets on every server restart, so accounts and posts vanish on reboot. The `vike-data-modeler` persona now teaches the "make it real" swap: register the Drizzle adapter over an embedded pglite Postgres instead of the memory adapter, add the `vikeSchema()` Vite plugin to codegen `drizzle/schema.generated.ts`, and derive/apply migrations with drizzle-kit. Because auth and domain data ride the same one adapter, that single swap makes both durable at once; `defineSchema` tables and `db()` queries do not change. The `vike-auth-composer` persona points at the same step, and the memory adapter stays the zero-config dev default. Reference: the proven `examples/drizzle-pglite` twin. Part of #186. Closes #187. diff --git a/.changeset/compose-extension-skills.md b/.changeset/compose-extension-skills.md deleted file mode 100644 index 597287a..0000000 --- a/.changeset/compose-extension-skills.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor -'@gemstack/framework': minor ---- - -Thread an active extension's own skills into the agent frame - -The extension SPI (#190) let a `FrameworkExtension` carry `skills` (llms.txt doc pointers), but `run.ts` only framed the built-in `SkillRegistry` matches, so a discovered extension's own skills were collected and then dropped. Add `composeSkills` (symmetric with `composePersonas`): it unions the registry-matched skills with every active extension's skills, deduped by name. `run.ts` uses it, so an active extension now contributes both its personas and its doc pointers to the frame. Surfaced by the new `examples/framework-discovery-demo` end-to-end proof, where the third-party `framework-hello` extension's `hello-guide` skill now reaches the agent. diff --git a/.changeset/compose-extensions-vike-only-guard.md b/.changeset/compose-extensions-vike-only-guard.md deleted file mode 100644 index 8e14208..0000000 --- a/.changeset/compose-extensions-vike-only-guard.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/framework': patch ---- - -Enforce the Vike-only constraint on `--compose-extensions` - -`--compose-extensions` is documented as Vike-only, but `runFramework` applied the vike-* composer personas regardless of the detected preset, so a Next project would be framed with `nextPageBuilder` plus composers telling the agent to install vike-auth/vike-crud/etc.: an incoherent prompt. It now gates compose on the Vike preset and, on any other preset, falls back to the hand-rolled + Prisma path and emits a log explaining why. diff --git a/.changeset/compose-vike-crud-admin-ui.md b/.changeset/compose-vike-crud-admin-ui.md deleted file mode 100644 index 2e4d5c0..0000000 --- a/.changeset/compose-vike-crud-admin-ui.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Compose vike-crud / vike-admin for the CRUD/admin UI instead of hand-writing screens - -The composed stack taught the agent to compose vike-auth (identity) and the universal-orm data layer (domain data), but it still hand-wrote the list/record/form screens and admin panel, which is the largest chunk of fresh, churn-prone AI code. The new `vike-crud-composer` persona (wired into `vikeExtensionPersonas`) teaches the agent to derive those screens from the schema instead: `crud({ table })` / `crudBlocks({ table })` inside a `definePage`, rendered through `vike-crud/react` (or `/vue`); vike-admin dropped on top for a whole-DB `/admin/*` panel via the cumulative `adminResources` seam; mutations through named `crudActions` (`posts.delete`) rather than inline closures; and the config -> slot -> eject customization ladder so eject is the last resort, not the starting point. Everything rides the one universal-orm adapter already registered, so there is nothing extra to install. No runtime change; the agent stays a black box. Part of #186. Closes #189. diff --git a/.changeset/compose-vike-rbac-authz.md b/.changeset/compose-vike-rbac-authz.md deleted file mode 100644 index 872d906..0000000 --- a/.changeset/compose-vike-rbac-authz.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Compose vike-rbac for roles/permissions instead of hand-rolling authz - -The crud composer teaches ad-hoc role checks (`canEdit: (user) => user?.role === 'admin'`), which is fine for signed-in-vs-not but leaves the agent to hand-roll a roles/permissions schema and a permission checker the moment an app has named permissions or more than one role. The new `vike-rbac-composer` persona (wired into `vikeExtensionPersonas`, between auth and crud) teaches the agent to compose vike-rbac instead: declare permissions with `definePermissions` and `extends: ['import:vike-rbac/config:default']` (self-installs vike-auth), route every guard through the same `can(user, permission)` / `hasRole(user, role)` (the crud `canView`/`canEdit`, page guards, session scope, and vike-actions guards all delegate to it), and seed roles/permissions from the composed registry with `seedRbac()` rather than a hand-written list. vike-rbac owns the `roles`/`permissions`/`role_user`/`permission_role` tables and is the guard subject vike-admin and vike-actions are built around. No runtime change; the agent stays a black box. Part of #186. Closes #194. diff --git a/.changeset/compose-vike-themes-layouts-shell.md b/.changeset/compose-vike-themes-layouts-shell.md deleted file mode 100644 index dbf35eb..0000000 --- a/.changeset/compose-vike-themes-layouts-shell.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Compose vike-themes / vike-layouts for styling and the app shell instead of hand-rolling CSS + nav - -After auth, data, and the CRUD/admin UI, the remaining big hand-rolled surface is styling and the app shell: an agent writes its own CSS design system, dark-mode toggle, and layout/nav chrome on every build, and that fresh CSS is the root of the loop's over-polish churn. The new `vike-shell-composer` persona (wired into `vikeExtensionPersonas`) teaches the agent to declare a brand with `defineTheme` and `extends: [themesExt]` (flash-free system dark mode, a picker, and a CSS-variable contract to style against) instead of hand-writing a color system, and to pick a shell with `vike-layouts` (`layout: 'centered' | 'topbar' | 'sidebar'` plus `logo` / cumulative `nav` slots) instead of a hand-written topbar/sidebar. It also notes the one-line `vike-toolbar` install that gives the theme/locale controls a home. No runtime change; the agent stays a black box. Part of #186. Closes #192. diff --git a/.changeset/data-persona-prisma.md b/.changeset/data-persona-prisma.md deleted file mode 100644 index 3175239..0000000 --- a/.changeset/data-persona-prisma.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Point the flagship data persona at Prisma (installable) instead of the unpublished universal-orm - -The bootstrap data persona told the agent to build the data layer on `universal-orm`, which isn't installable (`@universal-orm/core` 404s on npm), so from-scratch live builds stalled sanity-checking the stack and produced nothing. It now defaults to Prisma with concrete install/init steps (schema-first, migrations derived from the schema, a fully typed client), and the architect default no longer names an unpublished package. The persona export is renamed `universalOrmModeler` -> `dataModeler` (persona name `data-modeler`). Closes #181. diff --git a/.changeset/default-claude-code-session-link.md b/.changeset/default-claude-code-session-link.md deleted file mode 100644 index cf1e4ad..0000000 --- a/.changeset/default-claude-code-session-link.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@gemstack/framework': minor ---- - -Default the live-run session link to claude.ai/code - -A live run now shows a session link to `https://claude.ai/code` by default (the page where a Claude Code session appears once Remote Control is enabled), so the dashboard points somewhere useful without needing `--session-link`. `--fake` gets no link (it has no real session), and an explicit `--session-link` still wins — including the `{sessionId}` template, which is filled in with the real Claude session id once known. - -Why not a per-session deep link: we drive Claude Code headless, and Remote Control (which powers the claude.ai/code session view) is opt-in and subscription-gated, so there is no session-URL slug to construct. The session id is already surfaced on the dashboard and in the CLI narration; the README's new "Watching the live session" section documents the Remote Control path. New exports: `chooseSessionLink`, `CLAUDE_CODE_SESSION_LIST`. - -Part of #209. Closes #212. diff --git a/.changeset/existing-project-extend-framing.md b/.changeset/existing-project-extend-framing.md deleted file mode 100644 index 19829e0..0000000 --- a/.changeset/existing-project-extend-framing.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@gemstack/framework': minor ---- - -Extend an existing project instead of rebuilding it from scratch - -Pointed at a workspace that already has source, the build step now frames the wrapped agent to work *within* the existing codebase (read it, follow its conventions, add what was asked) rather than scaffold a fresh app. Greenfield runs (an empty workspace) are unchanged, and detection is gated on a real driver, so `--fake` stays deterministic. Combined with the live preset detection already wired from the real workspace, running in an existing project now detects its real stack and extends it. - -New exports: `extendPrompt`, `isWorkspaceEmpty`. - -Part of #110. Closes #185. diff --git a/.changeset/export-composer-personas.md b/.changeset/export-composer-personas.md deleted file mode 100644 index b22e570..0000000 --- a/.changeset/export-composer-personas.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor ---- - -Export the vike-rbac / vike-crud / vike-shell composer personas individually - -`vikeAuthComposer` and `vikeDataModeler` were re-exported individually from the package root, but their three peers `vikeRbacComposer`, `vikeCrudComposer`, and `vikeShellComposer` were only reachable through the `vikeExtensionPersonas` array. They are now exported individually too, so a consumer building a custom persona roster can cherry-pick any of the built-in extension composers uniformly. No runtime change. diff --git a/.changeset/framework-extension-spi.md b/.changeset/framework-extension-spi.md deleted file mode 100644 index e4cf661..0000000 --- a/.changeset/framework-extension-spi.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor -'@gemstack/framework': minor ---- - -Make The Framework modular: a capability-extension + skill SPI, discovered instead of hardcoded - -The composition was pinned in `run.ts` (a fixed `vikeExtensionPersonas` list swapped in behind `--compose-extensions`), so no third party could publish a `framework-*` package and have it compose. This adds the extension SPI (#190), all agnostic (nothing is framework-gated): - -- `defineFrameworkExtension` — a capability (auth, data, rbac, crud, shell, ...) that self-registers, matched by signal (a dependency is present) or opt-in, and frames the agent with its personas. An extension supersedes the neutral default persona of the same `capability` (e.g. `framework-data` replaces the default ORM modeler), so the agent never gets two conflicting personas for one concern. -- `defineSkill` — a doc pointer (an `llms.txt`), the shared unit with Open Loop (#204). A framework is a skill, not an adapter package: Vike now rides the same seam as `https://vike.dev/llms.txt`. -- `ExtensionRegistry` / `SkillRegistry`, `composePersonas`, `skillInstructions`, and `loadExtensionsFromModules` for discovering installed `framework-*` packages. - -`run.ts` now composes matched extensions + skills through the registry instead of the hardcoded list, and the CLI reads the project's real signals and discovers installed `framework-*` capability packages (resolved from the user's workspace, failures reported not thrown). The built-in vike-* composers ship as extensions (`framework-auth`, `framework-data`, `framework-rbac`, `framework-crud`, `framework-shell`) and Vike ships as a skill, proving the seam. `--compose-extensions` still opts every built-in in; the publish-safe default (hand-rolled + Prisma) is unchanged. Closes #190. diff --git a/.changeset/help-compose-extensions-full-set.md b/.changeset/help-compose-extensions-full-set.md deleted file mode 100644 index 5065527..0000000 --- a/.changeset/help-compose-extensions-full-set.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/framework': patch ---- - -Fix the `--compose-extensions` help text to name the full composer set - -The `framework --help` output described `--compose-extensions` as composing "vike-auth for auth" only, but the flag frames the agent with the whole vike-* composer set: auth, the universal-orm data layer, rbac, crud/admin, and themes/layouts. The help text now names them accurately. diff --git a/.changeset/page-builder-rides-skill.md b/.changeset/page-builder-rides-skill.md deleted file mode 100644 index 7202e97..0000000 --- a/.changeset/page-builder-rides-skill.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor -'@gemstack/framework': minor ---- - -Move the framework page builder off the preset onto its skill (fully skill-driven framing) - -A framework was represented twice: its page-builder persona rode the preset seam (`preset.personas`, framed as the run's base) while its docs rode the skill seam (`vike.dev/llms.txt`). This finishes the "framework = skill, adapter axis gone" design: a `Skill` now carries its own curated framing personas alongside the doc pointer, so all of a framework's knowledge lives in one unit. `vikeSkill` carries `vikePageBuilder`; the new `nextSkill` carries `nextPageBuilder`. A preset is now a pure detector that points at its framework `skill`, and `run.ts` frames the page builder through the skill set (the detected preset's skill is always framed, even on an empty from-scratch project where nothing signal-matched, since preset selection is the fallback). New exports: `nextSkill`, `skillPersonas`. `presetPersonas` and the framing narration are unchanged. Part of #190. diff --git a/.changeset/persist-orchestration-state.md b/.changeset/persist-orchestration-state.md deleted file mode 100644 index b48b0d4..0000000 --- a/.changeset/persist-orchestration-state.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@gemstack/framework': minor ---- - -Persist the orchestration state so a restarted dashboard can resume it - -A run now saves its orchestration state (the stack rationale, loop status, and decisions ledger) so it survives a restart. Because the dashboard is a pure projection of the run's `FrameworkEvent` stream, persisting is durably logging that stream: each run appends to `.framework/events.jsonl` in the workspace, keeps a small derived `run.json` snapshot beside it, and writes a human-readable `DECISIONS.md` at the root. `framework --resume` reopens the last run's dashboard read-only by replaying the log into a fresh stream, exactly as it looked, without running the agent again. `--no-persist` opts out of writing state. - -Per the design sync we do not persist the agent's chat transcript (Claude Code owns that); only our own orchestration events. New `RunStore` module and exports (`RunStore`, `nodeStoreFs`, `metaFromEvents`, `applyEventToMeta`, `RunMeta`, `StoreFs`, ...); new `--resume` / `--no-persist` CLI flags. - -Part of #209. Closes #211. diff --git a/.changeset/scaffold-empty-workspace.md b/.changeset/scaffold-empty-workspace.md deleted file mode 100644 index d821051..0000000 --- a/.changeset/scaffold-empty-workspace.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@gemstack/framework': minor ---- - -Recover from-scratch builds: scaffold an empty workspace instead of only polishing - -The full-fledged loop assumed an app already existed, so a from-scratch run could end at the framework's default "Welcome" page. The build step now verifies it produced files and hard re-prompts to scaffold from scratch if the workspace is still empty; the improve step switches to a "create the whole app from scratch" directive when the workspace is empty (instead of "smallest change / no unrelated features"); and the default `--max-passes` is raised from 3 to 5 so a from-scratch build has room to recover. Also clarifies the dashboard/terminal end status ("finished", not "done", so it reads as separate from the production-grade badge). Closes #182. diff --git a/.changeset/stack-rationale-pros-cons.md b/.changeset/stack-rationale-pros-cons.md deleted file mode 100644 index fe38f67..0000000 --- a/.changeset/stack-rationale-pros-cons.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@gemstack/ai-autopilot': minor -'@gemstack/framework': minor ---- - -Architect stack rationale: PROS/CONS + alternatives considered - -The web dashboard's edge over the CLI is showing *why* the AI chose the stack. The architect step now returns that rationale, not just a one-line why: - -- `ArchitectPlan` gains optional `pros`, `cons`, and `alternatives` (`{option, whyNot}`). The `agentArchitect` (ai-sdk) and `driverArchitect` (framework) both ask for them and parse them; absent fields are omitted, so existing producers are unaffected. -- A new exported `STACK_TRADEOFFS` block gives the architect objective, reusable Vike-vs-Next reasons (edge/Cloudflare deploy, renderer-agnostic, ecosystem size) so the justification is grounded rather than invented per run. Both architect prompts embed it. -- The `Bootstrap` orchestrator emits `pros`/`cons`/`alternatives` on the `architect` event and records the rejected alternatives to the decisions ledger as rejections, so the ledger shows what was weighed. -- The framework dashboard's "Stack & rationale" panel renders the pros, cons, and "Considered instead" alternatives. The `--fake` demo populates them. - -Part of #209. Closes #210. diff --git a/examples/autopilot-quickstart/CHANGELOG.md b/examples/autopilot-quickstart/CHANGELOG.md index a55d719..b08636a 100644 --- a/examples/autopilot-quickstart/CHANGELOG.md +++ b/examples/autopilot-quickstart/CHANGELOG.md @@ -1,5 +1,21 @@ # @gemstack/example-autopilot-quickstart +## 0.0.5 + +### Patch Changes + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [d98d4ad] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 + ## 0.0.4 ### Patch Changes diff --git a/examples/autopilot-quickstart/package.json b/examples/autopilot-quickstart/package.json index 24043c7..e16b163 100644 --- a/examples/autopilot-quickstart/package.json +++ b/examples/autopilot-quickstart/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/example-autopilot-quickstart", - "version": "0.0.4", + "version": "0.0.5", "private": true, "description": "Runnable end-to-end quickstart for @gemstack/ai-autopilot: personas + Supervisor + runner + surfaces composed into one build-a-feature flow, offline via AiFake.", "type": "module", diff --git a/examples/bootstrap-quickstart/CHANGELOG.md b/examples/bootstrap-quickstart/CHANGELOG.md index 75c68f1..3d22522 100644 --- a/examples/bootstrap-quickstart/CHANGELOG.md +++ b/examples/bootstrap-quickstart/CHANGELOG.md @@ -1,5 +1,21 @@ # @gemstack/example-bootstrap-quickstart +## 0.0.5 + +### Patch Changes + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [d98d4ad] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 + ## 0.0.4 ### Patch Changes diff --git a/examples/bootstrap-quickstart/package.json b/examples/bootstrap-quickstart/package.json index 4b929a3..3d39404 100644 --- a/examples/bootstrap-quickstart/package.json +++ b/examples/bootstrap-quickstart/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/example-bootstrap-quickstart", - "version": "0.0.4", + "version": "0.0.5", "private": true, "description": "Runnable capstone for @gemstack/ai-autopilot: preset detection + Bootstrap (scope → architect → build → full-fledged loop → deploy) + scale mode, streamed over surfaces, offline via AiFake + FakeRunner.", "type": "module", diff --git a/examples/framework-demo/CHANGELOG.md b/examples/framework-demo/CHANGELOG.md new file mode 100644 index 0000000..88537e2 --- /dev/null +++ b/examples/framework-demo/CHANGELOG.md @@ -0,0 +1,24 @@ +# @gemstack/example-framework-demo + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [5288ca6] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [f156cf8] +- Updated dependencies [97b2943] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [c9cf96b] +- Updated dependencies [d98d4ad] +- Updated dependencies [a06e845] +- Updated dependencies [c79f567] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 + - @gemstack/framework@0.4.0 diff --git a/examples/framework-demo/package.json b/examples/framework-demo/package.json index 03eebc8..87e1824 100644 --- a/examples/framework-demo/package.json +++ b/examples/framework-demo/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/example-framework-demo", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "Showable end-to-end demo of @gemstack/framework: one prompt → scope → architect → build → full-fledged loop → deploy → a real running app, offline and deterministic via the fake driver.", "type": "module", diff --git a/examples/framework-discovery-demo/CHANGELOG.md b/examples/framework-discovery-demo/CHANGELOG.md new file mode 100644 index 0000000..4e00fff --- /dev/null +++ b/examples/framework-discovery-demo/CHANGELOG.md @@ -0,0 +1,25 @@ +# @gemstack/example-framework-discovery + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [5288ca6] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [f156cf8] +- Updated dependencies [97b2943] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [c9cf96b] +- Updated dependencies [d98d4ad] +- Updated dependencies [a06e845] +- Updated dependencies [c79f567] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 + - @gemstack/framework@0.4.0 + - framework-hello@0.0.1 diff --git a/examples/framework-discovery-demo/package.json b/examples/framework-discovery-demo/package.json index a82844d..c66ea0c 100644 --- a/examples/framework-discovery-demo/package.json +++ b/examples/framework-discovery-demo/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/example-framework-discovery", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "End-to-end proof of The Framework's extension SPI (#190): this project depends on the third-party `framework-hello` package, and the CLI discovers, registers, and composes it into the agent frame - offline and deterministic via the fake driver.", "type": "module", diff --git a/examples/framework-hello/CHANGELOG.md b/examples/framework-hello/CHANGELOG.md new file mode 100644 index 0000000..5308fa6 --- /dev/null +++ b/examples/framework-hello/CHANGELOG.md @@ -0,0 +1,17 @@ +# framework-hello + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [d98d4ad] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 diff --git a/examples/framework-hello/package.json b/examples/framework-hello/package.json index fafceb1..00ca968 100644 --- a/examples/framework-hello/package.json +++ b/examples/framework-hello/package.json @@ -1,6 +1,6 @@ { "name": "framework-hello", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "Example third-party framework-* capability extension. Proves The Framework's extension SPI (#190): install it into a project and the CLI discovers, registers, and composes it with no change to the framework core.", "type": "module", diff --git a/packages/ai-autopilot/CHANGELOG.md b/packages/ai-autopilot/CHANGELOG.md index 661518f..e9677e4 100644 --- a/packages/ai-autopilot/CHANGELOG.md +++ b/packages/ai-autopilot/CHANGELOG.md @@ -1,5 +1,62 @@ # @gemstack/ai-autopilot +## 0.6.0 + +### Minor Changes + +- 1db19e2: Teach the compose personas the opt-in real-persistence path (drizzle + pglite) + + The composed stack (vike-auth + the universal-orm data layer) runs on the memory adapter, which resets on every server restart, so accounts and posts vanish on reboot. The `vike-data-modeler` persona now teaches the "make it real" swap: register the Drizzle adapter over an embedded pglite Postgres instead of the memory adapter, add the `vikeSchema()` Vite plugin to codegen `drizzle/schema.generated.ts`, and derive/apply migrations with drizzle-kit. Because auth and domain data ride the same one adapter, that single swap makes both durable at once; `defineSchema` tables and `db()` queries do not change. The `vike-auth-composer` persona points at the same step, and the memory adapter stays the zero-config dev default. Reference: the proven `examples/drizzle-pglite` twin. Part of #186. Closes #187. + +- c3e7e9e: Thread an active extension's own skills into the agent frame + + The extension SPI (#190) let a `FrameworkExtension` carry `skills` (llms.txt doc pointers), but `run.ts` only framed the built-in `SkillRegistry` matches, so a discovered extension's own skills were collected and then dropped. Add `composeSkills` (symmetric with `composePersonas`): it unions the registry-matched skills with every active extension's skills, deduped by name. `run.ts` uses it, so an active extension now contributes both its personas and its doc pointers to the frame. Surfaced by the new `examples/framework-discovery-demo` end-to-end proof, where the third-party `framework-hello` extension's `hello-guide` skill now reaches the agent. + +- 6625ca7: Compose vike-crud / vike-admin for the CRUD/admin UI instead of hand-writing screens + + The composed stack taught the agent to compose vike-auth (identity) and the universal-orm data layer (domain data), but it still hand-wrote the list/record/form screens and admin panel, which is the largest chunk of fresh, churn-prone AI code. The new `vike-crud-composer` persona (wired into `vikeExtensionPersonas`) teaches the agent to derive those screens from the schema instead: `crud({ table })` / `crudBlocks({ table })` inside a `definePage`, rendered through `vike-crud/react` (or `/vue`); vike-admin dropped on top for a whole-DB `/admin/*` panel via the cumulative `adminResources` seam; mutations through named `crudActions` (`posts.delete`) rather than inline closures; and the config -> slot -> eject customization ladder so eject is the last resort, not the starting point. Everything rides the one universal-orm adapter already registered, so there is nothing extra to install. No runtime change; the agent stays a black box. Part of #186. Closes #189. + +- bd13fcf: Compose vike-rbac for roles/permissions instead of hand-rolling authz + + The crud composer teaches ad-hoc role checks (`canEdit: (user) => user?.role === 'admin'`), which is fine for signed-in-vs-not but leaves the agent to hand-roll a roles/permissions schema and a permission checker the moment an app has named permissions or more than one role. The new `vike-rbac-composer` persona (wired into `vikeExtensionPersonas`, between auth and crud) teaches the agent to compose vike-rbac instead: declare permissions with `definePermissions` and `extends: ['import:vike-rbac/config:default']` (self-installs vike-auth), route every guard through the same `can(user, permission)` / `hasRole(user, role)` (the crud `canView`/`canEdit`, page guards, session scope, and vike-actions guards all delegate to it), and seed roles/permissions from the composed registry with `seedRbac()` rather than a hand-written list. vike-rbac owns the `roles`/`permissions`/`role_user`/`permission_role` tables and is the guard subject vike-admin and vike-actions are built around. No runtime change; the agent stays a black box. Part of #186. Closes #194. + +- 11f76da: Compose vike-themes / vike-layouts for styling and the app shell instead of hand-rolling CSS + nav + + After auth, data, and the CRUD/admin UI, the remaining big hand-rolled surface is styling and the app shell: an agent writes its own CSS design system, dark-mode toggle, and layout/nav chrome on every build, and that fresh CSS is the root of the loop's over-polish churn. The new `vike-shell-composer` persona (wired into `vikeExtensionPersonas`) teaches the agent to declare a brand with `defineTheme` and `extends: [themesExt]` (flash-free system dark mode, a picker, and a CSS-variable contract to style against) instead of hand-writing a color system, and to pick a shell with `vike-layouts` (`layout: 'centered' | 'topbar' | 'sidebar'` plus `logo` / cumulative `nav` slots) instead of a hand-written topbar/sidebar. It also notes the one-line `vike-toolbar` install that gives the theme/locale controls a home. No runtime change; the agent stays a black box. Part of #186. Closes #192. + +- c79f567: Point the flagship data persona at Prisma (installable) instead of the unpublished universal-orm + + The bootstrap data persona told the agent to build the data layer on `universal-orm`, which isn't installable (`@universal-orm/core` 404s on npm), so from-scratch live builds stalled sanity-checking the stack and produced nothing. It now defaults to Prisma with concrete install/init steps (schema-first, migrations derived from the schema, a fully typed client), and the architect default no longer names an unpublished package. The persona export is renamed `universalOrmModeler` -> `dataModeler` (persona name `data-modeler`). Closes #181. + +- 93892d7: Export the vike-rbac / vike-crud / vike-shell composer personas individually + + `vikeAuthComposer` and `vikeDataModeler` were re-exported individually from the package root, but their three peers `vikeRbacComposer`, `vikeCrudComposer`, and `vikeShellComposer` were only reachable through the `vikeExtensionPersonas` array. They are now exported individually too, so a consumer building a custom persona roster can cherry-pick any of the built-in extension composers uniformly. No runtime change. + +- de37e7e: Make The Framework modular: a capability-extension + skill SPI, discovered instead of hardcoded + + The composition was pinned in `run.ts` (a fixed `vikeExtensionPersonas` list swapped in behind `--compose-extensions`), so no third party could publish a `framework-*` package and have it compose. This adds the extension SPI (#190), all agnostic (nothing is framework-gated): + + - `defineFrameworkExtension` — a capability (auth, data, rbac, crud, shell, ...) that self-registers, matched by signal (a dependency is present) or opt-in, and frames the agent with its personas. An extension supersedes the neutral default persona of the same `capability` (e.g. `framework-data` replaces the default ORM modeler), so the agent never gets two conflicting personas for one concern. + - `defineSkill` — a doc pointer (an `llms.txt`), the shared unit with Open Loop (#204). A framework is a skill, not an adapter package: Vike now rides the same seam as `https://vike.dev/llms.txt`. + - `ExtensionRegistry` / `SkillRegistry`, `composePersonas`, `skillInstructions`, and `loadExtensionsFromModules` for discovering installed `framework-*` packages. + + `run.ts` now composes matched extensions + skills through the registry instead of the hardcoded list, and the CLI reads the project's real signals and discovers installed `framework-*` capability packages (resolved from the user's workspace, failures reported not thrown). The built-in vike-\* composers ship as extensions (`framework-auth`, `framework-data`, `framework-rbac`, `framework-crud`, `framework-shell`) and Vike ships as a skill, proving the seam. `--compose-extensions` still opts every built-in in; the publish-safe default (hand-rolled + Prisma) is unchanged. Closes #190. + +- d98d4ad: Move the framework page builder off the preset onto its skill (fully skill-driven framing) + + A framework was represented twice: its page-builder persona rode the preset seam (`preset.personas`, framed as the run's base) while its docs rode the skill seam (`vike.dev/llms.txt`). This finishes the "framework = skill, adapter axis gone" design: a `Skill` now carries its own curated framing personas alongside the doc pointer, so all of a framework's knowledge lives in one unit. `vikeSkill` carries `vikePageBuilder`; the new `nextSkill` carries `nextPageBuilder`. A preset is now a pure detector that points at its framework `skill`, and `run.ts` frames the page builder through the skill set (the detected preset's skill is always framed, even on an empty from-scratch project where nothing signal-matched, since preset selection is the fallback). New exports: `nextSkill`, `skillPersonas`. `presetPersonas` and the framing narration are unchanged. Part of #190. + +- f1d11d9: Architect stack rationale: PROS/CONS + alternatives considered + + The web dashboard's edge over the CLI is showing _why_ the AI chose the stack. The architect step now returns that rationale, not just a one-line why: + + - `ArchitectPlan` gains optional `pros`, `cons`, and `alternatives` (`{option, whyNot}`). The `agentArchitect` (ai-sdk) and `driverArchitect` (framework) both ask for them and parse them; absent fields are omitted, so existing producers are unaffected. + - A new exported `STACK_TRADEOFFS` block gives the architect objective, reusable Vike-vs-Next reasons (edge/Cloudflare deploy, renderer-agnostic, ecosystem size) so the justification is grounded rather than invented per run. Both architect prompts embed it. + - The `Bootstrap` orchestrator emits `pros`/`cons`/`alternatives` on the `architect` event and records the rejected alternatives to the decisions ledger as rejections, so the ledger shows what was weighed. + - The framework dashboard's "Stack & rationale" panel renders the pros, cons, and "Considered instead" alternatives. The `--fake` demo populates them. + + Part of #209. Closes #210. + ## 0.5.0 ### Minor Changes diff --git a/packages/ai-autopilot/package.json b/packages/ai-autopilot/package.json index dbfb2cd..3739966 100644 --- a/packages/ai-autopilot/package.json +++ b/packages/ai-autopilot/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/ai-autopilot", - "version": "0.5.0", + "version": "0.6.0", "description": "Orchestration for @gemstack/ai-sdk agents: a Supervisor that plans, dispatches subagents (bounded concurrency + budget guardrails), and synthesizes the result.", "keywords": [ "ai", diff --git a/packages/framework/CHANGELOG.md b/packages/framework/CHANGELOG.md index 5d4d085..9612ff6 100644 --- a/packages/framework/CHANGELOG.md +++ b/packages/framework/CHANGELOG.md @@ -1,5 +1,88 @@ # @gemstack/framework +## 0.4.0 + +### Minor Changes + +- c3e7e9e: Thread an active extension's own skills into the agent frame + + The extension SPI (#190) let a `FrameworkExtension` carry `skills` (llms.txt doc pointers), but `run.ts` only framed the built-in `SkillRegistry` matches, so a discovered extension's own skills were collected and then dropped. Add `composeSkills` (symmetric with `composePersonas`): it unions the registry-matched skills with every active extension's skills, deduped by name. `run.ts` uses it, so an active extension now contributes both its personas and its doc pointers to the frame. Surfaced by the new `examples/framework-discovery-demo` end-to-end proof, where the third-party `framework-hello` extension's `hello-guide` skill now reaches the agent. + +- f156cf8: Default the live-run session link to claude.ai/code + + A live run now shows a session link to `https://claude.ai/code` by default (the page where a Claude Code session appears once Remote Control is enabled), so the dashboard points somewhere useful without needing `--session-link`. `--fake` gets no link (it has no real session), and an explicit `--session-link` still wins — including the `{sessionId}` template, which is filled in with the real Claude session id once known. + + Why not a per-session deep link: we drive Claude Code headless, and Remote Control (which powers the claude.ai/code session view) is opt-in and subscription-gated, so there is no session-URL slug to construct. The session id is already surfaced on the dashboard and in the CLI narration; the README's new "Watching the live session" section documents the Remote Control path. New exports: `chooseSessionLink`, `CLAUDE_CODE_SESSION_LIST`. + + Part of #209. Closes #212. + +- 97b2943: Extend an existing project instead of rebuilding it from scratch + + Pointed at a workspace that already has source, the build step now frames the wrapped agent to work _within_ the existing codebase (read it, follow its conventions, add what was asked) rather than scaffold a fresh app. Greenfield runs (an empty workspace) are unchanged, and detection is gated on a real driver, so `--fake` stays deterministic. Combined with the live preset detection already wired from the real workspace, running in an existing project now detects its real stack and extends it. + + New exports: `extendPrompt`, `isWorkspaceEmpty`. + + Part of #110. Closes #185. + +- de37e7e: Make The Framework modular: a capability-extension + skill SPI, discovered instead of hardcoded + + The composition was pinned in `run.ts` (a fixed `vikeExtensionPersonas` list swapped in behind `--compose-extensions`), so no third party could publish a `framework-*` package and have it compose. This adds the extension SPI (#190), all agnostic (nothing is framework-gated): + + - `defineFrameworkExtension` — a capability (auth, data, rbac, crud, shell, ...) that self-registers, matched by signal (a dependency is present) or opt-in, and frames the agent with its personas. An extension supersedes the neutral default persona of the same `capability` (e.g. `framework-data` replaces the default ORM modeler), so the agent never gets two conflicting personas for one concern. + - `defineSkill` — a doc pointer (an `llms.txt`), the shared unit with Open Loop (#204). A framework is a skill, not an adapter package: Vike now rides the same seam as `https://vike.dev/llms.txt`. + - `ExtensionRegistry` / `SkillRegistry`, `composePersonas`, `skillInstructions`, and `loadExtensionsFromModules` for discovering installed `framework-*` packages. + + `run.ts` now composes matched extensions + skills through the registry instead of the hardcoded list, and the CLI reads the project's real signals and discovers installed `framework-*` capability packages (resolved from the user's workspace, failures reported not thrown). The built-in vike-\* composers ship as extensions (`framework-auth`, `framework-data`, `framework-rbac`, `framework-crud`, `framework-shell`) and Vike ships as a skill, proving the seam. `--compose-extensions` still opts every built-in in; the publish-safe default (hand-rolled + Prisma) is unchanged. Closes #190. + +- d98d4ad: Move the framework page builder off the preset onto its skill (fully skill-driven framing) + + A framework was represented twice: its page-builder persona rode the preset seam (`preset.personas`, framed as the run's base) while its docs rode the skill seam (`vike.dev/llms.txt`). This finishes the "framework = skill, adapter axis gone" design: a `Skill` now carries its own curated framing personas alongside the doc pointer, so all of a framework's knowledge lives in one unit. `vikeSkill` carries `vikePageBuilder`; the new `nextSkill` carries `nextPageBuilder`. A preset is now a pure detector that points at its framework `skill`, and `run.ts` frames the page builder through the skill set (the detected preset's skill is always framed, even on an empty from-scratch project where nothing signal-matched, since preset selection is the fallback). New exports: `nextSkill`, `skillPersonas`. `presetPersonas` and the framing narration are unchanged. Part of #190. + +- a06e845: Persist the orchestration state so a restarted dashboard can resume it + + A run now saves its orchestration state (the stack rationale, loop status, and decisions ledger) so it survives a restart. Because the dashboard is a pure projection of the run's `FrameworkEvent` stream, persisting is durably logging that stream: each run appends to `.framework/events.jsonl` in the workspace, keeps a small derived `run.json` snapshot beside it, and writes a human-readable `DECISIONS.md` at the root. `framework --resume` reopens the last run's dashboard read-only by replaying the log into a fresh stream, exactly as it looked, without running the agent again. `--no-persist` opts out of writing state. + + Per the design sync we do not persist the agent's chat transcript (Claude Code owns that); only our own orchestration events. New `RunStore` module and exports (`RunStore`, `nodeStoreFs`, `metaFromEvents`, `applyEventToMeta`, `RunMeta`, `StoreFs`, ...); new `--resume` / `--no-persist` CLI flags. + + Part of #209. Closes #211. + +- c79f567: Recover from-scratch builds: scaffold an empty workspace instead of only polishing + + The full-fledged loop assumed an app already existed, so a from-scratch run could end at the framework's default "Welcome" page. The build step now verifies it produced files and hard re-prompts to scaffold from scratch if the workspace is still empty; the improve step switches to a "create the whole app from scratch" directive when the workspace is empty (instead of "smallest change / no unrelated features"); and the default `--max-passes` is raised from 3 to 5 so a from-scratch build has room to recover. Also clarifies the dashboard/terminal end status ("finished", not "done", so it reads as separate from the production-grade badge). Closes #182. + +- f1d11d9: Architect stack rationale: PROS/CONS + alternatives considered + + The web dashboard's edge over the CLI is showing _why_ the AI chose the stack. The architect step now returns that rationale, not just a one-line why: + + - `ArchitectPlan` gains optional `pros`, `cons`, and `alternatives` (`{option, whyNot}`). The `agentArchitect` (ai-sdk) and `driverArchitect` (framework) both ask for them and parse them; absent fields are omitted, so existing producers are unaffected. + - A new exported `STACK_TRADEOFFS` block gives the architect objective, reusable Vike-vs-Next reasons (edge/Cloudflare deploy, renderer-agnostic, ecosystem size) so the justification is grounded rather than invented per run. Both architect prompts embed it. + - The `Bootstrap` orchestrator emits `pros`/`cons`/`alternatives` on the `architect` event and records the rejected alternatives to the decisions ledger as rejections, so the ledger shows what was weighed. + - The framework dashboard's "Stack & rationale" panel renders the pros, cons, and "Considered instead" alternatives. The `--fake` demo populates them. + + Part of #209. Closes #210. + +### Patch Changes + +- 5288ca6: Enforce the Vike-only constraint on `--compose-extensions` + + `--compose-extensions` is documented as Vike-only, but `runFramework` applied the vike-\* composer personas regardless of the detected preset, so a Next project would be framed with `nextPageBuilder` plus composers telling the agent to install vike-auth/vike-crud/etc.: an incoherent prompt. It now gates compose on the Vike preset and, on any other preset, falls back to the hand-rolled + Prisma path and emits a log explaining why. + +- c9cf96b: Fix the `--compose-extensions` help text to name the full composer set + + The `framework --help` output described `--compose-extensions` as composing "vike-auth for auth" only, but the flag frames the agent with the whole vike-\* composer set: auth, the universal-orm data layer, rbac, crud/admin, and themes/layouts. The help text now names them accurately. + +- Updated dependencies [1db19e2] +- Updated dependencies [c3e7e9e] +- Updated dependencies [6625ca7] +- Updated dependencies [bd13fcf] +- Updated dependencies [11f76da] +- Updated dependencies [c79f567] +- Updated dependencies [93892d7] +- Updated dependencies [de37e7e] +- Updated dependencies [d98d4ad] +- Updated dependencies [f1d11d9] + - @gemstack/ai-autopilot@0.6.0 + ## 0.3.0 ### Minor Changes diff --git a/packages/framework/package.json b/packages/framework/package.json index bab46e9..c21269b 100644 --- a/packages/framework/package.json +++ b/packages/framework/package.json @@ -1,6 +1,6 @@ { "name": "@gemstack/framework", - "version": "0.3.0", + "version": "0.4.0", "description": "The (AI) Framework: turnkey, zero-config AI orchestration that wraps a coding-agent CLI (Claude Code) as a black box and takes you from an idea to a running app. Vite for AI.", "keywords": [ "ai",