@zephyrdeng/pi-review 0.19.0 → 0.20.1
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 -0
- package/README.zh-CN.md +1 -0
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +18 -0
- package/dist/args.js.map +1 -1
- package/dist/claude-plugin-sync.test.d.ts +2 -0
- package/dist/claude-plugin-sync.test.d.ts.map +1 -0
- package/dist/claude-plugin-sync.test.js +33 -0
- package/dist/claude-plugin-sync.test.js.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/meta-footer.d.ts +5 -1
- package/dist/meta-footer.d.ts.map +1 -1
- package/dist/meta-footer.js +13 -0
- package/dist/meta-footer.js.map +1 -1
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +6 -1
- package/dist/panel.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +5 -1
- package/dist/review.js.map +1 -1
- package/dist/types.d.ts +64 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/verify-cli.d.ts +14 -0
- package/dist/verify-cli.d.ts.map +1 -0
- package/dist/verify-cli.js +223 -0
- package/dist/verify-cli.js.map +1 -0
- package/dist/verify-cli.test.d.ts +2 -0
- package/dist/verify-cli.test.d.ts.map +1 -0
- package/dist/verify-cli.test.js +237 -0
- package/dist/verify-cli.test.js.map +1 -0
- package/dist/verify-regression.test.d.ts +2 -0
- package/dist/verify-regression.test.d.ts.map +1 -0
- package/dist/verify-regression.test.js +307 -0
- package/dist/verify-regression.test.js.map +1 -0
- package/dist/verify.d.ts +172 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +816 -0
- package/dist/verify.js.map +1 -0
- package/dist/verify.test.d.ts +2 -0
- package/dist/verify.test.d.ts.map +1 -0
- package/dist/verify.test.js +592 -0
- package/dist/verify.test.js.map +1 -0
- package/package.json +1 -1
- package/resources/review-presets.json +3 -3
- package/skills/pi-review/SKILL.md +25 -0
package/dist/verify.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { stepExecuted } from "./meta-footer.js";
|
|
2
|
+
import type { ParsedArgs, SplitPayload, VerificationApproval, VerificationStepResult, VerificationSummary } from "./types.js";
|
|
3
|
+
export declare const VERIFY_CONFIG_FILE = ".pi-review.json";
|
|
4
|
+
export declare const DEFAULT_STEP_TIMEOUT_SEC = 300;
|
|
5
|
+
export declare const MAX_STEP_TIMEOUT_SEC = 1800;
|
|
6
|
+
export declare const OUTPUT_TAIL_LIMIT = 4000;
|
|
7
|
+
export declare const DEFAULT_MAX_FOLLOW_UP_ROUNDS = 1;
|
|
8
|
+
export interface PlanFile {
|
|
9
|
+
path: string;
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PlanStep {
|
|
13
|
+
id: string;
|
|
14
|
+
argv: string[];
|
|
15
|
+
purpose: string;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
expectedDurationSec?: number;
|
|
18
|
+
sideEffects?: string;
|
|
19
|
+
idempotent?: boolean;
|
|
20
|
+
isolated?: boolean;
|
|
21
|
+
timeoutSec?: number;
|
|
22
|
+
round?: number;
|
|
23
|
+
files?: PlanFile[];
|
|
24
|
+
}
|
|
25
|
+
export interface VerificationPlan {
|
|
26
|
+
version: 1;
|
|
27
|
+
proposer?: "host" | "pi";
|
|
28
|
+
summary?: string;
|
|
29
|
+
steps: PlanStep[];
|
|
30
|
+
}
|
|
31
|
+
export interface WhitelistCommand {
|
|
32
|
+
id: string;
|
|
33
|
+
argv: string[];
|
|
34
|
+
timeoutSec?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface VerifyRepoConfig {
|
|
37
|
+
commands: WhitelistCommand[];
|
|
38
|
+
link: string[];
|
|
39
|
+
maxFollowUpRounds: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ApprovalDecision {
|
|
42
|
+
id: string;
|
|
43
|
+
stepSha256: string;
|
|
44
|
+
/** What the step executes (argv, cwd, files); absent in older records, which stay id-scoped. */
|
|
45
|
+
commandSha256?: string;
|
|
46
|
+
decision: "approved" | "rejected";
|
|
47
|
+
}
|
|
48
|
+
export interface ApprovalRecord {
|
|
49
|
+
version: 1;
|
|
50
|
+
planSha256: string;
|
|
51
|
+
approvedBy?: string;
|
|
52
|
+
approvedAt?: string;
|
|
53
|
+
decisions: ApprovalDecision[];
|
|
54
|
+
}
|
|
55
|
+
/** Invalid plan / approval / config input (a usage problem, not a run failure). */
|
|
56
|
+
export declare class VerifyInputError extends Error {
|
|
57
|
+
constructor(message: string);
|
|
58
|
+
}
|
|
59
|
+
export declare function sha256(text: string): string;
|
|
60
|
+
/** Content hash an approval binds to; any edit to the step changes it. */
|
|
61
|
+
export declare function stepSha256(step: PlanStep): string;
|
|
62
|
+
/**
|
|
63
|
+
* Execution identity: what the step runs (argv, cwd, files), without its id or
|
|
64
|
+
* description. A human rejection binds to it, so re-proposing the same command
|
|
65
|
+
* under a new id or new wording is still rejected.
|
|
66
|
+
*/
|
|
67
|
+
export declare function commandSha256(step: Pick<PlanStep, "argv" | "cwd" | "files">): string;
|
|
68
|
+
export declare function planSha256(plan: VerificationPlan): string;
|
|
69
|
+
/** A relative path that stays inside its root (no absolute paths, no `..`). */
|
|
70
|
+
export declare function isSafeRelativePath(value: unknown): value is string;
|
|
71
|
+
/** Validate a plan object. Throws VerifyInputError with the first problem found. */
|
|
72
|
+
export declare function parsePlan(raw: unknown, maxFollowUpRounds?: number): VerificationPlan;
|
|
73
|
+
/** Parse `.pi-review.json` text. Only the `verify` key is read. */
|
|
74
|
+
export declare function parseRepoConfig(text: string): VerifyRepoConfig;
|
|
75
|
+
export declare function parseApproval(raw: unknown): ApprovalRecord;
|
|
76
|
+
/** Build an approval record for the plan's current content. */
|
|
77
|
+
export declare function createApproval(plan: VerificationPlan, options: {
|
|
78
|
+
all?: boolean;
|
|
79
|
+
approve?: string[];
|
|
80
|
+
reject?: string[];
|
|
81
|
+
by?: string;
|
|
82
|
+
now?: Date;
|
|
83
|
+
}): ApprovalRecord;
|
|
84
|
+
export interface ResolvedStep {
|
|
85
|
+
step: PlanStep;
|
|
86
|
+
origin: "whitelist" | "plan";
|
|
87
|
+
approval: VerificationApproval;
|
|
88
|
+
sha: string;
|
|
89
|
+
/** Effective timeout: the step's own, else the matching whitelist entry's. */
|
|
90
|
+
timeoutSec?: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Decide which steps may run. Without a plan, every whitelist command runs.
|
|
94
|
+
* With a plan: a rejection of this exact step, or of the same command under
|
|
95
|
+
* any id or wording (commandSha256), wins; a rejection recorded for a
|
|
96
|
+
* different version of the step makes it `stale` (never whitelist pre-approved);
|
|
97
|
+
* then exact-argv whitelist matches (no files, no cwd) are pre-approved; then a
|
|
98
|
+
* matching approval; any other decision for the same id is `stale`.
|
|
99
|
+
*/
|
|
100
|
+
export declare function resolveSteps(plan: VerificationPlan | undefined, config: VerifyRepoConfig, approvals: ApprovalRecord[]): ResolvedStep[];
|
|
101
|
+
export declare function isRunnable(approval: VerificationApproval): boolean;
|
|
102
|
+
/** Effective per-step timeout: own or whitelist budget, else the default, capped at the maximum. */
|
|
103
|
+
export declare function effectiveTimeoutSec(resolved: Pick<ResolvedStep, "timeoutSec">): number;
|
|
104
|
+
export { stepExecuted };
|
|
105
|
+
/** Overall status from step outcomes (tree guard and setup errors are applied by the caller). */
|
|
106
|
+
export declare function overallStatus(steps: VerificationStepResult[]): VerificationSummary["status"];
|
|
107
|
+
/** Minimal environment for verification commands: allowlist minus anything secret-shaped. */
|
|
108
|
+
export declare function verificationEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
109
|
+
export interface CommandResult {
|
|
110
|
+
exitCode: number | null;
|
|
111
|
+
signal?: string;
|
|
112
|
+
timedOut: boolean;
|
|
113
|
+
durationMs: number;
|
|
114
|
+
outputTail: string;
|
|
115
|
+
truncated: boolean;
|
|
116
|
+
error?: string;
|
|
117
|
+
/** Informational; never changes the step status (e.g. output may be incomplete). */
|
|
118
|
+
note?: string;
|
|
119
|
+
}
|
|
120
|
+
/** Run argv without a shell in its own process group, with a timeout and a bounded output tail. */
|
|
121
|
+
export declare function runCommand(argv: string[], options: {
|
|
122
|
+
cwd: string;
|
|
123
|
+
env: NodeJS.ProcessEnv;
|
|
124
|
+
timeoutMs: number;
|
|
125
|
+
outputLimit?: number;
|
|
126
|
+
}): Promise<CommandResult>;
|
|
127
|
+
/** Porcelain status of the original tree, compared before/after verification. */
|
|
128
|
+
export declare function gitStatusSnapshot(repoRoot: string): string;
|
|
129
|
+
/** Read the standing whitelist from HEAD; uncommitted edits never grant pre-approval. */
|
|
130
|
+
export declare function loadRepoConfig(repoRoot: string): VerifyRepoConfig;
|
|
131
|
+
/** Resolve `rel` inside `root`, refusing paths that escape it (including through symlinks). */
|
|
132
|
+
export declare function resolveInside(root: string, rel: string): string;
|
|
133
|
+
export interface IsolatedCopy {
|
|
134
|
+
dir: string;
|
|
135
|
+
cleanup: () => void;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Snapshot HEAD + tracked changes + untracked non-ignored files through a
|
|
139
|
+
* throwaway index (the real index, tree, and stash stay untouched), then
|
|
140
|
+
* check it out as a detached worktree with hooks disabled.
|
|
141
|
+
*/
|
|
142
|
+
export declare function createIsolatedCopy(repoRoot: string, link?: string[], base?: string): IsolatedCopy;
|
|
143
|
+
export interface RunVerificationOptions {
|
|
144
|
+
cwd: string;
|
|
145
|
+
planFile?: string;
|
|
146
|
+
approvalFiles?: string[];
|
|
147
|
+
env?: NodeJS.ProcessEnv;
|
|
148
|
+
onLog?: (line: string) => void;
|
|
149
|
+
/** Test seam: override the per-step output tail size. */
|
|
150
|
+
outputLimit?: number;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Run verification once. Never throws: every setup problem degrades to
|
|
154
|
+
* `status: "unverified"` with a reason so the review still runs and says so.
|
|
155
|
+
*/
|
|
156
|
+
export declare function runVerification(options: RunVerificationOptions): Promise<VerificationSummary>;
|
|
157
|
+
/** Reviewer-prompt section carrying the shared verification evidence. */
|
|
158
|
+
export declare function formatVerificationSection(summary: VerificationSummary): string;
|
|
159
|
+
/**
|
|
160
|
+
* Evidence applies only to targets in the verified repository at the verified
|
|
161
|
+
* HEAD. A target in another repository (or none), or a HEAD that moved since
|
|
162
|
+
* the snapshot, degrades the summary to `unverified` with the reason.
|
|
163
|
+
* `cwd` is always checked, so a text-only target still catches a moved HEAD.
|
|
164
|
+
*/
|
|
165
|
+
export declare function bindVerificationToTargets(summary: VerificationSummary, targets: string[], cwd?: string): VerificationSummary;
|
|
166
|
+
/** Review targets (file refs and path targets) that evidence must match. */
|
|
167
|
+
export declare function payloadTargets(payload: Pick<SplitPayload, "fileRefs" | "attachableFileRefs" | "pathTargets">): string[];
|
|
168
|
+
/** Run verification for a review/loop round when it was requested; undefined otherwise. */
|
|
169
|
+
export declare function verificationForReview(parsed: Pick<ParsedArgs, "verify" | "verifyPlan" | "verifyApprovals">, quiet?: boolean, targets?: string[]): Promise<VerificationSummary | undefined>;
|
|
170
|
+
/** Append the shared verification section to a reviewer prompt (identity when verification is off). */
|
|
171
|
+
export declare function withVerificationSection(prompt: string, summary: VerificationSummary | undefined): string;
|
|
172
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|