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