pai-zero 0.11.2 → 0.11.3

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/README.md CHANGED
@@ -71,7 +71,7 @@ pai grade --fail-under 70 --output report.md
71
71
  - **OMC 설치 방식 전환**: 기존 `npx -y github:Yeachan-Heo/oh-my-claudecode install` 호출을 제거하고, Claude Code 네이티브 플러그인 마켓플레이스에 등록하는 방식으로 바꿨습니다.
72
72
  - PAI는 `~/.claude/settings.json`에 `extraKnownMarketplaces.omc`와 `enabledPlugins["oh-my-claudecode@omc"]`만 안전 병합합니다. 실제 설치는 Claude Code 기동 시 자동으로 수행됩니다.
73
73
  - **이점**: 공급망 안전성↑, 버전 고정 가능, 사내망/Windows 호환성↑, 제거 단순화.
74
- - 등록 실패 시 사용자에게 수동 명령 `/plugin install Yeachan-Heo/oh-my-claudecode` 안내만 제공합니다 (npx 폴백 없음).
74
+ - 등록 실패 시 사용자에게 수동 명령 `/plugin install SoInKyu/oh-my-claudecode` 안내만 제공합니다 (npx 폴백 없음).
75
75
  - **명령어 이름 정리**(예정): `pai env setup → add`, `doctor → check`, `evaluate → grade`, `validate → test`, `pipeline → run`, `/pai install → /pai add`. v0.12에서 alias 도입, v0.13에서 구 명령어 제거 예정.
76
76
 
77
77
  ---
