claude-flow-novice 2.15.1 → 2.15.3
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/agents/google-sheets-specialist.md +614 -0
- package/.claude/commands/cfn/create-handoff.md +224 -0
- package/.claude/hooks/cfn-BACKUP_USAGE.md +243 -243
- package/.claude/hooks/cfn-invoke-security-validation.sh +69 -69
- package/.claude/hooks/cfn-post-edit-cfn-retrospective.sh +78 -78
- package/.claude/hooks/cfn-post-edit.config.json +44 -44
- package/.claude/skills/agent-lifecycle/SKILL.md +60 -0
- package/.claude/skills/agent-lifecycle/execute-lifecycle-hook.sh +573 -0
- package/.claude/skills/agent-lifecycle/simple-audit.sh +31 -0
- package/.claude/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
- package/.claude/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/.claude/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
- package/.claude/skills/cfn-redis-coordination/get-context.sh +112 -112
- package/.claude/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
- package/.claude/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/.claude/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/.claude/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/.claude/skills/cfn-transparency-middleware/tests/input-validation.sh +92 -92
- package/.claude/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +662 -0
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +29 -0
- package/claude-assets/cfn-extras/agents/google-sheets-specialist.md +614 -0
- package/claude-assets/commands/cfn/create-handoff.md +224 -0
- package/claude-assets/hooks/cfn-BACKUP_USAGE.md +243 -243
- package/claude-assets/hooks/cfn-invoke-security-validation.sh +69 -69
- package/claude-assets/hooks/cfn-post-edit-cfn-retrospective.sh +78 -78
- package/claude-assets/hooks/cfn-post-edit.config.json +44 -44
- package/claude-assets/hooks/cfn-post-execution/memory-cleanup.sh +19 -19
- package/claude-assets/hooks/cfn-pre-execution/memory-check.sh +19 -19
- package/claude-assets/skills/agent-lifecycle/execute-lifecycle-hook.sh +572 -572
- package/claude-assets/skills/agent-lifecycle/simple-audit.sh +30 -30
- package/claude-assets/skills/cfn-automatic-memory-persistence/persist-agent-output.sh +48 -48
- package/claude-assets/skills/cfn-automatic-memory-persistence/query-agent-history.sh +34 -34
- package/claude-assets/skills/cfn-deliverable-validation/confidence-calculator.sh +261 -261
- package/claude-assets/skills/cfn-expert-update/update-expert.sh +345 -345
- package/claude-assets/skills/cfn-hybrid-routing/check-dependencies.sh +51 -51
- package/claude-assets/skills/cfn-intervention-detector/detect-intervention.sh +110 -110
- package/claude-assets/skills/cfn-intervention-orchestrator/execute-intervention.sh +58 -58
- package/claude-assets/skills/cfn-loop-validation/orchestrate-cfn-loop.sh +252 -252
- package/claude-assets/skills/cfn-loop2-output-processing/process-validator-output.sh +275 -275
- package/claude-assets/skills/cfn-memory-management/check-memory.sh +159 -159
- package/claude-assets/skills/cfn-memory-management/cleanup-memory.sh +196 -196
- package/claude-assets/skills/cfn-node-heap-sizer/task-mode-heap-limiter.sh +325 -325
- package/claude-assets/skills/cfn-playbook-auto-update/auto-update-playbook.sh +85 -85
- package/claude-assets/skills/cfn-redis-coordination/agent-recovery.sh +74 -74
- package/claude-assets/skills/cfn-redis-coordination/get-context.sh +112 -112
- package/claude-assets/skills/cfn-scope-simplifier/simplify-scope.sh +67 -67
- package/claude-assets/skills/cfn-specialist-injection/recommend-specialist.sh +56 -56
- package/claude-assets/skills/cfn-standardized-error-handling/capture-agent-error.sh +86 -86
- package/claude-assets/skills/cfn-standardized-error-handling/test-error-handling.sh +165 -165
- package/claude-assets/skills/cfn-task-config-init/initialize-config.sh +264 -264
- package/claude-assets/skills/cfn-task-decomposition/task-decomposer.sh +278 -278
- package/claude-assets/skills/cfn-transparency-middleware/middleware-config.sh +28 -28
- package/claude-assets/skills/cfn-transparency-middleware/performance-benchmark.sh +78 -78
- package/claude-assets/skills/cfn-transparency-middleware/test-integration.sh +161 -161
- package/claude-assets/skills/cfn-transparency-middleware/test-transparency-skill.sh +367 -367
- package/claude-assets/skills/cfn-transparency-middleware/tests/input-validation.sh +92 -92
- package/claude-assets/skills/cfn-transparency-middleware/wrap-agent.sh +131 -131
- package/claude-assets/skills/docker-build/SKILL.md +96 -203
- package/claude-assets/skills/docker-build/build.sh +73 -73
- package/claude-assets/skills/integration/agent-handoff.sh +494 -0
- package/claude-assets/skills/integration/file-operations.sh +414 -0
- package/claude-assets/skills/workflow-codification/APPROVAL_WORKFLOW.md +806 -0
- package/claude-assets/skills/workflow-codification/COST_TRACKING.md +637 -0
- package/claude-assets/skills/workflow-codification/EDGE_CASE_TRACKING.md +404 -0
- package/claude-assets/skills/workflow-codification/README_PHASE4.md +457 -0
- package/claude-assets/skills/workflow-codification/SKILL.md +110 -0
- package/claude-assets/skills/workflow-codification/analyze-patterns.sh +899 -0
- package/claude-assets/skills/workflow-codification/approval-workflow.sh +514 -0
- package/claude-assets/skills/workflow-codification/generate-skill-update.sh +525 -0
- package/claude-assets/skills/workflow-codification/review-skill.sh +643 -0
- package/claude-assets/skills/workflow-codification/templates/email-notification.txt +114 -0
- package/claude-assets/skills/workflow-codification/templates/slack-notification.md +85 -0
- package/claude-assets/skills/workflow-codification/test-integration.sh +281 -0
- package/claude-assets/skills/workflow-codification/track-cost-savings.sh +445 -0
- package/claude-assets/skills/workflow-codification/track-edge-case.sh +323 -0
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/config-manager.js +91 -109
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/integration/DatabaseHandoff.js +507 -0
- package/dist/integration/DatabaseHandoff.js.map +1 -0
- package/dist/integration/StandardAdapter.js +291 -0
- package/dist/integration/StandardAdapter.js.map +1 -0
- package/dist/lib/agent-output-parser.js +518 -0
- package/dist/lib/agent-output-parser.js.map +1 -0
- package/dist/lib/agent-output-validator.js +950 -0
- package/dist/lib/agent-output-validator.js.map +1 -0
- package/dist/lib/artifact-registry.js +443 -0
- package/dist/lib/artifact-registry.js.map +1 -0
- package/dist/lib/config-validator.js +687 -0
- package/dist/lib/config-validator.js.map +1 -0
- package/dist/types/agent-output.js +44 -0
- package/dist/types/agent-output.js.map +1 -0
- package/dist/types/config.js +28 -0
- package/dist/types/config.js.map +1 -0
- package/package.json +2 -1
- package/scripts/artifact-cleanup.sh +392 -0
- package/scripts/build-linux.sh +78 -0
- package/scripts/deploy-production.sh +355 -355
- package/scripts/docker-playwright-fix.sh +311 -311
- package/scripts/docker-rebuild-all-agents.sh +127 -127
- package/scripts/memory-leak-prevention.sh +305 -305
- package/scripts/migrate-artifacts.sh +563 -0
- package/scripts/migrate-yaml-to-json.sh +465 -0
- package/scripts/run-marketing-tests.sh +42 -42
- package/scripts/update_paths.sh +46 -46
|
@@ -1,326 +1,326 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# CFN Node.js Heap Size Limiter for Task Mode
|
|
3
|
-
# Dynamically adjusts NODE_OPTIONS based on execution mode to prevent memory bloat
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
# Configuration
|
|
8
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
-
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
10
|
-
|
|
11
|
-
# Mode-based heap sizes (in MB)
|
|
12
|
-
declare -A HEAP_SIZES=(
|
|
13
|
-
["task"]="2048" # 2GB for Task mode (conservative)
|
|
14
|
-
["cli"]="8192" # 8GB for CLI mode (production)
|
|
15
|
-
["debug"]="1024" # 1GB for debugging (minimal)
|
|
16
|
-
["test"]="3072" # 3GB for testing (moderate)
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
# Default heap sizes by tool type
|
|
20
|
-
declare -A TOOL_HEAPS=(
|
|
21
|
-
["node"]="2048"
|
|
22
|
-
["bun"]="3072"
|
|
23
|
-
["playwright"]="4096"
|
|
24
|
-
["test"]="1536"
|
|
25
|
-
["validator"]="1024"
|
|
26
|
-
["reviewer"]="1024"
|
|
27
|
-
["tester"]="1024"
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
# Function to detect current execution mode
|
|
31
|
-
detect_execution_mode() {
|
|
32
|
-
# Use existing mode detection if available
|
|
33
|
-
if [[ -f "$PROJECT_ROOT/.claude/skills/cfn-task-mode-safety/mode-detection.sh" ]]; then
|
|
34
|
-
source "$PROJECT_ROOT/.claude/skills/cfn-task-mode-safety/mode-detection.sh"
|
|
35
|
-
detect_execution_mode 2>/dev/null && return 0
|
|
36
|
-
fi
|
|
37
|
-
|
|
38
|
-
# Fallback detection
|
|
39
|
-
if [[ -n "${CFN_MODE:-}" ]]; then
|
|
40
|
-
echo "$CFN_MODE"
|
|
41
|
-
elif [[ -n "${TASK_ID:-}" && -n "${AGENT_ID:-}" ]]; then
|
|
42
|
-
echo "cli"
|
|
43
|
-
else
|
|
44
|
-
echo "task" # Safe default
|
|
45
|
-
fi
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
# Function to determine tool type from command line
|
|
49
|
-
detect_tool_type() {
|
|
50
|
-
local command="$1"
|
|
51
|
-
local command_name=$(basename "$command")
|
|
52
|
-
|
|
53
|
-
case "$command_name" in
|
|
54
|
-
"node"|"bun")
|
|
55
|
-
# Look at script name to determine tool type
|
|
56
|
-
if [[ $# -gt 1 ]]; then
|
|
57
|
-
local script_name=$(basename "$2" | tr '[:upper:]' '[:lower:]')
|
|
58
|
-
case "$script_name" in
|
|
59
|
-
*"test"*) echo "test" ;;
|
|
60
|
-
*"validator"*) echo "validator" ;;
|
|
61
|
-
*"reviewer"*) echo "reviewer" ;;
|
|
62
|
-
*"tester"*) echo "tester" ;;
|
|
63
|
-
*) echo "$command_name" ;;
|
|
64
|
-
esac
|
|
65
|
-
else
|
|
66
|
-
echo "$command_name"
|
|
67
|
-
fi
|
|
68
|
-
;;
|
|
69
|
-
"npx")
|
|
70
|
-
if [[ $# -gt 1 ]]; then
|
|
71
|
-
local tool_name=$(basename "$2" | tr '[:upper:]' '[:lower:]')
|
|
72
|
-
case "$tool_name" in
|
|
73
|
-
*"playwright"*) echo "playwright" ;;
|
|
74
|
-
*) echo "npx" ;;
|
|
75
|
-
esac
|
|
76
|
-
else
|
|
77
|
-
echo "npx"
|
|
78
|
-
fi
|
|
79
|
-
;;
|
|
80
|
-
*)
|
|
81
|
-
echo "unknown"
|
|
82
|
-
;;
|
|
83
|
-
esac
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
# Function to calculate appropriate heap size
|
|
87
|
-
calculate_heap_size() {
|
|
88
|
-
local mode="$1"
|
|
89
|
-
local tool_type="$2"
|
|
90
|
-
local override_heap="${3:-}"
|
|
91
|
-
|
|
92
|
-
# Use override if provided
|
|
93
|
-
if [[ -n "$override_heap" && "$override_heap" =~ ^[0-9]+$ ]]; then
|
|
94
|
-
echo "$override_heap"
|
|
95
|
-
return 0
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
# Use tool-specific heap size if available
|
|
99
|
-
local tool_heap="${TOOL_HEAPS[$tool_type]:-}"
|
|
100
|
-
if [[ -n "$tool_heap" ]]; then
|
|
101
|
-
echo "$tool_heap"
|
|
102
|
-
return 0
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# Fall back to mode-based heap size
|
|
106
|
-
echo "${HEAP_SIZES[$mode]:-2048}"
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
# Function to configure NODE_OPTIONS
|
|
110
|
-
configure_node_options() {
|
|
111
|
-
local mode="$1"
|
|
112
|
-
local tool_type="$2"
|
|
113
|
-
local heap_size="$3"
|
|
114
|
-
|
|
115
|
-
echo "🎛️ Configuring Node.js heap size for Task mode..." >&2
|
|
116
|
-
|
|
117
|
-
# Base NODE_OPTIONS
|
|
118
|
-
local node_opts="${NODE_OPTIONS:-}"
|
|
119
|
-
|
|
120
|
-
# Remove existing heap size settings
|
|
121
|
-
node_opts=$(echo "$node_opts" | sed 's/--max-old-space-size=[0-9]*//g')
|
|
122
|
-
node_opts=$(echo "$node_opts" | sed 's/--max-semi-space-size=[0-9]*//g')
|
|
123
|
-
|
|
124
|
-
# Add new heap size
|
|
125
|
-
node_opts="$node_opts --max-old-space-size=$heap_size"
|
|
126
|
-
|
|
127
|
-
# Add semi-space size (quarter of heap size)
|
|
128
|
-
local semi_space=$((heap_size / 4))
|
|
129
|
-
node_opts="$node_opts --max-semi-space-size=$semi_space"
|
|
130
|
-
|
|
131
|
-
# Add Task mode specific optimizations
|
|
132
|
-
if [[ "$mode" == "task" ]]; then
|
|
133
|
-
node_opts="$node_opts --optimize-for-size"
|
|
134
|
-
node_opts="$node_opts --max-executable-size=512"
|
|
135
|
-
node_opts="$node_opts --gc-interval=100"
|
|
136
|
-
fi
|
|
137
|
-
|
|
138
|
-
# Export updated NODE_OPTIONS
|
|
139
|
-
export NODE_OPTIONS="$node_opts"
|
|
140
|
-
|
|
141
|
-
echo "✅ NODE_OPTIONS configured: $NODE_OPTIONS" >&2
|
|
142
|
-
echo " Mode: $mode" >&2
|
|
143
|
-
echo " Tool: $tool_type" >&2
|
|
144
|
-
echo " Heap: ${heap_size}MB" >&2
|
|
145
|
-
echo " Semi-space: ${semi_space}MB" >&2
|
|
146
|
-
|
|
147
|
-
# Log configuration
|
|
148
|
-
if [[ -n "${CFN_VALIDATION_LOG_DIR:-}" ]]; then
|
|
149
|
-
local log_file="$CFN_VALIDATION_LOG_DIR/heap-config_$(date +%Y%m%d_%H%M%S).log"
|
|
150
|
-
mkdir -p "$(dirname "$log_file")"
|
|
151
|
-
cat > "$log_file" <<EOF
|
|
152
|
-
{
|
|
153
|
-
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
154
|
-
"mode": "$mode",
|
|
155
|
-
"tool_type": "$tool_type",
|
|
156
|
-
"heap_size_mb": $heap_size,
|
|
157
|
-
"semi_space_size_mb": $semi_space,
|
|
158
|
-
"node_options": "$NODE_OPTIONS",
|
|
159
|
-
"command": "${BASH_SOURCE[*]}",
|
|
160
|
-
"pid": $$,
|
|
161
|
-
"ppid": ${PPID:-0}
|
|
162
|
-
}
|
|
163
|
-
EOF
|
|
164
|
-
echo "📝 Heap configuration logged: $log_file" >&2
|
|
165
|
-
fi
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
# Function to validate heap size
|
|
169
|
-
validate_heap_configuration() {
|
|
170
|
-
local current_heap="${NODE_OPTIONS:-}"
|
|
171
|
-
|
|
172
|
-
if echo "$current_heap" | grep -q "max-old-space-size"; then
|
|
173
|
-
local heap_value=$(echo "$current_heap" | grep -o "max-old-space-size=[0-9]*" | cut -d= -f2)
|
|
174
|
-
local mode=$(detect_execution_mode)
|
|
175
|
-
local max_heap="${HEAP_SIZES[$mode]:-2048}"
|
|
176
|
-
|
|
177
|
-
if [[ "$heap_value" -gt "$max_heap" ]]; then
|
|
178
|
-
echo "⚠️ Heap size ($heap_value MB) exceeds recommended maximum for $mode mode ($max_heap MB)" >&2
|
|
179
|
-
return 1
|
|
180
|
-
else
|
|
181
|
-
echo "✅ Heap size ($heap_value MB) within recommended limits for $mode mode" >&2
|
|
182
|
-
return 0
|
|
183
|
-
fi
|
|
184
|
-
else
|
|
185
|
-
echo "⚠️ No heap size configured in NODE_OPTIONS" >&2
|
|
186
|
-
return 1
|
|
187
|
-
fi
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
# Main heap limiting function
|
|
191
|
-
limit_node_heap() {
|
|
192
|
-
local command="$1"
|
|
193
|
-
local heap_override="${2:-}"
|
|
194
|
-
|
|
195
|
-
# Detect execution mode
|
|
196
|
-
local mode=$(detect_execution_mode)
|
|
197
|
-
|
|
198
|
-
# Detect tool type
|
|
199
|
-
local tool_type=$(detect_tool_type "$command" "${@:2}")
|
|
200
|
-
|
|
201
|
-
# Calculate appropriate heap size
|
|
202
|
-
local heap_size=$(calculate_heap_size "$mode" "$tool_type" "$heap_override")
|
|
203
|
-
|
|
204
|
-
# Configure NODE_OPTIONS
|
|
205
|
-
configure_node_options "$mode" "$tool_type" "$heap_size"
|
|
206
|
-
|
|
207
|
-
echo "🎯 Node.js heap size limited to ${heap_size}MB for $tool_type in $mode mode" >&2
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
# Function to execute command with heap limiting
|
|
211
|
-
exec_with_heap_limit() {
|
|
212
|
-
local command="$1"
|
|
213
|
-
local heap_override="${2:-}"
|
|
214
|
-
shift 2
|
|
215
|
-
local args=("$@")
|
|
216
|
-
|
|
217
|
-
# Apply heap limiting
|
|
218
|
-
limit_node_heap "$command" "$heap_override"
|
|
219
|
-
|
|
220
|
-
# Execute command
|
|
221
|
-
echo "🚀 Executing: $command ${args[*]}" >&2
|
|
222
|
-
echo " NODE_OPTIONS: $NODE_OPTIONS" >&2
|
|
223
|
-
|
|
224
|
-
# Use wrapped executor if available
|
|
225
|
-
if [[ -f "$PROJECT_ROOT/.claude/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh" ]]; then
|
|
226
|
-
source "$PROJECT_ROOT/.claude/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh"
|
|
227
|
-
execute_instrumented "$command" 300 2048 "${args[@]}"
|
|
228
|
-
else
|
|
229
|
-
"$command" "${args[@]}"
|
|
230
|
-
fi
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
# Show usage
|
|
234
|
-
show_usage() {
|
|
235
|
-
cat <<'EOF'
|
|
236
|
-
CFN Node.js Heap Size Limiter for Task Mode
|
|
237
|
-
|
|
238
|
-
USAGE:
|
|
239
|
-
source "$(dirname "${BASH_SOURCE[0]}")/task-mode-heap-limiter.sh"
|
|
240
|
-
|
|
241
|
-
# Configuration
|
|
242
|
-
limit_node_heap <command> [heap_override_mb] # Limit heap size for command
|
|
243
|
-
configure_node_options <mode> <tool_type> <size> # Configure NODE_OPTIONS
|
|
244
|
-
validate_heap_configuration # Validate current configuration
|
|
245
|
-
|
|
246
|
-
# Execution
|
|
247
|
-
exec_with_heap_limit <command> [heap_override] [args...]
|
|
248
|
-
|
|
249
|
-
ENVIRONMENT VARIABLES:
|
|
250
|
-
NODE_OPTIONS # Modified to include heap size limits
|
|
251
|
-
CFN_MODE # Detected or set execution mode
|
|
252
|
-
CFN_VALIDATION_LOG_DIR # Directory for heap configuration logs
|
|
253
|
-
|
|
254
|
-
HEAP SIZES BY MODE:
|
|
255
|
-
task: 2048 MB (conservative)
|
|
256
|
-
cli: 8192 MB (production)
|
|
257
|
-
debug: 1024 MB (minimal)
|
|
258
|
-
test: 3072 MB (moderate)
|
|
259
|
-
|
|
260
|
-
HEAP SIZES BY TOOL TYPE:
|
|
261
|
-
node: 2048 MB
|
|
262
|
-
bun: 3072 MB
|
|
263
|
-
playwright: 4096 MB
|
|
264
|
-
test: 1536 MB
|
|
265
|
-
validator: 1024 MB
|
|
266
|
-
reviewer: 1024 MB
|
|
267
|
-
tester: 1024 MB
|
|
268
|
-
|
|
269
|
-
EXAMPLES:
|
|
270
|
-
# Limit heap for Node.js execution
|
|
271
|
-
limit_node_heap "node" 1024
|
|
272
|
-
node script.js
|
|
273
|
-
|
|
274
|
-
# Execute with automatic heap limiting
|
|
275
|
-
exec_with_heap_limit "bun" "build.ts"
|
|
276
|
-
|
|
277
|
-
# Custom heap size
|
|
278
|
-
exec_with_heap_limit "node" "4096" "heavy-script.js"
|
|
279
|
-
|
|
280
|
-
# Configure manually
|
|
281
|
-
configure_node_options "task" "validator" 1024
|
|
282
|
-
|
|
283
|
-
# Validate current configuration
|
|
284
|
-
validate_heap_configuration
|
|
285
|
-
|
|
286
|
-
EOF
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
# Main execution block
|
|
290
|
-
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
291
|
-
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
292
|
-
show_usage
|
|
293
|
-
exit 0
|
|
294
|
-
fi
|
|
295
|
-
|
|
296
|
-
# Execute operation if provided
|
|
297
|
-
if [[ $# -gt 0 ]]; then
|
|
298
|
-
case "$1" in
|
|
299
|
-
"limit")
|
|
300
|
-
shift
|
|
301
|
-
limit_node_heap "$@"
|
|
302
|
-
;;
|
|
303
|
-
"configure")
|
|
304
|
-
shift
|
|
305
|
-
configure_node_options "$@"
|
|
306
|
-
;;
|
|
307
|
-
"validate")
|
|
308
|
-
validate_heap_configuration
|
|
309
|
-
;;
|
|
310
|
-
"exec")
|
|
311
|
-
shift
|
|
312
|
-
exec_with_heap_limit "$@"
|
|
313
|
-
;;
|
|
314
|
-
*)
|
|
315
|
-
echo "Unknown command: $1" >&2
|
|
316
|
-
echo "Use --help for usage information" >&2
|
|
317
|
-
exit 1
|
|
318
|
-
;;
|
|
319
|
-
esac
|
|
320
|
-
else
|
|
321
|
-
echo "CFN Node.js Heap Size Limiter for Task Mode" >&2
|
|
322
|
-
echo "Current mode: $(detect_execution_mode)" >&2
|
|
323
|
-
echo "Current NODE_OPTIONS: ${NODE_OPTIONS:-unset}" >&2
|
|
324
|
-
echo "Use --help for usage information" >&2
|
|
325
|
-
fi
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# CFN Node.js Heap Size Limiter for Task Mode
|
|
3
|
+
# Dynamically adjusts NODE_OPTIONS based on execution mode to prevent memory bloat
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
# Configuration
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
9
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
10
|
+
|
|
11
|
+
# Mode-based heap sizes (in MB)
|
|
12
|
+
declare -A HEAP_SIZES=(
|
|
13
|
+
["task"]="2048" # 2GB for Task mode (conservative)
|
|
14
|
+
["cli"]="8192" # 8GB for CLI mode (production)
|
|
15
|
+
["debug"]="1024" # 1GB for debugging (minimal)
|
|
16
|
+
["test"]="3072" # 3GB for testing (moderate)
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
# Default heap sizes by tool type
|
|
20
|
+
declare -A TOOL_HEAPS=(
|
|
21
|
+
["node"]="2048"
|
|
22
|
+
["bun"]="3072"
|
|
23
|
+
["playwright"]="4096"
|
|
24
|
+
["test"]="1536"
|
|
25
|
+
["validator"]="1024"
|
|
26
|
+
["reviewer"]="1024"
|
|
27
|
+
["tester"]="1024"
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
# Function to detect current execution mode
|
|
31
|
+
detect_execution_mode() {
|
|
32
|
+
# Use existing mode detection if available
|
|
33
|
+
if [[ -f "$PROJECT_ROOT/.claude/skills/cfn-task-mode-safety/mode-detection.sh" ]]; then
|
|
34
|
+
source "$PROJECT_ROOT/.claude/skills/cfn-task-mode-safety/mode-detection.sh"
|
|
35
|
+
detect_execution_mode 2>/dev/null && return 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Fallback detection
|
|
39
|
+
if [[ -n "${CFN_MODE:-}" ]]; then
|
|
40
|
+
echo "$CFN_MODE"
|
|
41
|
+
elif [[ -n "${TASK_ID:-}" && -n "${AGENT_ID:-}" ]]; then
|
|
42
|
+
echo "cli"
|
|
43
|
+
else
|
|
44
|
+
echo "task" # Safe default
|
|
45
|
+
fi
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Function to determine tool type from command line
|
|
49
|
+
detect_tool_type() {
|
|
50
|
+
local command="$1"
|
|
51
|
+
local command_name=$(basename "$command")
|
|
52
|
+
|
|
53
|
+
case "$command_name" in
|
|
54
|
+
"node"|"bun")
|
|
55
|
+
# Look at script name to determine tool type
|
|
56
|
+
if [[ $# -gt 1 ]]; then
|
|
57
|
+
local script_name=$(basename "$2" | tr '[:upper:]' '[:lower:]')
|
|
58
|
+
case "$script_name" in
|
|
59
|
+
*"test"*) echo "test" ;;
|
|
60
|
+
*"validator"*) echo "validator" ;;
|
|
61
|
+
*"reviewer"*) echo "reviewer" ;;
|
|
62
|
+
*"tester"*) echo "tester" ;;
|
|
63
|
+
*) echo "$command_name" ;;
|
|
64
|
+
esac
|
|
65
|
+
else
|
|
66
|
+
echo "$command_name"
|
|
67
|
+
fi
|
|
68
|
+
;;
|
|
69
|
+
"npx")
|
|
70
|
+
if [[ $# -gt 1 ]]; then
|
|
71
|
+
local tool_name=$(basename "$2" | tr '[:upper:]' '[:lower:]')
|
|
72
|
+
case "$tool_name" in
|
|
73
|
+
*"playwright"*) echo "playwright" ;;
|
|
74
|
+
*) echo "npx" ;;
|
|
75
|
+
esac
|
|
76
|
+
else
|
|
77
|
+
echo "npx"
|
|
78
|
+
fi
|
|
79
|
+
;;
|
|
80
|
+
*)
|
|
81
|
+
echo "unknown"
|
|
82
|
+
;;
|
|
83
|
+
esac
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# Function to calculate appropriate heap size
|
|
87
|
+
calculate_heap_size() {
|
|
88
|
+
local mode="$1"
|
|
89
|
+
local tool_type="$2"
|
|
90
|
+
local override_heap="${3:-}"
|
|
91
|
+
|
|
92
|
+
# Use override if provided
|
|
93
|
+
if [[ -n "$override_heap" && "$override_heap" =~ ^[0-9]+$ ]]; then
|
|
94
|
+
echo "$override_heap"
|
|
95
|
+
return 0
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Use tool-specific heap size if available
|
|
99
|
+
local tool_heap="${TOOL_HEAPS[$tool_type]:-}"
|
|
100
|
+
if [[ -n "$tool_heap" ]]; then
|
|
101
|
+
echo "$tool_heap"
|
|
102
|
+
return 0
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
# Fall back to mode-based heap size
|
|
106
|
+
echo "${HEAP_SIZES[$mode]:-2048}"
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Function to configure NODE_OPTIONS
|
|
110
|
+
configure_node_options() {
|
|
111
|
+
local mode="$1"
|
|
112
|
+
local tool_type="$2"
|
|
113
|
+
local heap_size="$3"
|
|
114
|
+
|
|
115
|
+
echo "🎛️ Configuring Node.js heap size for Task mode..." >&2
|
|
116
|
+
|
|
117
|
+
# Base NODE_OPTIONS
|
|
118
|
+
local node_opts="${NODE_OPTIONS:-}"
|
|
119
|
+
|
|
120
|
+
# Remove existing heap size settings
|
|
121
|
+
node_opts=$(echo "$node_opts" | sed 's/--max-old-space-size=[0-9]*//g')
|
|
122
|
+
node_opts=$(echo "$node_opts" | sed 's/--max-semi-space-size=[0-9]*//g')
|
|
123
|
+
|
|
124
|
+
# Add new heap size
|
|
125
|
+
node_opts="$node_opts --max-old-space-size=$heap_size"
|
|
126
|
+
|
|
127
|
+
# Add semi-space size (quarter of heap size)
|
|
128
|
+
local semi_space=$((heap_size / 4))
|
|
129
|
+
node_opts="$node_opts --max-semi-space-size=$semi_space"
|
|
130
|
+
|
|
131
|
+
# Add Task mode specific optimizations
|
|
132
|
+
if [[ "$mode" == "task" ]]; then
|
|
133
|
+
node_opts="$node_opts --optimize-for-size"
|
|
134
|
+
node_opts="$node_opts --max-executable-size=512"
|
|
135
|
+
node_opts="$node_opts --gc-interval=100"
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Export updated NODE_OPTIONS
|
|
139
|
+
export NODE_OPTIONS="$node_opts"
|
|
140
|
+
|
|
141
|
+
echo "✅ NODE_OPTIONS configured: $NODE_OPTIONS" >&2
|
|
142
|
+
echo " Mode: $mode" >&2
|
|
143
|
+
echo " Tool: $tool_type" >&2
|
|
144
|
+
echo " Heap: ${heap_size}MB" >&2
|
|
145
|
+
echo " Semi-space: ${semi_space}MB" >&2
|
|
146
|
+
|
|
147
|
+
# Log configuration
|
|
148
|
+
if [[ -n "${CFN_VALIDATION_LOG_DIR:-}" ]]; then
|
|
149
|
+
local log_file="$CFN_VALIDATION_LOG_DIR/heap-config_$(date +%Y%m%d_%H%M%S).log"
|
|
150
|
+
mkdir -p "$(dirname "$log_file")"
|
|
151
|
+
cat > "$log_file" <<EOF
|
|
152
|
+
{
|
|
153
|
+
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
154
|
+
"mode": "$mode",
|
|
155
|
+
"tool_type": "$tool_type",
|
|
156
|
+
"heap_size_mb": $heap_size,
|
|
157
|
+
"semi_space_size_mb": $semi_space,
|
|
158
|
+
"node_options": "$NODE_OPTIONS",
|
|
159
|
+
"command": "${BASH_SOURCE[*]}",
|
|
160
|
+
"pid": $$,
|
|
161
|
+
"ppid": ${PPID:-0}
|
|
162
|
+
}
|
|
163
|
+
EOF
|
|
164
|
+
echo "📝 Heap configuration logged: $log_file" >&2
|
|
165
|
+
fi
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
# Function to validate heap size
|
|
169
|
+
validate_heap_configuration() {
|
|
170
|
+
local current_heap="${NODE_OPTIONS:-}"
|
|
171
|
+
|
|
172
|
+
if echo "$current_heap" | grep -q "max-old-space-size"; then
|
|
173
|
+
local heap_value=$(echo "$current_heap" | grep -o "max-old-space-size=[0-9]*" | cut -d= -f2)
|
|
174
|
+
local mode=$(detect_execution_mode)
|
|
175
|
+
local max_heap="${HEAP_SIZES[$mode]:-2048}"
|
|
176
|
+
|
|
177
|
+
if [[ "$heap_value" -gt "$max_heap" ]]; then
|
|
178
|
+
echo "⚠️ Heap size ($heap_value MB) exceeds recommended maximum for $mode mode ($max_heap MB)" >&2
|
|
179
|
+
return 1
|
|
180
|
+
else
|
|
181
|
+
echo "✅ Heap size ($heap_value MB) within recommended limits for $mode mode" >&2
|
|
182
|
+
return 0
|
|
183
|
+
fi
|
|
184
|
+
else
|
|
185
|
+
echo "⚠️ No heap size configured in NODE_OPTIONS" >&2
|
|
186
|
+
return 1
|
|
187
|
+
fi
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# Main heap limiting function
|
|
191
|
+
limit_node_heap() {
|
|
192
|
+
local command="$1"
|
|
193
|
+
local heap_override="${2:-}"
|
|
194
|
+
|
|
195
|
+
# Detect execution mode
|
|
196
|
+
local mode=$(detect_execution_mode)
|
|
197
|
+
|
|
198
|
+
# Detect tool type
|
|
199
|
+
local tool_type=$(detect_tool_type "$command" "${@:2}")
|
|
200
|
+
|
|
201
|
+
# Calculate appropriate heap size
|
|
202
|
+
local heap_size=$(calculate_heap_size "$mode" "$tool_type" "$heap_override")
|
|
203
|
+
|
|
204
|
+
# Configure NODE_OPTIONS
|
|
205
|
+
configure_node_options "$mode" "$tool_type" "$heap_size"
|
|
206
|
+
|
|
207
|
+
echo "🎯 Node.js heap size limited to ${heap_size}MB for $tool_type in $mode mode" >&2
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# Function to execute command with heap limiting
|
|
211
|
+
exec_with_heap_limit() {
|
|
212
|
+
local command="$1"
|
|
213
|
+
local heap_override="${2:-}"
|
|
214
|
+
shift 2
|
|
215
|
+
local args=("$@")
|
|
216
|
+
|
|
217
|
+
# Apply heap limiting
|
|
218
|
+
limit_node_heap "$command" "$heap_override"
|
|
219
|
+
|
|
220
|
+
# Execute command
|
|
221
|
+
echo "🚀 Executing: $command ${args[*]}" >&2
|
|
222
|
+
echo " NODE_OPTIONS: $NODE_OPTIONS" >&2
|
|
223
|
+
|
|
224
|
+
# Use wrapped executor if available
|
|
225
|
+
if [[ -f "$PROJECT_ROOT/.claude/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh" ]]; then
|
|
226
|
+
source "$PROJECT_ROOT/.claude/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh"
|
|
227
|
+
execute_instrumented "$command" 300 2048 "${args[@]}"
|
|
228
|
+
else
|
|
229
|
+
"$command" "${args[@]}"
|
|
230
|
+
fi
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
# Show usage
|
|
234
|
+
show_usage() {
|
|
235
|
+
cat <<'EOF'
|
|
236
|
+
CFN Node.js Heap Size Limiter for Task Mode
|
|
237
|
+
|
|
238
|
+
USAGE:
|
|
239
|
+
source "$(dirname "${BASH_SOURCE[0]}")/task-mode-heap-limiter.sh"
|
|
240
|
+
|
|
241
|
+
# Configuration
|
|
242
|
+
limit_node_heap <command> [heap_override_mb] # Limit heap size for command
|
|
243
|
+
configure_node_options <mode> <tool_type> <size> # Configure NODE_OPTIONS
|
|
244
|
+
validate_heap_configuration # Validate current configuration
|
|
245
|
+
|
|
246
|
+
# Execution
|
|
247
|
+
exec_with_heap_limit <command> [heap_override] [args...]
|
|
248
|
+
|
|
249
|
+
ENVIRONMENT VARIABLES:
|
|
250
|
+
NODE_OPTIONS # Modified to include heap size limits
|
|
251
|
+
CFN_MODE # Detected or set execution mode
|
|
252
|
+
CFN_VALIDATION_LOG_DIR # Directory for heap configuration logs
|
|
253
|
+
|
|
254
|
+
HEAP SIZES BY MODE:
|
|
255
|
+
task: 2048 MB (conservative)
|
|
256
|
+
cli: 8192 MB (production)
|
|
257
|
+
debug: 1024 MB (minimal)
|
|
258
|
+
test: 3072 MB (moderate)
|
|
259
|
+
|
|
260
|
+
HEAP SIZES BY TOOL TYPE:
|
|
261
|
+
node: 2048 MB
|
|
262
|
+
bun: 3072 MB
|
|
263
|
+
playwright: 4096 MB
|
|
264
|
+
test: 1536 MB
|
|
265
|
+
validator: 1024 MB
|
|
266
|
+
reviewer: 1024 MB
|
|
267
|
+
tester: 1024 MB
|
|
268
|
+
|
|
269
|
+
EXAMPLES:
|
|
270
|
+
# Limit heap for Node.js execution
|
|
271
|
+
limit_node_heap "node" 1024
|
|
272
|
+
node script.js
|
|
273
|
+
|
|
274
|
+
# Execute with automatic heap limiting
|
|
275
|
+
exec_with_heap_limit "bun" "build.ts"
|
|
276
|
+
|
|
277
|
+
# Custom heap size
|
|
278
|
+
exec_with_heap_limit "node" "4096" "heavy-script.js"
|
|
279
|
+
|
|
280
|
+
# Configure manually
|
|
281
|
+
configure_node_options "task" "validator" 1024
|
|
282
|
+
|
|
283
|
+
# Validate current configuration
|
|
284
|
+
validate_heap_configuration
|
|
285
|
+
|
|
286
|
+
EOF
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
# Main execution block
|
|
290
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
291
|
+
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
|
|
292
|
+
show_usage
|
|
293
|
+
exit 0
|
|
294
|
+
fi
|
|
295
|
+
|
|
296
|
+
# Execute operation if provided
|
|
297
|
+
if [[ $# -gt 0 ]]; then
|
|
298
|
+
case "$1" in
|
|
299
|
+
"limit")
|
|
300
|
+
shift
|
|
301
|
+
limit_node_heap "$@"
|
|
302
|
+
;;
|
|
303
|
+
"configure")
|
|
304
|
+
shift
|
|
305
|
+
configure_node_options "$@"
|
|
306
|
+
;;
|
|
307
|
+
"validate")
|
|
308
|
+
validate_heap_configuration
|
|
309
|
+
;;
|
|
310
|
+
"exec")
|
|
311
|
+
shift
|
|
312
|
+
exec_with_heap_limit "$@"
|
|
313
|
+
;;
|
|
314
|
+
*)
|
|
315
|
+
echo "Unknown command: $1" >&2
|
|
316
|
+
echo "Use --help for usage information" >&2
|
|
317
|
+
exit 1
|
|
318
|
+
;;
|
|
319
|
+
esac
|
|
320
|
+
else
|
|
321
|
+
echo "CFN Node.js Heap Size Limiter for Task Mode" >&2
|
|
322
|
+
echo "Current mode: $(detect_execution_mode)" >&2
|
|
323
|
+
echo "Current NODE_OPTIONS: ${NODE_OPTIONS:-unset}" >&2
|
|
324
|
+
echo "Use --help for usage information" >&2
|
|
325
|
+
fi
|
|
326
326
|
fi
|