pai-zero 0.10.1 → 0.10.2
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/bin/pai.js +107 -0
- package/dist/bin/pai.js.map +1 -1
- package/dist/cli/index.js +107 -0
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1098,6 +1098,17 @@ async function provisionMcp(ctx) {
|
|
|
1098
1098
|
if (!await fs4.pathExists(readmePath)) {
|
|
1099
1099
|
await fs4.writeFile(readmePath, buildReadme(mcp), "utf8");
|
|
1100
1100
|
}
|
|
1101
|
+
const openspecPath = join3(ctx.cwd, "docs", "openspec.md");
|
|
1102
|
+
if (await fs4.pathExists(openspecPath)) {
|
|
1103
|
+
const existing = await fs4.readFile(openspecPath, "utf8");
|
|
1104
|
+
if (!existing.includes("## MCP \uC11C\uBC84")) {
|
|
1105
|
+
const section2 = buildOpenSpecMcpSection(mcp);
|
|
1106
|
+
await fs4.appendFile(openspecPath, `
|
|
1107
|
+
|
|
1108
|
+
${section2}
|
|
1109
|
+
`);
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1101
1112
|
const mcpJsonPath = join3(ctx.cwd, ".mcp.json");
|
|
1102
1113
|
const mcpJson = await fs4.pathExists(mcpJsonPath) ? await fs4.readJson(mcpJsonPath) : { mcpServers: {} };
|
|
1103
1114
|
mcpJson.mcpServers[mcp.name] = {
|
|
@@ -1162,6 +1173,70 @@ main().catch((err) => {
|
|
|
1162
1173
|
});
|
|
1163
1174
|
`;
|
|
1164
1175
|
}
|
|
1176
|
+
function buildOpenSpecMcpSection(mcp) {
|
|
1177
|
+
const isPublic = mcp.type === "tools-public";
|
|
1178
|
+
const hasTools = mcp.type === "tools" || mcp.type === "tools-public" || mcp.type === "all";
|
|
1179
|
+
const hasResources = mcp.type === "resources" || mcp.type === "all";
|
|
1180
|
+
const hasPrompts = mcp.type === "prompts" || mcp.type === "all";
|
|
1181
|
+
const lines = [
|
|
1182
|
+
"## MCP \uC11C\uBC84 (\uC790\uB3D9 \uC0DD\uC131\uB428)",
|
|
1183
|
+
"",
|
|
1184
|
+
"\uC774 \uD504\uB85C\uC81D\uD2B8\uB294 MCP(Model Context Protocol) \uC11C\uBC84\uB97C \uD3EC\uD568\uD569\uB2C8\uB2E4.",
|
|
1185
|
+
"`/pai design` \uC2E4\uD589 \uC2DC \uC544\uB798 \uD45C\uB97C \uC2EC\uCE35 \uC778\uD130\uBDF0\uB85C \uCC44\uC6B0\uC138\uC694.",
|
|
1186
|
+
"",
|
|
1187
|
+
`- **\uC774\uB984**: ${mcp.name}`,
|
|
1188
|
+
`- **\uD0C0\uC785**: ${mcp.type}`
|
|
1189
|
+
];
|
|
1190
|
+
if (isPublic) {
|
|
1191
|
+
lines.push(
|
|
1192
|
+
"- **\uC778\uD504\uB77C**: Supabase (api_keys, usage_logs)",
|
|
1193
|
+
"- **\uB808\uC774\uD2B8 \uB9AC\uBC0B**: 100\uD68C/\uC2DC\uAC04 (\uAE30\uBCF8\uAC12)",
|
|
1194
|
+
"- **\uAD00\uB9AC \uD654\uBA74**: `/dashboard/keys`, `/dashboard/usage`"
|
|
1195
|
+
);
|
|
1196
|
+
}
|
|
1197
|
+
lines.push("", "### MCP \uB3C4\uAD6C / \uB9AC\uC18C\uC2A4 / \uD504\uB86C\uD504\uD2B8 \uC124\uACC4");
|
|
1198
|
+
if (hasTools) {
|
|
1199
|
+
lines.push(
|
|
1200
|
+
"",
|
|
1201
|
+
"#### Tools (AI\uAC00 \uD638\uCD9C\uD560 \uAE30\uB2A5)",
|
|
1202
|
+
"",
|
|
1203
|
+
"| \uB3C4\uAD6C \uC774\uB984 | \uC124\uBA85 | \uC785\uB825 \uD30C\uB77C\uBBF8\uD130 | \uCD9C\uB825 \uD615\uC2DD | \uB0B4\uBD80 \uB85C\uC9C1 |",
|
|
1204
|
+
"|----------|------|-------------|----------|----------|",
|
|
1205
|
+
"| TODO | TODO | TODO | TODO | TODO |"
|
|
1206
|
+
);
|
|
1207
|
+
}
|
|
1208
|
+
if (hasResources) {
|
|
1209
|
+
lines.push(
|
|
1210
|
+
"",
|
|
1211
|
+
"#### Resources (AI\uAC00 \uC77D\uC744 \uCEE8\uD14D\uC2A4\uD2B8)",
|
|
1212
|
+
"",
|
|
1213
|
+
"| URI | \uC774\uB984 | \uC124\uBA85 | MIME \uD0C0\uC785 |",
|
|
1214
|
+
"|-----|------|------|----------|",
|
|
1215
|
+
"| TODO | TODO | TODO | TODO |"
|
|
1216
|
+
);
|
|
1217
|
+
}
|
|
1218
|
+
if (hasPrompts) {
|
|
1219
|
+
lines.push(
|
|
1220
|
+
"",
|
|
1221
|
+
"#### Prompts (\uC7AC\uC0AC\uC6A9 \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF)",
|
|
1222
|
+
"",
|
|
1223
|
+
"| \uC774\uB984 | \uC124\uBA85 | \uC778\uC790 |",
|
|
1224
|
+
"|------|------|------|",
|
|
1225
|
+
"| TODO | TODO | TODO |"
|
|
1226
|
+
);
|
|
1227
|
+
}
|
|
1228
|
+
if (isPublic) {
|
|
1229
|
+
lines.push(
|
|
1230
|
+
"",
|
|
1231
|
+
"### \uACF5\uAC1C \uBC30\uD3EC \uC124\uC815",
|
|
1232
|
+
"",
|
|
1233
|
+
"- **\uB808\uC774\uD2B8 \uB9AC\uBC0B**: TODO (\uAE30\uBCF8 100\uD68C/\uC2DC\uAC04)",
|
|
1234
|
+
"- **\uC694\uAE08\uC81C**: \uBB34\uB8CC (Stripe \uC81C\uC678)",
|
|
1235
|
+
"- **API \uD0A4 \uC815\uCC45**: \uC0AC\uC6A9\uC790\uB2F9 \uBCF5\uC218 \uD0A4 \uD5C8\uC6A9"
|
|
1236
|
+
);
|
|
1237
|
+
}
|
|
1238
|
+
return lines.join("\n");
|
|
1239
|
+
}
|
|
1165
1240
|
function buildReadme(mcp) {
|
|
1166
1241
|
const isPublic = mcp.type === "tools-public";
|
|
1167
1242
|
return `# ${mcp.name} \u2014 MCP Server
|
|
@@ -2360,6 +2435,37 @@ AskUserQuestion \uB3C4\uAD6C\uB85C \uC2EC\uCE35 \uC778\uD130\uBDF0\uB97C \uC9C4\
|
|
|
2360
2435
|
- \uAE30\uC220 \uC2A4\uD0DD (Stack)
|
|
2361
2436
|
- API \uC5D4\uB4DC\uD3EC\uC778\uD2B8
|
|
2362
2437
|
|
|
2438
|
+
## Phase 2.5: MCP \uC11C\uBC84 \uC124\uACC4 (MCP \uD504\uB85C\uC81D\uD2B8\uB9CC)
|
|
2439
|
+
|
|
2440
|
+
\\\`.pai/config.json\\\`\uC758 \\\`mcp.enabled\\\`\uAC00 true\uC774\uBA74 \uC774 Phase\uB97C \uC218\uD589\uD558\uC138\uC694:
|
|
2441
|
+
|
|
2442
|
+
1. \\\`docs/openspec.md\\\`\uC758 "## MCP \uC11C\uBC84" \uC139\uC158\uC744 \uCC3E\uC544 \uD604\uC7AC \uC815\uC758\uB41C \uB3C4\uAD6C/\uB9AC\uC18C\uC2A4/\uD504\uB86C\uD504\uD2B8 \uBAA9\uB85D \uD655\uC778
|
|
2443
|
+
2. TODO\uB85C \uCC44\uC6CC\uC9C4 \uD56D\uBAA9\uC774 \uC788\uC73C\uBA74 AskUserQuestion\uC73C\uB85C \uC2EC\uCE35 \uC778\uD130\uBDF0:
|
|
2444
|
+
|
|
2445
|
+
**Tools \uC11C\uBC84 (tools / tools-public / all)**:
|
|
2446
|
+
- "\uC774 MCP \uC11C\uBC84\uC5D0\uC11C \uC81C\uACF5\uD560 \uB3C4\uAD6C \uC774\uB984\uACFC \uAE30\uB2A5\uC740?"
|
|
2447
|
+
- "\uAC01 \uB3C4\uAD6C\uC758 \uC785\uB825 \uD30C\uB77C\uBBF8\uD130(JSON Schema)\uB294?"
|
|
2448
|
+
- "\uCD9C\uB825 \uD615\uC2DD(text/json/image)\uC740?"
|
|
2449
|
+
- "\uB0B4\uBD80 \uB85C\uC9C1\uC740 \uC5B4\uB514\uC5D0 \uAD6C\uD604? (src/lib/ \uB610\uB294 \uC678\uBD80 API \uD638\uCD9C?)"
|
|
2450
|
+
|
|
2451
|
+
**Resources \uC11C\uBC84 (resources / all)**:
|
|
2452
|
+
- "AI\uC5D0\uAC8C \uC81C\uACF5\uD560 \uCEE8\uD14D\uC2A4\uD2B8\uB294 \uBB34\uC5C7\uC778\uAC00\uC694?"
|
|
2453
|
+
- "\uAC01 \uB9AC\uC18C\uC2A4\uC758 URI \uC2A4\uD0A4\uB9C8(\uC608: \\\`wiki://pages/\\\`)\uB294?"
|
|
2454
|
+
- "MIME \uD0C0\uC785(text/plain, application/json)\uC740?"
|
|
2455
|
+
|
|
2456
|
+
**Prompts \uC11C\uBC84 (prompts / all)**:
|
|
2457
|
+
- "\uC7AC\uC0AC\uC6A9 \uD504\uB86C\uD504\uD2B8 \uC774\uB984\uACFC \uC6A9\uB3C4\uB294?"
|
|
2458
|
+
- "\uAC01 \uD504\uB86C\uD504\uD2B8\uC5D0 \uD544\uC694\uD55C \uC778\uC790\uB294?"
|
|
2459
|
+
|
|
2460
|
+
3. \uB2F5\uBCC0\uC744 \uC885\uD569\uD558\uC5EC \\\`openspec.md\\\`\uC758 MCP \uC139\uC158 \uD14C\uC774\uBE14\uC744 \uCC44\uC6C1\uB2C8\uB2E4.
|
|
2461
|
+
|
|
2462
|
+
4. **\uACF5\uAC1C \uBC30\uD3EC(tools-public)**\uC778 \uACBD\uC6B0 \uCD94\uAC00 \uC9C8\uBB38:
|
|
2463
|
+
- "\uC2DC\uAC04\uB2F9 \uB808\uC774\uD2B8 \uB9AC\uBC0B\uC744 \uBCC0\uACBD\uD560\uAE4C\uC694? (\uAE30\uBCF8 100\uD68C/\uC2DC\uAC04)"
|
|
2464
|
+
- "\uAC01 \uB3C4\uAD6C\uBCC4 \uBE44\uC6A9\uC774 \uB2E4\uB974\uAC8C \uC124\uACC4\uB418\uB098\uC694?"
|
|
2465
|
+
- "\uB300\uC2DC\uBCF4\uB4DC\uC5D0\uC11C \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD45C\uC2DC\uD560 \uBB34\uB8CC \uD55C\uB3C4\uB294?"
|
|
2466
|
+
|
|
2467
|
+
5. MCP \uC11C\uBC84\uC758 \\\`src/tools.ts\\\`, \\\`src/resources.ts\\\` \uB4F1\uC5D0 \uC124\uACC4\uB41C \uB3C4\uAD6C\uB97C \uAD6C\uD604\uD558\uB3C4\uB85D \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC548\uB0B4\uD558\uC138\uC694.
|
|
2468
|
+
|
|
2363
2469
|
## Phase 3: \uAE30\uC220 \uC81C\uC57D + \uD558\uB124\uC2A4 \uC5D4\uC9C0\uB2C8\uC5B4\uB9C1
|
|
2364
2470
|
|
|
2365
2471
|
**\uBAA9\uD45C**: AI \uC5D0\uC774\uC804\uD2B8\uAC00 \uC548\uC804\uD558\uAC8C \uC791\uC5C5\uD560 \uC218 \uC788\uB294 \uD658\uACBD \uD655\uC778
|
|
@@ -2953,6 +3059,7 @@ var init_environment = __esm({
|
|
|
2953
3059
|
await withSpinner("\uC124\uC815 \uC800\uC7A5 \uC911...", async () => {
|
|
2954
3060
|
const config = createDefaultConfig(interview.projectName, interview.mode);
|
|
2955
3061
|
config.plugins = pluginKeys;
|
|
3062
|
+
if (interview.mcp) config.mcp = interview.mcp;
|
|
2956
3063
|
await saveConfig(input.cwd, config);
|
|
2957
3064
|
await sleep(300);
|
|
2958
3065
|
});
|