@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 +181 -77
- package/dist/index.d.cts +22 -7
- package/dist/index.d.ts +22 -7
- package/dist/index.js +180 -77
- package/package.json +2 -2
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.
|
|
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
|
|
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\
|
|
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
|
-
- \
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
991
|
+
## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
|
|
981
992
|
|
|
982
|
-
|
|
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
|
-
|
|
995
|
+
- **Space**: ${space}
|
|
996
|
+
- **\uB808\uD3EC**: \`${projectName}\`
|
|
985
997
|
|
|
986
|
-
|
|
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
|
-
|
|
1000
|
+
## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
|
|
990
1001
|
|
|
991
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1021
|
-
|
|
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
|
-
|
|
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
|
-
${
|
|
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
|
-
|
|
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
|
-
- \
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
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
|
-
/**
|
|
5
|
-
|
|
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 =
|
|
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
|
-
/**
|
|
5
|
-
|
|
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 =
|
|
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.
|
|
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
|
|
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\
|
|
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
|
-
- \
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
941
|
+
## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
|
|
932
942
|
|
|
933
|
-
|
|
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
|
-
|
|
945
|
+
- **Space**: ${space}
|
|
946
|
+
- **\uB808\uD3EC**: \`${projectName}\`
|
|
936
947
|
|
|
937
|
-
|
|
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
|
-
|
|
950
|
+
## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
|
|
941
951
|
|
|
942
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
972
|
-
|
|
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
|
-
|
|
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
|
-
${
|
|
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
|
-
|
|
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
|
-
- \
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
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.
|
|
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.
|
|
37
|
+
"@bstage-sdk/design": "0.6.1"
|
|
38
38
|
},
|
|
39
39
|
"license": "MIT",
|
|
40
40
|
"scripts": {
|