{"_id":"@bobo-ai/spellcast-universe","_rev":"10-5f490ae119c11369cace7b9a1063f4a4","name":"@bobo-ai/spellcast-universe","dist-tags":{"latest":"0.1.9"},"versions":{"0.1.0":{"name":"@bobo-ai/spellcast-universe","version":"0.1.0","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.0","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"16f8d389cfadc7cf4d9b02a5dbdccada368ddf70","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.0.tgz","fileCount":157,"integrity":"sha512-urqPHbnc0i8SjLXDhgc8Qy+YZeJSfQ0AZHDbQgIsgO7N4/6wDvNhV3P++qzeEGKQRsXofxLvjiSKSTgX+rxV8Q==","signatures":[{"sig":"MEQCIB3pIeN9ibCdQZVSj2VSbs8TOEkZ9HYr2lrEjl0Q0d6eAiAKF6IJZcM5DfZ1RqUv3Y7uSiaCNIkHs6/jfCZCkxI8Ng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1861214},"type":"module","engines":{"node":">=20"},"gitHead":"22603ce1a105cb2a0a974fd071319b292f8f24c1","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.0_1784364734821_0.39319332615315505","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bobo-ai/spellcast-universe","version":"0.1.1","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.1","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"8c8037d6621c21d426079da109a7e081ec81a261","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.1.tgz","fileCount":157,"integrity":"sha512-EredOTgHpyRrFs64CEvDRNrHgmZukx8KcIwMidNyShXrNWfzKQVxeRB8Rn+Gx1CH/itgFCEhOW4o1hdrACCu7Q==","signatures":[{"sig":"MEYCIQCozif3e59Q4o9Rg4sUyDPi2zd432WH1wVR92K/VzWUUQIhANRgkYhkr2oQ4Mou4yyPqFnlb1s8zh9OagNjAkpsIwpp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1861135},"type":"module","engines":{"node":">=20"},"gitHead":"7f0aeb876aac4e6b77e9767008ab02f87977fbb5","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.1_1784365399611_0.34098509107721653","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bobo-ai/spellcast-universe","version":"0.1.2","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.2","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"a098ee253bf891ccbffcc57663b740f1816845b8","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.2.tgz","fileCount":157,"integrity":"sha512-nfAeUPNoIZ/E4KSt0mlIKa1kIkM8lQ/xso3TP7wsgRLNOG9+xMp5ZzAJKdBVhQUlE23Yf8woAybhBfJU9iapyg==","signatures":[{"sig":"MEUCIQCdKCsyZfB1QfN1Th6StLibVFz26j2I8fWu1882okClqAIgP0yXmDgjqsxxwsGJYw5bpDnzwBBruD9nRvx/7u5nEb8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1862565},"type":"module","engines":{"node":">=20"},"gitHead":"7f0aeb876aac4e6b77e9767008ab02f87977fbb5","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.2_1784366533741_0.2513589587120917","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bobo-ai/spellcast-universe","version":"0.1.3","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.3","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"},{"name":"m6jo","email":"calpiswayne@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"10ab41acd10a6b3af3b43209f1d49eb9d8cf3d4e","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.3.tgz","fileCount":158,"integrity":"sha512-Q6RVW514PmmZE07zkN5D3fTGWVTqjME4u3XDJ3Xou4AhH80HWdr+SkT/Sc085gcaQ2roXsUxsaiwf5cO+3enmQ==","signatures":[{"sig":"MEUCIQDoa6vj93qd75rdunZ/tmIV4eVChqgtUptKanzOAleJ9AIgBFfuIesL8gcwHlotiNNXFiPkF7wusdwO49lTfs/q2WY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1885688},"type":"module","engines":{"node":">=20"},"gitHead":"793af6c65375edd0a2f3faf57b967bad5e859fe4","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.3_1784374113628_0.8847391897128856","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@bobo-ai/spellcast-universe","version":"0.1.4","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.4","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"},{"name":"m6jo","email":"calpiswayne@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"c83addd891eab2adb738d04b99ee3ecba55c60d6","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.4.tgz","fileCount":158,"integrity":"sha512-pcqpJFNfpHFImgMB/2HevGDG12z4gYfoOyYg2WmRECYH+DjxZ61pkQwzCRjt1W8UZXf+lTQlu9qqUO7v2m/kPw==","signatures":[{"sig":"MEYCIQD6hiy3QLJfsA1jUhhKsKPVPztgL1mwfdY6Yyh06cJ0FQIhALeTEDhnRXpBy+qb57Dlfx5djBj6L7ZBoFFJ9k4tycuH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1890803},"type":"module","engines":{"node":">=20"},"gitHead":"793af6c65375edd0a2f3faf57b967bad5e859fe4","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.4_1784374676611_0.900054065836946","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@bobo-ai/spellcast-universe","version":"0.1.5","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.5","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"},{"name":"m6jo","email":"calpiswayne@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"f76c0609b8fd8fa970cefee499667e5cc23d7aa9","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.5.tgz","fileCount":158,"integrity":"sha512-AqgGWJmHrK7YaHPtrQfxBE4u0ftUCQDXlERWtzg0+T24TVIYJ3lBDRMhYtGMKaNYdZB2uEYjSebfmg684/Ejfw==","signatures":[{"sig":"MEUCIQCi9csWEfi01nYGgdtzsT2T/zdf1/hvsUMcuRtd6ufkeAIgCsVizkwOanvRxjfbs2UNs9lvFasP25+To0aSf0iaIBE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1890635},"type":"module","engines":{"node":">=20"},"gitHead":"793af6c65375edd0a2f3faf57b967bad5e859fe4","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.5_1784375028442_0.5584661729082634","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@bobo-ai/spellcast-universe","version":"0.1.7","keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","_id":"@bobo-ai/spellcast-universe@0.1.7","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"bin":{"spellcast":"bin/spellcast.mjs"},"dist":{"shasum":"fd253d4bd54256d765d1ed1af36504e73948acf9","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.7.tgz","fileCount":156,"integrity":"sha512-BeqQpeY5pclzFB/VRDggDF4SPrEEc8biiEincc2g6KKv77n7a3zORsB9pXzxLxKbjGO/yFgJQ5SS3jKSvkAHnw==","signatures":[{"sig":"MEUCIQDMmNjYiR3iX1gNvboLP5wTgs2tbo6l1F1wux2xcK4+7gIgNdk3nUBVIVy03zID3AEPuvURharJaykUpNarY81ju20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1877556},"type":"module","engines":{"node":">=20"},"gitHead":"cfbe5c95d7490e68b013b472bd7f2bd31a68d84f","scripts":{"lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","test":"node --test test/*.test.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","upstream:check":"node scripts/verify-upstreams.mjs","import-upstreams":"node scripts/import-upstreams.mjs"},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"_npmVersion":"10.9.8","description":"Turn creative intent into validated spells and cast them into images with Codex.","directories":{},"_nodeVersion":"22.22.3","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/spellcast-universe_0.1.7_1786360257572_0.8626088492550132","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@bobo-ai/spellcast-universe","version":"0.1.9","description":"Turn creative intent into validated spells and cast them into images with Codex.","type":"module","bin":{"spellcast":"bin/spellcast.mjs"},"engines":{"node":">=20"},"scripts":{"test":"node --test test/*.test.mjs","upstream:check":"node scripts/verify-upstreams.mjs","lint":"node --check bin/spellcast.mjs && node --check src/*.mjs && node --check scripts/import-upstreams.mjs && node --check scripts/verify-upstreams.mjs","check":"npm run lint && npm run upstream:check && npm test","pack:check":"npm pack --dry-run","import-upstreams":"node scripts/import-upstreams.mjs"},"keywords":["codex","image-generation","prompt","cli","spell"],"license":"SEE LICENSE IN LICENSE","publishConfig":{"access":"public"},"_id":"@bobo-ai/spellcast-universe@0.1.9","gitHead":"980bf29c2261e1c0eaba6a72445a1ccfaa2c1560","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-oHzHtD13RTqlfo4LM6mSWQROhJSqBQ0CZSbF22i5BGPh3+3jcd+DWQWw0al/CtMYUfdYOhmOfHcWHDLirhW32g==","shasum":"d15ba3da24f691c543559d5d5f7965a2d97e7dae","tarball":"https://registry.npmjs.org/@bobo-ai/spellcast-universe/-/spellcast-universe-0.1.9.tgz","fileCount":156,"unpackedSize":1879086,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGHJ9ohHS1n5Zw/dSs/tOTZyUUvLElgN6GIV6Lp1Pr3VAiBpVfEnhes8XPLYJUDik6EukXu8HWAcuvEYQrugYJKgdw=="}]},"_npmUser":{"name":"liccabobo","email":"licca.bobo@gmail.com"},"directories":{},"maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spellcast-universe_0.1.9_1786361762435_0.8136736074220445"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-18T08:52:14.726Z","modified":"2026-08-10T11:36:02.810Z","0.1.0":"2026-07-18T08:52:14.987Z","0.1.1":"2026-07-18T09:03:19.796Z","0.1.2":"2026-07-18T09:22:13.900Z","0.1.3":"2026-07-18T11:28:33.859Z","0.1.4":"2026-07-18T11:37:56.804Z","0.1.5":"2026-07-18T11:43:48.691Z","0.1.7":"2026-08-10T11:10:57.750Z","0.1.9":"2026-08-10T11:36:02.616Z"},"license":"SEE LICENSE IN LICENSE","keywords":["codex","image-generation","prompt","cli","spell"],"description":"Turn creative intent into validated spells and cast them into images with Codex.","maintainers":[{"name":"liccabobo","email":"licca.bobo@gmail.com"}],"readme":"# Spellcast Universe\n\n**Write a prompt. Cast images. Keep the whole run reproducible.**\n\n[繁體中文說明請見本文下方](#繁體中文說明)\n\nSpellcast Universe is a local-first Codex CLI built from Prompt Universe and\nImage Gen Runner. It makes the useful outputs visible in your project instead\nof hiding them in a chat or an internal runtime.\n\n## Inspiration\n\nCreative image work is fast to start but difficult to repeat: the successful\ninstruction lives in chat history, and the result lives in a folder called\n`final-v7`. Spellcast Universe keeps the prompt, run record, and images together.\n\n## What it does\n\n```bash\nnpm i -g @bobo-ai/spellcast-universe\nmkdir my-spellbook && cd my-spellbook\nspellcast prompt \"a strawberry with tiny dewdrops, storybook illustration\"\nspellcast 4\n```\n\nThere is no required `init` step. The first command automatically creates:\n\n```text\nprompts/       # readable, editable Prompt Universe Markdown\nimages/        # a separate folder for every image run\n.spellcast/    # internal runtime snapshots, manifests, and resumable state\n```\n\n`prompt` calls Codex to author one structured Prompt Universe `defprompt`,\ncompiles and validates it, caches the resulting Markdown by intent, then prints\nthe Markdown path. Single-prompt creation does not create a variant expansion\nplan or edit `prompt-universe.asd`. `spellcast 4` uses the current prompt to\ncreate four images and prints the `images/` path when collection completes.\n\n## How we built it\n\nSpellcast Universe is an npm CLI with two version-locked bundled runtimes:\n\n- Prompt Universe writes, compiles, validates, and expands structured prompts.\n- Image Gen Runner prepares Codex jobs, keeps image sessions isolated, and\n  enforces safe collection and cleanup rules.\n\n`UPSTREAM-LOCK.json` records the imported revisions. The bundled code is copied\ninto each project's `.spellcast/runtime/`; Spellcast Universe never modifies the\noriginal Prompt Universe or Image Gen Runner development repositories.\n\n## Challenges we ran into\n\nThe source projects deliberately put guardrails around prompt validation,\napproval, runner wave gates, image sessions, and cleanup. The CLI makes the\ncommon path short without removing those boundaries.\n\nLong-running work also must not look frozen. Every external step reports what it\nis doing and records phase timings: workspace setup, Codex authoring, Prompt\nUniverse compilation or expansion, runner preparation, image launch, collection,\nand final paths.\n\nAutomated image casting currently requires macOS Terminal.app, Node.js 20+, Python\n3, SBCL, and a signed-in Codex CLI. Run `spellcast doctor` before your first cast.\n\n## Accomplishments that we're proud of\n\n- A two-command creative flow with real Markdown and image files in the project.\n- Per-run provenance, external-tool progress, and resumable runner state.\n- One-way, revision-locked upstream integration that preserves both source repos.\n- Validated variant batches that can be generated and cast without hand-copying files.\n\n## What we learned\n\nA compact command surface should hide orchestration, not the creative decision\nor its provenance. A visible prompt file and visible image folder make both\niteration and recovery much easier.\n\n## What's next for ThreadCommander\n\nImprove result viewing and cross-platform manual image import, then continue\nmaking the wider ThreadCommander workflow available without making the everyday\nSpellcast flow more complex.\n\n## Built With\n\nNode.js, Common Lisp/SBCL, Python 3, Codex CLI, macOS Terminal.app, Prompt\nUniverse, and Image Gen Runner.\n\n## Try it out\n\n### Create a prompt, then images\n\n```bash\nnpm i -g @bobo-ai/spellcast-universe\nmkdir my-spellbook && cd my-spellbook\n\nspellcast doctor\nspellcast -v\nspellcast --version\nspellcast update\nspellcast prompt \"a golden mango jelly mascot, transparent glass texture, storybook illustration\"\nspellcast 4\n```\n\nThe prompt command prints a path such as `prompts/golden-mango-jelly-....md`.\nRepeating the same normalized intent reuses the cached Markdown while the file\nstill exists. The image command prints a path such as `images/images-golden-mango-.../`.\nUse `spellcast 4 --dry-run` to inspect the image plan without calling the runner.\n\n### Check and update\n\n```bash\nspellcast -v\nspellcast --version\nspellcast update\n```\n\n`spellcast update` installs the latest published CLI globally with npm. It is\nequivalent to:\n\n```bash\nnpm install -g @bobo-ai/spellcast-universe@latest\n```\n\n### Do both in one command\n\n```bash\nspellcast \"a strawberry with tiny dewdrops, storybook illustration\" 4\n```\n\nAdd `--review` to write the validated prompt and stop before image generation.\n\n### Create prompt variants\n\n```bash\nspellcast prompts/strawberry.md \"change the fruit and background\" --variant --count 100\n```\n\nThis calls Codex to author the variation plan and Prompt Universe to validate\nand export 100 Markdown prompts into a new `prompts-...-variants-.../` directory.\nVariant plans are loaded directly from `lisp/generator/plans/`; generated spells\ndo not edit `prompt-universe.asd`.\nIt does not generate images unless you explicitly add `--run`:\n\n```bash\nspellcast prompts/strawberry.md \"change the fruit and background\" --variant --count 100 --run\n```\n\n### Cast a prompt batch\n\n```bash\nspellcast prompts-strawberry-variants-2026-07-18/ --all\nspellcast prompts-strawberry-variants-2026-07-18/ 4\n```\n\nThe first command casts every prompt once. The second casts only the first four,\nin stable filename order. Use `spellcast status` to inspect runs and\n`spellcast resume <run-id>` to continue a runner wave and export any collected\nimages back into `images/`.\n\n```bash\nspellcast status\nspellcast status <run-id>\n```\n\n`status <run-id>` reports the current phase (for example `authoring`,\n`compiling`, `image-launch`, or `image-collection`), known phase timings, its\nlatest message, and the known prompt, image, and runner paths.\n\n`npx @bobo-ai/spellcast-universe …` remains available for a one-off run, but\nglobal installation is the recommended CLI workflow.\n\n## Share what you create\n\nIf Spellcast Universe helped you create an image you love, discover an\ninteresting workflow, or sparked an idea, I'd genuinely love to hear from you.\n\nYou're welcome to share your creations, feedback, or suggestions by email:\n[licca.bobo@gmail.com](mailto:licca.bobo@gmail.com).\n\nEven a short note is always appreciated.\n\n## License and attribution\n\nSpellcast Universe is source-available under the\n[Spellcast Universe Source-Available License](LICENSE).\n\nYou may use, copy, modify, fork, and redistribute the software for personal,\nfan, educational, research, and other non-commercial purposes. You may also sell\nor otherwise commercialize images, artwork, merchandise, and other creative\noutputs you generate with the software.\n\nYou may not sell, host, white-label, wrap, or package Spellcast Universe, Prompt\nUniverse, Image Gen Runner, or modified versions of them as a commercial product,\nSaaS, API, app, CLI, marketplace tool, or paid backend without a separate written\ncommercial license from Licca Bobo.\n\nSee [notices](licenses/NOTICE.md) for bundled component attribution.\n\n---\n\n# 繁體中文說明\n\n**寫下咒語，生成圖片，保留整次創作的可追溯紀錄。**\n\nSpellcast Universe 是一個以 Codex 為核心、在本機執行的 CLI。它整合\nPrompt Universe 與 Image Gen Runner，將咒語、執行紀錄與圖片放回你的創作專案。\n\n## Inspiration\n\n圖片創作很容易開始，卻很難重現：成功的描述散落在聊天紀錄，圖片則躺在\n`final-v7` 類型的資料夾。Spellcast Universe 把咒語、設定、run 紀錄與圖片放在一起。\n\n## What it does\n\n```bash\nnpm i -g @bobo-ai/spellcast-universe\nmkdir my-spellbook && cd my-spellbook\nspellcast prompt \"一顆草莓\"\nspellcast 4\n```\n\n不需要先執行 `init`。第一次使用會自動建立：\n\n```text\nprompts/       # 使用者可閱讀、編輯的 Prompt Universe Markdown 咒語\nimages/        # 每次產圖各自獨立的結果資料夾\n.spellcast/    # 內部 runtime 快照、manifest 與可恢復狀態\n```\n\n`prompt` 會呼叫 Codex 撰寫單一結構化 Prompt Universe `defprompt`、編譯並驗證，\n依 intent 快取 Markdown，完成後顯示路徑。單次咒語不會建立變體展開計畫，也不會\n修改 `prompt-universe.asd`。`spellcast 4` 使用目前咒語產生四張圖片，收集完成後\n顯示 `images/` 路徑。\n\n## How we built it\n\nSpellcast Universe 是 npm CLI，內含兩個 revision lock 的 runtime：\n\n- Prompt Universe：結構化咒語、編譯、驗證與變體擴展。\n- Image Gen Runner：Codex 任務準備、圖片 session 隔離與安全收集／清理。\n\n`UPSTREAM-LOCK.json` 記錄匯入 revision。每個專案會將 runtime 複製至\n`.spellcast/runtime/`；Spellcast Universe 不會修改原始的 Prompt Universe 或\nImage Gen Runner 開發專案。\n\n## Challenges we ran into\n\n兩個來源專案對驗證、審核、wave gate、圖片 session 與清理都有必要的安全邊界。\n新的 CLI 縮短日常操作，但保留這些限制。\n\n所有耗時工作都會顯示即時狀態並記錄階段耗時：自動初始化、Codex 寫入咒語、\nPrompt Universe 編譯或擴展、runner 準備、圖片啟動與收集，以及最終輸出位置。\n\n自動產圖目前需要 macOS Terminal.app、Node.js 20+、Python 3、SBCL 與已登入的\nCodex CLI。第一次使用前請執行 `spellcast doctor`。\n\n## Accomplishments that we're proud of\n\n- 兩個指令即可完成創作，並產出專案內真正可讀的 Markdown 與圖片檔。\n- 每次 run 都保存來源、外部工具進度與可恢復狀態。\n- 單向、revision lock 的上游整合，不影響兩個原始專案。\n- 經驗證的變體批次可直接產圖，不需手動搬移檔案。\n\n## What we learned\n\n簡短的命令不該隱藏創作決定或來源。讓咒語與圖片輸出位置清楚可見，能讓迭代與\n中斷後恢復都更可靠。\n\n## What's next for ThreadCommander\n\n下一步會改善結果檢視與跨平台手動圖片匯入，並逐步帶入 ThreadCommander 的更多工作流，\n同時維持日常 Spellcast 操作的簡潔。\n\n## Built With\n\nNode.js、Common Lisp/SBCL、Python 3、Codex CLI、macOS Terminal.app、Prompt\nUniverse 與 Image Gen Runner。\n\n## Try it out\n\n### 先生成咒語，再生成圖片\n\n```bash\nnpm i -g @bobo-ai/spellcast-universe\nmkdir my-spellbook && cd my-spellbook\n\nspellcast doctor\nspellcast -v\nspellcast --version\nspellcast update\nspellcast prompt \"金色芒果果凍吉祥物，透明玻璃質感，童話插畫\"\nspellcast 4\n```\n\n咒語會顯示類似 `prompts/golden-mango-jelly-....md` 的路徑；相同 normalized intent\n在檔案仍存在時會重用快取 Markdown。圖片會顯示類似 `images/images-golden-mango-.../`\n的路徑。可先使用 `spellcast 4 --dry-run` 檢視產圖計畫，不呼叫 image runner。\n\n### 檢查版本與更新\n\n```bash\nspellcast -v\nspellcast --version\nspellcast update\n```\n\n`spellcast update` 會用 npm 安裝最新發布的全域 CLI，等同於：\n\n```bash\nnpm install -g @bobo-ai/spellcast-universe@latest\n```\n\n### 一口氣完成咒語與產圖\n\n```bash\nspellcast \"一顆草莓\" 4\n```\n\n加上 `--review` 只會寫入並驗證咒語，不會開始產圖。\n\n### 批次生成變體咒語\n\n```bash\nspellcast prompts/strawberry.md \"更換各種水果和背景\" --variant --count 100\n```\n\n這會呼叫 Codex 撰寫變體規則，再由 Prompt Universe 驗證並匯出 100 份 Markdown\n到新的 `prompts-...-variants-.../` 資料夾。變體 plan 會直接從\n`lisp/generator/plans/` 載入；生成咒語不會修改 `prompt-universe.asd`。預設不會\n產圖；只有明確加上 `--run` 才會接著產圖：\n\n```bash\nspellcast prompts/strawberry.md \"更換各種水果和背景\" --variant --count 100 --run\n```\n\n### 對整批咒語產圖\n\n```bash\nspellcast prompts-strawberry-variants-2026-07-18/ --all\nspellcast prompts-strawberry-variants-2026-07-18/ 4\n```\n\n第一行會對資料夾內每份咒語各產一張圖；第二行只會依穩定檔名順序處理前四份。\n使用 `spellcast status` 查看 run，使用 `spellcast resume <run-id>` 繼續 wave 並將\n已收集圖片匯出到 `images/`。\n\n```bash\nspellcast status\nspellcast status <run-id>\n```\n\n`status <run-id>` 會顯示目前階段（例如 `authoring`、`compiling`、`image-launch`\n或 `image-collection`）、已知階段耗時、最新訊息，以及已知的咒語、圖片與 runner 路徑。\n\n`npx @bobo-ai/spellcast-universe …` 仍可單次使用，但主要建議採用全域安裝。\n\n## 分享你的作品與想法\n\n如果 Spellcast Universe 幫你生成了喜歡的圖片、找到有趣的創作方式，\n或讓你想到任何可以改進的地方，我都很期待收到你的來信。\n\n歡迎把作品、使用心得或建議寄到：\n[licca.bobo@gmail.com](mailto:licca.bobo@gmail.com)。\n\n即使只是一小段感想，對我來說也很珍貴。\n\n## License and attribution\n\nSpellcast Universe 採用\n[Spellcast Universe Source-Available License](LICENSE)。\n\n你可以在個人、粉絲創作、教育、研究與其他非商用情境免費使用、複製、修改、fork\n與重新散布本軟體。你也可以販售或商用你用本軟體生成的圖片、作品、商品與其他創作輸出。\n\n你不能在未取得 Licca Bobo 書面商業授權的情況下，將 Spellcast Universe、Prompt\nUniverse、Image Gen Runner 或其修改版，作為商業產品、SaaS、API、app、CLI、市集工具、\n白牌服務或付費後端來販售、託管、包裝或提供。\n\n內含元件 attribution 請見 [notices](licenses/NOTICE.md)。\n","readmeFilename":"README.md"}