claude-flow-novice 2.14.36 → 2.15.0
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/commands/cfn-loop-cli.md +491 -456
- package/.claude/commands/switch-api.md +33 -12
- package/.claude/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
- package/.claude/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
- package/.claude/skills/cfn-docker-agent-spawning/spawn-agent.sh +24 -6
- package/.claude/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +220 -220
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +5 -0
- package/claude-assets/agents/custom/claude-code-expert.md +151 -2
- package/claude-assets/agents/docker-coordinators/cfn-docker-v3-coordinator.md +43 -3
- package/claude-assets/commands/cfn-loop-cli.md +491 -456
- package/claude-assets/commands/switch-api.md +33 -12
- package/claude-assets/skills/cfn-agent-spawning/get-agent-provider-env.sh +107 -0
- package/claude-assets/skills/cfn-agent-spawning/parse-agent-provider.sh +59 -0
- package/claude-assets/skills/cfn-docker-agent-spawning/spawn-agent.sh +24 -6
- package/claude-assets/skills/cfn-error-logging/SKILL.md +339 -0
- package/claude-assets/skills/cfn-error-logging/cleanup-error-logs.sh +334 -0
- package/claude-assets/skills/cfn-error-logging/integrate-cli.sh +232 -0
- package/claude-assets/skills/cfn-error-logging/integrate-docker.sh +294 -0
- package/claude-assets/skills/cfn-error-logging/invoke-error-logging.sh +839 -0
- package/claude-assets/skills/cfn-error-logging/test-error-logging.sh +475 -0
- package/claude-assets/skills/cfn-loop-orchestration/helpers/spawn-agents.sh +18 -9
- package/claude-assets/skills/cfn-process-instrumentation/instrument-process.sh +5 -3
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +220 -220
- package/claude-assets/skills/cfn-task-mode-sanitize/task-mode-env-sanitizer.sh +21 -9
- package/claude-assets/skills/cfn-validation-runner-instrumentation/wrapped-executor.sh +3 -1
- package/dist/hello.js +27 -3
- package/dist/hello.js.map +1 -1
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/server.test.js +207 -0
- package/dist/server.test.js.map +1 -0
- package/package.json +2 -1
- package/scripts/switch-api.sh +140 -12
|
@@ -1,30 +1,47 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Switch Main Chat and Task tool between Z.ai and Anthropic providers
|
|
2
|
+
description: Switch Main Chat and Task tool between Z.ai, Kimi, OpenRouter, and Anthropic providers
|
|
3
3
|
tags: [config, api, cost-optimization]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Switch Main Chat and Task() tool API provider between
|
|
6
|
+
Switch Main Chat and Task() tool API provider between multiple AI providers.
|
|
7
7
|
|
|
8
|
-
**Important:** CLI agents
|
|
8
|
+
**Important:** CLI agents support custom routing when enabled. This command affects Main Chat and Task() spawned agents.
|
|
9
9
|
|
|
10
10
|
**Usage:**
|
|
11
11
|
- `/switch-api` - Show current status
|
|
12
|
-
- `/switch-api zai` -
|
|
13
|
-
-
|
|
12
|
+
- `/switch-api [zai|kimi|openrouter|max]` - Switch provider
|
|
13
|
+
- `zai` - Z.ai ($0.50/1M tokens)
|
|
14
|
+
- `kimi` - Moonshot Kimi ($2/1M tokens)
|
|
15
|
+
- `openrouter` - OpenRouter (varies by model)
|
|
16
|
+
- `max` or `claude` - Anthropic ($15/1M tokens, requires re-login)
|
|
14
17
|
|
|
15
18
|
**Arguments:**
|
|
16
19
|
- `status` - Show current routing configuration (default)
|
|
17
20
|
- `zai` - Route Main Chat + Task tool to Z.ai for cost savings
|
|
21
|
+
- `kimi` - Route Main Chat + Task tool to Moonshot Kimi
|
|
22
|
+
- `openrouter` - Route Main Chat + Task tool to OpenRouter
|
|
18
23
|
- `max` or `claude` - Route Main Chat + Task tool to Anthropic for quality
|
|
19
24
|
|
|
20
25
|
**What This Does:**
|
|
21
26
|
|
|
22
27
|
`/switch-api zai`:
|
|
23
|
-
- Adds env vars to `.claude/settings.json`
|
|
28
|
+
- Adds Z.ai env vars to `.claude/settings.json`
|
|
24
29
|
- Main Chat + Task() agents use Z.ai
|
|
25
30
|
- Cost: $0.50/1M tokens (97% savings)
|
|
26
31
|
- No login required
|
|
27
32
|
|
|
33
|
+
`/switch-api kimi`:
|
|
34
|
+
- Adds Kimi env vars to `.claude/settings.json`
|
|
35
|
+
- Main Chat + Task() agents use Moonshot Kimi
|
|
36
|
+
- Cost: ~$2/1M tokens
|
|
37
|
+
- Requires `KIMI_API_KEY` in root `.env`
|
|
38
|
+
|
|
39
|
+
`/switch-api openrouter`:
|
|
40
|
+
- Adds OpenRouter env vars to `.claude/settings.json`
|
|
41
|
+
- Main Chat + Task() agents use OpenRouter
|
|
42
|
+
- Cost: Varies by model
|
|
43
|
+
- Requires `OPENROUTER_API_KEY` in root `.env`
|
|
44
|
+
|
|
28
45
|
`/switch-api max`:
|
|
29
46
|
- Removes env vars from `.claude/settings.json`
|
|
30
47
|
- Main Chat + Task() agents use Anthropic
|
|
@@ -33,21 +50,25 @@ Switch Main Chat and Task() tool API provider between Z.ai (cost-optimized) and
|
|
|
33
50
|
|
|
34
51
|
**Combined Architecture:**
|
|
35
52
|
```
|
|
36
|
-
Main Chat (Anthropic
|
|
53
|
+
Main Chat (Anthropic/Z.ai/Kimi/OpenRouter - your choice)
|
|
37
54
|
↓
|
|
38
55
|
Task() → Coordinator (uses Main Chat provider)
|
|
39
56
|
↓
|
|
40
|
-
CLI spawn → Workers (
|
|
57
|
+
CLI spawn → Workers (custom routing when enabled, see agent profiles)
|
|
41
58
|
```
|
|
42
59
|
|
|
43
60
|
**Execute:**
|
|
44
61
|
```bash
|
|
45
|
-
bash scripts/switch-api.sh {{args}}
|
|
62
|
+
bash "$(git rev-parse --show-toplevel 2>/dev/null || pwd)/scripts/switch-api.sh" {{args}}
|
|
46
63
|
```
|
|
47
64
|
|
|
65
|
+
**Note:** Script automatically resolves to project root directory.
|
|
66
|
+
|
|
48
67
|
**Examples:**
|
|
49
68
|
```bash
|
|
50
|
-
/switch-api
|
|
51
|
-
/switch-api zai
|
|
52
|
-
/switch-api
|
|
69
|
+
/switch-api # Show current routing
|
|
70
|
+
/switch-api zai # Cost-optimize with Z.ai
|
|
71
|
+
/switch-api kimi # Use Moonshot Kimi
|
|
72
|
+
/switch-api openrouter # Use OpenRouter (access 400+ models)
|
|
73
|
+
/switch-api max # Quality-optimize with Anthropic (requires re-login)
|
|
53
74
|
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Get Agent Provider Environment Variables
|
|
4
|
+
# Determines which provider environment variables to use for CLI/Docker agent spawning
|
|
5
|
+
#
|
|
6
|
+
# Logic:
|
|
7
|
+
# 1. If custom routing is disabled, use Main Chat settings (from .claude/settings.json)
|
|
8
|
+
# 2. If custom routing is enabled:
|
|
9
|
+
# a. Check agent profile for PROVIDER_PARAMETERS
|
|
10
|
+
# b. If found, use agent-specific provider/model
|
|
11
|
+
# c. If not found, use Main Chat settings
|
|
12
|
+
#
|
|
13
|
+
# Usage: source get-agent-provider-env.sh AGENT_TYPE
|
|
14
|
+
# Exports: ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_MODEL, ANTHROPIC_SMALL_FAST_MODEL
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
AGENT_TYPE="${1:-}"
|
|
19
|
+
CUSTOM_ROUTING_ENABLED="${CFN_CUSTOM_ROUTING:-false}"
|
|
20
|
+
SETTINGS_FILE=".claude/settings.json"
|
|
21
|
+
|
|
22
|
+
if [[ -z "$AGENT_TYPE" ]]; then
|
|
23
|
+
echo "Usage: source $0 AGENT_TYPE" >&2
|
|
24
|
+
return 1 2>/dev/null || exit 1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Function to get provider config (zai, kimi, openrouter, anthropic)
|
|
28
|
+
get_provider_config() {
|
|
29
|
+
local provider="$1"
|
|
30
|
+
local model="${2:-}"
|
|
31
|
+
|
|
32
|
+
case "$provider" in
|
|
33
|
+
zai)
|
|
34
|
+
export ANTHROPIC_BASE_URL="https://api.z.ai/api/anthropic"
|
|
35
|
+
export ANTHROPIC_AUTH_TOKEN="${ZAI_API_KEY:-}"
|
|
36
|
+
export ANTHROPIC_MODEL="${model:-glm-4.6}"
|
|
37
|
+
export ANTHROPIC_SMALL_FAST_MODEL="${model:-glm-4.6}"
|
|
38
|
+
;;
|
|
39
|
+
kimi)
|
|
40
|
+
export ANTHROPIC_BASE_URL="https://api.moonshot.ai/anthropic"
|
|
41
|
+
export ANTHROPIC_AUTH_TOKEN="${KIMI_API_KEY:-}"
|
|
42
|
+
export ANTHROPIC_MODEL="${model:-kimi-k2-turbo-preview}"
|
|
43
|
+
export ANTHROPIC_SMALL_FAST_MODEL="${model:-kimi-k2-turbo-preview}"
|
|
44
|
+
;;
|
|
45
|
+
openrouter)
|
|
46
|
+
export ANTHROPIC_BASE_URL="https://openrouter.ai/api/v1"
|
|
47
|
+
export ANTHROPIC_AUTH_TOKEN="${OPENROUTER_API_KEY:-}"
|
|
48
|
+
export ANTHROPIC_MODEL="${model:-anthropic/claude-sonnet-4.5}"
|
|
49
|
+
export ANTHROPIC_SMALL_FAST_MODEL="${model:-anthropic/claude-sonnet-4.5}"
|
|
50
|
+
;;
|
|
51
|
+
anthropic|*)
|
|
52
|
+
# Use default Anthropic settings (remove custom env vars)
|
|
53
|
+
unset ANTHROPIC_BASE_URL
|
|
54
|
+
unset ANTHROPIC_AUTH_TOKEN
|
|
55
|
+
unset ANTHROPIC_MODEL
|
|
56
|
+
unset ANTHROPIC_SMALL_FAST_MODEL
|
|
57
|
+
;;
|
|
58
|
+
esac
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Function to detect provider from base URL
|
|
62
|
+
detect_provider_from_url() {
|
|
63
|
+
local base_url="$1"
|
|
64
|
+
|
|
65
|
+
if [[ "$base_url" == *"z.ai"* ]]; then
|
|
66
|
+
echo "zai"
|
|
67
|
+
elif [[ "$base_url" == *"moonshot.ai"* ]]; then
|
|
68
|
+
echo "kimi"
|
|
69
|
+
elif [[ "$base_url" == *"openrouter.ai"* ]]; then
|
|
70
|
+
echo "openrouter"
|
|
71
|
+
else
|
|
72
|
+
echo "anthropic"
|
|
73
|
+
fi
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# Step 1: Check if custom routing is enabled
|
|
77
|
+
if [[ "$CUSTOM_ROUTING_ENABLED" != "true" ]]; then
|
|
78
|
+
# Custom routing disabled - use Main Chat settings from .claude/settings.json
|
|
79
|
+
if [[ -f "$SETTINGS_FILE" ]]; then
|
|
80
|
+
BASE_URL=$(jq -r '.env.ANTHROPIC_BASE_URL // empty' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
|
81
|
+
|
|
82
|
+
if [[ -n "$BASE_URL" ]]; then
|
|
83
|
+
# Main Chat has custom provider configured
|
|
84
|
+
export ANTHROPIC_BASE_URL="$BASE_URL"
|
|
85
|
+
export ANTHROPIC_AUTH_TOKEN=$(jq -r '.env.ANTHROPIC_AUTH_TOKEN // empty' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
|
86
|
+
export ANTHROPIC_MODEL=$(jq -r '.env.ANTHROPIC_MODEL // empty' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
|
87
|
+
export ANTHROPIC_SMALL_FAST_MODEL=$(jq -r '.env.ANTHROPIC_SMALL_FAST_MODEL // empty' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
|
88
|
+
fi
|
|
89
|
+
# else: No custom provider, use default Anthropic
|
|
90
|
+
fi
|
|
91
|
+
return 0 2>/dev/null || exit 0
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
# Step 2: Custom routing enabled - check agent profile for PROVIDER_PARAMETERS
|
|
95
|
+
AGENT_PROVIDER=$(bash .claude/skills/cfn-agent-spawning/parse-agent-provider.sh "$AGENT_TYPE" --field provider)
|
|
96
|
+
AGENT_MODEL=$(bash .claude/skills/cfn-agent-spawning/parse-agent-provider.sh "$AGENT_TYPE" --field model)
|
|
97
|
+
|
|
98
|
+
if [[ -n "$AGENT_PROVIDER" ]]; then
|
|
99
|
+
# Agent has provider parameters - use them
|
|
100
|
+
get_provider_config "$AGENT_PROVIDER" "$AGENT_MODEL"
|
|
101
|
+
else
|
|
102
|
+
# No agent-specific provider - default to Z.ai with glm-4.6
|
|
103
|
+
export ANTHROPIC_BASE_URL="https://api.z.ai/api/anthropic"
|
|
104
|
+
export ANTHROPIC_AUTH_TOKEN="${ZAI_API_KEY:-}"
|
|
105
|
+
export ANTHROPIC_MODEL="glm-4.6"
|
|
106
|
+
export ANTHROPIC_SMALL_FAST_MODEL="glm-4.6"
|
|
107
|
+
fi
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Parse Agent Provider Parameters
|
|
4
|
+
# Extracts provider and model from agent profile's PROVIDER_PARAMETERS section
|
|
5
|
+
# Usage: parse-agent-provider.sh AGENT_TYPE [--field provider|model]
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
AGENT_TYPE="${1:-}"
|
|
10
|
+
FIELD="${2:---field}"
|
|
11
|
+
FIELD_VALUE="${3:-provider}"
|
|
12
|
+
|
|
13
|
+
if [[ -z "$AGENT_TYPE" ]]; then
|
|
14
|
+
echo "Usage: $0 AGENT_TYPE [--field provider|model]" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
|
|
18
|
+
# Find agent file in multiple locations
|
|
19
|
+
AGENT_FILE=""
|
|
20
|
+
SEARCH_PATHS=(
|
|
21
|
+
".claude/agents/cfn-dev-team/**/${AGENT_TYPE}.md"
|
|
22
|
+
".claude/agents/custom/${AGENT_TYPE}.md"
|
|
23
|
+
".claude/agents/${AGENT_TYPE}.md"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
for pattern in "${SEARCH_PATHS[@]}"; do
|
|
27
|
+
# Use find with glob pattern
|
|
28
|
+
while IFS= read -r -d '' file; do
|
|
29
|
+
if [[ -f "$file" ]]; then
|
|
30
|
+
AGENT_FILE="$file"
|
|
31
|
+
break 2
|
|
32
|
+
fi
|
|
33
|
+
done < <(find .claude/agents -type f -name "${AGENT_TYPE}.md" -print0 2>/dev/null)
|
|
34
|
+
done
|
|
35
|
+
|
|
36
|
+
if [[ -z "$AGENT_FILE" ]]; then
|
|
37
|
+
# Agent file not found, return empty (will fallback to main chat settings)
|
|
38
|
+
echo ""
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Extract PROVIDER_PARAMETERS section
|
|
43
|
+
# Format:
|
|
44
|
+
# <!-- PROVIDER_PARAMETERS
|
|
45
|
+
# provider: kimi
|
|
46
|
+
# model: kimi-k2-turbo-preview
|
|
47
|
+
# -->
|
|
48
|
+
|
|
49
|
+
PARAM_VALUE=$(awk '
|
|
50
|
+
/<!-- PROVIDER_PARAMETERS/,/-->/ {
|
|
51
|
+
if ($0 ~ /^'"${FIELD_VALUE}"':/) {
|
|
52
|
+
sub(/^'"${FIELD_VALUE}"':[ \t]*/, "")
|
|
53
|
+
print $0
|
|
54
|
+
exit
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
' "$AGENT_FILE" | tr -d '\r' | xargs)
|
|
58
|
+
|
|
59
|
+
echo "$PARAM_VALUE"
|
|
@@ -208,8 +208,12 @@ if ! docker image inspect "$IMAGE" &> /dev/null; then
|
|
|
208
208
|
exit 1
|
|
209
209
|
fi
|
|
210
210
|
|
|
211
|
-
# Get project root directory
|
|
212
|
-
PROJECT_ROOT="$(
|
|
211
|
+
# Get project root directory (use git root for reliability)
|
|
212
|
+
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"
|
|
213
|
+
if [[ -z "$PROJECT_ROOT" ]]; then
|
|
214
|
+
# Fallback to script-relative path
|
|
215
|
+
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd -P)"
|
|
216
|
+
fi
|
|
213
217
|
cd "$PROJECT_ROOT"
|
|
214
218
|
|
|
215
219
|
# Create workspace directory with proper permissions
|
|
@@ -328,16 +332,30 @@ DOCKER_CMD="$DOCKER_CMD --env AGENT_TYPE=${AGENT_TYPE}"
|
|
|
328
332
|
DOCKER_CMD="$DOCKER_CMD --env TASK_ID=${TASK_ID}"
|
|
329
333
|
DOCKER_CMD="$DOCKER_CMD --env PROJECT_ROOT=/app"
|
|
330
334
|
|
|
331
|
-
# Add Redis URL
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
fi
|
|
335
|
+
# Add Redis URL for container-to-container networking
|
|
336
|
+
# Always set Redis URL regardless of host Redis status
|
|
337
|
+
DOCKER_CMD="$DOCKER_CMD --env REDIS_URL=redis://redis:6379"
|
|
335
338
|
|
|
336
339
|
# Add MCP tokens file path if tokens generated
|
|
337
340
|
if [[ -n "$TOKENS_FILE" ]]; then
|
|
338
341
|
DOCKER_CMD="$DOCKER_CMD --env MCP_TOKENS_FILE=/app/workspace/mcp-tokens.json"
|
|
339
342
|
fi
|
|
340
343
|
|
|
344
|
+
# Add provider routing environment variables (custom routing support)
|
|
345
|
+
source .claude/skills/cfn-agent-spawning/get-agent-provider-env.sh "$AGENT_TYPE"
|
|
346
|
+
if [[ -n "${ANTHROPIC_BASE_URL:-}" ]]; then
|
|
347
|
+
DOCKER_CMD="$DOCKER_CMD --env ANTHROPIC_BASE_URL=${ANTHROPIC_BASE_URL}"
|
|
348
|
+
fi
|
|
349
|
+
if [[ -n "${ANTHROPIC_AUTH_TOKEN:-}" ]]; then
|
|
350
|
+
DOCKER_CMD="$DOCKER_CMD --env ANTHROPIC_AUTH_TOKEN=${ANTHROPIC_AUTH_TOKEN}"
|
|
351
|
+
fi
|
|
352
|
+
if [[ -n "${ANTHROPIC_MODEL:-}" ]]; then
|
|
353
|
+
DOCKER_CMD="$DOCKER_CMD --env ANTHROPIC_MODEL=${ANTHROPIC_MODEL}"
|
|
354
|
+
fi
|
|
355
|
+
if [[ -n "${ANTHROPIC_SMALL_FAST_MODEL:-}" ]]; then
|
|
356
|
+
DOCKER_CMD="$DOCKER_CMD --env ANTHROPIC_SMALL_FAST_MODEL=${ANTHROPIC_SMALL_FAST_MODEL}"
|
|
357
|
+
fi
|
|
358
|
+
|
|
341
359
|
# Add custom environment variables
|
|
342
360
|
if [[ -n "$ENVIRONMENT" ]]; then
|
|
343
361
|
IFS=',' read -ra ENV_ARRAY <<< "$ENVIRONMENT"
|
|
@@ -190,15 +190,24 @@ spawn_agents_with_context() {
|
|
|
190
190
|
((injection_success_count++))
|
|
191
191
|
fi
|
|
192
192
|
|
|
193
|
-
#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
193
|
+
# Set provider environment variables for this agent (custom routing support)
|
|
194
|
+
# Spawn in subshell to isolate provider env vars per agent
|
|
195
|
+
(
|
|
196
|
+
source .claude/skills/cfn-agent-spawning/get-agent-provider-env.sh "$safe_agent_type"
|
|
197
|
+
|
|
198
|
+
# Spawn agent in background with enriched context and custom provider
|
|
199
|
+
npx claude-flow-novice agent "$safe_agent_type" \
|
|
200
|
+
--task-id "$safe_task_id" \
|
|
201
|
+
--agent-id "$safe_agent_id" \
|
|
202
|
+
--iteration "$iteration" \
|
|
203
|
+
--context "$context_to_use" &
|
|
204
|
+
|
|
205
|
+
AGENT_PID=$!
|
|
206
|
+
echo $AGENT_PID
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Capture PID from subshell output
|
|
210
|
+
AGENT_PID=$(jobs -p | tail -1)
|
|
202
211
|
"$REDIS_COORD_SKILL/store-context.sh" \
|
|
203
212
|
--task-id "$task_id" \
|
|
204
213
|
--key "${UNIQUE_AGENT_ID}:pid" \
|