@sylphx/flow 3.12.0 → 3.13.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @sylphx/flow
2
2
 
3
+ ## 3.13.0 (2026-02-04)
4
+
5
+ ### ✨ Features
6
+
7
+ - **auto-upgrade:** add periodic background update check every 30 minutes ([4a14414](https://github.com/SylphxAI/flow/commit/4a14414350f31899a5dadaf596216c53406f7ffc))
8
+
9
+ ## 3.12.1 (2026-02-04)
10
+
11
+ ### 🐛 Bug Fixes
12
+
13
+ - **builder:** use EnterPlanMode for planning complex changes ([7457ce6](https://github.com/SylphxAI/flow/commit/7457ce633e359086b7fada5d72731d6df5a23c3a))
14
+ - **builder:** specify TaskCreate/TaskUpdate/TaskList tools for todo tracking ([b19516d](https://github.com/SylphxAI/flow/commit/b19516d282e87eeda85b99a599887577688387ef))
15
+
3
16
  ## 3.12.0 (2026-02-04)
4
17
 
5
18
  ### ✨ Features
@@ -69,14 +69,14 @@ State-of-the-art industrial standard. Every time. Would you stake your reputatio
69
69
  **Automate.** If automation exists for a task, manual execution is prohibited.
70
70
 
71
71
  **Plan before doing.** For any non-trivial task:
72
- 1. Break it down into concrete steps
73
- 2. Create todos for each step
74
- 3. Execute systematically, checking off as you go
72
+ 1. Use EnterPlanMode to plan the implementation
73
+ 2. Use TaskCreate to create todos for each step
74
+ 3. Execute systematically, using TaskUpdate to mark progress
75
75
 
76
76
  **Never forget, never drop.** Work in progress must be tracked:
77
- - Create todos BEFORE starting work
78
- - Update status as you progress
79
- - If interrupted, leave clear notes on current state
77
+ - Use TaskCreate BEFORE starting work
78
+ - Use TaskUpdate to mark in_progress when starting, completed when done
79
+ - If interrupted, leave clear notes in task description
80
80
 
81
81
  **Document decisions.** Every significant choice needs rationale:
82
82
  - Why this approach over alternatives?
@@ -87,11 +87,11 @@ State-of-the-art industrial standard. Every time. Would you stake your reputatio
87
87
 
88
88
  **Atomic commits.** Commit continuously. Each commit = one logical change. Semantic commit messages (feat, fix, docs, refactor, test, chore). This is your memory of what was done.
89
89
 
90
- **Todos.** Track what needs to be done next. This is your memory of what to do.
90
+ **Todos.** Use TaskCreate/TaskUpdate to track what needs to be done. This is your memory of what to do.
91
91
 
92
92
  **CLAUDE.md** — Your persistent memory file. Commands, env setup, architecture decisions, patterns, gotchas. Read first. Summarize, don't append. Remove resolved. Consolidate duplicates.
93
93
 
94
- **Recovery:** Lost context? → `git log`. Forgot next steps? → Check todos.
94
+ **Recovery:** Lost context? → `git log`. Forgot next steps? → TaskList.
95
95
 
96
96
  ## Issue Ownership
97
97
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sylphx/flow",
3
- "version": "3.12.0",
3
+ "version": "3.13.0",
4
4
  "description": "One CLI to rule them all. Unified orchestration layer for AI coding assistants. Auto-detection, auto-installation, auto-upgrade.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -242,6 +242,9 @@ export async function executeFlowV2(
242
242
  const autoUpgrade = new AutoUpgrade(projectPath);
243
243
  const upgradeResult = await autoUpgrade.runAutoUpgrade(selectedTargetId);
244
244
 
245
+ // Start periodic background checks (every 30 minutes)
246
+ autoUpgrade.startPeriodicCheck(selectedTargetId);
247
+
245
248
  // Show upgrade notice (minimal - only if upgraded)
246
249
  if (upgradeResult.flowUpgraded && upgradeResult.flowVersion) {
247
250
  console.log(chalk.dim(`↑ flow ${upgradeResult.flowVersion.latest}`));
@@ -43,10 +43,14 @@ export interface AutoUpgradeOptions {
43
43
  skipTarget?: boolean;
44
44
  }
45
45
 
46
+ // Default interval: 30 minutes
47
+ const DEFAULT_CHECK_INTERVAL_MS = 30 * 60 * 1000;
48
+
46
49
  export class AutoUpgrade {
47
50
  private projectPath: string;
48
51
  private options: AutoUpgradeOptions;
49
52
  private targetInstaller: TargetInstaller;
53
+ private periodicCheckInterval: NodeJS.Timeout | null = null;
50
54
 
51
55
  constructor(projectPath: string = process.cwd(), options: AutoUpgradeOptions = {}) {
52
56
  this.projectPath = projectPath;
@@ -396,4 +400,64 @@ export class AutoUpgrade {
396
400
  return false;
397
401
  }
398
402
  }
403
+
404
+ /**
405
+ * Start periodic background checks for updates
406
+ * Runs every intervalMs (default 30 minutes)
407
+ * Silently upgrades if updates are available
408
+ * @param targetId - Optional target CLI ID to check
409
+ * @param intervalMs - Check interval in milliseconds (default 30 minutes)
410
+ */
411
+ startPeriodicCheck(targetId?: string, intervalMs: number = DEFAULT_CHECK_INTERVAL_MS): void {
412
+ // Clear any existing interval
413
+ this.stopPeriodicCheck();
414
+
415
+ // Start periodic check
416
+ this.periodicCheckInterval = setInterval(() => {
417
+ this.performPeriodicUpgrade(targetId).catch(() => {
418
+ // Silent fail
419
+ });
420
+ }, intervalMs);
421
+
422
+ // Don't prevent process from exiting
423
+ this.periodicCheckInterval.unref();
424
+ }
425
+
426
+ /**
427
+ * Stop periodic background checks
428
+ */
429
+ stopPeriodicCheck(): void {
430
+ if (this.periodicCheckInterval) {
431
+ clearInterval(this.periodicCheckInterval);
432
+ this.periodicCheckInterval = null;
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Perform periodic upgrade check and silent upgrade
438
+ */
439
+ private async performPeriodicUpgrade(targetId?: string): Promise<void> {
440
+ // Perform background check first (updates version info)
441
+ await this.performBackgroundCheck(targetId);
442
+
443
+ // Read the fresh version info
444
+ const info = await this.readVersionInfo();
445
+ if (!info) return;
446
+
447
+ const currentVersion = await this.getCurrentFlowVersion();
448
+
449
+ // Silently upgrade Flow if needed
450
+ if (info.flowLatest && info.flowLatest !== currentVersion) {
451
+ await this.upgradeFlowSilent();
452
+ }
453
+
454
+ // Silently upgrade target if needed
455
+ if (targetId && info.targetLatest?.[targetId] && info.targetCurrent?.[targetId]) {
456
+ const current = info.targetCurrent[targetId];
457
+ const latest = info.targetLatest[targetId];
458
+ if (current !== latest) {
459
+ await this.upgradeTargetSilent(targetId);
460
+ }
461
+ }
462
+ }
399
463
  }