claude-flow-novice 2.14.8 → 2.14.10

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 (45) hide show
  1. package/.claude/commands/cfn-loop-cli.md +1 -1
  2. package/.claude/skills/cfn-agent-selector/SKILL.md +2 -2
  3. package/.claude/skills/cfn-agent-selector/SKILL.md.backup_before_replace +91 -0
  4. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +72 -5
  5. package/README.md +4 -4
  6. package/README.md.backup_before_replace +781 -0
  7. package/claude-assets/agents/AGENT_LIFECYCLE.md +3 -3
  8. package/claude-assets/agents/AGENT_LIFECYCLE.md.backup_before_replace +530 -0
  9. package/claude-assets/agents/README-AGENT_LIFECYCLE.md +3 -3
  10. package/claude-assets/agents/README-AGENT_LIFECYCLE.md.backup_before_replace +522 -0
  11. package/claude-assets/agents/cfn-dev-team/CLAUDE.md +3 -3
  12. package/claude-assets/agents/cfn-dev-team/CLAUDE.md.backup_before_replace +1086 -0
  13. package/claude-assets/agents/cfn-dev-team/README.md +1 -1
  14. package/claude-assets/agents/cfn-dev-team/README.md.backup_before_replace +116 -0
  15. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +2 -2
  16. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md.backup_before_replace +451 -0
  17. package/claude-assets/agents/cfn-dev-team/developers/README.md +3 -3
  18. package/claude-assets/agents/cfn-dev-team/developers/README.md.backup_before_replace +69 -0
  19. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +1 -1
  20. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md.backup_before_replace +465 -0
  21. package/claude-assets/agents/cfn-dev-team/test-agent.md +2 -2
  22. package/claude-assets/agents/cfn-dev-team/test-agent.md.backup_before_replace +141 -0
  23. package/claude-assets/commands/cfn-loop-cli.md +1 -1
  24. package/claude-assets/skills/cfn-agent-selector/SKILL.md +2 -2
  25. package/claude-assets/skills/cfn-agent-selector/SKILL.md.backup_before_replace +91 -0
  26. package/claude-assets/skills/cfn-cli-setup/validate-cli-environment.sh +192 -0
  27. package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +262 -0
  28. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +72 -5
  29. package/claude-assets/skills/cfn-mcp-container-selector/SKILL.md +555 -0
  30. package/claude-assets/skills/cfn-memory-monitoring/SKILL.md +531 -0
  31. package/claude-assets/skills/cfn-redis-cleanup/cleanup-redis.sh +130 -0
  32. package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +279 -0
  33. package/dist/agents/agent-loader.js +165 -146
  34. package/dist/cli/cli-agent-context.js +6 -0
  35. package/dist/cli/cli-agent-context.js.map +1 -1
  36. package/dist/cli/config-manager.js +109 -91
  37. package/dist/cli/config-manager.js.map +1 -1
  38. package/dist/types/index.js +11 -0
  39. package/dist/types/index.js.map +1 -0
  40. package/dist/types/user.js +22 -0
  41. package/dist/types/user.js.map +1 -0
  42. package/package.json +1 -1
  43. package/readme/README.md +1 -1
  44. package/scripts/docker-playwright-fix.sh +312 -0
  45. package/scripts/zone-d-type-fixes.sh +333 -0