package/dist/bin/pai.js CHANGED
@@ -3478,13 +3478,15 @@ var init_detector = __esm({
3478
3478
  label: "roboco (AI \uC9C4\uB2E8)",
3479
3479
  description: "\uC124\uCE58 \uC0C1\uD0DC \uD3C9\uAC00 \uBC0F AI \uC900\uBE44\uB3C4 \uB9AC\uD3EC\uD2B8 \uC0DD\uC131",
3480
3480
  modes: ["prototype", "poc", "production"],
3481
- required: false
3481
+ required: false,
3482
+ url: "https://github.com/SoInKyu/roboco-cli"
3482
3483
  },
3483
3484
  omc: {
3484
- label: "OMC (Object Model Context)",
3485
- description: "\uAC1D\uCCB4 \uBAA8\uB378 \uCEE8\uD14D\uC2A4\uD2B8 \u2014 AI\uAC00 \uB3C4\uBA54\uC778\uC744 \uC774\uD574\uD558\uB294 \uAD6C\uC870",
3485
+ label: "OMC (oh-my-claudecode)",
3486
+ description: "\uAC1D\uCCB4 \uBAA8\uB378 \uCEE8\uD14D\uC2A4\uD2B8 + Claude Code \uBA40\uD2F0 \uC5D0\uC774\uC804\uD2B8 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uC158",
3486
3487
  modes: ["poc", "production"],
3487
- required: false
3488
+ required: false,
3489
+ url: "https://github.com/SoInKyu/oh-my-claudecode"
3488
3490
  },
3489
3491
  vercel: {
3490
3492
  label: "Vercel \uBC30\uD3EC \uC5F0\uB3D9",
@@ -3496,7 +3498,8 @@ var init_detector = __esm({
3496
3498
  label: "gstack (QA / \uD488\uC9C8\uAD00\uB9AC)",
3497
3499
  description: "\uD14C\uC2A4\uD2B8 \uC790\uB3D9\uD654 \uBC0F \uD488\uC9C8 \uAE30\uC900 \uC124\uC815",
3498
3500
  modes: ["production"],
3499
- required: false
3501
+ required: false,
3502
+ url: "https://github.com/SoInKyu/gstack"
3500
3503
  },
3501
3504
  harness: {
3502
3505
  label: "Harness Engineering (\uAC80\uC99D \uC790\uB3D9\uD654)",
@@ -4320,7 +4323,7 @@ var init_claude_settings = __esm({
4320
4323
  "use strict";
4321
4324
  init_platform();
4322
4325
  DEFAULT_MARKETPLACE_ID = "omc";
4323
- DEFAULT_MARKETPLACE_URL = "https://github.com/Yeachan-Heo/oh-my-claudecode.git";
4326
+ DEFAULT_MARKETPLACE_URL = "https://github.com/SoInKyu/oh-my-claudecode.git";
4324
4327
  DEFAULT_PLUGIN_ID = "oh-my-claudecode@omc";
4325
4328
  ClaudeSettingsError = class extends Error {
4326
4329
  constructor(message, backupPath) {
@@ -4838,9 +4841,9 @@ async function showCompletion(projectName, projectDir, extraTools, isCurrentDir)
4838
4841
  default: true
4839
4842
  }]);
4840
4843
  if (runEval) {
4841
- const { createSpinner: createSpinner2 } = await Promise.resolve().then(() => (init_progress(), progress_exports));
4844
+ const { createSpinner: createSpinner3 } = await Promise.resolve().then(() => (init_progress(), progress_exports));
4842
4845
  await sleep2(2e3);
4843
- const spinner = createSpinner2("\uBC14\uC774\uBE0C\uCF54\uB529 \uC0C1\uD0DC \uCCB4\uD06C \uC911...");
4846
+ const spinner = createSpinner3("\uBC14\uC774\uBE0C\uCF54\uB529 \uC0C1\uD0DC \uCCB4\uD06C \uC911...");
4844
4847
  try {
4845
4848
  const { analyzeRepository: analyzeRepository2 } = await Promise.resolve().then(() => (init_analyzer2(), analyzer_exports2));
4846
4849
  const { computeResult: computeResult2 } = await Promise.resolve().then(() => (init_scorer(), scorer_exports));
@@ -4879,97 +4882,68 @@ async function showCompletion(projectName, projectDir, extraTools, isCurrentDir)
4879
4882
  success("\uC774\uC81C Claude Code\uC640 \uD568\uAED8 PRD \uBB38\uC11C\uB97C \uC791\uC131\uD558\uC138\uC694.");
4880
4883
  console.log("");
4881
4884
  console.log(colors.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4885
+ console.log("");
4886
+ const { createSpinner: createSpinner2 } = await Promise.resolve().then(() => (init_progress(), progress_exports));
4887
+ const omcSpinner = createSpinner2("OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC911...");
4888
+ try {
4889
+ const { enableOmcPlugin: enableOmcPlugin2 } = await Promise.resolve().then(() => (init_claude_settings(), claude_settings_exports));
4890
+ const result = await enableOmcPlugin2();
4891
+ if (result.action === "already-enabled") {
4892
+ omcSpinner.succeed("OMC \uD50C\uB7EC\uADF8\uC778 \uC774\uBBF8 \uB4F1\uB85D\uB428");
4893
+ } else if (result.action === "created") {
4894
+ omcSpinner.succeed("Claude \uC124\uC815 \uC2E0\uADDC \uC0DD\uC131 + OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC644\uB8CC");
4895
+ } else {
4896
+ omcSpinner.succeed("OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC644\uB8CC");
4897
+ }
4898
+ hint("Claude Code \uAE30\uB3D9 \uC2DC \uD50C\uB7EC\uADF8\uC778\uC774 \uC790\uB3D9 \uC124\uCE58\uB429\uB2C8\uB2E4.");
4899
+ if (result.backupPath) {
4900
+ hint(`\uC124\uC815 \uBC31\uC5C5: ${result.backupPath}`);
4901
+ }
4902
+ } catch (err) {
4903
+ const msg = err instanceof Error ? err.message : String(err);
4904
+ omcSpinner.warn(`OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC2E4\uD328 \u2014 ${msg}`);
4905
+ hint("Claude Code \uAE30\uB3D9 \uD6C4 \uC9C1\uC811 \uB4F1\uB85D\uD558\uC138\uC694:");
4906
+ hint(" /plugin install SoInKyu/oh-my-claudecode");
4907
+ }
4882
4908
  const { getShellRcPath: getShellRcPath2, hasYoloAlias: checkYolo } = await Promise.resolve().then(() => (init_platform(), platform_exports));
4883
4909
  const shellRc = getShellRcPath2();
4884
- let hasYoloAliasSet = false;
4910
+ let yoloAlreadyAliased = false;
4885
4911
  try {
4886
4912
  const rcContent = await fs15.readFile(shellRc, "utf8");
4887
- hasYoloAliasSet = checkYolo(rcContent);
4913
+ yoloAlreadyAliased = checkYolo(rcContent);
4888
4914
  } catch {
4889
4915
  }
4890
- let useYolo = false;
4891
- if (!hasYoloAliasSet) {
4892
- console.log("");
4893
- const { mode } = await inquirer.prompt([{
4894
- type: "list",
4895
- name: "mode",
4896
- message: "Claude Code \uC2E4\uD589 \uBAA8\uB4DC\uB97C \uC124\uC815\uD569\uB2C8\uB2E4:",
4897
- choices: [
4898
- { name: `\uC77C\uBC18 \uBAA8\uB4DC ${colors.dim("\u2500 \uAD8C\uD55C \uD655\uC778 \uD6C4 \uC2E4\uD589")}`, value: "normal" },
4899
- { name: `claude-YOLO mode ${colors.dim("\u2500 \uAD8C\uD55C \uD655\uC778 \uC5C6\uC774 \uC790\uB3D9 \uC2E4\uD589 (alias \uC124\uC815)")}`, value: "yolo" }
4900
- ]
4901
- }]);
4902
- if (mode === "yolo") {
4903
- useYolo = true;
4904
- const { getYoloAliasLine: getYoloAliasLine2 } = await Promise.resolve().then(() => (init_platform(), platform_exports));
4905
- const aliasLine = getYoloAliasLine2();
4906
- try {
4907
- const rcContent = await fs15.readFile(shellRc, "utf8").catch(() => "");
4908
- if (!rcContent.includes("claude-yolo")) {
4909
- await fs15.ensureDir(join11(shellRc, ".."));
4910
- await fs15.appendFile(shellRc, `
4911
- # PAI \u2014 claude-YOLO mode
4912
- ${aliasLine}
4913
- `);
4914
- await sleep2(500);
4915
- success("claude-yolo alias \uC124\uC815 \uC644\uB8CC");
4916
- hint("\uC0C8 \uD130\uBBF8\uB110\uC5D0\uC11C claude-yolo \uB85C \uC2E4\uD589 \uAC00\uB2A5");
4917
- }
4918
- } catch {
4919
- }
4920
- }
4921
- } else {
4922
- useYolo = true;
4923
- }
4924
4916
  console.log("");
4925
- const claudeCmd = useYolo ? "claude --dangerously-skip-permissions" : "claude";
4917
+ console.log(colors.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
4926
4918
  const { launch } = await inquirer.prompt([{
4927
4919
  type: "list",
4928
4920
  name: "launch",
4929
- message: "Claude Code\uB97C \uC2DC\uC791\uD560\uAE4C\uC694?",
4921
+ message: "Claude Code\uB97C \uC5B4\uB5A4 \uBAA8\uB4DC\uB85C \uC2DC\uC791\uD560\uAE4C\uC694?",
4930
4922
  choices: [
4931
- { name: `OMC + Claude \uC2DC\uC791 ${colors.dim("\u2500 oh-my-claudecode \uC124\uC815 \uD6C4 \uC2DC\uC791")}`, value: "omc" },
4932
- { name: `Claude \uBC14\uB85C \uC2DC\uC791 ${colors.dim(`\u2500 ${claudeCmd}`)}`, value: "claude" },
4933
- { name: chalk8.gray("\uB098\uC911\uC5D0 \uC9C1\uC811 \uC2E4\uD589"), value: "none" }
4923
+ { name: `claude ${colors.dim("\u2500 \uAD8C\uD55C \uD655\uC778 \uD6C4 \uC2E4\uD589 (\uC77C\uBC18 \uBAA8\uB4DC)")}`, value: "claude" },
4924
+ { name: `claude YOLO ${colors.dim("\u2500 \uAD8C\uD55C \uD655\uC778 \uC5C6\uC774 \uC790\uB3D9 \uC2E4\uD589 (--dangerously-skip-permissions)")}`, value: "yolo" }
4934
4925
  ]
4935
4926
  }]);
4936
- if (launch === "none") {
4937
- console.log("");
4938
- hint("claude \uB97C \uC785\uB825\uD558\uBA74 \uC2DC\uC791\uB429\uB2C8\uB2E4.");
4939
- console.log("");
4940
- if (!isCurrentDir) {
4941
- const { spawnSubshell: spawnSubshell2 } = await Promise.resolve().then(() => (init_platform(), platform_exports));
4942
- spawnSubshell2(projectDir);
4943
- }
4944
- return;
4945
- }
4946
- if (launch === "omc") {
4947
- console.log("");
4948
- const { createSpinner: createSpinner2 } = await Promise.resolve().then(() => (init_progress(), progress_exports));
4949
- const spinner = createSpinner2("OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC911...");
4927
+ const useYolo = launch === "yolo";
4928
+ if (useYolo && !yoloAlreadyAliased) {
4950
4929
  try {
4951
- const { enableOmcPlugin: enableOmcPlugin2, ClaudeSettingsError: ClaudeSettingsError2 } = await Promise.resolve().then(() => (init_claude_settings(), claude_settings_exports));
4952
- const result = await enableOmcPlugin2();
4953
- if (result.action === "already-enabled") {
4954
- spinner.succeed("OMC \uD50C\uB7EC\uADF8\uC778 \uC774\uBBF8 \uB4F1\uB85D\uB428");
4955
- } else if (result.action === "created") {
4956
- spinner.succeed("Claude \uC124\uC815 \uC2E0\uADDC \uC0DD\uC131 + OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC644\uB8CC");
4957
- } else {
4958
- spinner.succeed("OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC644\uB8CC");
4959
- }
4960
- hint("Claude Code \uAE30\uB3D9 \uC2DC \uD50C\uB7EC\uADF8\uC778\uC774 \uC790\uB3D9 \uC124\uCE58\uB429\uB2C8\uB2E4.");
4961
- if (result.backupPath) {
4962
- hint(`\uC124\uC815 \uBC31\uC5C5: ${result.backupPath}`);
4930
+ const { getYoloAliasLine: getYoloAliasLine2 } = await Promise.resolve().then(() => (init_platform(), platform_exports));
4931
+ const aliasLine = getYoloAliasLine2();
4932
+ const rcContent = await fs15.readFile(shellRc, "utf8").catch(() => "");
4933
+ if (!rcContent.includes("claude-yolo")) {
4934
+ await fs15.ensureDir(join11(shellRc, ".."));
4935
+ await fs15.appendFile(shellRc, `
4936
+ # PAI \u2014 claude-YOLO mode
4937
+ ${aliasLine}
4938
+ `);
4939
+ await sleep2(300);
4940
+ success("claude-yolo alias \uC124\uC815 \uC644\uB8CC");
4941
+ hint("\uC0C8 \uD130\uBBF8\uB110\uC5D0\uC11C claude-yolo \uB85C \uC2E4\uD589 \uAC00\uB2A5");
4963
4942
  }
4964
- void ClaudeSettingsError2;
4965
- } catch (err) {
4966
- const msg = err instanceof Error ? err.message : String(err);
4967
- spinner.warn(`OMC \uD50C\uB7EC\uADF8\uC778 \uB4F1\uB85D \uC2E4\uD328 \u2014 ${msg}`);
4968
- hint("Claude Code \uAE30\uB3D9 \uD6C4 \uC9C1\uC811 \uB4F1\uB85D\uD558\uC138\uC694:");
4969
- hint(" /plugin install Yeachan-Heo/oh-my-claudecode");
4943
+ } catch {
4970
4944
  }
4971
4945
  }
4972
- const cmd = claudeCmd;
4946
+ const cmd = useYolo ? "claude --dangerously-skip-permissions" : "claude";
4973
4947
  console.log("");
4974
4948
  if (!isCurrentDir) {
4975
4949
  console.log(colors.dim(` \u2192 cd ${projectName}`));