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
- if (counts.warn > 0 || counts.fail > 0) {
228
- console.log(` Run ${cyan("infernoflow doctor --fix")} to auto-fix warnings`);
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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infernoflow",
3
- "version": "0.31.0",
3
+ "version": "0.32.0",
4
4
  "description": "The forge for liquid code - keep capabilities, contracts, and docs in sync.",
5
5
  "type": "module",
6
6
  "bin": {