agileflow 2.84.0 → 2.84.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/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.84.2] - 2026-01-11
11
+
12
+ ### Fixed
13
+ - Auto-update retry with npm cache clean on stale registry
14
+
15
+ ## [2.84.1] - 2026-01-11
16
+
17
+ ### Fixed
18
+ - Status line and welcome table formatting fixes
19
+
10
20
  ## [2.84.0] - 2026-01-11
11
21
 
12
22
  ### Added
package/README.md CHANGED
@@ -144,7 +144,7 @@ docs/
144
144
 
145
145
  ## Online Documentation
146
146
 
147
- Visit [projectquestorg.com](https://projectquestorg.com) for the full documentation site.
147
+ Visit [docs.agileflow.projectquestorg.com](https://docs.agileflow.projectquestorg.com) for the full documentation site.
148
148
 
149
149
  ---
150
150
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agileflow",
3
- "version": "2.84.0",
3
+ "version": "2.84.2",
4
4
  "description": "AI-driven agile development system for Claude Code, Cursor, Windsurf, and more",
5
5
  "keywords": [
6
6
  "agile",
@@ -385,11 +385,11 @@ PYTHON
385
385
  SESSION_COLOR="$SESSION_GREEN" # Light green - plenty of time
386
386
  fi
387
387
 
388
- # Build compact display: "~2h15m" or "~45m" (tilde indicates remaining time)
388
+ # Build compact display: "2h15m" or "45m" (hourglass indicates remaining time)
389
389
  if [ "$RH" -gt 0 ]; then
390
- SESSION_DISPLAY="${SESSION_COLOR}~${RH}h${RM}m${RESET}"
390
+ SESSION_DISPLAY="${SESSION_COLOR}⧗${RH}h${RM}m${RESET}"
391
391
  else
392
- SESSION_DISPLAY="${SESSION_COLOR}~${RM}m${RESET}"
392
+ SESSION_DISPLAY="${SESSION_COLOR}⧗${RM}m${RESET}"
393
393
  fi
394
394
  fi
395
395
  fi
@@ -495,18 +495,36 @@ function getChangelogEntries(version) {
495
495
 
496
496
  // Run auto-update if enabled
497
497
  async function runAutoUpdate(rootDir) {
498
- try {
499
- console.log(`${c.skyBlue}Updating AgileFlow...${c.reset}`);
500
- // Use --force to skip prompts for non-interactive auto-update
498
+ const runUpdate = () => {
501
499
  execSync('npx agileflow@latest update --force', {
502
500
  cwd: rootDir,
503
501
  encoding: 'utf8',
504
502
  stdio: 'inherit',
505
503
  timeout: 120000, // 2 minute timeout
506
504
  });
505
+ };
506
+
507
+ try {
508
+ console.log(`${c.skyBlue}Updating AgileFlow...${c.reset}`);
509
+ // Use --force to skip prompts for non-interactive auto-update
510
+ runUpdate();
507
511
  console.log(`${c.mintGreen}Update complete!${c.reset}`);
508
512
  return true;
509
513
  } catch (e) {
514
+ // Check if this is a stale npm cache issue (ETARGET = version not found)
515
+ if (e.message && (e.message.includes('ETARGET') || e.message.includes('notarget'))) {
516
+ console.log(`${c.dim}Clearing npm cache and retrying...${c.reset}`);
517
+ try {
518
+ execSync('npm cache clean --force', { stdio: 'pipe', timeout: 30000 });
519
+ runUpdate();
520
+ console.log(`${c.mintGreen}Update complete!${c.reset}`);
521
+ return true;
522
+ } catch (retryError) {
523
+ console.log(`${c.peach}Auto-update failed after cache clean: ${retryError.message}${c.reset}`);
524
+ console.log(`${c.dim}Run manually: npx agileflow update${c.reset}`);
525
+ return false;
526
+ }
527
+ }
510
528
  console.log(`${c.peach}Auto-update failed: ${e.message}${c.reset}`);
511
529
  console.log(`${c.dim}Run manually: npx agileflow update${c.reset}`);
512
530
  return false;
@@ -675,8 +693,8 @@ function formatTable(
675
693
  expertise = {},
676
694
  damageControl = {}
677
695
  ) {
678
- const W = 58; // inner width
679
- const R = W - 24; // right column width (34 chars)
696
+ const W = 58; // inner width (total table = W + 2 = 60)
697
+ const R = W - 25; // right column width (33 chars) to match total of 60
680
698
  const lines = [];
681
699
 
682
700
  // Helper to create a row (auto-truncates right content to fit)
@@ -688,16 +706,26 @@ function formatTable(
688
706
  };
689
707
 
690
708
  // Helper for full-width row (spans both columns)
709
+ // Content width = W - 2 (for the two spaces after │ and before │)
691
710
  const fullRow = (content, color = '') => {
692
711
  const contentStr = `${color}${content}${color ? c.reset : ''}`;
693
- return `${c.dim}${box.v}${c.reset} ${pad(contentStr, W - 1)} ${c.dim}${box.v}${c.reset}`;
712
+ return `${c.dim}${box.v}${c.reset} ${pad(contentStr, W - 2)} ${c.dim}${box.v}${c.reset}`;
694
713
  };
695
714
 
715
+ // Two-column dividers: ├ + 22 dashes + ┼ + 35 dashes + ┤ = 60 total
696
716
  const divider = () =>
697
- `${c.dim}${box.lT}${box.h.repeat(22)}${box.cross}${box.h.repeat(W - 22)}${box.rT}${c.reset}`;
717
+ `${c.dim}${box.lT}${box.h.repeat(22)}${box.cross}${box.h.repeat(W - 23)}${box.rT}${c.reset}`;
718
+ // Full-width divider: ├ + 58 dashes + ┤ = 60 total
698
719
  const fullDivider = () => `${c.dim}${box.lT}${box.h.repeat(W)}${box.rT}${c.reset}`;
699
- const topBorder = `${c.dim}${box.tl}${box.h.repeat(22)}${box.tT}${box.h.repeat(W - 22)}${box.tr}${c.reset}`;
700
- const bottomBorder = `${c.dim}${box.bl}${box.h.repeat(22)}${box.bT}${box.h.repeat(W - 22)}${box.br}${c.reset}`;
720
+ // Transition: full-width TO two-column
721
+ const splitDivider = () =>
722
+ `${c.dim}${box.lT}${box.h.repeat(22)}${box.tT}${box.h.repeat(W - 23)}${box.rT}${c.reset}`;
723
+ // Transition: two-column TO full-width
724
+ const mergeDivider = () =>
725
+ `${c.dim}${box.lT}${box.h.repeat(22)}${box.bT}${box.h.repeat(W - 23)}${box.rT}${c.reset}`;
726
+ // Borders
727
+ const topBorder = `${c.dim}${box.tl}${box.h.repeat(W)}${box.tr}${c.reset}`;
728
+ const bottomBorder = `${c.dim}${box.bl}${box.h.repeat(22)}${box.bT}${box.h.repeat(W - 23)}${box.br}${c.reset}`;
701
729
 
702
730
  // Header with version and optional update indicator
703
731
  // Use vibrant colors for branch
@@ -725,7 +753,7 @@ function formatTable(
725
753
  : info.branch;
726
754
 
727
755
  const header = `${c.brand}${c.bold}agileflow${c.reset} ${c.dim}${versionStr}${c.reset} ${branchColor}${branchDisplay}${c.reset} ${c.dim}(${info.commit})${c.reset}`;
728
- const headerLine = `${c.dim}${box.v}${c.reset} ${pad(header, W - 1)} ${c.dim}${box.v}${c.reset}`;
756
+ const headerLine = `${c.dim}${box.v}${c.reset} ${pad(header, W - 2)} ${c.dim}${box.v}${c.reset}`;
729
757
 
730
758
  lines.push(topBorder);
731
759
  lines.push(headerLine);
@@ -760,7 +788,8 @@ function formatTable(
760
788
  lines.push(fullRow(` Run ${c.skyBlue}/agileflow:whats-new${c.reset} for full changelog`, ''));
761
789
  }
762
790
 
763
- lines.push(divider());
791
+ // Transition from full-width sections to two-column stories section
792
+ lines.push(splitDivider());
764
793
 
765
794
  // Stories section (always colorful labels like obtain-context)
766
795
  lines.push(