@bstage-sdk/ai-toolkit 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1212 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AGENTS_MANAGED_VERSION: () => AGENTS_MANAGED_VERSION,
24
+ BSTAGE_SKILLS: () => BSTAGE_SKILLS,
25
+ VERSION: () => VERSION,
26
+ agentsManagedBody: () => agentsManagedBody,
27
+ agentsMd: () => agentsMd,
28
+ agentsMdStatus: () => agentsMdStatus,
29
+ claudeMd: () => claudeMd,
30
+ compareVersions: () => compareVersions,
31
+ designGuideSection: () => designGuideSection,
32
+ designMeta: () => meta,
33
+ designRulesBrief: () => designRulesBrief,
34
+ freeRegionScaffold: () => freeRegionScaffold,
35
+ parseAgentsIdentity: () => parseAgentsIdentity,
36
+ planInstall: () => planInstall,
37
+ readManagedVersion: () => readManagedVersion,
38
+ readSkillStamp: () => readSkillStamp,
39
+ renderManagedBlock: () => renderManagedBlock,
40
+ sanitizeIdentity: () => sanitizeIdentity,
41
+ skillFilePath: () => skillFilePath,
42
+ skillStamp: () => skillStamp,
43
+ skillsFor: () => skillsFor,
44
+ swapManagedBlock: () => swapManagedBlock,
45
+ withStamp: () => withStamp,
46
+ wrapManaged: () => wrapManaged
47
+ });
48
+ module.exports = __toCommonJS(index_exports);
49
+
50
+ // src/version.ts
51
+ var VERSION = "0.5.0";
52
+
53
+ // src/skills/deploy.ts
54
+ function deploySkillMd() {
55
+ return `---
56
+ name: bstage-deploy
57
+ description: b.stage \uD3EC\uD138\uB85C \uBC30\uD3EC\uD558\uACE0 \uB864\uBC31\xB7\uAC8C\uC2DC\xB7\uBE4C\uB4DC \uB85C\uADF8\uB97C \uB2E4\uB8EC\uB2E4. "\uBC30\uD3EC\uD574\uC918", "\uC62C\uB824\uC918", "\uB864\uBC31", "\uAC8C\uC2DC \uAEBC", "\uBE4C\uB4DC \uC2E4\uD328 \uB85C\uADF8 \uBD10\uC918" \uAC19\uC740 \uC694\uCCAD\uC744 \uBC1B\uC744 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.
58
+ ---
59
+
60
+ # \uC5ED\uD560
61
+
62
+ \uC774 \uB808\uD3EC\uC758 \uCF54\uB4DC\uB97C \uD3EC\uD138\uC744 \uD1B5\uD574 \uD50C\uB7AB\uD3FC\uC5D0 \uC62C\uB9AC\uACE0, \uBB38\uC81C\uAC00 \uC0DD\uAE30\uBA74 \uB418\uB3CC\uB9B0\uB2E4. \uC774 \uC2A4\uD0AC\uC740 \uC21C\uC11C\xB7\uD310\uC815\xB7\uC2E4\uD328 \uAC08\uB798\uB9CC \uB2F4\uB294\uB2E4. \uD50C\uB798\uADF8\uC640 \uD658\uACBD\uBCC0\uC218\uC758 \uC815\uD655\uD55C \uC774\uB984\uC740 \uD56D\uC0C1 \`bstage <\uBA85\uB839> --help\`\uB85C \uD655\uC778\uD55C\uB2E4(\uAE30\uC5B5\uC73C\uB85C \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4).
63
+
64
+ # \uC804\uC81C (\uC5EC\uAE30\uC11C \uC5B4\uAE0B\uB098\uBA74 \uB098\uBA38\uC9C0\uB294 \uC758\uBBF8\uAC00 \uC5C6\uB2E4)
65
+
66
+ - **\uD3EC\uD138\uC740 \uC6D0\uACA9 \uC800\uC7A5\uC18C \uAE30\uBCF8 \uBE0C\uB79C\uCE58\uC758 push\uB41C \uCEE4\uBC0B\uC744 \uBE4C\uB4DC\uD55C\uB2E4.** \uB85C\uCEEC \`dist/\`\uB97C \uC5C5\uB85C\uB4DC\uD558\uB294 \uAC83\uC774 \uC544\uB2C8\uB2E4. \uB85C\uCEEC\uC5D0\uB9CC \uC788\uB294 \uBCC0\uACBD\uC740 \uC808\uB300 \uBC18\uC601\uB418\uC9C0 \uC54A\uB294\uB2E4.
67
+ - \`bstage build\`\uB294 **\uB85C\uCEEC \uD655\uC778\uC6A9**\uC774\uB2E4. \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC740 \uD3EC\uD138\uC774 \uB2E4\uC2DC \uB9CC\uB4E0\uB2E4.
68
+ - **\uBC30\uCE58(\uD398\uC774\uC9C0) \uC0DD\uC131\uACFC \uB808\uD3EC \uC5F0\uACB0\uC740 \uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C\uB9CC** \uD560 \uC218 \uC788\uB2E4. CLI \uD1A0\uD070\uC73C\uB85C\uB294 \uB418\uC9C0 \uC54A\uB294\uB2E4(\uC758\uB3C4\uB41C \uC124\uACC4).
69
+ - \uBC30\uD3EC\uB294 \uC5EC\uB7EC \uC0AC\uB78C\uC774 \uAC19\uC740 \uC2A4\uD14C\uC774\uC9C0\uB97C \uAC74\uB4DC\uB9B0\uB2E4. \uC801\uC6A9 \uC9C1\uC804 \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC911\uAC04\uC5D0 \uBC14\uB00C\uC5C8\uC73C\uBA74 \uBA48\uCD98\uB2E4.
70
+
71
+ # \uC808\uCC28
72
+
73
+ ## 1. \uC0C1\uD0DC\uBD80\uD130 \uBCF8\uB2E4 (\uC77D\uAE30 \uC804\uC6A9)
74
+
75
+ \`\`\`bash
76
+ bstage whoami
77
+ bstage list
78
+ \`\`\`
79
+
80
+ - \`whoami\` \u2014 \uC5B4\uB290 \uC870\uC9C1\xB7\uC2A4\uD14C\uC774\uC9C0\uC5D0 \uC5B4\uB5A4 \uC5ED\uD560\uB85C \uB85C\uADF8\uC778\uB3FC \uC788\uB294\uC9C0. \uC778\uC99D\uC774 \uC5C6\uC73C\uBA74 \`bstage login\`.
81
+ - \`list\` \u2014 \uC774 \uB808\uD3EC\uC758 \uBC30\uCE58(\uB77C\uC774\uBE0C \uBC84\uC804\xB7\uAC8C\uC2DC \uC0C1\uD0DC)\uC640 \uCD5C\uADFC \uBE4C\uB4DC.
82
+ - \uB450 \uBA85\uB839 \uBAA8\uB450 \uAD6C\uC870\uD654 \uCD9C\uB825\uC744 \uC9C0\uC6D0\uD55C\uB2E4(\`--json\`, \uBA85\uB839\uBCC4 \`--help\` \uD655\uC778) \u2014 \uAC12\uC744 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uC77D\uC5B4\uC57C \uD560 \uB54C \uC4F4\uB2E4.
83
+
84
+ ## 2. \uAC08\uB798
85
+
86
+ ### 2a. \`bstage list\`\uC5D0 \uBC30\uCE58\uAC00 0\uAC74\uC77C \uB54C
87
+
88
+ \uBC30\uD3EC\uD560 \uC790\uB9AC\uAC00 \uC5C6\uB2E4\uB294 \uB73B\uC774\uB2E4. **\uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C \uBA3C\uC800 \uB9CC\uB4E4\uC5B4\uC57C \uD55C\uB2E4.** \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC21C\uC11C\uB97C \uC54C\uB824\uC900\uB2E4(\uC8FC\uC18C\uB294 \uC0AC\uC6A9\uC790\uAC00 \uC4F0\uB294 \uD3EC\uD138\uC744 \uADF8\uB300\uB85C \uB530\uB978\uB2E4).
89
+
90
+ 1. \uC2A4\uD14C\uC774\uC9C0 > \uB808\uD3EC > \uC0C8 \uB808\uD3EC \uC5F0\uACB0 (\uC870\uC9C1\uC5D0\uC11C \uCC98\uC74C\uC774\uBA74 GitHub \uC571 \uC124\uCE58\uAC00 1\uD68C \uC120\uD589)
91
+ 2. \uD654\uBA74\uC758 "\uC0C8 \uBC84\uC804 \uBE4C\uB4DC"\uB85C \uCCAB \uBE4C\uB4DC
92
+ 3. \uC2A4\uD14C\uC774\uC9C0 > \uD398\uC774\uC9C0 > \uC0C8 \uD398\uC774\uC9C0 \u2192 \uCEE4\uC2A4\uD140 \uBC29\uC2DD(\`sdk\` \xB7 \`liquid\` \xB7 \`slot\`) \u2192 \uB808\uD3EC\xB7\uC0B0\uCD9C\uBB3C \uC120\uD0DD \u2192 \uACBD\uB85C(PAGE) \uD655\uC778. **liquid\uB294 PAGE\uB9CC** \uAC00\uB2A5\uD558\uB2E4
93
+ 4. \uD654\uBA74\uC5D0\uC11C "\uC801\uC6A9"\uACFC "\uAC8C\uC2DC\uD558\uAE30"
94
+
95
+ \uB05D\uB0AC\uB294\uC9C0\uB294 \`bstage list\`\uB85C \uD655\uC778\uD55C\uB2E4. \uBC30\uCE58\uAC00 \uBCF4\uC774\uBA74 2b\uB85C \uAC04\uB2E4. \uC774\uD6C4\uBD80\uD130\uB294 \uAC19\uC740 \uC77C\uC744 \`bstage deploy\`\uAC00 \uD55C\uB2E4.
96
+
97
+ ### 2b. \uBC30\uCE58\uAC00 \uC788\uC744 \uB54C
98
+
99
+ \`\`\`bash
100
+ bstage deploy
101
+ \`\`\`
102
+
103
+ \uC21C\uC11C\uB294 \uC774\uB807\uAC8C \uD750\uB978\uB2E4: git \uC0AC\uC804\uC810\uAC80 \u2192 \uD3EC\uD138 \uBE4C\uB4DC \uD2B8\uB9AC\uAC70 \u2192 \uBE4C\uB4DC \uC644\uB8CC \uB300\uAE30(\uB85C\uADF8\uB97C \uB530\uB77C \uCD9C\uB825) \u2192 \uBC30\uCE58\uC5D0 \uC801\uC6A9.
104
+
105
+ - \uD2B9\uC815 \uBC30\uCE58\uB9CC \uB300\uC0C1\uC73C\uB85C \uD558\uAC70\uB098, \uBE4C\uB4DC\uB9CC \uAC78\uACE0 \uB05D\uB0B4\uAC70\uB098(\uB300\uAE30 \uC0DD\uB7B5), \uAD6C\uC870\uD654 \uCD9C\uB825\uC744 \uC4F0\uB824\uBA74 \`bstage deploy --help\`\uC5D0\uC11C \uD574\uB2F9 \uC635\uC158\uC744 \uD655\uC778\uD55C\uB2E4.
106
+
107
+ ## 3. \uC2E4\uD589 \uADDC\uCE59 (\uD655\uC778 \uC5C6\uC774 \uC801\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4)
108
+
109
+ \`bstage deploy\`\uB294 \uAE30\uBCF8\uC801\uC73C\uB85C **\uBB34\uC5C7\uC774 \uC5B4\uB514\uB85C \uAC00\uB294\uC9C0 \uD45C\uB85C \uBCF4\uC5EC\uC8FC\uACE0 \uD655\uC778\uC744 \uBB3B\uB294\uB2E4.** \uC774 \uD655\uC778 \uD654\uBA74\uC744 \uC5C6\uC560\uC9C0 \uC54A\uB294 \uAC83\uC774 \uAE30\uBCF8\uAC12\uC774\uB2E4.
110
+
111
+ - \uAE30\uBCF8: \uBC30\uD3EC \uC804\uC5D0 \uB124\uAC00 \uD55C \uC904\uB85C \uC694\uC57D\uD558\uACE0(\uC5B4\uB290 \uB808\uD3EC\uC758 \uC5B4\uB290 \uCEE4\uBC0B\uC774 \uC5B4\uB290 \uC2A4\uD14C\uC774\uC9C0\uC758 \uBA87 \uAC1C \uBC30\uCE58\uB85C \uAC00\uB294\uC9C0), \`--yes\` **\uC5C6\uC774** \uC2E4\uD589\uD574 **CLI\uC758 \uD655\uC778\uCC3D\uC744 \uC0AC\uC6A9\uC790\uAC00 \uC9C1\uC811 \uBCF4\uACE0 \uB2F5\uD558\uAC8C** \uD55C\uB2E4.
112
+ - \uC0AC\uC6A9\uC790\uAC00 \uC774\uBBF8 \uBA85\uC2DC\uC801\uC73C\uB85C \uD655\uC778\uD588\uAC70\uB098 \uBE44\uB300\uD654\uD615 \uD658\uACBD(CI)\uC774\uBA74 \`--yes\`\uB97C \uC4F4\uB2E4. \uAD6C\uC870\uD654 \uCD9C\uB825(\`--json\`)\uC740 \uD655\uC778 \uD504\uB86C\uD504\uD2B8\uC640 \uD568\uAED8 \uC4F8 \uC218 \uC5C6\uC73C\uBBC0\uB85C \`--yes\`\uC640 \uD568\uAED8 \uC4F4\uB2E4.
113
+ - \uC0AC\uC804\uC810\uAC80\uC5D0 \uAC78\uB9AC\uBA74(\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD \xB7 \uAE30\uBCF8 \uBE0C\uB79C\uCE58\uAC00 \uC544\uB2D8 \xB7 push\uB418\uC9C0 \uC54A\uC740 \uCEE4\uBC0B) **\uADF8 \uC0AC\uC2E4\uC744 \uACE0\uCE5C\uB2E4.** \`--skip-git-check\`\uB85C \uB36E\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uADF8 \uC635\uC158\uC740 "\uB85C\uCEEC\uACFC \uC6D0\uACA9\uC774 \uB2E4\uB974\uB2E4\uB294 \uAC78 \uC54C\uACE0\uB3C4 \uC6D0\uACA9 \uAE30\uC900\uC73C\uB85C \uBE4C\uB4DC\uD558\uACA0\uB2E4"\uB294 \uC120\uC5B8\uC774\uB77C, \uC0AC\uC6A9\uC790\uAC00 \uBC29\uAE08 \uACE0\uCE5C \uB0B4\uC6A9\uC774 \uBE60\uC9C4 \uCC44 \uBC30\uD3EC\uB418\uB294 \uB300\uD45C\uC801 \uC6D0\uC778\uC774\uB2E4.
114
+
115
+ ## 4. \uC2E4\uD328\uD588\uC744 \uB54C \u2014 \uC885\uB8CC \uCF54\uB4DC\uB85C \uAC08\uB798\uB97C \uC7A1\uB294\uB2E4
116
+
117
+ | \uCF54\uB4DC | \uB73B | \uB300\uC751 |
118
+ | --- | --- | --- |
119
+ | 0 | \uC131\uACF5 | - |
120
+ | 1 | \uC2E4\uD328(\uBE4C\uB4DC \uC2E4\uD328 \uD3EC\uD568) | \`bstage logs <\uBE4C\uB4DC id>\` \uB610\uB294 \`bstage logs -f\`\uB85C \uC6D0\uC778 \uD655\uC778 \uD6C4 \uCF54\uB4DC \uC218\uC815 \u2192 \uCEE4\uBC0B\xB7push \u2192 \uC7AC\uBC30\uD3EC |
121
+ | 2 | \uC0AC\uC804\uC870\uAC74 \uBBF8\uCDA9\uC871 | \uBA54\uC2DC\uC9C0\uAC00 \uBB34\uC5C7\uC774 \uBE60\uC84C\uB294\uC9C0 \uB9D0\uD55C\uB2E4(\uCEE4\uBC0B\xB7push\xB7\uBE0C\uB79C\uCE58\xB7\uBC30\uCE58 0\uAC74\xB7\uD655\uC778 \uBD88\uAC00 \uD658\uACBD). \uADF8 \uC870\uAC74\uC744 \uCC44\uC6B4\uB2E4 |
122
+ | 3 | \uC778\uC99D | \`bstage login\` \uB2E4\uC2DC. CI\uBA74 \uD1A0\uD070 \uD658\uACBD\uBCC0\uC218 \uC124\uC815 \uD655\uC778 |
123
+ | 4 | \uCDA9\uB3CC | \uB300\uAE30\uD558\uB294 \uB3D9\uC548 \uB2E4\uB978 \uC0AC\uB78C\uC774 \uBA3C\uC800 \uC801\uC6A9\uD588\uB2E4. **\uC7AC\uC2DC\uB3C4\uBD80\uD130 \uD558\uC9C0 \uB9D0\uACE0** \`bstage list\`\uB85C \uD604\uC7AC \uB77C\uC774\uBE0C\uB97C \uD655\uC778\uD558\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uACE0\uD55C\uB2E4 |
124
+ | 5 | \uC694\uCCAD \uC81C\uD55C | \uC7A0\uC2DC \uAE30\uB2E4\uB838\uB2E4 \uC7AC\uC2DC\uB3C4 |
125
+
126
+ \uBE4C\uB4DC \uB85C\uADF8\uB294 \`bstage logs\`\uB85C \uBCF8\uB2E4(\uBE4C\uB4DC id \uC0DD\uB7B5 \uC2DC \uCD5C\uADFC \uBE4C\uB4DC, \`-f\`\uB85C \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uB530\uB77C\uAC10).
127
+
128
+ ## 5. \uB418\uB3CC\uB9AC\uAE30 \xB7 \uAC8C\uC2DC \uB044\uAE30
129
+
130
+ - \`bstage rollback\` \u2014 \uC9C1\uC804 \uC131\uACF5 \uBE4C\uB4DC\uB97C \uB2E4\uC2DC \uB77C\uC774\uBE0C\uB85C \uC801\uC6A9\uD55C\uB2E4. \uD2B9\uC815 \uBE4C\uB4DC\uB85C \uB418\uB3CC\uB9AC\uB824\uBA74 \uBE4C\uB4DC id\uB97C \uC778\uC790\uB85C \uC900\uB2E4(\`bstage list\`\uC5D0\uC11C \uD655\uC778).
131
+ - \`bstage publish off\` \u2014 \uAC8C\uC2DC\uB9CC \uB048\uB2E4. \uB77C\uC774\uBE0C \uBC84\uC804\uC740 \uADF8\uB300\uB85C \uC720\uC9C0\uB418\uBBC0\uB85C, \uD654\uBA74\uC744 \uAE09\uD788 \uB0B4\uB824\uC57C \uD560 \uB54C \uBA3C\uC800 \uC4F8 \uCE74\uB4DC\uB2E4. \uB418\uB3CC\uB9AC\uB824\uBA74 \`bstage publish on\`.
132
+ - \uB458 \uB2E4 \uAE30\uBCF8\uC73C\uB85C \uD655\uC778\uC744 \uBB3B\uB294\uB2E4. \uC7A5\uC560 \uC0C1\uD669\uC774\uB77C \uC0AC\uC6A9\uC790\uAC00 \uC774\uBBF8 \uACB0\uC815\uD588\uB2E4\uBA74 \`--yes\`\uB97C \uC4F0\uB418, **\uBB34\uC5C7\uC774 \uC5B4\uB5BB\uAC8C \uBC14\uB00C\uB294\uC9C0 \uBA3C\uC800 \uD55C \uC904\uB85C \uC54C\uB9B0\uB2E4.**
133
+ - \uC5B4\uB290 \uCABD\uC744 \uC4F8\uC9C0 \uD5F7\uAC08\uB9AC\uBA74: \uC798\uBABB\uB41C \uB0B4\uC6A9\uC774 \uB5A0 \uC788\uC73C\uBA74 \`publish off\`(\uC989\uC2DC \uB0B4\uB9BC) \u2192 \uC6D0\uC778 \uD30C\uC545 \u2192 \`rollback\`(\uC9C1\uC804 \uC815\uC0C1\uC73C\uB85C \uBCF5\uAD6C).
134
+
135
+ ## 6. CI\uC5D0\uC11C \uC4F8 \uB54C
136
+
137
+ - \uB85C\uADF8\uC778\uC740 \uB300\uD654\uD615 \uB300\uC2E0 \uD1A0\uD070 \uBD99\uC5EC\uB123\uAE30 \uACBD\uB85C\uB97C \uC4F4\uB2E4. \uC5F0\uACB0 \uC815\uBCF4(\uC870\uC9C1\xB7\uC2A4\uD14C\uC774\uC9C0\xB7\uB808\uD3EC \uB4F1)\uB294 \`.bstage/project.json\` \uB300\uC2E0 \uD658\uACBD\uBCC0\uC218\uB85C \uC900\uB2E4. **\uBCC0\uC218 \uC774\uB984\uC740 \`bstage login --help\`\xB7\`bstage link --help\`\uC5D0 \uC788\uB294 \uAC83\uC744 \uADF8\uB300\uB85C \uC4F4\uB2E4** \u2014 \uC5EC\uAE30 \uC62E\uACA8 \uC801\uC9C0 \uC54A\uB294\uB2E4(\uB4DC\uB9AC\uD504\uD2B8 \uBC29\uC9C0).
138
+ - \uBE44\uB300\uD654\uD615\uC774\uBBC0\uB85C \`--yes\`\uAC00 \uD544\uC694\uD558\uACE0, \uACB0\uACFC\uB97C \uD30C\uC2F1\uD560 \uAC70\uB77C\uBA74 \`--json\`\uACFC \uD568\uAED8 \uC4F4\uB2E4.
139
+ - \uD1A0\uD070\uC740 CI \uC2DC\uD06C\uB9BF\uC73C\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. \uB85C\uADF8\uC5D0 \uCC0D\uAC70\uB098 \uC800\uC7A5\uC18C\uC5D0 \uCEE4\uBC0B\uD558\uC9C0 \uC54A\uB294\uB2E4.
140
+
141
+ # \uD558\uC9C0 \uB9D0 \uAC83
142
+
143
+ - \uD1A0\uD070\uC744 \uCD9C\uB825\xB7\uB85C\uADF8\xB7\uCEE4\uBC0B\uC5D0 \uB0A8\uAE30\uAE30 (\`whoami\`\uB85C \uB85C\uADF8\uC778 \uC5EC\uBD80\uB9CC \uD655\uC778\uD55C\uB2E4)
144
+ - \`--skip-git-check\`\uB97C \uC2B5\uAD00\uC801\uC73C\uB85C \uC4F0\uAE30 \u2014 \uC0AC\uC804\uC810\uAC80\uC774 \uC7A1\uB294 \uAC74 "\uC9C0\uAE08 \uACE0\uCE5C \uAC8C \uC548 \uC62C\uB77C\uAC04\uB2E4"\uB294 \uC0AC\uC2E4\uC774\uB2E4
145
+ - \uD655\uC778 \uD504\uB86C\uD504\uD2B8\uB97C \uAE30\uBCF8\uC73C\uB85C \`--yes\`\uB85C \uAC74\uB108\uB6F0\uAE30
146
+ - \uC885\uB8CC \uCF54\uB4DC 4(\uCDA9\uB3CC)\uB97C \uADF8\uB300\uB85C \uC7AC\uC2DC\uB3C4\uD558\uAE30 \u2014 \uB0A8\uC758 \uBC30\uD3EC\uB97C \uB36E\uC5B4\uC4F8 \uC218 \uC788\uB2E4
147
+ - \uB0B4\uAC00 \uB9E1\uC740 \uBC30\uCE58 \uBC16\uC758 \uBC30\uCE58\uB97C \uD568\uAED8 \uC801\uC6A9\xB7\uAC8C\uC2DC \uC804\uD658\uD558\uAE30 (\uBC94\uC704\uB97C \uC881\uD788\uB294 \uC635\uC158\uC740 \`--help\` \uCC38\uC870)
148
+ - \uB85C\uCEEC \`dist/\`\uB97C \uC5B4\uB518\uAC00\uC5D0 \uC5C5\uB85C\uB4DC\uD574 \uBC30\uD3EC\uD558\uB824 \uC2DC\uB3C4\uD558\uAE30 \u2014 \uBC30\uD3EC \uACBD\uB85C\uAC00 \uC544\uB2C8\uB2E4
149
+ - \uBC30\uCE58\uAC00 0\uAC74\uC778\uB370 \uC6D0\uC778\uC744 \uCC3E\uC9C0 \uC54A\uACE0 \`deploy\`\uB97C \uBC18\uBCF5\uD558\uAE30
150
+ `;
151
+ }
152
+
153
+ // src/skills/liquid.ts
154
+ function liquidSkillMd() {
155
+ return `---
156
+ name: bstage-liquid
157
+ description: b.stage liquid \uD15C\uD50C\uB9BF\uC744 \uC791\uC131\xB7\uC218\uC815\uD55C\uB2E4. liquid \uB808\uD3EC\uC5D0\uC11C "liquid \uD15C\uD50C\uB9BF", "template.liquid", "data.json", "\uD398\uC774\uC9C0 \uD558\uB098 \uB354" \uAC19\uC740 \uC694\uCCAD\uC744 \uBC1B\uC744 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.
158
+ ---
159
+
160
+ # \uC5ED\uD560
161
+
162
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \`.liquid\` \uD15C\uD50C\uB9BF\uC744 \uC791\uC131\uD55C\uB2E4. \uC791\uC131\uD55C \uD15C\uD50C\uB9BF\uC740 \uD3EC\uD138\uC774 \uADF8\uB300\uB85C \uD328\uD0A4\uC9D5\uD558\uACE0, \uD50C\uB7AB\uD3FC\uC774 **\uC11C\uBC84\uC5D0\uC11C \uB370\uC774\uD130\uB97C \uB123\uC5B4** \uB80C\uB354\uD55C\uB2E4. \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB3C4\uB294 \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 \uC544\uB2C8\uB2E4.
163
+
164
+ \uC774 \uC2A4\uD0AC\uC740 \uAD6C\uC870 \uADDC\uC57D\xB7\uC808\uCC28\xB7\uD568\uC815\uB9CC \uB2F4\uB294\uB2E4. \uBB38\uBC95 \uC0C1\uC138\uB294 liquidjs \uBB38\uC11C\uB97C, \uBA85\uB839 \uC635\uC158\uC740 \`bstage <\uBA85\uB839> --help\`\uB97C \uBCF8\uB2E4.
165
+
166
+ # \uAD8C\uC704 \uC788\uB294 \uCD9C\uCC98
167
+
168
+ - \`bstage --help\`, \`bstage <\uBA85\uB839> --help\` \u2014 \uBA85\uB839\xB7\uC635\uC158
169
+ - \uD504\uB85C\uC81D\uD2B8 \uADDC\uCE59: \uB808\uD3EC \uB8E8\uD2B8\uC758 \`AGENTS.md\`
170
+ - \uBB38\uBC95: liquidjs \uACF5\uC2DD \uBB38\uC11C(\uD0DC\uADF8\xB7\uD544\uD130 \uBAA9\uB85D). \uC5EC\uAE30 \uC62E\uACA8 \uC801\uC9C0 \uC54A\uB294\uB2E4
171
+ - \uBC30\uD3EC: \`bstage-deploy\` \uC2A4\uD0AC
172
+
173
+ # \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
174
+
175
+ \uC720\uC800 \uD654\uBA74 \uD15C\uD50C\uB9BF\uC774 \uBC1B\uB294 \uCD5C\uC0C1\uC704 \uAC12\uC740 **\uB2E4\uC12F \uAC1C\uBFD0**\uC774\uB2E4. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4.
176
+
177
+ | \uC774\uB984 | \uB0B4\uC6A9 |
178
+ | --- | --- |
179
+ | \`lounges\` | \uB77C\uC6B4\uC9C0 \uBAA9\uB85D |
180
+ | \`stories\` | \uB77C\uC6B4\uC9C0\uBCC4 \uC2A4\uD0C0 \uD648 \uD53C\uB4DC\uB97C \uBAA8\uC740 \uBAA9\uB85D |
181
+ | \`contentSections\` | \uCF58\uD150\uCE20 \uD648 \uC139\uC158 \uBAA9\uB85D |
182
+ | \`latestContents\` | \uAC01 \uC139\uC158\uC758 \uCF58\uD150\uCE20\uB97C \uBC1C\uD589\uC77C \uB0B4\uB9BC\uCC28\uC21C\uC73C\uB85C \uBAA8\uC740 \uBAA9\uB85D |
183
+ | \`shopCategories\` | \uC0F5 \uCE74\uD14C\uACE0\uB9AC \uBAA9\uB85D(\uB300\uD45C \uCEEC\uB809\uC158 \uC0C1\uD488 \uD3EC\uD568) |
184
+
185
+ \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uD50C\uB7AB\uD3FC \uC751\uB2F5\uC744 \uADF8\uB300\uB85C \uB530\uB974\uBBC0\uB85C **\uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4.** \uD544\uB4DC \uC774\uB984\uC744 \uAE30\uC5B5\uC73C\uB85C \uC9C0\uC5B4\uB0B4\uC9C0 \uC54A\uB294\uB2E4.
186
+
187
+ \`data.json\`\uC5D0\uB294 \uC774 \uB2E4\uC12F \uAC1C\uC640 **\uAC19\uC740 \uC774\uB984**\uC73C\uB85C \uC0D8\uD50C\uC744 \uB123\uC5B4\uC57C \uB85C\uCEEC \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uB2E4\uB978 \uC774\uB984\uC744 \uC4F0\uBA74 \uB85C\uCEEC\uC5D0\uC11C\uB9CC \uBCF4\uC774\uACE0 \uBC30\uD3EC\uD558\uBA74 \uBE44\uB294\uB370, \uADF8 \uCC28\uC774\uAC00 \uD654\uBA74\uC5D0 \uB4DC\uB7EC\uB098\uC9C0 \uC54A\uC544 \uCC3E\uAE30 \uC5B4\uB835\uB2E4.
188
+
189
+ \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBB34\uC5C7\uC744 \uBC1B\uB294\uC9C0\uB294 **\uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.** \uC5B4\uB4DC\uBBFC \uD15C\uD50C\uB9BF\uC5D0\uC11C\uB294 \uAC12\uC774 \uC628\uB2E4\uACE0 \uAC00\uC815\uD558\uC9C0 \uB9D0\uACE0 \uCCAB \uBC30\uD3EC\uC5D0\uC11C \uC2E4\uC81C \uB80C\uB354\uB97C \uBCF4\uACE0 \uD310\uB2E8\uD55C\uB2E4.
190
+
191
+ # \uAD6C\uC870 \uADDC\uC57D (\uD3EC\uD138 \uBE4C\uB354\uAC00 \uAC15\uC81C\uD55C\uB2E4)
192
+
193
+ \`\`\`
194
+ public/
195
+ user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9
196
+ {name}/
197
+ template.liquid \u2014 \uC2E4\uC81C \uD15C\uD50C\uB9BF (\uD544\uC218)
198
+ data.json \u2014 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C \uB370\uC774\uD130 (\uC120\uD0DD)
199
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 (\uAC19\uC740 \uADDC\uCE59)
200
+ \`\`\`
201
+
202
+ - **\uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4.** \`public/{user|admin}/{name}/template.liquid\` \uC815\uD655\uD788 \uC774 \uC790\uB9AC\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uD55C \uB2E8\uACC4 \uB354 \uB4E4\uC5B4\uAC00\uAC70\uB098 \uB35C \uB4E4\uC5B4\uAC00\uBA74 **\uD3EC\uD138\uC774 \uC870\uC6A9\uD788 \uBB34\uC2DC\uD55C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uC544\uBB34\uAC83\uB3C4 \uC548 \uB098\uC628\uB2E4).
203
+ - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC. \uB300\uBB38\uC790\xB7\uBC11\uC904\xB7\uACF5\uBC31\uC740 \uC4F0\uC9C0 \uC54A\uB294\uB2E4.
204
+ - \uD30C\uC77C \uC774\uB984\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
205
+ - \uD55C \uD3F4\uB354\uAC00 \uD55C \uD398\uC774\uC9C0\uB2E4. \uD398\uC774\uC9C0\uB97C \uB354 \uB9CC\uB4E4\uB824\uBA74 \uD3F4\uB354\uB97C \uB354 \uB9CC\uB4E0\uB2E4.
206
+
207
+ # \uC808\uCC28
208
+
209
+ ## 1. \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
210
+
211
+ 1. \`public/user/{name}/\` \uD3F4\uB354\uB97C \uB9CC\uB4E0\uB2E4(\uC5B4\uB4DC\uBBFC\uC774\uBA74 \`public/admin/{name}/\`). \uC774\uB984\uC740 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778\uD55C\uB2E4 \u2014 \uC774 \uC774\uB984\uC774 \uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C \uACE0\uB974\uB294 \uC0B0\uCD9C\uBB3C \uC774\uB984\uC774 \uB41C\uB2E4.
212
+ 2. \`template.liquid\`\uB97C \uB9CC\uB4E0\uB2E4. \uD654\uBA74 \uC804\uCCB4\uB97C \uADF8\uB9AC\uB294 \uB9C8\uD06C\uC5C5\uC774\uB2E4.
213
+ 3. \uD544\uC694\uD558\uBA74 \`data.json\`\uC5D0 **\uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9** \uC0D8\uD50C \uB370\uC774\uD130\uB97C \uB123\uB294\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294\uB2E4 \u2014 \uC0D8\uD50C\uC740 \uBAA8\uC591\uC744 \uB9DE\uCD94\uAE30 \uC704\uD55C \uAC83\uC774\uC9C0 \uACC4\uC57D\uC774 \uC544\uB2C8\uB2E4.
214
+ 4. \uB85C\uCEEC\uC5D0\uC11C \uB208\uC73C\uB85C \uD655\uC778\uD55C\uB2E4 \u2014 \`bstage dev\`\uAC00 liquid \uBAA9\uB85D\xB7\uBBF8\uB9AC\uBCF4\uAE30\uB97C \uB744\uC6B4\uB2E4.
215
+ 5. \uAC80\uC99D\uD55C\uB2E4 \u2014 liquid \uB808\uD3EC\uC5D0\uC11C \`bstage build\`\uAC00 \uBC88\uB4E4\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uACE0 **\uAD6C\uC870\xB7\uBB38\uBC95\uC744 \uAC80\uC0AC**\uD55C\uB2E4.
216
+ 6. \uBC30\uD3EC\uB294 \`bstage-deploy\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4(push\uB41C \uCEE4\uBC0B\uC744 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD55C\uB2E4).
217
+
218
+ > **\uC124\uCE58\uB41C cli\uAC00 liquid\uB97C \uBAA8\uB974\uB294 \uC61B \uBC84\uC804\uC774\uBA74 4\xB75\uAC00 \uC774 \uB808\uD3EC\uB97C \uC54C\uC544\uBCF4\uC9C0 \uBABB\uD55C\uB2E4.** \uC99D\uC0C1\uC774 \uBD84\uBA85\uD558\uB2E4 \u2014 \`bstage build\`\uAC00 liquid \uAC80\uC99D \uB300\uC2E0 \`src/\` \uC544\uB798\uC5D0\uC11C \uC5C6\uB294 \uC18C\uC2A4 \uD30C\uC77C\uC744 \uCC3E\uB294\uB2E4\uACE0 \uB05D\uB09C\uB2E4. \uADF8\uB54C\uB294 cli\uB97C \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB77C\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC54C\uB9B0\uB2E4. \uC62C\uB9B4 \uC218 \uC5C6\uC73C\uBA74 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uB294 **\uC774 \uB808\uD3EC\uAC00 \uC790\uCCB4\uB85C \uAC00\uC9C4 \uC218\uB2E8**\uC744 \uC4F0\uACE0, \uAD6C\uC870\xB7\uBB38\uBC95\uC740 \uB9AC\uBDF0\uB85C \uD655\uC778\uD55C \uB4A4 \uC2E4\uC81C \uB80C\uB354\uB294 \uCCAB \uBC30\uD3EC\uC5D0\uC11C \uBCF8\uB2E4.
219
+
220
+ ## 2. \uAE30\uC874 \uD15C\uD50C\uB9BF \uC218\uC815
221
+
222
+ - \uACE0\uCE58\uAE30 \uC804\uC5D0 **\uC2E4\uC81C \uD30C\uC77C\uC744 \uC77D\uB294\uB2E4.** \uBCC0\uC218 \uC774\uB984\uACFC \uB370\uC774\uD130 \uBAA8\uC591\uC740 \uAE30\uC5B5\uC774 \uC544\uB2C8\uB77C \uADF8 \uD15C\uD50C\uB9BF\uACFC \`data.json\`\uC5D0\uC11C \uD655\uC778\uD55C\uB2E4.
223
+ - \uAC12\uC774 \uC5C6\uC744 \uB54C \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uB294\uC9C0 \uD568\uAED8 \uBCF8\uB2E4(\uC544\uB798 \`default\` \uCC38\uACE0). \uC2E4\uC81C \uB370\uC774\uD130\uC5D0\uB294 \uC0D8\uD50C\uC5D0 \uC5C6\uB358 \uBE48 \uAC12\uC774 \uC628\uB2E4.
224
+
225
+ # liquid \uBB38\uBC95 \uC694\uC810
226
+
227
+ \uC815\uD655\uD55C \uD0DC\uADF8\xB7\uD544\uD130 \uBAA9\uB85D\uC740 liquidjs \uBB38\uC11C\uAC00 SSOT\uB2E4. \uC790\uC8FC \uC4F0\uB294 \uAC83\uB9CC \uC9DA\uB294\uB2E4.
228
+
229
+ **\uBCC0\uC218 \uCD9C\uB825**
230
+
231
+ \`\`\`liquid
232
+ {{ lounges.first.name }}
233
+ \`\`\`
234
+
235
+ \uC774\uC911 \uC911\uAD04\uD638 \uC548\uC758 \uAC12\uC774 \uADF8 \uC790\uB9AC\uC5D0 \uBB38\uC790\uC5F4\uB85C \uB4E4\uC5B4\uAC04\uB2E4. \uC5C6\uB294 \uD0A4\uB294 \uC624\uB958\uAC00 \uC544\uB2C8\uB77C **\uBE48 \uBB38\uC790\uC5F4**\uC774 \uB418\uBBC0\uB85C, \uC624\uD0C0\uB294 \uD654\uBA74\uC774 \uBE44\uB294 \uAC83\uC73C\uB85C \uB098\uD0C0\uB09C\uB2E4.
236
+
237
+ **\uAE30\uBCF8\uAC12**
238
+
239
+ \`\`\`liquid
240
+ {{ lounges.first.name | default: '\uB77C\uC6B4\uC9C0' }}
241
+ \`\`\`
242
+
243
+ \uAC12\uC774 \uC5C6\uAC70\uB098 \uBE44\uC5B4 \uC788\uC744 \uB54C \uB300\uC2E0 \uC4F8 \uAC12. \uC2E4\uC81C \uB370\uC774\uD130\uC5D0\uB294 \uBE48 \uAC12\uC774 \uC790\uC8FC \uC624\uBBC0\uB85C \uB208\uC5D0 \uBCF4\uC774\uB294 \uBB38\uAD6C\uC5D0\uB294 \uAE30\uBCF8\uAC12\uC744 \uB450\uB294 \uD3B8\uC774 \uC548\uC804\uD558\uB2E4.
244
+
245
+ **\uC870\uAC74**
246
+
247
+ \`\`\`liquid
248
+ {% if contentSections.size > 0 %}...{% else %}\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4{% endif %}
249
+ \`\`\`
250
+
251
+ \`{% %}\`\uB294 \uCD9C\uB825\uD558\uC9C0 \uC54A\uACE0 \uD750\uB984\uB9CC \uC81C\uC5B4\uD55C\uB2E4. \uBE48 \uBAA9\uB85D \uBD84\uAE30\uB294 \uAC70\uC758 \uD56D\uC0C1 \uD544\uC694\uD558\uB2E4.
252
+
253
+ **\uBC18\uBCF5**
254
+
255
+ \`\`\`liquid
256
+ {% for section in contentSections %}{{ section.title }}{% endfor %}
257
+ \`\`\`
258
+
259
+ \uBAA9\uB85D\uC744 \uC21C\uD68C\uD55C\uB2E4. \uC548\uC5D0\uC11C \`forloop.index\` \uAC19\uC740 \uBCF4\uC870 \uAC12\uC744 \uC4F8 \uC218 \uC788\uB2E4(\uC0C1\uC138\uB294 liquidjs \uBB38\uC11C).
260
+
261
+ **\uD544\uD130**
262
+
263
+ \`\`\`liquid
264
+ {{ latestContents | size }} / {{ section.title | escape }} / {{ forloop.index | plus: 1 }}
265
+ \`\`\`
266
+
267
+ \`|\`\uB85C \uAC12\uC744 \uBCC0\uD658\uD55C\uB2E4. \uC0AC\uC6A9\uC790 \uC785\uB825\uC774 \uC11E\uC778 \uAC12\uC744 HTML\uB85C \uB123\uC744 \uB54C\uB294 \uC774\uC2A4\uCF00\uC774\uD504 \uC5EC\uBD80\uB97C \uD655\uC778\uD55C\uB2E4 \u2014 \uC6D0\uC2DC HTML\uC744 \uADF8\uB300\uB85C \uCD9C\uB825\uD558\uB294 \uD544\uD130\uB294 \uC2E0\uB8B0\uD560 \uC218 \uC788\uB294 \uAC12\uC5D0\uB9CC \uC4F4\uB2E4.
268
+
269
+ # \uD568\uC815
270
+
271
+ - **sdk\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC9C0 \uC54A\uB294\uB2E4.** \`template.tsx\`(React)\uC640 \`.liquid\`\uAC00 \uD55C \uB808\uD3EC\uC5D0 \uAC19\uC774 \uC788\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4. \uD55C \uB808\uD3EC\uB294 \uD55C \uBC29\uC2DD\uB9CC.
272
+ - **liquid\uB294 PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5\uD558\uB2E4.** \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0\uB294 \uB123\uC744 \uC218 \uC5C6\uB2E4. \uD3EC\uD138\uC5D0\uC11C \uD398\uC774\uC9C0\uB97C \uB9CC\uB4E4 \uB54C \uCEE4\uC2A4\uD140 \uBC29\uC2DD\uC73C\uB85C \`liquid\`\uB97C \uACE0\uB978\uB2E4.
273
+ - **\`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
+ - **\`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.
275
+ - **\uACBD\uB85C \uAE4A\uC774\uB97C \uC9C0\uD0A8\uB2E4.** \uADDC\uC57D \uBC16 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 \uBB34\uC2DC\uB41C\uB2E4. "\uBD84\uBA85 \uB9CC\uB4E4\uC5C8\uB294\uB370 \uBAA9\uB85D\uC5D0 \uC5C6\uB2E4"\uC758 \uB300\uBD80\uBD84\uC774 \uC774 \uACBD\uC6B0\uB2E4.
276
+ - **\uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC740 \uD3EC\uD138 \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB9AC\uACE0 \uADF8 URL\uC744 \uC4F4\uB2E4.** \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uD30C\uC77C\uC744 \uC62C\uB9AC\uBA74 URL\uC744 \uBC1B\uB294\uB2E4. \uADF8 URL\uC744 \uD15C\uD50C\uB9BF\uC5D0 **\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.
277
+ - **\uB808\uD3EC\uC5D0 \uB123\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uBA74 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4.** \uB80C\uB354\uB41C HTML\uC774 \uC2A4\uD398\uC774\uC2A4 \uB3C4\uBA54\uC778 \uD398\uC774\uC9C0 \uC548\uC73C\uB85C \uB4E4\uC5B4\uAC00\uBBC0\uB85C \uC0C1\uB300 \uACBD\uB85C\uB294 \uADF8 \uB3C4\uBA54\uC778 \uAE30\uC900\uC73C\uB85C \uD480\uB9AC\uACE0, \uC0B0\uCD9C\uBB3C\uC774 \uB193\uC778 \uC8FC\uC18C\uB97C \uAC00\uB9AC\uD0A4\uC9C0 \uC54A\uB294\uB2E4. \uC61B \uAC00\uC774\uB4DC\uC5D0 \`public\`\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uB77C\uACE0 \uC801\uD78C \uAC83\uC774 \uC788\uB294\uB370 \uC2E0\uADDC \uD3EC\uD138\uC5D0\uC11C\uB294 \uB9DE\uC9C0 \uC54A\uB294\uB2E4.
278
+ - **\uB85C\uCEEC \uD504\uB9AC\uBDF0\uB294 \uC774 \uC810\uC5D0\uC11C \uBC30\uD3EC\uC640 \uBC18\uB300\uB85C \uB3D9\uC791\uD55C\uB2E4.** \uD504\uB9AC\uBDF0\uB294 \uD15C\uD50C\uB9BF \uD3F4\uB354\uC758 \uD30C\uC77C\uC744 \uD568\uAED8 \uC11C\uBE59\uD558\uBBC0\uB85C \uC0C1\uB300 \uACBD\uB85C \uC774\uBBF8\uC9C0\uAC00 \uC798 \uBCF4\uC778\uB2E4. **\uD504\uB9AC\uBDF0\uC5D0\uC11C \uBCF4\uC600\uB2E4\uB294 \uAC83\uC744 \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4.**
279
+ - **\uB370\uC774\uD130 \uBAA8\uC591\uC744 \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4.** \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 \uD45C\uAC00 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4.
280
+ - **\uD30C\uC15C(\`{% render %}\`\xB7\`{% include %}\`)\uC740 \uBC30\uD3EC\uC5D0\uC11C \uB3D9\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4.** \uBC30\uD3EC \uBDF0\uC5B4\uC758 \uC5D4\uC9C4\uC740 \uB808\uD3EC\uC758 \uD30C\uC77C\uC744 \uCC3E\uC9C0 \uBABB\uD574 \uADF8 \uC790\uB9AC\uB97C \uBE48 \uBB38\uC790\uC5F4\uB85C \uB80C\uB354\uD55C\uB2E4. \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791\uD558\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uAC00 \uADFC\uAC70\uAC00 \uB418\uC9C0 \uC54A\uB294\uB2E4. \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4(\`bstage build\`\uAC00 \uD30C\uC15C \uD0DC\uADF8\uB97C \uACBD\uACE0\uB85C \uC9DA\uB294\uB2E4).
281
+
282
+ # \uD558\uC9C0 \uB9D0 \uAC83
283
+
284
+ - \`public/{user|admin}/{name}/\` \uBC16\uC5D0 \uD15C\uD50C\uB9BF \uD30C\uC77C \uB450\uAE30
285
+ - \`template.liquid\` \uC678\uC758 \uD30C\uC77C\uBA85 \uC4F0\uAE30
286
+ - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uAE30 (\uD328\uD0A4\uC9D5 \uB54C \uC0AC\uB77C\uC9C4\uB2E4)
287
+ - \uAC19\uC740 \uB808\uD3EC\uC5D0 React \uD15C\uD50C\uB9BF \uCD94\uAC00\uD558\uAE30
288
+ - \`{% render %}\`\xB7\`{% include %}\`\uB85C \uD15C\uD50C\uB9BF \uCABC\uAC1C\uAE30 (\uBC30\uD3EC\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4)
289
+ - \uBB38\uBC95\xB7\uD544\uD130\uB97C \uAE30\uC5B5\uC73C\uB85C \uC9C0\uC5B4\uB0B4\uAE30 \u2014 liquidjs \uBB38\uC11C\uC5D0\uC11C \uD655\uC778\uD55C\uB2E4
290
+ - \uAC12\uC774 \uD56D\uC0C1 \uC788\uB2E4\uACE0 \uAC00\uC815\uD558\uAE30 \u2014 \uBE48 \uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4
291
+ `;
292
+ }
293
+
294
+ // src/skills/migrate.ts
295
+ function migrateSkillMd() {
296
+ return `---
297
+ name: bstage-migrate
298
+ description: bstage SDK \uBC84\uC804 \uB9C8\uC774\uADF8\uB808\uC774\uC158\uC744 \uC218\uD589\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB418\uC5B4 \uC624\uB798\uB41C \uD504\uB85C\uC81D\uD2B8\uB97C \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uAC70\uB098, "bstage \uC5C5\uB370\uC774\uD2B8", "SDK \uB9C8\uC774\uADF8\uB808\uC774\uC158", "\uCD5C\uC2E0 SDK\uB85C \uC62C\uB824\uC918" \uAC19\uC740 \uC694\uCCAD\uC744 \uBC1B\uC744 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.
299
+ ---
300
+
301
+ # \uC5ED\uD560
302
+
303
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 bstage SDK\uB97C \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158\uD55C\uB2E4. \uAC10\uC9C0\uB294 \`bstage doctor\`(\uACB0\uC815\uB860)\uAC00, \uBCC0\uD658 \uC808\uCC28\uB294 SDK\uAC00 \uB3D9\uBD09\uD55C \`MIGRATION.md\`\uAC00 \uC815\uC758\uD55C\uB2E4. \uB108\uB294 \uC774 \uB458\uC744 \uC77D\uACE0 **\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0** \uC801\uC6A9\uD55C\uB2E4.
304
+
305
+ \uD575\uC2EC \uC6D0\uCE59:
306
+
307
+ 1. **\uCD94\uCE21 \uAE08\uC9C0 \u2014 \uD56D\uC0C1 \uC2E4\uC81C \uC18C\uC2A4\uB85C \uAC80\uC99D\uD55C\uB2E4.** \uBAA8\uB4E0 \uD310\uB2E8\uC740 \uAE30\uC5B5\xB7\uAC00\uC815\uC774 \uC544\uB2C8\uB77C **\uC9C1\uC811 \uC77D\uC5B4 \uD655\uC778\uD55C \uC0AC\uC2E4**\uC5D0 \uADFC\uAC70\uD574\uC57C \uD55C\uB2E4. \uBCC0\uACBD \uC804\uC5D0 (a) \uC124\uCE58\uB41C \uD328\uD0A4\uC9C0(\`node_modules/@bstage-sdk/*\`\uC758 \`MIGRATION.md\`\xB7\`dist/*.d.ts\` \uD0C0\uC785 \uC120\uC5B8)\uC640 (b) **\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC2E4\uC81C \uC18C\uC2A4 \uCF54\uB4DC**\uB97C \uC9C1\uC811 \uC77D\uC5B4 \uD655\uC778\uD55C\uB2E4. SDK API\xB7\uB3D9\uC791\uC744 \uAE30\uC5B5\uC73C\uB85C \uB2E8\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4.
308
+ 2. **\uC0AC\uC6A9\uC790\uAC00 \uC791\uC131/\uC218\uC815\uD55C \uCF54\uB4DC\uB97C \uD568\uBD80\uB85C \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uB294\uB2E4.** \uCD94\uAC00\uB294 \uC548\uC804\uD558\uAC8C, \uCDA9\uB3CC\xB7\uC7AC\uAD6C\uC131\uC740 \uD655\uC778\uD55C\uB2E4.
309
+
310
+ \uD655\uC778\uC774 \uC548 \uB418\uBA74 **\uCD94\uCE21\uD574\uC11C \uC801\uC6A9\uD558\uC9C0 \uB9D0\uACE0 \uBA48\uCD98\uB2E4.** \uB2E8, \uC0AC\uC6A9\uC790\uC5D0\uAC8C "\uCF54\uB4DC\uB97C \uD655\uC778\uD574 \uB2EC\uB77C"\uACE0 \uB5A0\uB118\uAE30\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC0AC\uC6A9\uC790\uB294 \uAC1C\uBC1C\uC790\uAC00 \uC544\uB2D0 \uC218 \uC788\uC5B4 \uC9C1\uC811 \uAC80\uC99D\uC774 \uC5B4\uB835\uB2E4. **\uAC80\uC99D\uC740 \uB108(\uC5D0\uC774\uC804\uD2B8)\uC758 \uCC45\uC784**\uC774\uB2E4(\uD30C\uC77C\xB7\uC124\uCE58\uB41C \uD328\uD0A4\uC9C0\uB97C \uC77D\uC5B4 \uC2A4\uC2A4\uB85C \uD655\uC778). \uC0AC\uC6A9\uC790\uC5D0\uAC90 \uCF54\uB4DC\uB85C \uD655\uC778 \uAC00\uB2A5\uD55C *\uC0AC\uC2E4*\uC774 \uC544\uB2C8\uB77C **\uC81C\uD488\xB7\uC120\uD638 *\uACB0\uC815*** \uB9CC, \uAD6C\uCCB4\uC801 \uC120\uD0DD\uC9C0\uB85C \uBB3B\uB294\uB2E4.
311
+
312
+ # \uAD8C\uC704 \uC788\uB294 \uCD9C\uCC98 (\uBA3C\uC800 \uC77D\uAE30)
313
+
314
+ - \`MIGRATION.md\` \u2014 \uBC84\uC804\uBCC4 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\xB7\uC808\uCC28(\uB2E8\uC77C \uC18C\uC2A4). \uBC84\uC804 \uBC94\uD504+\uC124\uCE58 \uD6C4 \`node_modules/@bstage-sdk/cli/dist/MIGRATION.md\`(\uB610\uB294 core docs)\uC5D0\uC11C \uC77D\uB294\uB2E4.
315
+ - \`bstage doctor\` \u2014 \uD604\uC7AC \uB4DC\uB9AC\uD504\uD2B8 \uC9C4\uB2E8(\uACB0\uC815\uB860). \`npx @bstage-sdk/cli@latest doctor\`.
316
+ - \uBB38\uC11C \uBAA9\uB85D: \`npx bstage docs\` (SDK \uC758\uC874\uC774 \uC5C6\uB294 \uB808\uD3EC\uC5D0\uC11C\uB294 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB05D\uB09C\uB2E4 \u2014 liquid \uB808\uD3EC\uB77C\uBA74 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uBCF8\uB2E4)
317
+
318
+ # \uC808\uCC28
319
+
320
+ ## 1. \uC9C4\uB2E8 (doctor)
321
+
322
+ \`\`\`bash
323
+ npx @bstage-sdk/cli@latest doctor --json
324
+ \`\`\`
325
+
326
+ \`bstage ai doctor\`\uB85C \uC2A4\uD0AC\xB7AGENTS.md\uAC00 \uCD5C\uC2E0\uC778\uC9C0\uB3C4 \uD568\uAED8 \uBCF8\uB2E4(stale\uC774\uBA74 \`bstage ai update\`).
327
+
328
+ \uCD9C\uB825\uC5D0\uC11C \uC138 \uAC00\uC9C0\uB97C \uC5BB\uB294\uB2E4.
329
+
330
+ - \`versions\` \u2014 \uB4A4\uCC98\uC9C4 \uD328\uD0A4\uC9C0\uC640 latest \uBC84\uC804
331
+ - \`files\` \u2014 \uB204\uB77D\uB41C \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uD30C\uC77C
332
+ - \`recommendedDeps\` \u2014 \uAD8C\uC7A5 \uC758\uC874\uC131\uC758 \uC120\uC5B8 \uC0C1\uD0DC(\`declared: false\`\uBA74 \uBBF8\uC120\uC5B8). **\uBC84\uC804 \uB300\uC870\uB85C\uB294 \uC548 \uC7A1\uD788\uB294 \uCD95**\uC774\uBBC0\uB85C \`migrations\`\uAC00 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uB530\uB85C \uD655\uC778\uD55C\uB2E4
333
+ - \`migrations\` \u2014 \uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9. \uAC01 \uD56D\uBAA9\uC740 \`label\`(\uD5E4\uB354 \uD45C\uAE30, \uC608: \`cli 0.43.0\` \uB610\uB294 \`core 0.32.0 \xB7 react 0.32.0\`) \xB7 \`requirements\`(\uC62C\uB824\uC57C \uD560 \uD328\uD0A4\uC9C0\xB7\uCD5C\uC18C \uBC84\uC804 \uC30D) \xB7 \`items\`(\uD56D\uBAA9 \uC81C\uBAA9)\uB97C \uAC00\uC9C4\uB2E4. \uD5E4\uB354\uC758 \uD328\uD0A4\uC9C0\uB97C \uADF8 \uBC84\uC804 \uC774\uC0C1\uC73C\uB85C \uC62C\uB9B0\uB2E4
334
+
335
+ \`isBstageProject\`\uAC00 false\uBA74 bstage \uD504\uB85C\uC81D\uD2B8\uAC00 \uC544\uB2C8\uBBC0\uB85C \uC911\uB2E8\uD55C\uB2E4. \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC870\uD68C\uC5D0 \uC2E4\uD328\uD574 \`latestChecked\`\uAC00 false\uBA74 \uBC84\uC804 \uBE44\uAD50\uB97C \uBCF4\uB958\uD55C\uB2E4(\uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\xB7\uD56D\uBAA9\uC740 \uACC4\uC18D \uC9C4\uD589 \uAC00\uB2A5).
336
+
337
+ ## 1a. liquid \uB808\uD3EC\uC77C \uB54C
338
+
339
+ \`bstage doctor\`\uAC00 \uC885\uB958\uB97C liquid\uB85C \uD310\uC815\uD558\uBA74 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uBC94\uC704\uAC00 \uB2E4\uB974\uB2E4.
340
+
341
+ - \uC62C\uB9B4 \uD328\uD0A4\uC9C0\uB294 \`cli\`\uBFD0\uC774\uB2E4(core\xB7react\xB7design \uC758\uC874\uC774 \uC5C6\uB2E4). \`versions\`\uC5D0 \uADF8\uAC83\uB9CC \uB098\uC628\uB2E4.
342
+ - \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uD30C\uC77C \uBAA9\uB85D\uB3C4 liquid \uAE30\uC900\uC774\uB2E4 \u2014 sdk\uC758 \`src/\`\xB7\`vite.config.ts\`\uAC00 \uC5C6\uB2E4\uACE0 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4.
343
+ - \`liquid\` \uAC80\uC99D \uACB0\uACFC(\uBB38\uBC95\xB7\uADDC\uC57D\xB7\uACBD\uACE0)\uAC00 \uD568\uAED8 \uB098\uC628\uB2E4. error\uAC00 \uC788\uC73C\uBA74 \uBC84\uC804 \uC791\uC5C5\uBCF4\uB2E4 \uBA3C\uC800 \uACE0\uCE5C\uB2E4 \u2014 \uBC30\uD3EC\uAC00 \uB9C9\uD788\uB294 \uBB38\uC81C\uB2E4.
344
+ - \uC2A4\uD0AC \uC138\uD2B8\uB294 \`bstage-liquid\`\xB7\`bstage-deploy\`\xB7\`bstage-onboarding\`\xB7\uC774 \uC2A4\uD0AC\uC774\uB2E4. \`bstage ai update\`\uAC00 \uB9DE\uCDB0 \uC900\uB2E4.
345
+ - SDK \uBB38\uC11C(\`npx bstage docs\`)\uB294 SDK \uC758\uC874\uC774 \uC5C6\uC5B4 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB05D\uB09C\uB2E4 \u2014 \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC774 \uB4E4\uACE0 \uC788\uB2E4.
346
+
347
+ ## 2. \uACC4\uD68D \uC81C\uC2DC (\uC2B9\uC778 \uC804 \uBA48\uCDA4)
348
+
349
+ doctor \uACB0\uACFC\uB97C \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC694\uC57D\uD558\uACE0, **\uBB34\uC5C7\uC744 \uD560\uC9C0** \uACC4\uD68D\uC744 \uC81C\uC2DC\uD55C \uB4A4 \uC2B9\uC778\uC744 \uBC1B\uB294\uB2E4. \uC774\uB54C \uC0AC\uC6A9\uC790\uAC00 \uB9AC\uBDF0\uD558\uB294 \uAC83\uC740 MIGRATION.md \uC6D0\uBB38\uC774 \uC544\uB2C8\uB77C **\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCD98 \uC791\uC5C5 \uACC4\uD68D**\uC774\uB2E4.
350
+
351
+ - \uBC84\uC804 \uBC94\uD504 \uBAA9\uB85D(\uD604\uC7AC \u2192 \uBAA9\uD45C)
352
+ - \uCD94\uAC00\uD560 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8 \uD30C\uC77C
353
+ - \uC801\uC6A9\uD560 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9, \uAC01 \uD56D\uBAA9\uC758 \`\uC790\uB3D9\`/\`\uD310\uB2E8\` \uAD6C\uBD84
354
+ - \uD310\uB2E8\uC774 \uD544\uC694\uD55C \uC9C0\uC810(\uC608: \uCEE4\uC2A4\uD140 \uCF54\uB4DC \uAD50\uCCB4)\uC740 \uBBF8\uB9AC \uC9DA\uC5B4 \uB454\uB2E4
355
+
356
+ ## 3. \uC801\uC6A9
357
+
358
+ ### 3a. \uBC84\uC804 \uBC94\uD504 + \uC124\uCE58 (\uC790\uB3D9)
359
+
360
+ \`package.json\`\uC774 \uC758\uC874\uD558\uB294 \`@bstage-sdk/*\` \uD328\uD0A4\uC9C0\uB97C \uBAA8\uB450 latest\uB85C \uC62C\uB9B0\uB2E4 \u2014 \uBCF4\uD1B5 \`cli\`/\`core\`/\`react\`/\`design\`\uC774\uB2E4. \uBC84\uC804 \uD45C\uAE30 \uC2A4\uD0C0\uC77C(\uCE90\uB7FF vs \uC815\uD655\uD55C \uBC84\uC804)\uC740 \uD504\uB85C\uC81D\uD2B8 \uAE30\uC874 \uCEE8\uBCA4\uC158\uC744 \uB530\uB978\uB2E4. \`react\`/\`vite\` \uB4F1 \uC0AC\uC6A9\uC790\uAC00 \uAD00\uB9AC\uD558\uB294 \uC758\uC874\uC131\uC740 **\uC784\uC758\uB85C \uC62C\uB9AC\uAC70\uB098 \uB0B4\uB9AC\uC9C0 \uC54A\uB294\uB2E4**(\uC608: \uD504\uB85C\uC81D\uD2B8\uAC00 \uC774\uBBF8 \uB354 \uB192\uC740 vite\uB97C \uC4F0\uBA74 init \uAE30\uBCF8\uAC12\uC73C\uB85C \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC \uAE08\uC9C0). \uADF8 \uD6C4 \uC124\uCE58\uD55C\uB2E4(\uD504\uB85C\uC81D\uD2B8\uC758 \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800).
361
+
362
+ > **install\uC774 bstage\uC640 \uBB34\uAD00\uD55C peer \uCDA9\uB3CC\uB85C \uC2E4\uD328**\uD558\uBA74(\uC608: \uB2E4\uB978 SDK\uAC00 \uC61B react\uB97C \uC694\uAD6C) \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uC81C\uC57D\uC774\uB2E4. \uAC15\uC81C \uBCC0\uACBD\uD558\uC9C0 \uB9D0\uACE0 \`--legacy-peer-deps\`(npm) \uB4F1 \uADF8 \uD504\uB85C\uC81D\uD2B8\uC758 \uAE30\uC874 \uC124\uCE58 \uBC29\uC2DD\uC73C\uB85C \uC7AC\uC2DC\uB3C4\uD558\uAC70\uB098, \uD310\uB2E8\uC774 \uD544\uC694\uD558\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uACE0\uD55C\uB2E4.
363
+
364
+ > \uC774 \uB2E8\uACC4 \uC9C1\uD6C4 \`node_modules/@bstage-sdk/cli/dist/MIGRATION.md\`\uAC00 \uC0DD\uAE34\uB2E4. \uC774\uD6C4 \uB2E8\uACC4\uB294 \uC774 \uD30C\uC77C\uC758 \uD574\uB2F9 \uBC84\uC804 \uC139\uC158\uC744 \uC815\uB3C5\uD558\uACE0 \uB530\uB978\uB2E4.
365
+
366
+ doctor\uC758 \`recommendedDeps\`\uC5D0 \`declared: false\`\uAC00 \uC788\uC73C\uBA74 **\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB3B\uACE0** \uD568\uAED8 \uCD94\uAC00\uD55C\uB2E4. \uC774\uAC74 \uBC84\uC804 \uBC94\uD504\uB85C \uC800\uC808\uB85C \uB4E4\uC5B4\uC624\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC608: \`@bstage-sdk/design\`(\uB514\uC790\uC778 \uD1A0\uD070)\uC774 \uC5C6\uC73C\uBA74 AGENTS.md\xB7\`bstage-template\` \uC2A4\uD0AC\uC740 \uD1A0\uD070\uC744 \uC4F0\uB77C\uACE0 \uC548\uB0B4\uD558\uB294\uB370 \uC815\uC791 import\uAC00 \uC2E4\uD328\uD55C\uB2E4. \uC774\uBBF8 \uCD5C\uC2E0 \uBC84\uC804\uC778 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C\uB294 \`migrations\`\uAC00 \uBE44\uC5B4 \uC774 \uCD95\uB9CC \uB0A8\uC73C\uBBC0\uB85C, \uB9C8\uC774\uADF8\uB808\uC774\uC158\uD560 \uAC8C \uC5C6\uB2E4\uACE0 \uD310\uB2E8\uD558\uACE0 \uB118\uC5B4\uAC00\uC9C0 \uC54A\uB294\uB2E4.
367
+
368
+ ### 3b. init \uAE30\uBCF8 \uD30C\uC77C \uCC28\uC774 (\uD310\uB2E8 \u2014 \uAC15\uC694 \uAE08\uC9C0)
369
+
370
+ doctor\uC758 "init \uAE30\uBCF8 \uD30C\uC77C" \uD56D\uBAA9\uC740 **\uB204\uB77D\uC774 \uC544\uB2C8\uB77C init \uAE30\uBCF8 \uAD6C\uC131\uACFC\uC758 \uCC28\uC774**\uB2E4. \uCD94\uAC00\uD558\uAE30 \uC804\uC5D0 **\uD504\uB85C\uC81D\uD2B8\uAC00 \uAC19\uC740 \uBAA9\uC801\uC744 \uB2E4\uB974\uAC8C \uB2EC\uC131\uD588\uB294\uC9C0** \uBA3C\uC800 \uD655\uC778\uD558\uACE0, \uD544\uC694\uD560 \uB54C\uB9CC \uCD94\uAC00\uD55C\uB2E4.
371
+
372
+ - \`src/vite-env.d.ts\` \u2014 \`tsconfig\`\uC758 \`types:["vite/client"]\`\uB85C \uC774\uBBF8 \uCC98\uB9AC \uC911\uC774\uBA74 \uBD88\uD544\uC694.
373
+ - \`eslint.config.js\` \u2014 eslint\uB97C \uC4F0\uC9C0 \uC54A\uB294 \uD504\uB85C\uC81D\uD2B8(\uC608: prettier/\uD0C0 \uB9B0\uD130\uB9CC)\uC5D4 \uCD94\uAC00\uD558\uC9C0 \uC54A\uB294\uB2E4.
374
+ - \`tsconfig.app.json\` / \`tsconfig.node.json\` \u2014 \uB2E8\uC77C \`tsconfig.json\`\uC774 \uC798 \uB3D9\uC791\uD558\uBA74 \uAD73\uC774 \uCABC\uAC1C\uC9C0 \uC54A\uB294\uB2E4. \uBD84\uB9AC\uD560 \uACBD\uC6B0 \uC0AC\uC6A9\uC790 \uC124\uC815(\uACBD\uB85C \uBCC4\uCE6D \uB4F1)\uC744 \uBCF4\uC874\uD55C\uB2E4.
375
+
376
+ \uD310\uB2E8\uC774 \uC11C\uC9C0 \uC54A\uC73C\uBA74 \uCD94\uAC00\uD558\uC9C0 \uB9D0\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778\uD55C\uB2E4.
377
+
378
+ ### 3c. \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9 (\uD56D\uBAA9\uBCC4\uB85C \uC790\uB3D9/\uD310\uB2E8 \uBD84\uB9AC)
379
+
380
+ \`MIGRATION.md\`\uC5D0\uC11C \uC801\uC6A9 \uB300\uC0C1 \uBC84\uC804 \uC139\uC158\uC744 \uC77D\uACE0, \uAC01 \uD56D\uBAA9\uC758 **\uC801\uC6A9** \uC808\uCC28\uB97C \uB530\uB978\uB2E4.
381
+
382
+ - \`\uC790\uB3D9\` \uB2E8\uACC4\uB294 \uADF8\uB300\uB85C \uC218\uD589\uD55C\uB2E4.
383
+ - \`\uD310\uB2E8\` \uB2E8\uACC4\uB294 **\uC2E4\uC81C \uD504\uB85C\uC81D\uD2B8 \uCF54\uB4DC\uB97C \uC77D\uACE0** \uC801\uC6A9\uD55C\uB2E4. \uC608: \uCEE4\uC2A4\uD140 i18n \uD5EC\uD37C\uAC00 \uC788\uC73C\uBA74 \uC6A9\uB3C4(\uC790\uCCB4 \uBB38\uAD6C vs \uD50C\uB7AB\uD3FC \uBB38\uAD6C)\uB97C \uBD84\uB958\uD574 \`useMessages\`/\`useBstageTranslations\`\uB85C \uC774\uC804\uD55C\uB2E4. \uC560\uB9E4\uD558\uBA74 \uC77C\uAD04 \uCE58\uD658\uD558\uC9C0 \uB9D0\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB3B\uB294\uB2E4.
384
+ - \`\uC120\uD0DD\` \uD56D\uBAA9\uC740 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uD544\uC694\uD55C\uC9C0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD655\uC778\uD55C \uB4A4 \uC9C4\uD589\uD55C\uB2E4.
385
+
386
+ ### 3c-1. \uD15C\uD50C\uB9BF \uB514\uB809\uD1A0\uB9AC \uAD6C\uC870 (\uD310\uB2E8 \u2014 \uC0AC\uC6A9\uC790\uB9CC \uB2F5\uD560 \uC218 \uC788\uB294 \uAC83)
387
+
388
+ doctor\uC758 \`layout.legacyPresent\`\uAC00 \`true\`\uBA74 \`src/templates/\`\uAC00 \uB0A8\uC544 \uC788\uB294 \uC61B \uAD6C\uC870\uB2E4. \uD398\uC774\uC9C0\uB294 \`src/pages/{\uACBD\uB85C}/\`, \uC704\uC82F\uC740 \`src/slots/{\uC544\uBB34 \uC774\uB984}/\`\uC73C\uB85C \uC62E\uACA8\uC57C \uD558\uACE0, \uC548 \uC62E\uAE30\uBA74 \`bstage build\`\uAC00 \uC5D4\uD2B8\uB9AC\uB97C \uCC3E\uC9C0 \uBABB\uD574 \uBA48\uCD98\uB2E4.
389
+
390
+ **\uC5EC\uAE30\uC11C\uB9CC\uC740 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB3C\uC5B4\uC57C \uD55C\uB2E4.** \uC774 \uC2A4\uD0AC\uC758 \uC6D0\uCE59\uC740 "\uC0AC\uC2E4\uC740 \uC5D0\uC774\uC804\uD2B8\uAC00 \uAC80\uC99D\uD558\uACE0, \uC0AC\uC6A9\uC790\uC5D0\uAC90 \uACB0\uC815\uB9CC \uBB3B\uB294\uB2E4"\uC774\uC9C0\uB9CC, \uC774 \uD56D\uBAA9\uC740 **\uC0AC\uC2E4 \uC790\uCCB4\uAC00 \uD504\uB85C\uC81D\uD2B8 \uC18C\uC2A4\uC5D0 \uC5C6\uB2E4**:
391
+
392
+ - \uD3F4\uB354 \uC774\uB984\uC740 \uC9C0\uAE08\uAE4C\uC9C0 \uC544\uBB34 \uC758\uBBF8\uAC00 \uC5C6\uC5C8\uB2E4 \u2014 \uBE4C\uB4DC\uAC00 \uC784\uC2DC \uB77C\uBCA8\uB85C\uB9CC \uC4F0\uACE0 \uBC84\uB838\uB2E4. \uADF8\uB798\uC11C \`src/templates/home/\`\uC774 \uC2E4\uC81C\uB85C\uB294 \`/landing\`\uC5D0 \uBC30\uD3EC\uB3FC \uC788\uC744 \uC218 \uC788\uB2E4.
393
+ - \uC2AC\uB86F \uBC30\uCE58\uB294 \uCF54\uB4DC\uC5D0 \uC120\uC5B8\uD558\uC9C0 \uC54A\uC558\uB2E4(\uC124\uACC4\uC0C1 \uAD00\uB9AC\uB3C4\uAD6C \uBAAB\uC774\uC5C8\uB2E4). \uADF8\uB798\uC11C \uD398\uC774\uC9C0\uC778\uC9C0 \uC704\uC82F\uC778\uC9C0\uB3C4 \uC18C\uC2A4\uB85C\uB294 \uAC08\uB9AC\uC9C0 \uC54A\uB294\uB2E4.
394
+ - \uC5B4\uB4DC\uBBFC \uC804\uC6A9 \`type: 'fullPage' | 'sharedNav'\`\uB294 \uB808\uC774\uC544\uC6C3 \uAD6C\uBD84\uC774\uB77C \uC774 \uD310\uB2E8\uC5D0 \uC4F8 \uC218 \uC5C6\uB2E4.
395
+
396
+ \uC2E4\uC81C \uB9E4\uD551\uC740 \uAD00\uB9AC\uB3C4\uAD6C(bstage portal)\uC5D0\uB9CC \uC788\uB2E4. \`layout.legacyTemplates\`\uC758 \uD3F4\uB354\uB97C \uD558\uB098\uC529 \uC9DA\uC5B4 \uBB3B\uB294\uB2E4.
397
+
398
+ - \uBA3C\uC800 **\uC18C\uC2A4\uB97C \uC77D\uACE0 \uCD94\uC815\uC548\uC744 \uB9CC\uB4E4\uC5B4 \uC81C\uC2DC\uD55C\uB2E4.** \uC804\uCCB4 \uD654\uBA74\uC744 \uADF8\uB9AC\uB294\uC9C0 \uC791\uC740 \uC870\uAC01\uC778\uC9C0, \uCEF4\uD3EC\uB10C\uD2B8 \uC774\uB984\uC774 \uBB34\uC5C7\uC778\uC9C0\uB294 \uB124\uAC00 \uC77D\uC5B4\uC11C \uC54C \uC218 \uC788\uB2E4. \uC0AC\uC6A9\uC790\uAC00 \uBC31\uC9C0\uC5D0\uC11C \uB2F5\uD558\uAC8C \uB450\uC9C0 \uC54A\uB294\uB2E4.
399
+ - \uC704\uC82F\uC774\uB77C\uACE0 \uB2F5\uD558\uBA74 **\uC790\uB9AC \uBAA9\uB85D\uC744 \uC120\uD0DD\uC9C0\uB85C \uC81C\uC2DC\uD55C\uB2E4.** \uCE74\uD0C8\uB85C\uADF8\uB294 SDK\uAC00 \uB4E4\uACE0 \uC788\uC73C\uBBC0\uB85C \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uCC3E\uC544\uC624\uB77C\uACE0 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`node_modules/@bstage-sdk/core\`\uC758 \`SLOT_CATALOG_V2\`(\uB610\uB294 \`SLOT_CATALOG_V2.md\`)\uB97C \uC77D\uC5B4 \`description\`\uACFC \uD568\uAED8 \uBCF4\uC5EC\uC900\uB2E4.
400
+ - \uD398\uC774\uC9C0\uB77C\uACE0 \uB2F5\uD558\uBA74 **\uAD00\uB9AC\uB3C4\uAD6C\uC5D0 \uB4F1\uB85D\uB41C \uACBD\uB85C**\uB97C \uBB3B\uB294\uB2E4. \uC774\uAC83\uB9CC\uC740 \uC0AC\uC6A9\uC790\uAC00 \uAD00\uB9AC\uB3C4\uAD6C\uB97C \uBD10\uC57C \uD55C\uB2E4 \u2014 \uB300\uC2E0 "\uAD00\uB9AC\uB3C4\uAD6C\uC5D0\uC11C \uC774 \uCEE4\uC2A4\uD140 \uD398\uC774\uC9C0\uC758 \uACBD\uB85C\uB97C \uD655\uC778\uD574 \uC8FC\uC138\uC694"\uCC98\uB7FC \uC5B4\uB514\uB97C \uBCF4\uBA74 \uB418\uB294\uC9C0\uAE4C\uC9C0 \uC54C\uB824\uC900\uB2E4.
401
+ - \uD655\uC778\uC774 \uC548 \uB418\uBA74 \uCD94\uCE21\uD574\uC11C \uC62E\uAE30\uC9C0 \uB9D0\uACE0 \uBA48\uCD98\uB2E4. \uACBD\uB85C\uAC00 \uD2C0\uB9AC\uBA74 \uBC30\uD3EC \uD6C4 \uD654\uBA74\uC774 \uC548 \uB728\uB294\uB370, \uC6D0\uC778\uC744 \uCC3E\uAE30 \uC5B4\uB835\uB2E4.
402
+
403
+ \uC62E\uAE34 \uB4A4\uC5D0\uB294 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\uC758 \`import.meta.glob\`(\uC720\uC800 \uD504\uB85C\uC81D\uD2B8\uB294 \`src/App.tsx\`, \uC5B4\uB4DC\uBBFC\uC740 \`src/main.tsx\`)\uACFC \`route-preview.json\`\xB7\`config-preview.json\` \uAC12\uC744 \uD568\uAED8 \uACE0\uCE5C\uB2E4(MIGRATION.md\uC758 \uD574\uB2F9 \uD56D\uBAA9 \uCC38\uC870). \uB9C8\uC9C0\uB9C9\uC5D0 \`npx bstage build\`\uB97C \uB3CC\uB824 \uC0B0\uCD9C\uBB3C\uC774 \uC758\uB3C4\uD55C \uACBD\uB85C\uB85C \uB098\uC624\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uADF8 \uBAA9\uB85D\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uC5EC\uC900\uB2E4.
404
+
405
+ > \uAD00\uB9AC\uB3C4\uAD6C\uAC00 \uD604\uC7AC \uB9E4\uD551\uC744 \uC870\uD68C\uD558\uB294 API\uB97C \uC5F4\uBA74 \uC774 \uBB3C\uC74C\uC740 \uC790\uB3D9 \uC870\uD68C\uB85C \uB300\uCCB4\uD560 \uC218 \uC788\uB2E4. \uADF8\uB54C\uAE4C\uC9C0\uB294 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBB3B\uB294 \uAC8C \uC720\uC77C\uD55C \uBC29\uBC95\uC774\uB2E4.
406
+
407
+ ### 3d. AGENTS.md \uAD00\uB9AC \uC601\uC5ED \uB3D9\uAE30\uD654
408
+
409
+ \`AGENTS.md\`\uB294 **SDK \uAD00\uB9AC \uC601\uC5ED**(\uB9C8\uCEE4 \`BSTAGE:MANAGED:START\`~\`END\`\uB85C \uAC10\uC2FC SDK \uC800\uC791 \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8)\uACFC **\uC790\uC720 \uC601\uC5ED**(\uB9C8\uCEE4 \uBC14\uAE65, \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59)\uC73C\uB85C \uB098\uB25C\uB2E4. doctor\uC758 \`agentsMd.status\`\uB85C \uBD84\uAE30\uD55C\uB2E4.
410
+
411
+ - \`ok\` \u2014 \uD560 \uC77C \uC5C6\uC74C.
412
+ - \`stale\` (\uB9C8\uCEE4\uB294 \uC788\uACE0 \uBC84\uC804\uB9CC \uB0AE\uC74C) \u2014 **\uC790\uB3D9**. \`bstage ai update\`\uB97C \uC2E4\uD589\uD558\uBA74 \uAD00\uB9AC \uC601\uC5ED\uB9CC \uCD5C\uC2E0\uC73C\uB85C \uCE58\uD658\uB418\uACE0 \uC790\uC720 \uC601\uC5ED\uC740 \uBCF4\uC874\uB41C\uB2E4. \uB05D.
413
+ - \`legacy\` (\uB9C8\uCEE4 \uC5C6\uC74C \u2014 \uC61B \uD504\uB85C\uC81D\uD2B8) \u2014 **\uD310\uB2E8**. SDK \uB0B4\uC6A9\uACFC \uC0AC\uC6A9\uC790 \uB0B4\uC6A9\uC774 \uD55C \uB369\uC5B4\uB9AC\uB77C 1\uD68C reconcile\uC774 \uD544\uC694\uD558\uB2E4. **\uACBD\uACC4\uB294 \uB124(\uC5D0\uC774\uC804\uD2B8)\uAC00 \uBA3C\uC800 \uBD84\uB958\uD574 \uC81C\uC548\uD558\uACE0, \uC0AC\uC6A9\uC790\uC5D0\uAC90 \uD655\uC778\uB9CC \uBC1B\uB294\uB2E4** \u2014 \uC0AC\uC6A9\uC790\uC5D0\uAC8C "\uC5B4\uB514\uAE4C\uC9C0\uAC00 \uD504\uB85C\uC81D\uD2B8 \uCD94\uAC00\uBD84\uC774\uB0D0"\uB97C \uBC31\uC9C0\uC5D0\uC11C \uBB3B\uC9C0 \uC54A\uB294\uB2E4(\uC0AC\uC6A9\uC790\uB294 AGENTS.md \uAD6C\uC870\uB97C \uBAA8\uB97C \uC218 \uC788\uACE0, \uBD84\uB958\uB294 \uB124 \uCC45\uC784\uC774\uB2E4).
414
+ 1. doctor \`--json\`\uC758 \`agentsMd.managedBlock\`\uC774 \uC801\uC6A9\uD560 **\uCD5C\uC2E0 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4 \uD3EC\uD568)**\uC774\uB2E4. \uC774\uAC78 \uB808\uD37C\uB7F0\uC2A4\uB85C \uC0BC\uC544, \uC61B AGENTS.md\uC758 \uAC01 \uAD6C\uAC04\uC774 **SDK \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8**(\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694\xB7SDK \uBB38\uC11C \uBAA9\uB85D\xB7\uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870\xB7\uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59\xB7\uAE08\uC9C0 \uC0AC\uD56D\xB7\uC61B \`client.get('/api/...')\` \uC608\uC2DC\uB098 \uC5D4\uB4DC\uD3EC\uC778\uD2B8 \uBAA9\uB85D \uB4F1 \u2014 managedBlock\uC774 \uB300\uCCB4\uD558\uB294 \uAC83)\uC778\uC9C0, **\uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uB0B4\uC6A9**(\uC774 \uB808\uD3EC\uB9CC\uC758 \uADDC\uCE59\xB7\uB3C4\uBA54\uC778 \uBA54\uBAA8 \uB4F1)\uC778\uC9C0 \uBD84\uB958\uD55C\uB2E4.
415
+ 2. \uBD84\uB958 \uACB0\uACFC\uB85C "\uB9E8 \uC704 = managedBlock, \uADF8 \uC544\uB798 \uC790\uC720 \uC601\uC5ED = \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uB0B4\uC6A9\uB9CC" \uAD6C\uC870\uC758 \uC7AC\uC791\uC131\uC548\uC744 \uB9CC\uB4E0\uB2E4. SDK \uBCF4\uC77C\uB7EC\uD50C\uB808\uC774\uD2B8\uB294 managedBlock\uC774 \uB300\uC2E0\uD558\uBBC0\uB85C **\uC790\uC720 \uC601\uC5ED\uC5D0 \uC911\uBCF5 \uBCF4\uC874\uD558\uC9C0 \uC54A\uB294\uB2E4** \u2014 \uD2B9\uD788 \uC61B \`/api/\` \uACBD\uB85C \uBAA9\uB85D\uC774 \uB0A8\uC73C\uBA74 \uC7AC\uBC1C \uC6D0\uC778\uC774 \uB41C\uB2E4.
416
+ 3. \uC790\uC720 \uC601\uC5ED\uC73C\uB85C \uBCF4\uC874\uD558\uB824\uB294 \uD56D\uBAA9(=\uB124\uAC00 "\uD504\uB85C\uC81D\uD2B8 \uACE0\uC720"\uB85C \uBD84\uB958\uD55C \uAC83)\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC81C\uC2DC\uD558\uACE0 **\uACBD\uACC4\uB97C \uD655\uC778\uBC1B\uB294\uB2E4**: "\uC774 \uBD80\uBD84\uB4E4\uC744 \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uB0B4\uC6A9\uC73C\uB85C \uBCF4\uACE0 \uBCF4\uC874\uD558\uB824\uB294\uB370 \uB9DE\uB098\uC694? SDK \uC601\uC5ED\uC73C\uB85C \uBE7C\uB3C4 \uB418\uB294 \uAC8C \uC11E\uC5EC \uC788\uAC70\uB098, \uBE60\uC9C4 \uAC8C \uC788\uB098\uC694?" (\uC774\uAC74 "\uCF54\uB4DC\uAC00 \uB9DE\uB0D0"\uB294 \uAC80\uC99D\uC774 \uC544\uB2C8\uB77C "\uC774\uAC8C \uB108\uD76C\uAC00 \uCD94\uAC00\uD55C \uAC70\uB0D0"\uB294 \uC18C\uC720 \uD655\uC778\uC774\uB77C \uC0AC\uC6A9\uC790\uAC00 \uB2F5\uD560 \uC218 \uC788\uB2E4.) \uC560\uB9E4\uD55C \uAD6C\uAC04\uC740 \uC784\uC758\uB85C \uC9C0\uC6B0\uC9C0 \uB9D0\uACE0 \uC790\uC720 \uC601\uC5ED\uC5D0 \uB0A8\uACA8 \uD6C4\uBCF4\uB85C \uC81C\uC2DC\uD55C\uB2E4.
417
+ 4. \uD655\uC778\xB7\uC870\uC815 \uD6C4 \uC7AC\uC791\uC131\uD558\uACE0, \uCD5C\uC885 diff\uB97C \uBCF4\uC5EC\uC900\uB2E4.
418
+
419
+ ## 4. \uAC80\uC99D
420
+
421
+ - \uC124\uCE58\uAC00 \uB05D\uB0AC\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uD504\uB85C\uC81D\uD2B8\uC758 \uD0C0\uC785\uCCB4\uD06C\xB7\uB9B0\uD2B8\xB7\uBE4C\uB4DC\uB97C \uB3CC\uB824 \uAE68\uC9C4 \uACF3\uC774 \uC5C6\uB294\uC9C0 \uBCF8\uB2E4.
422
+ - \`npx @bstage-sdk/cli@latest doctor\`\uB97C \uB2E4\uC2DC \uB3CC\uB824 \uBC84\uC804\uC774 \uCD5C\uC2E0\uC73C\uB85C \uC815\uB9AC\uB410\uB294\uC9C0 \uD655\uC778\uD55C\uB2E4(init \uAE30\uBCF8 \uD30C\uC77C \uCC28\uC774\uB294 \uC758\uB3C4\uC801\uC73C\uB85C \uB0A8\uAE38 \uC218 \uC788\uB2E4).
423
+ - \uB0A8\uC740 \`\uD310\uB2E8\` \uD56D\uBAA9(\uC608: \uB3C4\uC785\uC744 \uBCF4\uB958\uD55C \uC120\uD0DD \uAE30\uB2A5)\uC774 \uC788\uC73C\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uACE0\uD55C\uB2E4.
424
+
425
+ # \uD558\uC9C0 \uB9D0 \uAC83
426
+
427
+ - **\uAE30\uC5B5\xB7\uAC00\uC815\uC73C\uB85C \uC801\uC6A9\uD558\uAE30** \u2014 \uC124\uCE58\uB41C \uD328\uD0A4\uC9C0(\`MIGRATION.md\`\xB7\uD0C0\uC785 \uC120\uC5B8)\uC640 \uD504\uB85C\uC81D\uD2B8 \uC2E4\uC81C \uCF54\uB4DC\uB85C \uD655\uC778\uD558\uC9C0 \uC54A\uACE0 \uBCC0\uD658\uD558\uAE30
428
+ - **\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uCF54\uB4DC \uAC80\uC99D\uC744 \uB5A0\uB118\uAE30\uAE30** \u2014 "\uC774 \uCF54\uB4DC \uB9DE\uB098\uC694?"\uCC98\uB7FC \uC0AC\uC6A9\uC790\uAC00 \uC9C1\uC811 \uD655\uC778\uD574\uC57C \uB2F5\uD560 \uC218 \uC788\uB294 \uC9C8\uBB38\uD558\uAE30 (\uC0AC\uC6A9\uC790\uB294 \uAC1C\uBC1C\uC790\uAC00 \uC544\uB2D0 \uC218 \uC788\uB2E4 \u2014 \uAC80\uC99D\uC740 \uB124 \uBAAB)
429
+ - \uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB97C \uD1B5\uC9F8\uB85C \uB36E\uC5B4\uC4F0\uAE30 (\uD2B9\uD788 \`src/pages/**\`\xB7\`src/slots/**\`, \uCEE4\uC2A4\uD140 \`shared\`/\`api\` \uB4F1)
430
+ - \uD15C\uD50C\uB9BF\uC774 \uD398\uC774\uC9C0\uC778\uC9C0 \uC704\uC82F\uC778\uC9C0, \uD398\uC774\uC9C0\uBA74 \uC5B4\uB290 \uACBD\uB85C\uC778\uC9C0\uB97C **\uCD94\uCE21\uD574\uC11C** \uC62E\uAE30\uAE30 (\uAD00\uB9AC\uB3C4\uAD6C\uC5D0\uB9CC \uC788\uB294 \uC815\uBCF4\uB2E4)
431
+ - \uD55C \uBC88\uC5D0 \uBAA8\uB4E0 \uBCC0\uACBD\uC744 \uC801\uC6A9\uD558\uACE0 \uAC80\uC99D\uC744 \uAC74\uB108\uB6F0\uAE30
432
+ - \`\uD310\uB2E8\` \uD56D\uBAA9\uC744 \uC0AC\uC6A9\uC790 \uD655\uC778 \uC5C6\uC774 \uCD94\uCE21\uC73C\uB85C \uBCC0\uD658\uD558\uAE30
433
+ - \`.bstage/i18n/**/*.json\` \uAC19\uC740 \uC7AC\uC0DD\uC131 \uAC00\uB2A5\uD55C \uCE90\uC2DC\uB97C \uC190\uC73C\uB85C \uD3B8\uC9D1\uD558\uAE30 (\`bstage i18n pull\`\uB85C \uC0DD\uC131)
434
+ `;
435
+ }
436
+
437
+ // src/skills/onboarding.ts
438
+ function onboardingSkillMd() {
439
+ return `---
440
+ name: bstage-onboarding
441
+ description: b.stage \uCEE4\uC2A4\uD140 \uAC1C\uBC1C\uC744 \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0 \uC548\uB0B4\uD55C\uB2E4. \uD504\uB85C\uC81D\uD2B8\uAC00 \uC544\uC9C1 \uC5C6\uAC70\uB098 \uBB34\uC5C7\uBD80\uD130 \uD560\uC9C0 \uBAA8\uB97C \uB54C, "\uCEE4\uC2A4\uD140 \uC2DC\uC791", "\uCC98\uC74C\uC778\uB370", "\uD3EC\uD138\uC5D0 \uC62C\uB9AC\uACE0 \uC2F6\uC5B4", "\uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8 \uB9CC\uB4E4\uC5B4\uC918" \uAC19\uC740 \uC694\uCCAD\uC744 \uBC1B\uC744 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.
442
+ ---
443
+
444
+ # \uC5ED\uD560
445
+
446
+ \uBE48\uC190\uC5D0\uC11C \uC2DC\uC791\uD574 **\uCCAB \uD654\uBA74\uC774 \uD50C\uB7AB\uD3FC\uC5D0 \uB728\uB294 \uB370\uAE4C\uC9C0** \uC0AC\uC6A9\uC790\uB97C \uB370\uB824\uAC04\uB2E4. \uC774 \uC2A4\uD0AC\uC740 \uC21C\uC11C\uC640 \uC131\uACF5 \uD310\uC815 \uAE30\uC900\uB9CC \uB2F4\uB294\uB2E4. \uBA85\uB839\uC758 \uC815\uD655\uD55C \uC635\uC158\uC740 \uD56D\uC0C1 \`bstage <\uBA85\uB839> --help\`\uB97C, SDK \uC0AC\uC6A9\uBC95\uC740 \uC124\uCE58\uB41C docs\uB97C \uBCF8\uB2E4.
447
+
448
+ \uD575\uC2EC \uC6D0\uCE59:
449
+
450
+ 1. **\uC0AC\uC6A9\uC790\uB294 \uAC1C\uBC1C\uC790\uAC00 \uC544\uB2D0 \uC218 \uC788\uB2E4.** \uD30C\uC77C\xB7\uC124\uC815\xB7\uC124\uCE58 \uC0C1\uD0DC \uD655\uC778\uC740 **\uB124(\uC5D0\uC774\uC804\uD2B8) \uCC45\uC784**\uC774\uB2E4. \uC9C1\uC811 \uC77D\uC5B4 \uD655\uC778\uD558\uACE0, \uC0AC\uC6A9\uC790\uC5D0\uAC90 \uC81C\uD488\xB7\uC120\uD638 **\uACB0\uC815**\uB9CC \uAD6C\uCCB4\uC801 \uC120\uD0DD\uC9C0\uB85C \uBB3B\uB294\uB2E4.
451
+ 2. **\uD655\uC778\uC774 \uC548 \uB418\uBA74 \uBA48\uCD98\uB2E4.** \uCD94\uCE21\uD574\uC11C \uB2E4\uC74C \uB2E8\uACC4\uB85C \uB118\uC5B4\uAC00\uC9C0 \uC54A\uB294\uB2E4.
452
+ 3. **\uB2E8\uACC4\uB9C8\uB2E4 \uC131\uACF5 \uD310\uC815 \uAE30\uC900\uC744 \uBA3C\uC800 \uB9D0\uD558\uACE0 \uD655\uC778\uD55C\uB2E4.** "\uB410\uB098\uC694?"\uAC00 \uC544\uB2C8\uB77C "\uC774 \uCD9C\uB825\uC774 \uB098\uC624\uBA74 \uC131\uACF5"\uC73C\uB85C \uB9D0\uD55C\uB2E4.
453
+ 4. **\uB418\uB3CC\uB9AC\uAE30 \uC5B4\uB824\uC6B4 \uC77C\uC740 \uC2E4\uD589 \uC804\uC5D0 \uBCF4\uC5EC\uC8FC\uACE0 \uD655\uC778\uBC1B\uB294\uB2E4** \u2014 \uC6D0\uACA9 push, \uBC30\uD3EC, \uAC8C\uC2DC \uC804\uD658.
454
+
455
+ # \uAD8C\uC704 \uC788\uB294 \uCD9C\uCC98
456
+
457
+ - \`bstage --help\`, \`bstage <\uBA85\uB839> --help\` \u2014 \uBA85\uB839\xB7\uC635\uC158\uC758 \uC720\uC77C\uD55C \uCD9C\uCC98(\uAE30\uC5B5\uC73C\uB85C \uC635\uC158\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4)
458
+ - \uC124\uCE58 \uD6C4 \`node_modules/@bstage-sdk/core/docs/\` \u2014 GETTING_STARTED\xB7INIT\xB7BUILD_SYSTEM \uB4F1. \uBAA9\uB85D\uC740 \`npx bstage docs\`. SDK \uC758\uC874\uC774 \uC5C6\uB294 \uB808\uD3EC(\uC608: \`.liquid\` \uD30C\uC77C\uB9CC \uB454 \uB808\uD3EC)\uC5D0\uB294 \uC774 \uACBD\uB85C\uAC00 \uC5C6\uC5B4 **\uC885\uB8CC \uCF54\uB4DC 2**\uB85C \uB05D\uB09C\uB2E4 \u2014 \uADF8\uB54C\uB294 \`bstage-liquid\` \uC2A4\uD0AC\uC774 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B\uC744 \uB4E4\uACE0 \uC788\uB2E4
459
+ - \uD504\uB85C\uC81D\uD2B8 \uADDC\uCE59: \uB808\uD3EC \uB8E8\uD2B8\uC758 \`AGENTS.md\`
460
+ - \uC774\uD6C4 \uC791\uC5C5\uC740 \uC2A4\uD0AC\uB85C \uB118\uAE34\uB2E4 \u2014 \`bstage-template\`(React \uD15C\uD50C\uB9BF) \xB7 \`bstage-liquid\`(liquid \uD15C\uD50C\uB9BF) \xB7 \`bstage-deploy\`(\uBC30\uD3EC\xB7\uB864\uBC31\xB7\uAC8C\uC2DC)
461
+
462
+ # \uC808\uCC28
463
+
464
+ ## 1. \uACB0\uC815 \uC138 \uAC1C\uB97C \uD55C \uBC88\uC5D0 \uBB3B\uB294\uB2E4
465
+
466
+ \uC791\uC5C5\uC744 \uC2DC\uC791\uD558\uAE30 \uC804\uC5D0 \uC544\uB798 \uC14B\uC744 **\uD55C \uBC88\uC5D0** \uBB3B\uB294\uB2E4(\uD558\uB098\uC529 \uBB3C\uC73C\uBA74 \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uCE5C\uB2E4).
467
+
468
+ - **(a) \uC5B4\uB514\uC5D0 \uBD99\uC774\uB098** \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC(\uBC29\uBB38\uC790\uAC00 \uBCF4\uB294 \uD654\uBA74)\uC778\uC9C0, \uC5B4\uB4DC\uBBFC(\uC6B4\uC601\uC790\uAC00 \uBCF4\uB294 \uD654\uBA74)\uC778\uC9C0.
469
+ - **(b) \uC5B4\uB5BB\uAC8C \uB9CC\uB4DC\uB098** \u2014 \uB458 \uC911 \uD558\uB098\uB97C \uACE0\uB974\uAC8C \uD558\uACE0 \uD55C \uC904 \uC7A5\uB2E8\uC810\uC744 \uD568\uAED8 \uC900\uB2E4.
470
+ - **React \uCEF4\uD3EC\uB10C\uD2B8(sdk)**: \uC0C1\uD638\uC791\uC6A9\xB7\uC0C1\uD0DC\xB7API \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uD654\uBA74\uC5D0 \uB9DE\uB294\uB2E4. \uB300\uC2E0 \uBE4C\uB4DC\xB7\uBC88\uB4E4 \uAC1C\uB150\uC774 \uB530\uB77C\uC628\uB2E4.
471
+ - **liquid \uD15C\uD50C\uB9BF**: \uB370\uC774\uD130\uB97C \uBC1B\uC544 \uADF8\uB824 \uC8FC\uAE30\uB9CC \uD558\uBA74 \uB418\uB294 \uD654\uBA74\uC5D0 \uB9DE\uB294\uB2E4. \uBC30\uC6B0\uAE30 \uC27D\uACE0 \uBE60\uB974\uC9C0\uB9CC \uBE0C\uB77C\uC6B0\uC800 \uCABD \uB85C\uC9C1\uC740 \uC81C\uD55C\uB41C\uB2E4.
472
+ - **(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
+ \uD55C \uB808\uD3EC\uC5D0\uB294 **\uD55C \uBC29\uC2DD\uB9CC** \uB2F4\uB294\uB2E4. React\uC640 liquid\uB97C \uD55C \uB808\uD3EC\uC5D0 \uC11E\uC73C\uBA74 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4.
475
+
476
+ ## 2. \uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131
477
+
478
+ \`\`\`bash
479
+ npx @bstage-sdk/cli@latest init
480
+ \`\`\`
481
+
482
+ - CLI\uAC00 \uC774\uBBF8 \uC124\uCE58\uB41C \uD658\uACBD\uC774\uBA74 \`bstage init\`\uB3C4 \uAC19\uB2E4. \uCC98\uC74C\uC774\uB77C\uBA74 \uC704\uCC98\uB7FC \`npx\`\uB85C \uCD5C\uC2E0 CLI\uB97C \uBC14\uB85C \uC4F4\uB2E4.
483
+ - 1\uB2E8\uACC4 (b)\uC758 \uACB0\uC815\uC740 \`--kind sdk\` \uB610\uB294 \`--kind liquid\`\uB85C \uB118\uAE34\uB2E4(\uAE30\uBCF8\uC740 sdk). \uB300\uC0C1(\uC720\uC800/\uC5B4\uB4DC\uBBFC)\uC740 \`--target\`\uC774\uB2E4. \uB098\uBA38\uC9C0 \uC635\uC158\uC740 \`bstage init --help\`\uB85C \uD655\uC778\uD55C\uB2E4.
484
+ - \uB300\uD654\uD615\uC73C\uB85C \uC2A4\uD398\uC774\uC2A4\xB7\uB300\uC0C1(\uC720\uC800/\uC5B4\uB4DC\uBBFC)\xB7\uCCAB \uD15C\uD50C\uB9BF \uC774\uB984\xB7phase\uB97C \uBB3B\uB294\uB2E4. \uBE44\uB300\uD654\uD615\uC73C\uB85C \uB3CC\uB824\uC57C \uD558\uBA74 \uC635\uC158 \uC774\uB984\uC744 \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 \`bstage init --help\`\uB85C \uD655\uC778\uD55C\uB2E4.
485
+ - **\uC131\uACF5 \uD310\uC815**: \uC0C8 \uD3F4\uB354\uAC00 \uC0DD\uAE30\uACE0 \uADF8 \uC548\uC5D0 \`package.json\`\xB7\`AGENTS.md\`\xB7\`.claude/skills/\`\uAC00 \uC788\uB2E4. \uC774\uD6C4 \uC791\uC5C5\uC740 **\uC0DD\uC131\uB41C \uD3F4\uB354 \uC548\uC5D0\uC11C** \uD55C\uB2E4(\uC5D0\uC774\uC804\uD2B8\uAC00 \uC791\uC5C5 \uB514\uB809\uD130\uB9AC\uB97C \uC62E\uAE34\uB2E4).
486
+ - init\uC774 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC\xB7\`AGENTS.md\`\uB97C \uC774\uBBF8 \uC124\uCE58\uD574 \uB454\uB2E4 \u2014 \`bstage ai install\`\uC744 \uB2E4\uC2DC \uB3CC\uB9B4 \uD544\uC694\uB294 \uC5C6\uB2E4. \`.claude/skills/\`\uAC00 \uC2E4\uC81C\uB85C \uC788\uB294\uC9C0\uB9CC \uD655\uC778\uD55C\uB2E4.
487
+ - \uC758\uC874\uC131 \uC124\uCE58\uAC00 \uB05D\uB0AC\uB294\uC9C0 \uD655\uC778\uD55C\uB2E4(\`node_modules\`\uAC00 \uC788\uB294\uC9C0). \uC124\uCE58\uAC00 \uC2E4\uD328\uD588\uB2E4\uBA74 \uC6D0\uC778\uC744 \uC77D\uACE0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBCF4\uACE0\uD55C\uB2E4 \u2014 \uB118\uC5B4\uAC00\uC9C0 \uC54A\uB294\uB2E4.
488
+
489
+ ## 3. \uB85C\uCEEC\uC5D0\uC11C \uB744\uC6B0\uACE0 \uD55C \uAD70\uB370 \uACE0\uCCD0 \uBCF8\uB2E4
490
+
491
+ \`\`\`bash
492
+ bstage dev
493
+ \`\`\`
494
+
495
+ - \`npm run dev\`\uB3C4 \uAC19\uC740 \uC77C\uC744 \uD55C\uB2E4(\uD504\uB85C\uC81D\uD2B8 \uC2A4\uD06C\uB9BD\uD2B8).
496
+ - **\uC131\uACF5 \uD310\uC815**: \uD130\uBBF8\uB110\uC5D0 \uB85C\uCEEC \uC8FC\uC18C\uAC00 \uB728\uACE0, \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uBAA9\uB85D\xB7\uBBF8\uB9AC\uBCF4\uAE30\uAC00 \uBCF4\uC778\uB2E4.
497
+ - \uC0AC\uC6A9\uC790\uAC00 \uD654\uBA74\uC744 \uD655\uC778\uD55C \uB4A4, **\uB208\uC5D0 \uBCF4\uC774\uB294 \uBB38\uAD6C \uD558\uB098\uB97C \uBC14\uAFD4** \uC0C8\uB85C\uACE0\uCE68\uC73C\uB85C \uBC18\uC601\uB418\uB294 \uAC83\uAE4C\uC9C0 \uAC19\uC774 \uBCF8\uB2E4. \uC774 \uD55C \uBC88\uC73C\uB85C "\uACE0\uCE58\uBA74 \uBC14\uB85C \uBCF4\uC778\uB2E4"\uB294 \uAC10\uC774 \uC0DD\uAE34\uB2E4.
498
+ - \uC548 \uB728\uBA74 \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 \uD130\uBBF8\uB110 \uC624\uB958\uB97C \uC77D\uB294\uB2E4. \uD3EC\uD2B8 \uCDA9\uB3CC\uC774\uBA74 \uD3EC\uD2B8\uB97C \uBC14\uAFB8\uB294 \uC635\uC158\uC774 \uC788\uB2E4(\`bstage dev --help\`).
499
+
500
+ ## 4. \uCEE4\uBC0B\uD558\uACE0 \uC6D0\uACA9\uC5D0 \uC62C\uB9B0\uB2E4
501
+
502
+ \uD3EC\uD138\uC740 **\uC6D0\uACA9 \uC800\uC7A5\uC18C\uC5D0 push\uB41C \uCEE4\uBC0B**\uC744 \uBE4C\uB4DC\uD55C\uB2E4. \uB85C\uCEEC \uD30C\uC77C\uC740 \uC62C\uB77C\uAC00\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC774 \uB2E8\uACC4\uB97C \uAC74\uB108\uB6F8 \uC218 \uC5C6\uB2E4.
503
+
504
+ - \uC544\uC9C1 \uC6D0\uACA9\uC774 \uC5C6\uC73C\uBA74 **\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACB0\uC815\uC744 \uBB3B\uB294\uB2E4**: \uC5B4\uB290 \uC870\uC9C1(\uB610\uB294 \uAC1C\uC778 \uACC4\uC815)\uC5D0 \uB9CC\uB4E4\uC9C0, \uC800\uC7A5\uC18C \uC774\uB984\uC740 \uBB34\uC5C7\uC73C\uB85C \uD560\uC9C0, \uACF5\uAC1C/\uBE44\uACF5\uAC1C.
505
+ - \uBE48 \uC800\uC7A5\uC18C\uB97C \uB9CC\uB4E0 \uB4A4 \uC6D0\uACA9\uC744 \uCD94\uAC00\uD558\uACE0 \uAE30\uBCF8 \uBE0C\uB79C\uCE58\uC5D0 push\uD55C\uB2E4.
506
+ - **\uC6D0\uACA9\uC5D0 \uC62C\uB9AC\uB294 \uBA85\uB839\uC740 \uC2E4\uD589 \uC804\uC5D0 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uADF8\uB300\uB85C \uBCF4\uC5EC\uC8FC\uACE0 \uD655\uC778\uC744 \uBC1B\uB294\uB2E4.** \uC5B4\uB5A4 \uC800\uC7A5\uC18C\uB85C \uAC00\uB294\uC9C0 \uD55C \uC904\uB85C \uC694\uC57D\uD55C\uB2E4.
507
+ - **\uC131\uACF5 \uD310\uC815**: \uC6D0\uACA9 \uC800\uC7A5\uC18C \uAE30\uBCF8 \uBE0C\uB79C\uCE58\uC5D0\uC11C \uBC29\uAE08 \uB9CC\uB4E0 \uD30C\uC77C\uC774 \uBCF4\uC778\uB2E4.
508
+
509
+ ## 5. \uD3EC\uD138\uC5D0\uC11C \uD574\uC57C \uD558\uB294 \uC77C (\uD654\uBA74\uC5D0\uC11C\uB9CC \uAC00\uB2A5)
510
+
511
+ \uB808\uD3EC \uC5F0\uACB0\uACFC \uBC30\uCE58(\uD398\uC774\uC9C0) \uC0DD\uC131\uC740 **\uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C\uB9CC** \uD560 \uC218 \uC788\uB2E4. CLI \uD1A0\uD070\uC73C\uB85C\uB294 \uB418\uC9C0 \uC54A\uB294\uB2E4(\uC758\uB3C4\uB41C \uC124\uACC4). \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC21C\uC11C\uB97C \uC54C\uB824\uC8FC\uACE0, \uB05D\uB0AC\uB294\uC9C0\uB294 CLI\uB85C \uD655\uC778\uD55C\uB2E4. \uD3EC\uD138 \uC8FC\uC18C\uB294 \uC0AC\uC6A9\uC790\uAC00 \uC4F0\uB294 \uC8FC\uC18C\uB97C \uADF8\uB300\uB85C \uB530\uB978\uB2E4 \u2014 \uCD94\uCE21\uD574\uC11C \uC801\uC9C0 \uC54A\uB294\uB2E4.
512
+
513
+ 1. **\uB808\uD3EC \uC5F0\uACB0** \u2014 \uC2A4\uD14C\uC774\uC9C0 > \uB808\uD3EC > \uC0C8 \uB808\uD3EC \uC5F0\uACB0. \uC870\uC9C1\uC5D0\uC11C \uCC98\uC74C\uC774\uB77C\uBA74 GitHub \uC571 \uC124\uCE58\uAC00 \uD55C \uBC88 \uC120\uD589\uB41C\uB2E4(\uC870\uC9C1\uB2F9 1\uD68C).
514
+ 2. **\uCCAB \uBE4C\uB4DC** \u2014 \uC5F0\uACB0\uD55C \uB808\uD3EC\uC5D0\uC11C \uD654\uBA74\uC758 "\uC0C8 \uBC84\uC804 \uBE4C\uB4DC"\uB97C \uB20C\uB7EC \uCCAB \uC0B0\uCD9C\uBB3C\uC744 \uB9CC\uB4E0\uB2E4.
515
+ 3. **\uD398\uC774\uC9C0(\uBC30\uCE58) \uB9CC\uB4E4\uAE30** \u2014 \uC2A4\uD14C\uC774\uC9C0 > \uD398\uC774\uC9C0 > \uC0C8 \uD398\uC774\uC9C0 \u2192 \uCEE4\uC2A4\uD140 \uBC29\uC2DD \uC120\uD0DD(\`sdk\` \xB7 \`liquid\` \xB7 \`slot\`) \u2192 \uB808\uD3EC\uC640 \uC0B0\uCD9C\uBB3C \uC120\uD0DD \u2192 \uACBD\uB85C(PAGE) \uD655\uC778. liquid\uB294 **PAGE\uB9CC** \uAC00\uB2A5\uD558\uB2E4(\uC2AC\uB86F \uC790\uB9AC\uC5D0\uB294 \uB123\uC744 \uC218 \uC5C6\uB2E4).
516
+ 4. \uB9CC\uB4E0 \uB4A4 \uD654\uBA74\uC5D0\uC11C **\uC801\uC6A9**\uD558\uACE0 **\uAC8C\uC2DC\uD558\uAE30**\uAE4C\uC9C0 \uD55C\uB2E4.
517
+
518
+ \uC774 4\uB2E8\uACC4\uB294 **\uC0C8 \uB808\uD3EC\uC5D0\uC11C \uCC98\uC74C \uD55C \uBC88\uB9CC** \uD544\uC694\uD558\uB2E4. \uC774\uD6C4 \uAC19\uC740 \uC77C\uC740 \`bstage deploy\`\uAC00 \uD55C\uB2E4.
519
+
520
+ ## 6. CLI\uB97C \uD3EC\uD138\uC5D0 \uC5F0\uACB0\uD55C\uB2E4
521
+
522
+ \`\`\`bash
523
+ bstage login
524
+ bstage link
525
+ bstage list
526
+ \`\`\`
527
+
528
+ - \`bstage login\` \u2014 \uD130\uBBF8\uB110\uC5D0 \uCF54\uB4DC\uC640 \uC8FC\uC18C\uAC00 \uB728\uACE0 \uBE0C\uB77C\uC6B0\uC800\uAC00 \uC5F4\uB9B0\uB2E4. \uBE0C\uB77C\uC6B0\uC800\uB97C \uC5F4 \uC218 \uC5C6\uB294 \uD658\uACBD\uC774\uBA74 \uCF54\uB4DC\xB7\uC8FC\uC18C\uB9CC \uCD9C\uB825\uD558\uB294 \uC635\uC158\uC774 \uC788\uB2E4(\`--help\`). \uD1A0\uD070\uC740 \uC0AC\uC6A9\uC790 \uD648\uC758 \uC124\uC815 \uB514\uB809\uD130\uB9AC\uC5D0 \uC18C\uC720\uC790\uB9CC \uC77D\uC744 \uC218 \uC788\uB294 \uAD8C\uD55C\uC73C\uB85C \uC800\uC7A5\uB418\uACE0 \uD654\uBA74\uC5D0 \uCC0D\uD788\uC9C0 \uC54A\uB294\uB2E4.
529
+ - **1\uB2E8\uACC4 (c)\uC5D0\uC11C \uC815\uD55C phase\uAC00 sandbox\uAC00 \uC544\uB2C8\uBA74** \`bstage login\`\xB7\`bstage link\` \uB458 \uB2E4\uC5D0 \`--phase <phase>\`\uB97C \uC900\uB2E4. \uC0DD\uB7B5\uD558\uBA74 \uD504\uB85C\uC81D\uD2B8 \`.env\`\uC758 \uAC12\uC744, \uADF8\uAC83\uB3C4 \uC5C6\uC73C\uBA74 sandbox\uB97C \uC4F4\uB2E4 \u2014 liquid \uB808\uD3EC\uC5D0\uB294 \uC2A4\uCE90\uD3F4\uB4DC\uB41C \`.env\`\uAC00 \uC5C6\uC73C\uBBC0\uB85C \uC774 \uD50C\uB798\uADF8\uAC00 \uD2B9\uD788 \uC911\uC694\uD558\uB2E4. \uAE30\uBCF8 \uBAA9\uB85D \uBC16\uC758 \uD3EC\uD138\uC774\uBA74 \`--portal\`\uB85C \uC8FC\uC18C\uB97C \uC9C1\uC811 \uC9C0\uC815\uD55C\uB2E4(\`bstage login --help\`).
530
+ - \`bstage link\` \u2014 \uD604\uC7AC \uB514\uB809\uD130\uB9AC\uB97C \uC870\uC9C1\xB7\uC2A4\uD14C\uC774\uC9C0\xB7\uB808\uD3EC\uC5D0 \uC5F0\uACB0\uD558\uACE0 \`.bstage/project.json\`\uC5D0 \uC801\uB294\uB2E4(\uC774 \uD30C\uC77C\uC740 gitignore\uB41C\uB2E4).
531
+ - **\uC131\uACF5 \uD310\uC815**: \`bstage list\`\uC5D0 \uC774 \uB808\uD3EC\uC758 **\uBC30\uCE58\uAC00 1\uAC74 \uC774\uC0C1** \uBCF4\uC778\uB2E4. 0\uAC74\uC774\uBA74 5\uB2E8\uACC4\uC758 \uD398\uC774\uC9C0 \uB9CC\uB4E4\uAE30\uAC00 \uC544\uC9C1 \uC548 \uB05D\uB09C \uAC83\uC774\uB2E4 \u2014 \uBC30\uD3EC\uB85C \uB118\uC5B4\uAC00\uC9C0 \uB9D0\uACE0 \uD3EC\uD138 \uD654\uBA74\uC73C\uB85C \uB3CC\uC544\uAC04\uB2E4.
532
+
533
+ ## 7. \uCCAB \uBC30\uD3EC
534
+
535
+ \`\`\`bash
536
+ bstage deploy
537
+ \`\`\`
538
+
539
+ - push\uB41C \uCEE4\uBC0B\uC744 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC\uAC00 \uB05D\uB098\uBA74 \uC774 \uB808\uD3EC\uC758 \uBC30\uCE58\uC5D0 \uC801\uC6A9\uD55C\uB2E4. **\uB85C\uCEEC \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC744 \uC62C\uB9AC\uB294 \uAC83\uC774 \uC544\uB2C8\uB2E4.**
540
+ - \uAE30\uBCF8\uC73C\uB85C \uBB34\uC5C7\uC744 \uC5B4\uB514\uC5D0 \uC801\uC6A9\uD560\uC9C0 \uBCF4\uC5EC\uC8FC\uACE0 \uD655\uC778\uC744 \uBB3B\uB294\uB2E4 \u2014 \uC0AC\uC6A9\uC790\uAC00 \uADF8 \uD654\uBA74\uC744 \uC9C1\uC811 \uBCF4\uAC8C \uD55C\uB2E4.
541
+ - **\uC131\uACF5 \uD310\uC815**: \uBA85\uB839\uC774 \uC131\uACF5\uC73C\uB85C \uB05D\uB098\uACE0, \uC2A4\uD14C\uC774\uC9C0 \uD654\uBA74\uC5D0\uC11C \uBC14\uB010 \uB0B4\uC6A9\uC774 \uBCF4\uC778\uB2E4.
542
+ - \uC790\uC138\uD55C \uADDC\uCE59(\uC2E4\uD328 \uB300\uC751\xB7\uB864\uBC31\xB7\uAC8C\uC2DC \uB044\uAE30\xB7CI)\uC740 \`bstage-deploy\` \uC2A4\uD0AC\uC5D0 \uC788\uB2E4.
543
+
544
+ ## 8. \uC774\uD6C4 \uBC18\uBCF5 \uB8E8\uD504
545
+
546
+ \uACE0\uCE5C\uB2E4 \u2192 \uB85C\uCEEC\uC5D0\uC11C \uD655\uC778\uD55C\uB2E4(\`bstage dev\`) \u2192 \uCEE4\uBC0B\xB7push\uD55C\uB2E4 \u2192 \`bstage deploy\`. \uD3EC\uD138 \uD654\uBA74\uC73C\uB85C \uB2E4\uC2DC \uAC08 \uC77C\uC740 **\uC0C8 \uBC30\uCE58\uB97C \uB9CC\uB4E4 \uB54C\uBFD0**\uC774\uB2E4.
547
+
548
+ ## 9. \uB9C9\uD614\uC744 \uB54C
549
+
550
+ \uBA3C\uC800 \uBA85\uB839\uC758 **\uC885\uB8CC \uCF54\uB4DC**\uB85C \uAC08\uB798\uB97C \uC7A1\uB294\uB2E4.
551
+
552
+ | \uCF54\uB4DC | \uB73B | \uBA3C\uC800 \uD560 \uC77C |
553
+ | --- | --- | --- |
554
+ | 0 | \uC131\uACF5 | - |
555
+ | 1 | \uC2E4\uD328 | \uBE4C\uB4DC \uB85C\uADF8 \uD655\uC778(\`bstage logs -f\`) |
556
+ | 2 | \uC0AC\uC804\uC870\uAC74 \uBBF8\uCDA9\uC871 | \uCEE4\uBC0B\xB7push\xB7\uBE0C\uB79C\uCE58\xB7\uBC30\uCE58 \uC720\uBB34\uB97C \uC810\uAC80(\uBA54\uC2DC\uC9C0\uAC00 \uBB34\uC5C7\uC774 \uBE60\uC84C\uB294\uC9C0 \uB9D0\uD574 \uC900\uB2E4) |
557
+ | 3 | \uC778\uC99D | \`bstage login\` \uB2E4\uC2DC |
558
+ | 4 | \uCDA9\uB3CC | \uB2E4\uB978 \uC0AC\uB78C\uC774 \uBA3C\uC800 \uBC30\uD3EC\uD588\uB2E4 \u2014 \`bstage list\`\uB85C \uD604\uC7AC \uC0C1\uD0DC\uB97C \uBCF4\uACE0 \uB2E4\uC2DC \uD310\uB2E8 |
559
+ | 5 | \uC694\uCCAD \uC81C\uD55C | \uC7A0\uC2DC \uAE30\uB2E4\uB838\uB2E4 \uC7AC\uC2DC\uB3C4 |
560
+
561
+ \uADF8 \uBC16\uC758 \uC9C4\uB2E8:
562
+
563
+ - \`bstage doctor\` \u2014 SDK \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C \uC9C4\uB2E8(\uD30C\uC77C\uC744 \uACE0\uCE58\uC9C0 \uC54A\uB294\uB2E4)
564
+ - \`bstage ai doctor\` \u2014 \uC2A4\uD0AC\xB7\`AGENTS.md\`\uAC00 \uCD5C\uC2E0\uC778\uC9C0 \uD655\uC778(\uC624\uB798\uB410\uC73C\uBA74 \`bstage ai update\`)
565
+ - \`bstage logs -f\` \u2014 \uCD5C\uADFC \uBE4C\uB4DC \uB85C\uADF8\uB97C \uB05D\uAE4C\uC9C0 \uB530\uB77C\uAC00\uBA70 \uBCF8\uB2E4
566
+
567
+ # \uD558\uC9C0 \uB9D0 \uAC83
568
+
569
+ - \uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C\uB9CC \uB418\uB294 \uC77C(\uB808\uD3EC \uC5F0\uACB0\xB7\uBC30\uCE58 \uC0DD\uC131)\uC744 CLI \uC635\uC158\uC73C\uB85C \uC6B0\uD68C\uD558\uB824 \uC2DC\uB3C4\uD558\uAE30
570
+ - \uC635\uC158 \uC774\uB984\uC744 \uAE30\uC5B5\uC73C\uB85C \uC9C0\uC5B4\uB0B4\uAE30 \u2014 \`--help\`\uB85C \uD655\uC778\uD55C\uB2E4
571
+ - \uC6D0\uACA9 push\xB7\uBC30\uD3EC\uB97C \uC0AC\uC6A9\uC790 \uD655\uC778 \uC5C6\uC774 \uC2E4\uD589\uD558\uAE30
572
+ - \uC0AC\uC6A9\uC790\uC5D0\uAC8C "\uCF54\uB4DC\uAC00 \uB9DE\uB098\uC694"\uCC98\uB7FC \uAC1C\uBC1C \uC9C0\uC2DD\uC774 \uC788\uC5B4\uC57C \uB2F5\uD560 \uC218 \uC788\uB294 \uAC83\uC744 \uBB3B\uAE30 (\uD655\uC778\uC740 \uB124 \uBAAB)
573
+ - \`bstage list\`\uC5D0 \uBC30\uCE58\uAC00 0\uAC74\uC778\uB370 \uBC30\uD3EC\uB97C \uC2DC\uB3C4\uD558\uAE30
574
+ - \uD55C \uB808\uD3EC\uC5D0 React \uD15C\uD50C\uB9BF\uACFC liquid \uD15C\uD50C\uB9BF\uC744 \uC11E\uAE30
575
+ `;
576
+ }
577
+
578
+ // src/skills/stamp.ts
579
+ var STAMP_LINE_RE = /^<!--\s*bstage-ai-toolkit\s+(\S+)\s*-->$/;
580
+ var FRONTMATTER_RE = /^---\r?\n[\s\S]*?\r?\n---\r?\n/;
581
+ function compareVersions(a, b) {
582
+ const parse = (v) => v.split("-")[0].split(".").map((n) => /^\d+$/.test(n) ? Number(n) : 0);
583
+ const pa = parse(a);
584
+ const pb = parse(b);
585
+ const len = Math.max(pa.length, pb.length);
586
+ for (let i = 0; i < len; i++) {
587
+ const x = pa[i] ?? 0;
588
+ const y = pb[i] ?? 0;
589
+ if (x !== y) return x > y ? 1 : -1;
590
+ }
591
+ return 0;
592
+ }
593
+ function skillStamp(version = VERSION) {
594
+ return `<!-- bstage-ai-toolkit ${version} -->`;
595
+ }
596
+ function withStamp(body) {
597
+ const m = FRONTMATTER_RE.exec(body);
598
+ if (!m) {
599
+ throw new Error(
600
+ "\uC2A4\uD0AC \uBCF8\uBB38\uC5D0 frontmatter(---)\uAC00 \uC5C6\uC5B4 \uBC84\uC804 \uC2A4\uD0EC\uD504\uB97C \uB123\uC744 \uC790\uB9AC\uB97C \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4."
601
+ );
602
+ }
603
+ return `${m[0]}${skillStamp()}
604
+ ${body.slice(m[0].length)}`;
605
+ }
606
+ function readSkillStamp(content) {
607
+ const m = FRONTMATTER_RE.exec(content);
608
+ if (!m) return null;
609
+ const firstLine = content.slice(m[0].length).split("\n").find((line) => line.trim() !== "");
610
+ if (firstLine === void 0) return null;
611
+ return STAMP_LINE_RE.exec(firstLine.trim())?.[1] ?? null;
612
+ }
613
+
614
+ // src/agents/designGuide.ts
615
+ function meta(target) {
616
+ if (target === "admin") {
617
+ return {
618
+ pkg: "@bstage-sdk/design/admin",
619
+ prefix: "admin",
620
+ colorExample: "color.text.primary",
621
+ cssVarExample: "text/primary",
622
+ textStyleExample: "16/title/med",
623
+ shadowExample: "default-large",
624
+ themeNote: "\uC5B4\uB4DC\uBBFC\uC740 **\uB77C\uC774\uD2B8 \uC804\uC6A9**(\uB2E4\uD06C\uBAA8\uB4DC \uC5C6\uC74C)."
625
+ };
626
+ }
627
+ return {
628
+ pkg: "@bstage-sdk/design/user",
629
+ prefix: "user",
630
+ colorExample: "color.text.secondary",
631
+ cssVarExample: "text/secondary",
632
+ textStyleExample: "16/title/semibold",
633
+ shadowExample: "default-large",
634
+ themeNote: "\uC0C9 \uD1A0\uD070\uC740 \uB77C\uC774\uD2B8/\uB2E4\uD06C \uC790\uB3D9 \uB300\uC751 \u2014 \uD50C\uB7AB\uD3FC \uD14C\uB9C8\uB97C \uB530\uB77C \uAC12\uC774 \uBC14\uB010\uB2E4."
635
+ };
636
+ }
637
+ function designRulesBrief(target) {
638
+ const m = meta(target);
639
+ return `## \uB514\uC790\uC778 (bstage \uB514\uC790\uC778 \uD1A0\uD070)
640
+
641
+ UI\uC758 \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB294 **\uBC18\uB4DC\uC2DC \`${m.pkg}\`\uC758 \uD1A0\uD070\uB9CC** \uC0AC\uC6A9\uD55C\uB2E4. hex/rgb \uD558\uB4DC\uCF54\uB529 \uAE08\uC9C0.
642
+
643
+ - **\uC0C9**: \`${m.colorExample}\`(\uC911\uCCA9 \uD2B8\uB9AC) \uB610\uB294 \`cssVar('${m.cssVarExample}')\` \u2192 \`var(--${m.prefix}-...)\`. \uCE74\uD14C\uACE0\uB9AC: bg / text / border / icon / surface / overlay / service
644
+ - **\uD0C0\uC774\uD3EC**: \`textStyle('${m.textStyleExample}')\` \u2192 \uC778\uB77C\uC778 \uC2A4\uD0C0\uC77C\uC5D0 spread
645
+ - **\uADF8\uB9BC\uC790**: \`shadow['${m.shadowExample}']\`
646
+ - **\uC778\uD130\uB799\uC158**(hover/press): overlay \uD1A0\uD070 \u2014 \`color.overlay['hover-a']\` / \`color.overlay['press-a']\`
647
+ - **\uAC04\uACA9\xB7\uB77C\uC6B4\uB4DC**: \uC804\uC6A9 \uD1A0\uD070 \uC5C6\uC74C \u2014 \uC77C\uAD00\uB41C \uC2A4\uCF00\uC77C(4\uC758 \uBC30\uC218 \uAD8C\uC7A5)\xB7\uC77C\uAD00\uB41C radius. \uC784\uC758\uAC12 \uB0A8\uBC1C \uAE08\uC9C0
648
+ - **\uD14C\uB9C8**: ${m.themeNote}
649
+ - \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB7F0\uD0C0\uC784\uC5D0 \`:root\`\uB85C \uC8FC\uC785\uD558\uACE0 \uB85C\uCEEC\uC740 \`bstage dev\`\uAC00 fallback \uC8FC\uC785 \u2192 \uAC1C\uBC1C \uC911\uC5D0\uB3C4 \uC2E4\uC81C \uD1A4\uC73C\uB85C \uBCF4\uC778\uB2E4. \uC815\uD655\uD55C \uD1A0\uD070 \uD0A4\uB294 \`node_modules/${m.pkg.split("/").slice(0, 2).join("/")}/dist/${m.prefix}/index.d.ts\` \uCC38\uC870
650
+
651
+ \uC790\uC138\uD55C \uC0AC\uC6A9\uBC95\uC740 SDK \uBB38\uC11C \`DESIGN_TOKENS.md\`(\`bstage docs\`)\uC640 \`bstage-template\` \uC2A4\uD0AC \uCC38\uACE0.`;
652
+ }
653
+ function designGuideSection(target) {
654
+ const m = meta(target);
655
+ const pkgRoot = m.pkg.split("/").slice(0, 2).join("/");
656
+ return `UI \uC2A4\uD0C0\uC77C\uC740 \uC784\uC758 \uAC12 \uB300\uC2E0 **bstage \uB514\uC790\uC778 \uD1A0\uD070**\uB9CC \uC4F4\uB2E4. \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB7F0\uD0C0\uC784\uC5D0 \`:root\`\uB85C \uC8FC\uC785\uD558\uACE0, \uB85C\uCEEC \`bstage dev\`\uB294 fallback\uC744 \uC8FC\uC785\uD558\uBBC0\uB85C \uAC1C\uBC1C \uC911\uC5D0\uB3C4 \uC2E4\uC81C \uD1A4\uC73C\uB85C \uBCF4\uC778\uB2E4. **hex/rgb \uD558\uB4DC\uCF54\uB529 \uAE08\uC9C0.**
657
+
658
+ \`\`\`tsx
659
+ import { color, shadow, cssVar, textStyle } from '${m.pkg}'
660
+
661
+ <div
662
+ style={{
663
+ background: color.bg.base,
664
+ color: ${m.colorExample}, // = 'var(--${m.prefix}-mode-text-...)'
665
+ boxShadow: shadow['${m.shadowExample}'],
666
+ ...textStyle('${m.textStyleExample}'), // fontSize/lineHeight/fontWeight/letterSpacing
667
+ }}
668
+ />
669
+ \`\`\`
670
+
671
+ - **\uC0C9**: \`color.<category>.<name>\` \uC911\uCCA9 \uD2B8\uB9AC, \uB610\uB294 \uD0C0\uC785 \uC548\uC804 \`cssVar('${m.cssVarExample}')\`. \uCE74\uD14C\uACE0\uB9AC: bg / text / border / icon / surface / overlay / service
672
+ - **\uD0C0\uC774\uD3EC**: \`textStyle('{size}/{role}/{weight}')\` \u2192 \uC778\uB77C\uC778 \uC2A4\uD0C0\uC77C \uAC1D\uCCB4(spread). \uC815\uD655\uD55C \uD0A4\uB294 \uD0C0\uC785 \uD655\uC778
673
+ - **\uADF8\uB9BC\uC790**: \`shadow['<name>']\`
674
+ - **\uC778\uD130\uB799\uC158**: hover/press\uB294 overlay \uD1A0\uD070\uC744 \uC704\uC5D0 \uC5B9\uB294\uB2E4 \u2014 \`color.overlay['hover-a']\`, \`color.overlay['press-a']\`
675
+ - **\uAC04\uACA9\xB7\uB77C\uC6B4\uB4DC**: \uC804\uC6A9 \uD1A0\uD070 \uC5C6\uC74C \u2014 \uC77C\uAD00\uB41C \uC2A4\uCF00\uC77C(4\uC758 \uBC30\uC218)\xB7\uC77C\uAD00\uB41C radius\uB97C \uC4F0\uACE0 \uC784\uC758\uAC12\uC744 \uB0A8\uBC1C\uD558\uC9C0 \uC54A\uB294\uB2E4
676
+ - **\uD14C\uB9C8**: ${m.themeNote}
677
+ - **\uC815\uD655\uD55C \uD1A0\uD070 \uBAA9\uB85D(SSOT)**: \`node_modules/${pkgRoot}/dist/${m.prefix}/index.d.ts\`. \uC0AC\uC6A9 \uAC00\uC774\uB4DC\uB294 SDK \uBB38\uC11C \`DESIGN_TOKENS.md\`(\`bstage docs\`). \uAE30\uC5B5\uC5D0 \uC758\uC874\uD574 \uD1A0\uD070\uBA85\uC744 \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4`;
678
+ }
679
+
680
+ // src/skills/template.ts
681
+ function templateSkillMd(target = "user") {
682
+ return `---
683
+ name: bstage-template
684
+ description: b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF\uC744 \uC791\uC131\xB7\uC218\uC815\uD55C\uB2E4. \uC0C8 \uD15C\uD50C\uB9BF\uC744 \uB9CC\uB4E4\uAC70\uB098, createTemplate\xB7\uC2AC\uB86F\xB7\uD50C\uB7AB\uD3FC \uC774\uBCA4\uD2B8\xB7\uB2E4\uAD6D\uC5B4\xB7API \uD638\uCD9C\uC744 \uB2E4\uB8E8\uAC70\uB098, "\uD15C\uD50C\uB9BF \uCD94\uAC00/\uAC1C\uBC1C", "bstage \uC704\uC82F \uB9CC\uB4E4\uC5B4\uC918" \uAC19\uC740 \uC694\uCCAD\uC744 \uBC1B\uC744 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.
685
+ ---
686
+
687
+ # \uC5ED\uD560
688
+
689
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C b.stage \uD15C\uD50C\uB9BF\uC744 \uC791\uC131\uD55C\uB2E4. \uC791\uC131\uD55C React \uCEF4\uD3EC\uB10C\uD2B8\uB294 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD574 \uD50C\uB7AB\uD3FC\uC5D0 \uB9C8\uC6B4\uD2B8\uD55C\uB2E4. \uC774 \uC2A4\uD0AC\uC740 **\uBAA9\uD45C\uC9C0\uD5A5 \uC808\uCC28 + \uD568\uC815**\uB9CC \uB2F4\uB294\uB2E4. \uC815\uD655\uD55C \uC2DC\uADF8\uB2C8\uCC98\uB294 \uD56D\uC0C1 \uC124\uCE58\uB41C docs/\uD0C0\uC785\uC744 SSOT\uB85C \uBCF8\uB2E4.
690
+
691
+ # \uAD8C\uC704 \uC788\uB294 \uCD9C\uCC98 (\uBA3C\uC800 \uC77D\uAE30)
692
+
693
+ \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 \uC124\uCE58\uB41C \uD328\uD0A4\uC9C0\uB97C \uBCF8\uB2E4. \uC678\uBD80 \uAC80\uC0C9\uBCF4\uB2E4 \uC2E0\uB8B0\uD560 \uC218 \uC788\uB2E4.
694
+
695
+ - \`node_modules/@bstage-sdk/core/docs/\` \u2014 GETTING_STARTED, API_REFERENCE, SLOT_*, I18N, BUILD_SYSTEM, DEV_SERVER, DESIGN_TOKENS, SDK_ARCHITECTURE
696
+ - \uD0C0\uC785: \`node_modules/@bstage-sdk/react/dist/*.d.ts\`, \`node_modules/@bstage-sdk/core/dist/*.d.ts\`
697
+ - \uD504\uB85C\uC81D\uD2B8 \uADDC\uCE59: \uB808\uD3EC \uB8E8\uD2B8\uC758 \`AGENTS.md\`
698
+ - \uBB38\uC11C \uBAA9\uB85D: \`npx bstage docs\`
699
+
700
+ # \uC808\uCC28
701
+
702
+ ## 1. \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
703
+
704
+ \uD398\uC774\uC9C0\uB294 \`src/pages/{\uACBD\uB85C}/template.tsx\`(\uD3F4\uB354 \uAD6C\uC870\uAC00 \uACE7 \uBC30\uD3EC \uACBD\uB85C), \uC704\uC82F\uC740 \`src/slots/{\uC544\uBB34 \uC774\uB984}/template.tsx\` + \`slot\` \uC635\uC158\uC73C\uB85C \uB9CC\uB4E0\uB2E4. \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.tsx\`(\uB77C\uC6B0\uD305\xB7\uBE4C\uB4DC\uAC00 \uC774 \uCEE8\uBCA4\uC158\uC73C\uB85C \uBC1C\uACAC). \`name\`\uC740 Custom Element \uD0DC\uADF8\uB85C \uADF8\uB300\uB85C \uC4F0\uC774\uBBC0\uB85C **\uC18C\uBB38\uC790 \uC2DC\uC791 + \uD558\uC774\uD508 1\uAC1C \uC774\uC0C1 + \uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508\uB9CC**.
705
+
706
+ \`\`\`tsx
707
+ import { createTemplate } from '@bstage-sdk/react'
708
+
709
+ export default function MyWidget() {
710
+ return <div>...</div>
711
+ }
712
+
713
+ createTemplate(MyWidget, { name: 'my-widget' }) // \uD3F4\uB354\uBA85\uACFC \uB3D9\uC77C, \uD558\uC774\uD508 \uD544\uC218
714
+ \`\`\`
715
+
716
+ ## 2. \uAE30\uB2A5\uBCC4 \uD6C5 (\uC2DC\uADF8\uB2C8\uCC98\uB294 API_REFERENCE.md / .d.ts \uD655\uC778)
717
+
718
+ - **\uD50C\uB7AB\uD3FC \uB124\uBE44\uAC8C\uC774\uC158**: \`useNavigation()\` \u2014 \`navigate\`/\`goBack\`/\`openExternal\`
719
+ - **\uD50C\uB7AB\uD3FC \uC774\uBCA4\uD2B8**: \`useBstageContext()\`\uC758 \`bridge\`\uB85C \`emit\`(\uD15C\uD50C\uB9BF\u2192\uD50C\uB7AB\uD3FC), \uAD6C\uB3C5\uC740 \`usePlatformEvent()\`(\uD50C\uB7AB\uD3FC\u2192\uD15C\uD50C\uB9BF)
720
+ - **API \uD638\uCD9C**: \`shared/client.ts\`\uC758 \`client\` \uC778\uC2A4\uD134\uC2A4\uB97C import\uD574 \uC9C1\uC811 \uD638\uCD9C(\`client.get<T>(...)\`). \`BstageClient\`\uB294 \uC778\uC99D fetch\xB7\uAC8C\uC774\uD2B8\uC6E8\uC774 base URL\uC744 \uC2A4\uC2A4\uB85C \uD574\uC11D\uD558\uBBC0\uB85C \uBCC4\uB3C4 \uBC30\uC120\uC774 \uD544\uC694 \uC5C6\uB2E4. **\uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC740 SDK\uAC00 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4** \u2014 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774 \uCD9C\uCC98\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4(\uC0DD\uB7B5\uD558\uBA74 \`unknown\`). **\uC720\uC800\uB2E8 API\uB9CC \uC9C0\uC6D0.** **\uC5B4\uB4DC\uBBFC\uC6A9 API\uB294 \uBBF8\uC9C0\uC6D0 \u2014 \uD544\uC694\uD558\uBA74 \uACBD\uB85C\uB97C \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 \uBC18\uB4DC\uC2DC \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA3C\uC800 \uD655\uC778\uD560 \uAC83.**
721
+ - **\uC2AC\uB86F context**: \`useSlotContext<Id>()\` \u2014 \uD638\uC2A4\uD2B8\uAC00 \uB9C8\uC6B4\uD2B8 \uC2DC 1\uD68C \uC804\uB2EC\uD558\uB294 read-only \uAC12
722
+ - **\uB2E4\uAD6D\uC5B4**: \uB85C\uCF00\uC77C \uD6C5(\`useLocale\`/\`useMessages\`/\`useBstageTranslations\`)\uC740 **\uBC18\uB4DC\uC2DC \`<BstageLocaleProvider>\` \uD558\uC704\uC5D0\uC11C** \uD638\uCD9C\uD55C\uB2E4(\uBC16\uC774\uBA74 throw). \uC720\uC800 \uD15C\uD50C\uB9BF\uC740 \`<BstageLocaleProvider>\`(target \uC0DD\uB7B5), \uC5B4\uB4DC\uBBFC\uC740 \`<BstageLocaleProvider target="admin">\`. \uC790\uCCB4 \uBB38\uAD6C\uB294 \`useMessages\`(\uC900\uBE44 \uBD88\uD544\uC694). \uD50C\uB7AB\uD3FC \uACF5\uC6A9 \uBB38\uAD6C\uB97C \uC4F0\uB824\uBA74 **\uBA3C\uC800 \`bstage i18n pull\`\uC744 \uC2E4\uD589**\uD574 \uBC88\uC5ED \uD0A4\xB7\uD0C0\uC785\xB7\uB85C\uCEEC \uCE90\uC2DC(\`.bstage/i18n\`)\uB97C \uB9CC\uB4E0 \uB4A4 \`useBstageTranslations\`\uB97C \uC4F4\uB2E4 \u2014 \uC548 \uD558\uBA74 \uB85C\uCEEC dev\uC5D0\uC11C \uBC88\uC5ED\uC774 \uC548 \uB728\uACE0 \uD0A4\uB3C4 \uC54C \uC218 \uC5C6\uB2E4. **\uC720\uC800 \uC2AC\uB86F \uD15C\uD50C\uB9BF\uC740 \`--target user\`(\uAE30\uBCF8, Bxxxxx), \uC5B4\uB4DC\uBBFC \uC2AC\uB86F \uD15C\uD50C\uB9BF\uC740 \`--target admin\`(Axxxxx)** \u2014 Provider \`target\`\uACFC \uAC19\uC740 \uCD95. \uD604\uC7AC \uC5B8\uC5B4\uB9CC \uD544\uC694\uD558\uBA74 \`useLocale\`. \uC0C1\uC138 \uC6CC\uD06C\uD50C\uB85C\uB294 I18N.md
723
+ - **\uB2E4\uAD6D\uC5B4 \uBB38\uAD6C \uBC30\uBD84 (\uC791\uC5C5 \uC804 \uACB0\uC815)**: "\uB2E4\uAD6D\uC5B4 \uCC98\uB9AC\uD574\uC918" \uB958 \uC694\uCCAD\uC744 \uBC1B\uC73C\uBA74 \uC804\uBD80 \`useMessages\`\uB85C \uB9CC\uB4E4\uC9C0 \uB9D0\uACE0, **\uD50C\uB7AB\uD3FC \uD0A4 \uB300\uC870\uBD80\uD130** \uD55C\uB2E4 \u2014 \`bstage i18n pull\` \uC2E4\uD589 \u2192 \uC0DD\uC131\uB41C \`src/bstage-i18n.ts\`\uC5D0\uC11C \uB300\uC0C1 \uBB38\uAD6C\uC758 \uC6D0\uBB38 \uAC80\uC0C9 \u2192 \uB9E4\uCE6D\uB418\uB294 \uD0A4\uAC00 \uC788\uC73C\uBA74 \uACF5\uC6A9 \uD0A4(\`useBstageTranslations\`), \uC5C6\uB294 \uBB38\uAD6C\uB9CC \`useMessages\`\uC5D0 \uCD94\uAC00. \uC800\uC7A5\xB7\uCDE8\uC18C\xB7\uC801\uC6A9\uD558\uAE30 \uAC19\uC740 \uACF5\uC6A9 UI \uB77C\uBCA8\uC740 \uB300\uBD80\uBD84 \uD50C\uB7AB\uD3FC \uD0A4\uAC00 \uC774\uBBF8 \uC788\uB2E4. \uACF5\uC6A9 \uD0A4\uAC00 \uC788\uB294 \uBB38\uAD6C\uB97C \`useMessages\`\uC5D0 \uBCF5\uC0AC\uD574 \uB36E\uC5B4\uC4F0\uBA74 \uD50C\uB7AB\uD3FC \uBC88\uC5ED \uC218\uC815\uC774 \uD15C\uD50C\uB9BF\uC5D0 \uBC18\uC601\uB418\uC9C0 \uC54A\uB294\uB2E4(\uD63C\uC6A9 \uD328\uD134\uC740 I18N.md).
724
+
725
+ ## 3. \uB514\uC790\uC778 \uD1A0\uD070 (\uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790)
726
+
727
+ ${designGuideSection(target)}
728
+
729
+ ## 4. \uB85C\uCEEC \uC2E4\uD589 / \uBE4C\uB4DC
730
+
731
+ - \`npm run dev\` \u2014 \uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568 \uAC1C\uBC1C \uC11C\uBC84. \uB85C\uADF8\uC778: http://localhost:5173/__bstage__/login
732
+ - \uC0B0\uCD9C\uBB3C \uD655\uC778: \`npx bstage build\` \u2192 \uD398\uC774\uC9C0\uB294 \`dist/{\uACBD\uB85C}/template.js\`, \uC704\uC82F\uC740 \`dist/{\uC2AC\uB86F id}/template.js\` (\uBC30\uD3EC\uB294 \`bstage deploy\` \u2014 bstage-deploy \uC2A4\uD0AC \uCC38\uC870)
733
+
734
+ # \uD568\uC815 (SDK \uC124\uACC4 \uC81C\uC57D \u2014 \uC5B4\uAE30\uBA74 \uB7F0\uD0C0\uC784\xB7\uBE4C\uB4DC\uAC00 \uAE68\uC9D0)
735
+
736
+ - **CSS\uB294 Shadow DOM \uC548\uC73C\uB85C \uB123\uC5B4\uC57C \uD55C\uB2E4**: \uD15C\uD50C\uB9BF\uC740 Shadow DOM\uC5D0 \uB9C8\uC6B4\uD2B8\uB41C\uB2E4. **\`import './style.css'\`\uB294 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC870\uC6A9\uD788 \uC0AC\uB77C\uC9C4\uB2E4** \u2014 \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uBBC0\uB85C "\uB85C\uCEEC\uC5D0\uC120 \uB418\uB294\uB370 \uBC30\uD3EC\uD558\uBA74 \uC2A4\uD0C0\uC77C\uC774 \uC5C6\uB2E4"\uB85C \uB098\uD0C0\uB09C\uB2E4. \uC4F8 \uC218 \uC788\uB294 \uAC74 \uB458\uBFD0\uC774\uB2E4: \u2460 \`createTemplate\`\uC758 \`styles\` \uC635\uC158(\`import css from './x.css?inline'\`) \u2461 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{cssText}</style>\`. inline \`style={{}}\`\uB3C4 \uBB3C\uB860 \uB41C\uB2E4. \uC804\uC5ED CSS(\`<link>\`)\uB294 \uAE08\uC9C0.
737
+ - **IIFE \uB2E8\uC77C \uBC88\uB4E4**: \uBC88\uB4E4\uC740 \uD56D\uC0C1 \uB2E8\uC77C IIFE. \uCF54\uB4DC \uC2A4\uD50C\uB9BF\xB7\uB3D9\uC801 \`import()\` \uBD88\uAC00.
738
+ - **\`__bstage_fetch__\` \uACC4\uC57D**: \uD50C\uB7AB\uD3FC\uC774 \uC778\uC99D fetch\uB97C \uC804\uC5ED\uC73C\uB85C \uC8FC\uC785\uD55C\uB2E4. \`BstageClient\`\uAC00 \uC774\uB97C \uC6B0\uC120 \uC0AC\uC6A9\uD558\uBBC0\uB85C, fetch \uACBD\uB85C\uB97C \uC6B0\uD68C\uD558\uC9C0 \uB9D0 \uAC83.
739
+ - **\`slot.context\`\uB294 \uB2E8\uBC29\uD5A5\xB7read-only**: \uD638\uC2A4\uD2B8\u2192\uC704\uC82F 1\uD68C \uC804\uB2EC. \uC704\uC82F\uC774 \uB418\uB3CC\uB824 \uC4F0\uC9C0 \uC54A\uB294\uB2E4.
740
+ - **\`createTemplate()\` \uD638\uCD9C \uD615\uD0DC \uC720\uC9C0**: \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uC18C\uC2A4\uC5D0\uC11C \`createTemplate(\` \uD638\uCD9C\uC744 \uD30C\uC2F1\uD574 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uBF51\uB294\uB2E4. \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758 \uBCC0\uD615\uD558\uBA74 \uD30C\uC2F1 \uC2E4\uD328.
741
+
742
+ # \uD558\uC9C0 \uB9D0 \uAC83
743
+
744
+ - \`src/main.tsx\`\xB7\`src/App.tsx\` \uC218\uC815 (\uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74, SDK\uAC00 \uAD00\uB9AC)
745
+ - \`customElements.define()\` / \`attachShadow\` \uC9C1\uC811 \uD638\uCD9C (createTemplate\uC774 \uCC98\uB9AC)
746
+ - \`@bstage-sdk/core\`\uC758 \`createWebComponent()\` \uC9C1\uC811 \uC0AC\uC6A9 \u2014 react \uD328\uD0A4\uC9C0 API\uB9CC
747
+ - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529 \u2014 \uB514\uC790\uC778 \uD1A0\uD070(\uC704 3\uBC88) \uC0AC\uC6A9
748
+ - \uC2DC\uADF8\uB2C8\uCC98\uB97C \uAE30\uC5B5\uC5D0 \uC758\uC874\uD574 \uCD94\uCE21 \u2014 \uC704 docs/.d.ts\uC5D0\uC11C \uD655\uC778
749
+ `;
750
+ }
751
+
752
+ // src/skills/registry.ts
753
+ var BSTAGE_SKILLS = [
754
+ {
755
+ name: "bstage-onboarding",
756
+ kinds: ["sdk", "liquid"],
757
+ content: () => withStamp(onboardingSkillMd())
758
+ },
759
+ {
760
+ name: "bstage-template",
761
+ kinds: ["sdk"],
762
+ content: ({ target }) => withStamp(templateSkillMd(target))
763
+ },
764
+ { name: "bstage-liquid", kinds: ["liquid"], content: () => withStamp(liquidSkillMd()) },
765
+ { name: "bstage-deploy", kinds: ["sdk", "liquid"], content: () => withStamp(deploySkillMd()) },
766
+ { name: "bstage-migrate", kinds: ["sdk", "liquid"], content: () => withStamp(migrateSkillMd()) }
767
+ ];
768
+ function skillsFor(kind) {
769
+ return BSTAGE_SKILLS.filter((s) => s.kinds.includes(kind));
770
+ }
771
+
772
+ // src/agents/agentsMdRegion.ts
773
+ var AGENTS_MANAGED_VERSION = 13;
774
+ 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
+ var END_MARKER = `<!-- BSTAGE:MANAGED:END -->`;
776
+ var START_TOKEN = "BSTAGE:MANAGED:START";
777
+ var END_TOKEN = "BSTAGE:MANAGED:END";
778
+ var COMMENT_OPEN = "<!--";
779
+ var COMMENT_CLOSE = "-->";
780
+ var WS_RE = /\s/;
781
+ function findMarker(content, token) {
782
+ let from = 0;
783
+ let close = -1;
784
+ for (; ; ) {
785
+ const open = content.indexOf(COMMENT_OPEN, from);
786
+ if (open < 0) return null;
787
+ const bodyStart = open + COMMENT_OPEN.length;
788
+ if (close < bodyStart) {
789
+ close = content.indexOf(COMMENT_CLOSE, bodyStart);
790
+ if (close < 0) return null;
791
+ }
792
+ let i = bodyStart;
793
+ while (i < close && WS_RE.test(content[i])) i++;
794
+ if (i + token.length <= close && content.startsWith(token, i)) {
795
+ return { start: open, end: close + COMMENT_CLOSE.length, tokenEnd: i + token.length };
796
+ }
797
+ from = bodyStart;
798
+ }
799
+ }
800
+ function readVersionAfterToken(content, tokenEnd, limit) {
801
+ let i = tokenEnd;
802
+ const wsStart = i;
803
+ while (i < limit && WS_RE.test(content[i])) i++;
804
+ if (i === wsStart) return 0;
805
+ if (!content.startsWith("v=", i)) return 0;
806
+ i += 2;
807
+ let d = i;
808
+ while (d < limit && content[d] >= "0" && content[d] <= "9") d++;
809
+ if (d === i) return 0;
810
+ return parseInt(content.slice(i, d), 10);
811
+ }
812
+ var FREE_REGION_NOTE = `<!-- \uC544\uB798\uB294 \uD504\uB85C\uC81D\uD2B8 \uC790\uC720 \uC601\uC5ED\uC785\uB2C8\uB2E4. SDK \uB9C8\uC774\uADF8\uB808\uC774\uC158\uC774 \uBCF4\uC874\uD569\uB2C8\uB2E4. \uC774 \uD504\uB85C\uC81D\uD2B8\uB9CC\uC758 \uADDC\uCE59\xB7\uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC5EC\uAE30\uC5D0 \uC801\uC73C\uC138\uC694. -->`;
813
+ function wrapManaged(body) {
814
+ return `${START_MARKER}
815
+ ${body}
816
+ ${END_MARKER}`;
817
+ }
818
+ function freeRegionScaffold() {
819
+ return `${FREE_REGION_NOTE}
820
+
821
+ ## \uD504\uB85C\uC81D\uD2B8 \uADDC\uCE59
822
+
823
+ <!-- \uC774 \uD504\uB85C\uC81D\uD2B8\uB9CC\uC758 \uADDC\uCE59\xB7\uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC5EC\uAE30\uC5D0 \uC791\uC131\uD558\uC138\uC694. -->
824
+ `;
825
+ }
826
+ function readManagedVersion(content) {
827
+ const m = findMarker(content, START_TOKEN);
828
+ if (!m) return null;
829
+ return readVersionAfterToken(content, m.tokenEnd, m.end - COMMENT_CLOSE.length);
830
+ }
831
+ function agentsMdStatus(content) {
832
+ const v = readManagedVersion(content);
833
+ if (v === null) return "legacy";
834
+ return v < AGENTS_MANAGED_VERSION ? "stale" : "ok";
835
+ }
836
+ function swapManagedBlock(existing, newWrappedBlock) {
837
+ const s = findMarker(existing, START_TOKEN);
838
+ const e = findMarker(existing, END_TOKEN);
839
+ if (!s || !e) return null;
840
+ const startIdx = s.start;
841
+ const endIdx = e.end;
842
+ if (endIdx <= startIdx) return null;
843
+ return existing.slice(0, startIdx) + newWrappedBlock + existing.slice(endIdx);
844
+ }
845
+ function parseAgentsIdentity(content) {
846
+ const space = /\*\*Space\*\*:\s*([A-Za-z0-9-]+)/.exec(content)?.[1];
847
+ const projectName = /\*\*레포\*\*:\s*`([^`]+)`/.exec(content)?.[1];
848
+ return { space, projectName };
849
+ }
850
+
851
+ // src/agents/agentsMd.ts
852
+ function deploySection() {
853
+ return `## \uBC30\uD3EC
854
+
855
+ - \uD3EC\uD138\uC740 **\uC6D0\uACA9 \uC800\uC7A5\uC18C \uAE30\uBCF8 \uBE0C\uB79C\uCE58\uC5D0 push\uB41C \uCEE4\uBC0B**\uC744 \uBE4C\uB4DC\uD55C\uB2E4. \uB85C\uCEEC \uC0B0\uCD9C\uBB3C\uC744 \uC62C\uB9AC\uB294 \uAC83\uC774 \uC544\uB2C8\uBBC0\uB85C, \uCEE4\uBC0B\xB7push\uD558\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC740 \uBC18\uC601\uB418\uC9C0 \uC54A\uB294\uB2E4.
856
+ - \uBC30\uD3EC\uB294 \`bstage deploy\` \u2014 \uBE4C\uB4DC \uD2B8\uB9AC\uAC70 \u2192 \uC644\uB8CC \uB300\uAE30 \u2192 \uC774 \uB808\uD3EC\uC758 \uBC30\uCE58\uC5D0 \uC801\uC6A9\uAE4C\uC9C0 \uD55C \uBC88\uC5D0 \uD55C\uB2E4.
857
+ - \uBC30\uCE58(\uD398\uC774\uC9C0) \uC0DD\uC131\uACFC \uB808\uD3EC \uC5F0\uACB0\uC740 **\uD3EC\uD138 \uD654\uBA74\uC5D0\uC11C\uB9CC** \uAC00\uB2A5\uD558\uB2E4. \`bstage list\`\uC5D0 \uBC30\uCE58\uAC00 0\uAC74\uC774\uBA74 \uD654\uBA74\uC5D0\uC11C \uBA3C\uC800 \uB9CC\uB4E0\uB2E4.
858
+ - \uB864\uBC31(\`bstage rollback\`)\xB7\uAC8C\uC2DC \uB044\uAE30(\`bstage publish off\`)\xB7\uC2E4\uD328 \uB300\uC751\xB7CI \uC0AC\uC6A9\uC740 \`bstage-deploy\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.`;
859
+ }
860
+ function agentsManagedBody({
861
+ space,
862
+ projectName,
863
+ target = "user",
864
+ kind = "sdk"
865
+ }) {
866
+ assertSingleLine({ space, projectName });
867
+ if (kind === "liquid") return liquidManagedBody(space, projectName);
868
+ return sdkManagedBody(space, projectName, target);
869
+ }
870
+ function assertSingleLine(values) {
871
+ for (const [key, value] of Object.entries(values)) {
872
+ if (/[\r\n]/.test(value)) throw new Error(`AGENTS.md \uC815\uCCB4\uC131 \uAC12\uC5D0 \uAC1C\uD589\uC774 \uC788\uC2B5\uB2C8\uB2E4: ${key}`);
873
+ }
874
+ }
875
+ function sdkManagedBody(space, projectName, target) {
876
+ const structureBlock = `src/
877
+ main.tsx \u2014 App \uB9C8\uC6B4\uD2B8\uB9CC (\uC218\uC815 \uBD88\uD544\uC694)
878
+ App.tsx \u2014 import.meta.glob \uAE30\uBC18 \uAC1C\uBC1C\uC6A9 \uBAA9\uB85D\xB7\uB77C\uC6B0\uD305 (\uC218\uC815 \uBD88\uD544\uC694)
879
+ shared/
880
+ client.ts \u2014 BstageClient \uC778\uC2A4\uD134\uC2A4 (API \uD0A4\uB294 .env\uC5D0\uC11C \uC8FC\uC785). \uC720\uC800\uB2E8 API\uB9CC \uC9C0\uC6D0
881
+ pages/
882
+ {\uACBD\uB85C}/
883
+ template.tsx \u2014 \uD398\uC774\uC9C0 (\uD3F4\uB354 \uAD6C\uC870\uAC00 \uACE7 \uBC30\uD3EC \uACBD\uB85C)
884
+ slots/
885
+ {\uC544\uBB34 \uC774\uB984}/
886
+ template.tsx \u2014 \uC704\uC82F (createTemplate\uC758 slot \uC635\uC158\uC774 \uC790\uB9AC\uB97C \uC815\uD568)
887
+ .env \u2014 VITE_BSTAGE_PHASE + API \uD0A4 (\uCEE4\uBC0B \uC548 \uB428, .gitignore)
888
+ .env.example \u2014 \uC704 \uD56D\uBAA9 placeholder (\uCEE4\uBC0B\uB428 \u2014 \uBCF5\uC0AC\uD574\uC11C .env \uC0DD\uC131)
889
+ vite.config.ts \u2014 Vite + bstageDevPlugin (phase\uB294 .env\uC5D0\uC11C \uC77D\uC74C)`;
890
+ const envSection = `\`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uB294 phase\uC640 API \uD0A4\uB97C, \`.env.example\`(\uCEE4\uBC0B\uB428)\uC740 \uADF8 placeholder\uB97C \uB2F4\uB294\uB2E4. \`client.ts\`\uB294 \`import.meta.env.VITE_BSTAGE_APP_*\`\uB97C, \`vite.config.ts\`\uB294 \`.env\`\uC758 phase\uB97C \uCC38\uC870\uD55C\uB2E4.
891
+
892
+ \`\`\`
893
+ VITE_BSTAGE_PHASE=dev # dev | qa | real | sandbox
894
+ \`\`\``;
895
+ const commandsSection = `- \`npm run dev\` \u2014 \uAC1C\uBC1C \uC11C\uBC84 \uC2E4\uD589 (\uC778\uC99D \uD504\uB85D\uC2DC \uD3EC\uD568)
896
+ - \uB85C\uADF8\uC778 \uD398\uC774\uC9C0: http://localhost:5173/__bstage__/login`;
897
+ const apiForbidBullet = `- \uACBD\uB85C\xB7\uC751\uB2F5 \uBAA8\uC591\uC744 \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 SDK\uB294 API \uACBD\uB85C \uBAA9\uB85D\uC744 \uB4E4\uACE0 \uC788\uC9C0 \uC54A\uB2E4(\uC790\uB3D9\uC644\uC131 \uC5C6\uC74C). \uCD9C\uCC98\uB294 \uAC8C\uC774\uD2B8\uC6E8\uC774 API Reference Doc\uC774\uACE0, \uC751\uB2F5 \uD0C0\uC785\uC740 \`client.get<T>(...)\`\uCC98\uB7FC \uC81C\uB124\uB9AD\uC73C\uB85C \uBA85\uC2DC\uD55C\uB2E4.
898
+ - \uC5B4\uB4DC\uBBFC\uC6A9 API\uB97C \uCD94\uCE21\uD574 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 BstageClient\uB294 **\uC720\uC800\uB2E8 API\uB9CC \uC9C0\uC6D0**\uD55C\uB2E4. \uC5B4\uB4DC\uBBFC API\uAC00 \uD544\uC694\uD558\uBA74 \uACBD\uB85C\uB97C \uC784\uC758\uB85C \uB9CC\uB4E4\uC9C0 \uB9D0\uACE0 **\uBC18\uB4DC\uC2DC \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uBA3C\uC800 \uD655\uC778**\uD55C\uB2E4.`;
899
+ return `# AGENTS.md
900
+
901
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
902
+
903
+ b.stage \uC11C\uB4DC\uD30C\uD2F0 \uD15C\uD50C\uB9BF \uD504\uB85C\uC81D\uD2B8. React \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC791\uC131\uD558\uBA74 SDK\uAC00 Web Component\uB85C \uBE4C\uB4DC\uD558\uACE0, \uBE4C\uB4DC \uC0B0\uCD9C\uBB3C\uC774 b.stage \uD50C\uB7AB\uD3FC\uC5D0\uC11C \uB85C\uB4DC\uB418\uC5B4 \uC2E4\uD589\uB41C\uB2E4.
904
+
905
+ - **Space**: ${space}
906
+ - **\uB808\uD3EC**: \`${projectName}\`
907
+
908
+ ## SDK \uBB38\uC11C
909
+
910
+ 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
+
912
+ \`\`\`
913
+ node_modules/@bstage-sdk/core/docs/
914
+ \u251C\u2500\u2500 GETTING_STARTED.md \u2014 \uBE60\uB978 \uC2DC\uC791 \uAC00\uC774\uB4DC
915
+ \u251C\u2500\u2500 API_REFERENCE.md \u2014 createTemplate, hooks, BstageClient, PlatformBridge API
916
+ \u251C\u2500\u2500 I18N.md \u2014 \uB2E4\uAD6D\uC5B4 \uD6C5 + bstage i18n pull (\uBC88\uC5ED \uCF54\uB4DC\uC820) \uC6CC\uD06C\uD50C\uB85C
917
+ \u251C\u2500\u2500 DESIGN_TOKENS.md \u2014 \uB514\uC790\uC778 \uD1A0\uD070 (\uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790) \uC0AC\uC6A9 \uAC00\uC774\uB4DC
918
+ \u251C\u2500\u2500 SLOT_PROTOCOL.md \u2014 \uC2AC\uB86F \uC2DC\uC2A4\uD15C v1 \uD504\uB85C\uD1A0\uCF5C (3-part \uD0A4\xB7context \uB2E8\uBC29\uD5A5)
919
+ \u251C\u2500\u2500 SLOT_CATALOG.md \u2014 \uC2AC\uB86F \uBAA9\uB85D, \uC774\uBCA4\uD2B8 \uC778\uD130\uD398\uC774\uC2A4, resourceId \uC758\uBBF8
920
+ \u251C\u2500\u2500 SLOT_SYSTEM.md \u2014 \uC2AC\uB86F \uC2DC\uC2A4\uD15C \uC124\uACC4, \uB7F0\uD0C0\uC784 \uD750\uB984
921
+ \u251C\u2500\u2500 BUILD_SYSTEM.md \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778, \uC0B0\uCD9C\uBB3C \uACBD\uB85C \uADDC\uCE59
922
+ \u251C\u2500\u2500 DEV_SERVER.md \u2014 \uB85C\uCEEC \uAC1C\uBC1C \uC11C\uBC84, \uC778\uC99D \uD504\uB85D\uC2DC
923
+ \u251C\u2500\u2500 MIGRATION.md \u2014 \uBC84\uC804 \uC0AC\uC774 \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uAC00\uC774\uB4DC (bstage doctor \uC5F0\uACC4)
924
+ \u2514\u2500\u2500 SDK_ARCHITECTURE.md \u2014 \uD328\uD0A4\uC9C0 \uAD6C\uC870, \uC124\uACC4 \uACB0\uC815
925
+ \`\`\`
926
+
927
+ \uBB38\uC11C \uBAA9\uB85D\uC740 \`npx bstage docs\`\uB85C\uB3C4 \uBCFC \uC218 \uC788\uB2E4. \uD0C0\uC785 \uC815\uC758(.d.ts)\uC640 \uB7F0\uD0C0\uC784 \uC18C\uC2A4(.js)\uB294 \`node_modules/@bstage-sdk/react/dist/\`, \`node_modules/@bstage-sdk/core/dist/\`\uC5D0\uC11C \uC9C1\uC811 \uD655\uC778\uD560 \uC218 \uC788\uB2E4.
928
+
929
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
930
+
931
+ \`\`\`
932
+ ${structureBlock}
933
+ \`\`\`
934
+
935
+ ## \uD15C\uD50C\uB9BF \uAC1C\uBC1C \uADDC\uCE59
936
+
937
+ ### \uC0C8 \uD15C\uD50C\uB9BF \uCD94\uAC00
938
+
939
+ \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
+
941
+ - **\uD398\uC774\uC9C0** \u2014 \`src/pages/{\uACBD\uB85C}/template.tsx\`. **\uD3F4\uB354 \uAD6C\uC870\uAC00 \uACE7 \uBC30\uD3EC \uACBD\uB85C**\uB2E4(\`src/pages/settings/custom/\` \u2192 \`/settings/custom\`). \uB3D9\uC801 \uACBD\uB85C(\`[id]\`)\uB294 \uC544\uC9C1 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294\uB2E4.
942
+ - **\uC704\uC82F** \u2014 \`src/slots/{\uC544\uBB34 \uC774\uB984}/template.tsx\` + \`createTemplate\`\uC5D0 \`slot\` \uC635\uC158. \uD3F4\uB354 \uC774\uB984\uC740 \uBC30\uCE58\uC5D0 \uC4F0\uC774\uC9C0 \uC54A\uACE0, \uC5B4\uB290 \uC790\uB9AC\uC5D0 \uBD99\uC744\uC9C0\uB294 \`slot\`\uB9CC \uC815\uD55C\uB2E4.
943
+
944
+ \`name\`\uC740 Custom Element \uD0DC\uADF8\uB85C \uADF8\uB300\uB85C \uC0AC\uC6A9\uB41C\uB2E4. Custom Element \uC2A4\uD399\uC0C1 **\uC18C\uBB38\uC790\uB85C \uC2DC\uC791 + \uD558\uC774\uD508 1\uAC1C \uC774\uC0C1 + \uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508\uB9CC** \uD5C8\uC6A9. \uC704\uBC18 \uC2DC \uB7F0\uD0C0\uC784\xB7\uBE4C\uB4DC\uAC00 \uAC70\uBD80\uD55C\uB2E4.
945
+
946
+ \`\`\`
947
+ src/pages/welcome/template.tsx \u2192 /welcome
948
+ src/pages/settings/custom/template.tsx \u2192 /settings/custom
949
+ src/slots/curation-banner/template.tsx \u2192 slot \uC635\uC158\uC774 \uC790\uB9AC\uB97C \uC815\uD568
950
+ \`\`\`
951
+
952
+ ### template.tsx \uD544\uC218 \uAD6C\uC870
953
+
954
+ \`\`\`tsx
955
+ import { createTemplate } from '@bstage-sdk/react'
956
+
957
+ // \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uBC18\uB4DC\uC2DC export default
958
+ export default function MyWidget() {
959
+ return <div>...</div>
960
+ }
961
+
962
+ // createTemplate \uD638\uCD9C \uD544\uC218 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uC774 \uD638\uCD9C\uC744 \uD30C\uC2F1\uD558\uC5EC \uBA54\uD0C0\uB370\uC774\uD130 \uCD94\uCD9C
963
+ createTemplate(MyWidget, {
964
+ name: '${space}-my-widget', // \uD3F4\uB354\uBA85\uACFC \uB3D9\uC77C\uD574\uC57C \uD568. \uD558\uC774\uD508 \uD544\uC218.
965
+ })
966
+ \`\`\`
967
+
968
+ - \`name\`\uC740 \uD544\uC218 \u2014 \uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85\uACFC \uC77C\uCE58, \uD558\uC774\uD508 \uD3EC\uD568
969
+ - \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
971
+
972
+ ${designRulesBrief(target)}
973
+
974
+ ## \uD658\uACBD \uC124\uC815
975
+
976
+ ${envSection}
977
+
978
+ ## \uBA85\uB839\uC5B4
979
+
980
+ ${commandsSection}
981
+
982
+ ## SDK \uC5C5\uB370\uC774\uD2B8 / \uB9C8\uC774\uADF8\uB808\uC774\uC158
983
+
984
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0DD\uC131 \uC2DC\uC810\uC758 SDK \uBC84\uC804\uC744 \`package.json\`\uC5D0 \uACE0\uC815\uD55C\uB2E4. SDK\uAC00 \uC5C5\uB370\uC774\uD2B8\uB3FC\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB530\uB77C\uC624\uC9C0 \uC54A\uC73C\uBBC0\uB85C, \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9AC\uB824\uBA74:
985
+
986
+ - \`npx @bstage-sdk/cli@latest doctor\` \u2014 \uBC84\uC804 \uB4DC\uB9AC\uD504\uD2B8\xB7\uB204\uB77D \uD30C\uC77C\xB7\uC801\uC6A9 \uAC00\uB2A5\uD55C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD56D\uBAA9\uC744 \uC9C4\uB2E8\uD55C\uB2E4(\uD30C\uC77C \uC218\uC815 \uC5C6\uC74C, \`--json\` \uC9C0\uC6D0).
987
+ - \uC2E4\uC81C \uC801\uC6A9\uC740 \`bstage-migrate\` \uC2A4\uD0AC\uC5D0\uAC8C \uB9E1\uAE34\uB2E4 \u2014 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C "bstage \uCD5C\uC2E0 \uBC84\uC804\uC73C\uB85C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD574\uC918"\uB77C\uACE0 \uC694\uCCAD\uD558\uBA74, doctor \uACB0\uACFC\uC640 SDK\uC758 \`MIGRATION.md\`\uB97C \uC77D\uACE0 \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uB9DE\uCDB0 \uBCC0\uD658\uD55C\uB2E4(\uC0AC\uC6A9\uC790 \uCF54\uB4DC\uB294 \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uACE0 reconcile).
988
+
989
+ \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC808\uCC28\uC758 \uB2E8\uC77C \uC18C\uC2A4\uB294 SDK\uC758 \`node_modules/@bstage-sdk/core/docs/MIGRATION.md\`\uB2E4.
990
+
991
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(\`bstage-template\` \uC791\uC131, \`bstage-deploy\` \uBC30\uD3EC, \`bstage-onboarding\` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, \`bstage-migrate\` \uB9C8\uC774\uADF8\uB808\uC774\uC158)\uC774 \uB4E4\uC5B4 \uC788\uB2E4. SDK \uBC84\uC804\uC5C5 \uD6C4 \`npx @bstage-sdk/cli@latest ai update\`\uB85C \uCD5C\uC2E0 \uC2A4\uD0AC\uC744 \uB3D9\uAE30\uD654\uD560 \uC218 \uC788\uC73C\uBA70, \uC774\uB54C **\uC774 AGENTS.md\uC758 SDK \uAD00\uB9AC \uC601\uC5ED(\uB9C8\uCEE4\uB85C \uAC10\uC2FC \uBD80\uBD84)\uB3C4 \uD568\uAED8 \uCD5C\uC2E0\uD654**\uB41C\uB2E4. \uD504\uB85C\uC81D\uD2B8 \uACE0\uC720 \uADDC\uCE59\uC740 \uAD00\uB9AC \uC601\uC5ED \uC544\uB798 **\uC790\uC720 \uC601\uC5ED**\uC5D0 \uC801\uC73C\uBA74 \uAC31\uC2E0 \uC2DC \uBCF4\uC874\uB41C\uB2E4.
992
+
993
+ ## \uBE4C\uB4DC
994
+
995
+ - \uB85C\uCEEC\uC5D0\uC11C \uC0B0\uCD9C\uBB3C \uD655\uC778\uC774 \uD544\uC694\uD558\uBA74 \`npx bstage build\`\uB85C \`dist/\` \uB97C \uC0DD\uC131\uD560 \uC218 \uC788\uB2E4(\uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC740 \uD3EC\uD138\uC774 \uB2E4\uC2DC \uB9CC\uB4E0\uB2E4).
996
+
997
+ ${deploySection()}
998
+
999
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1000
+
1001
+ - \`src/main.tsx\`\xB7\`src/App.tsx\`\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC1C\uBC1C\uC6A9 \uC9C4\uC785\uC810\xB7\uBAA9\uB85D \uD654\uBA74\uC73C\uB85C SDK\uAC00 \uAD00\uB9AC
1002
+ - \`customElements.define()\`\uC744 \uC9C1\uC811 \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`createTemplate()\`\uC774 \uC790\uB3D9 \uCC98\uB9AC
1003
+ - Shadow DOM\uC744 \uC9C1\uC811 \uC870\uC791\uD558\uC9C0 \uC54A\uB294\uB2E4 (\`attachShadow\`, \`shadowRoot\` \uB4F1) \u2014 SDK\uAC00 \uAD00\uB9AC
1004
+ - \`createTemplate()\` \uD638\uCD9C\uC758 \uC778\uC790 \uAD6C\uC870\uB97C \uC784\uC758\uB85C \uBCC0\uACBD\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBE4C\uB4DC \uD30C\uC774\uD504\uB77C\uC778\uC774 \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD560 \uC218 \uC788\uB2E4
1005
+ - \`@bstage-sdk/core\`\uB97C \uC9C1\uC811 import\uD558\uC5EC \`createWebComponent()\`\uB97C \uD638\uCD9C\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \`@bstage-sdk/react\`\uC758 API\uB9CC \uC0AC\uC6A9
1006
+ - \uC804\uC5ED CSS \uD30C\uC77C(\`<link>\`, \uC678\uBD80 \uC2A4\uD0C0\uC77C\uC2DC\uD2B8)\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 Shadow DOM \uB0B4\uBD80\uC5D0 \uC801\uC6A9\uB418\uC9C0 \uC54A\uB294\uB2E4.
1007
+ - **\`import './style.css'\`\uB85C \uC2A4\uD0C0\uC77C\uC744 \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uC0B0\uCD9C\uBB3C\uC5D0\uC11C \uC0AC\uB77C\uC9C4\uB2E4.** \uB85C\uCEEC \uAC1C\uBC1C \uD654\uBA74\uC5D0\uC11C\uB294 \uC801\uC6A9\uB418\uC5B4 \uB208\uCE58\uCC44\uAE30 \uC5B4\uB835\uB2E4. CSS \uD30C\uC77C\uC744 \uC4F0\uB824\uBA74 \`import css from './style.css?inline'\`\uC73C\uB85C \uBB38\uC790\uC5F4\uC744 \uAC00\uC838\uC640 \`createTemplate(..., { styles: css })\`\uC5D0 \uB118\uAE30\uAC70\uB098 \uCEF4\uD3EC\uB10C\uD2B8 \uC548 \`<style>{css}</style>\`\uB85C \uB80C\uB354\uD55C\uB2E4. inline \`style={{}}\`\uB3C4 \uB41C\uB2E4
1008
+ - UI \uC0C9\xB7\uD0C0\uC774\uD3EC\xB7\uADF8\uB9BC\uC790\uB97C hex/rgb\uB85C \uD558\uB4DC\uCF54\uB529\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC704 '\uB514\uC790\uC778' \uC139\uC158\uC758 \uB514\uC790\uC778 \uD1A0\uD070\uC744 \uC0AC\uC6A9
1009
+ - \uC571\uD0A4(APP-ID \`bsa_\u2026\`\xB7APP KEY \`bsp_\u2026\`, \uC5B4\uB4DC\uBBFC \uAC8C\uC774\uD2B8\uC6E8\uC774 \`bsm_\u2026\`)\uB97C \uC18C\uC2A4 \uCF54\uB4DC\uC5D0 \uB9AC\uD130\uB7F4\uB85C \uB123\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uC778\uC99D \uAC12\uC740 \`.env\`(\uCEE4\uBC0B \uC548 \uB428)\uC5D0\uC11C \`import.meta.env.VITE_BSTAGE_*\`\uB85C\uB9CC \uC8FC\uC785\uD55C\uB2E4. pre-commit \uD6C5\uC774 \uCEE4\uBC0B \uC804 \uAC80\uCD9C\xB7\uCC28\uB2E8\uD558\uBA70 \`--no-verify\`\uB85C \uC6B0\uD68C\uD558\uC9C0 \uC54A\uB294\uB2E4
1010
+ ${apiForbidBullet}
1011
+ `;
1012
+ }
1013
+ function liquidManagedBody(space, projectName) {
1014
+ const structureBlock = `public/
1015
+ user/ \u2014 \uC720\uC800 \uD50C\uB7AB\uD3FC\uC6A9 \uD15C\uD50C\uB9BF
1016
+ {name}/
1017
+ template.liquid \u2014 \uD15C\uD50C\uB9BF \uBCF8\uBB38 (\uD544\uC218, \uD30C\uC77C\uBA85 \uACE0\uC815)
1018
+ data.json \u2014 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C \uB370\uC774\uD130 (\uBC30\uD3EC\uC5D0\uB294 \uB098\uAC00\uC9C0 \uC54A\uC74C)
1019
+ admin/ \u2014 \uC5B4\uB4DC\uBBFC\uC6A9 \uD15C\uD50C\uB9BF (\uAC19\uC740 \uADDC\uCE59)
1020
+ package.json
1021
+ AGENTS.md \u2014 \uC774 \uD30C\uC77C`;
1022
+ return `# AGENTS.md
1023
+
1024
+ ## \uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694
1025
+
1026
+ b.stage liquid \uD14C\uB9C8 \uD504\uB85C\uC81D\uD2B8. \`.liquid\` \uD15C\uD50C\uB9BF\uC744 \uC791\uC131\uD558\uBA74 \uD3EC\uD138\uC774 \uADF8\uB300\uB85C \uD328\uD0A4\uC9D5\uD574 \uD50C\uB7AB\uD3FC\uC774 \uC11C\uBC84\uC5D0\uC11C \uB370\uC774\uD130\uB97C \uB123\uC5B4 \uB80C\uB354\uD55C\uB2E4.
1027
+
1028
+ - **Space**: ${space}
1029
+ - **\uB808\uD3EC**: \`${projectName}\`
1030
+
1031
+ ## SDK \uBB38\uC11C
1032
+
1033
+ \uADDC\uC57D\xB7\uB370\uC774\uD130 \uACC4\uC57D\uC740 \uC544\uB798 \uC808\uACFC \`bstage-liquid\` \uC2A4\uD0AC\uC774 \uC9C1\uC811 \uB4E4\uACE0 \uC788\uB2E4 \u2014 **\uC774\uAC83\uC744 1\uCC28 \uADFC\uAC70\uB85C \uC0BC\uB294\uB2E4.** SDK \uBB38\uC11C\uAC00 \uD568\uAED8 \uC124\uCE58\uB41C \uB808\uD3EC\uB77C\uBA74 \`bstage docs\`\uB85C \uBAA9\uB85D\uC744 \uBCFC \uC218 \uC788\uC9C0\uB9CC, \`.liquid\` \uD30C\uC77C\uB9CC \uB454 \uB808\uD3EC\uC5D0\uB294 \uC124\uCE58\uB418\uC9C0 \uC54A\uC544 \uADF8 \uBA85\uB839\uC774 \uC885\uB8CC \uCF54\uB4DC 2\uB85C \uB05D\uB09C\uB2E4.
1034
+
1035
+ - \uBA85\uB839\xB7\uC635\uC158: \`bstage --help\`, \`bstage <\uBA85\uB839> --help\`
1036
+ - \uC791\uC131 \uADDC\uC57D\xB7\uB370\uC774\uD130\xB7\uC5D0\uC14B: \`.claude/skills/bstage-liquid/SKILL.md\`
1037
+ - \uBB38\uBC95(\uD0DC\uADF8\xB7\uD544\uD130): liquidjs \uACF5\uC2DD \uBB38\uC11C
1038
+
1039
+ ## \uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130 (\uC720\uC800 \uD654\uBA74)
1040
+
1041
+ \uCD5C\uC0C1\uC704 \uAC12\uC740 \uB2E4\uC12F \uAC1C\uB2E4 \u2014 \`lounges\` \xB7 \`stories\` \xB7 \`contentSections\` \xB7 \`latestContents\` \xB7 \`shopCategories\`. \uC774 \uC774\uB984 \uC678\uC758 \uBCC0\uC218\uB294 \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4. \uAC01 \uD56D\uBAA9\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4. \`data.json\` \uC0D8\uD50C\uB3C4 \uAC19\uC740 \uC774\uB984\uC744 \uC368\uC57C \uD504\uB9AC\uBDF0\uAC00 \uBC30\uD3EC\uC640 \uAC19\uC740 \uBAA8\uC591\uC774 \uB41C\uB2E4. \uC5B4\uB4DC\uBBFC \uD654\uBA74\uC774 \uBC1B\uB294 \uAC12\uC740 \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uB2E4.
1042
+
1043
+ ## \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870
1044
+
1045
+ \`\`\`
1046
+ ${structureBlock}
1047
+ \`\`\`
1048
+
1049
+ ## \uD15C\uD50C\uB9BF \uC791\uC131 \uADDC\uCE59
1050
+
1051
+ - \uACBD\uB85C \uAE4A\uC774\uAC00 \uACE0\uC815\uC774\uB2E4 \u2014 \`public/{user|admin}/{name}/template.liquid\`(\uC608: \`public/user/welcome/template.liquid\`) \uC790\uB9AC\uC5D0 \uC788\uB294 \uD30C\uC77C\uB9CC \uC778\uC2DD\uD55C\uB2E4. \uB2E4\uB978 \uC704\uCE58\uC758 \uD30C\uC77C\uC740 **\uC870\uC6A9\uD788 \uBB34\uC2DC\uB41C\uB2E4**(\uBE4C\uB4DC\uB294 \uC131\uACF5\uD558\uB294\uB370 \uD654\uBA74\uC5D0 \uB098\uC624\uC9C0 \uC54A\uB294\uB2E4).
1052
+ - \`{name}\`\uC740 **\uC18C\uBB38\uC790\xB7\uC22B\uC790\xB7\uD558\uC774\uD508**\uB9CC \uC4F4\uB2E4. \uD3F4\uB354 \uD558\uB098\uAC00 \uD398\uC774\uC9C0 \uD558\uB098\uB2E4.
1053
+ - \uD30C\uC77C\uBA85\uC740 \uBC18\uB4DC\uC2DC \`template.liquid\`\uB2E4.
1054
+ - \`data.json\`\uC740 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uC6A9 \uC0D8\uD50C\uC77C \uBFD0\uC774\uB2E4. \uC2E4\uC81C \uAC12\uC740 \uD50C\uB7AB\uD3FC\uC774 \uB123\uC73C\uBBC0\uB85C, \uAC12\uC774 \uBE44\uC5B4 \uC788\uC5B4\uB3C4 \uD654\uBA74\uC774 \uAE68\uC9C0\uC9C0 \uC54A\uAC8C \uAE30\uBCF8\uAC12\xB7\uBE48 \uBAA9\uB85D \uBD84\uAE30\uB97C \uD568\uAED8 \uB123\uB294\uB2E4.
1055
+ - \uC791\uC131\xB7\uC218\uC815 \uC808\uCC28\uC640 \uBB38\uBC95 \uC694\uC810\uC740 \`bstage-liquid\` \uC2A4\uD0AC\uC744 \uB530\uB978\uB2E4.
1056
+
1057
+ ## \uBA85\uB839\uC5B4
1058
+
1059
+ - \`bstage dev\` \u2014 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30(\uBAA9\uB85D\uC5D0\uC11C \uD15C\uD50C\uB9BF\uC744 \uACE8\uB77C \uD655\uC778)
1060
+ - \`bstage build\` \u2014 \uAC80\uC99D(\uAD6C\uC870\xB7\uBB38\uBC95 \uD655\uC778, \uBC88\uB4E4\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uB294\uB2E4)
1061
+ - \`bstage deploy\` \u2014 \uD3EC\uD138 \uBC30\uD3EC (\uC544\uB798 "\uBC30\uD3EC" \uC808)
1062
+
1063
+ **\uC124\uCE58\uB41C cli\uAC00 liquid\uB97C \uBAA8\uB974\uB294 \uC61B \uBC84\uC804\uC774\uBA74** \uC704 \uB450 \uBA85\uB839\uC774 \uC774 \uB808\uD3EC\uB97C \uC54C\uC544\uBCF4\uC9C0 \uBABB\uD55C\uB2E4 \u2014 \uC99D\uC0C1\uC774 \uBD84\uBA85\uD558\uB2E4: \`bstage build\`\uAC00 liquid \uAC80\uC99D \uB300\uC2E0 \`src/\` \uC544\uB798\uC5D0\uC11C \uC5C6\uB294 \uC18C\uC2A4 \uD30C\uC77C\uC744 \uCC3E\uB294\uB2E4\uACE0 \uB05D\uB09C\uB2E4. \uADF8\uB54C\uB294 cli\uB97C \uCD5C\uC2E0\uC73C\uB85C \uC62C\uB9B0\uB2E4. \uC62C\uB9B4 \uC218 \uC5C6\uC73C\uBA74 \uB85C\uCEEC \uBBF8\uB9AC\uBCF4\uAE30\uB294 \uC774 \uB808\uD3EC\uAC00 \uAC00\uC9C4 \uC218\uB2E8\uC744 \uC4F4\uB2E4.
1064
+
1065
+ ## SDK \uC5C5\uB370\uC774\uD2B8
1066
+
1067
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \`.claude/skills/\`\uC5D0\uB294 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uC2A4\uD0AC(\`bstage-liquid\` \uC791\uC131, \`bstage-deploy\` \uBC30\uD3EC, \`bstage-onboarding\` \uCC98\uC74C\uBD80\uD130 \uB05D\uAE4C\uC9C0, \`bstage-migrate\` \uB9C8\uC774\uADF8\uB808\uC774\uC158)\uC774 \uB4E4\uC5B4 \uC788\uB2E4. \`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.
1068
+
1069
+ ${deploySection()}
1070
+
1071
+ ## \uAE08\uC9C0 \uC0AC\uD56D
1072
+
1073
+ - \uD55C \uB808\uD3EC\uC5D0 liquid\uC640 sdk \uBC29\uC2DD(React \uCEF4\uD3EC\uB10C\uD2B8) \uD15C\uD50C\uB9BF\uC744 \uC11E\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uBE4C\uB4DC\uD558\uC9C0 \uBABB\uD55C\uB2E4
1074
+ - liquid \uD15C\uD50C\uB9BF\uC744 \uC2AC\uB86F(\uC704\uC82F \uC790\uB9AC)\uC5D0 \uB123\uC73C\uB824 \uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 **PAGE \uBC30\uCE58\uB9CC \uAC00\uB2A5**\uD558\uB2E4
1075
+ - \`data.json\`\xB7\`layout.json\`\uC5D0 \uBC30\uD3EC\uC5D0 \uD544\uC694\uD55C \uC124\uC815\uC744 \uB2F4\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uD3EC\uD138\uC774 \uD328\uD0A4\uC9D5\uD560 \uB54C \uC9C0\uC6B4\uB2E4(\uB808\uC774\uC544\uC6C3\uC740 \uBC30\uCE58 \uC124\uC815\uC774 \uC18C\uC720)
1076
+ - \uADDC\uC57D \uBC16 \uACBD\uB85C\uC5D0 \uD15C\uD50C\uB9BF\uC744 \uB450\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAE4A\uC774\uAC00 \uB2E4\uB974\uBA74 \uBB34\uC2DC\uB41C\uB2E4
1077
+ - \uC5D0\uC14B(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1)\uC744 \uB808\uD3EC\uC5D0 \uB450\uACE0 \uC0C1\uB300 \uACBD\uB85C\uB85C \uCC38\uC870\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uD6C4 \uAE68\uC9C4\uB2E4. \uD3EC\uD138 \uD654\uBA74\uC758 \uC2A4\uD14C\uC774\uC9C0 > \uBBF8\uB514\uC5B4\uC5D0 \uC62C\uB824 \uBC1B\uC740 URL\uC744 \uC808\uB300 \uC8FC\uC18C\uB85C \uB123\uB294\uB2E4(\uC774\uBBF8\uC9C0\xB7\uC601\uC0C1\uB9CC \uC62C\uB9B4 \uC218 \uC788\uACE0 \uD5C8\uC6A9 \uD615\uC2DD\xB7\uC6A9\uB7C9 \uD55C\uB3C4\uB294 \uC5C5\uB85C\uB4DC\uD560 \uB54C \uD654\uBA74\uC774 \uC54C\uB824 \uC900\uB2E4). \uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB294 \uC0C1\uB300 \uACBD\uB85C\uB3C4 \uBCF4\uC774\uBBC0\uB85C \uD504\uB9AC\uBDF0 \uACB0\uACFC\uB97C \uADFC\uAC70\uB85C \uC0BC\uC9C0 \uC54A\uB294\uB2E4
1078
+ - \uD50C\uB7AB\uD3FC\uC774 \uB123\uC5B4 \uC8FC\uB294 \uB370\uC774\uD130\uC758 \uC774\uB984\xB7\uAD6C\uC870\uB97C \uCD94\uCE21\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uCD5C\uC0C1\uC704 \uC774\uB984\uC740 \uC704 '\uD50C\uB7AB\uD3FC\uC774 \uB123\uB294 \uB370\uC774\uD130' \uC808\uC774 \uC804\uBD80\uC774\uACE0, \uADF8 \uC548\uC758 \uD544\uB4DC\uB294 \uC2E4\uC81C \uB80C\uB354 \uACB0\uACFC\uB85C \uD655\uC778\uD55C\uB2E4
1079
+ - \`{% render %}\`\xB7\`{% include %}\`(\uD30C\uC15C)\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uBC30\uD3EC \uBDF0\uC5B4\uC5D0\uC11C \uBE48 \uBB38\uC790\uC5F4\uC774 \uB41C\uB2E4(\uB85C\uCEEC \uD504\uB9AC\uBDF0\uC5D0\uC11C\uB9CC \uB3D9\uC791). \uD15C\uD50C\uB9BF\uC740 \`template.liquid\` \uD55C \uD30C\uC77C\uC5D0 \uB2F4\uB294\uB2E4
1080
+ `;
1081
+ }
1082
+ function renderManagedBlock(opts) {
1083
+ return wrapManaged(agentsManagedBody(opts));
1084
+ }
1085
+ function agentsMd(opts) {
1086
+ assertSingleLine({ space: opts.space, projectName: opts.projectName });
1087
+ return `${renderManagedBlock(opts)}
1088
+
1089
+ ${freeRegionScaffold()}`;
1090
+ }
1091
+
1092
+ // src/agents/claudeMd.ts
1093
+ function claudeMd() {
1094
+ return `# CLAUDE.md
1095
+
1096
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uADDC\uCE59\uACFC \uCEE8\uD14D\uC2A4\uD2B8\uB294 [AGENTS.md](./AGENTS.md)\uB97C \uCC38\uACE0\uD558\uC138\uC694.
1097
+ `;
1098
+ }
1099
+
1100
+ // src/agents/identity.ts
1101
+ var IDENTITY_RE = /^[A-Za-z0-9._@/-]{1,100}$/;
1102
+ var IDENTITY_FORBIDDEN = ["<!--", "-->", "BSTAGE:MANAGED"];
1103
+ function sanitizeIdentity(value) {
1104
+ if (typeof value !== "string") return null;
1105
+ if (!IDENTITY_RE.test(value)) return null;
1106
+ if (IDENTITY_FORBIDDEN.some((token) => value.includes(token))) return null;
1107
+ return value;
1108
+ }
1109
+
1110
+ // src/install/plan.ts
1111
+ var AGENTS_FILE = "AGENTS.md";
1112
+ var CLAUDE_FILE = "CLAUDE.md";
1113
+ var LEGACY_NOTE = "\uAD00\uB9AC \uC601\uC5ED \uB9C8\uCEE4 \uC5C6\uC74C \u2014 bstage-migrate \uC2A4\uD0AC\uB85C reconcile";
1114
+ 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
+ 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.";
1116
+ function planInstall(input) {
1117
+ const actions = [...planSkills(input), planAgentsMd(input), planClaudeMd(input.existing.claudeMd)];
1118
+ return [...actions].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
1119
+ }
1120
+ function skillFilePath(skillsDir, name) {
1121
+ return `${skillsDir}/${name}/SKILL.md`;
1122
+ }
1123
+ function planSkills(input) {
1124
+ const { kind, target, skillsDir, existing } = input;
1125
+ const owned = skillsFor(kind);
1126
+ const ownedNames = new Set(owned.map((s) => s.name));
1127
+ const wanted = owned.map((skill) => {
1128
+ const path = skillFilePath(skillsDir, skill.name);
1129
+ const rendered = skill.content({ kind, target });
1130
+ const installed = existing.skills[skill.name];
1131
+ if (installed === void 0) return { path, content: rendered, reason: "create" };
1132
+ if (installed === rendered) return { path, content: null, reason: "keep" };
1133
+ const stamp = readSkillStamp(installed);
1134
+ if (stamp !== null && compareVersions(stamp, VERSION) > 0) {
1135
+ return { path, content: rendered, reason: "stale", note: NEWER_NOTE };
1136
+ }
1137
+ if (readSkillStamp(installed) === VERSION) {
1138
+ return { path, content: rendered, reason: "stale", note: HAND_EDIT_NOTE, backup: true };
1139
+ }
1140
+ return { path, content: rendered, reason: "stale" };
1141
+ });
1142
+ const extras = BSTAGE_SKILLS.filter(
1143
+ (s) => !ownedNames.has(s.name) && s.name in existing.skills
1144
+ ).map(
1145
+ (s) => ({
1146
+ path: skillFilePath(skillsDir, s.name),
1147
+ content: null,
1148
+ reason: "keep",
1149
+ note: `\uC774 \uD504\uB85C\uC81D\uD2B8 \uC885\uB958(${kind})\uC758 \uC2A4\uD0AC\uC774 \uC544\uB2D9\uB2C8\uB2E4 \u2014 \uC9C0\uC6B0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD544\uC694 \uC5C6\uC73C\uBA74 \uC9C1\uC811 \uC0AD\uC81C\uD558\uC138\uC694.`
1150
+ })
1151
+ );
1152
+ return [...wanted, ...extras];
1153
+ }
1154
+ function planAgentsMd(input) {
1155
+ const { kind, target, space, projectName, existing } = input;
1156
+ const current = existing.agentsMd;
1157
+ if (current === null) {
1158
+ return {
1159
+ path: AGENTS_FILE,
1160
+ content: agentsMd({ space, projectName, target, kind }),
1161
+ reason: "create"
1162
+ };
1163
+ }
1164
+ const status = agentsMdStatus(current);
1165
+ if (status === "legacy") {
1166
+ return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1167
+ }
1168
+ if (status === "ok") return { path: AGENTS_FILE, content: null, reason: "keep" };
1169
+ const identity = parseAgentsIdentity(current);
1170
+ const block = renderManagedBlock({
1171
+ space: sanitizeIdentity(identity.space) ?? space,
1172
+ projectName: sanitizeIdentity(identity.projectName) ?? projectName,
1173
+ target,
1174
+ kind
1175
+ });
1176
+ const swapped = swapManagedBlock(current, block);
1177
+ if (swapped === null) {
1178
+ return { path: AGENTS_FILE, content: null, reason: "legacy", note: LEGACY_NOTE };
1179
+ }
1180
+ return { path: AGENTS_FILE, content: swapped, reason: "update" };
1181
+ }
1182
+ function planClaudeMd(current) {
1183
+ if (current === null) return { path: CLAUDE_FILE, content: claudeMd(), reason: "create" };
1184
+ return { path: CLAUDE_FILE, content: null, reason: "keep" };
1185
+ }
1186
+ // Annotate the CommonJS export names for ESM import in node:
1187
+ 0 && (module.exports = {
1188
+ AGENTS_MANAGED_VERSION,
1189
+ BSTAGE_SKILLS,
1190
+ VERSION,
1191
+ agentsManagedBody,
1192
+ agentsMd,
1193
+ agentsMdStatus,
1194
+ claudeMd,
1195
+ compareVersions,
1196
+ designGuideSection,
1197
+ designMeta,
1198
+ designRulesBrief,
1199
+ freeRegionScaffold,
1200
+ parseAgentsIdentity,
1201
+ planInstall,
1202
+ readManagedVersion,
1203
+ readSkillStamp,
1204
+ renderManagedBlock,
1205
+ sanitizeIdentity,
1206
+ skillFilePath,
1207
+ skillStamp,
1208
+ skillsFor,
1209
+ swapManagedBlock,
1210
+ withStamp,
1211
+ wrapManaged
1212
+ });