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 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
  });