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