@bstage-sdk/ai-toolkit 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -48,7 +48,7 @@ __export(index_exports, {
48
48
  module.exports = __toCommonJS(index_exports);
49
49
 
50
50
  // src/version.ts
51
- var VERSION = "0.5.0";
51
+ var VERSION = "0.6.0";
52
52
 
53
53
  // src/skills/deploy.ts
54
54
  function deploySkillMd() {
@@ -268,7 +268,7 @@ public/
268
268
 
269
269
  # \uD568\uC815
270
270
 
271
- - **sdk\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC9C0 \uC54A\uB294\uB2E4.** \`template.tsx\`(React)\uC640 \`.liquid\`\uAC00 \uD55C \uB808\uD3EC\uC5D0 \uAC19\uC774 \uC788\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4. \uD55C \uB808\uD3EC\uB294 \uD55C \uBC29\uC2DD\uB9CC.
271
+ - **sdk\uC640 \uD568\uAED8 \uC788\uB294 \uB808\uD3EC(\uD63C\uD569)\uC5D0\uC11C\uB294 \uC790\uB9AC\uB97C \uB098\uB208\uB2E4.** \`template.tsx\`(React)\uC640 \`.liquid\`\uAC00 \uD55C \uB808\uD3EC\uC5D0 \uC788\uC5B4\uB3C4 \uD3EC\uD138\uC774 sdk\uB97C \uBE4C\uB4DC\uD55C \uB4A4 liquid\uB97C \uD568\uAED8 \uD328\uD0A4\uC9D5\uD55C\uB2E4. \uB2E8 sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \`src/pages/user\`\xB7\`src/pages/admin\`\uC740 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC(\`dist/{user|admin}/\`)\uC640 \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC). \uD63C\uD569 \uB808\uD3EC\uC758 liquid \uBBF8\uB9AC\uBCF4\uAE30\uB294 \`bstage dev --kind liquid\`.
272
272
  - **liquid\uB294 PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5\uD558\uB2E4.** \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0\uB294 \uB123\uC744 \uC218 \uC5C6\uB2E4. \uD3EC\uD138\uC5D0\uC11C \uD398\uC774\uC9C0\uB97C \uB9CC\uB4E4 \uB54C \uCEE4\uC2A4\uD140 \uBC29\uC2DD\uC73C\uB85C \`liquid\`\uB97C \uACE0\uB978\uB2E4.
273
273
  - **\`data.json\`\uC740 \uB85C\uCEEC \uC804\uC6A9\uC774\uB2E4.** \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4. \uC2E4\uC81C \uB370\uC774\uD130\uC758 \uCD9C\uCC98\uAC00 \uC544\uB2C8\uBBC0\uB85C \uC5EC\uAE30 \uAC12\uC744 \uB9DE\uCDB0 \uB450\uACE0 "\uBC30\uD3EC\uD558\uBA74 \uC774 \uAC12\uC774 \uB098\uC628\uB2E4"\uACE0 \uAE30\uB300\uD558\uC9C0 \uC54A\uB294\uB2E4.
274
274
  - **\`layout.json\`\uB3C4 \uC9C0\uC6CC\uC9C4\uB2E4.** \uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720\uD55C\uB2E4 \u2014 \uB808\uD3EC\uC5D0\uC11C \uC815\uD558\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4.
@@ -471,7 +471,7 @@ description: b.stage \uCEE4\uC2A4\uD140 \uAC1C\uBC1C\uC744 \uCC98\uC74C\uBD80\uD
471
471
  - **liquid \uD15C\uD50C\uB9BF**: \uB370\uC774\uD130\uB97C \uBC1B\uC544 \uADF8\uB824 \uC8FC\uAE30\uB9CC \uD558\uBA74 \uB418\uB294 \uD654\uBA74\uC5D0 \uB9DE\uB294\uB2E4. \uBC30\uC6B0\uAE30 \uC27D\uACE0 \uBE60\uB974\uC9C0\uB9CC \uBE0C\uB77C\uC6B0\uC800 \uCABD \uB85C\uC9C1\uC740 \uC81C\uD55C\uB41C\uB2E4.
472
472
  - **(c) \uC5B4\uB514\uC5D0 \uBC30\uD3EC\uD558\uB098** \u2014 \uBC30\uD3EC \uD658\uACBD(phase)\uACFC \uC2A4\uD14C\uC774\uC9C0 ID. \uBAA8\uB974\uBA74 "\uD3EC\uD138\uC5D0 \uB85C\uADF8\uC778\uD588\uC744 \uB54C \uBCF4\uC774\uB294 \uC2A4\uD14C\uC774\uC9C0 \uC774\uB984"\uC774\uB77C\uACE0 \uC54C\uB824\uC8FC\uACE0, 1\uB2E8\uACC4\uC5D0\uC11C\uB294 \uBE44\uC6CC \uB454 \uCC44 \uC9C4\uD589\uD574\uB3C4 \uB41C\uB2E4(6\uB2E8\uACC4\uC5D0\uC11C \`bstage link\`\uAC00 \uBAA9\uB85D\uC73C\uB85C \uBB3C\uC5B4\uBCF8\uB2E4).
473
473
 
474
- \uD55C \uB808\uD3EC\uC5D0\uB294 **\uD55C \uBC29\uC2DD\uB9CC** \uB2F4\uB294\uB2E4. React\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4.
474
+ \uD55C \uB808\uD3EC\uC5D0 \uB450 \uBC29\uC2DD\uC744 \uD568\uAED8 \uB458 \uC218\uB3C4 \uC788\uB2E4(\uD63C\uD569 \uB808\uD3EC) \u2014 \uD3EC\uD138\uC774 React \uD15C\uD50C\uB9BF\uC744 \uBE4C\uB4DC\uD55C \uB4A4 liquid \uD15C\uD50C\uB9BF\uC744 \uD568\uAED8 \uD328\uD0A4\uC9D5\uD55C\uB2E4. \uB2E4\uB9CC \uAC19\uC740 \uD654\uBA74\uC744 \uB450 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uACE0, sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \uC774\uB984\uC5D0 \`user\`\xB7\`admin\`\uC744 \uC4F0\uC9C0 \uC54A\uB294\uB2E4(\`src/pages/user\`\uB294 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4). \uD63C\uD569 \uB808\uD3EC\uC758 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uB294 \`bstage dev\`(React)\uC640 \`bstage dev --kind liquid\`\uB85C \uB530\uB85C \uB744\uC6B4\uB2E4.
475
475
 
476
476
  ## 2. \uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131
477
477
 
@@ -571,7 +571,7 @@ bstage deploy
571
571
  - \uC6D0\uACA9 push\xB7\uBC30\uD3EC\uB97C \uC0AC\uC6A9\uC790 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uD558\uAE30
572
572
  - \uC0AC\uC6A9\uC790\uC5D0\uAC8C "\uCF54\uB4DC\uAC00 \uB9DE\uB098\uC694"\uCC98\uB7FC \uAC1C\uBC1C \uC9C0\uC2DD\uC774 \uC788\uC5B4\uC57C \uB2F5\uD560 \uC218 \uC788\uB294 \uAC83\uC744 \uBB3B\uAE30 (\uD655\uC778\uC740 \uB124 \uBAAB)
573
573
  - \`bstage list\`\uC5D0 \uBC30\uCE58\uAC00 0\uAC74\uC778\uB370 \uBC30\uD3EC\uB97C \uC2DC\uB3C4\uD558\uAE30
574
- - \uD55C \uB808\uD3EC\uC5D0 React \uD15C\uD50C\uB9BF\uACFC liquid \uD15C\uD50C\uB9BF\uC744 \uC11E\uAE30
574
+ - \uD63C\uD569 \uB808\uD3EC\uC5D0\uC11C sdk \uD398\uC774\uC9C0\uB97C \`src/pages/user\`\xB7\`src/pages/admin\` \uC544\uB798\uC5D0 \uB9CC\uB4E4\uAE30 \u2014 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE5C\uB2E4
575
575
  `;
576
576
  }
577
577
 
@@ -766,11 +766,12 @@ var BSTAGE_SKILLS = [
766
766
  { name: "bstage-migrate", kinds: ["sdk", "liquid"], content: () => withStamp(migrateSkillMd()) }
767
767
  ];
768
768
  function skillsFor(kind) {
769
- return BSTAGE_SKILLS.filter((s) => s.kinds.includes(kind));
769
+ const wanted = kind === "mixed" ? ["sdk", "liquid"] : [kind];
770
+ return BSTAGE_SKILLS.filter((s) => s.kinds.some((k) => wanted.includes(k)));
770
771
  }
771
772
 
772
773
  // src/agents/agentsMdRegion.ts
773
- var AGENTS_MANAGED_VERSION = 13;
774
+ var AGENTS_MANAGED_VERSION = 14;
774
775
  var START_MARKER = `<!-- BSTAGE:MANAGED:START v=${AGENTS_MANAGED_VERSION} \u2014 SDK\uAC00 \uAD00\uB9AC\uD558\uB294 \uC601\uC5ED\uC785\uB2C8\uB2E4. \`bstage ai install\` / \`bstage ai update\`\uAC00 \uC7AC\uC0DD\uC131\uD558\uBBC0\uB85C \uC9C1\uC811 \uD3B8\uC9D1\uD558\uC9C0 \uB9C8\uC138\uC694(\uAC31\uC2E0 \uC2DC \uB36E\uC5B4\uC4F0\uC785\uB2C8\uB2E4). \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uC544\uB798 \uC790\uC720 \uC601\uC5ED\uC5D0 \uC801\uC73C\uC138\uC694. -->`;
775
776
  var END_MARKER = `<!-- BSTAGE:MANAGED:END -->`;
776
777
  var START_TOKEN = "BSTAGE:MANAGED:START";
@@ -865,6 +866,7 @@ function agentsManagedBody({
865
866
  }) {
866
867
  assertSingleLine({ space, projectName });
867
868
  if (kind === "liquid") return liquidManagedBody(space, projectName);
869
+ if (kind === "mixed") return mixedManagedBody(space, projectName, target);
868
870
  return sdkManagedBody(space, projectName, target);
869
871
  }
870
872
  function assertSingleLine(values) {
@@ -872,8 +874,7 @@ function assertSingleLine(values) {
872
874
  if (/[\r\n]/.test(value)) throw new Error(`AGENTS.md \uC815\uCCB4\uC131 \uAC12\uC5D0 \uAC1C\uD589\uC774 \uC788\uC2B5\uB2C8\uB2E4: ${key}`);
873
875
  }
874
876
  }
875
- function sdkManagedBody(space, projectName, target) {
876
- const structureBlock = `src/
877
+ var SDK_STRUCTURE_BLOCK = `src/
877
878
  main.tsx \u2014 App \uB9C8\uC6B4\uD2B8\uB9CC (\uC218\uC815 \uBD88\uD544\uC694)
878
879
  App.tsx \u2014 import.meta.glob \uAE30\uBC18 \uAC1C\uBC1C\uC6A9 \uBAA9\uB85D\xB7\uB77C\uC6B0\uD305 (\uC218\uC815 \uBD88\uD544\uC694)
879
880
  shared/
@@ -887,25 +888,14 @@ function sdkManagedBody(space, projectName, target) {
887
888
  .env \u2014 VITE_BSTAGE_PHASE + API \uD0A4 (\uCEE4\uBC0B \uC548 \uB428, .gitignore)
888
889
  .env.example \u2014 \uC704 \uD56D\uBAA9 placeholder (\uCEE4\uBC0B\uB428 \u2014 \uBCF5\uC0AC\uD574\uC11C .env \uC0DD\uC131)
889
890
  vite.config.ts \u2014 Vite + bstageDevPlugin (phase\uB294 .env\uC5D0\uC11C \uC77D\uC74C)`;
890
- const envSection = `\`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uB294 phase\uC640 API \uD0A4\uB97C, \`.env.example\`(\uCEE4\uBC0B\uB428)\uC740 \uADF8 placeholder\uB97C \uB2F4\uB294\uB2E4. \`client.ts\`\uB294 \`import.meta.env.VITE_BSTAGE_APP_*\`\uB97C, \`vite.config.ts\`\uB294 \`.env\`\uC758 phase\uB97C \uCC38\uC870\uD55C\uB2E4.
891
+ var SDK_ENV_SECTION = `\`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uB294 phase\uC640 API \uD0A4\uB97C, \`.env.example\`(\uCEE4\uBC0B\uB428)\uC740 \uADF8 placeholder\uB97C \uB2F4\uB294\uB2E4. \`client.ts\`\uB294 \`import.meta.env.VITE_BSTAGE_APP_*\`\uB97C, \`vite.config.ts\`\uB294 \`.env\`\uC758 phase\uB97C \uCC38\uC870\uD55C\uB2E4.
891
892
 
892
893
  \`\`\`
893
894
  VITE_BSTAGE_PHASE=dev # dev | qa | real | sandbox
894
895
  \`\`\``;
895
- const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
896
- - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
897
- const apiForbidBullet = `- \uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC744 \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 SDK\uB294 API \uACBD\uB85C \uBAA9\uB85D\uC744 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4(\uC790\uB3D9\uC644\uC131 \uC5C6\uC74C). \uCD9C\uCC98\uB294 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \`client.get<T>(...)\`\uCC98\uB7FC \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4.
896
+ var SDK_API_FORBID_BULLETS = `- \uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC744 \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 SDK\uB294 API \uACBD\uB85C \uBAA9\uB85D\uC744 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4(\uC790\uB3D9\uC644\uC131 \uC5C6\uC74C). \uCD9C\uCC98\uB294 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \`client.get<T>(...)\`\uCC98\uB7FC \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4.
898
897
  - \uC5B4\uB4DC\uBBFC\uC6A9 API\uB97C \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 BstageClient\uB294 **\uC720\uC800\uB2E8 API\uB9CC \uC9C0\uC6D0**\uD55C\uB2E4. \uC5B4\uB4DC\uBBFC API\uAC00 \uD544\uC694\uD558\uBA74 \uACBD\uB85C\uB97C \uC784\uC758\uB85C \uB9CC\uB4E4\uC9C0 \uB9D0\uACE0 **\uBC18\uB4DC\uC2DC \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA3C\uC800 \uD655\uC778**\uD55C\uB2E4.`;
899
- return `# AGENTS.md
900
-
901
- ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
902
-
903
- b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8. React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uBA74 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 b.stage \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uB85C\uB4DC\uB418\uC5B4 \uC2E4\uD589\uB41C\uB2E4.
904
-
905
- - **Space**: ${space}
906
- - **\uB808\uD3EC**: \`${projectName}\`
907
-
908
- ## SDK \uBB38\uC11C
898
+ var SDK_DOCS_SECTION = `## SDK \uBB38\uC11C
909
899
 
910
900
  SDK\uC758 API, hooks, \uC2AC\uB86F \uC2DC\uC2A4\uD15C, \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778 \uB4F1 **SDK\uC640 \uAD00\uB828\uB41C \uBAA8\uB4E0 \uB0B4\uC6A9**\uC740 \uC124\uCE58\uB41C \uD328\uD0A4\uC9C0\uC758 \uBB38\uC11C\uB97C \uCC38\uC870\uD55C\uB2E4. \uC774 \uBB38\uC11C\uB4E4\uC774 \uD56D\uC0C1 \uCD5C\uC2E0\uC774\uBA70 \uC678\uBD80 \uAC80\uC0C9 \uACB0\uACFC\uBCF4\uB2E4 \uC2E0\uB8B0\uD560 \uC218 \uC788\uB2E4.
911
901
 
@@ -924,17 +914,9 @@ node_modules/@bstage-sdk/core/docs/
924
914
  \u2514\u2500\u2500 SDK_ARCHITECTURE.md \u2014 \uD328\uD0A4\uC9C0 \uAD6C\uC870, \uC124\uACC4 \uACB0\uC815
925
915
  \`\`\`
926
916
 
927
- \uBB38\uC11C \uBAA9\uB85D\uC740 \`npx bstage docs\`\uB85C\uB3C4 \uBCFC \uC218 \uC788\uB2E4. \uD0C0\uC785 \uC815\uC758(.d.ts)\uC640 \uB7F0\uD0C0\uC784 \uC18C\uC2A4(.js)\uB294 \`node_modules/@bstage-sdk/react/dist/\`, \`node_modules/@bstage-sdk/core/dist/\`\uC5D0\uC11C \uC9C1\uC811 \uD655\uC778\uD560 \uC218 \uC788\uB2E4.
928
-
929
- ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
930
-
931
- \`\`\`
932
- ${structureBlock}
933
- \`\`\`
934
-
935
- ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
936
-
937
- ### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
917
+ \uBB38\uC11C \uBAA9\uB85D\uC740 \`npx bstage docs\`\uB85C\uB3C4 \uBCFC \uC218 \uC788\uB2E4. \uD0C0\uC785 \uC815\uC758(.d.ts)\uC640 \uB7F0\uD0C0\uC784 \uC18C\uC2A4(.js)\uB294 \`node_modules/@bstage-sdk/react/dist/\`, \`node_modules/@bstage-sdk/core/dist/\`\uC5D0\uC11C \uC9C1\uC811 \uD655\uC778\uD560 \uC218 \uC788\uB2E4.`;
918
+ function sdkTemplateRules(space) {
919
+ return `### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
938
920
 
939
921
  \uD398\uC774\uC9C0\uB0D0 \uC704\uC82F\uC774\uB0D0\uC5D0 \uB530\uB77C \uB450\uB294 \uACF3\uC774 \uB2E4\uB974\uB2E4. \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.tsx\`\uC5EC\uC57C \uD558\uBA70, \`src/pages/\`\xB7\`src/slots/\` \uBC16\uC5D0 \uB450\uBA74 \uBE4C\uB4DC\uAC00 \uC778\uC2DD\uD558\uC9C0 \uC54A\uB294\uB2E4.
940
922
 
@@ -967,28 +949,68 @@ createTemplate(MyWidget, {
967
949
 
968
950
  - \`name\`\uC740 \uD544\uC218 \u2014 \uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85\uACFC \uC77C\uCE58, \uD558\uC774\uD508 \uD3EC\uD568
969
951
  - \uCEF4\uD3EC\uB10C\uD2B8 \uD568\uC218\uBA85\uC740 \uC790\uC720\uC774\uB098 \`export default\` \uD544\uC218
970
- - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5
952
+ - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5`;
953
+ }
954
+ function sdkMigrationSection(skillsList) {
955
+ return `## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
971
956
 
972
- ${designRulesBrief(target)}
957
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0DD\uC131 \uC2DC\uC810\uC758 SDK \uBC84\uC804\uC744 \`package.json\`\uC5D0 \uACE0\uC815\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB3FC\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB530\uB77C\uC624\uC9C0 \uC54A\uC73C\uBBC0\uB85C, \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB824\uBA74:
973
958
 
974
- ## \uD658\uACBD \uC124\uC815
959
+ - \`npx @bstage-sdk/cli@latest doctor\` \u2014 \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C\xB7\uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\uC744 \uC9C4\uB2E8\uD55C\uB2E4(\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C, \`--json\` \uC9C0\uC6D0).
960
+ - \uC2E4\uC81C \uC801\uC6A9\uC740 \`bstage-migrate\` \uC2A4\uD0AC\uC5D0\uAC8C \uB9E1\uAE34\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C "bstage \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD574\uC918"\uB77C\uACE0 \uC694\uCCAD\uD558\uBA74, doctor \uACB0\uACFC\uC640 SDK\uC758 \`MIGRATION.md\`\uB97C \uC77D\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0 \uBCC0\uD658\uD55C\uB2E4(\uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB294 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 reconcile).
975
961
 
976
- ${envSection}
962
+ \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC808\uCC28\uC758 \uB2E8\uC77C \uC18C\uC2A4\uB294 SDK\uC758 \`node_modules/@bstage-sdk/core/docs/MIGRATION.md\`\uB2E4.
977
963
 
978
- ## \uBA85\uB839\uC5B4
964
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(${skillsList})\uC774 \uB4E4\uC5B4 \uC788\uB2E4. SDK \uBC84\uC804\uC5C5 \uD6C4 \`npx @bstage-sdk/cli@latest ai update\`\uB85C \uCD5C\uC2E0 \uC2A4\uD0AC\uC744 \uB3D9\uAE30\uD654\uD560 \uC218 \uC788\uC73C\uBA70, \uC774\uB54C **\uC774 AGENTS.md\uC758 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4\uB85C \uAC10\uC2FC \uBD80\uBD84)\uB3C4 \uD568\uAED8 \uCD5C\uC2E0\uD654**\uB41C\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uAD00\uB9AC \uC601\uC5ED \uC544\uB798 **\uC790\uC720 \uC601\uC5ED**\uC5D0 \uC801\uC73C\uBA74 \uAC31\uC2E0 \uC2DC \uBCF4\uC874\uB41C\uB2E4.`;
965
+ }
966
+ var SDK_SKILLS_LIST = "`bstage-template` \uC791\uC131, `bstage-deploy` \uBC30\uD3EC, `bstage-onboarding` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, `bstage-migrate` \uB9C8\uC774\uADF8\uB808\uC774\uC158";
967
+ function sdkForbidBullets() {
968
+ return `- \`src/main.tsx\`\xB7\`src/App.tsx\`\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74\uC73C\uB85C SDK\uAC00 \uAD00\uB9AC
969
+ - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
970
+ - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
971
+ - \`createTemplate()\` \uD638\uCD9C\uC758 \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758\uB85C \uBCC0\uACBD\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD560 \uC218 \uC788\uB2E4
972
+ - \`@bstage-sdk/core\`\uB97C \uC9C1\uC811 import\uD558\uC5EC \`createWebComponent()\`\uB97C \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`@bstage-sdk/react\`\uC758 API\uB9CC \uC0AC\uC6A9
973
+ - \uC804\uC5ED CSS \uD30C\uC77C(\`<link>\`, \uC678\uBD80 \uC2A4\uD0C0\uC77C\uC2DC\uD2B8)\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 Shadow DOM \uB0B4\uBD80\uC5D0 \uC801\uC6A9\uB418\uC9C0 \uC54A\uB294\uB2E4.
974
+ - **\`import './style.css'\`\uB85C \uC2A4\uD0C0\uC77C\uC744 \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC0AC\uB77C\uC9C4\uB2E4.** \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uC5B4 \uB208\uCE58\uCC44\uAE30 \uC5B4\uB835\uB2E4. CSS \uD30C\uC77C\uC744 \uC4F0\uB824\uBA74 \`import css from './style.css?inline'\`\uC73C\uB85C \uBB38\uC790\uC5F4\uC744 \uAC00\uC838\uC640 \`createTemplate(..., { styles: css })\`\uC5D0 \uB118\uAE30\uAC70\uB098 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{css}</style>\`\uB85C \uB80C\uB354\uD55C\uB2E4. inline \`style={{}}\`\uB3C4 \uB41C\uB2E4
975
+ - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC704 '\uB514\uC790\uC778' \uC139\uC158\uC758 \uB514\uC790\uC778 \uD1A0\uD070\uC744 \uC0AC\uC6A9
976
+ - \uC571\uD0A4(APP-ID \`bsa_\u2026\`\xB7APP KEY \`bsp_\u2026\`, \uC5B4\uB4DC\uBBFC \uAC8C\uC774\uD2B8\uC6E8\uC774 \`bsm_\u2026\`)\uB97C \uC18C\uC2A4 \uCF54\uB4DC\uC5D0 \uB9AC\uD130\uB7F4\uB85C \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC778\uC99D \uAC12\uC740 \`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uC5D0\uC11C \`import.meta.env.VITE_BSTAGE_*\`\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. pre-commit \uD6C5\uC774 \uCEE4\uBC0B \uC804 \uAC80\uCD9C\xB7\uCC28\uB2E8\uD558\uBA70 \`--no-verify\`\uB85C \uC6B0\uD68C\uD558\uC9C0 \uC54A\uB294\uB2E4
977
+ ${SDK_API_FORBID_BULLETS}`;
978
+ }
979
+ function sdkManagedBody(space, projectName, target) {
980
+ const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
981
+ - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
982
+ return `# AGENTS.md
979
983
 
980
- ${commandsSection}
984
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
981
985
 
982
- ## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
986
+ b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8. React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uBA74 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 b.stage \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uB85C\uB4DC\uB418\uC5B4 \uC2E4\uD589\uB41C\uB2E4.
983
987
 
984
- \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0DD\uC131 \uC2DC\uC810\uC758 SDK \uBC84\uC804\uC744 \`package.json\`\uC5D0 \uACE0\uC815\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB3FC\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB530\uB77C\uC624\uC9C0 \uC54A\uC73C\uBBC0\uB85C, \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB824\uBA74:
988
+ - **Space**: ${space}
989
+ - **\uB808\uD3EC**: \`${projectName}\`
985
990
 
986
- - \`npx @bstage-sdk/cli@latest doctor\` \u2014 \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C\xB7\uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\uC744 \uC9C4\uB2E8\uD55C\uB2E4(\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C, \`--json\` \uC9C0\uC6D0).
987
- - \uC2E4\uC81C \uC801\uC6A9\uC740 \`bstage-migrate\` \uC2A4\uD0AC\uC5D0\uAC8C \uB9E1\uAE34\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C "bstage \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD574\uC918"\uB77C\uACE0 \uC694\uCCAD\uD558\uBA74, doctor \uACB0\uACFC\uC640 SDK\uC758 \`MIGRATION.md\`\uB97C \uC77D\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0 \uBCC0\uD658\uD55C\uB2E4(\uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB294 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 reconcile).
991
+ ${SDK_DOCS_SECTION}
988
992
 
989
- \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC808\uCC28\uC758 \uB2E8\uC77C \uC18C\uC2A4\uB294 SDK\uC758 \`node_modules/@bstage-sdk/core/docs/MIGRATION.md\`\uB2E4.
993
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
994
+
995
+ \`\`\`
996
+ ${SDK_STRUCTURE_BLOCK}
997
+ \`\`\`
998
+
999
+ ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1000
+
1001
+ ${sdkTemplateRules(space)}
1002
+
1003
+ ${designRulesBrief(target)}
1004
+
1005
+ ## \uD658\uACBD \uC124\uC815
1006
+
1007
+ ${SDK_ENV_SECTION}
1008
+
1009
+ ## \uBA85\uB839\uC5B4
1010
+
1011
+ ${commandsSection}
990
1012
 
991
- \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(\`bstage-template\` \uC791\uC131, \`bstage-deploy\` \uBC30\uD3EC, \`bstage-onboarding\` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, \`bstage-migrate\` \uB9C8\uC774\uADF8\uB808\uC774\uC158)\uC774 \uB4E4\uC5B4 \uC788\uB2E4. SDK \uBC84\uC804\uC5C5 \uD6C4 \`npx @bstage-sdk/cli@latest ai update\`\uB85C \uCD5C\uC2E0 \uC2A4\uD0AC\uC744 \uB3D9\uAE30\uD654\uD560 \uC218 \uC788\uC73C\uBA70, \uC774\uB54C **\uC774 AGENTS.md\uC758 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4\uB85C \uAC10\uC2FC \uBD80\uBD84)\uB3C4 \uD568\uAED8 \uCD5C\uC2E0\uD654**\uB41C\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uAD00\uB9AC \uC601\uC5ED \uC544\uB798 **\uC790\uC720 \uC601\uC5ED**\uC5D0 \uC801\uC73C\uBA74 \uAC31\uC2E0 \uC2DC \uBCF4\uC874\uB41C\uB2E4.
1013
+ ${sdkMigrationSection(SDK_SKILLS_LIST)}
992
1014
 
993
1015
  ## \uBE4C\uB4DC
994
1016
 
@@ -998,27 +1020,32 @@ ${deploySection()}
998
1020
 
999
1021
  ## \uAE08\uC9C0 \uC0AC\uD56D
1000
1022
 
1001
- - \`src/main.tsx\`\xB7\`src/App.tsx\`\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74\uC73C\uB85C SDK\uAC00 \uAD00\uB9AC
1002
- - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
1003
- - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
1004
- - \`createTemplate()\` \uD638\uCD9C\uC758 \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758\uB85C \uBCC0\uACBD\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD560 \uC218 \uC788\uB2E4
1005
- - \`@bstage-sdk/core\`\uB97C \uC9C1\uC811 import\uD558\uC5EC \`createWebComponent()\`\uB97C \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`@bstage-sdk/react\`\uC758 API\uB9CC \uC0AC\uC6A9
1006
- - \uC804\uC5ED CSS \uD30C\uC77C(\`<link>\`, \uC678\uBD80 \uC2A4\uD0C0\uC77C\uC2DC\uD2B8)\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 Shadow DOM \uB0B4\uBD80\uC5D0 \uC801\uC6A9\uB418\uC9C0 \uC54A\uB294\uB2E4.
1007
- - **\`import './style.css'\`\uB85C \uC2A4\uD0C0\uC77C\uC744 \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC0AC\uB77C\uC9C4\uB2E4.** \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uC5B4 \uB208\uCE58\uCC44\uAE30 \uC5B4\uB835\uB2E4. CSS \uD30C\uC77C\uC744 \uC4F0\uB824\uBA74 \`import css from './style.css?inline'\`\uC73C\uB85C \uBB38\uC790\uC5F4\uC744 \uAC00\uC838\uC640 \`createTemplate(..., { styles: css })\`\uC5D0 \uB118\uAE30\uAC70\uB098 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{css}</style>\`\uB85C \uB80C\uB354\uD55C\uB2E4. inline \`style={{}}\`\uB3C4 \uB41C\uB2E4
1008
- - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC704 '\uB514\uC790\uC778' \uC139\uC158\uC758 \uB514\uC790\uC778 \uD1A0\uD070\uC744 \uC0AC\uC6A9
1009
- - \uC571\uD0A4(APP-ID \`bsa_\u2026\`\xB7APP KEY \`bsp_\u2026\`, \uC5B4\uB4DC\uBBFC \uAC8C\uC774\uD2B8\uC6E8\uC774 \`bsm_\u2026\`)\uB97C \uC18C\uC2A4 \uCF54\uB4DC\uC5D0 \uB9AC\uD130\uB7F4\uB85C \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC778\uC99D \uAC12\uC740 \`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uC5D0\uC11C \`import.meta.env.VITE_BSTAGE_*\`\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. pre-commit \uD6C5\uC774 \uCEE4\uBC0B \uC804 \uAC80\uCD9C\xB7\uCC28\uB2E8\uD558\uBA70 \`--no-verify\`\uB85C \uC6B0\uD68C\uD558\uC9C0 \uC54A\uB294\uB2E4
1010
- ${apiForbidBullet}
1023
+ ${sdkForbidBullets()}
1011
1024
  `;
1012
1025
  }
1013
- function liquidManagedBody(space, projectName) {
1014
- const structureBlock = `public/
1026
+ var LIQUID_STRUCTURE_BLOCK = `public/
1015
1027
  user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9 \uD15C\uD50C\uB9BF
1016
1028
  {name}/
1017
1029
  template.liquid \u2014 \uD15C\uD50C\uB9BF \uBCF8\uBB38 (\uD544\uC218, \uD30C\uC77C\uBA85 \uACE0\uC815)
1018
1030
  data.json \u2014 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C \uB370\uC774\uD130 (\uBC30\uD3EC\uC5D0\uB294 \uB098\uAC00\uC9C0 \uC54A\uC74C)
1019
- admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)
1020
- package.json
1021
- AGENTS.md \u2014 \uC774 \uD30C\uC77C`;
1031
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)`;
1032
+ var LIQUID_DATA_SECTION = `## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
1033
+
1034
+ \uCD5C\uC0C1\uC704 \uAC12\uC740 \uB2E4\uC12F \uAC1C\uB2E4 \u2014 \`lounges\` \xB7 \`stories\` \xB7 \`contentSections\` \xB7 \`latestContents\` \xB7 \`shopCategories\`. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4. \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4. \`data.json\` \uC0D8\uD50C\uB3C4 \uAC19\uC740 \uC774\uB984\uC744 \uC368\uC57C \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBC1B\uB294 \uAC12\uC740 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.`;
1035
+ var LIQUID_RULES_BULLETS = `- \uACBD\uB85C \uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4 \u2014 \`public/{user|admin}/{name}/template.liquid\`(\uC608: \`public/user/welcome/template.liquid\`) \uC790\uB9AC\uC5D0 \uC788\uB294 \uD30C\uC77C\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uB2E4\uB978 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 **\uC870\uC6A9\uD788 \uBB34\uC2DC\uB41C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uD654\uBA74\uC5D0 \uB098\uC624\uC9C0 \uC54A\uB294\uB2E4).
1036
+ - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC \uC4F4\uB2E4. \uD3F4\uB354 \uD558\uB098\uAC00 \uD398\uC774\uC9C0 \uD558\uB098\uB2E4.
1037
+ - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
1038
+ - \`data.json\`\uC740 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C\uC77C \uBFD0\uC774\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uC73C\uBBC0\uB85C, \uAC12\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uAC8C \uAE30\uBCF8\uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4.
1039
+ - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.`;
1040
+ function liquidForbidBullets() {
1041
+ return `- liquid \uD15C\uD50C\uB9BF\uC744 \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0 \uB123\uC73C\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 **PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5**\uD558\uB2E4
1042
+ - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4(\uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720)
1043
+ - \uADDC\uC57D \uBC16 \uACBD\uB85C\uC5D0 \uD15C\uD50C\uB9BF\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAE4A\uC774\uAC00 \uB2E4\uB974\uBA74 \uBB34\uC2DC\uB41C\uB2E4
1044
+ - \uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC744 \uB808\uD3EC\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4. \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB824 \uBC1B\uC740 URL\uC744 \uC808\uB300 \uC8FC\uC18C\uB85C \uB123\uB294\uB2E4(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\uB9CC \uC62C\uB9B4 \uC218 \uC788\uACE0 \uD5C8\uC6A9 \uD615\uC2DD\xB7\uC6A9\uB7C9 \uD55C\uB3C4\uB294 \uC5C5\uB85C\uB4DC\uD560 \uB54C \uD654\uBA74\uC774 \uC54C\uB824 \uC900\uB2E4). \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB294 \uC0C1\uB300 \uACBD\uB85C\uB3C4 \uBCF4\uC774\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uB97C \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4
1045
+ - \uD50C\uB7AB\uD3FC\uC774 \uB123\uC5B4 \uC8FC\uB294 \uB370\uC774\uD130\uC758 \uC774\uB984\xB7\uAD6C\uC870\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 '\uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130' \uC808\uC774 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4
1046
+ - \`{% render %}\`\xB7\`{% include %}\`(\uD30C\uC15C)\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uBDF0\uC5B4\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4(\uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791). \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4`;
1047
+ }
1048
+ function liquidManagedBody(space, projectName) {
1022
1049
  return `# AGENTS.md
1023
1050
 
1024
1051
  ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
@@ -1036,23 +1063,19 @@ b.stage liquid \uD14C\uB9C8 \uD504\uB85C\uC81D\uD2B8. \`.liquid\` \uD15C\uD50C\u
1036
1063
  - \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B: \`.claude/skills/bstage-liquid/SKILL.md\`
1037
1064
  - \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130): liquidjs \uACF5\uC2DD \uBB38\uC11C
1038
1065
 
1039
- ## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
1040
-
1041
- \uCD5C\uC0C1\uC704 \uAC12\uC740 \uB2E4\uC12F \uAC1C\uB2E4 \u2014 \`lounges\` \xB7 \`stories\` \xB7 \`contentSections\` \xB7 \`latestContents\` \xB7 \`shopCategories\`. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4. \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4. \`data.json\` \uC0D8\uD50C\uB3C4 \uAC19\uC740 \uC774\uB984\uC744 \uC368\uC57C \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBC1B\uB294 \uAC12\uC740 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.
1066
+ ${LIQUID_DATA_SECTION}
1042
1067
 
1043
1068
  ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1044
1069
 
1045
1070
  \`\`\`
1046
- ${structureBlock}
1071
+ ${LIQUID_STRUCTURE_BLOCK}
1072
+ package.json
1073
+ AGENTS.md \u2014 \uC774 \uD30C\uC77C
1047
1074
  \`\`\`
1048
1075
 
1049
1076
  ## \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1050
1077
 
1051
- - \uACBD\uB85C \uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4 \u2014 \`public/{user|admin}/{name}/template.liquid\`(\uC608: \`public/user/welcome/template.liquid\`) \uC790\uB9AC\uC5D0 \uC788\uB294 \uD30C\uC77C\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uB2E4\uB978 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 **\uC870\uC6A9\uD788 \uBB34\uC2DC\uB41C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uD654\uBA74\uC5D0 \uB098\uC624\uC9C0 \uC54A\uB294\uB2E4).
1052
- - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC \uC4F4\uB2E4. \uD3F4\uB354 \uD558\uB098\uAC00 \uD398\uC774\uC9C0 \uD558\uB098\uB2E4.
1053
- - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
1054
- - \`data.json\`\uC740 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C\uC77C \uBFD0\uC774\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uC73C\uBBC0\uB85C, \uAC12\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uAC8C \uAE30\uBCF8\uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4.
1055
- - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.
1078
+ ${LIQUID_RULES_BULLETS}
1056
1079
 
1057
1080
  ## \uBA85\uB839\uC5B4
1058
1081
 
@@ -1070,13 +1093,72 @@ ${deploySection()}
1070
1093
 
1071
1094
  ## \uAE08\uC9C0 \uC0AC\uD56D
1072
1095
 
1073
- - \uD55C \uB808\uD3EC\uC5D0 liquid\uC640 sdk \uBC29\uC2DD(React \uCEF4\uD3EC\uB10C\uD2B8) \uD15C\uD50C\uB9BF\uC744 \uC11E\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4
1074
- - liquid \uD15C\uD50C\uB9BF\uC744 \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0 \uB123\uC73C\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 **PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5**\uD558\uB2E4
1075
- - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4(\uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720)
1076
- - \uADDC\uC57D \uBC16 \uACBD\uB85C\uC5D0 \uD15C\uD50C\uB9BF\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAE4A\uC774\uAC00 \uB2E4\uB974\uBA74 \uBB34\uC2DC\uB41C\uB2E4
1077
- - \uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC744 \uB808\uD3EC\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4. \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB824 \uBC1B\uC740 URL\uC744 \uC808\uB300 \uC8FC\uC18C\uB85C \uB123\uB294\uB2E4(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\uB9CC \uC62C\uB9B4 \uC218 \uC788\uACE0 \uD5C8\uC6A9 \uD615\uC2DD\xB7\uC6A9\uB7C9 \uD55C\uB3C4\uB294 \uC5C5\uB85C\uB4DC\uD560 \uB54C \uD654\uBA74\uC774 \uC54C\uB824 \uC900\uB2E4). \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB294 \uC0C1\uB300 \uACBD\uB85C\uB3C4 \uBCF4\uC774\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uB97C \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4
1078
- - \uD50C\uB7AB\uD3FC\uC774 \uB123\uC5B4 \uC8FC\uB294 \uB370\uC774\uD130\uC758 \uC774\uB984\xB7\uAD6C\uC870\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 '\uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130' \uC808\uC774 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4
1079
- - \`{% render %}\`\xB7\`{% include %}\`(\uD30C\uC15C)\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uBDF0\uC5B4\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4(\uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791). \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4
1096
+ - React(sdk) \uD15C\uD50C\uB9BF\uC744 \uC774 \uB808\uD3EC\uC5D0 \uCD94\uAC00\uD574 \uD63C\uD569 \uB808\uD3EC\uB85C \uB9CC\uB4E4 \uB54C\uB294 sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \uC774\uB984\uC5D0 \`user\`\xB7\`admin\`\uC744 \uC4F0\uC9C0 \uC54A\uB294\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC) \u2014 \uADF8 \uC790\uB9AC\uB294 liquid \uC0B0\uCD9C\uBB3C(\`dist/{user|admin}/{name}/\`)\uACFC \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4. \uCD94\uAC00\uD55C \uB4A4 \`npx @bstage-sdk/cli@latest ai update\`\uB97C \uB3CC\uB9AC\uBA74 \uC774 \uD30C\uC77C\uC774 \uD63C\uD569 \uBCF8\uBB38\uC73C\uB85C \uBC14\uB010\uB2E4
1097
+ ${liquidForbidBullets()}
1098
+ `;
1099
+ }
1100
+ var MIXED_SKILLS_LIST = "`bstage-template` React \uC791\uC131, `bstage-liquid` liquid \uC791\uC131, `bstage-deploy` \uBC30\uD3EC, `bstage-onboarding` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, `bstage-migrate` \uB9C8\uC774\uADF8\uB808\uC774\uC158";
1101
+ function mixedManagedBody(space, projectName, target) {
1102
+ return `# AGENTS.md
1103
+
1104
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
1105
+
1106
+ b.stage \uCEE4\uC2A4\uD140 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8 \u2014 **\uD63C\uD569 \uB808\uD3EC**. React \uCEF4\uD3EC\uB10C\uD2B8(sdk) \uD15C\uD50C\uB9BF\uACFC \`.liquid\` \uD15C\uD50C\uB9BF\uC774 \uD55C \uB808\uD3EC\uC5D0 \uC788\uB2E4. \uD3EC\uD138\uC740 sdk \uD15C\uD50C\uB9BF\uC744 Web Component\uB85C \uBE4C\uB4DC\uD55C \uB4A4 liquid \uD15C\uD50C\uB9BF\uC744 \uADF8\uB300\uB85C \uD568\uAED8 \uD328\uD0A4\uC9D5\uD558\uACE0, \uC0B0\uCD9C\uBB3C \uD56D\uBAA9\uB9C8\uB2E4 \uC885\uB958(sdk\xB7liquid)\uB97C \uB530\uB85C \uBCF8\uB2E4.
1107
+
1108
+ - **Space**: ${space}
1109
+ - **\uB808\uD3EC**: \`${projectName}\`
1110
+
1111
+ ${SDK_DOCS_SECTION}
1112
+
1113
+ liquid \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130 \uACC4\uC57D\uC740 \uC544\uB798 \uC808\uACFC \`.claude/skills/bstage-liquid/SKILL.md\`\uAC00 \uC9C1\uC811 \uB4E4\uACE0 \uC788\uB2E4. \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130)\uC740 liquidjs \uACF5\uC2DD \uBB38\uC11C.
1114
+
1115
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1116
+
1117
+ \`\`\`
1118
+ ${SDK_STRUCTURE_BLOCK}
1119
+ ${LIQUID_STRUCTURE_BLOCK}
1120
+ \`\`\`
1121
+
1122
+ ## \uD63C\uD569 \uB808\uD3EC \uADDC\uCE59
1123
+
1124
+ - **\uC5B4\uB290 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uAE4C**: \uC0C1\uD638\uC791\uC6A9\xB7\uC0C1\uD0DC\xB7API \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uD654\uBA74\uC740 React(\`src/pages\`\xB7\`src/slots\`), \uB370\uC774\uD130\uB97C \uBC1B\uC544 \uADF8\uB824 \uC8FC\uAE30\uB9CC \uD558\uBA74 \uB418\uB294 \uD654\uBA74\uC740 liquid(\`public/{user|admin}/{name}/\`). \uAC19\uC740 \uD654\uBA74\uC744 \uB450 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4.
1125
+ - **\uC608\uC57D \uC774\uB984**: sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \`src/pages/user/\u2026\`\xB7\`src/pages/admin/\u2026\`\uC740 \uB9CC\uB4E4 \uC218 \uC5C6\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC \u2014 \`User\`\uB3C4 \uAC19\uB2E4). \uC0B0\uCD9C\uBB3C\uC774 \`dist/{user|admin}/\u2026\`\uB85C \uB098\uAC00 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE58\uACE0, \uAC19\uC740 \uB514\uB809\uD130\uB9AC\uC5D0 \`template.js\`\xB7\`template.liquid\`\uAC00 \uD568\uAED8 \uC788\uC73C\uBA74 \uD3EC\uD138\uC774 sdk\uB85C\uB9CC \uD310\uC815\uD574 liquid\uAC00 \uC870\uC6A9\uD788 \uC0AC\uB77C\uC9C4\uB2E4. \`bstage build\`\uC640 \uD3EC\uD138 \uBE4C\uB354\uAC00 \uBAA8\uB450 \uC5EC\uAE30\uC11C \uB9C9\uB294\uB2E4. \uC704\uC82F(\`src/slots\`)\uC740 \uD574\uB2F9 \uC5C6\uB2E4.
1126
+ - **\`bstage build\`**: sdk \uC5D4\uD2B8\uB9AC\uB97C \uBC88\uB4E4\uD558\uACE0 liquid\uB294 \uAC80\uC99D\uB9CC \uD55C\uB2E4 \u2014 \`dist/\`\uC5D0 liquid\uB294 \uB4E4\uC5B4\uAC00\uC9C0 \uC54A\uB294\uB2E4(\uD3EC\uD138\uC774 push\uB41C \uCEE4\uBC0B\uC758 \`public/\`\uC5D0\uC11C \uD328\uD0A4\uC9D5). \uAC80\uC99D \uC624\uB958\uAC00 \uC788\uC73C\uBA74 \uBC88\uB4E4\uD558\uC9C0 \uC54A\uACE0 \uC885\uB8CC \uCF54\uB4DC 2.
1127
+ - **\`bstage dev\`**: \uAE30\uBCF8\uC740 sdk(Vite) \uD504\uB9AC\uBDF0. liquid \uD504\uB9AC\uBDF0\uB294 \`bstage dev --kind liquid\`\uB85C \uB530\uB85C \uB744\uC6B4\uB2E4 \u2014 \uB450 \uC11C\uBC84\uB97C \uD568\uAED8 \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4.
1128
+ - liquid \uD15C\uD50C\uB9BF\uC740 PAGE \uBC30\uCE58\uB9CC \uB41C\uB2E4. \uC704\uC82F \uC790\uB9AC\uC5D0\uB294 sdk \uC704\uC82F(\`src/slots\`)\uB9CC \uBD99\uC778\uB2E4.
1129
+
1130
+ ## React \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1131
+
1132
+ ${sdkTemplateRules(space)}
1133
+
1134
+ ## liquid \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1135
+
1136
+ ${LIQUID_RULES_BULLETS}
1137
+
1138
+ ${LIQUID_DATA_SECTION}
1139
+
1140
+ ${designRulesBrief(target)}
1141
+
1142
+ ## \uD658\uACBD \uC124\uC815
1143
+
1144
+ ${SDK_ENV_SECTION}
1145
+
1146
+ ## \uBA85\uB839\uC5B4
1147
+
1148
+ - \`npm run dev\` \uB610\uB294 \`bstage dev\` \u2014 sdk(Vite) \uAC1C\uBC1C \uC11C\uBC84(\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568). \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login
1149
+ - \`bstage dev --kind liquid\` \u2014 liquid \uBBF8\uB9AC\uBCF4\uAE30(\uBAA9\uB85D\uC5D0\uC11C \uD15C\uD50C\uB9BF\uC744 \uACE8\uB77C \uD655\uC778, \`data.json\`\uC73C\uB85C \uB80C\uB354)
1150
+ - \`bstage build\` \u2014 sdk \uBC88\uB4E4 + liquid \uAC80\uC99D
1151
+ - \`bstage deploy\` \u2014 \uD3EC\uD138 \uBC30\uD3EC (\uC544\uB798 "\uBC30\uD3EC" \uC808)
1152
+
1153
+ ${sdkMigrationSection(MIXED_SKILLS_LIST)}
1154
+
1155
+ ${deploySection()}
1156
+
1157
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1158
+
1159
+ - sdk \uD398\uC774\uC9C0\uB97C \`src/pages/user\`\xB7\`src/pages/admin\` \uC544\uB798\uC5D0 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4 \u2014 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE5C\uB2E4(\uC704 '\uD63C\uD569 \uB808\uD3EC \uADDC\uCE59')
1160
+ ${sdkForbidBullets()}
1161
+ ${liquidForbidBullets()}
1080
1162
  `;
1081
1163
  }
1082
1164
  function renderManagedBlock(opts) {
package/dist/index.d.cts CHANGED
@@ -1,8 +1,12 @@
1
1
  /** 번들에 심긴 ai-toolkit 버전. */
2
2
  declare const VERSION: string;
3
3
 
4
- /** 스킬이 설치되는 프로젝트 종류 — sdk 템플릿 프로젝트 / liquid 테마 프로젝트 */
5
- type ProjectKind = 'sdk' | 'liquid';
4
+ /**
5
+ * 스킬이 설치되는 프로젝트 종류 — sdk 템플릿 프로젝트 / liquid 테마 프로젝트 / 혼합(둘 다 한 레포).
6
+ * `mixed`는 판정 결과로만 나온다(`--kind`로 지정하는 값이 아니다) — 스킬 목록은 두 세트의 합집합이고
7
+ * AGENTS.md는 혼합 본문이다. 각 스킬의 `kinds`에는 단일 종류만 적는다(mixed는 파생).
8
+ */
9
+ type ProjectKind = 'sdk' | 'liquid' | 'mixed';
6
10
  /** 디자인 토큰 타깃 — 유저(유저 플랫폼) / 어드민(어드민 플랫폼) */
7
11
  type DesignTarget = 'user' | 'admin';
8
12
  /** 스킬 본문을 렌더링할 때 넘기는 프로젝트 맥락 */
@@ -25,7 +29,10 @@ interface BstageSkill {
25
29
  content: (ctx: SkillContext) => string;
26
30
  }
27
31
  declare const BSTAGE_SKILLS: BstageSkill[];
28
- /** 해당 프로젝트 종류에 설치할 스킬만 골라낸다. */
32
+ /**
33
+ * 해당 프로젝트 종류에 설치할 스킬만 골라낸다. 혼합 레포는 sdk 세트와 liquid 세트의 합집합이다 —
34
+ * React 템플릿과 liquid 템플릿을 둘 다 작성하므로 어느 한쪽 작성 스킬도 빠지면 안 된다.
35
+ */
29
36
  declare function skillsFor(kind: ProjectKind): BstageSkill[];
30
37
 
31
38
  /**
@@ -54,14 +61,16 @@ interface AgentsMdOptions {
54
61
  projectName: string;
55
62
  /** 디자인 토큰 타깃(user/admin). 미지정 시 user. */
56
63
  target?: DesignTarget;
57
- /** 프로젝트 종류(sdk/liquid). 미지정 시 sdk. */
64
+ /** 프로젝트 종류(sdk/liquid/mixed). 미지정 시 sdk. */
58
65
  kind?: ProjectKind;
59
66
  }
60
67
  /**
61
68
  * SDK가 관리하는 AGENTS.md 본문(마커 미포함).
62
69
  * 이 본문이 바뀌면 `agentsMdRegion.ts`의 `AGENTS_MANAGED_VERSION`을 올린다(doctor가 갱신 필요를 감지).
63
70
  *
64
- * `kind`로 프로젝트 종류를 가른다 — 기본은 `sdk`라 기존 호출부는 바뀌지 않는다.
71
+ * `kind`로 프로젝트 종류를 가른다 — 기본은 `sdk`라 기존 호출부는 바뀌지 않는다. `mixed`(sdk 템플릿 +
72
+ * liquid 템플릿이 한 레포)는 두 본문의 절을 합친 혼합 본문이다 — 절반씩 섞어 "이 프로젝트에 없는 규칙"을
73
+ * 만들지 않도록, 각 절은 두 kind가 공유하는 조각 함수에서 가져온다.
65
74
  */
66
75
  declare function agentsManagedBody({ space, projectName, target, kind, }: AgentsMdOptions): string;
67
76
  /** SDK 관리 영역(마커 포함) 블록만 렌더링한다. ai install|update/migrate의 결정론적 치환에 쓴다. */
@@ -87,7 +96,7 @@ declare function agentsMd(opts: AgentsMdOptions): string;
87
96
  * 결정론적으로 판단하는 근거. (본문은 space/projectName로 파라미터화되므로 내용 직접 비교 대신
88
97
  * 버전 토큰으로 staleness를 본다.)
89
98
  */
90
- declare const AGENTS_MANAGED_VERSION = 13;
99
+ declare const AGENTS_MANAGED_VERSION = 14;
91
100
  /** 본문을 관리 영역 마커로 감싼다. */
92
101
  declare function wrapManaged(body: string): string;
93
102
  /** init이 새 프로젝트에 까는 기본 자유 영역 스캐폴드(빈 섹션). */
package/dist/index.d.ts CHANGED
@@ -1,8 +1,12 @@
1
1
  /** 번들에 심긴 ai-toolkit 버전. */
2
2
  declare const VERSION: string;
3
3
 
4
- /** 스킬이 설치되는 프로젝트 종류 — sdk 템플릿 프로젝트 / liquid 테마 프로젝트 */
5
- type ProjectKind = 'sdk' | 'liquid';
4
+ /**
5
+ * 스킬이 설치되는 프로젝트 종류 — sdk 템플릿 프로젝트 / liquid 테마 프로젝트 / 혼합(둘 다 한 레포).
6
+ * `mixed`는 판정 결과로만 나온다(`--kind`로 지정하는 값이 아니다) — 스킬 목록은 두 세트의 합집합이고
7
+ * AGENTS.md는 혼합 본문이다. 각 스킬의 `kinds`에는 단일 종류만 적는다(mixed는 파생).
8
+ */
9
+ type ProjectKind = 'sdk' | 'liquid' | 'mixed';
6
10
  /** 디자인 토큰 타깃 — 유저(유저 플랫폼) / 어드민(어드민 플랫폼) */
7
11
  type DesignTarget = 'user' | 'admin';
8
12
  /** 스킬 본문을 렌더링할 때 넘기는 프로젝트 맥락 */
@@ -25,7 +29,10 @@ interface BstageSkill {
25
29
  content: (ctx: SkillContext) => string;
26
30
  }
27
31
  declare const BSTAGE_SKILLS: BstageSkill[];
28
- /** 해당 프로젝트 종류에 설치할 스킬만 골라낸다. */
32
+ /**
33
+ * 해당 프로젝트 종류에 설치할 스킬만 골라낸다. 혼합 레포는 sdk 세트와 liquid 세트의 합집합이다 —
34
+ * React 템플릿과 liquid 템플릿을 둘 다 작성하므로 어느 한쪽 작성 스킬도 빠지면 안 된다.
35
+ */
29
36
  declare function skillsFor(kind: ProjectKind): BstageSkill[];
30
37
 
31
38
  /**
@@ -54,14 +61,16 @@ interface AgentsMdOptions {
54
61
  projectName: string;
55
62
  /** 디자인 토큰 타깃(user/admin). 미지정 시 user. */
56
63
  target?: DesignTarget;
57
- /** 프로젝트 종류(sdk/liquid). 미지정 시 sdk. */
64
+ /** 프로젝트 종류(sdk/liquid/mixed). 미지정 시 sdk. */
58
65
  kind?: ProjectKind;
59
66
  }
60
67
  /**
61
68
  * SDK가 관리하는 AGENTS.md 본문(마커 미포함).
62
69
  * 이 본문이 바뀌면 `agentsMdRegion.ts`의 `AGENTS_MANAGED_VERSION`을 올린다(doctor가 갱신 필요를 감지).
63
70
  *
64
- * `kind`로 프로젝트 종류를 가른다 — 기본은 `sdk`라 기존 호출부는 바뀌지 않는다.
71
+ * `kind`로 프로젝트 종류를 가른다 — 기본은 `sdk`라 기존 호출부는 바뀌지 않는다. `mixed`(sdk 템플릿 +
72
+ * liquid 템플릿이 한 레포)는 두 본문의 절을 합친 혼합 본문이다 — 절반씩 섞어 "이 프로젝트에 없는 규칙"을
73
+ * 만들지 않도록, 각 절은 두 kind가 공유하는 조각 함수에서 가져온다.
65
74
  */
66
75
  declare function agentsManagedBody({ space, projectName, target, kind, }: AgentsMdOptions): string;
67
76
  /** SDK 관리 영역(마커 포함) 블록만 렌더링한다. ai install|update/migrate의 결정론적 치환에 쓴다. */
@@ -87,7 +96,7 @@ declare function agentsMd(opts: AgentsMdOptions): string;
87
96
  * 결정론적으로 판단하는 근거. (본문은 space/projectName로 파라미터화되므로 내용 직접 비교 대신
88
97
  * 버전 토큰으로 staleness를 본다.)
89
98
  */
90
- declare const AGENTS_MANAGED_VERSION = 13;
99
+ declare const AGENTS_MANAGED_VERSION = 14;
91
100
  /** 본문을 관리 영역 마커로 감싼다. */
92
101
  declare function wrapManaged(body: string): string;
93
102
  /** init이 새 프로젝트에 까는 기본 자유 영역 스캐폴드(빈 섹션). */
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.5.0";
2
+ var VERSION = "0.6.0";
3
3
 
4
4
  // src/skills/deploy.ts
5
5
  function deploySkillMd() {
@@ -219,7 +219,7 @@ public/
219
219
 
220
220
  # \uD568\uC815
221
221
 
222
- - **sdk\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC9C0 \uC54A\uB294\uB2E4.** \`template.tsx\`(React)\uC640 \`.liquid\`\uAC00 \uD55C \uB808\uD3EC\uC5D0 \uAC19\uC774 \uC788\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4. \uD55C \uB808\uD3EC\uB294 \uD55C \uBC29\uC2DD\uB9CC.
222
+ - **sdk\uC640 \uD568\uAED8 \uC788\uB294 \uB808\uD3EC(\uD63C\uD569)\uC5D0\uC11C\uB294 \uC790\uB9AC\uB97C \uB098\uB208\uB2E4.** \`template.tsx\`(React)\uC640 \`.liquid\`\uAC00 \uD55C \uB808\uD3EC\uC5D0 \uC788\uC5B4\uB3C4 \uD3EC\uD138\uC774 sdk\uB97C \uBE4C\uB4DC\uD55C \uB4A4 liquid\uB97C \uD568\uAED8 \uD328\uD0A4\uC9D5\uD55C\uB2E4. \uB2E8 sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \`src/pages/user\`\xB7\`src/pages/admin\`\uC740 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC(\`dist/{user|admin}/\`)\uC640 \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC). \uD63C\uD569 \uB808\uD3EC\uC758 liquid \uBBF8\uB9AC\uBCF4\uAE30\uB294 \`bstage dev --kind liquid\`.
223
223
  - **liquid\uB294 PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5\uD558\uB2E4.** \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0\uB294 \uB123\uC744 \uC218 \uC5C6\uB2E4. \uD3EC\uD138\uC5D0\uC11C \uD398\uC774\uC9C0\uB97C \uB9CC\uB4E4 \uB54C \uCEE4\uC2A4\uD140 \uBC29\uC2DD\uC73C\uB85C \`liquid\`\uB97C \uACE0\uB978\uB2E4.
224
224
  - **\`data.json\`\uC740 \uB85C\uCEEC \uC804\uC6A9\uC774\uB2E4.** \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4. \uC2E4\uC81C \uB370\uC774\uD130\uC758 \uCD9C\uCC98\uAC00 \uC544\uB2C8\uBBC0\uB85C \uC5EC\uAE30 \uAC12\uC744 \uB9DE\uCDB0 \uB450\uACE0 "\uBC30\uD3EC\uD558\uBA74 \uC774 \uAC12\uC774 \uB098\uC628\uB2E4"\uACE0 \uAE30\uB300\uD558\uC9C0 \uC54A\uB294\uB2E4.
225
225
  - **\`layout.json\`\uB3C4 \uC9C0\uC6CC\uC9C4\uB2E4.** \uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720\uD55C\uB2E4 \u2014 \uB808\uD3EC\uC5D0\uC11C \uC815\uD558\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4.
@@ -422,7 +422,7 @@ description: b.stage \uCEE4\uC2A4\uD140 \uAC1C\uBC1C\uC744 \uCC98\uC74C\uBD80\uD
422
422
  - **liquid \uD15C\uD50C\uB9BF**: \uB370\uC774\uD130\uB97C \uBC1B\uC544 \uADF8\uB824 \uC8FC\uAE30\uB9CC \uD558\uBA74 \uB418\uB294 \uD654\uBA74\uC5D0 \uB9DE\uB294\uB2E4. \uBC30\uC6B0\uAE30 \uC27D\uACE0 \uBE60\uB974\uC9C0\uB9CC \uBE0C\uB77C\uC6B0\uC800 \uCABD \uB85C\uC9C1\uC740 \uC81C\uD55C\uB41C\uB2E4.
423
423
  - **(c) \uC5B4\uB514\uC5D0 \uBC30\uD3EC\uD558\uB098** \u2014 \uBC30\uD3EC \uD658\uACBD(phase)\uACFC \uC2A4\uD14C\uC774\uC9C0 ID. \uBAA8\uB974\uBA74 "\uD3EC\uD138\uC5D0 \uB85C\uADF8\uC778\uD588\uC744 \uB54C \uBCF4\uC774\uB294 \uC2A4\uD14C\uC774\uC9C0 \uC774\uB984"\uC774\uB77C\uACE0 \uC54C\uB824\uC8FC\uACE0, 1\uB2E8\uACC4\uC5D0\uC11C\uB294 \uBE44\uC6CC \uB454 \uCC44 \uC9C4\uD589\uD574\uB3C4 \uB41C\uB2E4(6\uB2E8\uACC4\uC5D0\uC11C \`bstage link\`\uAC00 \uBAA9\uB85D\uC73C\uB85C \uBB3C\uC5B4\uBCF8\uB2E4).
424
424
 
425
- \uD55C \uB808\uD3EC\uC5D0\uB294 **\uD55C \uBC29\uC2DD\uB9CC** \uB2F4\uB294\uB2E4. React\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4.
425
+ \uD55C \uB808\uD3EC\uC5D0 \uB450 \uBC29\uC2DD\uC744 \uD568\uAED8 \uB458 \uC218\uB3C4 \uC788\uB2E4(\uD63C\uD569 \uB808\uD3EC) \u2014 \uD3EC\uD138\uC774 React \uD15C\uD50C\uB9BF\uC744 \uBE4C\uB4DC\uD55C \uB4A4 liquid \uD15C\uD50C\uB9BF\uC744 \uD568\uAED8 \uD328\uD0A4\uC9D5\uD55C\uB2E4. \uB2E4\uB9CC \uAC19\uC740 \uD654\uBA74\uC744 \uB450 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uACE0, sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \uC774\uB984\uC5D0 \`user\`\xB7\`admin\`\uC744 \uC4F0\uC9C0 \uC54A\uB294\uB2E4(\`src/pages/user\`\uB294 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4). \uD63C\uD569 \uB808\uD3EC\uC758 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uB294 \`bstage dev\`(React)\uC640 \`bstage dev --kind liquid\`\uB85C \uB530\uB85C \uB744\uC6B4\uB2E4.
426
426
 
427
427
  ## 2. \uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131
428
428
 
@@ -522,7 +522,7 @@ bstage deploy
522
522
  - \uC6D0\uACA9 push\xB7\uBC30\uD3EC\uB97C \uC0AC\uC6A9\uC790 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uD558\uAE30
523
523
  - \uC0AC\uC6A9\uC790\uC5D0\uAC8C "\uCF54\uB4DC\uAC00 \uB9DE\uB098\uC694"\uCC98\uB7FC \uAC1C\uBC1C \uC9C0\uC2DD\uC774 \uC788\uC5B4\uC57C \uB2F5\uD560 \uC218 \uC788\uB294 \uAC83\uC744 \uBB3B\uAE30 (\uD655\uC778\uC740 \uB124 \uBAAB)
524
524
  - \`bstage list\`\uC5D0 \uBC30\uCE58\uAC00 0\uAC74\uC778\uB370 \uBC30\uD3EC\uB97C \uC2DC\uB3C4\uD558\uAE30
525
- - \uD55C \uB808\uD3EC\uC5D0 React \uD15C\uD50C\uB9BF\uACFC liquid \uD15C\uD50C\uB9BF\uC744 \uC11E\uAE30
525
+ - \uD63C\uD569 \uB808\uD3EC\uC5D0\uC11C sdk \uD398\uC774\uC9C0\uB97C \`src/pages/user\`\xB7\`src/pages/admin\` \uC544\uB798\uC5D0 \uB9CC\uB4E4\uAE30 \u2014 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE5C\uB2E4
526
526
  `;
527
527
  }
528
528
 
@@ -717,11 +717,12 @@ var BSTAGE_SKILLS = [
717
717
  { name: "bstage-migrate", kinds: ["sdk", "liquid"], content: () => withStamp(migrateSkillMd()) }
718
718
  ];
719
719
  function skillsFor(kind) {
720
- return BSTAGE_SKILLS.filter((s) => s.kinds.includes(kind));
720
+ const wanted = kind === "mixed" ? ["sdk", "liquid"] : [kind];
721
+ return BSTAGE_SKILLS.filter((s) => s.kinds.some((k) => wanted.includes(k)));
721
722
  }
722
723
 
723
724
  // src/agents/agentsMdRegion.ts
724
- var AGENTS_MANAGED_VERSION = 13;
725
+ var AGENTS_MANAGED_VERSION = 14;
725
726
  var START_MARKER = `<!-- BSTAGE:MANAGED:START v=${AGENTS_MANAGED_VERSION} \u2014 SDK\uAC00 \uAD00\uB9AC\uD558\uB294 \uC601\uC5ED\uC785\uB2C8\uB2E4. \`bstage ai install\` / \`bstage ai update\`\uAC00 \uC7AC\uC0DD\uC131\uD558\uBBC0\uB85C \uC9C1\uC811 \uD3B8\uC9D1\uD558\uC9C0 \uB9C8\uC138\uC694(\uAC31\uC2E0 \uC2DC \uB36E\uC5B4\uC4F0\uC785\uB2C8\uB2E4). \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uC544\uB798 \uC790\uC720 \uC601\uC5ED\uC5D0 \uC801\uC73C\uC138\uC694. -->`;
726
727
  var END_MARKER = `<!-- BSTAGE:MANAGED:END -->`;
727
728
  var START_TOKEN = "BSTAGE:MANAGED:START";
@@ -816,6 +817,7 @@ function agentsManagedBody({
816
817
  }) {
817
818
  assertSingleLine({ space, projectName });
818
819
  if (kind === "liquid") return liquidManagedBody(space, projectName);
820
+ if (kind === "mixed") return mixedManagedBody(space, projectName, target);
819
821
  return sdkManagedBody(space, projectName, target);
820
822
  }
821
823
  function assertSingleLine(values) {
@@ -823,8 +825,7 @@ function assertSingleLine(values) {
823
825
  if (/[\r\n]/.test(value)) throw new Error(`AGENTS.md \uC815\uCCB4\uC131 \uAC12\uC5D0 \uAC1C\uD589\uC774 \uC788\uC2B5\uB2C8\uB2E4: ${key}`);
824
826
  }
825
827
  }
826
- function sdkManagedBody(space, projectName, target) {
827
- const structureBlock = `src/
828
+ var SDK_STRUCTURE_BLOCK = `src/
828
829
  main.tsx \u2014 App \uB9C8\uC6B4\uD2B8\uB9CC (\uC218\uC815 \uBD88\uD544\uC694)
829
830
  App.tsx \u2014 import.meta.glob \uAE30\uBC18 \uAC1C\uBC1C\uC6A9 \uBAA9\uB85D\xB7\uB77C\uC6B0\uD305 (\uC218\uC815 \uBD88\uD544\uC694)
830
831
  shared/
@@ -838,25 +839,14 @@ function sdkManagedBody(space, projectName, target) {
838
839
  .env \u2014 VITE_BSTAGE_PHASE + API \uD0A4 (\uCEE4\uBC0B \uC548 \uB428, .gitignore)
839
840
  .env.example \u2014 \uC704 \uD56D\uBAA9 placeholder (\uCEE4\uBC0B\uB428 \u2014 \uBCF5\uC0AC\uD574\uC11C .env \uC0DD\uC131)
840
841
  vite.config.ts \u2014 Vite + bstageDevPlugin (phase\uB294 .env\uC5D0\uC11C \uC77D\uC74C)`;
841
- const envSection = `\`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uB294 phase\uC640 API \uD0A4\uB97C, \`.env.example\`(\uCEE4\uBC0B\uB428)\uC740 \uADF8 placeholder\uB97C \uB2F4\uB294\uB2E4. \`client.ts\`\uB294 \`import.meta.env.VITE_BSTAGE_APP_*\`\uB97C, \`vite.config.ts\`\uB294 \`.env\`\uC758 phase\uB97C \uCC38\uC870\uD55C\uB2E4.
842
+ var SDK_ENV_SECTION = `\`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uB294 phase\uC640 API \uD0A4\uB97C, \`.env.example\`(\uCEE4\uBC0B\uB428)\uC740 \uADF8 placeholder\uB97C \uB2F4\uB294\uB2E4. \`client.ts\`\uB294 \`import.meta.env.VITE_BSTAGE_APP_*\`\uB97C, \`vite.config.ts\`\uB294 \`.env\`\uC758 phase\uB97C \uCC38\uC870\uD55C\uB2E4.
842
843
 
843
844
  \`\`\`
844
845
  VITE_BSTAGE_PHASE=dev # dev | qa | real | sandbox
845
846
  \`\`\``;
846
- const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
847
- - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
848
- const apiForbidBullet = `- \uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC744 \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 SDK\uB294 API \uACBD\uB85C \uBAA9\uB85D\uC744 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4(\uC790\uB3D9\uC644\uC131 \uC5C6\uC74C). \uCD9C\uCC98\uB294 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \`client.get<T>(...)\`\uCC98\uB7FC \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4.
847
+ var SDK_API_FORBID_BULLETS = `- \uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC744 \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 SDK\uB294 API \uACBD\uB85C \uBAA9\uB85D\uC744 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4(\uC790\uB3D9\uC644\uC131 \uC5C6\uC74C). \uCD9C\uCC98\uB294 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \`client.get<T>(...)\`\uCC98\uB7FC \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4.
849
848
  - \uC5B4\uB4DC\uBBFC\uC6A9 API\uB97C \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 BstageClient\uB294 **\uC720\uC800\uB2E8 API\uB9CC \uC9C0\uC6D0**\uD55C\uB2E4. \uC5B4\uB4DC\uBBFC API\uAC00 \uD544\uC694\uD558\uBA74 \uACBD\uB85C\uB97C \uC784\uC758\uB85C \uB9CC\uB4E4\uC9C0 \uB9D0\uACE0 **\uBC18\uB4DC\uC2DC \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA3C\uC800 \uD655\uC778**\uD55C\uB2E4.`;
850
- return `# AGENTS.md
851
-
852
- ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
853
-
854
- b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8. React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uBA74 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 b.stage \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uB85C\uB4DC\uB418\uC5B4 \uC2E4\uD589\uB41C\uB2E4.
855
-
856
- - **Space**: ${space}
857
- - **\uB808\uD3EC**: \`${projectName}\`
858
-
859
- ## SDK \uBB38\uC11C
849
+ var SDK_DOCS_SECTION = `## SDK \uBB38\uC11C
860
850
 
861
851
  SDK\uC758 API, hooks, \uC2AC\uB86F \uC2DC\uC2A4\uD15C, \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778 \uB4F1 **SDK\uC640 \uAD00\uB828\uB41C \uBAA8\uB4E0 \uB0B4\uC6A9**\uC740 \uC124\uCE58\uB41C \uD328\uD0A4\uC9C0\uC758 \uBB38\uC11C\uB97C \uCC38\uC870\uD55C\uB2E4. \uC774 \uBB38\uC11C\uB4E4\uC774 \uD56D\uC0C1 \uCD5C\uC2E0\uC774\uBA70 \uC678\uBD80 \uAC80\uC0C9 \uACB0\uACFC\uBCF4\uB2E4 \uC2E0\uB8B0\uD560 \uC218 \uC788\uB2E4.
862
852
 
@@ -875,17 +865,9 @@ node_modules/@bstage-sdk/core/docs/
875
865
  \u2514\u2500\u2500 SDK_ARCHITECTURE.md \u2014 \uD328\uD0A4\uC9C0 \uAD6C\uC870, \uC124\uACC4 \uACB0\uC815
876
866
  \`\`\`
877
867
 
878
- \uBB38\uC11C \uBAA9\uB85D\uC740 \`npx bstage docs\`\uB85C\uB3C4 \uBCFC \uC218 \uC788\uB2E4. \uD0C0\uC785 \uC815\uC758(.d.ts)\uC640 \uB7F0\uD0C0\uC784 \uC18C\uC2A4(.js)\uB294 \`node_modules/@bstage-sdk/react/dist/\`, \`node_modules/@bstage-sdk/core/dist/\`\uC5D0\uC11C \uC9C1\uC811 \uD655\uC778\uD560 \uC218 \uC788\uB2E4.
879
-
880
- ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
881
-
882
- \`\`\`
883
- ${structureBlock}
884
- \`\`\`
885
-
886
- ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
887
-
888
- ### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
868
+ \uBB38\uC11C \uBAA9\uB85D\uC740 \`npx bstage docs\`\uB85C\uB3C4 \uBCFC \uC218 \uC788\uB2E4. \uD0C0\uC785 \uC815\uC758(.d.ts)\uC640 \uB7F0\uD0C0\uC784 \uC18C\uC2A4(.js)\uB294 \`node_modules/@bstage-sdk/react/dist/\`, \`node_modules/@bstage-sdk/core/dist/\`\uC5D0\uC11C \uC9C1\uC811 \uD655\uC778\uD560 \uC218 \uC788\uB2E4.`;
869
+ function sdkTemplateRules(space) {
870
+ return `### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
889
871
 
890
872
  \uD398\uC774\uC9C0\uB0D0 \uC704\uC82F\uC774\uB0D0\uC5D0 \uB530\uB77C \uB450\uB294 \uACF3\uC774 \uB2E4\uB974\uB2E4. \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.tsx\`\uC5EC\uC57C \uD558\uBA70, \`src/pages/\`\xB7\`src/slots/\` \uBC16\uC5D0 \uB450\uBA74 \uBE4C\uB4DC\uAC00 \uC778\uC2DD\uD558\uC9C0 \uC54A\uB294\uB2E4.
891
873
 
@@ -918,28 +900,68 @@ createTemplate(MyWidget, {
918
900
 
919
901
  - \`name\`\uC740 \uD544\uC218 \u2014 \uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85\uACFC \uC77C\uCE58, \uD558\uC774\uD508 \uD3EC\uD568
920
902
  - \uCEF4\uD3EC\uB10C\uD2B8 \uD568\uC218\uBA85\uC740 \uC790\uC720\uC774\uB098 \`export default\` \uD544\uC218
921
- - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5
903
+ - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5`;
904
+ }
905
+ function sdkMigrationSection(skillsList) {
906
+ return `## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
922
907
 
923
- ${designRulesBrief(target)}
908
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0DD\uC131 \uC2DC\uC810\uC758 SDK \uBC84\uC804\uC744 \`package.json\`\uC5D0 \uACE0\uC815\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB3FC\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB530\uB77C\uC624\uC9C0 \uC54A\uC73C\uBBC0\uB85C, \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB824\uBA74:
924
909
 
925
- ## \uD658\uACBD \uC124\uC815
910
+ - \`npx @bstage-sdk/cli@latest doctor\` \u2014 \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C\xB7\uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\uC744 \uC9C4\uB2E8\uD55C\uB2E4(\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C, \`--json\` \uC9C0\uC6D0).
911
+ - \uC2E4\uC81C \uC801\uC6A9\uC740 \`bstage-migrate\` \uC2A4\uD0AC\uC5D0\uAC8C \uB9E1\uAE34\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C "bstage \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD574\uC918"\uB77C\uACE0 \uC694\uCCAD\uD558\uBA74, doctor \uACB0\uACFC\uC640 SDK\uC758 \`MIGRATION.md\`\uB97C \uC77D\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0 \uBCC0\uD658\uD55C\uB2E4(\uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB294 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 reconcile).
926
912
 
927
- ${envSection}
913
+ \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC808\uCC28\uC758 \uB2E8\uC77C \uC18C\uC2A4\uB294 SDK\uC758 \`node_modules/@bstage-sdk/core/docs/MIGRATION.md\`\uB2E4.
928
914
 
929
- ## \uBA85\uB839\uC5B4
915
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(${skillsList})\uC774 \uB4E4\uC5B4 \uC788\uB2E4. SDK \uBC84\uC804\uC5C5 \uD6C4 \`npx @bstage-sdk/cli@latest ai update\`\uB85C \uCD5C\uC2E0 \uC2A4\uD0AC\uC744 \uB3D9\uAE30\uD654\uD560 \uC218 \uC788\uC73C\uBA70, \uC774\uB54C **\uC774 AGENTS.md\uC758 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4\uB85C \uAC10\uC2FC \uBD80\uBD84)\uB3C4 \uD568\uAED8 \uCD5C\uC2E0\uD654**\uB41C\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uAD00\uB9AC \uC601\uC5ED \uC544\uB798 **\uC790\uC720 \uC601\uC5ED**\uC5D0 \uC801\uC73C\uBA74 \uAC31\uC2E0 \uC2DC \uBCF4\uC874\uB41C\uB2E4.`;
916
+ }
917
+ var SDK_SKILLS_LIST = "`bstage-template` \uC791\uC131, `bstage-deploy` \uBC30\uD3EC, `bstage-onboarding` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, `bstage-migrate` \uB9C8\uC774\uADF8\uB808\uC774\uC158";
918
+ function sdkForbidBullets() {
919
+ return `- \`src/main.tsx\`\xB7\`src/App.tsx\`\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74\uC73C\uB85C SDK\uAC00 \uAD00\uB9AC
920
+ - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
921
+ - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
922
+ - \`createTemplate()\` \uD638\uCD9C\uC758 \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758\uB85C \uBCC0\uACBD\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD560 \uC218 \uC788\uB2E4
923
+ - \`@bstage-sdk/core\`\uB97C \uC9C1\uC811 import\uD558\uC5EC \`createWebComponent()\`\uB97C \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`@bstage-sdk/react\`\uC758 API\uB9CC \uC0AC\uC6A9
924
+ - \uC804\uC5ED CSS \uD30C\uC77C(\`<link>\`, \uC678\uBD80 \uC2A4\uD0C0\uC77C\uC2DC\uD2B8)\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 Shadow DOM \uB0B4\uBD80\uC5D0 \uC801\uC6A9\uB418\uC9C0 \uC54A\uB294\uB2E4.
925
+ - **\`import './style.css'\`\uB85C \uC2A4\uD0C0\uC77C\uC744 \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC0AC\uB77C\uC9C4\uB2E4.** \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uC5B4 \uB208\uCE58\uCC44\uAE30 \uC5B4\uB835\uB2E4. CSS \uD30C\uC77C\uC744 \uC4F0\uB824\uBA74 \`import css from './style.css?inline'\`\uC73C\uB85C \uBB38\uC790\uC5F4\uC744 \uAC00\uC838\uC640 \`createTemplate(..., { styles: css })\`\uC5D0 \uB118\uAE30\uAC70\uB098 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{css}</style>\`\uB85C \uB80C\uB354\uD55C\uB2E4. inline \`style={{}}\`\uB3C4 \uB41C\uB2E4
926
+ - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC704 '\uB514\uC790\uC778' \uC139\uC158\uC758 \uB514\uC790\uC778 \uD1A0\uD070\uC744 \uC0AC\uC6A9
927
+ - \uC571\uD0A4(APP-ID \`bsa_\u2026\`\xB7APP KEY \`bsp_\u2026\`, \uC5B4\uB4DC\uBBFC \uAC8C\uC774\uD2B8\uC6E8\uC774 \`bsm_\u2026\`)\uB97C \uC18C\uC2A4 \uCF54\uB4DC\uC5D0 \uB9AC\uD130\uB7F4\uB85C \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC778\uC99D \uAC12\uC740 \`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uC5D0\uC11C \`import.meta.env.VITE_BSTAGE_*\`\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. pre-commit \uD6C5\uC774 \uCEE4\uBC0B \uC804 \uAC80\uCD9C\xB7\uCC28\uB2E8\uD558\uBA70 \`--no-verify\`\uB85C \uC6B0\uD68C\uD558\uC9C0 \uC54A\uB294\uB2E4
928
+ ${SDK_API_FORBID_BULLETS}`;
929
+ }
930
+ function sdkManagedBody(space, projectName, target) {
931
+ const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
932
+ - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
933
+ return `# AGENTS.md
930
934
 
931
- ${commandsSection}
935
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
932
936
 
933
- ## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
937
+ b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8. React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uBA74 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 b.stage \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uB85C\uB4DC\uB418\uC5B4 \uC2E4\uD589\uB41C\uB2E4.
934
938
 
935
- \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0DD\uC131 \uC2DC\uC810\uC758 SDK \uBC84\uC804\uC744 \`package.json\`\uC5D0 \uACE0\uC815\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB3FC\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB530\uB77C\uC624\uC9C0 \uC54A\uC73C\uBBC0\uB85C, \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB824\uBA74:
939
+ - **Space**: ${space}
940
+ - **\uB808\uD3EC**: \`${projectName}\`
936
941
 
937
- - \`npx @bstage-sdk/cli@latest doctor\` \u2014 \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C\xB7\uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\uC744 \uC9C4\uB2E8\uD55C\uB2E4(\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C, \`--json\` \uC9C0\uC6D0).
938
- - \uC2E4\uC81C \uC801\uC6A9\uC740 \`bstage-migrate\` \uC2A4\uD0AC\uC5D0\uAC8C \uB9E1\uAE34\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C "bstage \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD574\uC918"\uB77C\uACE0 \uC694\uCCAD\uD558\uBA74, doctor \uACB0\uACFC\uC640 SDK\uC758 \`MIGRATION.md\`\uB97C \uC77D\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0 \uBCC0\uD658\uD55C\uB2E4(\uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB294 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 reconcile).
942
+ ${SDK_DOCS_SECTION}
939
943
 
940
- \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC808\uCC28\uC758 \uB2E8\uC77C \uC18C\uC2A4\uB294 SDK\uC758 \`node_modules/@bstage-sdk/core/docs/MIGRATION.md\`\uB2E4.
944
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
945
+
946
+ \`\`\`
947
+ ${SDK_STRUCTURE_BLOCK}
948
+ \`\`\`
949
+
950
+ ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
951
+
952
+ ${sdkTemplateRules(space)}
953
+
954
+ ${designRulesBrief(target)}
955
+
956
+ ## \uD658\uACBD \uC124\uC815
957
+
958
+ ${SDK_ENV_SECTION}
959
+
960
+ ## \uBA85\uB839\uC5B4
961
+
962
+ ${commandsSection}
941
963
 
942
- \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(\`bstage-template\` \uC791\uC131, \`bstage-deploy\` \uBC30\uD3EC, \`bstage-onboarding\` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, \`bstage-migrate\` \uB9C8\uC774\uADF8\uB808\uC774\uC158)\uC774 \uB4E4\uC5B4 \uC788\uB2E4. SDK \uBC84\uC804\uC5C5 \uD6C4 \`npx @bstage-sdk/cli@latest ai update\`\uB85C \uCD5C\uC2E0 \uC2A4\uD0AC\uC744 \uB3D9\uAE30\uD654\uD560 \uC218 \uC788\uC73C\uBA70, \uC774\uB54C **\uC774 AGENTS.md\uC758 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4\uB85C \uAC10\uC2FC \uBD80\uBD84)\uB3C4 \uD568\uAED8 \uCD5C\uC2E0\uD654**\uB41C\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uAD00\uB9AC \uC601\uC5ED \uC544\uB798 **\uC790\uC720 \uC601\uC5ED**\uC5D0 \uC801\uC73C\uBA74 \uAC31\uC2E0 \uC2DC \uBCF4\uC874\uB41C\uB2E4.
964
+ ${sdkMigrationSection(SDK_SKILLS_LIST)}
943
965
 
944
966
  ## \uBE4C\uB4DC
945
967
 
@@ -949,27 +971,32 @@ ${deploySection()}
949
971
 
950
972
  ## \uAE08\uC9C0 \uC0AC\uD56D
951
973
 
952
- - \`src/main.tsx\`\xB7\`src/App.tsx\`\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74\uC73C\uB85C SDK\uAC00 \uAD00\uB9AC
953
- - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
954
- - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
955
- - \`createTemplate()\` \uD638\uCD9C\uC758 \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758\uB85C \uBCC0\uACBD\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD560 \uC218 \uC788\uB2E4
956
- - \`@bstage-sdk/core\`\uB97C \uC9C1\uC811 import\uD558\uC5EC \`createWebComponent()\`\uB97C \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`@bstage-sdk/react\`\uC758 API\uB9CC \uC0AC\uC6A9
957
- - \uC804\uC5ED CSS \uD30C\uC77C(\`<link>\`, \uC678\uBD80 \uC2A4\uD0C0\uC77C\uC2DC\uD2B8)\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 Shadow DOM \uB0B4\uBD80\uC5D0 \uC801\uC6A9\uB418\uC9C0 \uC54A\uB294\uB2E4.
958
- - **\`import './style.css'\`\uB85C \uC2A4\uD0C0\uC77C\uC744 \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC0AC\uB77C\uC9C4\uB2E4.** \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uC5B4 \uB208\uCE58\uCC44\uAE30 \uC5B4\uB835\uB2E4. CSS \uD30C\uC77C\uC744 \uC4F0\uB824\uBA74 \`import css from './style.css?inline'\`\uC73C\uB85C \uBB38\uC790\uC5F4\uC744 \uAC00\uC838\uC640 \`createTemplate(..., { styles: css })\`\uC5D0 \uB118\uAE30\uAC70\uB098 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{css}</style>\`\uB85C \uB80C\uB354\uD55C\uB2E4. inline \`style={{}}\`\uB3C4 \uB41C\uB2E4
959
- - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC704 '\uB514\uC790\uC778' \uC139\uC158\uC758 \uB514\uC790\uC778 \uD1A0\uD070\uC744 \uC0AC\uC6A9
960
- - \uC571\uD0A4(APP-ID \`bsa_\u2026\`\xB7APP KEY \`bsp_\u2026\`, \uC5B4\uB4DC\uBBFC \uAC8C\uC774\uD2B8\uC6E8\uC774 \`bsm_\u2026\`)\uB97C \uC18C\uC2A4 \uCF54\uB4DC\uC5D0 \uB9AC\uD130\uB7F4\uB85C \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC778\uC99D \uAC12\uC740 \`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uC5D0\uC11C \`import.meta.env.VITE_BSTAGE_*\`\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. pre-commit \uD6C5\uC774 \uCEE4\uBC0B \uC804 \uAC80\uCD9C\xB7\uCC28\uB2E8\uD558\uBA70 \`--no-verify\`\uB85C \uC6B0\uD68C\uD558\uC9C0 \uC54A\uB294\uB2E4
961
- ${apiForbidBullet}
974
+ ${sdkForbidBullets()}
962
975
  `;
963
976
  }
964
- function liquidManagedBody(space, projectName) {
965
- const structureBlock = `public/
977
+ var LIQUID_STRUCTURE_BLOCK = `public/
966
978
  user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9 \uD15C\uD50C\uB9BF
967
979
  {name}/
968
980
  template.liquid \u2014 \uD15C\uD50C\uB9BF \uBCF8\uBB38 (\uD544\uC218, \uD30C\uC77C\uBA85 \uACE0\uC815)
969
981
  data.json \u2014 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C \uB370\uC774\uD130 (\uBC30\uD3EC\uC5D0\uB294 \uB098\uAC00\uC9C0 \uC54A\uC74C)
970
- admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)
971
- package.json
972
- AGENTS.md \u2014 \uC774 \uD30C\uC77C`;
982
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)`;
983
+ var LIQUID_DATA_SECTION = `## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
984
+
985
+ \uCD5C\uC0C1\uC704 \uAC12\uC740 \uB2E4\uC12F \uAC1C\uB2E4 \u2014 \`lounges\` \xB7 \`stories\` \xB7 \`contentSections\` \xB7 \`latestContents\` \xB7 \`shopCategories\`. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4. \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4. \`data.json\` \uC0D8\uD50C\uB3C4 \uAC19\uC740 \uC774\uB984\uC744 \uC368\uC57C \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBC1B\uB294 \uAC12\uC740 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.`;
986
+ var LIQUID_RULES_BULLETS = `- \uACBD\uB85C \uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4 \u2014 \`public/{user|admin}/{name}/template.liquid\`(\uC608: \`public/user/welcome/template.liquid\`) \uC790\uB9AC\uC5D0 \uC788\uB294 \uD30C\uC77C\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uB2E4\uB978 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 **\uC870\uC6A9\uD788 \uBB34\uC2DC\uB41C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uD654\uBA74\uC5D0 \uB098\uC624\uC9C0 \uC54A\uB294\uB2E4).
987
+ - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC \uC4F4\uB2E4. \uD3F4\uB354 \uD558\uB098\uAC00 \uD398\uC774\uC9C0 \uD558\uB098\uB2E4.
988
+ - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
989
+ - \`data.json\`\uC740 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C\uC77C \uBFD0\uC774\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uC73C\uBBC0\uB85C, \uAC12\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uAC8C \uAE30\uBCF8\uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4.
990
+ - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.`;
991
+ function liquidForbidBullets() {
992
+ return `- liquid \uD15C\uD50C\uB9BF\uC744 \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0 \uB123\uC73C\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 **PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5**\uD558\uB2E4
993
+ - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4(\uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720)
994
+ - \uADDC\uC57D \uBC16 \uACBD\uB85C\uC5D0 \uD15C\uD50C\uB9BF\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAE4A\uC774\uAC00 \uB2E4\uB974\uBA74 \uBB34\uC2DC\uB41C\uB2E4
995
+ - \uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC744 \uB808\uD3EC\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4. \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB824 \uBC1B\uC740 URL\uC744 \uC808\uB300 \uC8FC\uC18C\uB85C \uB123\uB294\uB2E4(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\uB9CC \uC62C\uB9B4 \uC218 \uC788\uACE0 \uD5C8\uC6A9 \uD615\uC2DD\xB7\uC6A9\uB7C9 \uD55C\uB3C4\uB294 \uC5C5\uB85C\uB4DC\uD560 \uB54C \uD654\uBA74\uC774 \uC54C\uB824 \uC900\uB2E4). \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB294 \uC0C1\uB300 \uACBD\uB85C\uB3C4 \uBCF4\uC774\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uB97C \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4
996
+ - \uD50C\uB7AB\uD3FC\uC774 \uB123\uC5B4 \uC8FC\uB294 \uB370\uC774\uD130\uC758 \uC774\uB984\xB7\uAD6C\uC870\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 '\uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130' \uC808\uC774 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4
997
+ - \`{% render %}\`\xB7\`{% include %}\`(\uD30C\uC15C)\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uBDF0\uC5B4\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4(\uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791). \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4`;
998
+ }
999
+ function liquidManagedBody(space, projectName) {
973
1000
  return `# AGENTS.md
974
1001
 
975
1002
  ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
@@ -987,23 +1014,19 @@ b.stage liquid \uD14C\uB9C8 \uD504\uB85C\uC81D\uD2B8. \`.liquid\` \uD15C\uD50C\u
987
1014
  - \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B: \`.claude/skills/bstage-liquid/SKILL.md\`
988
1015
  - \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130): liquidjs \uACF5\uC2DD \uBB38\uC11C
989
1016
 
990
- ## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
991
-
992
- \uCD5C\uC0C1\uC704 \uAC12\uC740 \uB2E4\uC12F \uAC1C\uB2E4 \u2014 \`lounges\` \xB7 \`stories\` \xB7 \`contentSections\` \xB7 \`latestContents\` \xB7 \`shopCategories\`. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4. \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4. \`data.json\` \uC0D8\uD50C\uB3C4 \uAC19\uC740 \uC774\uB984\uC744 \uC368\uC57C \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBC1B\uB294 \uAC12\uC740 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.
1017
+ ${LIQUID_DATA_SECTION}
993
1018
 
994
1019
  ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
995
1020
 
996
1021
  \`\`\`
997
- ${structureBlock}
1022
+ ${LIQUID_STRUCTURE_BLOCK}
1023
+ package.json
1024
+ AGENTS.md \u2014 \uC774 \uD30C\uC77C
998
1025
  \`\`\`
999
1026
 
1000
1027
  ## \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1001
1028
 
1002
- - \uACBD\uB85C \uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4 \u2014 \`public/{user|admin}/{name}/template.liquid\`(\uC608: \`public/user/welcome/template.liquid\`) \uC790\uB9AC\uC5D0 \uC788\uB294 \uD30C\uC77C\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uB2E4\uB978 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 **\uC870\uC6A9\uD788 \uBB34\uC2DC\uB41C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uD654\uBA74\uC5D0 \uB098\uC624\uC9C0 \uC54A\uB294\uB2E4).
1003
- - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC \uC4F4\uB2E4. \uD3F4\uB354 \uD558\uB098\uAC00 \uD398\uC774\uC9C0 \uD558\uB098\uB2E4.
1004
- - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
1005
- - \`data.json\`\uC740 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C\uC77C \uBFD0\uC774\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uC73C\uBBC0\uB85C, \uAC12\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uAC8C \uAE30\uBCF8\uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4.
1006
- - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.
1029
+ ${LIQUID_RULES_BULLETS}
1007
1030
 
1008
1031
  ## \uBA85\uB839\uC5B4
1009
1032
 
@@ -1021,13 +1044,72 @@ ${deploySection()}
1021
1044
 
1022
1045
  ## \uAE08\uC9C0 \uC0AC\uD56D
1023
1046
 
1024
- - \uD55C \uB808\uD3EC\uC5D0 liquid\uC640 sdk \uBC29\uC2DD(React \uCEF4\uD3EC\uB10C\uD2B8) \uD15C\uD50C\uB9BF\uC744 \uC11E\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4
1025
- - liquid \uD15C\uD50C\uB9BF\uC744 \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0 \uB123\uC73C\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 **PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5**\uD558\uB2E4
1026
- - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4(\uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720)
1027
- - \uADDC\uC57D \uBC16 \uACBD\uB85C\uC5D0 \uD15C\uD50C\uB9BF\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAE4A\uC774\uAC00 \uB2E4\uB974\uBA74 \uBB34\uC2DC\uB41C\uB2E4
1028
- - \uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC744 \uB808\uD3EC\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4. \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB824 \uBC1B\uC740 URL\uC744 \uC808\uB300 \uC8FC\uC18C\uB85C \uB123\uB294\uB2E4(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\uB9CC \uC62C\uB9B4 \uC218 \uC788\uACE0 \uD5C8\uC6A9 \uD615\uC2DD\xB7\uC6A9\uB7C9 \uD55C\uB3C4\uB294 \uC5C5\uB85C\uB4DC\uD560 \uB54C \uD654\uBA74\uC774 \uC54C\uB824 \uC900\uB2E4). \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB294 \uC0C1\uB300 \uACBD\uB85C\uB3C4 \uBCF4\uC774\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uB97C \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4
1029
- - \uD50C\uB7AB\uD3FC\uC774 \uB123\uC5B4 \uC8FC\uB294 \uB370\uC774\uD130\uC758 \uC774\uB984\xB7\uAD6C\uC870\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 '\uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130' \uC808\uC774 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4
1030
- - \`{% render %}\`\xB7\`{% include %}\`(\uD30C\uC15C)\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uBDF0\uC5B4\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4(\uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791). \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4
1047
+ - React(sdk) \uD15C\uD50C\uB9BF\uC744 \uC774 \uB808\uD3EC\uC5D0 \uCD94\uAC00\uD574 \uD63C\uD569 \uB808\uD3EC\uB85C \uB9CC\uB4E4 \uB54C\uB294 sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \uC774\uB984\uC5D0 \`user\`\xB7\`admin\`\uC744 \uC4F0\uC9C0 \uC54A\uB294\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC) \u2014 \uADF8 \uC790\uB9AC\uB294 liquid \uC0B0\uCD9C\uBB3C(\`dist/{user|admin}/{name}/\`)\uACFC \uACB9\uCCD0 \`bstage build\`\uAC00 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB9C9\uB294\uB2E4. \uCD94\uAC00\uD55C \uB4A4 \`npx @bstage-sdk/cli@latest ai update\`\uB97C \uB3CC\uB9AC\uBA74 \uC774 \uD30C\uC77C\uC774 \uD63C\uD569 \uBCF8\uBB38\uC73C\uB85C \uBC14\uB010\uB2E4
1048
+ ${liquidForbidBullets()}
1049
+ `;
1050
+ }
1051
+ var MIXED_SKILLS_LIST = "`bstage-template` React \uC791\uC131, `bstage-liquid` liquid \uC791\uC131, `bstage-deploy` \uBC30\uD3EC, `bstage-onboarding` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, `bstage-migrate` \uB9C8\uC774\uADF8\uB808\uC774\uC158";
1052
+ function mixedManagedBody(space, projectName, target) {
1053
+ return `# AGENTS.md
1054
+
1055
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
1056
+
1057
+ b.stage \uCEE4\uC2A4\uD140 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8 \u2014 **\uD63C\uD569 \uB808\uD3EC**. React \uCEF4\uD3EC\uB10C\uD2B8(sdk) \uD15C\uD50C\uB9BF\uACFC \`.liquid\` \uD15C\uD50C\uB9BF\uC774 \uD55C \uB808\uD3EC\uC5D0 \uC788\uB2E4. \uD3EC\uD138\uC740 sdk \uD15C\uD50C\uB9BF\uC744 Web Component\uB85C \uBE4C\uB4DC\uD55C \uB4A4 liquid \uD15C\uD50C\uB9BF\uC744 \uADF8\uB300\uB85C \uD568\uAED8 \uD328\uD0A4\uC9D5\uD558\uACE0, \uC0B0\uCD9C\uBB3C \uD56D\uBAA9\uB9C8\uB2E4 \uC885\uB958(sdk\xB7liquid)\uB97C \uB530\uB85C \uBCF8\uB2E4.
1058
+
1059
+ - **Space**: ${space}
1060
+ - **\uB808\uD3EC**: \`${projectName}\`
1061
+
1062
+ ${SDK_DOCS_SECTION}
1063
+
1064
+ liquid \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130 \uACC4\uC57D\uC740 \uC544\uB798 \uC808\uACFC \`.claude/skills/bstage-liquid/SKILL.md\`\uAC00 \uC9C1\uC811 \uB4E4\uACE0 \uC788\uB2E4. \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130)\uC740 liquidjs \uACF5\uC2DD \uBB38\uC11C.
1065
+
1066
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1067
+
1068
+ \`\`\`
1069
+ ${SDK_STRUCTURE_BLOCK}
1070
+ ${LIQUID_STRUCTURE_BLOCK}
1071
+ \`\`\`
1072
+
1073
+ ## \uD63C\uD569 \uB808\uD3EC \uADDC\uCE59
1074
+
1075
+ - **\uC5B4\uB290 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uAE4C**: \uC0C1\uD638\uC791\uC6A9\xB7\uC0C1\uD0DC\xB7API \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uD654\uBA74\uC740 React(\`src/pages\`\xB7\`src/slots\`), \uB370\uC774\uD130\uB97C \uBC1B\uC544 \uADF8\uB824 \uC8FC\uAE30\uB9CC \uD558\uBA74 \uB418\uB294 \uD654\uBA74\uC740 liquid(\`public/{user|admin}/{name}/\`). \uAC19\uC740 \uD654\uBA74\uC744 \uB450 \uBC29\uC2DD\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4.
1076
+ - **\uC608\uC57D \uC774\uB984**: sdk \uD398\uC774\uC9C0 \uD3F4\uB354 \`src/pages/user/\u2026\`\xB7\`src/pages/admin/\u2026\`\uC740 \uB9CC\uB4E4 \uC218 \uC5C6\uB2E4(\uB300\uC18C\uBB38\uC790 \uBB34\uC2DC \u2014 \`User\`\uB3C4 \uAC19\uB2E4). \uC0B0\uCD9C\uBB3C\uC774 \`dist/{user|admin}/\u2026\`\uB85C \uB098\uAC00 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE58\uACE0, \uAC19\uC740 \uB514\uB809\uD130\uB9AC\uC5D0 \`template.js\`\xB7\`template.liquid\`\uAC00 \uD568\uAED8 \uC788\uC73C\uBA74 \uD3EC\uD138\uC774 sdk\uB85C\uB9CC \uD310\uC815\uD574 liquid\uAC00 \uC870\uC6A9\uD788 \uC0AC\uB77C\uC9C4\uB2E4. \`bstage build\`\uC640 \uD3EC\uD138 \uBE4C\uB354\uAC00 \uBAA8\uB450 \uC5EC\uAE30\uC11C \uB9C9\uB294\uB2E4. \uC704\uC82F(\`src/slots\`)\uC740 \uD574\uB2F9 \uC5C6\uB2E4.
1077
+ - **\`bstage build\`**: sdk \uC5D4\uD2B8\uB9AC\uB97C \uBC88\uB4E4\uD558\uACE0 liquid\uB294 \uAC80\uC99D\uB9CC \uD55C\uB2E4 \u2014 \`dist/\`\uC5D0 liquid\uB294 \uB4E4\uC5B4\uAC00\uC9C0 \uC54A\uB294\uB2E4(\uD3EC\uD138\uC774 push\uB41C \uCEE4\uBC0B\uC758 \`public/\`\uC5D0\uC11C \uD328\uD0A4\uC9D5). \uAC80\uC99D \uC624\uB958\uAC00 \uC788\uC73C\uBA74 \uBC88\uB4E4\uD558\uC9C0 \uC54A\uACE0 \uC885\uB8CC \uCF54\uB4DC 2.
1078
+ - **\`bstage dev\`**: \uAE30\uBCF8\uC740 sdk(Vite) \uD504\uB9AC\uBDF0. liquid \uD504\uB9AC\uBDF0\uB294 \`bstage dev --kind liquid\`\uB85C \uB530\uB85C \uB744\uC6B4\uB2E4 \u2014 \uB450 \uC11C\uBC84\uB97C \uD568\uAED8 \uB744\uC6B0\uC9C0 \uC54A\uB294\uB2E4.
1079
+ - liquid \uD15C\uD50C\uB9BF\uC740 PAGE \uBC30\uCE58\uB9CC \uB41C\uB2E4. \uC704\uC82F \uC790\uB9AC\uC5D0\uB294 sdk \uC704\uC82F(\`src/slots\`)\uB9CC \uBD99\uC778\uB2E4.
1080
+
1081
+ ## React \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1082
+
1083
+ ${sdkTemplateRules(space)}
1084
+
1085
+ ## liquid \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1086
+
1087
+ ${LIQUID_RULES_BULLETS}
1088
+
1089
+ ${LIQUID_DATA_SECTION}
1090
+
1091
+ ${designRulesBrief(target)}
1092
+
1093
+ ## \uD658\uACBD \uC124\uC815
1094
+
1095
+ ${SDK_ENV_SECTION}
1096
+
1097
+ ## \uBA85\uB839\uC5B4
1098
+
1099
+ - \`npm run dev\` \uB610\uB294 \`bstage dev\` \u2014 sdk(Vite) \uAC1C\uBC1C \uC11C\uBC84(\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568). \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login
1100
+ - \`bstage dev --kind liquid\` \u2014 liquid \uBBF8\uB9AC\uBCF4\uAE30(\uBAA9\uB85D\uC5D0\uC11C \uD15C\uD50C\uB9BF\uC744 \uACE8\uB77C \uD655\uC778, \`data.json\`\uC73C\uB85C \uB80C\uB354)
1101
+ - \`bstage build\` \u2014 sdk \uBC88\uB4E4 + liquid \uAC80\uC99D
1102
+ - \`bstage deploy\` \u2014 \uD3EC\uD138 \uBC30\uD3EC (\uC544\uB798 "\uBC30\uD3EC" \uC808)
1103
+
1104
+ ${sdkMigrationSection(MIXED_SKILLS_LIST)}
1105
+
1106
+ ${deploySection()}
1107
+
1108
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1109
+
1110
+ - sdk \uD398\uC774\uC9C0\uB97C \`src/pages/user\`\xB7\`src/pages/admin\` \uC544\uB798\uC5D0 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4 \u2014 liquid \uC0B0\uCD9C\uBB3C \uC790\uB9AC\uC640 \uACB9\uCE5C\uB2E4(\uC704 '\uD63C\uD569 \uB808\uD3EC \uADDC\uCE59')
1111
+ ${sdkForbidBullets()}
1112
+ ${liquidForbidBullets()}
1031
1113
  `;
1032
1114
  }
1033
1115
  function renderManagedBlock(opts) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bstage-sdk/ai-toolkit",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "bstage SDK ai-toolkit — 에이전트용 스킬·AGENTS.md 콘텐츠(cli가 소비)",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -34,7 +34,7 @@
34
34
  "@types/node": "^25.5.0",
35
35
  "tsup": "^8.0.0",
36
36
  "typescript": "^5.5.0",
37
- "@bstage-sdk/design": "0.5.0"
37
+ "@bstage-sdk/design": "0.6.0"
38
38
  },
39
39
  "license": "MIT",
40
40
  "scripts": {