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 +1 -1
- package/dist/bin/pai.js +56 -82
- package/dist/bin/pai.js.map +1 -1
- package/dist/cli/index.js +56 -82
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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 (
|
|
3485
|
-
description: "\uAC1D\uCCB4 \uBAA8\uB378 \uCEE8\uD14D\uC2A4\uD2B8
|
|
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/
|
|
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:
|
|
4844
|
+
const { createSpinner: createSpinner3 } = await Promise.resolve().then(() => (init_progress(), progress_exports));
|
|
4842
4845
|
await sleep2(2e3);
|
|
4843
|
-
const spinner =
|
|
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
|
|
4910
|
+
let yoloAlreadyAliased = false;
|
|
4885
4911
|
try {
|
|
4886
4912
|
const rcContent = await fs15.readFile(shellRc, "utf8");
|
|
4887
|
-
|
|
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
|
-
|
|
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: `
|
|
4932
|
-
{ name: `
|
|
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
|
-
|
|
4937
|
-
|
|
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 {
|
|
4952
|
-
const
|
|
4953
|
-
|
|
4954
|
-
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
|
|
4958
|
-
|
|
4959
|
-
|
|
4960
|
-
|
|
4961
|
-
|
|
4962
|
-
hint(
|
|
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
|
-
|
|
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 =
|
|
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}`));
|