claude-flow-novice 2.14.28 → 2.14.30
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-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +4 -14
- package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +481 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md +3 -4
- package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +371 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +20 -26
- package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +637 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md +295 -50
- package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +398 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md +27 -25
- package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +401 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md +5 -106
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +552 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md +5 -25
- package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +223 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md +5 -27
- package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +367 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md +5 -27
- package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +247 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md +5 -27
- package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +269 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md +5 -25
- package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +311 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md +6 -26
- package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +222 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md +5 -25
- package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +408 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md +6 -26
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +354 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md +4 -4
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +561 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md +2 -2
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +480 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md +1 -1
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +448 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md +2 -2
- package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +329 -0
- package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md +361 -199
- package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +208 -0
- package/.claude/commands/CFN_LOOP_TASK_MODE.md +100 -11
- package/.claude/commands/cfn-mode.md +2 -2
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +12 -0
- package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +273 -0
- package/.claude/skills/cfn-hybrid-routing/README.md +1 -1
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +95 -15
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +76 -11
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup2 +959 -0
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.clean +949 -0
- package/.claude/skills/cfn-product-owner-decision/execute-decision.sh +82 -10
- package/claude-assets/agents/cfn-dev-team/CLAUDE.md +24 -14
- package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +0 -7
- package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +12 -38
- package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +0 -10
- package/claude-assets/agents/cfn-dev-team/architecture/planner.md +7 -57
- package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +8 -45
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +365 -25
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +504 -448
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +428 -167
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +472 -20
- package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +5 -5
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +5 -7
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +0 -6
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +3 -3
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -14
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +0 -6
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +2 -2
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +10 -56
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +7 -26
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +8 -48
- package/claude-assets/agents/cfn-dev-team/documentation/api-documentation.md +1 -1
- package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +3 -11
- package/claude-assets/agents/cfn-dev-team/documentation/specification-agent.md +6 -16
- package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +7 -19
- package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +9 -49
- package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +291 -86
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +9 -81
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/cyclomatic-complexity-reducer.md +4 -64
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +7 -87
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +8 -12
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +11 -129
- package/claude-assets/agents/cfn-dev-team/reviewers/reviewer.md +231 -280
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +0 -6
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +0 -6
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +7 -32
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +9 -47
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +0 -6
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +12 -28
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +167 -236
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +7 -27
- package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +7 -19
- package/claude-assets/agents/cfn-dev-team/testing/test-validation-agent.md +10 -47
- package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +40 -116
- package/claude-assets/agents/cfn-dev-team/utility/analyst.md +7 -47
- package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +7 -40
- package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +7 -47
- package/claude-assets/agents/cfn-dev-team/{coordinators → utility}/epic-creator.md +29 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +4 -14
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +481 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md +3 -4
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +371 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +20 -26
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +637 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md +295 -50
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +398 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md +27 -25
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +401 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md +5 -106
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +552 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md +5 -25
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +223 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md +5 -27
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +367 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md +5 -27
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +247 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md +5 -27
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +269 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md +5 -25
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +311 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md +6 -26
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +222 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md +5 -25
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +408 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md +6 -26
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +354 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md +4 -4
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +561 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md +2 -2
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +480 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md +1 -1
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +448 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md +2 -2
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +329 -0
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md +361 -199
- package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +208 -0
- package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +100 -11
- package/claude-assets/commands/cfn-mode.md +2 -2
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +12 -0
- package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +273 -0
- package/claude-assets/skills/cfn-environment-sanitization/SKILL.md +200 -0
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +244 -0
- package/claude-assets/skills/cfn-hybrid-routing/README.md +1 -1
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +95 -15
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +76 -11
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup2 +959 -0
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.clean +949 -0
- package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +326 -0
- package/claude-assets/skills/cfn-process-instrumentation/SKILL.md +279 -0
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +323 -0
- package/claude-assets/skills/cfn-product-owner-decision/execute-decision.sh +82 -10
- package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +376 -0
- package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +184 -0
- package/claude-assets/skills/cfn-task-mode-safety/cli-coordination.sh +519 -0
- package/claude-assets/skills/cfn-task-mode-safety/mode-detection.sh +326 -0
- package/claude-assets/skills/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +224 -0
- package/claude-assets/skills/cfn-telemetry/collect-metrics.sh +249 -0
- package/claude-assets/skills/cfn-telemetry/start-telemetry.sh +111 -0
- package/claude-assets/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh +327 -0
- package/dist/agents/agent-loader.js +146 -165
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/config-manager.js +109 -91
- package/dist/cli/config-manager.js.map +1 -1
- package/package.json +1 -1
- package/scripts/mode-detection.sh +321 -0
- package/scripts/spawn-worker.sh +8 -0
- package/scripts/track-zai-costs-simple.sh +8 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Combined Audit Data Retrieval Script
|
|
3
|
+
# Retrieves audit trails from both Task Mode and CLI Mode agents
|
|
4
|
+
#
|
|
5
|
+
# Usage: get-audit-data.sh --task-id <id> [--mode <mode>] [--format <format>]
|
|
6
|
+
#
|
|
7
|
+
# This script provides unified access to audit data from both execution modes,
|
|
8
|
+
# enabling complete audit trail visibility for compliance and debugging.
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
# Colors for output
|
|
13
|
+
RED='\033[0;31m'
|
|
14
|
+
GREEN='\033[0;32m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
BLUE='\033[0;34m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
# Initialize variables
|
|
20
|
+
TASK_ID=""
|
|
21
|
+
MODE="combined"
|
|
22
|
+
FORMAT="json"
|
|
23
|
+
DB_PATH="${HOME}/.claude/memory/cfn-loop.db"
|
|
24
|
+
VERBOSE=false
|
|
25
|
+
|
|
26
|
+
# Parse arguments
|
|
27
|
+
while [[ $# -gt 0 ]]; do
|
|
28
|
+
case $1 in
|
|
29
|
+
--task-id)
|
|
30
|
+
TASK_ID="$2"
|
|
31
|
+
shift 2
|
|
32
|
+
;;
|
|
33
|
+
--mode)
|
|
34
|
+
MODE="$2"
|
|
35
|
+
shift 2
|
|
36
|
+
;;
|
|
37
|
+
--format)
|
|
38
|
+
FORMAT="$2"
|
|
39
|
+
shift 2
|
|
40
|
+
;;
|
|
41
|
+
--verbose)
|
|
42
|
+
VERBOSE=true
|
|
43
|
+
shift
|
|
44
|
+
;;
|
|
45
|
+
--help)
|
|
46
|
+
echo "Usage: $0 --task-id <id> [--mode <mode>] [--format <format>] [--verbose]"
|
|
47
|
+
echo ""
|
|
48
|
+
echo "Options:"
|
|
49
|
+
echo " --task-id <id> Task ID to retrieve audit data for (required)"
|
|
50
|
+
echo " --mode <mode> Retrieval mode: combined|task|cli (default: combined)"
|
|
51
|
+
echo " --format <format> Output format: json|table|summary (default: json)"
|
|
52
|
+
echo " --verbose Show detailed retrieval information"
|
|
53
|
+
echo " --help Show this help message"
|
|
54
|
+
echo ""
|
|
55
|
+
echo "Examples:"
|
|
56
|
+
echo " $0 --task-id task-123"
|
|
57
|
+
echo " $0 --task-id task-123 --mode task --format table"
|
|
58
|
+
echo " $0 --task-id task-123 --mode combined --verbose"
|
|
59
|
+
exit 0
|
|
60
|
+
;;
|
|
61
|
+
*)
|
|
62
|
+
echo "Unknown option: $1" >&2
|
|
63
|
+
echo "Use --help for usage information" >&2
|
|
64
|
+
exit 1
|
|
65
|
+
;;
|
|
66
|
+
esac
|
|
67
|
+
done
|
|
68
|
+
|
|
69
|
+
# Validate required arguments
|
|
70
|
+
if [ -z "$TASK_ID" ]; then
|
|
71
|
+
echo "Error: --task-id is required" >&2
|
|
72
|
+
echo "Use --help for usage information" >&2
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Validate mode
|
|
77
|
+
if [[ ! "$MODE" =~ ^(combined|task|cli)$ ]]; then
|
|
78
|
+
echo "Error: --mode must be one of: combined, task, cli" >&2
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Validate format
|
|
83
|
+
if [[ ! "$FORMAT" =~ ^(json|table|summary)$ ]]; then
|
|
84
|
+
echo "Error: --format must be one of: json, table, summary" >&2
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Helper functions
|
|
89
|
+
log_verbose() {
|
|
90
|
+
if [ "$VERBOSE" = true ]; then
|
|
91
|
+
echo -e "${BLUE}[VERBOSE]${NC} $1" >&2
|
|
92
|
+
fi
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
log_info() {
|
|
96
|
+
echo -e "${GREEN}[INFO]${NC} $1" >&2
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
log_warning() {
|
|
100
|
+
echo -e "${YELLOW}[WARNING]${NC} $1" >&2
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
log_error() {
|
|
104
|
+
echo -e "${RED}[ERROR]${NC} $1" >&2
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# Retrieve Task Mode audit data from Redis
|
|
108
|
+
retrieve_task_mode_redis() {
|
|
109
|
+
local task_id="$1"
|
|
110
|
+
local redis_keys
|
|
111
|
+
local task_data=()
|
|
112
|
+
|
|
113
|
+
log_verbose "Searching for Task Mode Redis keys for task: $task_id"
|
|
114
|
+
|
|
115
|
+
# Find all Task Mode audit keys for this task
|
|
116
|
+
redis_keys=$(redis-cli --scan --pattern "swarm:${task_id}:*:audit" 2>/dev/null || true)
|
|
117
|
+
|
|
118
|
+
if [ -z "$redis_keys" ]; then
|
|
119
|
+
log_warning "No Task Mode Redis audit data found for task: $task_id"
|
|
120
|
+
echo "[]"
|
|
121
|
+
return
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
log_verbose "Found Task Mode Redis keys: $redis_keys"
|
|
125
|
+
|
|
126
|
+
# Retrieve data from each key
|
|
127
|
+
for key in $redis_keys; do
|
|
128
|
+
local agent_type
|
|
129
|
+
local audit_data
|
|
130
|
+
|
|
131
|
+
agent_type=$(echo "$key" | sed "s|swarm:${task_id}:||g" | sed "s|:audit||g")
|
|
132
|
+
|
|
133
|
+
if command -v jq &> /dev/null; then
|
|
134
|
+
audit_data=$(redis-cli HGETALL "$key" 2>/dev/null | jq -n 'reduce inputs as $k ({}; .[$k] = input)' || echo "{}")
|
|
135
|
+
else
|
|
136
|
+
audit_data=$(redis-cli HGETALL "$key" 2>/dev/null || echo "")
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
if [ -n "$audit_data" ] && [ "$audit_data" != "{}" ]; then
|
|
140
|
+
task_data+=("$audit_data")
|
|
141
|
+
fi
|
|
142
|
+
done
|
|
143
|
+
|
|
144
|
+
if [ ${#task_data[@]} -eq 0 ]; then
|
|
145
|
+
echo "[]"
|
|
146
|
+
else
|
|
147
|
+
if command -v jq &> /dev/null; then
|
|
148
|
+
echo "[${task_data[*]}]" | jq 'flatten'
|
|
149
|
+
else
|
|
150
|
+
printf '%s\n' "${task_data[@]}"
|
|
151
|
+
fi
|
|
152
|
+
fi
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Retrieve CLI Mode audit data from Redis
|
|
156
|
+
retrieve_cli_mode_redis() {
|
|
157
|
+
local task_id="$1"
|
|
158
|
+
local redis_keys
|
|
159
|
+
local cli_data=()
|
|
160
|
+
|
|
161
|
+
log_verbose "Searching for CLI Mode Redis keys for task: $task_id"
|
|
162
|
+
|
|
163
|
+
# Find all CLI Mode result keys for this task
|
|
164
|
+
redis_keys=$(redis-cli --scan --pattern "swarm:${task_id}:*:result" 2>/dev/null || true)
|
|
165
|
+
|
|
166
|
+
if [ -z "$redis_keys" ]; then
|
|
167
|
+
log_warning "No CLI Mode Redis audit data found for task: $task_id"
|
|
168
|
+
echo "[]"
|
|
169
|
+
return
|
|
170
|
+
fi
|
|
171
|
+
|
|
172
|
+
log_verbose "Found CLI Mode Redis keys: $redis_keys"
|
|
173
|
+
|
|
174
|
+
# Retrieve data from each key
|
|
175
|
+
for key in $redis_keys; do
|
|
176
|
+
local agent_id
|
|
177
|
+
local result_data
|
|
178
|
+
|
|
179
|
+
agent_id=$(echo "$key" | sed "s|swarm:${task_id}:||g" | sed "s|:result||g")
|
|
180
|
+
|
|
181
|
+
if command -v jq &> /dev/null; then
|
|
182
|
+
result_data=$(redis-cli HGETALL "$key" 2>/dev/null | jq -n 'reduce inputs as $k ({}; .[$k] = input)' || echo "{}")
|
|
183
|
+
else
|
|
184
|
+
result_data=$(redis-cli HGETALL "$key" 2>/dev/null || echo "")
|
|
185
|
+
fi
|
|
186
|
+
|
|
187
|
+
if [ -n "$result_data" ] && [ "$result_data" != "{}" ]; then
|
|
188
|
+
cli_data+=("$result_data")
|
|
189
|
+
fi
|
|
190
|
+
done
|
|
191
|
+
|
|
192
|
+
if [ ${#cli_data[@]} -eq 0 ]; then
|
|
193
|
+
echo "[]"
|
|
194
|
+
else
|
|
195
|
+
if command -v jq &> /dev/null; then
|
|
196
|
+
echo "[${cli_data[*]}]" | jq 'flatten'
|
|
197
|
+
else
|
|
198
|
+
printf '%s\n' "${cli_data[@]}"
|
|
199
|
+
fi
|
|
200
|
+
fi
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# Retrieve audit data from SQLite database
|
|
204
|
+
retrieve_sqlite_data() {
|
|
205
|
+
local task_id="$1"
|
|
206
|
+
local mode="$2"
|
|
207
|
+
local sqlite_data
|
|
208
|
+
|
|
209
|
+
log_verbose "Retrieving SQLite audit data for task: $task_id, mode: $mode"
|
|
210
|
+
|
|
211
|
+
if [ ! -f "$DB_PATH" ]; then
|
|
212
|
+
log_warning "SQLite database not found at: $DB_PATH"
|
|
213
|
+
echo "[]"
|
|
214
|
+
return
|
|
215
|
+
fi
|
|
216
|
+
|
|
217
|
+
local where_clause="task_id = '$task_id'"
|
|
218
|
+
if [ "$mode" != "combined" ]; then
|
|
219
|
+
where_clause="$where_clause AND mode = '$mode'"
|
|
220
|
+
fi
|
|
221
|
+
|
|
222
|
+
sqlite_data=$(sqlite3 "$DB_PATH" 2>/dev/null "
|
|
223
|
+
SELECT
|
|
224
|
+
task_id,
|
|
225
|
+
agent_type,
|
|
226
|
+
decision,
|
|
227
|
+
reasoning,
|
|
228
|
+
confidence,
|
|
229
|
+
mode,
|
|
230
|
+
deliverables,
|
|
231
|
+
timestamp,
|
|
232
|
+
created_at,
|
|
233
|
+
metadata
|
|
234
|
+
FROM agent_audit
|
|
235
|
+
WHERE $where_clause
|
|
236
|
+
ORDER BY timestamp, agent_type;
|
|
237
|
+
" || echo "")
|
|
238
|
+
|
|
239
|
+
if [ -z "$sqlite_data" ]; then
|
|
240
|
+
echo "[]"
|
|
241
|
+
return
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
# Convert to JSON
|
|
245
|
+
if command -v jq &> /dev/null; then
|
|
246
|
+
echo "$sqlite_data" | awk -F'|' '
|
|
247
|
+
NR > 1 {
|
|
248
|
+
gsub(/"/, "\\\"", $0)
|
|
249
|
+
print "{"
|
|
250
|
+
print " \"task_id\": \"" $1 "\","
|
|
251
|
+
print " \"agent_type\": \"" $2 "\","
|
|
252
|
+
print " \"decision\": \"" $3 "\","
|
|
253
|
+
print " \"reasoning\": \"" $4 "\","
|
|
254
|
+
print " \"confidence\": " $5 ","
|
|
255
|
+
print " \"mode\": \"" $6 "\","
|
|
256
|
+
print " \"deliverables\": " $7 ","
|
|
257
|
+
print " \"timestamp\": " $8 ","
|
|
258
|
+
print " \"created_at\": \"" $9 "\","
|
|
259
|
+
print " \"metadata\": " $10
|
|
260
|
+
print "}"
|
|
261
|
+
}
|
|
262
|
+
' | jq -s '.'
|
|
263
|
+
else
|
|
264
|
+
echo "$sqlite_data" | awk -F'|' 'NR > 1 {print $0}'
|
|
265
|
+
fi
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
# Format output as table
|
|
269
|
+
format_as_table() {
|
|
270
|
+
local data="$1"
|
|
271
|
+
|
|
272
|
+
if ! command -v jq &> /dev/null; then
|
|
273
|
+
echo "Error: jq is required for table formatting" >&2
|
|
274
|
+
echo "$data"
|
|
275
|
+
return
|
|
276
|
+
fi
|
|
277
|
+
|
|
278
|
+
echo "$data" | jq -r '
|
|
279
|
+
.[] |
|
|
280
|
+
[
|
|
281
|
+
.task_id // "N/A",
|
|
282
|
+
.agent_type // "N/A",
|
|
283
|
+
.decision // "N/A",
|
|
284
|
+
(.confidence // 0 | tostring),
|
|
285
|
+
.mode // "N/A",
|
|
286
|
+
(.deliverables // [] | join(", "))
|
|
287
|
+
] | @tsv
|
|
288
|
+
' | {
|
|
289
|
+
echo -e "TASK_ID\tAGENT_TYPE\tDECISION\tCONFIDENCE\tMODE\tDELIVERABLES"
|
|
290
|
+
echo -e "-------\t-----------\t--------\t----------\t----\t-----------"
|
|
291
|
+
cat
|
|
292
|
+
} | column -t -s $'\t'
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
# Format output as summary
|
|
296
|
+
format_as_summary() {
|
|
297
|
+
local data="$1"
|
|
298
|
+
|
|
299
|
+
if ! command -v jq &> /dev/null; then
|
|
300
|
+
echo "Error: jq is required for summary formatting" >&2
|
|
301
|
+
echo "$data"
|
|
302
|
+
return
|
|
303
|
+
fi
|
|
304
|
+
|
|
305
|
+
local total_agents
|
|
306
|
+
local task_mode_agents
|
|
307
|
+
local cli_mode_agents
|
|
308
|
+
local avg_confidence
|
|
309
|
+
local decisions
|
|
310
|
+
|
|
311
|
+
total_agents=$(echo "$data" | jq '. | length')
|
|
312
|
+
task_mode_agents=$(echo "$data" | jq '[.[] | select(.mode == "Task")] | length')
|
|
313
|
+
cli_mode_agents=$(echo "$data" | jq '[.[] | select(.mode == "CLI")] | length')
|
|
314
|
+
avg_confidence=$(echo "$data" | jq '[.[] | select(.confidence != null) | .confidence] | add / (length | if . == 0 then 1 else . end)')
|
|
315
|
+
decisions=$(echo "$data" | jq -r '[.[] | .decision // "UNKNOWN"] | sort | group_by(.) | map({decision: .[0], count: length}) | .[] | "\(.decision): \(.count)"' | tr '\n' ', ' | sed 's/,$//')
|
|
316
|
+
|
|
317
|
+
echo "=== AUDIT SUMMARY FOR TASK: $TASK_ID ==="
|
|
318
|
+
echo "Total Agents: $total_agents"
|
|
319
|
+
echo "Task Mode Agents: $task_mode_agents"
|
|
320
|
+
echo "CLI Mode Agents: $cli_mode_agents"
|
|
321
|
+
echo "Average Confidence: $(printf "%.2f" "$avg_confidence")"
|
|
322
|
+
echo "Decisions: $decisions"
|
|
323
|
+
echo ""
|
|
324
|
+
echo "=== AGENT BREAKDOWN ==="
|
|
325
|
+
echo "$data" | jq -r '.[] | "- \(.agent_type // "Unknown") (\(.mode // "Unknown")): \(.decision // "Unknown") (confidence: \(.confidence // "N/A"))"'
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
# Main retrieval logic
|
|
329
|
+
log_info "Retrieving audit data for task: $TASK_ID (mode: $MODE, format: $FORMAT)"
|
|
330
|
+
|
|
331
|
+
# Initialize result containers
|
|
332
|
+
task_mode_data="[]"
|
|
333
|
+
cli_mode_data="[]"
|
|
334
|
+
sqlite_data="[]"
|
|
335
|
+
|
|
336
|
+
# Retrieve data based on mode
|
|
337
|
+
case "$MODE" in
|
|
338
|
+
"task")
|
|
339
|
+
log_verbose "Retrieving Task Mode data only"
|
|
340
|
+
task_mode_data=$(retrieve_task_mode_redis "$TASK_ID")
|
|
341
|
+
sqlite_data=$(retrieve_sqlite_data "$TASK_ID" "Task")
|
|
342
|
+
;;
|
|
343
|
+
"cli")
|
|
344
|
+
log_verbose "Retrieving CLI Mode data only"
|
|
345
|
+
cli_mode_data=$(retrieve_cli_mode_redis "$TASK_ID")
|
|
346
|
+
sqlite_data=$(retrieve_sqlite_data "$TASK_ID" "CLI")
|
|
347
|
+
;;
|
|
348
|
+
"combined")
|
|
349
|
+
log_verbose "Retrieving combined Task Mode and CLI Mode data"
|
|
350
|
+
task_mode_data=$(retrieve_task_mode_redis "$TASK_ID")
|
|
351
|
+
cli_mode_data=$(retrieve_cli_mode_redis "$TASK_ID")
|
|
352
|
+
sqlite_data=$(retrieve_sqlite_data "$TASK_ID" "combined")
|
|
353
|
+
;;
|
|
354
|
+
esac
|
|
355
|
+
|
|
356
|
+
# Combine all data
|
|
357
|
+
if command -v jq &> /dev/null; then
|
|
358
|
+
combined_data=$(echo "$task_mode_data $cli_mode_data $sqlite_data" | jq -s 'flatten | group_by(.task_id + .agent_type + .timestamp) | map(.[0])')
|
|
359
|
+
else
|
|
360
|
+
combined_data=$(printf '%s\n%s\n%s' "$task_mode_data" "$cli_mode_data" "$sqlite_data")
|
|
361
|
+
fi
|
|
362
|
+
|
|
363
|
+
# Format and output results
|
|
364
|
+
case "$FORMAT" in
|
|
365
|
+
"json")
|
|
366
|
+
echo "$combined_data"
|
|
367
|
+
;;
|
|
368
|
+
"table")
|
|
369
|
+
format_as_table "$combined_data"
|
|
370
|
+
;;
|
|
371
|
+
"summary")
|
|
372
|
+
format_as_summary "$combined_data"
|
|
373
|
+
;;
|
|
374
|
+
esac
|
|
375
|
+
|
|
376
|
+
log_verbose "Audit data retrieval completed for task: $TASK_ID"
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Task Mode Audit Storage Script
|
|
3
|
+
# Stores Task Mode agent output in Redis/SQLite for complete audit trail
|
|
4
|
+
#
|
|
5
|
+
# Usage: store-task-audit.sh --task-id <id> --agent-type <type> --output <json>
|
|
6
|
+
#
|
|
7
|
+
# This script provides audit storage for Task Mode agents while maintaining
|
|
8
|
+
# ANTI-023 memory leak protection by keeping agents out of Redis coordination
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
# Colors for output
|
|
13
|
+
RED='\033[0;31m'
|
|
14
|
+
GREEN='\033[0;32m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
NC='\033[0m'
|
|
17
|
+
|
|
18
|
+
# Initialize variables
|
|
19
|
+
TASK_ID=""
|
|
20
|
+
AGENT_TYPE=""
|
|
21
|
+
OUTPUT=""
|
|
22
|
+
MODE="Task"
|
|
23
|
+
TIMESTAMP=""
|
|
24
|
+
DB_PATH="${HOME}/.claude/memory/cfn-loop.db"
|
|
25
|
+
|
|
26
|
+
# Parse arguments
|
|
27
|
+
while [[ $# -gt 0 ]]; do
|
|
28
|
+
case $1 in
|
|
29
|
+
--task-id)
|
|
30
|
+
TASK_ID="$2"
|
|
31
|
+
shift 2
|
|
32
|
+
;;
|
|
33
|
+
--agent-type)
|
|
34
|
+
AGENT_TYPE="$2"
|
|
35
|
+
shift 2
|
|
36
|
+
;;
|
|
37
|
+
--output)
|
|
38
|
+
OUTPUT="$2"
|
|
39
|
+
shift 2
|
|
40
|
+
;;
|
|
41
|
+
--mode)
|
|
42
|
+
MODE="$2"
|
|
43
|
+
shift 2
|
|
44
|
+
;;
|
|
45
|
+
*)
|
|
46
|
+
echo "Unknown option: $1" >&2
|
|
47
|
+
exit 1
|
|
48
|
+
;;
|
|
49
|
+
esac
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# Validate required arguments
|
|
53
|
+
if [ -z "$TASK_ID" ] || [ -z "$AGENT_TYPE" ] || [ -z "$OUTPUT" ]; then
|
|
54
|
+
echo "Error: Missing required parameters" >&2
|
|
55
|
+
echo "Usage: $0 --task-id <id> --agent-type <type> --output <json> [--mode <mode>]" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Generate timestamp
|
|
60
|
+
TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
61
|
+
|
|
62
|
+
# Ensure database directory exists
|
|
63
|
+
mkdir -p "$(dirname "$DB_PATH")"
|
|
64
|
+
|
|
65
|
+
# Initialize SQLite database if needed
|
|
66
|
+
if [ ! -f "$DB_PATH" ]; then
|
|
67
|
+
echo "Initializing audit database..." >&2
|
|
68
|
+
sqlite3 "$DB_PATH" <<'EOF'
|
|
69
|
+
CREATE TABLE IF NOT EXISTS agent_audit (
|
|
70
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
71
|
+
task_id TEXT NOT NULL,
|
|
72
|
+
agent_type TEXT NOT NULL,
|
|
73
|
+
decision TEXT,
|
|
74
|
+
reasoning TEXT,
|
|
75
|
+
confidence REAL,
|
|
76
|
+
mode TEXT NOT NULL,
|
|
77
|
+
deliverables TEXT, -- JSON array
|
|
78
|
+
timestamp INTEGER NOT NULL,
|
|
79
|
+
created_at TEXT NOT NULL,
|
|
80
|
+
metadata TEXT -- JSON
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_audit_task ON agent_audit(task_id);
|
|
84
|
+
CREATE INDEX IF NOT EXISTS idx_audit_agent ON agent_audit(agent_type);
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON agent_audit(timestamp);
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_audit_mode ON agent_audit(mode);
|
|
87
|
+
EOF
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# Parse JSON output using jq (fallback to basic parsing if jq unavailable)
|
|
91
|
+
DECISION=""
|
|
92
|
+
REASONING=""
|
|
93
|
+
CONFIDENCE=""
|
|
94
|
+
DELIVERABLES="[]"
|
|
95
|
+
|
|
96
|
+
if command -v jq &> /dev/null; then
|
|
97
|
+
# Use jq for robust JSON parsing
|
|
98
|
+
DECISION=$(echo "$OUTPUT" | jq -r '.decision // "UNKNOWN"')
|
|
99
|
+
REASONING=$(echo "$OUTPUT" | jq -r '.reasoning // ""')
|
|
100
|
+
CONFIDENCE=$(echo "$OUTPUT" | jq -r '.confidence // 0.0')
|
|
101
|
+
DELIVERABLES=$(echo "$OUTPUT" | jq -r '(.deliverables // []) | tostring')
|
|
102
|
+
else
|
|
103
|
+
# Fallback: basic string parsing
|
|
104
|
+
DECISION=$(echo "$OUTPUT" | grep -o '"decision":"[^"]*"' | cut -d'"' -f4 || echo "UNKNOWN")
|
|
105
|
+
REASONING=$(echo "$OUTPUT" | grep -o '"reasoning":"[^"]*"' | cut -d'"' -f4 || echo "")
|
|
106
|
+
CONFIDENCE=$(echo "$OUTPUT" | grep -o '"confidence":[0-9.]*' | cut -d: -f2 || echo "0.0")
|
|
107
|
+
DELIVERABLES=$(echo "$OUTPUT" | grep -o '"deliverables":\[[^]]*\]' | sed 's/"deliverables":\[//g' | sed 's/\]//g' || echo "[]")
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Validate confidence is a number
|
|
111
|
+
if ! [[ "$CONFIDENCE" =~ ^[0-9]*\.?[0-9]*$ ]]; then
|
|
112
|
+
CONFIDENCE="0.0"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# Store in Redis (fast access for Main Chat coordination)
|
|
116
|
+
echo -e "${YELLOW}💾 Storing Task Mode audit data in Redis...${NC}"
|
|
117
|
+
REDIS_KEY="swarm:${TASK_ID}:${AGENT_TYPE}:audit"
|
|
118
|
+
|
|
119
|
+
redis-cli HSET "$REDIS_KEY" \
|
|
120
|
+
"decision" "$DECISION" \
|
|
121
|
+
"reasoning" "$REASONING" \
|
|
122
|
+
"confidence" "$CONFIDENCE" \
|
|
123
|
+
"mode" "$MODE" \
|
|
124
|
+
"deliverables" "$DELIVERABLES" \
|
|
125
|
+
"timestamp" "$TIMESTAMP" \
|
|
126
|
+
"agent_output" "$OUTPUT" > /dev/null
|
|
127
|
+
|
|
128
|
+
# Set TTL for Redis (24 hours)
|
|
129
|
+
redis-cli EXPIRE "$REDIS_KEY" 86400 > /dev/null
|
|
130
|
+
|
|
131
|
+
# Store in SQLite (permanent audit trail)
|
|
132
|
+
echo -e "${GREEN}💾 Storing Task Mode audit data in SQLite...${NC}"
|
|
133
|
+
UNIX_TIMESTAMP=$(date -d "$TIMESTAMP" +%s 2>/dev/null || date +%s)
|
|
134
|
+
|
|
135
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
136
|
+
INSERT OR REPLACE INTO agent_audit (
|
|
137
|
+
task_id, agent_type, decision, reasoning, confidence, mode,
|
|
138
|
+
deliverables, timestamp, created_at, metadata
|
|
139
|
+
) VALUES (
|
|
140
|
+
'$TASK_ID', '$AGENT_TYPE', '$DECISION', '$REASONING', $CONFIDENCE, '$MODE',
|
|
141
|
+
'$DELIVERABLES', $UNIX_TIMESTAMP, '$TIMESTAMP',
|
|
142
|
+
'{"stored_via": "store-task-audit.sh", "version": "1.0.0"}'
|
|
143
|
+
);
|
|
144
|
+
EOF
|
|
145
|
+
|
|
146
|
+
# Store metadata in Redis for quick access
|
|
147
|
+
METADATA_KEY="swarm:${TASK_ID}:metadata"
|
|
148
|
+
redis-cli HSET "$METADATA_KEY" \
|
|
149
|
+
"task_mode_audit" "true" \
|
|
150
|
+
"last_agent" "$AGENT_TYPE" \
|
|
151
|
+
"last_decision" "$DECISION" \
|
|
152
|
+
"last_confidence" "$CONFIDENCE" \
|
|
153
|
+
"last_updated" "$TIMESTAMP" > /dev/null
|
|
154
|
+
|
|
155
|
+
redis-cli EXPIRE "$METADATA_KEY" 86400 > /dev/null
|
|
156
|
+
|
|
157
|
+
# Output success information
|
|
158
|
+
echo -e "${GREEN}✅ Task Mode audit stored successfully${NC}"
|
|
159
|
+
echo -e " Task ID: $TASK_ID"
|
|
160
|
+
echo -e " Agent Type: $AGENT_TYPE"
|
|
161
|
+
echo -e " Decision: $DECISION"
|
|
162
|
+
echo -e " Confidence: $CONFIDENCE"
|
|
163
|
+
echo -e " Mode: $MODE"
|
|
164
|
+
echo -e " Deliverables: $DELIVERABLES"
|
|
165
|
+
echo -e " Timestamp: $TIMESTAMP"
|
|
166
|
+
|
|
167
|
+
# Store agent output for debugging (optional, size-limited)
|
|
168
|
+
if [ ${#OUTPUT} -le 1000 ]; then
|
|
169
|
+
OUTPUT_KEY="swarm:${TASK_ID}:${AGENT_TYPE}:output"
|
|
170
|
+
redis-cli HSET "$OUTPUT_KEY" "data" "$OUTPUT" "timestamp" "$TIMESTAMP" > /dev/null
|
|
171
|
+
redis-cli EXPIRE "$OUTPUT_KEY" 3600 > /dev/null
|
|
172
|
+
echo -e " Output: ${#OUTPUT} characters stored in Redis"
|
|
173
|
+
else
|
|
174
|
+
echo -e " Output: ${#OUTPUT} characters (too large for Redis, logged in SQLite only)"
|
|
175
|
+
fi
|
|
176
|
+
|
|
177
|
+
# Log to file for debugging
|
|
178
|
+
LOG_DIR="${HOME}/.claude/logs/task-audit"
|
|
179
|
+
mkdir -p "$LOG_DIR"
|
|
180
|
+
LOG_FILE="$LOG_DIR/task-audit-$(date +%Y%m%d).log"
|
|
181
|
+
|
|
182
|
+
echo "[$TIMESTAMP] TASK_MODE_AUDIT: task_id=$TASK_ID agent_type=$AGENT_TYPE decision=$DECISION confidence=$CONFIDENCE mode=$MODE" >> "$LOG_FILE"
|
|
183
|
+
|
|
184
|
+
exit 0
|