[{"data":1,"prerenderedAt":794},["ShallowReactive",2],{"navigation":3,"doc-/getting-started/dev-loop":217,"docs-all-paths":739},[4,19,39,63,87,111,127,195,211],{"title":5,"path":6,"stem":7,"children":8},"Welcome","/welcome","01.welcome",[9,11,15],{"title":5,"path":6,"stem":10},"01.welcome/index",{"title":12,"path":13,"stem":14},"Astar とは（5分）","/welcome/product-in-5-min","01.welcome/01.product-in-5-min",{"title":16,"path":17,"stem":18},"事業文脈","/welcome/business-context","01.welcome/02.business-context",{"title":20,"path":21,"stem":22,"children":23},"Getting Started","/getting-started","02.getting-started",[24,27,31,35],{"title":25,"path":21,"stem":26},"はじめかた","02.getting-started/index",{"title":28,"path":29,"stem":30},"リポジトリ取得と環境構築","/getting-started/repo-setup","02.getting-started/01.repo-setup",{"title":32,"path":33,"stem":34},"日々の開発ループ","/getting-started/dev-loop","02.getting-started/02.dev-loop",{"title":36,"path":37,"stem":38},"検証の 4 層","/getting-started/verification-tiers","02.getting-started/03.verification-tiers",{"title":40,"path":41,"stem":42,"children":43},"Architecture","/architecture","03.architecture",[44,47,51,55,59],{"title":45,"path":41,"stem":46},"アーキテクチャ","03.architecture/index",{"title":48,"path":49,"stem":50},"マルチテナンシーと RLS","/architecture/multi-tenancy-rls","03.architecture/01.multi-tenancy-rls",{"title":52,"path":53,"stem":54},"認可モデル","/architecture/authorization","03.architecture/02.authorization",{"title":56,"path":57,"stem":58},"AI サブシステム","/architecture/ai-subsystem","03.architecture/03.ai-subsystem",{"title":60,"path":61,"stem":62},"データモデル","/architecture/data-model","03.architecture/04.data-model",{"title":64,"path":65,"stem":66,"children":67},"Backend","/backend","04.backend",[68,71,75,79,83],{"title":69,"path":65,"stem":70},"バックエンド","04.backend/index",{"title":72,"path":73,"stem":74},"層構造","/backend/layering","04.backend/01.layering",{"title":76,"path":77,"stem":78},"規約","/backend/conventions","04.backend/02.conventions",{"title":80,"path":81,"stem":82},"テスト","/backend/testing","04.backend/03.testing",{"title":84,"path":85,"stem":86},"マイグレーション","/backend/migrations","04.backend/04.migrations",{"title":88,"path":89,"stem":90,"children":91},"Frontend","/frontend","05.frontend",[92,95,99,103,107],{"title":93,"path":89,"stem":94},"フロントエンド","05.frontend/index",{"title":96,"path":97,"stem":98},"モジュール内部構造","/frontend/module-anatomy","05.frontend/01.module-anatomy",{"title":100,"path":101,"stem":102},"API アクセスの一本道","/frontend/api-access-chain","05.frontend/02.api-access-chain",{"title":104,"path":105,"stem":106},"i18n","/frontend/i18n","05.frontend/03.i18n",{"title":108,"path":109,"stem":110},"デザインシステム","/frontend/design-system","05.frontend/04.design-system",{"title":112,"path":113,"stem":114,"children":115},"Go Agent And Cli","/go-agent-and-cli","06.go-agent-and-cli",[116,119,123],{"title":117,"path":113,"stem":118},"Go agent と CLI","06.go-agent-and-cli/index",{"title":120,"path":121,"stem":122},"Go agent","/go-agent-and-cli/go-agent","06.go-agent-and-cli/01.go-agent",{"title":124,"path":125,"stem":126},"CLI","/go-agent-and-cli/cli","06.go-agent-and-cli/02.cli",{"title":128,"path":129,"stem":130,"children":131},"Modules","/modules","07.modules",[132,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191],{"title":133,"path":129,"stem":134},"モジュール","07.modules/index",{"title":136,"path":137,"stem":138},"テーブル","/modules/table","07.modules/01.table",{"title":140,"path":141,"stem":142},"ドキュメントツリー","/modules/document","07.modules/02.document",{"title":144,"path":145,"stem":146},"AIチャット","/modules/ai","07.modules/03.ai",{"title":148,"path":149,"stem":150},"認証・権限","/modules/auth","07.modules/04.auth",{"title":152,"path":153,"stem":154},"AI取込","/modules/organize","07.modules/05.organize",{"title":156,"path":157,"stem":158},"ストレージ","/modules/storage","07.modules/06.storage",{"title":160,"path":161,"stem":162},"NAS同期","/modules/sync","07.modules/07.sync",{"title":164,"path":165,"stem":166},"ワークスペース","/modules/workspace","07.modules/08.workspace",{"title":168,"path":169,"stem":170},"テナントとメンバーシップ","/modules/tenant-membership","07.modules/09.tenant-membership",{"title":172,"path":173,"stem":174},"検索","/modules/search","07.modules/10.search",{"title":176,"path":177,"stem":178},"表示ビュー","/modules/display","07.modules/11.display",{"title":180,"path":181,"stem":182},"テンプレート","/modules/template","07.modules/12.template",{"title":184,"path":185,"stem":186},"メール","/modules/mail","07.modules/13.mail",{"title":188,"path":189,"stem":190},"電話","/modules/phone","07.modules/14.phone",{"title":192,"path":193,"stem":194},"リアルタイム","/modules/realtime","07.modules/15.realtime",{"title":196,"path":197,"stem":198,"children":199},"Infra And Deploy","/infra-and-deploy","08.infra-and-deploy",[200,203,207],{"title":201,"path":197,"stem":202},"インフラとデプロイ","08.infra-and-deploy/index",{"title":204,"path":205,"stem":206},"環境の種類","/infra-and-deploy/environments","08.infra-and-deploy/01.environments",{"title":208,"path":209,"stem":210},"セルフホスト構成","/infra-and-deploy/self-host","08.infra-and-deploy/02.self-host",{"title":212,"path":213,"stem":214,"children":215},"docs-map","/docs-map","09.docs-map/index",[216],{"title":212,"path":213,"stem":214},{"id":218,"title":32,"body":219,"description":733,"extension":734,"meta":735,"navigation":736,"path":33,"seo":737,"stem":34,"__hash__":738},"docs/02.getting-started/02.dev-loop.md",{"type":220,"value":221,"toc":723},"minimark",[222,225,254,261,271,275,423,434,438,441,530,537,541,554,616,631,648,652,665,676,680,713,719],[223,224,32],"h1",{"id":32},[226,227,229],"callout",{"type":228},"warning",[230,231,232,245,246,249,250,253],"p",{},[233,234,235,236,240,241,244],"strong",{},"contributor の inner loop は ",[237,238,239],"code",{},"/wt"," + dev-lifecycle skill です。",[237,242,243],{},"docker compose"," ではありません。"," ",[237,247,248],{},"docker-compose.selfhost.yml"," は顧客向けセルフホストデプロイ用のバンドルで、日々の開発では登場しません（",[251,252,28],"a",{"href":29}," 参照）。backend/frontend はホスト側で直接プロセスとして動きます。",[255,256,258,260],"h2",{"id":257},"wt-worktree-オーケストレーター",[237,259,239],{}," — worktree オーケストレーター",[230,262,263,264,266,267,270],{},"複数の変更を並行で進めるとき、1 つの checkout を使い回すとブランチの切り替えのたびに DB・ポート・node_modules が衝突します。",[237,265,239],{}," はこれを解決する仕組みで、変更ごとに独立した git worktree（",[237,268,269],{},".claude/worktrees/\u003Cname>","）を作り、DB・ポート・MinIO の key-prefix をすべて自動で分離します。",[272,273,274],"h3",{"id":274},"コマンド",[276,277,278,290],"table",{},[279,280,281],"thead",{},[282,283,284,287],"tr",{},[285,286,274],"th",{},[285,288,289],{},"やること",[291,292,293,323,341,353,375,385,403,413],"tbody",{},[282,294,295,301],{},[296,297,298],"td",{},[237,299,300],{},"/wt start \u003Cname>",[296,302,303,304,306,307,310,311,314,315,318,319,322],{},"worktree を作成（",[237,305,269],{},"、ブランチ ",[237,308,309],{},"feat/\u003Cname>","）。frontend の ",[237,312,313],{},"node_modules"," を main からシンボリックリンク。スロット (1-9) を割り当て、DB (",[237,316,317],{},"astarmanagement_dev_wt\u003CN>",") を作成し、Caddy proxy に反映。",[233,320,321],{},"既定では backend/frontend を起動しません","（provision のみ）",[282,324,325,330],{},[296,326,327],{},[237,328,329],{},"/wt start \u003Cname> --with-server",[296,331,332,333,336,337,340],{},"上記に加えて backend/frontend も起動（",[237,334,335],{},"start"," + ",[237,338,339],{},"serve"," を一度に）",[282,342,343,348],{},[296,344,345],{},[237,346,347],{},"/wt serve \u003Cname>",[296,349,350,352],{},[237,351,335],{}," 済みの worktree に対して backend/frontend を起動。すでに動いていれば何もしない（冪等）",[282,354,355,360],{},[296,356,357],{},[237,358,359],{},"/wt sync \u003Cname>",[296,361,362,363,366,367,370,371,374],{},"その worktree 自身の backend に対して ",[237,364,365],{},"openapi:all"," を実行し、frontend の型 (",[237,368,369],{},"api.d.ts"," / ",[237,372,373],{},"zod-client.ts",") を再生成",[282,376,377,382],{},[296,378,379],{},[237,380,381],{},"/wt verify \u003Cname>",[296,383,384],{},"変更ファイルと必要な検証レイヤー (L1〜L4) を表示",[282,386,387,392],{},[296,388,389],{},[237,390,391],{},"/wt ship \u003Cname>",[296,393,394,395,398,399,402],{},"検証 → ",[237,396,397],{},"main"," が clean なことを確認 → ",[237,400,401],{},"--no-ff"," で merge → worktree を片付け",[282,404,405,410],{},[296,406,407],{},[237,408,409],{},"/wt cleanup \u003Cname>",[296,411,412],{},"サービス停止・DB 削除・スロット解放・git worktree 削除・ブランチ削除",[282,414,415,420],{},[296,416,417],{},[237,418,419],{},"/wt status",[296,421,422],{},"稼働中の worktree 一覧",[230,424,425,430,431,433],{},[233,426,427,429],{},[237,428,335],{}," が provision-only（起動しない）"," なのが重要な設計判断です。worktree を作るだけならメモリを消費しないので、並行で何個でも作って構いません。実際にサーバーが必要になったときだけ ",[237,432,339],{}," します。",[272,435,437],{"id":436},"スロットによるポートdb-分離","スロットによるポート・DB 分離",[230,439,440],{},"各 worktree にはスロット番号（0-9、main は常に 0）が割り当てられ、全サービスのポートと DB 名がそこから決定論的に導出されます。",[276,442,443,456],{},[279,444,445],{},[282,446,447,450,453],{},[285,448,449],{},"サービス",[285,451,452],{},"slot 0 (main)",[285,454,455],{},"slot N",[291,457,458,472,486,501,515],{},[282,459,460,462,467],{},[296,461,64],{},[296,463,464],{},[237,465,466],{},"8080",[296,468,469],{},[237,470,471],{},"8080 + N",[282,473,474,476,481],{},[296,475,88],{},[296,477,478],{},[237,479,480],{},"3000",[296,482,483],{},[237,484,485],{},"3000 + N",[282,487,488,491,496],{},[296,489,490],{},"Storybook",[296,492,493],{},[237,494,495],{},"6006",[296,497,498],{},[237,499,500],{},"6006 + N",[282,502,503,506,511],{},[296,504,505],{},"DB",[296,507,508],{},[237,509,510],{},"astarmanagement_dev",[296,512,513],{},[237,514,317],{},[282,516,517,520,525],{},[296,518,519],{},"MinIO key prefix",[296,521,522],{},[237,523,524],{},"tenant/local",[296,526,527],{},[237,528,529],{},"tenant/local-wt\u003CN>",[230,531,532,533,536],{},"PostgreSQL・MinIO のコンテナ自体は全 worktree で共有（",[237,534,535],{},"astarmanagement-postgres-dev"," など）。DB 名とポート番号だけで分離しているので、コンテナを worktree ごとに何個も立てる必要がありません。",[255,538,540],{"id":539},"dev-lifecycle-skill-プロセスの起動停止","dev-lifecycle skill — プロセスの起動・停止",[230,542,543,546,547,549,550,553],{},[237,544,545],{},"/wt serve"," の内部、あるいは ",[237,548,397],{}," checkout（slot 0）で直接作業するときは、dev-lifecycle skill (",[237,551,552],{},"lifecycle.sh",") が backend（Spring Boot）・frontend（Nuxt dev server）・Storybook の起動・停止・再起動・状態確認を担当します。",[555,556,561],"pre",{"className":557,"code":558,"language":559,"meta":560,"style":560},"language-bash shiki shiki-themes github-light github-dark",".claude/skills/dev-lifecycle/lifecycle.sh status\n.claude/skills/dev-lifecycle/lifecycle.sh start backend\n.claude/skills/dev-lifecycle/lifecycle.sh restart backend --profile dev\n.claude/skills/dev-lifecycle/lifecycle.sh stop all\n","bash","",[237,562,563,576,587,605],{"__ignoreMap":560},[564,565,568,572],"span",{"class":566,"line":567},"line",1,[564,569,571],{"class":570},"sScJk",".claude/skills/dev-lifecycle/lifecycle.sh",[564,573,575],{"class":574},"sZZnC"," status\n",[564,577,579,581,584],{"class":566,"line":578},2,[564,580,571],{"class":570},[564,582,583],{"class":574}," start",[564,585,586],{"class":574}," backend\n",[564,588,590,592,595,598,602],{"class":566,"line":589},3,[564,591,571],{"class":570},[564,593,594],{"class":574}," restart",[564,596,597],{"class":574}," backend",[564,599,601],{"class":600},"sj4cs"," --profile",[564,603,604],{"class":574}," dev\n",[564,606,608,610,613],{"class":566,"line":607},4,[564,609,571],{"class":570},[564,611,612],{"class":574}," stop",[564,614,615],{"class":574}," all\n",[230,617,618,619,622,623,626,627,630],{},"lsof + PID ファイルで既存プロセスを検出し、グレースフルシャットダウン（",[237,620,621],{},"SIGTERM"," → 5 秒後 ",[237,624,625],{},"SIGKILL","）とヘルスチェック（",[237,628,629],{},"/actuator/health"," など）でポーリングします。",[226,632,634],{"type":633},"info",[230,635,636,639,640,643,644,647],{},[237,637,638],{},"./gradlew bootRun"," や ",[237,641,642],{},"bun run dev"," を直接実行することは settings.json の deny 設定で禁止されています。",[233,645,646],{},"dev-lifecycle skill 経由でのみ","起動できます。理由は、直接起動だと孤立プロセス（PID ファイルなしで動き続けるプロセス）が発生しやすく、複数セッションが並行するとポート競合や「誰が何を動かしているか分からない」状態になりやすいためです。",[255,649,651],{"id":650},"実装はコードを書く前に-worktree-に入る","実装はコードを書く前に worktree に入る",[230,653,654,655,657,658,660,661,664],{},"コード変更は必ず worktree の中で行います。",[237,656,397],{}," の checkout を直接編集することはありません（hook で強制されています）。設計・スペック作成・レビューは ",[237,659,397],{},"（read-only）で行い、",[237,662,663],{},"/wt start"," で worktree ができたところから実装に入ります。",[230,666,667,668,671,672,675],{},"Astar Works の開発では、",[233,669,670],{},"実装そのものは専用の実装エージェント（Sonnet ベースの worker）に委譲するのが規約","です。メインの調査・設計セッションは実装コードを直接書かず、確定した設計とファイル一覧を worker に渡し、実装後に diff レベルでレビュー・検証してから ",[237,673,674],{},"/wt ship"," します。人間のエンジニアがこのリポジトリで作業する場合も、この「worktree を作ってから着手する」「変更後は検証してから ship する」というループ自体は同じです。",[255,677,679],{"id":678},"まとめ-1-周の流れ","まとめ — 1 周の流れ",[681,682,683,689,694,697,703,708],"ol",{},[684,685,686,688],"li",{},[237,687,300],{}," — worktree を作る（provision のみ）",[684,690,691,693],{},[237,692,347],{}," — backend/frontend を起動",[684,695,696],{},"変更を加える（worktree の中で）",[684,698,699,700,702],{},"API を変更したら ",[237,701,359],{}," で frontend の型を再生成",[684,704,705,707],{},[251,706,36],{"href":37}," に沿って検証",[684,709,710,712],{},[237,711,391],{}," — 検証 → merge → 片付け",[230,714,715,716,718],{},"次は ",[251,717,36],{"href":37}," で、上記 5 の中身を詳しく見ます。",[720,721,722],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":560,"searchDepth":578,"depth":578,"links":724},[725,730,731,732],{"id":257,"depth":578,"text":726,"children":727},"/wt — worktree オーケストレーター",[728,729],{"id":274,"depth":589,"text":274},{"id":436,"depth":589,"text":437},{"id":539,"depth":578,"text":540},{"id":650,"depth":578,"text":651},{"id":678,"depth":578,"text":679},"/wt worktree オーケストレーターと dev-lifecycle skill。contributor の inner loop がなぜ docker compose ではないか、実装がなぜ自分の手で書くものではないか。","md",{},{"title":32},{"title":32,"description":733},"jROk8tcvEPJRwdFM9_V8adQ6qLfq7HCMIKEPceEY224",[740,742,743,745,746,747,748,749,750,751,752,753,755,756,757,758,759,761,762,763,764,765,767,769,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,789,790,791,792],{"path":13,"title":741},"Astar とは何か（5分で）",{"path":17,"title":16},{"path":6,"title":744},"ようこそ",{"path":29,"title":28},{"path":33,"title":32},{"path":37,"title":36},{"path":21,"title":25},{"path":49,"title":48},{"path":53,"title":52},{"path":57,"title":56},{"path":61,"title":60},{"path":41,"title":754},"システムアーキテクチャ",{"path":73,"title":72},{"path":77,"title":76},{"path":81,"title":80},{"path":85,"title":84},{"path":65,"title":760},"バックエンドガイド",{"path":97,"title":96},{"path":101,"title":100},{"path":105,"title":104},{"path":109,"title":108},{"path":89,"title":766},"フロントエンドガイド",{"path":121,"title":768},"Go agent — NAS 同期エージェント",{"path":125,"title":770},"astar CLI",{"path":113,"title":117},{"path":137,"title":136},{"path":141,"title":140},{"path":145,"title":144},{"path":149,"title":148},{"path":153,"title":152},{"path":157,"title":156},{"path":161,"title":160},{"path":165,"title":164},{"path":169,"title":168},{"path":173,"title":172},{"path":177,"title":176},{"path":181,"title":180},{"path":185,"title":184},{"path":189,"title":188},{"path":193,"title":192},{"path":129,"title":788},"モジュール索引",{"path":205,"title":204},{"path":209,"title":208},{"path":197,"title":201},{"path":213,"title":793},"docs/ 地図",1785452454416]