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.
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/.claude/commands/cfn-loop-cli.md +124 -46
- package/.claude/commands/cfn-loop-frontend.md +1 -1
- package/.claude/commands/cfn-loop-task.md +2 -2
- package/.claude/commands/deprecated/cfn-loop.md +2 -2
- package/.claude/hooks/cfn-invoke-post-edit.sh +31 -5
- package/.claude/hooks/cfn-post-edit.config.json +9 -2
- package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
- package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +2 -2
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
- package/claude-assets/agents/cfn-dev-team/utility/analyst.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +1 -1
- package/claude-assets/agents/custom/cfn-docker-expert.md +1 -0
- package/claude-assets/agents/custom/cfn-loops-cli-expert.md +326 -17
- package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
- package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
- package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
- package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/claude-assets/commands/cfn-loop-cli.md +124 -46
- package/claude-assets/commands/cfn-loop-frontend.md +1 -1
- package/claude-assets/commands/cfn-loop-task.md +2 -2
- package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
- package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
- package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
- package/claude-assets/hooks/cfn-invoke-post-edit.sh +31 -5
- package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
- package/claude-assets/hooks/install-git-hooks.sh +243 -0
- package/claude-assets/hooks/subagent-start.sh +98 -0
- package/claude-assets/hooks/subagent-stop.sh +93 -0
- package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
- package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
- package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +41 -13
- package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/skills/cfn-provider-routing/SKILL.md +23 -0
- package/claude-assets/skills/docker-build/build.sh +1 -1
- package/dist/agent/skill-mcp-selector.js +2 -1
- package/dist/agent/skill-mcp-selector.js.map +1 -1
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +470 -26
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +2 -2
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +7 -4
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/agent-spawner.js +51 -4
- package/dist/cli/agent-spawner.js.map +1 -1
- package/dist/cli/agent-token-manager.js +2 -1
- package/dist/cli/agent-token-manager.js.map +1 -1
- package/dist/cli/anthropic-client.js +117 -11
- package/dist/cli/anthropic-client.js.map +1 -1
- package/dist/cli/cfn-context.js +2 -1
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-metrics.js +2 -1
- package/dist/cli/cfn-metrics.js.map +1 -1
- package/dist/cli/cfn-redis.js +2 -1
- package/dist/cli/cfn-redis.js.map +1 -1
- package/dist/cli/cli-agent-context.js +2 -0
- package/dist/cli/cli-agent-context.js.map +1 -1
- package/dist/cli/config-manager.js +4 -252
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +2 -1
- package/dist/cli/conversation-fork-cleanup.js.map +1 -1
- package/dist/cli/conversation-fork.js +2 -1
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/coordination/agent-messaging.js +415 -0
- package/dist/cli/coordination/agent-messaging.js.map +1 -0
- package/dist/cli/coordination/wait-for-threshold.js +232 -0
- package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
- package/dist/cli/iteration-history.js +2 -1
- package/dist/cli/iteration-history.js.map +1 -1
- package/dist/cli/process-lifecycle.js +5 -1
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/spawn-agent-cli.js +41 -6
- package/dist/cli/spawn-agent-cli.js.map +1 -1
- package/dist/coordination/redis-waiting-mode.js +4 -0
- package/dist/coordination/redis-waiting-mode.js.map +1 -1
- package/dist/lib/artifact-registry.js +4 -0
- package/dist/lib/artifact-registry.js.map +1 -1
- package/dist/lib/connection-pool.js +390 -0
- package/dist/lib/connection-pool.js.map +1 -0
- package/dist/lib/environment-contract.js +258 -0
- package/dist/lib/environment-contract.js.map +1 -0
- package/dist/lib/query-optimizer.js +388 -0
- package/dist/lib/query-optimizer.js.map +1 -0
- package/dist/lib/result-cache.js +285 -0
- package/dist/lib/result-cache.js.map +1 -0
- package/dist/mcp/auth-middleware.js +2 -1
- package/dist/mcp/auth-middleware.js.map +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js +2 -1
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
- package/package.json +3 -1
- package/scripts/build-agent-image.sh +1 -1
- package/scripts/cost-allocation-tracker.sh +632 -0
- package/scripts/docker-rebuild-all-agents.sh +2 -2
- package/scripts/reorganize-tests.sh +280 -0
- package/scripts/trigger-dev-setup.sh +12 -0
- package/tests/README.md +45 -0
- package/.claude/commands/cost-savings-status.md +0 -34
- package/.claude/commands/metrics-summary.md +0 -58
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -768
- package/claude-assets/agents/custom/test-mcp-access.md +0 -24
- package/claude-assets/commands/cost-savings-status.md +0 -34
- package/claude-assets/commands/metrics-summary.md +0 -58
- 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 "$@"
|