claude-flow-novice 2.16.0 → 2.16.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.
Files changed (154) hide show
  1. package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
  2. package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
  3. package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
  4. package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
  5. package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
  6. package/.claude/commands/cfn-loop-cli.md +124 -46
  7. package/.claude/commands/cfn-loop-frontend.md +1 -1
  8. package/.claude/commands/cfn-loop-task.md +2 -2
  9. package/.claude/commands/deprecated/cfn-loop.md +2 -2
  10. package/.claude/hooks/cfn-invoke-post-edit.sh +31 -5
  11. package/.claude/hooks/cfn-post-edit.config.json +9 -2
  12. package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
  13. package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
  14. package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
  15. package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
  16. package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
  17. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +2 -2
  18. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -1
  19. package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +1 -1
  20. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +2 -2
  21. package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
  22. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +1 -1
  23. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +1 -1
  24. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +1 -1
  25. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +1 -1
  26. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +1 -1
  27. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +1 -1
  28. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +1 -1
  29. package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
  30. package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
  31. package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
  32. package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
  33. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +1 -1
  34. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
  35. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
  36. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +1 -1
  37. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
  38. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +1 -1
  39. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +1 -1
  40. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +1 -1
  41. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
  42. package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
  43. package/claude-assets/agents/cfn-dev-team/utility/analyst.md +1 -1
  44. package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
  45. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +1 -1
  46. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +1 -1
  47. package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -1
  48. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +1 -1
  49. package/claude-assets/agents/custom/cfn-docker-expert.md +1 -0
  50. package/claude-assets/agents/custom/cfn-loops-cli-expert.md +326 -17
  51. package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
  52. package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
  53. package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
  54. package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
  55. package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
  56. package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
  57. package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
  58. package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
  59. package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
  60. package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
  61. package/claude-assets/commands/cfn-loop-cli.md +124 -46
  62. package/claude-assets/commands/cfn-loop-frontend.md +1 -1
  63. package/claude-assets/commands/cfn-loop-task.md +2 -2
  64. package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
  65. package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
  66. package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
  67. package/claude-assets/hooks/cfn-invoke-post-edit.sh +31 -5
  68. package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
  69. package/claude-assets/hooks/install-git-hooks.sh +243 -0
  70. package/claude-assets/hooks/subagent-start.sh +98 -0
  71. package/claude-assets/hooks/subagent-stop.sh +93 -0
  72. package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
  73. package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
  74. package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
  75. package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +41 -13
  76. package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
  77. package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
  78. package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
  79. package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
  80. package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
  81. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
  82. package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
  83. package/claude-assets/skills/cfn-provider-routing/SKILL.md +23 -0
  84. package/claude-assets/skills/docker-build/build.sh +1 -1
  85. package/dist/agent/skill-mcp-selector.js +2 -1
  86. package/dist/agent/skill-mcp-selector.js.map +1 -1
  87. package/dist/agents/agent-loader.js +165 -146
  88. package/dist/agents/agent-loader.js.map +1 -1
  89. package/dist/cli/agent-executor.js +470 -26
  90. package/dist/cli/agent-executor.js.map +1 -1
  91. package/dist/cli/agent-prompt-builder.js +2 -2
  92. package/dist/cli/agent-prompt-builder.js.map +1 -1
  93. package/dist/cli/agent-spawn.js +7 -4
  94. package/dist/cli/agent-spawn.js.map +1 -1
  95. package/dist/cli/agent-spawner.js +51 -4
  96. package/dist/cli/agent-spawner.js.map +1 -1
  97. package/dist/cli/agent-token-manager.js +2 -1
  98. package/dist/cli/agent-token-manager.js.map +1 -1
  99. package/dist/cli/anthropic-client.js +117 -11
  100. package/dist/cli/anthropic-client.js.map +1 -1
  101. package/dist/cli/cfn-context.js +2 -1
  102. package/dist/cli/cfn-context.js.map +1 -1
  103. package/dist/cli/cfn-metrics.js +2 -1
  104. package/dist/cli/cfn-metrics.js.map +1 -1
  105. package/dist/cli/cfn-redis.js +2 -1
  106. package/dist/cli/cfn-redis.js.map +1 -1
  107. package/dist/cli/cli-agent-context.js +2 -0
  108. package/dist/cli/cli-agent-context.js.map +1 -1
  109. package/dist/cli/config-manager.js +4 -252
  110. package/dist/cli/config-manager.js.map +1 -1
  111. package/dist/cli/conversation-fork-cleanup.js +2 -1
  112. package/dist/cli/conversation-fork-cleanup.js.map +1 -1
  113. package/dist/cli/conversation-fork.js +2 -1
  114. package/dist/cli/conversation-fork.js.map +1 -1
  115. package/dist/cli/coordination/agent-messaging.js +415 -0
  116. package/dist/cli/coordination/agent-messaging.js.map +1 -0
  117. package/dist/cli/coordination/wait-for-threshold.js +232 -0
  118. package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
  119. package/dist/cli/iteration-history.js +2 -1
  120. package/dist/cli/iteration-history.js.map +1 -1
  121. package/dist/cli/process-lifecycle.js +5 -1
  122. package/dist/cli/process-lifecycle.js.map +1 -1
  123. package/dist/cli/spawn-agent-cli.js +41 -6
  124. package/dist/cli/spawn-agent-cli.js.map +1 -1
  125. package/dist/coordination/redis-waiting-mode.js +4 -0
  126. package/dist/coordination/redis-waiting-mode.js.map +1 -1
  127. package/dist/lib/artifact-registry.js +4 -0
  128. package/dist/lib/artifact-registry.js.map +1 -1
  129. package/dist/lib/connection-pool.js +390 -0
  130. package/dist/lib/connection-pool.js.map +1 -0
  131. package/dist/lib/environment-contract.js +258 -0
  132. package/dist/lib/environment-contract.js.map +1 -0
  133. package/dist/lib/query-optimizer.js +388 -0
  134. package/dist/lib/query-optimizer.js.map +1 -0
  135. package/dist/lib/result-cache.js +285 -0
  136. package/dist/lib/result-cache.js.map +1 -0
  137. package/dist/mcp/auth-middleware.js +2 -1
  138. package/dist/mcp/auth-middleware.js.map +1 -1
  139. package/dist/mcp/playwright-mcp-server-auth.js +2 -1
  140. package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
  141. package/package.json +3 -1
  142. package/scripts/build-agent-image.sh +1 -1
  143. package/scripts/cost-allocation-tracker.sh +632 -0
  144. package/scripts/docker-rebuild-all-agents.sh +2 -2
  145. package/scripts/reorganize-tests.sh +280 -0
  146. package/scripts/trigger-dev-setup.sh +12 -0
  147. package/tests/README.md +45 -0
  148. package/.claude/commands/cost-savings-status.md +0 -34
  149. package/.claude/commands/metrics-summary.md +0 -58
  150. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -768
  151. package/claude-assets/agents/custom/test-mcp-access.md +0 -24
  152. package/claude-assets/commands/cost-savings-status.md +0 -34
  153. package/claude-assets/commands/metrics-summary.md +0 -58
  154. package/tests/test-memory-leak-task-mode.sh +0 -435
