convoke-agents 2.3.0 → 2.3.1

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,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
+ ## [2.3.1] - 2026-03-15
11
+
12
+ ### Fixed
13
+
14
+ - **Migration chaining bug** — `getMigrationsFor()` now walks the full migration chain instead of only matching the first hop. Users jumping multiple versions (e.g., `1.0.x` → `2.x`) previously skipped all intermediate migrations silently. The `1.5.x-to-1.6.0` config delta (Wave 3 agents) was being skipped for anyone upgrading from `1.0.x–1.4.x`.
15
+ - **README version badge** — Updated from stale `2.0.1` to current version
16
+ - **INSTALLATION.md** — Added missing `-p convoke-agents` to `npx` command in troubleshooting section
17
+ - **BMAD-METHOD-COMPATIBILITY.md** — Fixed wrong package name (`convoke` → `convoke-agents`) and added missing `-p convoke-agents` to all `npx` commands
18
+ - **Archived outdated docs** — PUBLISHING-GUIDE.md and TEST-PLAN-REAL-INSTALL.md marked as historical (contained legacy commands)
19
+
20
+ ### Added
21
+
22
+ - **Chain traversal tests** — 10 new unit tests for migration chain resolution, parallel entry exclusion, and breaking change detection across chains
23
+ - **Multi-version integration test** — Verifies full `1.5.2 → current` update path with all 3 deltas executing and complete migration history
24
+
25
+ ---
26
+
10
27
  ## [2.2.0] - 2026-03-14
11
28
 
12
29
  ### Changed
package/INSTALLATION.md CHANGED
@@ -181,7 +181,7 @@ The installer preserves your custom settings and only adds missing entries. To f
181
181
 
182
182
  ```bash
183
183
  rm -rf _bmad/bme/_vortex/
184
- npx convoke-install-vortex
184
+ npx -p convoke-agents convoke-install-vortex
185
185
  ```
186
186
 
187
187
  ### Installation succeeds but agents don't activate
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  Agent teams for complex systems
11
11
  ```
12
12
 
13
- [![Version](https://img.shields.io/badge/version-2.0.1-blue)](https://github.com/amalik/convoke-agents)
13
+ [![Version](https://img.shields.io/badge/version-2.3.1-blue)](https://github.com/amalik/convoke-agents)
14
14
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
15
15
 
16
16
  </div>
@@ -33,7 +33,7 @@ workflows:
33
33
  - learning-card
34
34
  - pivot-patch-persevere
35
35
  - vortex-navigation
36
- version: 2.3.0
36
+ version: 2.3.1
37
37
  user_name: '{user}'
38
38
  communication_language: en
39
39
  party_mode_enabled: true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "convoke-agents",
3
- "version": "2.3.0",
3
+ "version": "2.3.1",
4
4
  "description": "Agent teams for complex systems, compatible with BMad Method",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -2,7 +2,7 @@
2
2
 
3
3
  const fs = require('fs-extra');
4
4
  const yaml = require('js-yaml');
5
- const { compareVersions } = require('../lib/utils');
5
+
6
6
 
7
7
  /**
8
8
  * Migration Registry for Convoke
@@ -73,40 +73,77 @@ const MIGRATIONS = [
73
73
 
74
74
  /**
75
75
  * Get migrations applicable for upgrading from a given version.
76
- * Target version is always the current package version (read at runtime).
76
+ * Walks the full migration chain: finds the entry-point migration matching
77
+ * the user's version, then follows the chain forward by parsing each
78
+ * migration's target version and finding the next hop.
77
79
  *
78
80
  * @param {string} fromVersion - Current installed version (e.g., "1.0.5")
79
- * @returns {Array} List of applicable migrations with loaded modules
81
+ * @returns {Array} List of applicable migrations with loaded modules, in chain order
80
82
  */
81
83
  function getMigrationsFor(fromVersion) {
82
84
  const applicable = [];
83
85
 
86
+ // Step 1: Find the entry-point migration matching the user's current version
87
+ let entryMigration = null;
84
88
  for (const migration of MIGRATIONS) {
85
89
  if (matchesVersionRange(fromVersion, migration.fromVersion)) {
86
- // Lazy load the migration module
87
- if (!migration.module) {
88
- try {
89
- migration.module = require(`./${migration.name}`);
90
- } catch (error) {
91
- console.error(`Failed to load migration ${migration.name}:`, error.message);
92
- continue;
93
- }
94
- }
95
-
96
- applicable.push(migration);
90
+ entryMigration = migration;
91
+ break;
97
92
  }
98
93
  }
99
94
 
100
- // Sort by version order (oldest fromVersion first)
101
- applicable.sort((a, b) => {
102
- const aV = a.fromVersion.replace('.x', '.0');
103
- const bV = b.fromVersion.replace('.x', '.0');
104
- return compareVersions(aV, bV);
105
- });
95
+ if (!entryMigration) return applicable;
96
+
97
+ // Load and add entry migration
98
+ if (!loadMigrationModule(entryMigration)) return applicable;
99
+ applicable.push(entryMigration);
100
+
101
+ // Step 2: Chain forward — parse target version from migration name,
102
+ // then find the next migration whose fromVersion matches that target
103
+ let targetVersion = parseTargetVersion(entryMigration.name);
104
+
105
+ while (targetVersion) {
106
+ const nextMigration = MIGRATIONS.find(m =>
107
+ matchesVersionRange(targetVersion, m.fromVersion) && !applicable.includes(m)
108
+ );
109
+
110
+ if (!nextMigration) break;
111
+ if (!loadMigrationModule(nextMigration)) break;
112
+
113
+ applicable.push(nextMigration);
114
+ targetVersion = parseTargetVersion(nextMigration.name);
115
+ }
106
116
 
107
117
  return applicable;
108
118
  }
109
119
 
120
+ /**
121
+ * Parse the target version from a migration name.
122
+ * E.g., "1.0.x-to-1.3.0" → "1.3.0"
123
+ * @param {string} migrationName
124
+ * @returns {string|null} Target version or null if unparseable
125
+ */
126
+ function parseTargetVersion(migrationName) {
127
+ const match = migrationName.match(/-to-(\d+\.\d+\.\d+)$/);
128
+ return match ? match[1] : null;
129
+ }
130
+
131
+ /**
132
+ * Lazy-load a migration's module file.
133
+ * @param {object} migration - Migration entry from MIGRATIONS array
134
+ * @returns {boolean} True if module loaded successfully
135
+ */
136
+ function loadMigrationModule(migration) {
137
+ if (migration.module) return true;
138
+ try {
139
+ migration.module = require(`./${migration.name}`);
140
+ return true;
141
+ } catch (error) {
142
+ console.error(`Failed to load migration ${migration.name}:`, error.message);
143
+ return false;
144
+ }
145
+ }
146
+
110
147
  /**
111
148
  * Check if migration has already been applied
112
149
  * @param {string} migrationName - Name of migration
@@ -190,5 +227,6 @@ module.exports = {
190
227
  hasMigrationBeenApplied,
191
228
  getBreakingChanges,
192
229
  matchesVersionRange,
230
+ parseTargetVersion,
193
231
  getAllMigrations
194
232
  };