@@ -0,0 +1,279 @@
1
+ #!/bin/bash
2
+ # Task Decomposition for Complex Operations
3
+ # Breaks down complex tasks into smaller, tool-budget-efficient subtasks
4
+
5
+ set -euo pipefail
6
+
7
+ # Configuration
8
+ TASK_ID="${1}"
9
+ TASK_DESCRIPTION="${2}"
10
+ TOOL_BUDGET="${3:-10}" # Default 10 tool budget per agent
11
+ COMPLEXITY_THRESHOLD="${4:-medium}" # low, medium, high
12
+
13
+ # Colors for output
14
+ RED='\033[0;31m'
15
+ GREEN='\033[0;32m'
16
+ YELLOW='\033[1;33m'
17
+ BLUE='\033[0;34m'
18
+ NC='\033[0m' # No Color
19
+
20
+ echo -e "${BLUE}🔧 CFN Loop Task Decomposition${NC}"
21
+ echo "Task ID: $TASK_ID"
22
+ echo "Tool Budget: $TOOL_BUDGET per agent"
23
+ echo "Complexity: $COMPLEXITY_THRESHOLD"
24
+ echo ""
25
+
26
+ # Function to analyze task complexity
27
+ analyze_task_complexity() {
28
+ local description="$1"
29
+ local complexity_score=0
30
+
31
+ # File operation indicators
32
+ if echo "$description" | grep -qiE "(fix|create|modify|update|delete|write).*file"; then
33
+ ((complexity_score += 3))
34
+ fi
35
+
36
+ # Directory exploration indicators
37
+ if echo "$description" | grep -qiE "(explore|find|search|scan|directory|folder)"; then
38
+ ((complexity_score += 2))
39
+ fi
40
+
41
+ # Multiple component indicators
42
+ if echo "$description" | grep -qiE "(multiple|batch|all|every|comprehensive)"; then
43
+ ((complexity_score += 4))
44
+ fi
45
+
46
+ # TypeScript/Complex file indicators
47
+ if echo "$description" | grep -qiE "(typescript|tsx|interface|type|complex)"; then
48
+ ((complexity_score += 2))
49
+ fi
50
+
51
+ # Dependency analysis indicators
52
+ if echo "$description" | grep -qiE "(dependency|import|require|module)"; then
53
+ ((complexity_score += 2))
54
+ fi
55
+
56
+ echo "$complexity_score"
57
+ }
58
+
59
+ # Function to decompose TypeScript error fixing tasks
60
+ decompose_typescript_task() {
61
+ local task_id="$1"
62
+ local description="$2"
63
+ local output_file=".claude/skills/cfn-task-decomposition/${task_id}-subtasks.json"
64
+
65
+ echo -e "${YELLOW}Decomposing TypeScript task...${NC}"
66
+
67
+ # Create subtasks
68
+ cat > "$output_file" << EOF
69
+ {
70
+ "task_id": "$task_id",
71
+ "original_task": "$description",
72
+ "decomposition_strategy": "typescript-error-fixing",
73
+ "subtasks": [
74
+ {
75
+ "subtask_id": "${task_id}-recon",
76
+ "title": "Directory Reconnaissance",
77
+ "description": "Explore project structure and identify TypeScript files needing fixes",
78
+ "agent_type": "researcher",
79
+ "tool_budget": 5,
80
+ "expected_tools": ["find", "grep", "Read", "Glob"],
81
+ "deliverables": ["file-list.txt", "error-classification.json"],
82
+ "estimated_duration": "5-10 minutes"
83
+ },
84
+ {
85
+ "subtask_id": "${task_id}-pattern",
86
+ "title": "Error Pattern Analysis",
87
+ "description": "Analyze TypeScript errors and identify common patterns",
88
+ "agent_type": "analyst",
89
+ "tool_budget": 8,
90
+ "expected_tools": ["Read", "Grep", "Bash"],
91
+ "deliverables": ["error-patterns.json", "fix-strategy.md"],
92
+ "estimated_duration": "10-15 minutes"
93
+ },
94
+ {
95
+ "subtask_id": "${task_id}-fix",
96
+ "title": "File-by-File Fixes",
97
+ "description": "Fix TypeScript errors in identified files using patterns",
98
+ "agent_type": "backend-developer",
99
+ "tool_budget": 15,
100
+ "expected_tools": ["Read", "Edit", "Write", "Bash"],
101
+ "deliverables": ["fixed-files/", "fix-summary.json"],
102
+ "estimated_duration": "20-30 minutes",
103
+ "batch_processing": {
104
+ "max_files_per_batch": 3,
105
+ "batches_total": 5
106
+ }
107
+ },
108
+ {
109
+ "subtask_id": "${task_id}-validate",
110
+ "title": "Validation and Testing",
111
+ "description": "Validate fixes and run TypeScript compilation",
112
+ "agent_type": "tester",
113
+ "tool_budget": 10,
114
+ "expected_tools": ["Bash", "Read", "Write"],
115
+ "deliverables": ["validation-report.json", "compilation-results.txt"],
116
+ "estimated_duration": "10-15 minutes"
117
+ }
118
+ ],
119
+ "coordination": {
120
+ "dependency_order": ["recon", "pattern", "fix", "validate"],
121
+ "redis_context_keys": {
122
+ "recon": "${task_id}:recon:results",
123
+ "pattern": "${task_id}:pattern:results",
124
+ "fix": "${task_id}:fix:results",
125
+ "validate": "${task_id}:validate:results"
126
+ }
127
+ }
128
+ }
129
+ EOF
130
+
131
+ echo -e "${GREEN}✓ Task decomposition created: $output_file${NC}"
132
+ echo "$output_file"
133
+ }
134
+
135
+ # Function to decompose file exploration tasks
136
+ decompose_exploration_task() {
137
+ local task_id="$1"
138
+ local description="$2"
139
+ local output_file=".claude/skills/cfn-task-decomposition/${task_id}-subtasks.json"
140
+
141
+ echo -e "${YELLOW}Decomposing exploration task...${NC}"
142
+
143
+ cat > "$output_file" << EOF
144
+ {
145
+ "task_id": "$task_id",
146
+ "original_task": "$description",
147
+ "decomposition_strategy": "directory-exploration",
148
+ "subtasks": [
149
+ {
150
+ "subtask_id": "${task_id}-scan",
151
+ "title": "Targeted Directory Scan",
152
+ "description": "Scan specific directories for target files using ripgrep",
153
+ "agent_type": "researcher",
154
+ "tool_budget": 6,
155
+ "expected_tools": ["Bash", "rg", "Glob", "Read"],
156
+ "deliverables": ["target-files.txt", "directory-map.json"],
157
+ "estimated_duration": "5-8 minutes"
158
+ },
159
+ {
160
+ "subtask_id": "${task_id}-analyze",
161
+ "title": "File Content Analysis",
162
+ "description": "Analyze found files to understand structure and patterns",
163
+ "agent_type": "analyst",
164
+ "tool_budget": 8,
165
+ "expected_tools": ["Read", "Grep", "Write"],
166
+ "deliverables": ["file-analysis.json", "content-summary.md"],
167
+ "estimated_duration": "8-12 minutes"
168
+ }
169
+ ]
170
+ }
171
+ EOF
172
+
173
+ echo -e "${GREEN}✓ Task decomposition created: $output_file${NC}"
174
+ echo "$output_file"
175
+ }
176
+
177
+ # Function to create task-specific agent prompts
178
+ create_agent_prompts() {
179
+ local subtasks_file="$1"
180
+ local prompts_dir=".claude/skills/cfn-task-decomposition/prompts"
181
+
182
+ mkdir -p "$prompts_dir"
183
+
184
+ # Extract subtask information
185
+ local task_id=$(jq -r '.task_id' "$subtasks_file")
186
+ local strategy=$(jq -r '.decomposition_strategy' "$subtasks_file")
187
+
188
+ # Generate prompts for each subtask
189
+ jq -r '.subtasks[] | @base64' "$subtasks_file" | while read -r subtask_b64; do
190
+ local subtask=$(echo "$subtask_b64" | base64 -d)
191
+ local subtask_id=$(echo "$subtask" | jq -r '.subtask_id')
192
+ local title=$(echo "$subtask" | jq -r '.title')
193
+ local description=$(echo "$subtask" | jq -r '.description')
194
+ local tool_budget=$(echo "$subtask" | jq -r '.tool_budget')
195
+ local deliverables=$(echo "$subtask" | jq -r '.deliverables[]')
196
+
197
+ cat > "$prompts_dir/${subtask_id}-prompt.md" << EOF
198
+ # Task: $title
199
+
200
+ ## Context
201
+ You are working on subtask "${subtask_id}" of the larger task "${task_id}".
202
+
203
+ ## Your Mission
204
+ $description
205
+
206
+ ## Tool Budget Optimization
207
+ You have **$tool_budget tool uses** available. Use them efficiently:
208
+
209
+ ### Recommended Tool Sequence:
210
+ 1. **Exploration tools** (Read, Glob, Bash) - 2-3 uses
211
+ 2. **Analysis tools** (Grep, Read) - 2-3 uses
212
+ 3. **Implementation tools** (Edit, Write) - 3-5 uses
213
+ 4. **Validation tools** (Bash, Read) - 1-2 uses
214
+
215
+ ### Efficiency Tips:
216
+ - **Batch operations**: Read multiple files in one tool use when possible
217
+ - **Targeted searches**: Use specific patterns instead of broad scans
218
+ - **Early validation**: Check results after each major step
219
+ - **Combine tool uses**: Use compound commands to reduce tool count
220
+
221
+ ## Expected Deliverables
222
+ $deliverables
223
+
224
+ ## Success Criteria
225
+ - All deliverables created with high quality
226
+ - Tool budget not exceeded
227
+ - Results passed to next subtask via Redis
228
+
229
+ ## Redis Context
230
+ - Store results in: \`${task_id}:${subtask_id}:results\`
231
+ - Use confidence scoring based on deliverable completion
232
+ - Signal completion via Redis LPUSH to \`${task_id}:${subtask_id}:done\`
233
+ EOF
234
+
235
+ echo -e "${GREEN}✓ Created prompt for $subtask_id${NC}"
236
+ done
237
+ }
238
+
239
+ # Main execution
240
+ main() {
241
+ local complexity_score=$(analyze_task_complexity "$TASK_DESCRIPTION")
242
+ echo -e "${YELLOW}Task Complexity Score: $complexity_score${NC}"
243
+
244
+ local decomposition_file=""
245
+
246
+ # Determine decomposition strategy based on task type
247
+ if echo "$TASK_DESCRIPTION" | grep -qiE "(typescript|tsx|ts27|ts23|error|fix)"; then
248
+ decomposition_file=$(decompose_typescript_task "$TASK_ID" "$TASK_DESCRIPTION")
249
+ elif echo "$TASK_DESCRIPTION" | grep -qiE "(explore|find|search|scan)"; then
250
+ decomposition_file=$(decompose_exploration_task "$TASK_ID" "$TASK_DESCRIPTION")
251
+ else
252
+ echo -e "${YELLOW}Using general task decomposition...${NC}"
253
+ decomposition_file=$(decompose_typescript_task "$TASK_ID" "$TASK_DESCRIPTION")
254
+ fi
255
+
256
+ # Create agent prompts
257
+ if [ -n "$decomposition_file" ] && [ -f "$decomposition_file" ]; then
258
+ create_agent_prompts "$decomposition_file"
259
+
260
+ echo -e "\n${GREEN}=== Task Decomposition Complete ===${NC}"
261
+ echo -e "📄 ${BLUE}Decomposition file:${NC} $decomposition_file"
262
+ echo -e "🤖 ${BLUE}Agent prompts:${NC} .claude/skills/cfn-task-decomposition/prompts/"
263
+ echo -e "💡 ${BLUE}Strategy:${NC} Break complex task into tool-budget-efficient subtasks"
264
+
265
+ # Store decomposition info in Redis for coordinator
266
+ if command -v redis-cli >/dev/null 2>&1; then
267
+ redis-cli set "${TASK_ID}:decomposition" "$(cat "$decomposition_file")" >/dev/null
268
+ echo -e "📦 ${BLUE}Redis context stored:${NC} ${TASK_ID}:decomposition"
269
+ fi
270
+
271
+ return 0
272
+ else
273
+ echo -e "${RED}❌ Task decomposition failed${NC}"
274
+ return 1
275
+ fi
276
+ }
277
+
278
+ # Execute main function
279
+ main "$@"
@@ -1,12 +1,145 @@
1
+ "use strict";
1
2
  /**
2
3
  * Dynamic Agent Loader - Reads agent definitions from .claude/agents/ directory
3
4
  * Single source of truth for agent types in the system
4
- */ import { readFileSync, existsSync } from 'node:fs';
5
- import { glob } from 'glob';
6
- import { resolve, dirname } from 'node:path';
7
- import { parse as parseYaml } from 'yaml';
5
+ */ var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
6
+ function adopt(value) {
7
+ return value instanceof P ? value : new P(function(resolve) {
8
+ resolve(value);
9
+ });
10
+ }
11
+ return new (P || (P = Promise))(function(resolve, reject) {
12
+ function fulfilled(value) {
13
+ try {
14
+ step(generator.next(value));
15
+ } catch (e) {
16
+ reject(e);
17
+ }
18
+ }
19
+ function rejected(value) {
20
+ try {
21
+ step(generator["throw"](value));
22
+ } catch (e) {
23
+ reject(e);
24
+ }
25
+ }
26
+ function step(result) {
27
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
28
+ }
29
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
30
+ });
31
+ };
32
+ var __generator = this && this.__generator || function(thisArg, body) {
33
+ var _ = {
34
+ label: 0,
35
+ sent: function() {
36
+ if (t[0] & 1) throw t[1];
37
+ return t[1];
38
+ },
39
+ trys: [],
40
+ ops: []
41
+ }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
42
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
43
+ return this;
44
+ }), g;
45
+ function verb(n) {
46
+ return function(v) {
47
+ return step([
48
+ n,
49
+ v
50
+ ]);
51
+ };
52
+ }
53
+ function step(op) {
54
+ if (f) throw new TypeError("Generator is already executing.");
55
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
56
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
57
+ if (y = 0, t) op = [
58
+ op[0] & 2,
59
+ t.value
60
+ ];
61
+ switch(op[0]){
62
+ case 0:
63
+ case 1:
64
+ t = op;
65
+ break;
66
+ case 4:
67
+ _.label++;
68
+ return {
69
+ value: op[1],
70
+ done: false
71
+ };
72
+ case 5:
73
+ _.label++;
74
+ y = op[1];
75
+ op = [
76
+ 0
77
+ ];
78
+ continue;
79
+ case 7:
80
+ op = _.ops.pop();
81
+ _.trys.pop();
82
+ continue;
83
+ default:
84
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
85
+ _ = 0;
86
+ continue;
87
+ }
88
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
89
+ _.label = op[1];
90
+ break;
91
+ }
92
+ if (op[0] === 6 && _.label < t[1]) {
93
+ _.label = t[1];
94
+ t = op;
95
+ break;
96
+ }
97
+ if (t && _.label < t[2]) {
98
+ _.label = t[2];
99
+ _.ops.push(op);
100
+ break;
101
+ }
102
+ if (t[2]) _.ops.pop();
103
+ _.trys.pop();
104
+ continue;
105
+ }
106
+ op = body.call(thisArg, _);
107
+ } catch (e) {
108
+ op = [
109
+ 6,
110
+ e
111
+ ];
112
+ y = 0;
113
+ } finally{
114
+ f = t = 0;
115
+ }
116
+ if (op[0] & 5) throw op[1];
117
+ return {
118
+ value: op[0] ? op[1] : void 0,
119
+ done: true
120
+ };
121
+ }
122
+ };
123
+ var __spreadArray = this && this.__spreadArray || function(to, from, pack) {
124
+ if (pack || arguments.length === 2) for(var i = 0, l = from.length, ar; i < l; i++){
125
+ if (ar || !(i in from)) {
126
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
127
+ ar[i] = from[i];
128
+ }
129
+ }
130
+ return to.concat(ar || Array.prototype.slice.call(from));
131
+ };
132
+ Object.defineProperty(exports, "__esModule", {
133
+ value: true
134
+ });
135
+ exports.refreshAgents = exports.getAgentsByCategory = exports.isValidAgentType = exports.searchAgents = exports.getAgentCategories = exports.getAllAgents = exports.getAgent = exports.getAvailableAgentTypes = exports.agentLoader = exports.AgentLoader = void 0;
136
+ exports.resolveLegacyAgentType = resolveLegacyAgentType;
137
+ var node_fs_1 = require("node:fs");
138
+ var glob_1 = require("glob");
139
+ var node_path_1 = require("node:path");
140
+ var yaml_1 = require("yaml");
8
141
  // Legacy agent type mapping for backward compatibility
9
- const LEGACY_AGENT_MAPPING = {
142
+ var LEGACY_AGENT_MAPPING = {
10
143
  analyst: 'code-analyzer',
11
144
  coordinator: 'hierarchical-coordinator',
12
145
  optimizer: 'perf-analyzer',
@@ -17,38 +150,40 @@ const LEGACY_AGENT_MAPPING = {
17
150
  };
18
151
  /**
19
152
  * Resolve legacy agent types to current equivalents
20
- */ export function resolveLegacyAgentType(legacyType) {
153
+ */ function resolveLegacyAgentType(legacyType) {
21
154
  return LEGACY_AGENT_MAPPING[legacyType] || legacyType;
22
155
  }
23
- export class AgentLoader {
24
- agentCache = new Map();
25
- categoriesCache = [];
26
- lastLoadTime = 0;
27
- CACHE_EXPIRY = 60_000;
28
- getAgentsDirectory() {
29
- let currentDir = process.cwd();
156
+ var AgentLoader = /** @class */ function() {
157
+ function AgentLoader() {
158
+ this.agentCache = new Map();
159
+ this.categoriesCache = [];
160
+ this.lastLoadTime = 0;
161
+ this.CACHE_EXPIRY = 60000; // 1 minute cache
162
+ }
163
+ AgentLoader.prototype.getAgentsDirectory = function() {
164
+ var currentDir = process.cwd();
30
165
  while(currentDir !== '/'){
31
- const claudeAgentsPath = resolve(currentDir, '.claude', 'agents');
32
- if (existsSync(claudeAgentsPath)) {
166
+ var claudeAgentsPath = (0, node_path_1.resolve)(currentDir, '.claude', 'agents');
167
+ if ((0, node_fs_1.existsSync)(claudeAgentsPath)) {
33
168
  return claudeAgentsPath;
34
169
  }
35
- currentDir = dirname(currentDir);
170
+ currentDir = (0, node_path_1.dirname)(currentDir);
36
171
  }
37
- return resolve(process.cwd(), '.claude', 'agents');
38
- }
39
- parseAgentFile(filePath) {
172
+ return (0, node_path_1.resolve)(process.cwd(), '.claude', 'agents');
173
+ };
174
+ AgentLoader.prototype.parseAgentFile = function(filePath) {
40
175
  try {
41
- const content = readFileSync(filePath, 'utf-8');
42
- const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
176
+ var content = (0, node_fs_1.readFileSync)(filePath, 'utf-8');
177
+ var frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
43
178
  if (!frontmatterMatch) {
44
- console.warn(`No frontmatter found in ${filePath}`);
179
+ console.warn("No frontmatter found in ".concat(filePath));
45
180
  return null;
46
181
  }
47
- const [, yamlContent, markdownContent] = frontmatterMatch;
48
- const frontmatter = parseYaml(yamlContent);
49
- const description = frontmatter.description;
182
+ var yamlContent = frontmatterMatch[1], markdownContent = frontmatterMatch[2];
183
+ var frontmatter = (0, yaml_1.parse)(yamlContent);
184
+ var description = frontmatter.description;
50
185
  if (!frontmatter.name || !description) {
51
- console.warn(`Missing required fields (name, description) in ${filePath}`);
186
+ console.warn("Missing required fields (name, description) in ".concat(filePath));
52
187
  return null;
53
188
  }
54
189
  return {
@@ -69,129 +204,13 @@ export class AgentLoader {
69
204
  content: markdownContent.trim()
70
205
  };
71
206
  } catch (error) {
72
- console.error(`Error parsing agent file ${filePath}:`, error);
207
+ console.error("Error parsing agent file ".concat(filePath, ":"), error);
73
208
  return null;
74
209
  }
75
- }
76
- parseTools(frontmatter) {
77
- const extractTools = (input)=>{
210
+ };
211
+ AgentLoader.prototype.parseTools = function(frontmatter) {
212
+ var extractTools = function(input) {
78
213
  if (Array.isArray(input)) return input.map(String);
79
- if (typeof input === 'string') {
80
- return input.split(/[,\s]+/).map((t)=>t.trim()).filter((t)=>t.length > 0);
81
- }
82
- return [];
83
- };
84
- // Safely handle tools and capabilities.tools
85
- const toolsFromFrontmatter = frontmatter.tools ? extractTools(frontmatter.tools) : [];
86
- const toolsFromCapabilities = frontmatter.capabilities && typeof frontmatter.capabilities === 'object' ? extractTools(Object(frontmatter.capabilities).tools) : [];
87
- return [
88
- ...toolsFromFrontmatter,
89
- ...toolsFromCapabilities
90
- ];
91
- }
92
- async loadAgents() {
93
- const agentsDir = this.getAgentsDirectory();
94
- if (!existsSync(agentsDir)) {
95
- console.warn(`Agents directory not found: ${agentsDir}`);
96
- return;
97
- }
98
- const agentFiles = await new Promise((resolve, reject)=>{
99
- glob('**/*.md', {
100
- cwd: agentsDir,
101
- ignore: [
102
- '**/README.md',
103
- '**/MIGRATION_SUMMARY.md'
104
- ],
105
- absolute: true
106
- }, (err, matches)=>{
107
- if (err) reject(err);
108
- else resolve(matches);
109
- });
110
- });
111
- this.agentCache.clear();
112
- this.categoriesCache = [];
113
- const categoryMap = new Map();
114
- for (const filePath of agentFiles){
115
- const agent = this.parseAgentFile(filePath);
116
- if (agent) {
117
- this.agentCache.set(agent.name, agent);
118
- const relativePath = filePath.replace(agentsDir, '');
119
- const pathParts = relativePath.split('/');
120
- const category = pathParts[1] || 'uncategorized';
121
- if (!categoryMap.has(category)) {
122
- categoryMap.set(category, []);
123
- }
124
- categoryMap.get(category).push(agent);
125
- }
126
- }
127
- this.categoriesCache = Array.from(categoryMap.entries()).map(([name, agents])=>({
128
- name,
129
- agents: agents.sort((a, b)=>a.name.localeCompare(b.name))
130
- }));
131
- this.lastLoadTime = Date.now();
132
- }
133
- // Rest of the methods remain similar to the original implementation
134
- needsRefresh() {
135
- return Date.now() - this.lastLoadTime > this.CACHE_EXPIRY;
136
- }
137
- async ensureLoaded() {
138
- if (this.agentCache.size === 0 || this.needsRefresh()) {
139
- await this.loadAgents();
140
- }
141
- }
142
- async getAvailableAgentTypes() {
143
- await this.ensureLoaded();
144
- const currentTypes = Array.from(this.agentCache.keys());
145
- const legacyTypes = Object.keys(LEGACY_AGENT_MAPPING);
146
- return Array.from(new Set([
147
- ...currentTypes,
148
- ...legacyTypes
149
- ])).sort();
150
- }
151
- async getAgent(name) {
152
- await this.ensureLoaded();
153
- return this.agentCache.get(name) || this.agentCache.get(resolveLegacyAgentType(name)) || null;
154
- }
155
- async getAllAgents() {
156
- await this.ensureLoaded();
157
- return Array.from(this.agentCache.values()).sort((a, b)=>a.name.localeCompare(b.name));
158
- }
159
- async getAgentCategories() {
160
- await this.ensureLoaded();
161
- return this.categoriesCache;
162
- }
163
- async searchAgents(query) {
164
- await this.ensureLoaded();
165
- const lowerQuery = query.toLowerCase();
166
- return Array.from(this.agentCache.values()).filter((agent)=>agent.name.toLowerCase().includes(lowerQuery) || agent.description.toLowerCase().includes(lowerQuery) || agent.capabilities?.some((cap)=>cap.toLowerCase().includes(lowerQuery)));
167
- }
168
- async isValidAgentType(name) {
169
- await this.ensureLoaded();
170
- return this.agentCache.has(name) || this.agentCache.has(resolveLegacyAgentType(name));
171
- }
172
- async getAgentsByCategory(category) {
173
- const categories = await this.getAgentCategories();
174
- const found = categories.find((cat)=>cat.name === category);
175
- return found?.agents || [];
176
- }
177
- async refresh() {
178
- this.lastLoadTime = 0;
179
- await this.loadAgents();
180
- }
181
- }
182
- // Singleton instance
183
- export const agentLoader = new AgentLoader();
184
- // Convenience exports for use in other modules
185
- export const getAvailableAgentTypes = ()=>agentLoader.getAvailableAgentTypes();
186
- export const getAgent = (name)=>agentLoader.getAgent(name);
187
- export const getAllAgents = ()=>agentLoader.getAllAgents();
188
- export const getAgentCategories = ()=>agentLoader.getAgentCategories();
189
- export const searchAgents = (query)=>agentLoader.searchAgents(query);
190
- export const isValidAgentType = (name)=>agentLoader.isValidAgentType(name);
191
- export const getAgentsByCategory = (category)=>agentLoader.getAgentsByCategory(category);
192
- export const refreshAgents = ()=>agentLoader.refresh();
193
-
194
- //# sourceMappingURL=agent-loader.js.map.isArray(input)) return input.map(String);
195
214
  if (typeof input === 'string') {
196
215
  return input.split(/[,\s]+/).map(function(t) {
197
216
  return t.trim();
@@ -30,6 +30,12 @@ import path from 'path';
30
30
  try {
31
31
  // Search in .claude/agents/ subdirectories
32
32
  const searchPaths = [
33
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'coordinators', `${agentType}.md`),
34
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'developers', `${agentType}.md`),
35
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'testers', `${agentType}.md`),
36
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'specialists', `${agentType}.md`),
37
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'frontend', `${agentType}.md`),
38
+ path.join(process.cwd(), '.claude', 'agents', 'cfn-dev-team', 'security', `${agentType}.md`),
33
39
  path.join(process.cwd(), '.claude', 'agents', 'coordinators', `${agentType}.md`),
34
40
  path.join(process.cwd(), '.claude', 'agents', 'core-agents', `${agentType}.md`),
35
41
  path.join(process.cwd(), '.claude', 'agents', 'developers', `${agentType}.md`),