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.
Files changed (164) hide show
  1. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +4 -14
  2. package/.claude/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +481 -0
  3. package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md +3 -4
  4. package/.claude/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +371 -0
  5. package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +20 -26
  6. package/.claude/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +637 -0
  7. package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md +295 -50
  8. package/.claude/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +398 -0
  9. package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md +27 -25
  10. package/.claude/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +401 -0
  11. package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md +5 -106
  12. package/.claude/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +552 -0
  13. package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md +5 -25
  14. package/.claude/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +223 -0
  15. package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md +5 -27
  16. package/.claude/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +367 -0
  17. package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md +5 -27
  18. package/.claude/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +247 -0
  19. package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md +5 -27
  20. package/.claude/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +269 -0
  21. package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md +5 -25
  22. package/.claude/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +311 -0
  23. package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md +6 -26
  24. package/.claude/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +222 -0
  25. package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md +5 -25
  26. package/.claude/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +408 -0
  27. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md +6 -26
  28. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +354 -0
  29. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md +4 -4
  30. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +561 -0
  31. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md +2 -2
  32. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +480 -0
  33. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md +1 -1
  34. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +448 -0
  35. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md +2 -2
  36. package/.claude/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +329 -0
  37. package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md +361 -199
  38. package/.claude/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +208 -0
  39. package/.claude/commands/CFN_LOOP_TASK_MODE.md +100 -11
  40. package/.claude/commands/cfn-mode.md +2 -2
  41. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh +12 -0
  42. package/.claude/skills/cfn-agent-spawning/spawn-agent.sh.backup +273 -0
  43. package/.claude/skills/cfn-hybrid-routing/README.md +1 -1
  44. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +95 -15
  45. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup +76 -11
  46. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.backup2 +959 -0
  47. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh.clean +949 -0
  48. package/.claude/skills/cfn-product-owner-decision/execute-decision.sh +82 -10
  49. package/claude-assets/agents/cfn-dev-team/CLAUDE.md +24 -14
  50. package/claude-assets/agents/cfn-dev-team/architecture/api-designer-persona.md +0 -7
  51. package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +12 -38
  52. package/claude-assets/agents/cfn-dev-team/architecture/goal-planner.md +0 -10
  53. package/claude-assets/agents/cfn-dev-team/architecture/planner.md +7 -57
  54. package/claude-assets/agents/cfn-dev-team/architecture/system-architect.md +8 -45
  55. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +365 -25
  56. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +504 -448
  57. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +428 -167
  58. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +472 -20
  59. package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +5 -5
  60. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +5 -7
  61. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +0 -6
  62. package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +3 -3
  63. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -14
  64. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +0 -6
  65. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +2 -2
  66. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +10 -56
  67. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +7 -26
  68. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +8 -48
  69. package/claude-assets/agents/cfn-dev-team/documentation/api-documentation.md +1 -1
  70. package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +3 -11
  71. package/claude-assets/agents/cfn-dev-team/documentation/specification-agent.md +6 -16
  72. package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +7 -19
  73. package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +9 -49
  74. package/claude-assets/agents/cfn-dev-team/product-owners/product-owner.md +291 -86
  75. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +9 -81
  76. package/claude-assets/agents/cfn-dev-team/reviewers/quality/cyclomatic-complexity-reducer.md +4 -64
  77. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +7 -87
  78. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +8 -12
  79. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +11 -129
  80. package/claude-assets/agents/cfn-dev-team/reviewers/reviewer.md +231 -280
  81. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +0 -6
  82. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +0 -6
  83. package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +7 -32
  84. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +9 -47
  85. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +0 -6
  86. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +12 -28
  87. package/claude-assets/agents/cfn-dev-team/testers/tester.md +167 -236
  88. package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +7 -27
  89. package/claude-assets/agents/cfn-dev-team/testers/validation/validation-production-validator.md +7 -19
  90. package/claude-assets/agents/cfn-dev-team/testing/test-validation-agent.md +10 -47
  91. package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +40 -116
  92. package/claude-assets/agents/cfn-dev-team/utility/analyst.md +7 -47
  93. package/claude-assets/agents/cfn-dev-team/utility/code-booster.md +7 -40
  94. package/claude-assets/agents/cfn-dev-team/utility/context-curator.md +7 -47
  95. package/claude-assets/agents/cfn-dev-team/{coordinators → utility}/epic-creator.md +29 -0
  96. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md +4 -14
  97. package/claude-assets/cfn-agents-ignore/cfn-seo-team/AGENT_CREATION_REPORT.md.backup +481 -0
  98. package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md +3 -4
  99. package/claude-assets/cfn-agents-ignore/cfn-seo-team/DELEGATION_MATRIX.md.backup +371 -0
  100. package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md +20 -26
  101. package/claude-assets/cfn-agents-ignore/cfn-seo-team/INTEGRATION_REQUIREMENTS.md.backup +637 -0
  102. package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md +295 -50
  103. package/claude-assets/cfn-agents-ignore/cfn-seo-team/cfn-seo-coordinator.md.backup +398 -0
  104. package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md +27 -25
  105. package/claude-assets/cfn-agents-ignore/cfn-seo-team/competitive-seo-analyst.md.backup +401 -0
  106. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md +5 -106
  107. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-atomization-specialist.md.backup +552 -0
  108. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md +5 -25
  109. package/claude-assets/cfn-agents-ignore/cfn-seo-team/content-seo-strategist.md.backup +223 -0
  110. package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md +5 -27
  111. package/claude-assets/cfn-agents-ignore/cfn-seo-team/eeat-content-auditor.md.backup +367 -0
  112. package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md +5 -27
  113. package/claude-assets/cfn-agents-ignore/cfn-seo-team/geo-optimization-expert.md.backup +247 -0
  114. package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md +5 -27
  115. package/claude-assets/cfn-agents-ignore/cfn-seo-team/link-building-specialist.md.backup +269 -0
  116. package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md +5 -25
  117. package/claude-assets/cfn-agents-ignore/cfn-seo-team/local-seo-optimizer.md.backup +311 -0
  118. package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md +6 -26
  119. package/claude-assets/cfn-agents-ignore/cfn-seo-team/programmatic-seo-engineer.md.backup +222 -0
  120. package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md +5 -25
  121. package/claude-assets/cfn-agents-ignore/cfn-seo-team/schema-markup-engineer.md.backup +408 -0
  122. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md +6 -26
  123. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-analytics-specialist.md.backup +354 -0
  124. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md +4 -4
  125. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/accessibility-validator.md.backup +561 -0
  126. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md +2 -2
  127. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/audience-validator.md.backup +480 -0
  128. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md +1 -1
  129. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/branding-validator.md.backup +448 -0
  130. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md +2 -2
  131. package/claude-assets/cfn-agents-ignore/cfn-seo-team/seo-validators/humanizer-validator.md.backup +329 -0
  132. package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md +361 -199
  133. package/claude-assets/cfn-agents-ignore/cfn-seo-team/technical-seo-specialist.md.backup +208 -0
  134. package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +100 -11
  135. package/claude-assets/commands/cfn-mode.md +2 -2
  136. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh +12 -0
  137. package/claude-assets/skills/cfn-agent-spawning/spawn-agent.sh.backup +273 -0
  138. package/claude-assets/skills/cfn-environment-sanitization/SKILL.md +200 -0
  139. package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +244 -0
  140. package/claude-assets/skills/cfn-hybrid-routing/README.md +1 -1
  141. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +95 -15
  142. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup +76 -11
  143. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.backup2 +959 -0
  144. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh.clean +949 -0
  145. package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +326 -0
  146. package/claude-assets/skills/cfn-process-instrumentation/SKILL.md +279 -0
  147. package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +323 -0
  148. package/claude-assets/skills/cfn-product-owner-decision/execute-decision.sh +82 -10
  149. package/claude-assets/skills/cfn-task-audit/get-audit-data.sh +376 -0
  150. package/claude-assets/skills/cfn-task-audit/store-task-audit.sh +184 -0
  151. package/claude-assets/skills/cfn-task-mode-safety/cli-coordination.sh +519 -0
  152. package/claude-assets/skills/cfn-task-mode-safety/mode-detection.sh +326 -0
  153. package/claude-assets/skills/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +224 -0
  154. package/claude-assets/skills/cfn-telemetry/collect-metrics.sh +249 -0
  155. package/claude-assets/skills/cfn-telemetry/start-telemetry.sh +111 -0
  156. package/claude-assets/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh +327 -0
  157. package/dist/agents/agent-loader.js +146 -165
  158. package/dist/agents/agent-loader.js.map +1 -1
  159. package/dist/cli/config-manager.js +109 -91
  160. package/dist/cli/config-manager.js.map +1 -1
  161. package/package.json +1 -1
  162. package/scripts/mode-detection.sh +321 -0
  163. package/scripts/spawn-worker.sh +8 -0
  164. 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