@zephyrdeng/pi-review 0.4.2 → 0.4.4
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 +4 -5
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +4 -0
- package/dist/args.js.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/update.d.ts +2 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +64 -0
- package/dist/update.js.map +1 -0
- package/extensions/review.ts +7 -87
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -159,15 +159,14 @@ Override defaults via environment variables:
|
|
|
159
159
|
|
|
160
160
|
## Pi Package Usage
|
|
161
161
|
|
|
162
|
-
After installing as a Pi package, use the `/
|
|
162
|
+
After installing as a Pi package, use the `/rv` slash command:
|
|
163
163
|
|
|
164
164
|
```
|
|
165
|
-
/
|
|
166
|
-
/
|
|
167
|
-
/pi-review models
|
|
165
|
+
/rv @src/foo.ts
|
|
166
|
+
/rv --mode challenge @docs/design.md
|
|
168
167
|
```
|
|
169
168
|
|
|
170
|
-
The `/
|
|
169
|
+
The `/rv` command sends the review request to the agent, which uses the pi-review skill to run an isolated review session.
|
|
171
170
|
|
|
172
171
|
## Security
|
|
173
172
|
|
package/dist/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA6C7C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmFpD"}
|
package/dist/args.js
CHANGED
|
@@ -2,6 +2,7 @@ function usage(exitCode = 0) {
|
|
|
2
2
|
const out = `Usage:
|
|
3
3
|
pi-review models [search]
|
|
4
4
|
pi-review [options] -- <@files|text...>
|
|
5
|
+
pi-review update Update to the latest version
|
|
5
6
|
pi-review install-skill [options] Install skill to AI agents
|
|
6
7
|
pi-review uninstall-skill [options] Remove skill from AI agents
|
|
7
8
|
|
|
@@ -50,6 +51,9 @@ export function parseArgs(argv) {
|
|
|
50
51
|
if (argv[0] === "uninstall-skill") {
|
|
51
52
|
return { command: "uninstall-skill", extraArgs: argv.slice(1), mode: "code", skills: [], payload: [], keepSession: false };
|
|
52
53
|
}
|
|
54
|
+
if (argv[0] === "update") {
|
|
55
|
+
return { command: "update", mode: "code", skills: [], payload: [], keepSession: false };
|
|
56
|
+
}
|
|
53
57
|
let mode = "code";
|
|
54
58
|
if (argv[0] && !argv[0].startsWith("-")) {
|
|
55
59
|
mode = argv.shift();
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAEA,SAAS,KAAK,CAAC,QAAQ,GAAG,CAAC;IACzB,MAAM,GAAG,GAAG
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -3,11 +3,15 @@ import { parseArgs } from "./args.js";
|
|
|
3
3
|
import { runModels, runReview } from "./review.js";
|
|
4
4
|
import { resolveConfig } from "./config.js";
|
|
5
5
|
import { installSkill, uninstallSkill } from "./skill.js";
|
|
6
|
+
import { runUpdate } from "./update.js";
|
|
6
7
|
const parsed = parseArgs(process.argv.slice(2));
|
|
7
8
|
if (parsed.command === "models") {
|
|
8
9
|
const config = resolveConfig();
|
|
9
10
|
runModels(config.piBin, parsed.search || []);
|
|
10
11
|
}
|
|
12
|
+
else if (parsed.command === "update") {
|
|
13
|
+
runUpdate();
|
|
14
|
+
}
|
|
11
15
|
else if (parsed.command === "install-skill") {
|
|
12
16
|
installSkill(parsed.extraArgs);
|
|
13
17
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;IACvC,SAAS,EAAE,CAAC;AACd,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;IAC9C,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;KAAM,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;IAChD,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;KAAM,CAAC;IACN,SAAS,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const VERDICTS: readonly ["approve", "request_changes", "needs_clarification", "blocked"];
|
|
2
2
|
export type Verdict = (typeof VERDICTS)[number];
|
|
3
3
|
export interface ParsedArgs {
|
|
4
|
-
command: "review" | "models" | "install-skill" | "uninstall-skill";
|
|
4
|
+
command: "review" | "models" | "install-skill" | "uninstall-skill" | "update";
|
|
5
5
|
extraArgs?: string[];
|
|
6
6
|
mode: string;
|
|
7
7
|
skills: string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,2EAA4E,CAAC;AAClG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,2EAA4E,CAAC;AAClG,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,eAAe,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IAC9E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,QAAQ,GAAG,UAAU,GAAG,eAAe,CAAC;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/dist/update.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AA6BA,wBAAgB,SAAS,IAAI,IAAI,CA4ChC"}
|
package/dist/update.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
const PKG_NAME = "@zephyrdeng/pi-review";
|
|
4
|
+
function getCurrentVersion() {
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const pkg = require("../package.json");
|
|
7
|
+
return pkg.version;
|
|
8
|
+
}
|
|
9
|
+
function getLatestVersion() {
|
|
10
|
+
const result = spawnSync("npm", ["view", PKG_NAME, "version"], {
|
|
11
|
+
encoding: "utf8",
|
|
12
|
+
timeout: 15_000,
|
|
13
|
+
});
|
|
14
|
+
return result.status === 0 ? result.stdout.trim() : null;
|
|
15
|
+
}
|
|
16
|
+
function box(lines) {
|
|
17
|
+
const width = Math.max(...lines.map((l) => l.length));
|
|
18
|
+
const pad = (s) => s + " ".repeat(width - s.length);
|
|
19
|
+
const top = `╭${"─".repeat(width + 2)}╮`;
|
|
20
|
+
const bot = `╰${"─".repeat(width + 2)}╯`;
|
|
21
|
+
const empty = `│${" ".repeat(width + 2)}│`;
|
|
22
|
+
const body = lines.map((l) => `│ ${pad(l)} │`).join("\n");
|
|
23
|
+
return `${top}\n${empty}\n${body}\n${empty}\n${bot}\n`;
|
|
24
|
+
}
|
|
25
|
+
export function runUpdate() {
|
|
26
|
+
const current = getCurrentVersion();
|
|
27
|
+
const latest = getLatestVersion();
|
|
28
|
+
if (!latest) {
|
|
29
|
+
process.stderr.write(box(["Failed to fetch latest version from npm registry"]));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
if (current === latest) {
|
|
33
|
+
process.stdout.write(box([
|
|
34
|
+
`pi-review v${current}`,
|
|
35
|
+
"",
|
|
36
|
+
"Already up to date ✓",
|
|
37
|
+
]));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
process.stdout.write(box([
|
|
41
|
+
`Update available: ${current} → ${latest}`,
|
|
42
|
+
"",
|
|
43
|
+
"Updating...",
|
|
44
|
+
]));
|
|
45
|
+
const install = spawnSync("npm", ["install", "-g", `${PKG_NAME}@latest`], {
|
|
46
|
+
encoding: "utf8",
|
|
47
|
+
stdio: "inherit",
|
|
48
|
+
timeout: 60_000,
|
|
49
|
+
});
|
|
50
|
+
if (install.status !== 0) {
|
|
51
|
+
process.stderr.write(box([
|
|
52
|
+
"Update failed. Run manually:",
|
|
53
|
+
"",
|
|
54
|
+
`npm install -g ${PKG_NAME}@latest`,
|
|
55
|
+
]));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
process.stdout.write(box([
|
|
59
|
+
`Updated: ${current} → ${latest}`,
|
|
60
|
+
"",
|
|
61
|
+
"Done ✓",
|
|
62
|
+
]));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
package/extensions/review.ts
CHANGED
|
@@ -1,63 +1,14 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
import { spawnSync } from "node:child_process";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
|
|
5
|
-
const KNOWN_MODES = new Set(["code", "plan", "challenge"]);
|
|
6
|
-
|
|
7
|
-
function splitArgs(input: string): string[] {
|
|
8
|
-
const args: string[] = [];
|
|
9
|
-
let current = "";
|
|
10
|
-
let quote: '"' | "'" | null = null;
|
|
11
|
-
let escaping = false;
|
|
12
|
-
|
|
13
|
-
for (const ch of input) {
|
|
14
|
-
if (escaping) {
|
|
15
|
-
current += ch;
|
|
16
|
-
escaping = false;
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
if (ch === "\\" && quote !== "'") {
|
|
20
|
-
escaping = true;
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
if ((ch === '"' || ch === "'") && !quote) {
|
|
24
|
-
quote = ch;
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (quote === ch) {
|
|
28
|
-
quote = null;
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (!quote && /\s/.test(ch)) {
|
|
32
|
-
if (current) {
|
|
33
|
-
args.push(current);
|
|
34
|
-
current = "";
|
|
35
|
-
}
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
current += ch;
|
|
39
|
-
}
|
|
40
|
-
if (current) args.push(current);
|
|
41
|
-
return args;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function normalizeReviewArgs(args: string[]): string[] {
|
|
45
|
-
if (args.length === 0) return args;
|
|
46
|
-
const first = args[0];
|
|
47
|
-
if (first === "models" || first === "--" || first.startsWith("--") || KNOWN_MODES.has(first)) {
|
|
48
|
-
return args;
|
|
49
|
-
}
|
|
50
|
-
return ["--", ...args];
|
|
51
|
-
}
|
|
52
2
|
|
|
53
3
|
export default function piReviewExtension(pi: ExtensionAPI) {
|
|
54
|
-
pi.registerCommand("
|
|
55
|
-
description: "
|
|
4
|
+
pi.registerCommand("rv", {
|
|
5
|
+
description: "Delegate a pi-review to the agent. Usage: /rv @file-or-text",
|
|
56
6
|
getArgumentCompletions: (prefix) => {
|
|
57
7
|
const items = [
|
|
58
8
|
"@",
|
|
59
9
|
"--mode challenge",
|
|
60
10
|
"--mode plan",
|
|
11
|
+
"--model ",
|
|
61
12
|
"--keep-session",
|
|
62
13
|
"models",
|
|
63
14
|
];
|
|
@@ -65,43 +16,12 @@ export default function piReviewExtension(pi: ExtensionAPI) {
|
|
|
65
16
|
return filtered.length ? filtered.map((value) => ({ value, label: value })) : null;
|
|
66
17
|
},
|
|
67
18
|
handler: async (rawArgs, ctx) => {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (parsedArgs.length === 0) {
|
|
72
|
-
ctx.ui.notify("Usage: /pi-review [--mode challenge] @file-or-text", "warning");
|
|
19
|
+
const trimmed = rawArgs.trim();
|
|
20
|
+
if (!trimmed) {
|
|
21
|
+
ctx.ui.notify("Usage: /rv [--mode challenge] @file-or-text", "warning");
|
|
73
22
|
return;
|
|
74
23
|
}
|
|
75
|
-
|
|
76
|
-
ctx.ui.notify("Running isolated pi-review session...", "info");
|
|
77
|
-
const result = spawnSync(process.execPath, [cliPath, ...parsedArgs], {
|
|
78
|
-
cwd: ctx.cwd || process.cwd(),
|
|
79
|
-
env: process.env,
|
|
80
|
-
encoding: "utf8",
|
|
81
|
-
maxBuffer: 50 * 1024 * 1024,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const stdout = result.stdout || "";
|
|
85
|
-
const stderr = result.stderr || "";
|
|
86
|
-
const content = [stdout, stderr ? `\n\n--- stderr ---\n${stderr}` : ""].join("").trim();
|
|
87
|
-
const status = result.status ?? (result.error ? 1 : 0);
|
|
88
|
-
|
|
89
|
-
pi.sendMessage({
|
|
90
|
-
customType: "pi-review",
|
|
91
|
-
content: content || `pi-review exited with status ${status}`,
|
|
92
|
-
display: true,
|
|
93
|
-
details: {
|
|
94
|
-
argv: parsedArgs,
|
|
95
|
-
status,
|
|
96
|
-
error: result.error?.message,
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
if (status === 0) {
|
|
101
|
-
ctx.ui.notify("pi-review completed", "info");
|
|
102
|
-
} else {
|
|
103
|
-
ctx.ui.notify(`pi-review failed with status ${status}`, "error");
|
|
104
|
-
}
|
|
24
|
+
pi.sendUserMessage(`使用 pi-review 审查: ${trimmed}`);
|
|
105
25
|
},
|
|
106
26
|
});
|
|
107
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zephyrdeng/pi-review",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"description": "Isolated AI-powered code and plan reviews from the command line",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "ZephyrDeng <zephyrTang@aliyun.com>",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"./skills"
|
|
50
50
|
]
|
|
51
51
|
},
|
|
52
|
-
"peerDependencies": {
|
|
52
|
+
"peerDependencies": {
|
|
53
53
|
"@earendil-works/pi-coding-agent": "*"
|
|
54
54
|
},
|
|
55
55
|
"peerDependenciesMeta": {
|