@axiomatic-labs/claudeflow 2.49.33 → 2.49.34

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 +55 -6
  2. package/package.json +1 -1
package/lib/install.js CHANGED
@@ -42,6 +42,13 @@ const GITIGNORE_LINES = [
42
42
  ];
43
43
  const SHARED_CONFIGS = ['playbook-map.json', 'agent-map.json']; // always refreshed (shared system)
44
44
  const CODEX_DOCS = ['claudeflow-codex-migration.md', 'codexflow-codex-native-workflow.md', 'codexflow-local-actions.md'];
45
+ const OBSOLETE_LOCAL_PATHS = [
46
+ '.claude/agents/claudeflow-implementer.md',
47
+ '.codex/agents/claudeflow-implementer.toml',
48
+ ];
49
+ const OBSOLETE_GLOBAL_CLAUDE_PATHS = [
50
+ '.claude/agents/claudeflow-implementer.md',
51
+ ];
45
52
 
46
53
  function rmrf(p) { fs.rmSync(p, { recursive: true, force: true }); }
47
54
 
@@ -339,6 +346,30 @@ function replaceManagedPath(src, dst, backupRoot, relBase) {
339
346
  return { movedAside };
340
347
  }
341
348
 
349
+ function removeObsoleteManagedPaths(paths, backupRoot, relBase, label) {
350
+ const out = { removed: 0, backups: 0, failed: 0, failures: [] };
351
+ for (const rel of paths) {
352
+ const target = path.join(relBase, rel);
353
+ if (!fs.existsSync(target)) continue;
354
+ try {
355
+ moveAsideManagedPath(target, backupRoot, relBase);
356
+ out.removed++;
357
+ out.backups++;
358
+ } catch (err) {
359
+ try {
360
+ makeWritableTree(target);
361
+ moveAsideManagedPath(target, backupRoot, relBase);
362
+ out.removed++;
363
+ out.backups++;
364
+ } catch (err2) {
365
+ out.failed++;
366
+ out.failures.push(`${label}:${rel}:${err2 && err2.code ? err2.code : 'ERROR'}`);
367
+ }
368
+ }
369
+ }
370
+ return out;
371
+ }
372
+
342
373
  function chownTree(target, uid, gid) {
343
374
  if (!fs.existsSync(target)) return 0;
344
375
  let count = 0;
@@ -436,6 +467,12 @@ function syncManagedGlobalDir(srcDir, dstDir, backupRoot, filter, label) {
436
467
  function syncGlobalClaudeArtifacts(src, homeDir = os.homedir()) {
437
468
  const stamp = new Date().toISOString().replace(/\D/g, '').slice(0, 14) + '-' + process.pid;
438
469
  const backupRoot = path.join(homeDir, '.claude', 'backup', `claudeflow-install-${stamp}`);
470
+ const obsoleteStats = removeObsoleteManagedPaths(
471
+ OBSOLETE_GLOBAL_CLAUDE_PATHS,
472
+ backupRoot,
473
+ homeDir,
474
+ 'global-obsolete',
475
+ );
439
476
  const skillStats = syncManagedGlobalDir(
440
477
  path.join(src, '.claude', 'skills'),
441
478
  path.join(homeDir, '.claude', 'skills'),
@@ -453,10 +490,10 @@ function syncGlobalClaudeArtifacts(src, homeDir = os.homedir()) {
453
490
  return {
454
491
  skills: skillStats.synced,
455
492
  agents: agentStats.synced,
456
- changed: skillStats.changed + agentStats.changed,
457
- backups: skillStats.backups + agentStats.backups,
458
- failed: skillStats.failed + agentStats.failed,
459
- failures: [...skillStats.failures, ...agentStats.failures],
493
+ changed: skillStats.changed + agentStats.changed + obsoleteStats.removed,
494
+ backups: skillStats.backups + agentStats.backups + obsoleteStats.backups,
495
+ failed: skillStats.failed + agentStats.failed + obsoleteStats.failed,
496
+ failures: [...skillStats.failures, ...agentStats.failures, ...obsoleteStats.failures],
460
497
  };
461
498
  }
462
499
 
@@ -775,6 +812,7 @@ function installFromPayload(src, cwd, options = {}) {
775
812
  globalBackups: 0,
776
813
  globalMcpPruned: 0,
777
814
  localBackups: 0,
815
+ obsoleteRemoved: 0,
778
816
  ownershipRepaired: 0,
779
817
  codexSkills: 0,
780
818
  codexAgents: 0,
@@ -930,6 +968,17 @@ function installFromPayload(src, cwd, options = {}) {
930
968
  }
931
969
  });
932
970
 
971
+ // 4f) Removed managed artifacts — no compatibility path for the old named implementer.
972
+ step('obsolete-artifacts', () => {
973
+ const r = removeObsoleteManagedPaths(OBSOLETE_LOCAL_PATHS, backupRoot, cwd, 'obsolete');
974
+ out.obsoleteRemoved += r.removed;
975
+ out.localBackups += r.backups;
976
+ if (r.failed) {
977
+ out.failed.push(`obsolete-artifacts:${r.failed}`);
978
+ for (const f of r.failures || []) out.failed.push(f);
979
+ }
980
+ });
981
+
933
982
  // 5) settings.json — MERGE the shipped hooks + env (add-if-absent) into the user's settings (never clobber).
934
983
  // ALWAYS runs (isolated above) — this is what wires CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS et al.
935
984
  step('settings', () => {
@@ -957,7 +1006,7 @@ function installFromPayload(src, cwd, options = {}) {
957
1006
  }
958
1007
  });
959
1008
 
960
- // 7b) Optional semantic-code MCP. Serena is useful for fresh implementers, but it must not become a hidden
1009
+ // 7b) Optional semantic-code MCP. Serena is useful for large/unfamiliar code surfaces, but it must not become a hidden
961
1010
  // dependency. The real install auto-registers it only when a `serena` executable already exists (or the caller
962
1011
  // passes an explicit command); tests/direct installFromPayload stay deterministic unless configureSerena=true.
963
1012
  step('serena-mcp', () => {
@@ -1120,7 +1169,7 @@ async function run() {
1120
1169
  ui.warn(' Then re-run: npx @axiomatic-labs/claudeflow@latest install');
1121
1170
  }
1122
1171
  }
1123
- ui.done(`Describe a change and the ${ui.BOLD}claudeflow-implementer${ui.RESET} agent will build it.`);
1172
+ ui.done(`Describe a change; claudeflow will route code work through an implementation fork running ${ui.BOLD}Skill(claudeflow-implement)${ui.RESET}.`);
1124
1173
  }
1125
1174
 
1126
1175
  module.exports = run;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiomatic-labs/claudeflow",
3
- "version": "2.49.33",
3
+ "version": "2.49.34",
4
4
  "description": "Claudeflow — AI-powered development toolkit for Claude Code and Codex. Skills, agents, hooks, and quality gates that ship production apps.",
5
5
  "bin": {
6
6
  "claudeflow": "./bin/cli.js"