@axiomatic-labs/claudeflow 2.13.107 → 2.13.109

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.
Files changed (2) hide show
  1. package/lib/install.js +44 -4
  2. package/package.json +1 -1
package/lib/install.js CHANGED
@@ -207,6 +207,33 @@ async function run() {
207
207
  }
208
208
  }
209
209
 
210
+ // Copy variant-switch CLI (claudeflow-mode.js + helpers used by the
211
+ // /claudeflow-mode slash command to rotate .claude/ between boost and
212
+ // normal variants).
213
+ const srcCli = path.join(srcClaudeflow, 'cli');
214
+ const dstCli = path.join(cwd, '.claudeflow', 'cli');
215
+ if (fs.existsSync(srcCli)) {
216
+ copyDirSync(srcCli, dstCli);
217
+ }
218
+
219
+ // Copy variants (boost + normal). The /claudeflow-mode command rotates
220
+ // the active .claude/ between these. Each variant is a complete
221
+ // .claude/-shaped tree (skills, hooks, agents, commands, settings).
222
+ const srcVariants = path.join(srcClaudeflow, 'variants');
223
+ const dstVariants = path.join(cwd, '.claudeflow', 'variants');
224
+ if (fs.existsSync(srcVariants)) {
225
+ copyDirSync(srcVariants, dstVariants);
226
+ }
227
+
228
+ // Copy active-mode marker only when the project doesn't have one yet.
229
+ // Preserves the user's current mode (boost | normal) across updates —
230
+ // overwriting would silently rotate them back to the shipped default.
231
+ const srcActiveMode = path.join(srcClaudeflow, 'active-mode');
232
+ const dstActiveMode = path.join(cwd, '.claudeflow', 'active-mode');
233
+ if (fs.existsSync(srcActiveMode) && !fs.existsSync(dstActiveMode)) {
234
+ fs.copyFileSync(srcActiveMode, dstActiveMode);
235
+ }
236
+
210
237
  // Write version file
211
238
  writeLocalVersion(version);
212
239
  nextManagedPaths.add(normalizeRelativePath(path.join('.claudeflow', 'version')));
@@ -941,11 +968,18 @@ function collectManagedPathsFromRelease(extractRoot) {
941
968
  // Claude Code native dirs: hooks stay in .claude/
942
969
  addFilesFromDir(managed, extractRoot, path.join(srcClaude, 'hooks'));
943
970
 
944
- // Claudeflow dirs: runtime, templates, docs in .claudeflow/
945
- ['runtime', 'templates', 'docs'].forEach((folder) => {
971
+ // Claudeflow dirs: runtime, templates, docs, cli, variants in .claudeflow/
972
+ ['runtime', 'templates', 'docs', 'cli', 'variants'].forEach((folder) => {
946
973
  addFilesFromDir(managed, extractRoot, path.join(srcClaudeflow, folder));
947
974
  });
948
975
 
976
+ // Root-level marker file for the active variant (boost | normal).
977
+ // Required so `/claudeflow-mode` can report the current mode after install.
978
+ const activeModePath = path.join(srcClaudeflow, 'active-mode');
979
+ if (fs.existsSync(activeModePath)) {
980
+ managed.add('.claudeflow/active-mode');
981
+ }
982
+
949
983
  const skillsDir = path.join(srcClaude, 'skills');
950
984
  if (fs.existsSync(skillsDir)) {
951
985
  const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
@@ -998,11 +1032,17 @@ function collectLegacyManagedPathsFromDisk(projectRoot) {
998
1032
  // Claude Code native: hooks stay in .claude/
999
1033
  addFilesFromDir(managed, projectRoot, path.join(claudeDir, 'hooks'));
1000
1034
 
1001
- // Claudeflow dirs: runtime, templates, docs in .claudeflow/
1002
- ['runtime', 'templates', 'docs'].forEach((folder) => {
1035
+ // Claudeflow dirs: runtime, templates, docs, cli, variants in .claudeflow/
1036
+ ['runtime', 'templates', 'docs', 'cli', 'variants'].forEach((folder) => {
1003
1037
  addFilesFromDir(managed, projectRoot, path.join(claudeflowDir, folder));
1004
1038
  });
1005
1039
 
1040
+ // Root-level marker file for the active variant.
1041
+ const activeModePath = path.join(claudeflowDir, 'active-mode');
1042
+ if (fs.existsSync(activeModePath)) {
1043
+ managed.add('.claudeflow/active-mode');
1044
+ }
1045
+
1006
1046
  const skillsDir = path.join(claudeDir, 'skills');
1007
1047
  if (fs.existsSync(skillsDir)) {
1008
1048
  const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiomatic-labs/claudeflow",
3
- "version": "2.13.107",
3
+ "version": "2.13.109",
4
4
  "description": "Claudeflow — AI-powered development toolkit for Claude Code. Skills, agents, hooks, and quality gates that ship production apps.",
5
5
  "bin": {
6
6
  "claudeflow": "./bin/cli.js"