@bstage-sdk/ai-toolkit 0.5.0 → 0.6.1

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
@@ -31,6 +31,7 @@ __export(index_exports, {
31
31
  designGuideSection: () => designGuideSection,
32
32
  designMeta: () => meta,
33
33
  designRulesBrief: () => designRulesBrief,
34
+ extractManagedBlock: () => extractManagedBlock,
34
35
  freeRegionScaffold: () => freeRegionScaffold,
35
36
  parseAgentsIdentity: () => parseAgentsIdentity,
36
37
  planInstall: () => planInstall,
@@ -48,7 +49,7 @@ __export(index_exports, {
48
49
  module.exports = __toCommonJS(index_exports);
49
50
 
50
51
  // src/version.ts
51
- var VERSION = "0.5.0";
52
+ var VERSION = "0.6.1";
52
53
 
53
54
  // src/skills/deploy.ts
54
55
  function deploySkillMd() {
@@ -268,7 +269,7 @@ public/
268
269
 
269
270
  # \uD568\uC815
270
271
 
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.
272
+ - **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
273
  - **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
274
  - **\`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
275
  - **\`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 +472,7 @@ description: b.stage \uCEE4\uC2A4\uD140 \uAC1C\uBC1C\uC744 \uCC98\uC74C\uBD80\uD
471
472
  - **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
473
  - **(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
474
 
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.
475
+ \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
476
 
476
477
  ## 2. \uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131
477
478
 
@@ -571,7 +572,7 @@ bstage deploy
571
572
  - \uC6D0\uACA9 push\xB7\uBC30\uD3EC\uB97C \uC0AC\uC6A9\uC790 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uD558\uAE30
572
573
  - \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
574
  - \`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
575
+ - \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
576
  `;
576
577
  }
577
578
 
@@ -766,11 +767,12 @@ var BSTAGE_SKILLS = [
766
767
  { name: "bstage-migrate", kinds: ["sdk", "liquid"], content: () => withStamp(migrateSkillMd()) }
767
768
  ];
768
769
  function skillsFor(kind) {
769
- return BSTAGE_SKILLS.filter((s) => s.kinds.includes(kind));
770
+ const wanted = kind === "mixed" ? ["sdk", "liquid"] : [kind];
771
+ return BSTAGE_SKILLS.filter((s) => s.kinds.some((k) => wanted.includes(k)));
770
772
  }
771
773
 
772
774
  // src/agents/agentsMdRegion.ts
773
- var AGENTS_MANAGED_VERSION = 13;
775
+ var AGENTS_MANAGED_VERSION = 14;
774
776
  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
777
  var END_MARKER = `<!-- BSTAGE:MANAGED:END -->`;
776
778
  var START_TOKEN = "BSTAGE:MANAGED:START";
@@ -833,6 +835,12 @@ function agentsMdStatus(content) {
833
835
  if (v === null) return "legacy";
834
836
  return v < AGENTS_MANAGED_VERSION ? "stale" : "ok";
835
837
  }
838
+ function extractManagedBlock(content) {
839
+ const s = findMarker(content, START_TOKEN);
840
+ const e = findMarker(content, END_TOKEN);
841
+ if (!s || !e || e.end <= s.start) return null;
842
+ return content.slice(s.start, e.end);
843
+ }
836
844
  function swapManagedBlock(existing, newWrappedBlock) {
837
845
  const s = findMarker(existing, START_TOKEN);
838
846
  const e = findMarker(existing, END_TOKEN);
@@ -865,6 +873,7 @@ function agentsManagedBody({
865
873
  }) {
866
874
  assertSingleLine({ space, projectName });
867
875
  if (kind === "liquid") return liquidManagedBody(space, projectName);
876
+ if (kind === "mixed") return mixedManagedBody(space, projectName, target);
868
877
  return sdkManagedBody(space, projectName, target);
869
878
  }
870
879
  function assertSingleLine(values) {
@@ -872,8 +881,7 @@ function assertSingleLine(values) {
872
881
  if (/[\r\n]/.test(value)) throw new Error(`AGENTS.md \uC815\uCCB4\uC131 \uAC12\uC5D0 \uAC1C\uD589\uC774 \uC788\uC2B5\uB2C8\uB2E4: ${key}`);
873
882
  }
874
883
  }
875
- function sdkManagedBody(space, projectName, target) {
876
- const structureBlock = `src/
884
+ var SDK_STRUCTURE_BLOCK = `src/
877
885
  main.tsx \u2014 App \uB9C8\uC6B4\uD2B8\uB9CC (\uC218\uC815 \uBD88\uD544\uC694)
878
886
  App.tsx \u2014 import.meta.glob \uAE30\uBC18 \uAC1C\uBC1C\uC6A9 \uBAA9\uB85D\xB7\uB77C\uC6B0\uD305 (\uC218\uC815 \uBD88\uD544\uC694)
879
887
  shared/
@@ -887,25 +895,14 @@ function sdkManagedBody(space, projectName, target) {
887
895
  .env \u2014 VITE_BSTAGE_PHASE + API \uD0A4 (\uCEE4\uBC0B \uC548 \uB428, .gitignore)
888
896
  .env.example \u2014 \uC704 \uD56D\uBAA9 placeholder (\uCEE4\uBC0B\uB428 \u2014 \uBCF5\uC0AC\uD574\uC11C .env \uC0DD\uC131)
889
897
  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.
898
+ 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
899
 
892
900
  \`\`\`
893
901
  VITE_BSTAGE_PHASE=dev # dev | qa | real | sandbox
894
902
  \`\`\``;
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.
903
+ 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
904
  - \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
905
+ var SDK_DOCS_SECTION = `## SDK \uBB38\uC11C
909
906
 
910
907
  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
908
 
@@ -924,17 +921,9 @@ node_modules/@bstage-sdk/core/docs/
924
921
  \u2514\u2500\u2500 SDK_ARCHITECTURE.md \u2014 \uD328\uD0A4\uC9C0 \uAD6C\uC870, \uC124\uACC4 \uACB0\uC815
925
922
  \`\`\`
926
923
 
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
924
+ \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.`;
925
+ function sdkTemplateRules(space) {
926
+ return `### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
938
927
 
939
928
  \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
929
 
@@ -967,28 +956,68 @@ createTemplate(MyWidget, {
967
956
 
968
957
  - \`name\`\uC740 \uD544\uC218 \u2014 \uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85\uACFC \uC77C\uCE58, \uD558\uC774\uD508 \uD3EC\uD568
969
958
  - \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
959
+ - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5`;
960
+ }
961
+ function sdkMigrationSection(skillsList) {
962
+ return `## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
971
963
 
972
- ${designRulesBrief(target)}
964
+ \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
965
 
974
- ## \uD658\uACBD \uC124\uC815
966
+ - \`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).
967
+ - \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
968
 
976
- ${envSection}
969
+ \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
970
 
978
- ## \uBA85\uB839\uC5B4
971
+ \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.`;
972
+ }
973
+ 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";
974
+ function sdkForbidBullets() {
975
+ 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
976
+ - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
977
+ - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
978
+ - \`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
979
+ - \`@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
980
+ - \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.
981
+ - **\`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
982
+ - 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
983
+ - \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
984
+ ${SDK_API_FORBID_BULLETS}`;
985
+ }
986
+ function sdkManagedBody(space, projectName, target) {
987
+ const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
988
+ - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
989
+ return `# AGENTS.md
979
990
 
980
- ${commandsSection}
991
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
981
992
 
982
- ## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
993
+ 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
994
 
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:
995
+ - **Space**: ${space}
996
+ - **\uB808\uD3EC**: \`${projectName}\`
985
997
 
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).
998
+ ${SDK_DOCS_SECTION}
988
999
 
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.
1000
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
990
1001
 
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.
1002
+ \`\`\`
1003
+ ${SDK_STRUCTURE_BLOCK}
1004
+ \`\`\`
1005
+
1006
+ ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1007
+
1008
+ ${sdkTemplateRules(space)}
1009
+
1010
+ ${designRulesBrief(target)}
1011
+
1012
+ ## \uD658\uACBD \uC124\uC815
1013
+
1014
+ ${SDK_ENV_SECTION}
1015
+
1016
+ ## \uBA85\uB839\uC5B4
1017
+
1018
+ ${commandsSection}
1019
+
1020
+ ${sdkMigrationSection(SDK_SKILLS_LIST)}
992
1021
 
993
1022
  ## \uBE4C\uB4DC
994
1023
 
@@ -998,27 +1027,32 @@ ${deploySection()}
998
1027
 
999
1028
  ## \uAE08\uC9C0 \uC0AC\uD56D
1000
1029
 
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}
1030
+ ${sdkForbidBullets()}
1011
1031
  `;
1012
1032
  }
1013
- function liquidManagedBody(space, projectName) {
1014
- const structureBlock = `public/
1033
+ var LIQUID_STRUCTURE_BLOCK = `public/
1015
1034
  user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9 \uD15C\uD50C\uB9BF
1016
1035
  {name}/
1017
1036
  template.liquid \u2014 \uD15C\uD50C\uB9BF \uBCF8\uBB38 (\uD544\uC218, \uD30C\uC77C\uBA85 \uACE0\uC815)
1018
1037
  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`;
1038
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)`;
1039
+ var LIQUID_DATA_SECTION = `## \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.`;
1042
+ 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).
1043
+ - \`{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.
1044
+ - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
1045
+ - \`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.
1046
+ - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.`;
1047
+ function liquidForbidBullets() {
1048
+ 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
1049
+ - \`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)
1050
+ - \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
1051
+ - \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
1052
+ - \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
1053
+ - \`{% 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`;
1054
+ }
1055
+ function liquidManagedBody(space, projectName) {
1022
1056
  return `# AGENTS.md
1023
1057
 
1024
1058
  ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
@@ -1036,23 +1070,19 @@ b.stage liquid \uD14C\uB9C8 \uD504\uB85C\uC81D\uD2B8. \`.liquid\` \uD15C\uD50C\u
1036
1070
  - \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B: \`.claude/skills/bstage-liquid/SKILL.md\`
1037
1071
  - \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130): liquidjs \uACF5\uC2DD \uBB38\uC11C
1038
1072
 
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.
1073
+ ${LIQUID_DATA_SECTION}
1042
1074
 
1043
1075
  ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1044
1076
 
1045
1077
  \`\`\`
1046
- ${structureBlock}
1078
+ ${LIQUID_STRUCTURE_BLOCK}
1079
+ package.json
1080
+ AGENTS.md \u2014 \uC774 \uD30C\uC77C
1047
1081
  \`\`\`
1048
1082
 
1049
1083
  ## \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1050
1084
 
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.
1085
+ ${LIQUID_RULES_BULLETS}
1056
1086
 
1057
1087
  ## \uBA85\uB839\uC5B4
1058
1088
 
@@ -1070,13 +1100,72 @@ ${deploySection()}
1070
1100
 
1071
1101
  ## \uAE08\uC9C0 \uC0AC\uD56D
1072
1102
 
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
1103
+ - 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
1104
+ ${liquidForbidBullets()}
1105
+ `;
1106
+ }
1107
+ 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";
1108
+ function mixedManagedBody(space, projectName, target) {
1109
+ return `# AGENTS.md
1110
+
1111
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
1112
+
1113
+ 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.
1114
+
1115
+ - **Space**: ${space}
1116
+ - **\uB808\uD3EC**: \`${projectName}\`
1117
+
1118
+ ${SDK_DOCS_SECTION}
1119
+
1120
+ 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.
1121
+
1122
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1123
+
1124
+ \`\`\`
1125
+ ${SDK_STRUCTURE_BLOCK}
1126
+ ${LIQUID_STRUCTURE_BLOCK}
1127
+ \`\`\`
1128
+
1129
+ ## \uD63C\uD569 \uB808\uD3EC \uADDC\uCE59
1130
+
1131
+ - **\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.
1132
+ - **\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.
1133
+ - **\`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.
1134
+ - **\`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.
1135
+ - 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.
1136
+
1137
+ ## React \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1138
+
1139
+ ${sdkTemplateRules(space)}
1140
+
1141
+ ## liquid \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1142
+
1143
+ ${LIQUID_RULES_BULLETS}
1144
+
1145
+ ${LIQUID_DATA_SECTION}
1146
+
1147
+ ${designRulesBrief(target)}
1148
+
1149
+ ## \uD658\uACBD \uC124\uC815
1150
+
1151
+ ${SDK_ENV_SECTION}
1152
+
1153
+ ## \uBA85\uB839\uC5B4
1154
+
1155
+ - \`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
1156
+ - \`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)
1157
+ - \`bstage build\` \u2014 sdk \uBC88\uB4E4 + liquid \uAC80\uC99D
1158
+ - \`bstage deploy\` \u2014 \uD3EC\uD138 \uBC30\uD3EC (\uC544\uB798 "\uBC30\uD3EC" \uC808)
1159
+
1160
+ ${sdkMigrationSection(MIXED_SKILLS_LIST)}
1161
+
1162
+ ${deploySection()}
1163
+
1164
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1165
+
1166
+ - 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')
1167
+ ${sdkForbidBullets()}
1168
+ ${liquidForbidBullets()}
1080
1169
  `;
1081
1170
  }
1082
1171
  function renderManagedBlock(opts) {
@@ -1113,6 +1202,8 @@ var CLAUDE_FILE = "CLAUDE.md";
1113
1202
  var LEGACY_NOTE = "\uAD00\uB9AC \uC601\uC5ED \uB9C8\uCEE4 \uC5C6\uC74C \u2014 bstage-migrate \uC2A4\uD0AC\uB85C reconcile";
1114
1203
  var HAND_EDIT_NOTE = "\uBC84\uC804\uC740 \uAC19\uC740\uB370 \uBCF8\uBB38\uC774 \uB2E4\uB985\uB2C8\uB2E4(\uC190\uC218\uC815) \u2014 SDK \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9AC\uACE0 \uAE30\uC874 \uBCF8\uBB38\uC740 SKILL.md.bak \uC73C\uB85C \uB0A8\uAE41\uB2C8\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 AGENTS.md \uC790\uC720 \uC601\uC5ED\uC5D0 \uC801\uC73C\uC138\uC694.";
1115
1204
  var NEWER_NOTE = "\uC124\uCE58\uBCF8\uC774 \uC774 toolkit\uBCF4\uB2E4 \uC0C8 \uBC84\uC804\uC785\uB2C8\uB2E4 \u2014 \uC774 CLI\uAC00 \uC624\uB798\uB3FC \uC61B \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9BD\uB2C8\uB2E4(\uD558\uD5A5). \uCD5C\uC2E0 CLI(npx @bstage-sdk/cli@latest ai update)\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.";
1205
+ var KIND_DRIFT_NOTE = "\uAD00\uB9AC \uC601\uC5ED \uBC84\uC804\uC740 \uCD5C\uC2E0\uC778\uB370 \uBCF8\uBB38\uC774 \uC774 \uD504\uB85C\uC81D\uD2B8 \uC885\uB958\uC758 \uAC83\uACFC \uB2E4\uB985\uB2C8\uB2E4(\uC885\uB958\uAC00 \uBC14\uB00C\uC5C8\uAC70\uB098 \uAD00\uB9AC \uC601\uC5ED\uC744 \uC190\uC73C\uB85C \uACE0\uCE68) \u2014 \uD604\uC7AC \uC885\uB958\uC758 \uBCF8\uBB38\uC73C\uB85C \uAC31\uC2E0\uD569\uB2C8\uB2E4. \uC790\uC720 \uC601\uC5ED\uC740 \uBCF4\uC874\uB429\uB2C8\uB2E4.";
1206
+ var AGENTS_NEWER_NOTE = "AGENTS.md \uAD00\uB9AC \uC601\uC5ED\uC774 \uC774 toolkit\uBCF4\uB2E4 \uC0C8 \uBC84\uC804\uC785\uB2C8\uB2E4 \u2014 \uC774 CLI\uAC00 \uC624\uB798\uB3FC \uC61B \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9BD\uB2C8\uB2E4(\uD558\uD5A5). \uCD5C\uC2E0 CLI(npx @bstage-sdk/cli@latest ai update)\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.";
1116
1207
  function planInstall(input) {
1117
1208
  const actions = [...planSkills(input), planAgentsMd(input), planClaudeMd(input.existing.claudeMd)];
1118
1209
  return [...actions].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
@@ -1165,7 +1256,6 @@ function planAgentsMd(input) {
1165
1256
  if (status === "legacy") {
1166
1257
  return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1167
1258
  }
1168
- if (status === "ok") return { path: AGENTS_FILE, content: null, reason: "keep" };
1169
1259
  const identity = parseAgentsIdentity(current);
1170
1260
  const block = renderManagedBlock({
1171
1261
  space: sanitizeIdentity(identity.space) ?? space,
@@ -1173,10 +1263,23 @@ function planAgentsMd(input) {
1173
1263
  target,
1174
1264
  kind
1175
1265
  });
1266
+ if (status === "ok" && extractManagedBlock(current) === block) {
1267
+ return { path: AGENTS_FILE, content: null, reason: "keep" };
1268
+ }
1176
1269
  const swapped = swapManagedBlock(current, block);
1177
1270
  if (swapped === null) {
1178
1271
  return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1179
1272
  }
1273
+ if (status === "ok") {
1274
+ const fileVersion = readManagedVersion(current);
1275
+ const newer = fileVersion !== null && fileVersion > AGENTS_MANAGED_VERSION;
1276
+ return {
1277
+ path: AGENTS_FILE,
1278
+ content: swapped,
1279
+ reason: "update",
1280
+ note: newer ? AGENTS_NEWER_NOTE : KIND_DRIFT_NOTE
1281
+ };
1282
+ }
1180
1283
  return { path: AGENTS_FILE, content: swapped, reason: "update" };
1181
1284
  }
1182
1285
  function planClaudeMd(current) {
@@ -1196,6 +1299,7 @@ function planClaudeMd(current) {
1196
1299
  designGuideSection,
1197
1300
  designMeta,
1198
1301
  designRulesBrief,
1302
+ extractManagedBlock,
1199
1303
  freeRegionScaffold,
1200
1304
  parseAgentsIdentity,
1201
1305
  planInstall,
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이 새 프로젝트에 까는 기본 자유 영역 스캐폴드(빈 섹션). */
@@ -102,6 +111,12 @@ type AgentsMdStatus = 'missing' | 'legacy' | 'stale' | 'ok';
102
111
  declare function readManagedVersion(content: string): number | null;
103
112
  /** AGENTS.md 내용으로 갱신 상태를 판정한다. */
104
113
  declare function agentsMdStatus(content: string): Exclude<AgentsMdStatus, 'missing'>;
114
+ /**
115
+ * 기존 파일의 관리 영역(마커 포함, START~END)을 그대로 돌려준다. 마커가 없거나 순서가 어긋나면 null.
116
+ * `renderManagedBlock` 결과와 문자열로 비교해 "버전은 같은데 본문이 다른" 상태(레포 종류가 바뀐 뒤의
117
+ * 옛 kind 본문, 관리 영역 안 손수정)를 잡는 데 쓴다 — 버전 마커만 보면 이 둘은 `ok`로 보인다.
118
+ */
119
+ declare function extractManagedBlock(content: string): string | null;
105
120
  /**
106
121
  * 기존 파일의 관리 영역(START~END)을 새 블록으로 치환한다. START/END 바깥(자유 영역 등)은
107
122
  * 그대로 보존한다. 마커가 없으면(레거시) null을 반환 — 호출부가 reconcile 경로로 분기한다.
@@ -214,4 +229,4 @@ declare function designRulesBrief(target: DesignTarget): string;
214
229
  */
215
230
  declare function designGuideSection(target: DesignTarget): string;
216
231
 
217
- export { AGENTS_MANAGED_VERSION, type ActionReason, type AgentsMdStatus, BSTAGE_SKILLS, type BstageSkill, type DesignTarget, type InstallAction, type InstallInput, type ProjectKind, type SkillContext, VERSION, agentsManagedBody, agentsMd, agentsMdStatus, claudeMd, compareVersions, designGuideSection, meta as designMeta, designRulesBrief, freeRegionScaffold, parseAgentsIdentity, planInstall, readManagedVersion, readSkillStamp, renderManagedBlock, sanitizeIdentity, skillFilePath, skillStamp, skillsFor, swapManagedBlock, withStamp, wrapManaged };
232
+ export { AGENTS_MANAGED_VERSION, type ActionReason, type AgentsMdStatus, BSTAGE_SKILLS, type BstageSkill, type DesignTarget, type InstallAction, type InstallInput, type ProjectKind, type SkillContext, VERSION, agentsManagedBody, agentsMd, agentsMdStatus, claudeMd, compareVersions, designGuideSection, meta as designMeta, designRulesBrief, extractManagedBlock, freeRegionScaffold, parseAgentsIdentity, planInstall, readManagedVersion, readSkillStamp, renderManagedBlock, sanitizeIdentity, skillFilePath, skillStamp, skillsFor, swapManagedBlock, withStamp, wrapManaged };
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이 새 프로젝트에 까는 기본 자유 영역 스캐폴드(빈 섹션). */
@@ -102,6 +111,12 @@ type AgentsMdStatus = 'missing' | 'legacy' | 'stale' | 'ok';
102
111
  declare function readManagedVersion(content: string): number | null;
103
112
  /** AGENTS.md 내용으로 갱신 상태를 판정한다. */
104
113
  declare function agentsMdStatus(content: string): Exclude<AgentsMdStatus, 'missing'>;
114
+ /**
115
+ * 기존 파일의 관리 영역(마커 포함, START~END)을 그대로 돌려준다. 마커가 없거나 순서가 어긋나면 null.
116
+ * `renderManagedBlock` 결과와 문자열로 비교해 "버전은 같은데 본문이 다른" 상태(레포 종류가 바뀐 뒤의
117
+ * 옛 kind 본문, 관리 영역 안 손수정)를 잡는 데 쓴다 — 버전 마커만 보면 이 둘은 `ok`로 보인다.
118
+ */
119
+ declare function extractManagedBlock(content: string): string | null;
105
120
  /**
106
121
  * 기존 파일의 관리 영역(START~END)을 새 블록으로 치환한다. START/END 바깥(자유 영역 등)은
107
122
  * 그대로 보존한다. 마커가 없으면(레거시) null을 반환 — 호출부가 reconcile 경로로 분기한다.
@@ -214,4 +229,4 @@ declare function designRulesBrief(target: DesignTarget): string;
214
229
  */
215
230
  declare function designGuideSection(target: DesignTarget): string;
216
231
 
217
- export { AGENTS_MANAGED_VERSION, type ActionReason, type AgentsMdStatus, BSTAGE_SKILLS, type BstageSkill, type DesignTarget, type InstallAction, type InstallInput, type ProjectKind, type SkillContext, VERSION, agentsManagedBody, agentsMd, agentsMdStatus, claudeMd, compareVersions, designGuideSection, meta as designMeta, designRulesBrief, freeRegionScaffold, parseAgentsIdentity, planInstall, readManagedVersion, readSkillStamp, renderManagedBlock, sanitizeIdentity, skillFilePath, skillStamp, skillsFor, swapManagedBlock, withStamp, wrapManaged };
232
+ export { AGENTS_MANAGED_VERSION, type ActionReason, type AgentsMdStatus, BSTAGE_SKILLS, type BstageSkill, type DesignTarget, type InstallAction, type InstallInput, type ProjectKind, type SkillContext, VERSION, agentsManagedBody, agentsMd, agentsMdStatus, claudeMd, compareVersions, designGuideSection, meta as designMeta, designRulesBrief, extractManagedBlock, freeRegionScaffold, parseAgentsIdentity, planInstall, readManagedVersion, readSkillStamp, renderManagedBlock, sanitizeIdentity, skillFilePath, skillStamp, skillsFor, swapManagedBlock, withStamp, wrapManaged };
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.1";
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";
@@ -784,6 +785,12 @@ function agentsMdStatus(content) {
784
785
  if (v === null) return "legacy";
785
786
  return v < AGENTS_MANAGED_VERSION ? "stale" : "ok";
786
787
  }
788
+ function extractManagedBlock(content) {
789
+ const s = findMarker(content, START_TOKEN);
790
+ const e = findMarker(content, END_TOKEN);
791
+ if (!s || !e || e.end <= s.start) return null;
792
+ return content.slice(s.start, e.end);
793
+ }
787
794
  function swapManagedBlock(existing, newWrappedBlock) {
788
795
  const s = findMarker(existing, START_TOKEN);
789
796
  const e = findMarker(existing, END_TOKEN);
@@ -816,6 +823,7 @@ function agentsManagedBody({
816
823
  }) {
817
824
  assertSingleLine({ space, projectName });
818
825
  if (kind === "liquid") return liquidManagedBody(space, projectName);
826
+ if (kind === "mixed") return mixedManagedBody(space, projectName, target);
819
827
  return sdkManagedBody(space, projectName, target);
820
828
  }
821
829
  function assertSingleLine(values) {
@@ -823,8 +831,7 @@ function assertSingleLine(values) {
823
831
  if (/[\r\n]/.test(value)) throw new Error(`AGENTS.md \uC815\uCCB4\uC131 \uAC12\uC5D0 \uAC1C\uD589\uC774 \uC788\uC2B5\uB2C8\uB2E4: ${key}`);
824
832
  }
825
833
  }
826
- function sdkManagedBody(space, projectName, target) {
827
- const structureBlock = `src/
834
+ var SDK_STRUCTURE_BLOCK = `src/
828
835
  main.tsx \u2014 App \uB9C8\uC6B4\uD2B8\uB9CC (\uC218\uC815 \uBD88\uD544\uC694)
829
836
  App.tsx \u2014 import.meta.glob \uAE30\uBC18 \uAC1C\uBC1C\uC6A9 \uBAA9\uB85D\xB7\uB77C\uC6B0\uD305 (\uC218\uC815 \uBD88\uD544\uC694)
830
837
  shared/
@@ -838,25 +845,14 @@ function sdkManagedBody(space, projectName, target) {
838
845
  .env \u2014 VITE_BSTAGE_PHASE + API \uD0A4 (\uCEE4\uBC0B \uC548 \uB428, .gitignore)
839
846
  .env.example \u2014 \uC704 \uD56D\uBAA9 placeholder (\uCEE4\uBC0B\uB428 \u2014 \uBCF5\uC0AC\uD574\uC11C .env \uC0DD\uC131)
840
847
  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.
848
+ 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
849
 
843
850
  \`\`\`
844
851
  VITE_BSTAGE_PHASE=dev # dev | qa | real | sandbox
845
852
  \`\`\``;
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.
853
+ 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
854
  - \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
855
+ var SDK_DOCS_SECTION = `## SDK \uBB38\uC11C
860
856
 
861
857
  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
858
 
@@ -875,17 +871,9 @@ node_modules/@bstage-sdk/core/docs/
875
871
  \u2514\u2500\u2500 SDK_ARCHITECTURE.md \u2014 \uD328\uD0A4\uC9C0 \uAD6C\uC870, \uC124\uACC4 \uACB0\uC815
876
872
  \`\`\`
877
873
 
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
874
+ \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.`;
875
+ function sdkTemplateRules(space) {
876
+ return `### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
889
877
 
890
878
  \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
879
 
@@ -918,28 +906,68 @@ createTemplate(MyWidget, {
918
906
 
919
907
  - \`name\`\uC740 \uD544\uC218 \u2014 \uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85\uACFC \uC77C\uCE58, \uD558\uC774\uD508 \uD3EC\uD568
920
908
  - \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
909
+ - \`type\` \uB4F1 \uC120\uD0DD \uD544\uB4DC \uCD94\uAC00 \uAC00\uB2A5`;
910
+ }
911
+ function sdkMigrationSection(skillsList) {
912
+ return `## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
922
913
 
923
- ${designRulesBrief(target)}
914
+ \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
915
 
925
- ## \uD658\uACBD \uC124\uC815
916
+ - \`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).
917
+ - \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
918
 
927
- ${envSection}
919
+ \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
920
 
929
- ## \uBA85\uB839\uC5B4
921
+ \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.`;
922
+ }
923
+ 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";
924
+ function sdkForbidBullets() {
925
+ 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
926
+ - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
927
+ - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
928
+ - \`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
929
+ - \`@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
930
+ - \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.
931
+ - **\`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
932
+ - 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
933
+ - \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
934
+ ${SDK_API_FORBID_BULLETS}`;
935
+ }
936
+ function sdkManagedBody(space, projectName, target) {
937
+ const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
938
+ - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
939
+ return `# AGENTS.md
930
940
 
931
- ${commandsSection}
941
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
932
942
 
933
- ## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
943
+ 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
944
 
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:
945
+ - **Space**: ${space}
946
+ - **\uB808\uD3EC**: \`${projectName}\`
936
947
 
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).
948
+ ${SDK_DOCS_SECTION}
939
949
 
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.
950
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
941
951
 
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.
952
+ \`\`\`
953
+ ${SDK_STRUCTURE_BLOCK}
954
+ \`\`\`
955
+
956
+ ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
957
+
958
+ ${sdkTemplateRules(space)}
959
+
960
+ ${designRulesBrief(target)}
961
+
962
+ ## \uD658\uACBD \uC124\uC815
963
+
964
+ ${SDK_ENV_SECTION}
965
+
966
+ ## \uBA85\uB839\uC5B4
967
+
968
+ ${commandsSection}
969
+
970
+ ${sdkMigrationSection(SDK_SKILLS_LIST)}
943
971
 
944
972
  ## \uBE4C\uB4DC
945
973
 
@@ -949,27 +977,32 @@ ${deploySection()}
949
977
 
950
978
  ## \uAE08\uC9C0 \uC0AC\uD56D
951
979
 
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}
980
+ ${sdkForbidBullets()}
962
981
  `;
963
982
  }
964
- function liquidManagedBody(space, projectName) {
965
- const structureBlock = `public/
983
+ var LIQUID_STRUCTURE_BLOCK = `public/
966
984
  user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9 \uD15C\uD50C\uB9BF
967
985
  {name}/
968
986
  template.liquid \u2014 \uD15C\uD50C\uB9BF \uBCF8\uBB38 (\uD544\uC218, \uD30C\uC77C\uBA85 \uACE0\uC815)
969
987
  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`;
988
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)`;
989
+ var LIQUID_DATA_SECTION = `## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
990
+
991
+ \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.`;
992
+ 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).
993
+ - \`{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.
994
+ - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
995
+ - \`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.
996
+ - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.`;
997
+ function liquidForbidBullets() {
998
+ 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
999
+ - \`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)
1000
+ - \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
1001
+ - \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
1002
+ - \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
1003
+ - \`{% 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`;
1004
+ }
1005
+ function liquidManagedBody(space, projectName) {
973
1006
  return `# AGENTS.md
974
1007
 
975
1008
  ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
@@ -987,23 +1020,19 @@ b.stage liquid \uD14C\uB9C8 \uD504\uB85C\uC81D\uD2B8. \`.liquid\` \uD15C\uD50C\u
987
1020
  - \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B: \`.claude/skills/bstage-liquid/SKILL.md\`
988
1021
  - \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130): liquidjs \uACF5\uC2DD \uBB38\uC11C
989
1022
 
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.
1023
+ ${LIQUID_DATA_SECTION}
993
1024
 
994
1025
  ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
995
1026
 
996
1027
  \`\`\`
997
- ${structureBlock}
1028
+ ${LIQUID_STRUCTURE_BLOCK}
1029
+ package.json
1030
+ AGENTS.md \u2014 \uC774 \uD30C\uC77C
998
1031
  \`\`\`
999
1032
 
1000
1033
  ## \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1001
1034
 
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.
1035
+ ${LIQUID_RULES_BULLETS}
1007
1036
 
1008
1037
  ## \uBA85\uB839\uC5B4
1009
1038
 
@@ -1021,13 +1050,72 @@ ${deploySection()}
1021
1050
 
1022
1051
  ## \uAE08\uC9C0 \uC0AC\uD56D
1023
1052
 
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
1053
+ - 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
1054
+ ${liquidForbidBullets()}
1055
+ `;
1056
+ }
1057
+ 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";
1058
+ function mixedManagedBody(space, projectName, target) {
1059
+ return `# AGENTS.md
1060
+
1061
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
1062
+
1063
+ 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.
1064
+
1065
+ - **Space**: ${space}
1066
+ - **\uB808\uD3EC**: \`${projectName}\`
1067
+
1068
+ ${SDK_DOCS_SECTION}
1069
+
1070
+ 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.
1071
+
1072
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1073
+
1074
+ \`\`\`
1075
+ ${SDK_STRUCTURE_BLOCK}
1076
+ ${LIQUID_STRUCTURE_BLOCK}
1077
+ \`\`\`
1078
+
1079
+ ## \uD63C\uD569 \uB808\uD3EC \uADDC\uCE59
1080
+
1081
+ - **\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.
1082
+ - **\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.
1083
+ - **\`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.
1084
+ - **\`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.
1085
+ - 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.
1086
+
1087
+ ## React \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
1088
+
1089
+ ${sdkTemplateRules(space)}
1090
+
1091
+ ## liquid \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1092
+
1093
+ ${LIQUID_RULES_BULLETS}
1094
+
1095
+ ${LIQUID_DATA_SECTION}
1096
+
1097
+ ${designRulesBrief(target)}
1098
+
1099
+ ## \uD658\uACBD \uC124\uC815
1100
+
1101
+ ${SDK_ENV_SECTION}
1102
+
1103
+ ## \uBA85\uB839\uC5B4
1104
+
1105
+ - \`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
1106
+ - \`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)
1107
+ - \`bstage build\` \u2014 sdk \uBC88\uB4E4 + liquid \uAC80\uC99D
1108
+ - \`bstage deploy\` \u2014 \uD3EC\uD138 \uBC30\uD3EC (\uC544\uB798 "\uBC30\uD3EC" \uC808)
1109
+
1110
+ ${sdkMigrationSection(MIXED_SKILLS_LIST)}
1111
+
1112
+ ${deploySection()}
1113
+
1114
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1115
+
1116
+ - 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')
1117
+ ${sdkForbidBullets()}
1118
+ ${liquidForbidBullets()}
1031
1119
  `;
1032
1120
  }
1033
1121
  function renderManagedBlock(opts) {
@@ -1064,6 +1152,8 @@ var CLAUDE_FILE = "CLAUDE.md";
1064
1152
  var LEGACY_NOTE = "\uAD00\uB9AC \uC601\uC5ED \uB9C8\uCEE4 \uC5C6\uC74C \u2014 bstage-migrate \uC2A4\uD0AC\uB85C reconcile";
1065
1153
  var HAND_EDIT_NOTE = "\uBC84\uC804\uC740 \uAC19\uC740\uB370 \uBCF8\uBB38\uC774 \uB2E4\uB985\uB2C8\uB2E4(\uC190\uC218\uC815) \u2014 SDK \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9AC\uACE0 \uAE30\uC874 \uBCF8\uBB38\uC740 SKILL.md.bak \uC73C\uB85C \uB0A8\uAE41\uB2C8\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 AGENTS.md \uC790\uC720 \uC601\uC5ED\uC5D0 \uC801\uC73C\uC138\uC694.";
1066
1154
  var NEWER_NOTE = "\uC124\uCE58\uBCF8\uC774 \uC774 toolkit\uBCF4\uB2E4 \uC0C8 \uBC84\uC804\uC785\uB2C8\uB2E4 \u2014 \uC774 CLI\uAC00 \uC624\uB798\uB3FC \uC61B \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9BD\uB2C8\uB2E4(\uD558\uD5A5). \uCD5C\uC2E0 CLI(npx @bstage-sdk/cli@latest ai update)\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.";
1155
+ var KIND_DRIFT_NOTE = "\uAD00\uB9AC \uC601\uC5ED \uBC84\uC804\uC740 \uCD5C\uC2E0\uC778\uB370 \uBCF8\uBB38\uC774 \uC774 \uD504\uB85C\uC81D\uD2B8 \uC885\uB958\uC758 \uAC83\uACFC \uB2E4\uB985\uB2C8\uB2E4(\uC885\uB958\uAC00 \uBC14\uB00C\uC5C8\uAC70\uB098 \uAD00\uB9AC \uC601\uC5ED\uC744 \uC190\uC73C\uB85C \uACE0\uCE68) \u2014 \uD604\uC7AC \uC885\uB958\uC758 \uBCF8\uBB38\uC73C\uB85C \uAC31\uC2E0\uD569\uB2C8\uB2E4. \uC790\uC720 \uC601\uC5ED\uC740 \uBCF4\uC874\uB429\uB2C8\uB2E4.";
1156
+ var AGENTS_NEWER_NOTE = "AGENTS.md \uAD00\uB9AC \uC601\uC5ED\uC774 \uC774 toolkit\uBCF4\uB2E4 \uC0C8 \uBC84\uC804\uC785\uB2C8\uB2E4 \u2014 \uC774 CLI\uAC00 \uC624\uB798\uB3FC \uC61B \uBCF8\uBB38\uC73C\uB85C \uB418\uB3CC\uB9BD\uB2C8\uB2E4(\uD558\uD5A5). \uCD5C\uC2E0 CLI(npx @bstage-sdk/cli@latest ai update)\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.";
1067
1157
  function planInstall(input) {
1068
1158
  const actions = [...planSkills(input), planAgentsMd(input), planClaudeMd(input.existing.claudeMd)];
1069
1159
  return [...actions].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
@@ -1116,7 +1206,6 @@ function planAgentsMd(input) {
1116
1206
  if (status === "legacy") {
1117
1207
  return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1118
1208
  }
1119
- if (status === "ok") return { path: AGENTS_FILE, content: null, reason: "keep" };
1120
1209
  const identity = parseAgentsIdentity(current);
1121
1210
  const block = renderManagedBlock({
1122
1211
  space: sanitizeIdentity(identity.space) ?? space,
@@ -1124,10 +1213,23 @@ function planAgentsMd(input) {
1124
1213
  target,
1125
1214
  kind
1126
1215
  });
1216
+ if (status === "ok" && extractManagedBlock(current) === block) {
1217
+ return { path: AGENTS_FILE, content: null, reason: "keep" };
1218
+ }
1127
1219
  const swapped = swapManagedBlock(current, block);
1128
1220
  if (swapped === null) {
1129
1221
  return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1130
1222
  }
1223
+ if (status === "ok") {
1224
+ const fileVersion = readManagedVersion(current);
1225
+ const newer = fileVersion !== null && fileVersion > AGENTS_MANAGED_VERSION;
1226
+ return {
1227
+ path: AGENTS_FILE,
1228
+ content: swapped,
1229
+ reason: "update",
1230
+ note: newer ? AGENTS_NEWER_NOTE : KIND_DRIFT_NOTE
1231
+ };
1232
+ }
1131
1233
  return { path: AGENTS_FILE, content: swapped, reason: "update" };
1132
1234
  }
1133
1235
  function planClaudeMd(current) {
@@ -1146,6 +1248,7 @@ export {
1146
1248
  designGuideSection,
1147
1249
  meta as designMeta,
1148
1250
  designRulesBrief,
1251
+ extractManagedBlock,
1149
1252
  freeRegionScaffold,
1150
1253
  parseAgentsIdentity,
1151
1254
  planInstall,
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.1",
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.1"
38
38
  },
39
39
  "license": "MIT",
40
40
  "scripts": {