infernoflow 0.31.0 → 0.32.0
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.
|
@@ -224,8 +224,40 @@ function printReport(results, elapsed) {
|
|
|
224
224
|
console.log(` ${overall} — ${green(String(counts.pass))} pass · ${yellow(String(counts.warn))} warn · ${red(String(counts.fail))} fail (${elapsed}ms)`);
|
|
225
225
|
console.log();
|
|
226
226
|
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
// Prioritized action list — show concrete next steps, not just status flags
|
|
228
|
+
const actions = [];
|
|
229
|
+
|
|
230
|
+
// Failures first
|
|
231
|
+
const fails = results.filter(r => r.status === "fail");
|
|
232
|
+
for (const f of fails) {
|
|
233
|
+
if (f.fix) actions.push({ priority: "🔴", text: f.fix });
|
|
234
|
+
else actions.push({ priority: "🔴", text: `Fix: ${f.label} — ${f.message}` });
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// AI provider — very common gap, elevate it
|
|
238
|
+
const aiCheck = results.find(r => r.label === "AI providers");
|
|
239
|
+
if (aiCheck && aiCheck.status !== "pass") {
|
|
240
|
+
actions.push({ priority: "💡", text: `Connect an AI provider: ${cyan("infernoflow ai setup")} (unlocks explain, why, review, changelog)` });
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Warnings
|
|
244
|
+
const warns = results.filter(r => r.status === "warn" && r.label !== "AI providers");
|
|
245
|
+
for (const w of warns) {
|
|
246
|
+
if (w.fix) actions.push({ priority: "⚠️ ", text: w.fix });
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (actions.length > 0) {
|
|
250
|
+
console.log(` ${bold("Next steps:")}`);
|
|
251
|
+
for (const a of actions) {
|
|
252
|
+
console.log(` ${a.priority} ${a.text}`);
|
|
253
|
+
}
|
|
254
|
+
console.log();
|
|
255
|
+
if (warns.length > 0) {
|
|
256
|
+
console.log(` ${gray("Auto-fix warnings:")} ${cyan("infernoflow doctor --fix")}`);
|
|
257
|
+
}
|
|
258
|
+
console.log();
|
|
259
|
+
} else {
|
|
260
|
+
console.log(` ${green("✓")} You're all set. Run ${cyan("infernoflow demo")} to see the full capability chain.`);
|
|
229
261
|
console.log();
|
|
230
262
|
}
|
|
231
263
|
}
|
|
@@ -439,6 +439,17 @@ export async function initCommand(args) {
|
|
|
439
439
|
if (!silent) {
|
|
440
440
|
done("infernoflow initialized!");
|
|
441
441
|
|
|
442
|
+
// AI provider nudge — show once at init if nothing is configured
|
|
443
|
+
const intPath = path.join(infernoDir, "integrations.json");
|
|
444
|
+
const hasAiKey = process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY ||
|
|
445
|
+
process.env.GOOGLE_AI_API_KEY || process.env.OPENROUTER_API_KEY ||
|
|
446
|
+
process.env.GEMINI_API_KEY;
|
|
447
|
+
if (!hasAiKey && !fs.existsSync(intPath)) {
|
|
448
|
+
console.log();
|
|
449
|
+
console.log(` ${yellow("💡")} ${bold("Tip:")} connect an AI provider for explain, why, review, and changelog AI.`);
|
|
450
|
+
console.log(` ${cyan("infernoflow ai setup")} — takes 60 seconds`);
|
|
451
|
+
}
|
|
452
|
+
|
|
442
453
|
nextSteps([
|
|
443
454
|
cyan("infernoflow status") + " — see your contract at a glance",
|
|
444
455
|
cyan("infernoflow check") + " — validate everything",
|