From opensaas-migration
Find and replace all @keystone-6 import paths across every file in the project. Invoke as a forked subagent, passing the project root path.
npx claudepluginhub opensaasau/stack --plugin opensaas-migrationThis skill uses the workspace's default tool permissions.
Find and replace all KeystoneJS import paths with their OpenSaaS Stack equivalents across the project described below. This is a mechanical find-and-replace across every TypeScript/JavaScript file.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Find and replace all KeystoneJS import paths with their OpenSaaS Stack equivalents across the project described below. This is a mechanical find-and-replace across every TypeScript/JavaScript file.
$ARGUMENTS
| Keystone import (remove/replace) | OpenSaaS import |
|---|---|
@keystone-6/core | @opensaas/stack-core |
@keystone-6/core/fields | @opensaas/stack-core/fields |
@keystone-6/auth | @opensaas/stack-auth |
@keystone-6/fields-document | @opensaas/stack-tiptap/fields (see note) |
.keystone/types or '.keystone/types' | @opensaas/stack-core |
@keystone-6/core/session | Remove entirely (handled by authPlugin) |
Note on @keystone-6/fields-document: Replace with @opensaas/stack-tiptap/fields and change document() → richText(). If document field migration is complex, note it for the user and leave a // TODO: migrate document field comment.
Note on .keystone/types: Common imports to update:
// Before
import type { Session } from '.keystone/types'
import type { KeystoneContext } from '.keystone/types'
import type { Lists } from '.keystone/types'
// After
import type { AccessControl } from '@opensaas/stack-core'
// KeystoneContext and Lists are no longer needed — use context from getContext()
If the project has keystone.ts or keystone.config.ts, it should be renamed to opensaas.config.ts. Check if it has already been renamed before doing so.
.ts and .tsx files in the project (exclude node_modules, .next, dist)@keystone-6 or .keystone/types imports.keystone/types imports, update the specific type names (Session → AccessControl, etc.)
d. Edit the file with the changeskeystone.ts or keystone.config.ts exists and rename to opensaas.config.ts if needed (and if not already done)