@@ -1,24 +0,0 @@
1
- ---
2
- name: test-mcp-access
3
- description: Test agent for verifying MCP tool access. Keywords - test, mcp, playwright, chrome-devtools
4
- tools: [Read, Write, TodoWrite, mcp__playwright__browser_snapshot, mcp__chrome-devtools__list_pages]
5
- model: haiku
6
- type: specialist
7
- ---
8
-
9
- # Test MCP Access Agent
10
-
11
- You are a test agent designed to verify MCP tool access.
12
-
13
- ## Task
14
-
15
- Report which MCP tools you can access:
16
-
17
- 1. List the tools available to you
18
- 2. Try to use `mcp__playwright__browser_snapshot`
19
- 3. Try to use `mcp__chrome-devtools__list_pages`
20
- 4. Report your findings clearly
21
-
22
- ## Expected Outcome
23
-
24
- Confirm whether MCP tools are accessible when explicitly listed in the tools array.
@@ -1,34 +0,0 @@
1
- ---
2
- description: Show current cost-savings mode status and configuration
3
- tags: [config, status, coordination]
4
- ---
5
-
6
- Display current cost-savings mode status and coordinator configuration.
7
-
8
- **Usage:**
9
- - `/cost-savings-status` - Show mode status and details
10
-
11
- **What this shows:**
12
- - Current mode: CLI (cost-savings ON) or Task-tool (cost-savings OFF)
13
- - Active coordinator type sections in CLAUDE.md
14
- - Spawning method (spawn-workers.js vs Task tool)
15
- - Provider configuration for workers
16
- - Estimated cost savings percentage
17
-
18
- **Mode Indicators:**
19
- - **CLI Mode Active**: spawn-workers.js coordination, ~97% savings
20
- - **Task-tool Mode Active**: Task() coordination, full Claude quality
21
-
22
- **Execute status check:**
23
-
24
- ```bash
25
- npx claude-flow-cost-savings status
26
- ```
27
-
28
- **Output includes:**
29
- - Mode: CLI | Task-tool
30
- - CLAUDE.md sections: Active coordinator profiles
31
- - Spawning pattern: spawn-workers.js | Task()
32
- - Provider: z.ai | Claude Max
33
- - Cost savings: 0% | ~97%
34
- - Last toggled: timestamp
@@ -1,58 +0,0 @@
1
- # Metrics Summary
2
-
3
- Display aggregated metrics statistics with configurable time frame and manage metrics tracking.
4
-
5
- ## Usage
6
-
7
- ```bash
8
- # Display metrics summary
9
- /metrics-summary [--minutes=60] [--provider=all] [--model=all]
10
-
11
- # Manage tracking
12
- /metrics-summary --enable # Enable metrics tracking
13
- /metrics-summary --disable # Disable metrics tracking
14
- /metrics-summary --status # Check tracking status
15
- ```
16
-
17
- ## Parameters
18
-
19
- ### Display Metrics
20
- - `--minutes` - Time frame in minutes (default: 60 = last hour)
21
- - Examples: 60 (1 hour), 1440 (24 hours), 10080 (7 days)
22
- - `--provider` - Filter by provider: `all`, `anthropic`, `z.ai` (default: all)
23
- - `--model` - Filter by model name (default: all)
24
-
25
- ### Manage Tracking
26
- - `--enable` - Enable metrics tracking
27
- - `--disable` - Disable metrics tracking
28
- - `--status` - Check current tracking status
29
-
30
- ## Examples
31
-
32
- ```bash
33
- # Last hour stats (all providers)
34
- /metrics-summary
35
-
36
- # Last 24 hours
37
- /metrics-summary --minutes=1440
38
-
39
- # Last hour Z.ai only
40
- /metrics-summary --minutes=60 --provider=z.ai
41
-
42
- # Last 7 days GLM-4.6 only
43
- /metrics-summary --minutes=10080 --model=glm-4.6
44
-
45
- # Enable/disable tracking
46
- /metrics-summary --enable
47
- /metrics-summary --disable
48
- /metrics-summary --status
49
- ```
50
-
51
- ## Output
52
-
53
- - **API Requests**: Total count by provider
54
- - **Token Usage**: Input/Output/Total by provider and model
55
- - **Error Rate**: Success vs error percentage
56
- - **Cost Breakdown**: Estimated costs by provider (if pricing available)
57
- - **Top Models**: Most used models in time frame
58
- - **Performance**: Average API duration by provider
@@ -1,435 +0,0 @@
1
- #!/bin/bash
2
- # Memory Leak Test for Task Mode
3
- #
4
- # Tests memory accumulation patterns in Task Mode CFN Loop execution
5
- # Validates conversation fork cleanup and TTL enforcement
6
-
7
- set -euo pipefail
8
-
9
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
- PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
11
-
12
- # Redis connection
13
- REDIS_HOST="${CFN_REDIS_HOST:-localhost}"
14
- REDIS_PORT="${CFN_REDIS_PORT:-6379}"
15
- REDIS_PASSWORD="${CFN_REDIS_PASSWORD:-}"
16
-
17
- # Test configuration
18
- TEST_TASK_ID="test-memory-leak-$(date +%s)"
19
- TEST_AGENT_ID="test-agent-$$"
20
- MESSAGE_TTL=300 # 5 minutes for testing
21
- FORK_TTL=300 # 5 minutes for testing
22
-
23
- # Color output
24
- RED='\033[0;31m'
25
- GREEN='\033[0;32m'
26
- YELLOW='\033[1;33m'
27
- NC='\033[0m' # No Color
28
-
29
- # Test counters
30
- TESTS_RUN=0
31
- TESTS_PASSED=0
32
- TESTS_FAILED=0
33
-
34
- # Redis command builder
35
- redis_cmd() {
36
- local cmd="redis-cli -h $REDIS_HOST -p $REDIS_PORT"
37
- if [ -n "$REDIS_PASSWORD" ]; then
38
- cmd="$cmd -a $REDIS_PASSWORD"
39
- fi
40
- echo "$cmd"
41
- }
42
-
43
- # Helper: Print test result
44
- print_result() {
45
- local test_name="$1"
46
- local result="$2"
47
- local message="$3"
48
-
49
- TESTS_RUN=$((TESTS_RUN + 1))
50
-
51
- if [ "$result" = "PASS" ]; then
52
- echo -e "${GREEN}✓${NC} $test_name: $message"
53
- TESTS_PASSED=$((TESTS_PASSED + 1))
54
- else
55
- echo -e "${RED}✗${NC} $test_name: $message"
56
- TESTS_FAILED=$((TESTS_FAILED + 1))
57
- fi
58
- }
59
-
60
- # Helper: Store test message
61
- store_message() {
62
- local task_id="$1"
63
- local agent_id="$2"
64
- local role="$3"
65
- local iteration="$4"
66
-
67
- local key="swarm:${task_id}:${agent_id}:messages"
68
- local message="{\"role\":\"$role\",\"content\":\"Test message\",\"iteration\":$iteration,\"timestamp\":\"$(date -Iseconds)\"}"
69
-
70
- $(redis_cmd) rpush "$key" "$message" >/dev/null
71
- $(redis_cmd) expire "$key" "$MESSAGE_TTL" >/dev/null
72
- }
73
-
74
- # Helper: Create test fork
75
- create_fork() {
76
- local task_id="$1"
77
- local agent_id="$2"
78
- local iteration="$3"
79
-
80
- local fork_id="fork-${iteration}-testfork"
81
- local fork_key="swarm:${task_id}:${agent_id}:fork:${fork_id}:messages"
82
- local meta_key="swarm:${task_id}:${agent_id}:fork:${fork_id}:meta"
83
-
84
- # Store fork messages
85
- for i in $(seq 1 "$iteration"); do
86
- local message="{\"role\":\"user\",\"content\":\"Fork message $i\",\"iteration\":$i,\"timestamp\":\"$(date -Iseconds)\"}"
87
- $(redis_cmd) rpush "$fork_key" "$message" >/dev/null
88
- done
89
-
90
- # Set TTL on fork messages (CRITICAL for memory leak fix)
91
- $(redis_cmd) expire "$fork_key" "$FORK_TTL" >/dev/null
92
-
93
- # Store fork metadata with TTL
94
- local metadata="{\"forkId\":\"$fork_id\",\"taskId\":\"$task_id\",\"agentId\":\"$agent_id\",\"createdAt\":\"$(date -Iseconds)\",\"parentIteration\":$iteration,\"messageCount\":$iteration}"
95
- $(redis_cmd) setex "$meta_key" "$FORK_TTL" "$metadata" >/dev/null
96
-
97
- echo "$fork_id"
98
- }
99
-
100
- # Helper: Get key count matching pattern
101
- count_keys() {
102
- local pattern="$1"
103
- local keys=$($(redis_cmd) keys "$pattern" 2>/dev/null | grep -v '^$' || true)
104
- if [ -z "$keys" ]; then
105
- echo "0"
106
- else
107
- echo "$keys" | wc -l
108
- fi
109
- }
110
-
111
- # Helper: Get list length
112
- get_list_length() {
113
- local key="$1"
114
- local length=$($(redis_cmd) llen "$key" 2>/dev/null || echo "0")
115
- echo "$length"
116
- }
117
-
118
- # Helper: Get TTL
119
- get_ttl() {
120
- local key="$1"
121
- local ttl=$($(redis_cmd) ttl "$key" 2>/dev/null || echo "-2")
122
- echo "$ttl"
123
- }
124
-
125
- # Helper: Get memory usage (approximate)
126
- get_redis_memory() {
127
- $(redis_cmd) info memory | grep "used_memory_human:" | cut -d: -f2 | tr -d '\r\n'
128
- }
129
-
130
- # Setup test environment
131
- setup() {
132
- echo "========================================="
133
- echo "Memory Leak Test - Task Mode"
134
- echo "========================================="
135
- echo ""
136
- echo "Configuration:"
137
- echo " Task ID: $TEST_TASK_ID"
138
- echo " Agent ID: $TEST_AGENT_ID"
139
- echo " Message TTL: ${MESSAGE_TTL}s"
140
- echo " Fork TTL: ${FORK_TTL}s"
141
- echo " Redis: $REDIS_HOST:$REDIS_PORT"
142
- echo ""
143
-
144
- # Check Redis connection
145
- if ! $(redis_cmd) ping >/dev/null 2>&1; then
146
- echo -e "${RED}ERROR${NC}: Cannot connect to Redis at $REDIS_HOST:$REDIS_PORT"
147
- exit 1
148
- fi
149
-
150
- echo -e "${GREEN}✓${NC} Redis connection successful"
151
- echo ""
152
- }
153
-
154
- # Cleanup test data
155
- cleanup() {
156
- echo ""
157
- echo "Cleaning up test data..."
158
-
159
- # Delete test keys
160
- $(redis_cmd) del "swarm:${TEST_TASK_ID}:*" >/dev/null 2>&1 || true
161
-
162
- # Pattern-based cleanup
163
- local patterns=(
164
- "swarm:${TEST_TASK_ID}:*:messages"
165
- "swarm:${TEST_TASK_ID}:*:fork:*:messages"
166
- "swarm:${TEST_TASK_ID}:*:fork:*:meta"
167
- "swarm:${TEST_TASK_ID}:*:current-fork"
168
- )
169
-
170
- for pattern in "${patterns[@]}"; do
171
- local keys=$($(redis_cmd) keys "$pattern" 2>/dev/null || true)
172
- if [ -n "$keys" ]; then
173
- echo "$keys" | xargs -r $(redis_cmd) del >/dev/null 2>&1 || true
174
- fi
175
- done
176
-
177
- echo -e "${GREEN}✓${NC} Cleanup complete"
178
- }
179
-
180
- # Test 1: Message list has TTL
181
- test_message_ttl() {
182
- echo "Test 1: Message List TTL"
183
-
184
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "user" 1
185
-
186
- local key="swarm:${TEST_TASK_ID}:${TEST_AGENT_ID}:messages"
187
- local ttl=$(get_ttl "$key")
188
-
189
- if [ "$ttl" -gt 0 ] && [ "$ttl" -le "$MESSAGE_TTL" ]; then
190
- print_result "Message TTL" "PASS" "TTL set correctly ($ttl seconds)"
191
- else
192
- print_result "Message TTL" "FAIL" "TTL not set (got: $ttl, expected: >0 and <=$MESSAGE_TTL)"
193
- fi
194
- }
195
-
196
- # Test 2: Fork messages have TTL
197
- test_fork_message_ttl() {
198
- echo "Test 2: Fork Message TTL"
199
-
200
- # Store some messages first
201
- for i in {1..5}; do
202
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "user" "$i"
203
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "assistant" "$i"
204
- done
205
-
206
- # Create fork
207
- local fork_id=$(create_fork "$TEST_TASK_ID" "$TEST_AGENT_ID" 3)
208
- local fork_key="swarm:${TEST_TASK_ID}:${TEST_AGENT_ID}:fork:${fork_id}:messages"
209
-
210
- local ttl=$(get_ttl "$fork_key")
211
-
212
- if [ "$ttl" -gt 0 ] && [ "$ttl" -le "$FORK_TTL" ]; then
213
- print_result "Fork Message TTL" "PASS" "TTL set correctly ($ttl seconds)"
214
- else
215
- print_result "Fork Message TTL" "FAIL" "TTL not set on fork messages (got: $ttl, expected: >0 and <=$FORK_TTL)"
216
- fi
217
- }
218
-
219
- # Test 3: Memory accumulation with iterations
220
- test_memory_accumulation() {
221
- echo "Test 3: Memory Accumulation (10 iterations)"
222
-
223
- local initial_memory=$(get_redis_memory)
224
- echo " Initial memory: $initial_memory"
225
-
226
- # Simulate 10 iterations with 3 agents each
227
- for iter in {1..10}; do
228
- for agent in {1..3}; do
229
- local agent_id="${TEST_AGENT_ID}-agent${agent}"
230
- store_message "$TEST_TASK_ID" "$agent_id" "user" "$iter"
231
- store_message "$TEST_TASK_ID" "$agent_id" "assistant" "$iter"
232
-
233
- # Create fork every 2 iterations
234
- if [ $((iter % 2)) -eq 0 ]; then
235
- create_fork "$TEST_TASK_ID" "$agent_id" "$iter" >/dev/null
236
- fi
237
- done
238
- done
239
-
240
- # Count keys
241
- local message_count=$(count_keys "swarm:${TEST_TASK_ID}:*:messages")
242
- local fork_count=$(count_keys "swarm:${TEST_TASK_ID}:*:fork:*:messages")
243
-
244
- local final_memory=$(get_redis_memory)
245
- echo " Final memory: $final_memory"
246
- echo " Message keys: $message_count"
247
- echo " Fork keys: $fork_count"
248
-
249
- # All keys should have TTL
250
- local keys_without_ttl=0
251
- for key in $($(redis_cmd) keys "swarm:${TEST_TASK_ID}:*" 2>/dev/null); do
252
- local ttl=$(get_ttl "$key")
253
- if [ "$ttl" -eq -1 ]; then
254
- keys_without_ttl=$((keys_without_ttl + 1))
255
- fi
256
- done
257
-
258
- if [ "$keys_without_ttl" -eq 0 ]; then
259
- print_result "Memory Accumulation" "PASS" "All keys have TTL (no indefinite retention)"
260
- else
261
- print_result "Memory Accumulation" "FAIL" "$keys_without_ttl keys without TTL (memory leak risk)"
262
- fi
263
- }
264
-
265
- # Test 4: Cleanup utility integration
266
- test_cleanup_utility() {
267
- echo "Test 4: Cleanup Utility"
268
-
269
- # Use a dedicated agent ID for this test
270
- local cleanup_agent_id="${TEST_AGENT_ID}-cleanup"
271
-
272
- # Store messages
273
- for i in {1..20}; do
274
- store_message "$TEST_TASK_ID" "$cleanup_agent_id" "user" "$i"
275
- done
276
-
277
- # Create multiple forks
278
- for i in {2..10..2}; do
279
- create_fork "$TEST_TASK_ID" "$cleanup_agent_id" "$i" >/dev/null
280
- done
281
-
282
- # Count before cleanup (only for this specific agent)
283
- local before_count=$(count_keys "swarm:${TEST_TASK_ID}:${cleanup_agent_id}:*")
284
-
285
- # Run cleanup utility (using Node.js with environment variables)
286
- cd "$PROJECT_ROOT"
287
- CFN_REDIS_HOST="$REDIS_HOST" CFN_REDIS_PORT="$REDIS_PORT" node -e "
288
- const { cleanupTaskMessages } = require('./dist/cli/conversation-fork-cleanup.js');
289
- cleanupTaskMessages('$TEST_TASK_ID', '$cleanup_agent_id');
290
- " 2>/dev/null || {
291
- print_result "Cleanup Utility" "SKIP" "Cleanup utility not built (run: npm run build)"
292
- return
293
- }
294
-
295
- # Count after cleanup (only for this specific agent)
296
- local after_count=$(count_keys "swarm:${TEST_TASK_ID}:${cleanup_agent_id}:*")
297
-
298
- if [ "$after_count" -eq 0 ]; then
299
- print_result "Cleanup Utility" "PASS" "All keys removed ($before_count → $after_count)"
300
- else
301
- print_result "Cleanup Utility" "FAIL" "Cleanup incomplete ($before_count → $after_count, expected: 0)"
302
- fi
303
- }
304
-
305
- # Test 5: TTL enforcement (expiration test)
306
- test_ttl_enforcement() {
307
- echo "Test 5: TTL Enforcement (5 second expiration)"
308
-
309
- # Create key with very short TTL
310
- local short_ttl=5
311
- local key="swarm:${TEST_TASK_ID}:${TEST_AGENT_ID}:test-expiration"
312
-
313
- $(redis_cmd) rpush "$key" "test-message" >/dev/null
314
- $(redis_cmd) expire "$key" "$short_ttl" >/dev/null
315
-
316
- echo " Waiting ${short_ttl}s for expiration..."
317
- sleep $((short_ttl + 1))
318
-
319
- local exists=$($(redis_cmd) exists "$key")
320
-
321
- if [ "$exists" -eq 0 ]; then
322
- print_result "TTL Enforcement" "PASS" "Key expired after ${short_ttl}s"
323
- else
324
- print_result "TTL Enforcement" "FAIL" "Key still exists after TTL"
325
- fi
326
- }
327
-
328
- # Test 6: Fork metadata and message consistency
329
- test_fork_consistency() {
330
- echo "Test 6: Fork Metadata/Message Consistency"
331
-
332
- # Store messages
333
- for i in {1..5}; do
334
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "user" "$i"
335
- done
336
-
337
- # Create fork
338
- local fork_id=$(create_fork "$TEST_TASK_ID" "$TEST_AGENT_ID" 3)
339
-
340
- # Check both have same TTL
341
- local meta_key="swarm:${TEST_TASK_ID}:${TEST_AGENT_ID}:fork:${fork_id}:meta"
342
- local msg_key="swarm:${TEST_TASK_ID}:${TEST_AGENT_ID}:fork:${fork_id}:messages"
343
-
344
- local meta_ttl=$(get_ttl "$meta_key")
345
- local msg_ttl=$(get_ttl "$msg_key")
346
-
347
- # TTLs should be within 5 seconds of each other
348
- local ttl_diff=$((meta_ttl - msg_ttl))
349
- ttl_diff=${ttl_diff#-} # Absolute value
350
-
351
- if [ "$ttl_diff" -le 5 ]; then
352
- print_result "Fork Consistency" "PASS" "Metadata and messages have consistent TTL (diff: ${ttl_diff}s)"
353
- else
354
- print_result "Fork Consistency" "FAIL" "TTL mismatch (meta: ${meta_ttl}s, msg: ${msg_ttl}s, diff: ${ttl_diff}s)"
355
- fi
356
- }
357
-
358
- # Test 7: Memory statistics utility
359
- test_memory_statistics() {
360
- echo "Test 7: Memory Statistics"
361
-
362
- # Store messages
363
- for i in {1..10}; do
364
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "user" "$i"
365
- store_message "$TEST_TASK_ID" "$TEST_AGENT_ID" "assistant" "$i"
366
- done
367
-
368
- # Create forks
369
- create_fork "$TEST_TASK_ID" "$TEST_AGENT_ID" 5 >/dev/null
370
-
371
- # Get statistics (using Node.js with environment variables)
372
- cd "$PROJECT_ROOT"
373
- local stats=$(CFN_REDIS_HOST="$REDIS_HOST" CFN_REDIS_PORT="$REDIS_PORT" node -e "
374
- const { getTaskMemoryStats } = require('./dist/cli/conversation-fork-cleanup.js');
375
- const stats = getTaskMemoryStats('$TEST_TASK_ID', '$TEST_AGENT_ID');
376
- console.log(JSON.stringify(stats));
377
- " 2>/dev/null || echo "{}")
378
-
379
- if [ "$stats" != "{}" ]; then
380
- local message_count=$(echo "$stats" | grep -o '"messageCount":[0-9]*' | cut -d: -f2)
381
- local fork_count=$(echo "$stats" | grep -o '"forkCount":[0-9]*' | cut -d: -f2)
382
-
383
- if [ "$message_count" -gt 0 ] && [ "$fork_count" -gt 0 ]; then
384
- print_result "Memory Statistics" "PASS" "Stats collected (messages: $message_count, forks: $fork_count)"
385
- else
386
- print_result "Memory Statistics" "FAIL" "Stats invalid (messages: $message_count, forks: $fork_count)"
387
- fi
388
- else
389
- print_result "Memory Statistics" "SKIP" "Statistics utility not built"
390
- fi
391
- }
392
-
393
- # Main test execution
394
- main() {
395
- setup
396
-
397
- echo "Running memory leak tests..."
398
- echo ""
399
-
400
- test_message_ttl
401
- test_fork_message_ttl
402
- test_memory_accumulation
403
- test_cleanup_utility
404
- test_ttl_enforcement
405
- test_fork_consistency
406
- test_memory_statistics
407
-
408
- cleanup
409
-
410
- # Print summary
411
- echo ""
412
- echo "========================================="
413
- echo "Test Summary"
414
- echo "========================================="
415
- echo -e "Total: $TESTS_RUN"
416
- echo -e "${GREEN}Passed: $TESTS_PASSED${NC}"
417
- if [ "$TESTS_FAILED" -gt 0 ]; then
418
- echo -e "${RED}Failed: $TESTS_FAILED${NC}"
419
- else
420
- echo -e "Failed: $TESTS_FAILED"
421
- fi
422
- echo ""
423
-
424
- # Exit code
425
- if [ "$TESTS_FAILED" -gt 0 ]; then
426
- echo -e "${RED}TESTS FAILED${NC}"
427
- exit 1
428
- else
429
- echo -e "${GREEN}ALL TESTS PASSED${NC}"
430
- exit 0
431
- fi
432
- }
433
-
434
- # Run tests
435
- main "$@"