pi-goal-list-loop-audit 0.28.17 → 0.28.18

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.
@@ -118,6 +118,11 @@ export const DEFAULT_SETTINGS: Settings = {
118
118
  };
119
119
 
120
120
  export function globalSettingsPath(): string {
121
+ // v0.28.18: test/embedding override — the suite must be hermetic from
122
+ // the developer's real global settings file (a user setting autoAccept
123
+ // globally once made draft-Confirm tests auto-accept and fail).
124
+ const override = process.env.GLLA_GLOBAL_SETTINGS_PATH;
125
+ if (override) return override;
121
126
  return path.join(os.homedir(), ".pi", "agent", "pi-goal-list-loop-audit.settings.json");
122
127
  }
123
128
 
@@ -337,8 +337,10 @@ export function buildSettingsRows(
337
337
  // TUI table component
338
338
  // =================================================================
339
339
 
340
- /** Padding + gutter between columns. */
341
- const COL_GUTTER = 2;
340
+ /** Column separator (v0.28.18: box-drawing — the menu reads as a table). */
341
+ const COL_SEP = " │ ";
342
+ /** Header-rule junction matching COL_SEP's visible width. */
343
+ const COL_RULE_SEP = "─┼─";
342
344
 
343
345
  /** Maximum width for each fixed column before truncation kicks in. */
344
346
  const MAX_KEY_W = 32;
@@ -450,15 +452,20 @@ export class SettingsMenuComponent implements Component {
450
452
  let keyW = visibleWidth(this.theme.bold("KEY"));
451
453
  let valueW = visibleWidth(this.theme.bold("VALUE"));
452
454
  let sourceW = visibleWidth(this.theme.bold("SOURCE"));
453
- for (const r of this.visibleRows()) {
454
- if (visibleWidth(r.label) > keyW) keyW = visibleWidth(r.label);
455
+ // v0.28.18: widths are computed across ALL sections (not just the
456
+ // active one) so the grid does NOT reflow on tab switch — a table's
457
+ // columns stay put. The 2-char selection prefix ("▶ "/" ") counts
458
+ // toward the KEY column (before, rows overflowed keyW by 2 and the
459
+ // whole VALUE column sat 2 chars right of the header's VALUE).
460
+ for (const r of this.rows) {
461
+ if (visibleWidth(r.label) + 2 > keyW) keyW = visibleWidth(r.label) + 2;
455
462
  if (visibleWidth(r.valueText) > valueW) valueW = visibleWidth(r.valueText);
456
463
  if (visibleWidth(r.sourceText) > sourceW) sourceW = visibleWidth(r.sourceText);
457
464
  }
458
465
  keyW = Math.min(keyW, MAX_KEY_W);
459
466
  valueW = Math.min(valueW, MAX_VALUE_W);
460
467
  sourceW = Math.min(sourceW, MAX_SOURCE_W);
461
- const descW = Math.max(MIN_DESC_W, width - keyW - valueW - sourceW - 3 * COL_GUTTER);
468
+ const descW = Math.max(MIN_DESC_W, width - keyW - valueW - sourceW - 3 * visibleWidth(COL_SEP));
462
469
  return { keyW, valueW, sourceW, descW };
463
470
  }
464
471
 
@@ -469,17 +476,19 @@ export class SettingsMenuComponent implements Component {
469
476
 
470
477
  private renderBody(width: number): string[] {
471
478
  const { keyW, valueW, sourceW, descW } = this.widths(width);
472
- const gutter = " ".repeat(COL_GUTTER);
479
+ const sep = this.theme.fg("dim", COL_SEP);
473
480
 
474
481
  const lines: string[] = [];
475
482
 
476
483
  lines.push(this.theme.fg("accent", this.theme.bold(this.title)));
477
484
 
485
+ // v0.28.18: EVERY tab is bracketed (active = accent, inactive = dim) —
486
+ // bare words read as floating text, not tabs.
478
487
  lines.push(
479
488
  SETTINGS_SECTIONS.map((s, i) =>
480
489
  i === this.activeSectionIdx
481
490
  ? this.theme.fg("accent", `[${s.label}]`)
482
- : this.theme.fg("dim", s.label),
491
+ : this.theme.fg("dim", `[${s.label}]`),
483
492
  ).join(" "),
484
493
  );
485
494
 
@@ -489,7 +498,14 @@ export class SettingsMenuComponent implements Component {
489
498
  this.padEnd(this.theme.bold("VALUE"), valueW),
490
499
  this.padEnd(this.theme.bold("SOURCE"), sourceW),
491
500
  this.theme.bold("DESCRIPTION"),
492
- ].join(gutter),
501
+ ].join(sep),
502
+ );
503
+ // Header rule — the grid line that makes it read as a table.
504
+ lines.push(
505
+ this.theme.fg(
506
+ "dim",
507
+ ["─".repeat(keyW), "─".repeat(valueW), "─".repeat(sourceW), "─".repeat(descW)].join(COL_RULE_SEP),
508
+ ),
493
509
  );
494
510
 
495
511
  const vs = this.visibleRows();
@@ -499,12 +515,18 @@ export class SettingsMenuComponent implements Component {
499
515
  vs.forEach((r, i) => {
500
516
  const selected = i === this.selectedIdx;
501
517
  const prefix = selected ? "▶ " : " ";
518
+ // v0.28.18: KEY (incl. prefix) and VALUE are truncated to their
519
+ // column — before, an over-long VALUE (e.g. the subagent effective-
520
+ // resolution composite) overflowed and shoved SOURCE/DESCRIPTION
521
+ // right on that row only, breaking the grid.
502
522
  const row = [
503
- this.padEnd(prefix + r.label, keyW),
504
- this.padEnd(r.valueText, valueW),
505
- this.padEnd(r.sourceText, sourceW),
523
+ this.padEnd(truncateToWidth(prefix + r.label, keyW, "…"), keyW),
524
+ this.padEnd(truncateToWidth(r.valueText, valueW, "…"), valueW),
525
+ this.padEnd(truncateToWidth(r.sourceText, sourceW, "…"), sourceW),
506
526
  truncateToWidth(r.description, descW, "…"),
507
- ].join(gutter);
527
+ // Selected row: plain separators — the whole row gets one accent
528
+ // wrap; a nested dim separator's reset code would end it early.
529
+ ].join(selected ? COL_SEP : sep);
508
530
  lines.push(selected ? this.theme.fg("accent", row) : row);
509
531
  });
510
532
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-goal-list-loop-audit",
3
- "version": "0.28.17",
3
+ "version": "0.28.18",
4
4
  "description": "Goal. Loop. Audit. Done. \u2014 a pi-coding-agent extension that supervises long-running work, with isolated auditor on each completion. Beat bamboozling by design: the auditor runs in a fresh session with no extensions, no skills, no editor \u2014 only the read tools needed to verify your goal.",
5
5
  "license": "MIT",
6
6
  "author": "dracon",