{
  "markdown": "# StoryCanon\n\nStoryCanon は、ChatGPT で生成・相談した小説の設定、本文、キャラクター、世界観、伏線、TODO、現在の物語状態を作品ごとに保存するための MVP 実装です。\n\n## 構成\n\n- `apps/web`: Next.js + TypeScript + Prisma + PostgreSQL の Web/API アプリ\n- `packages/db`: Prisma クライアント。Node と Cloudflare Workers で別の生成物が要るため独立したパッケージにしてある（[後述](#prisma-クライアント)）\n- `docs`: 内部仕様、外部仕様、移行の記録\n- `tests/integration`: ローカル結合テスト\n\n## デプロイ先\n\n本番は **Cloudflare Workers + Supabase PostgreSQL（東京）** で稼働している。\n`main` への push で `.github/workflows/deploy-workers.yml` がマイグレーションとデプロイを行う。\n\n2026-08-30 までは AWS（ALB + ECS Fargate + RDS）だった。移行の経緯と当時ハマった点は\n[docs/cloudflare-cutover.md](docs/cloudflare-cutover.md) に残してある。**AWS 側の資源は撤去済みで、\nCDK のブートストラップも消してあるため、AWS へ戻すには `cdk bootstrap` からやり直しになる。**\n\n## ローカル開発\n\n```powershell\nnpm install\nCopy-Item .env.example apps/web/.env\ndocker compose up -d postgres\nnpm run prisma:migrate -w apps/web\nnpm run dev -w apps/web\n```\n\n## テスト\n\n```powershell\nnpm run test -w apps/web        # ユニット\nnpm run test:integration        # 結合（外部リソースは作らない）\n```\n\n## Prisma クライアント\n\nPrisma 7 は TypeScript しか出力しないため、クライアントは `packages/db` でコンパイルしてから使う。\nNode と workerd では**必要な生成物が違う**ので両方を作り、`package.json` の conditional export で\n振り分けている。呼び出し側は `@storycanon/db` を import するだけでよい。\n\n生成物は git 管理外で、`npm run dev` / `build` / `test` / `lint` が必要な方を自動で作る。\n`tsc` を単体で走らせる場合だけ、先に `npm run db:node -w apps/web` が要る。\n\n## Cloudflare へのデプロイ\n\n通常は `main` への push で CI が行う。手元から出す場合は `apps/web` で:\n\n```powershell\nnpm run deploy:worker\n```\n\n**`npx opennextjs-cloudflare build` を直接叩かないこと。** `deploy:worker` は\n`scripts/build-worker.mjs` 経由でローカルの `.env` 類を退避してからビルドする。\nこれを飛ばすと `next build` がローカルの値をバンドルに焼き込み、`NEXTAUTH_SECRET` が\n開発用の値のまま本番に乗る。\n",
  "bytes": 1639,
  "sha": "eafac0faf84f9d681142d53f2d8287f5de54b535ce72712b3e1f02ffc59808b0",
  "repo_slug": "exp3/storycanon",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_jp_softglow_storycanon_0a5d6ccd/readme"
}