claude-flow-novice 2.16.0 → 2.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/.claude/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/.claude/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/.claude/commands/cfn-loop-cli.md +124 -46
- package/.claude/commands/cfn-loop-frontend.md +1 -1
- package/.claude/commands/cfn-loop-task.md +2 -2
- package/.claude/commands/deprecated/cfn-loop.md +2 -2
- package/.claude/hooks/cfn-invoke-post-edit.sh +31 -5
- package/.claude/hooks/cfn-post-edit.config.json +9 -2
- package/.claude/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/.claude/skills/cfn-backlog-management/SKILL.md +1 -1
- package/.claude/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/agents/cfn-dev-team/analysts/root-cause-analyst.md +2 -2
- package/claude-assets/agents/cfn-dev-team/architecture/base-template-generator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +2 -2
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/devops-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/github-commit-agent.md +2 -2
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +1 -1
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/documentation/pseudocode.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/accessibility-advocate-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/cto-agent.md +1 -1
- package/claude-assets/agents/cfn-dev-team/product-owners/power-user-persona.md +1 -1
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/e2e/playwright-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/testers/unit/tdd-london-unit-swarm.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/agent-builder.md +11 -0
- package/claude-assets/agents/cfn-dev-team/utility/analyst.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/claude-code-expert.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/researcher.md +1 -1
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +1 -1
- package/claude-assets/agents/custom/cfn-docker-expert.md +1 -0
- package/claude-assets/agents/custom/cfn-loops-cli-expert.md +326 -17
- package/claude-assets/agents/custom/cfn-redis-operations.md +529 -529
- package/claude-assets/agents/custom/cfn-system-expert.md +1 -1
- package/claude-assets/agents/custom/trigger-dev-expert.md +369 -0
- package/claude-assets/agents/docker-team/micro-sprint-planner.md +747 -747
- package/claude-assets/agents/project-only-agents/npm-package-specialist.md +1 -1
- package/claude-assets/cfn-extras/skills/GOOGLE_SHEETS_SKILLS_README.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-api-coordinator/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-formula-builder/SKILL.md +1 -1
- package/claude-assets/cfn-extras/skills/google-sheets-progress/SKILL.md +1 -1
- package/claude-assets/commands/CFN_LOOP_FRONTEND.md +1 -1
- package/claude-assets/commands/cfn-loop-cli.md +124 -46
- package/claude-assets/commands/cfn-loop-frontend.md +1 -1
- package/claude-assets/commands/cfn-loop-task.md +2 -2
- package/claude-assets/commands/deprecated/cfn-loop.md +2 -2
- package/claude-assets/hooks/GIT-HOOKS-USAGE-EXAMPLES.md +116 -0
- package/claude-assets/hooks/README-GIT-HOOKS.md +443 -0
- package/claude-assets/hooks/cfn-invoke-post-edit.sh +31 -5
- package/claude-assets/hooks/cfn-post-edit.config.json +9 -2
- package/claude-assets/hooks/install-git-hooks.sh +243 -0
- package/claude-assets/hooks/subagent-start.sh +98 -0
- package/claude-assets/hooks/subagent-stop.sh +93 -0
- package/claude-assets/hooks/validators/credential-scanner.sh +172 -0
- package/claude-assets/root-claude-distribute/CFN-CLAUDE.md +1 -1
- package/claude-assets/skills/cfn-backlog-management/SKILL.md +1 -1
- package/claude-assets/skills/cfn-dependency-ingestion/SKILL.md +41 -13
- package/claude-assets/skills/cfn-dependency-ingestion/ingest.sh +237 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/cli-mode-dependencies.txt +73 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/shared-dependencies.txt +57 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-dev-dependencies.txt +82 -0
- package/claude-assets/skills/cfn-dependency-ingestion/manifests/trigger-mode-dependencies.txt +80 -0
- package/claude-assets/skills/cfn-environment-sanitization/sanitize-environment.sh +14 -4
- package/claude-assets/skills/cfn-loop-orchestration/NORTH_STAR_INDEX.md +1 -1
- package/claude-assets/skills/cfn-provider-routing/SKILL.md +23 -0
- package/claude-assets/skills/docker-build/build.sh +1 -1
- package/dist/agent/skill-mcp-selector.js +2 -1
- package/dist/agent/skill-mcp-selector.js.map +1 -1
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-executor.js +470 -26
- package/dist/cli/agent-executor.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +2 -2
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/agent-spawn.js +7 -4
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/agent-spawner.js +51 -4
- package/dist/cli/agent-spawner.js.map +1 -1
- package/dist/cli/agent-token-manager.js +2 -1
- package/dist/cli/agent-token-manager.js.map +1 -1
- package/dist/cli/anthropic-client.js +117 -11
- package/dist/cli/anthropic-client.js.map +1 -1
- package/dist/cli/cfn-context.js +2 -1
- package/dist/cli/cfn-context.js.map +1 -1
- package/dist/cli/cfn-metrics.js +2 -1
- package/dist/cli/cfn-metrics.js.map +1 -1
- package/dist/cli/cfn-redis.js +2 -1
- package/dist/cli/cfn-redis.js.map +1 -1
- package/dist/cli/cli-agent-context.js +2 -0
- package/dist/cli/cli-agent-context.js.map +1 -1
- package/dist/cli/config-manager.js +4 -252
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/conversation-fork-cleanup.js +2 -1
- package/dist/cli/conversation-fork-cleanup.js.map +1 -1
- package/dist/cli/conversation-fork.js +2 -1
- package/dist/cli/conversation-fork.js.map +1 -1
- package/dist/cli/coordination/agent-messaging.js +415 -0
- package/dist/cli/coordination/agent-messaging.js.map +1 -0
- package/dist/cli/coordination/wait-for-threshold.js +232 -0
- package/dist/cli/coordination/wait-for-threshold.js.map +1 -0
- package/dist/cli/iteration-history.js +2 -1
- package/dist/cli/iteration-history.js.map +1 -1
- package/dist/cli/process-lifecycle.js +5 -1
- package/dist/cli/process-lifecycle.js.map +1 -1
- package/dist/cli/spawn-agent-cli.js +41 -6
- package/dist/cli/spawn-agent-cli.js.map +1 -1
- package/dist/coordination/redis-waiting-mode.js +4 -0
- package/dist/coordination/redis-waiting-mode.js.map +1 -1
- package/dist/lib/artifact-registry.js +4 -0
- package/dist/lib/artifact-registry.js.map +1 -1
- package/dist/lib/connection-pool.js +390 -0
- package/dist/lib/connection-pool.js.map +1 -0
- package/dist/lib/environment-contract.js +258 -0
- package/dist/lib/environment-contract.js.map +1 -0
- package/dist/lib/query-optimizer.js +388 -0
- package/dist/lib/query-optimizer.js.map +1 -0
- package/dist/lib/result-cache.js +285 -0
- package/dist/lib/result-cache.js.map +1 -0
- package/dist/mcp/auth-middleware.js +2 -1
- package/dist/mcp/auth-middleware.js.map +1 -1
- package/dist/mcp/playwright-mcp-server-auth.js +2 -1
- package/dist/mcp/playwright-mcp-server-auth.js.map +1 -1
- package/package.json +3 -1
- package/scripts/build-agent-image.sh +1 -1
- package/scripts/cost-allocation-tracker.sh +632 -0
- package/scripts/docker-rebuild-all-agents.sh +2 -2
- package/scripts/reorganize-tests.sh +280 -0
- package/scripts/trigger-dev-setup.sh +12 -0
- package/tests/README.md +45 -0
- package/.claude/commands/cost-savings-status.md +0 -34
- package/.claude/commands/metrics-summary.md +0 -58
- package/claude-assets/agents/cfn-dev-team/dev-ops/monitoring-specialist.md +0 -768
- package/claude-assets/agents/custom/test-mcp-access.md +0 -24
- package/claude-assets/commands/cost-savings-status.md +0 -34
- package/claude-assets/commands/metrics-summary.md +0 -58
- package/tests/test-memory-leak-task-mode.sh +0 -435
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Git Hooks Installation Script
|
|
3
|
+
# Installs security-focused git hooks to prevent credential exposure
|
|
4
|
+
# Usage: bash .claude/hooks/install-git-hooks.sh [--force]
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
# Colors for output
|
|
9
|
+
RED='\033[0;31m'
|
|
10
|
+
GREEN='\033[0;32m'
|
|
11
|
+
YELLOW='\033[1;33m'
|
|
12
|
+
BLUE='\033[0;34m'
|
|
13
|
+
BOLD='\033[1m'
|
|
14
|
+
NC='\033[0m'
|
|
15
|
+
|
|
16
|
+
# Configuration
|
|
17
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
18
|
+
GIT_HOOKS_DIR="$PROJECT_ROOT/.git/hooks"
|
|
19
|
+
HOOKS_SOURCE_DIR="$PROJECT_ROOT/.claude/hooks"
|
|
20
|
+
FORCE_INSTALL=false
|
|
21
|
+
|
|
22
|
+
# Exit codes
|
|
23
|
+
EXIT_SUCCESS=0
|
|
24
|
+
EXIT_ERROR=1
|
|
25
|
+
|
|
26
|
+
# Parse arguments
|
|
27
|
+
parse_arguments() {
|
|
28
|
+
while [[ $# -gt 0 ]]; do
|
|
29
|
+
case "$1" in
|
|
30
|
+
--force)
|
|
31
|
+
FORCE_INSTALL=true
|
|
32
|
+
shift
|
|
33
|
+
;;
|
|
34
|
+
--help)
|
|
35
|
+
show_help
|
|
36
|
+
exit $EXIT_SUCCESS
|
|
37
|
+
;;
|
|
38
|
+
*)
|
|
39
|
+
echo "Unknown argument: $1"
|
|
40
|
+
show_help
|
|
41
|
+
exit $EXIT_ERROR
|
|
42
|
+
;;
|
|
43
|
+
esac
|
|
44
|
+
done
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# Show help message
|
|
48
|
+
show_help() {
|
|
49
|
+
cat << 'EOF'
|
|
50
|
+
Usage: bash .claude/hooks/install-git-hooks.sh [OPTIONS]
|
|
51
|
+
|
|
52
|
+
Install git hooks to prevent credential exposure and ensure code quality.
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--force Overwrite existing hooks without confirmation
|
|
56
|
+
--help Show this help message
|
|
57
|
+
|
|
58
|
+
Installed Hooks:
|
|
59
|
+
.git/hooks/pre-commit - Scans staged files for credentials before commit
|
|
60
|
+
|
|
61
|
+
Exit Codes:
|
|
62
|
+
0 - Installation successful
|
|
63
|
+
1 - Installation failed
|
|
64
|
+
|
|
65
|
+
Examples:
|
|
66
|
+
# Install with confirmation prompts
|
|
67
|
+
bash .claude/hooks/install-git-hooks.sh
|
|
68
|
+
|
|
69
|
+
# Install with force overwrite (CI/CD)
|
|
70
|
+
bash .claude/hooks/install-git-hooks.sh --force
|
|
71
|
+
|
|
72
|
+
For more information, see .claude/hooks/README-GIT-HOOKS.md
|
|
73
|
+
EOF
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Validate project structure
|
|
77
|
+
validate_project() {
|
|
78
|
+
if [ ! -d "$PROJECT_ROOT/.git" ]; then
|
|
79
|
+
echo -e "${RED}ERROR: Not a git repository${NC}"
|
|
80
|
+
echo "Run this script from the root of a git repository"
|
|
81
|
+
return $EXIT_ERROR
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if [ ! -d "$HOOKS_SOURCE_DIR" ]; then
|
|
85
|
+
echo -e "${RED}ERROR: .claude/hooks directory not found${NC}"
|
|
86
|
+
echo "Expected location: $HOOKS_SOURCE_DIR"
|
|
87
|
+
return $EXIT_ERROR
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
return $EXIT_SUCCESS
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Check if .artifacts/logs directory exists, create if needed
|
|
94
|
+
ensure_logs_directory() {
|
|
95
|
+
local logs_dir="$PROJECT_ROOT/.artifacts/logs"
|
|
96
|
+
if [ ! -d "$logs_dir" ]; then
|
|
97
|
+
mkdir -p "$logs_dir"
|
|
98
|
+
echo -e "${BLUE}Created logs directory: $logs_dir${NC}"
|
|
99
|
+
fi
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# Install a single git hook
|
|
103
|
+
install_hook() {
|
|
104
|
+
local hook_source="$1"
|
|
105
|
+
local hook_name=$(basename "$hook_source")
|
|
106
|
+
local hook_dest="$GIT_HOOKS_DIR/$hook_name"
|
|
107
|
+
|
|
108
|
+
# Check if hook source exists
|
|
109
|
+
if [ ! -f "$hook_source" ]; then
|
|
110
|
+
echo -e "${YELLOW}WARNING: Hook source not found: $hook_source${NC}"
|
|
111
|
+
return 1
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
# Check if destination hook already exists
|
|
115
|
+
if [ -f "$hook_dest" ]; then
|
|
116
|
+
if [ "$FORCE_INSTALL" = false ]; then
|
|
117
|
+
echo -e "${YELLOW}Hook already exists: $hook_name${NC}"
|
|
118
|
+
read -p "Overwrite? (y/n) " -n 1 -r
|
|
119
|
+
echo
|
|
120
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
121
|
+
echo -e "${BLUE}Skipped: $hook_name${NC}"
|
|
122
|
+
return 0
|
|
123
|
+
fi
|
|
124
|
+
else
|
|
125
|
+
echo -e "${BLUE}Overwriting: $hook_name${NC}"
|
|
126
|
+
fi
|
|
127
|
+
fi
|
|
128
|
+
|
|
129
|
+
# Copy hook file
|
|
130
|
+
cp "$hook_source" "$hook_dest"
|
|
131
|
+
chmod +x "$hook_dest"
|
|
132
|
+
|
|
133
|
+
# Validate installation
|
|
134
|
+
if [ ! -f "$hook_dest" ] || [ ! -x "$hook_dest" ]; then
|
|
135
|
+
echo -e "${RED}FAILED to install: $hook_name${NC}"
|
|
136
|
+
return $EXIT_ERROR
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
echo -e "${GREEN}Installed: $hook_name${NC}"
|
|
140
|
+
return $EXIT_SUCCESS
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# Validate hook is functional
|
|
144
|
+
validate_hook() {
|
|
145
|
+
local hook_name="$1"
|
|
146
|
+
local hook_path="$GIT_HOOKS_DIR/$hook_name"
|
|
147
|
+
|
|
148
|
+
if [ ! -f "$hook_path" ]; then
|
|
149
|
+
echo -e "${RED}VALIDATION FAILED: Hook file not found${NC}"
|
|
150
|
+
return $EXIT_ERROR
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
if [ ! -x "$hook_path" ]; then
|
|
154
|
+
echo -e "${RED}VALIDATION FAILED: Hook is not executable${NC}"
|
|
155
|
+
return $EXIT_ERROR
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Check for bash shebang
|
|
159
|
+
if ! head -1 "$hook_path" | grep -q "^#!/bin/bash"; then
|
|
160
|
+
echo -e "${RED}VALIDATION FAILED: Hook missing bash shebang${NC}"
|
|
161
|
+
return $EXIT_ERROR
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
echo -e "${GREEN}VALIDATION PASSED: $hook_name${NC}"
|
|
165
|
+
return $EXIT_SUCCESS
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
# Main installation logic
|
|
169
|
+
main() {
|
|
170
|
+
echo -e "${BOLD}Git Hooks Installation${NC}"
|
|
171
|
+
echo "========================================"
|
|
172
|
+
echo ""
|
|
173
|
+
|
|
174
|
+
# Parse arguments
|
|
175
|
+
parse_arguments "$@"
|
|
176
|
+
|
|
177
|
+
# Validate project structure
|
|
178
|
+
if ! validate_project; then
|
|
179
|
+
exit $EXIT_ERROR
|
|
180
|
+
fi
|
|
181
|
+
|
|
182
|
+
# Ensure logs directory exists
|
|
183
|
+
ensure_logs_directory
|
|
184
|
+
|
|
185
|
+
echo -e "${BLUE}Installing git hooks to: $GIT_HOOKS_DIR${NC}"
|
|
186
|
+
echo ""
|
|
187
|
+
|
|
188
|
+
local install_count=0
|
|
189
|
+
local fail_count=0
|
|
190
|
+
|
|
191
|
+
# Install pre-commit hook
|
|
192
|
+
if install_hook "$PROJECT_ROOT/.git/hooks/pre-commit"; then
|
|
193
|
+
install_count=$((install_count + 1))
|
|
194
|
+
else
|
|
195
|
+
fail_count=$((fail_count + 1))
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
echo ""
|
|
199
|
+
|
|
200
|
+
# Validate installations
|
|
201
|
+
echo -e "${BOLD}Validating installations...${NC}"
|
|
202
|
+
echo ""
|
|
203
|
+
|
|
204
|
+
if ! validate_hook "pre-commit"; then
|
|
205
|
+
fail_count=$((fail_count + 1))
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
echo ""
|
|
209
|
+
echo -e "${BOLD}Installation Summary${NC}"
|
|
210
|
+
echo "========================================"
|
|
211
|
+
echo "Installed hooks: $install_count"
|
|
212
|
+
echo "Failed hooks: $fail_count"
|
|
213
|
+
echo ""
|
|
214
|
+
|
|
215
|
+
if [ $fail_count -eq 0 ]; then
|
|
216
|
+
echo -e "${GREEN}✅ All hooks installed successfully${NC}"
|
|
217
|
+
echo ""
|
|
218
|
+
echo -e "${BOLD}Next steps:${NC}"
|
|
219
|
+
echo " 1. Try committing a file with a mock credential:"
|
|
220
|
+
echo " git add test.txt"
|
|
221
|
+
echo " echo 'API_KEY=sk-ant-test123456789' >> test.txt"
|
|
222
|
+
echo " git commit -m 'Test credential detection'"
|
|
223
|
+
echo ""
|
|
224
|
+
echo " 2. The pre-commit hook will block the commit"
|
|
225
|
+
echo ""
|
|
226
|
+
echo " 3. For test files, use whitelisted patterns:"
|
|
227
|
+
echo " - sk-ant-mock"
|
|
228
|
+
echo " - npm_MockTestKey"
|
|
229
|
+
echo " - test_key / mock_key"
|
|
230
|
+
echo " - [REDACTED]"
|
|
231
|
+
echo ""
|
|
232
|
+
echo -e "${BOLD}Documentation:${NC}"
|
|
233
|
+
echo " .claude/hooks/README-GIT-HOOKS.md"
|
|
234
|
+
echo ""
|
|
235
|
+
return $EXIT_SUCCESS
|
|
236
|
+
else
|
|
237
|
+
echo -e "${RED}❌ Installation failed${NC}"
|
|
238
|
+
return $EXIT_ERROR
|
|
239
|
+
fi
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
# Execute main function
|
|
243
|
+
main "$@"
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# SubagentStart Hook - Claude Code v2.0.43+
|
|
3
|
+
# Automatically invoked when Main Chat spawns a Task() agent
|
|
4
|
+
#
|
|
5
|
+
# High-value features:
|
|
6
|
+
# 1. Automatic SQLite lifecycle tracking
|
|
7
|
+
# 2. Protocol dependency validation (prevents "consensus on vapor")
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# Hook input (provided by Claude Code)
|
|
12
|
+
AGENT_ID="${AGENT_ID:-unknown}"
|
|
13
|
+
AGENT_TYPE="${AGENT_TYPE:-unknown}"
|
|
14
|
+
TASK_ID="${TASK_ID:-unknown}"
|
|
15
|
+
SPAWNED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
16
|
+
|
|
17
|
+
# Project paths
|
|
18
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
|
|
19
|
+
DB_PATH="${PROJECT_ROOT}/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db"
|
|
20
|
+
LOG_PATH="${PROJECT_ROOT}/.artifacts/logs/subagent-lifecycle.log"
|
|
21
|
+
|
|
22
|
+
# Ensure directories exist
|
|
23
|
+
mkdir -p "$(dirname "$DB_PATH")"
|
|
24
|
+
mkdir -p "$(dirname "$LOG_PATH")"
|
|
25
|
+
|
|
26
|
+
# ============================================================================
|
|
27
|
+
# Feature 1: Automatic SQLite Lifecycle Tracking
|
|
28
|
+
# ============================================================================
|
|
29
|
+
|
|
30
|
+
# Initialize database schema if needed
|
|
31
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
32
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
33
|
+
id TEXT PRIMARY KEY,
|
|
34
|
+
type TEXT NOT NULL,
|
|
35
|
+
status TEXT NOT NULL,
|
|
36
|
+
confidence REAL,
|
|
37
|
+
spawned_at TEXT,
|
|
38
|
+
completed_at TEXT,
|
|
39
|
+
metadata TEXT
|
|
40
|
+
);
|
|
41
|
+
EOF
|
|
42
|
+
|
|
43
|
+
# Insert spawn record
|
|
44
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
45
|
+
INSERT OR REPLACE INTO agents (id, type, status, spawned_at, metadata)
|
|
46
|
+
VALUES (
|
|
47
|
+
'$AGENT_ID',
|
|
48
|
+
'$AGENT_TYPE',
|
|
49
|
+
'spawned',
|
|
50
|
+
'$SPAWNED_AT',
|
|
51
|
+
'{"source": "subagent_start_hook", "task_id": "$TASK_ID"}'
|
|
52
|
+
);
|
|
53
|
+
EOF
|
|
54
|
+
|
|
55
|
+
echo "[SubagentStart] Lifecycle tracking: $AGENT_ID ($AGENT_TYPE) spawned at $SPAWNED_AT" | tee -a "$LOG_PATH"
|
|
56
|
+
|
|
57
|
+
# ============================================================================
|
|
58
|
+
# Feature 2: Protocol Dependency Validation
|
|
59
|
+
# ============================================================================
|
|
60
|
+
|
|
61
|
+
# Extract phase from agent type (e.g., "loop2-validator" -> "loop2")
|
|
62
|
+
if [[ "$AGENT_TYPE" =~ ^loop([0-9]+)- ]]; then
|
|
63
|
+
PHASE="${BASH_REMATCH[1]}"
|
|
64
|
+
|
|
65
|
+
# Loop 2 validators must wait for Loop 3 completion
|
|
66
|
+
if [ "$PHASE" = "2" ] && [ "$TASK_ID" != "unknown" ]; then
|
|
67
|
+
LOOP3_COMPLETED=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM agents WHERE metadata LIKE '%\"task_id\": \"$TASK_ID\"%' AND type LIKE 'loop3-%' AND status='completed';")
|
|
68
|
+
|
|
69
|
+
if [ "$LOOP3_COMPLETED" -eq 0 ]; then
|
|
70
|
+
echo "[SubagentStart] ERROR: Loop 2 agent spawned before Loop 3 completion (task: $TASK_ID)" | tee -a "$LOG_PATH"
|
|
71
|
+
echo "WARN: Protocol violation detected - Loop 2 validator spawning before Loop 3 implementers complete"
|
|
72
|
+
echo "This may indicate 'consensus on vapor' anti-pattern"
|
|
73
|
+
# Don't exit 1 - allow spawn but log warning for debugging
|
|
74
|
+
else
|
|
75
|
+
echo "[SubagentStart] Protocol check passed: Loop 3 completed ($LOOP3_COMPLETED agents) before Loop 2 spawn" | tee -a "$LOG_PATH"
|
|
76
|
+
fi
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
# Product Owner must wait for Loop 2 completion
|
|
80
|
+
if [[ "$AGENT_TYPE" =~ product-owner ]] && [ "$TASK_ID" != "unknown" ]; then
|
|
81
|
+
LOOP2_COMPLETED=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM agents WHERE metadata LIKE '%\"task_id\": \"$TASK_ID\"%' AND type LIKE 'loop2-%' AND status='completed';")
|
|
82
|
+
|
|
83
|
+
if [ "$LOOP2_COMPLETED" -eq 0 ]; then
|
|
84
|
+
echo "[SubagentStart] ERROR: Product Owner spawned before Loop 2 completion (task: $TASK_ID)" | tee -a "$LOG_PATH"
|
|
85
|
+
echo "WARN: Protocol violation - Product Owner making decisions before validator review"
|
|
86
|
+
# Don't exit 1 - allow spawn but log warning
|
|
87
|
+
else
|
|
88
|
+
echo "[SubagentStart] Protocol check passed: Loop 2 completed ($LOOP2_COMPLETED agents) before Product Owner spawn" | tee -a "$LOG_PATH"
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# ============================================================================
|
|
94
|
+
# Success Exit
|
|
95
|
+
# ============================================================================
|
|
96
|
+
|
|
97
|
+
echo "[SubagentStart] Hook completed successfully for $AGENT_ID" | tee -a "$LOG_PATH"
|
|
98
|
+
exit 0
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# SubagentStop Hook - Claude Code v2.0.43+
|
|
3
|
+
# Automatically invoked when Task() agent completes
|
|
4
|
+
#
|
|
5
|
+
# High-value features:
|
|
6
|
+
# 1. Automatic lifecycle completion tracking
|
|
7
|
+
# 2. Transcript collection for post-mortem analysis
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# Hook input (provided by Claude Code v2.0.42+)
|
|
12
|
+
AGENT_ID="${AGENT_ID:-unknown}"
|
|
13
|
+
AGENT_TYPE="${AGENT_TYPE:-unknown}"
|
|
14
|
+
AGENT_TRANSCRIPT_PATH="${AGENT_TRANSCRIPT_PATH:-}"
|
|
15
|
+
TASK_ID="${TASK_ID:-unknown}"
|
|
16
|
+
COMPLETED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
17
|
+
|
|
18
|
+
# Project paths
|
|
19
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
|
|
20
|
+
DB_PATH="${PROJECT_ROOT}/claude-assets/skills/cfn-redis-coordination/data/cfn-loop.db"
|
|
21
|
+
LOG_PATH="${PROJECT_ROOT}/.artifacts/logs/subagent-lifecycle.log"
|
|
22
|
+
TRANSCRIPT_DIR="${PROJECT_ROOT}/.artifacts/transcripts"
|
|
23
|
+
|
|
24
|
+
# Ensure directories exist
|
|
25
|
+
mkdir -p "$(dirname "$DB_PATH")"
|
|
26
|
+
mkdir -p "$(dirname "$LOG_PATH")"
|
|
27
|
+
mkdir -p "$TRANSCRIPT_DIR"
|
|
28
|
+
|
|
29
|
+
# ============================================================================
|
|
30
|
+
# Feature 1: Automatic Lifecycle Completion Tracking
|
|
31
|
+
# ============================================================================
|
|
32
|
+
|
|
33
|
+
# Update completion status in SQLite
|
|
34
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
35
|
+
UPDATE agents
|
|
36
|
+
SET
|
|
37
|
+
status = 'completed',
|
|
38
|
+
completed_at = '$COMPLETED_AT'
|
|
39
|
+
WHERE id = '$AGENT_ID';
|
|
40
|
+
EOF
|
|
41
|
+
|
|
42
|
+
echo "[SubagentStop] Lifecycle tracking: $AGENT_ID ($AGENT_TYPE) completed at $COMPLETED_AT" | tee -a "$LOG_PATH"
|
|
43
|
+
|
|
44
|
+
# ============================================================================
|
|
45
|
+
# Feature 2: Transcript Collection for Post-Mortem Analysis
|
|
46
|
+
# ============================================================================
|
|
47
|
+
|
|
48
|
+
if [ -n "$AGENT_TRANSCRIPT_PATH" ] && [ -f "$AGENT_TRANSCRIPT_PATH" ]; then
|
|
49
|
+
# Determine transcript archive path
|
|
50
|
+
TRANSCRIPT_ARCHIVE="$TRANSCRIPT_DIR/${AGENT_ID}.jsonl"
|
|
51
|
+
|
|
52
|
+
# Copy transcript to archive
|
|
53
|
+
cp "$AGENT_TRANSCRIPT_PATH" "$TRANSCRIPT_ARCHIVE"
|
|
54
|
+
|
|
55
|
+
# Update metadata with transcript path
|
|
56
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
57
|
+
UPDATE agents
|
|
58
|
+
SET metadata = json_set(
|
|
59
|
+
metadata,
|
|
60
|
+
'$.transcript_path',
|
|
61
|
+
'$TRANSCRIPT_ARCHIVE'
|
|
62
|
+
)
|
|
63
|
+
WHERE id = '$AGENT_ID';
|
|
64
|
+
EOF
|
|
65
|
+
|
|
66
|
+
# Extract key metrics from transcript (tool usage, confidence scores)
|
|
67
|
+
# JSONL format: one JSON object per line
|
|
68
|
+
TOOL_CALLS=$(grep -c '"type":"tool_use"' "$AGENT_TRANSCRIPT_PATH" 2>/dev/null || echo 0)
|
|
69
|
+
LAST_MESSAGE=$(tail -n 1 "$AGENT_TRANSCRIPT_PATH" 2>/dev/null || echo "{}")
|
|
70
|
+
|
|
71
|
+
echo "[SubagentStop] Transcript collected: $TRANSCRIPT_ARCHIVE ($TOOL_CALLS tool calls)" | tee -a "$LOG_PATH"
|
|
72
|
+
|
|
73
|
+
# Store metrics
|
|
74
|
+
sqlite3 "$DB_PATH" <<EOF
|
|
75
|
+
UPDATE agents
|
|
76
|
+
SET metadata = json_set(
|
|
77
|
+
metadata,
|
|
78
|
+
'$.tool_calls',
|
|
79
|
+
$TOOL_CALLS
|
|
80
|
+
)
|
|
81
|
+
WHERE id = '$AGENT_ID';
|
|
82
|
+
EOF
|
|
83
|
+
|
|
84
|
+
else
|
|
85
|
+
echo "[SubagentStop] No transcript available for $AGENT_ID (path: $AGENT_TRANSCRIPT_PATH)" | tee -a "$LOG_PATH"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# ============================================================================
|
|
89
|
+
# Success Exit
|
|
90
|
+
# ============================================================================
|
|
91
|
+
|
|
92
|
+
echo "[SubagentStop] Hook completed successfully for $AGENT_ID" | tee -a "$LOG_PATH"
|
|
93
|
+
exit 0
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Post-Edit Credential Scanner
|
|
3
|
+
# Scans files for exposed credentials before commit
|
|
4
|
+
# Integrated with cfn-post-edit.config.json
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
FILE_PATH="$1"
|
|
9
|
+
AGENT_ID="${2:-unknown}"
|
|
10
|
+
|
|
11
|
+
# Exit codes
|
|
12
|
+
EXIT_SUCCESS=0
|
|
13
|
+
EXIT_CREDENTIAL_FOUND=11 # New exit code for credential detection
|
|
14
|
+
EXIT_ERROR=1
|
|
15
|
+
|
|
16
|
+
# Credential patterns (high-confidence detection)
|
|
17
|
+
declare -a PATTERNS=(
|
|
18
|
+
# API Keys
|
|
19
|
+
"sk-ant-[a-zA-Z0-9_-]{40,}" # Anthropic API keys
|
|
20
|
+
"sk-zai-[a-zA-Z0-9._-]{20,}" # Z.ai API keys
|
|
21
|
+
"npm_[a-zA-Z0-9]{36}" # NPM API keys
|
|
22
|
+
"tr_dev_[a-zA-Z0-9]{16,}" # Trigger.dev API keys
|
|
23
|
+
"AIzaSy[a-zA-Z0-9_-]{33}" # Google API keys
|
|
24
|
+
"xai-[a-zA-Z0-9]{32,}" # XAi API keys
|
|
25
|
+
"grok-[a-zA-Z0-9]{32,}" # Grok API keys
|
|
26
|
+
|
|
27
|
+
# Generic patterns
|
|
28
|
+
"[a-zA-Z0-9]{32,}\.SUs3hnpAZAGsQDHX" # Z.ai token format
|
|
29
|
+
"[a-zA-Z0-9]{32,}\.QO8R0JxF4fucsoWL" # Legacy Z.ai format
|
|
30
|
+
"[a-zA-Z0-9]{32,}\.gDXkwrMNlYcqE8mF" # Legacy Z.ai format
|
|
31
|
+
|
|
32
|
+
# Environment variable assignments (suspicious)
|
|
33
|
+
"ANTHROPIC_API_KEY\s*=\s*[\"']sk-ant-"
|
|
34
|
+
"ZAI_API_KEY\s*=\s*[\"'][a-zA-Z0-9._-]{20,}"
|
|
35
|
+
"NPM_API_KEY\s*=\s*[\"']npm_"
|
|
36
|
+
"TRIGGER_API_KEY\s*=\s*[\"']tr_dev_"
|
|
37
|
+
"REDIS_PASSWORD\s*=\s*[\"'][a-zA-Z0-9]{16,}"
|
|
38
|
+
"POSTGRES_PASSWORD\s*=\s*[\"'][a-zA-Z0-9]{16,}"
|
|
39
|
+
|
|
40
|
+
# JSON/YAML credentials
|
|
41
|
+
"\"api_key\"\s*:\s*\"[a-zA-Z0-9_-]{20,}\""
|
|
42
|
+
"\"apiKey\"\s*:\s*\"[a-zA-Z0-9_-]{20,}\""
|
|
43
|
+
"\"auth_token\"\s*:\s*\"[a-zA-Z0-9._-]{20,}\""
|
|
44
|
+
"\"password\"\s*:\s*\"[a-zA-Z0-9]{16,}\""
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Whitelist patterns (safe to ignore)
|
|
48
|
+
declare -a WHITELIST=(
|
|
49
|
+
"\\[REDACTED\\]" # Already redacted
|
|
50
|
+
"YOUR_API_KEY" # Placeholder
|
|
51
|
+
"YOUR_.*_KEY" # Generic placeholder
|
|
52
|
+
"example\\.com" # Example domains
|
|
53
|
+
"test[_-]?key" # Test keys
|
|
54
|
+
"mock[_-]?key" # Mock keys
|
|
55
|
+
"sk-ant-mock" # Mock Anthropic keys
|
|
56
|
+
"npm_MockTestKey" # Mock NPM keys
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Check if file should be scanned
|
|
60
|
+
should_scan_file() {
|
|
61
|
+
local file="$1"
|
|
62
|
+
|
|
63
|
+
# Skip binary files
|
|
64
|
+
if file "$file" | grep -q "binary"; then
|
|
65
|
+
return 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Skip large files (>1MB)
|
|
69
|
+
if [ $(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null) -gt 1048576 ]; then
|
|
70
|
+
return 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Scan these file types
|
|
74
|
+
case "$file" in
|
|
75
|
+
*.ts|*.tsx|*.js|*.jsx|*.json|*.md|*.sh|*.bash|*.env*|*.yaml|*.yml|*.txt)
|
|
76
|
+
return 0
|
|
77
|
+
;;
|
|
78
|
+
*)
|
|
79
|
+
return 1
|
|
80
|
+
;;
|
|
81
|
+
esac
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
# Check if match is whitelisted
|
|
85
|
+
is_whitelisted() {
|
|
86
|
+
local match="$1"
|
|
87
|
+
|
|
88
|
+
for pattern in "${WHITELIST[@]}"; do
|
|
89
|
+
if echo "$match" | grep -qE "$pattern"; then
|
|
90
|
+
return 0
|
|
91
|
+
fi
|
|
92
|
+
done
|
|
93
|
+
|
|
94
|
+
return 1
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
# Scan file for credentials
|
|
98
|
+
scan_file() {
|
|
99
|
+
local file="$1"
|
|
100
|
+
local findings=0
|
|
101
|
+
local line_number
|
|
102
|
+
local matched_line
|
|
103
|
+
|
|
104
|
+
for pattern in "${PATTERNS[@]}"; do
|
|
105
|
+
while IFS=: read -r line_number matched_line; do
|
|
106
|
+
# Skip if whitelisted
|
|
107
|
+
if is_whitelisted "$matched_line"; then
|
|
108
|
+
continue
|
|
109
|
+
fi
|
|
110
|
+
|
|
111
|
+
findings=$((findings + 1))
|
|
112
|
+
|
|
113
|
+
# Redact the actual credential in output
|
|
114
|
+
local redacted_line=$(echo "$matched_line" | sed -E "s/${pattern}/[CREDENTIAL_REDACTED]/g")
|
|
115
|
+
|
|
116
|
+
echo "⚠️ CREDENTIAL DETECTED:"
|
|
117
|
+
echo " File: $file"
|
|
118
|
+
echo " Line: $line_number"
|
|
119
|
+
echo " Match: $redacted_line"
|
|
120
|
+
echo " Pattern: $pattern"
|
|
121
|
+
echo ""
|
|
122
|
+
|
|
123
|
+
done < <(grep -nE "$pattern" "$file" 2>/dev/null || true)
|
|
124
|
+
done
|
|
125
|
+
|
|
126
|
+
return $findings
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
# Main execution
|
|
130
|
+
main() {
|
|
131
|
+
if [ ! -f "$FILE_PATH" ]; then
|
|
132
|
+
echo "ERROR: File not found: $FILE_PATH" >&2
|
|
133
|
+
exit $EXIT_ERROR
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Check if file should be scanned
|
|
137
|
+
if ! should_scan_file "$FILE_PATH"; then
|
|
138
|
+
# File type not scannable, exit success
|
|
139
|
+
exit $EXIT_SUCCESS
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
echo "🔍 Scanning for credentials: $FILE_PATH"
|
|
143
|
+
|
|
144
|
+
# Scan file
|
|
145
|
+
if scan_file "$FILE_PATH"; then
|
|
146
|
+
echo ""
|
|
147
|
+
echo "✅ No credentials detected in $FILE_PATH"
|
|
148
|
+
exit $EXIT_SUCCESS
|
|
149
|
+
else
|
|
150
|
+
findings=$?
|
|
151
|
+
echo ""
|
|
152
|
+
echo "❌ SECURITY ALERT: $findings credential(s) detected in $FILE_PATH"
|
|
153
|
+
echo ""
|
|
154
|
+
echo "🛡️ REMEDIATION STEPS:"
|
|
155
|
+
echo " 1. Replace credentials with [REDACTED] placeholder"
|
|
156
|
+
echo " 2. Move credentials to root .env file"
|
|
157
|
+
echo " 3. Use environment variables instead of hardcoded values"
|
|
158
|
+
echo " 4. If this is a test file, use mock credentials"
|
|
159
|
+
echo ""
|
|
160
|
+
echo "🚨 BLOCKED: File NOT saved to prevent credential exposure"
|
|
161
|
+
echo ""
|
|
162
|
+
|
|
163
|
+
# Log finding for audit trail
|
|
164
|
+
if [ -n "${AGENT_ID:-}" ]; then
|
|
165
|
+
echo "$(date -Iseconds) | AGENT:$AGENT_ID | FILE:$FILE_PATH | CREDENTIALS:$findings" >> .artifacts/logs/credential-scanner.log
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
exit $EXIT_CREDENTIAL_FOUND
|
|
169
|
+
fi
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
main "$@"
|
|
@@ -486,7 +486,7 @@ Implement comprehensive test suites that validate both functional requirements a
|
|
|
486
486
|
- CFN Loop Validation: `.claude/skills/cfn-loop-validation/SKILL.md`
|
|
487
487
|
|
|
488
488
|
**CFN Loop Documentation:**
|
|
489
|
-
- **Task Mode Guide**: `.claude/commands/
|
|
489
|
+
- **Task Mode Guide**: `.claude/commands/CFN_LOOP_TASK_MODE.md` (agent specialization, sprint workflow, backlog management, adaptive validator scaling)
|
|
490
490
|
- Coordinator Parameters: `.claude/commands/cfn/CFN_COORDINATOR_PARAMETERS.md`
|
|
491
491
|
|
|
492
492
|
**Migration Analytics:**
|
|
@@ -195,5 +195,5 @@ grep -B 2 "Category: Optimization" readme/BACKLOG.md
|
|
|
195
195
|
## References
|
|
196
196
|
|
|
197
197
|
- **STRAT-025**: Explicit Deliverable Tracking (adaptive context)
|
|
198
|
-
- **CFN Loop Documentation**: `.claude/commands/
|
|
198
|
+
- **CFN Loop Documentation**: `.claude/commands/CFN_LOOP_TASK_MODE.md`
|
|
199
199
|
- **Sprint Execution**: CLAUDE.md Section 6 - Sprint Context Injection
|