@pimmesz/afterburner 1.0.6 → 1.0.8
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/cli/index.js +23 -9
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -31,7 +31,7 @@ import { Command } from "commander";
|
|
|
31
31
|
// package.json
|
|
32
32
|
var package_default = {
|
|
33
33
|
name: "@pimmesz/afterburner",
|
|
34
|
-
version: "1.0.
|
|
34
|
+
version: "1.0.8",
|
|
35
35
|
description: "Convert idle Claude subscription quota into shippable engineering work: budget-aware trigger, bounded task selection, PR-only output.",
|
|
36
36
|
license: "Apache-2.0",
|
|
37
37
|
publishConfig: {
|
|
@@ -337,8 +337,10 @@ async function runDoctor(opts) {
|
|
|
337
337
|
${green(`${deco(emoji.rocket)}All checks passed.`)}` : `
|
|
338
338
|
${red(`${failures} check(s) failed.`)}`
|
|
339
339
|
);
|
|
340
|
-
console.log(
|
|
341
|
-
|
|
340
|
+
console.log(
|
|
341
|
+
`
|
|
342
|
+
${renderDoctorNextSteps({ config, configPath, failed: results.filter((r) => !r.ok) })}`
|
|
343
|
+
);
|
|
342
344
|
process.exitCode = failures === 0 ? 0 : 1;
|
|
343
345
|
}
|
|
344
346
|
function renderDoctorNextSteps(opts) {
|
|
@@ -356,9 +358,13 @@ ${nextCmd("afterburner init", "three questions; writes the config and takes it f
|
|
|
356
358
|
then re-run:
|
|
357
359
|
${nextCmd(cmd("doctor"))}`;
|
|
358
360
|
}
|
|
359
|
-
if (opts.
|
|
361
|
+
if (opts.failed.length > 0) {
|
|
362
|
+
const steps = opts.failed.map(
|
|
363
|
+
(check, i) => ` ${i + 1}. ${check.fix ?? `Fix the \u2717 ${check.name} check above.`}`
|
|
364
|
+
);
|
|
360
365
|
return `${next}
|
|
361
|
-
|
|
366
|
+
${steps.join("\n")}
|
|
367
|
+
${opts.failed.length + 1}. Re-run the health check; all green ends with your first run command:
|
|
362
368
|
${nextCmd(cmd("doctor"))}`;
|
|
363
369
|
}
|
|
364
370
|
const repoNames = config.repos.map((r) => r.url);
|
|
@@ -366,13 +372,18 @@ ${nextCmd(cmd("doctor"))}`;
|
|
|
366
372
|
const engineLine = config.agent.backend === "dry-run" ? "dry-run \u2014 simulation only; set agent.backend: 'claude-code' in the config to do real work" : config.agent.backend === "claude-code" ? "claude-code \u2014 spends subscription quota you already pay for; PRs only with --live" : "api-key \u2014 bills your Anthropic API account per token (real money); PRs only with --live";
|
|
367
373
|
const budgetLine = config.budget.provider === "manual" ? "manual \u2014 trusts budget.manual (automatic option: `afterburner statusline install`, then budget.provider: 'claude-usage')" : config.budget.provider === "claude-usage" ? "claude-usage \u2014 reads your real usage via the status line hook" : "claude-code-transcripts \u2014 estimates from local Claude Code session logs";
|
|
368
374
|
const nextNote = config.agent.backend === "dry-run" ? "previews the next task; nothing is executed or spent" : `previews the next task (live execution ships in a future release; ${cmd("run-once --live")} currently validates and refuses)`;
|
|
375
|
+
const headroomClause = `weekly headroom drops below ${config.budget.minWeeklyHeadroomPct}%`;
|
|
376
|
+
const gateLine = config.budget.requireSessionAvailable ? `runs skip themselves when no 5-hour session window is free or ${headroomClause}` : `runs skip themselves when ${headroomClause}`;
|
|
369
377
|
return `${section(emoji.flame, "Ready")}
|
|
370
378
|
Config: ${configPath}
|
|
371
379
|
Repos: ${repoLine}
|
|
372
380
|
Engine: ${engineLine}
|
|
373
381
|
Budget: ${budgetLine}
|
|
382
|
+
Limits: at most one task per repo per run, capped at ${config.agent.maxTaskTokens.toLocaleString("en-US")} tokens, delivered as one PR on its own branch
|
|
383
|
+
Gate: ${gateLine}
|
|
374
384
|
Safety: live PRs need BOTH a live engine in the config AND --live (two-part opt-in)
|
|
375
|
-
|
|
385
|
+
Runs: only when you start them \u2014 \`afterburner schedule install\` (recommended OS scheduler; cron '${config.schedule.cron}' ${config.schedule.timezone}) or \`afterburner watch\` (foreground) make it recurring
|
|
386
|
+
Stop: \`afterburner schedule uninstall\` (or Ctrl-C for watch); ${cmd("log")} lists every past run
|
|
376
387
|
|
|
377
388
|
${next}
|
|
378
389
|
${nextCmd(cmd("run-once --dry-run"), nextNote)}`;
|
|
@@ -784,7 +795,7 @@ ${bold("Step 2 of 3 \u2014 Repository (the allowlist of what it may touch)")}`);
|
|
|
784
795
|
} else if (repoPath && repoPath !== targetDir) {
|
|
785
796
|
console.log(
|
|
786
797
|
dim(
|
|
787
|
-
`Note: ${repoPath} already has
|
|
798
|
+
`Note: ${repoPath} already has its own afterburner config; it stays untouched. Your settings are written to the current directory instead.`
|
|
788
799
|
)
|
|
789
800
|
);
|
|
790
801
|
}
|
|
@@ -835,8 +846,11 @@ function failShadowing(shadowing, target) {
|
|
|
835
846
|
);
|
|
836
847
|
}
|
|
837
848
|
async function confirmOverwrite(rl, target) {
|
|
838
|
-
const answer = (await rl.question(
|
|
839
|
-
|
|
849
|
+
const answer = (await rl.question(
|
|
850
|
+
`
|
|
851
|
+
The settings file ${target} already exists.
|
|
852
|
+
Overwrite it with these new answers? Only this file changes \u2014 your repo is untouched. [y/N]: `
|
|
853
|
+
)).trim().toLowerCase();
|
|
840
854
|
return answer === "y" || answer === "yes";
|
|
841
855
|
}
|
|
842
856
|
function hasConfig(dir) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pimmesz/afterburner",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Convert idle Claude subscription quota into shippable engineering work: budget-aware trigger, bounded task selection, PR-only output.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|