periderm-cli 0.1.1 → 0.1.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/index.js +16 -8
- package/dist/review/deep.js +14 -18
- package/package.json +1 -2
package/dist/index.js
CHANGED
|
@@ -151,11 +151,6 @@ program
|
|
|
151
151
|
console.error(chalk.red("Error: You must be logged in. Run `periderm login` first."));
|
|
152
152
|
process.exit(1);
|
|
153
153
|
}
|
|
154
|
-
const apiKey = process.env.GROQ_API_KEY?.trim();
|
|
155
|
-
if (!apiKey) {
|
|
156
|
-
console.error(chalk.red("Error: Set GROQ_API_KEY in your environment to run deep review."));
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
154
|
const reportPath = path.join(root, ".periderm", "last-report.json");
|
|
160
155
|
let scanResult;
|
|
161
156
|
try {
|
|
@@ -178,7 +173,7 @@ program
|
|
|
178
173
|
}
|
|
179
174
|
verifySpinner.succeed("Plan verified");
|
|
180
175
|
const reviewSpinner = ora({ text: "Starting deep review agent…", color: "cyan" }).start();
|
|
181
|
-
const { markdown, findings } = await runDeepReview(root, scanResult,
|
|
176
|
+
const { markdown, findings } = await runDeepReview(root, scanResult, cfg.token, cfg.apiUrl, (msg) => {
|
|
182
177
|
reviewSpinner.text = msg;
|
|
183
178
|
});
|
|
184
179
|
scanResult.findings.push(...findings);
|
|
@@ -379,8 +374,21 @@ program.parseAsync().catch(async (e) => {
|
|
|
379
374
|
try {
|
|
380
375
|
const formData = new FormData();
|
|
381
376
|
formData.append("name", "Periderm CLI Crash Reporter");
|
|
382
|
-
|
|
383
|
-
|
|
377
|
+
let userEmail = "support@periderm.dev";
|
|
378
|
+
try {
|
|
379
|
+
const cfg = readConfig();
|
|
380
|
+
if (cfg.token) {
|
|
381
|
+
const v = await verifyToken(cfg.token);
|
|
382
|
+
if (v.valid && v.email) {
|
|
383
|
+
userEmail = v.email;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch {
|
|
388
|
+
// ignore token verification errors during crash
|
|
389
|
+
}
|
|
390
|
+
formData.append("_replyto", userEmail);
|
|
391
|
+
const marker = `\n\n---\n[System Info: Sent from Periderm CLI]\n[User Email: ${userEmail === "support@periderm.dev" ? "Unknown" : userEmail}]`;
|
|
384
392
|
const errMsg = e instanceof Error ? `${e.message}\n${e.stack}` : String(e);
|
|
385
393
|
formData.append("message", `CLI Crash:\n\n${errMsg}${marker}`);
|
|
386
394
|
await fetch("https://formspree.io/f/mqakppnn", {
|
package/dist/review/deep.js
CHANGED
|
@@ -12,27 +12,23 @@ function stripCodeFences(text) {
|
|
|
12
12
|
const m = text.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
13
13
|
return (m?.[1] ?? text).trim();
|
|
14
14
|
}
|
|
15
|
-
async function groqJson(
|
|
16
|
-
const res = await fetch(
|
|
15
|
+
async function groqJson(token, apiUrl, system, user) {
|
|
16
|
+
const res = await fetch(`${apiUrl}/api/public/deep-review`, {
|
|
17
17
|
method: "POST",
|
|
18
18
|
headers: {
|
|
19
|
-
Authorization: `Bearer ${apiKey}`,
|
|
20
19
|
"Content-Type": "application/json",
|
|
20
|
+
"x-periderm-token": token,
|
|
21
21
|
},
|
|
22
|
-
body: JSON.stringify({
|
|
23
|
-
model: MODEL,
|
|
24
|
-
temperature: 0.2,
|
|
25
|
-
response_format: { type: "json_object" },
|
|
26
|
-
messages: [
|
|
27
|
-
{ role: "system", content: system },
|
|
28
|
-
{ role: "user", content: user },
|
|
29
|
-
],
|
|
30
|
-
}),
|
|
22
|
+
body: JSON.stringify({ system, user }),
|
|
31
23
|
});
|
|
32
|
-
if (!res.ok)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
const text = await res.text();
|
|
26
|
+
throw new Error(`Deep review API error ${res.status}: ${text.slice(0, 200)}`);
|
|
27
|
+
}
|
|
28
|
+
const data = await res.json();
|
|
29
|
+
if (!data.valid)
|
|
30
|
+
throw new Error(`Deep review failed: ${data.error}`);
|
|
31
|
+
return data.content ?? "{}";
|
|
36
32
|
}
|
|
37
33
|
async function readFileSafe(root, rel) {
|
|
38
34
|
const safe = rel.replace(/^(\.\/|\.\.\/)+/, "").replace(/\.\./g, "");
|
|
@@ -87,7 +83,7 @@ function parseAction(raw) {
|
|
|
87
83
|
return null;
|
|
88
84
|
}
|
|
89
85
|
}
|
|
90
|
-
export async function runDeepReview(root, scan,
|
|
86
|
+
export async function runDeepReview(root, scan, token, apiUrl, onStatus) {
|
|
91
87
|
const system = `You are Periderm's deep launch reviewer. Respond with JSON only.
|
|
92
88
|
|
|
93
89
|
Existing static scan found ${scan.findings.length} issues. Your job: find ADDITIONAL nuanced launch risks the deterministic scanner missed — legal/UX/business logic edge cases, contradictions, deceptive flows, subtle security gaps.
|
|
@@ -114,7 +110,7 @@ Rules: max 5 new findings, be specific, cite files, no hallucinated files.`;
|
|
|
114
110
|
const toolLog = [];
|
|
115
111
|
for (let i = 0; i < MAX_ITERATIONS; i++) {
|
|
116
112
|
onStatus?.(`Deep review · pass ${i + 1}/${MAX_ITERATIONS}…`);
|
|
117
|
-
const raw = await groqJson(
|
|
113
|
+
const raw = await groqJson(token, apiUrl, system, transcript);
|
|
118
114
|
const action = parseAction(raw);
|
|
119
115
|
if (!action) {
|
|
120
116
|
transcript += `\n\nInvalid JSON. Respond with valid JSON only.\n`;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "periderm-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "A pre-launch checklist for your codebase.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"@babel/types": "^7.25.0",
|
|
22
22
|
"chalk": "^5.3.0",
|
|
23
23
|
"commander": "^12.1.0",
|
|
24
|
-
"dotenv": "^17.4.2",
|
|
25
24
|
"fast-glob": "^3.3.2",
|
|
26
25
|
"open": "^10.1.0",
|
|
27
26
|
"ora": "^9.4.1"
|