@axiomatic-labs/claudeflow 2.12.93 → 2.12.94

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 +29 -12
  2. package/package.json +1 -1
package/lib/install.js CHANGED
@@ -9,13 +9,13 @@ const ui = require('./ui.js');
9
9
  // Template skills are shipped inside the ZIP. Copy every claudeflow-* skill
10
10
  // from the release so template subskills stay in sync, while preserving any
11
11
  // user-generated skills that are not part of the shipped asset.
12
- const TEMPLATE_AGENTS = new Set(['claudeflow-explorer', 'claudeflow-planner', 'example-agent']);
13
12
  const TEMPLATE_MANAGED_MANIFEST = path.join('.claudeflow', 'config', 'template-managed-manifest.json');
14
13
  const CLAUDE_BACKUP_ROOT = '.claudeflow-backups';
15
14
  const REQUIRED_TEMPLATE_RULES = ['claudeflow-implementation.md'];
16
15
  const TEMPLATE_MANAGED_SETTINGS_KEYS = ['$schema', 'enabledMcpjsonServers', 'env', 'permissions', 'hooks'];
17
16
  const SERENA_REPO = 'git+https://github.com/oraios/serena';
18
17
  const TEMPLATE_SEEDED_SETTINGS_KEYS = new Set(['statusLine']);
18
+ const TEMPLATE_MANAGED_EXTRA_AGENTS = new Set(['example-agent']);
19
19
 
20
20
  async function run() {
21
21
  const current = readLocalVersion();
@@ -155,7 +155,7 @@ async function run() {
155
155
  const agentFiles = fs.readdirSync(srcAgents);
156
156
  for (const file of agentFiles) {
157
157
  const name = file.replace(/\.md$/, '');
158
- if (TEMPLATE_AGENTS.has(name)) {
158
+ if (isTemplateManagedAgent(name)) {
159
159
  fs.copyFileSync(path.join(srcAgents, file), path.join(dstAgents, file));
160
160
  }
161
161
  }
@@ -670,11 +670,12 @@ function collectManagedPathsFromRelease(extractRoot) {
670
670
 
671
671
  const agentsDir = path.join(srcClaude, 'agents');
672
672
  if (fs.existsSync(agentsDir)) {
673
- for (const agentName of TEMPLATE_AGENTS) {
674
- const filePath = path.join(agentsDir, `${agentName}.md`);
675
- if (fs.existsSync(filePath)) {
676
- managed.add(normalizeRelativePath(path.join('.claude', 'agents', `${agentName}.md`)));
677
- }
673
+ const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
674
+ for (const entry of entries) {
675
+ if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
676
+ const agentName = entry.name.replace(/\.md$/, '');
677
+ if (!isTemplateManagedAgent(agentName)) continue;
678
+ managed.add(normalizeRelativePath(path.join('.claude', 'agents', entry.name)));
678
679
  }
679
680
  }
680
681
 
@@ -726,11 +727,12 @@ function collectLegacyManagedPathsFromDisk(projectRoot) {
726
727
 
727
728
  const agentsDir = path.join(claudeDir, 'agents');
728
729
  if (fs.existsSync(agentsDir)) {
729
- for (const agentName of TEMPLATE_AGENTS) {
730
- const filePath = path.join(agentsDir, `${agentName}.md`);
731
- if (fs.existsSync(filePath)) {
732
- managed.add(normalizeRelativePath(path.join('.claude', 'agents', `${agentName}.md`)));
733
- }
730
+ const entries = fs.readdirSync(agentsDir, { withFileTypes: true });
731
+ for (const entry of entries) {
732
+ if (!entry.isFile() || !entry.name.endsWith('.md')) continue;
733
+ const agentName = entry.name.replace(/\.md$/, '');
734
+ if (!isTemplateManagedAgent(agentName)) continue;
735
+ managed.add(normalizeRelativePath(path.join('.claude', 'agents', entry.name)));
734
736
  }
735
737
  }
736
738
 
@@ -835,6 +837,19 @@ function assertRequiredTemplateRules(rulesDir) {
835
837
  }
836
838
  }
837
839
 
840
+ function isTemplateManagedAgent(agentName) {
841
+ return TEMPLATE_MANAGED_EXTRA_AGENTS.has(agentName) || agentName.startsWith('claudeflow-');
842
+ }
843
+
844
+ function listTemplateManagedAgents(agentsDir) {
845
+ if (!fs.existsSync(agentsDir)) return [];
846
+ return fs.readdirSync(agentsDir)
847
+ .filter((entry) => entry.endsWith('.md'))
848
+ .map((entry) => entry.replace(/\.md$/, ''))
849
+ .filter((name) => isTemplateManagedAgent(name))
850
+ .sort();
851
+ }
852
+
838
853
  // Recursively copy a directory, creating parents as needed
839
854
  function copyDirSync(src, dst, skipNames) {
840
855
  fs.mkdirSync(dst, { recursive: true });
@@ -853,5 +868,7 @@ function copyDirSync(src, dst, skipNames) {
853
868
 
854
869
  module.exports = Object.assign(run, {
855
870
  assertRequiredTemplateRules,
871
+ isTemplateManagedAgent,
872
+ listTemplateManagedAgents,
856
873
  mergeClaudeSettings,
857
874
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiomatic-labs/claudeflow",
3
- "version": "2.12.93",
3
+ "version": "2.12.94",
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"