claude-flow-novice 2.2.4 → 2.2.5
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/package.json +9 -8
- package/scripts/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/.claude-flow/metrics/performance.json +9 -0
- package/scripts/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/CLEANUP_OPTIMIZATION_REPORT.json +312 -0
- package/scripts/CLEANUP_PERFORMANCE_OPTIMIZATION.md +387 -0
- package/scripts/CLEANUP_QUICK_START.md +268 -0
- package/scripts/CLEANUP_TEST_RESULTS.md +205 -0
- package/scripts/README.md +339 -0
- package/scripts/ace-query.sh +384 -0
- package/scripts/agent-token-analysis.js +430 -0
- package/scripts/auto-setup.js +332 -0
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/build/validate-agents.js +238 -0
- package/scripts/build-index.js +43 -0
- package/scripts/build-orchestrator.js +320 -0
- package/scripts/check-routing-stats.cjs +122 -0
- package/scripts/ci-validation.js +375 -0
- package/scripts/cleanup-blocking-coordination.sh +420 -0
- package/scripts/cleanup-idle-sessions.sh +59 -0
- package/scripts/collect-build-metrics.js +65 -0
- package/scripts/demo/README.md +79 -0
- package/scripts/demo/autoscaling-demo-simplified.js +963 -0
- package/scripts/demo/comprehensive-dashboard-test.js +693 -0
- package/scripts/demo/confidence-log.js +87 -0
- package/scripts/demo/confidence-report.js +82 -0
- package/scripts/demo/demo-multi-swarm-coordination.js +325 -0
- package/scripts/demo/demo-production-deployment.js +399 -0
- package/scripts/demo/demo-visualization-system.js +149 -0
- package/scripts/demo/performance-analysis.cjs +71 -0
- package/scripts/demo/performance-analysis.js +71 -0
- package/scripts/demo/test-autoscaling-demo.js +314 -0
- package/scripts/dependency-optimizer.js +349 -0
- package/scripts/dependency-security-assessment.js +331 -0
- package/scripts/deploy-sdk.sh +176 -0
- package/scripts/deployment-readiness-report.json +179 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/ecosystem.config.cjs +90 -0
- package/scripts/fix-js-extensions.js +167 -0
- package/scripts/generate-basic-types.js +73 -0
- package/scripts/generate-changelog.js +318 -0
- package/scripts/git-hooks/pre-commit.sh +143 -0
- package/scripts/health-checks.js +634 -0
- package/scripts/hook-wrapper.sh +54 -0
- package/scripts/install/README.md +375 -0
- package/scripts/install/REDIS_SETUP_VALIDATION.json +245 -0
- package/scripts/install/check-prerequisites.js +303 -0
- package/scripts/install/config-wizard.js +606 -0
- package/scripts/install/dependency-checker.js +385 -0
- package/scripts/install/health-check.js +765 -0
- package/scripts/install/install.js +256 -0
- package/scripts/install/installation-benchmark.js +461 -0
- package/scripts/install/quick-install.js +720 -0
- package/scripts/install/quick-start-wizard.js +295 -0
- package/scripts/install/redis-cli.js +289 -0
- package/scripts/install/redis-install-guides.md +407 -0
- package/scripts/install/redis-setup.js +559 -0
- package/scripts/install/redis-test.js +278 -0
- package/scripts/install/service-manager.js +672 -0
- package/scripts/install/setup.js +832 -0
- package/scripts/install/uninstall.js +526 -0
- package/scripts/install/update.js +461 -0
- package/scripts/install-pre-commit-hook.sh +127 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/memory-monitor-coordinator.js +322 -0
- package/scripts/migrate-to-sdk.sh +520 -0
- package/scripts/migration/QUICK-START.md +189 -0
- package/scripts/migration/QUICK-START.md.backup-1760135091363 +189 -0
- package/scripts/migration/README.md +464 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md +500 -0
- package/scripts/migration/TASK-1.3.2-COMPLETION-REPORT.md.backup-1760135091348 +500 -0
- package/scripts/migration/UPDATE-PATHS-README.md +464 -0
- package/scripts/migration/UPDATE-PATHS-README.md.backup-1760135091337 +464 -0
- package/scripts/migration/example-patterns.json +19 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/migration/reorganize-workspace.js +504 -0
- package/scripts/migration/test-update-paths.js +359 -0
- package/scripts/migration/update-paths.js +664 -0
- package/scripts/migration/validate-migration.js +647 -0
- package/scripts/monitor-loop.sh +65 -0
- package/scripts/monitor-memory.sh +47 -0
- package/scripts/monitor-migration.js +339 -0
- package/scripts/monitor.py +43 -0
- package/scripts/monitoring/README.md +178 -0
- package/scripts/monitoring/alert-monitor.sh +220 -0
- package/scripts/monitoring/analyze-resources.sh +199 -0
- package/scripts/monitoring/dashboards/rate-limiting-dashboard.json +211 -0
- package/scripts/monitoring/dynamic-monitor.sh +85 -0
- package/scripts/monitoring/launch-stability-test.sh +184 -0
- package/scripts/monitoring/monitor-test.sh +93 -0
- package/scripts/monitoring/pre-test-validation.sh +208 -0
- package/scripts/monitoring/quick-test-alerting.sh +118 -0
- package/scripts/monitoring/quick-test-rate-limiting.sh +206 -0
- package/scripts/monitoring/rate-limiting-monitor.sh +380 -0
- package/scripts/monitoring/resource-monitor.sh +126 -0
- package/scripts/monitoring/stability-monitor.js +429 -0
- package/scripts/monitoring/test-monitor-quick.sh +54 -0
- package/scripts/monitoring/view-alerts.sh +307 -0
- package/scripts/npm-metrics-collector.js +482 -0
- package/scripts/npm-package-validation.cjs +299 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/optimize-package-swarm.js +54 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-monitor.js +644 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/post-deployment-monitoring.js +350 -0
- package/scripts/post-edit-pipeline.js +2091 -0
- package/scripts/post-install-claude-md.js +78 -0
- package/scripts/postinstall.js +79 -0
- package/scripts/pre-publish-validation.cjs +212 -0
- package/scripts/pre-publish-validation.js +429 -0
- package/scripts/redis-lua/cleanup-blocking-coordination.lua +198 -0
- package/scripts/release-announcement.js +425 -0
- package/scripts/release-notification.js +248 -0
- package/scripts/release-rollback.js +376 -0
- package/scripts/release-validation.js +460 -0
- package/scripts/rollback-sdk.sh +66 -0
- package/scripts/run-production-validation.ts +590 -0
- package/scripts/run-stability-validation.sh +687 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/deployment-validation.cjs +279 -0
- package/scripts/security/envelope-encryption-confidence-report.cjs +422 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/install-git-secrets.sh +295 -0
- package/scripts/security/rotate-api-keys.js +469 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/security/security-audit.cjs +538 -0
- package/scripts/security/setup-redis-auth.sh +397 -0
- package/scripts/security/validate-envelope-encryption.cjs +340 -0
- package/scripts/security-scan.js +492 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/agent-metrics.json +1 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/performance.json +9 -0
- package/scripts/src/web/frontend/.claude-flow/metrics/task-metrics.json +10 -0
- package/scripts/switch-api.sh +158 -0
- package/scripts/sync-agents.js +290 -0
- package/scripts/test/50-agent-test.js +625 -0
- package/scripts/test/NEW_STABILITY_TEST_GUIDE.md +407 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/STABILITY_TEST_EXAMPLE.md +347 -0
- package/scripts/test/STABILITY_TEST_README.md +480 -0
- package/scripts/test/agent-worker.js +309 -0
- package/scripts/test/ai-coordination-test.js +650 -0
- package/scripts/test/ai-mesh-coordination-test.js +416 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/cli-agent-coordination-test.js +313 -0
- package/scripts/test/coordinator-multilingual-test.js +396 -0
- package/scripts/test/coordinator-transparency-demo.js +585 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/mesh-coordination-zero-overlap-test.js +740 -0
- package/scripts/test/multilingual-hello-world-test.js +390 -0
- package/scripts/test/quick-multilingual-demo.js +464 -0
- package/scripts/test/real-agent-test.js +312 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/run-stability-test-examples.sh +292 -0
- package/scripts/test/stability-results/stability-metrics.jsonl +83 -0
- package/scripts/test/stability-results/stability-test-report.json +128 -0
- package/scripts/test/stability-results/stability-test.log +1827 -0
- package/scripts/test/stability-test-50-agents.js +734 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/test-cleanup-performance.sh +416 -0
- package/scripts/test-dashboard-auth.cjs +203 -0
- package/scripts/test-docker-deployment.sh +207 -0
- package/scripts/test-npm-package.cjs +167 -0
- package/scripts/test-provider-routing.cjs +226 -0
- package/scripts/test-routing-telemetry.cjs +147 -0
- package/scripts/test-runner.cjs +154 -0
- package/scripts/test-zai-10k.cjs +81 -0
- package/scripts/test-zai-api.cjs +191 -0
- package/scripts/test-zai-diagnostic.cjs +151 -0
- package/scripts/test-zai-final.cjs +128 -0
- package/scripts/test-zai-with-env.cjs +85 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/validate-agent-hooks.js +506 -0
- package/scripts/validate-changelog.js +241 -0
- package/scripts/validate-coordination-cli.js +69 -0
- package/scripts/validate-coordination-toggle-integration.cjs +501 -0
- package/scripts/validate-docker-infrastructure.sh +502 -0
- package/scripts/validate-entry-points.js +300 -0
- package/scripts/validate-stage3-performance.ts +377 -0
- package/scripts/validate-template-bundling.js +180 -0
- package/scripts/validation/README.md +33 -0
- package/scripts/validation/acl-security-validation.cjs +214 -0
- package/scripts/validation/acl-security-validation.js +402 -0
- package/scripts/validation/byzantine-verification.js +407 -0
- package/scripts/validation/final-phase-2-consensus.cjs +219 -0
- package/scripts/validation/final-security-validation.js +791 -0
- package/scripts/validation/final-wasm-validation.cjs +840 -0
- package/scripts/validation/integration-test-analysis.js +105 -0
- package/scripts/validation/phase-0-comprehensive-validation.js +474 -0
- package/scripts/validation/phase-0-consensus-report.js +139 -0
- package/scripts/validation/phase-0-final-report.js +112 -0
- package/scripts/validation/phase-0-redis-consensus-report.js +129 -0
- package/scripts/validation/phase-0-validation-improved.js +490 -0
- package/scripts/validation/phase-0-validation-test.js +65 -0
- package/scripts/validation/phase-1-consensus-report.cjs +342 -0
- package/scripts/validation/phase-1-consensus-validation.cjs +551 -0
- package/scripts/validation/phase-1-consensus-validation.js +551 -0
- package/scripts/validation/phase-2-consensus-report.cjs +186 -0
- package/scripts/validation/phase-2-validation.cjs +171 -0
- package/scripts/validation/phase-2-validation.js +171 -0
- package/scripts/validation/phase-4-consensus-report.js +181 -0
- package/scripts/validation/phase-4-final-validation.js +351 -0
- package/scripts/validation/phase-5-consensus-report.cjs +113 -0
- package/scripts/validation/phase-5-consensus-report.js +113 -0
- package/scripts/validation/security-analysis.js +49 -0
- package/scripts/validation/security-validation.js +492 -0
- package/scripts/validation/simple-security-validation.js +464 -0
- package/scripts/verify-installation.js +112 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/scripts/verify-sdk-phase1.cjs +293 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Security Scan Script
|
|
5
|
+
* Scans codebase for security vulnerabilities and hardcoded secrets
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
const rootDir = path.join(__dirname, '..');
|
|
16
|
+
|
|
17
|
+
class SecurityScanner {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.issues = [];
|
|
20
|
+
this.warnings = [];
|
|
21
|
+
this.sensitivePatterns = [
|
|
22
|
+
// API Keys and Tokens
|
|
23
|
+
{
|
|
24
|
+
name: 'API Key',
|
|
25
|
+
pattern: /api[_-]?key\s*[:=]\s*['"]([a-zA-Z0-9]{20,})['"]/gi,
|
|
26
|
+
severity: 'high'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'Secret Token',
|
|
30
|
+
pattern: /secret[_-]?token\s*[:=]\s*['"]([a-zA-Z0-9]{20,})['"]/gi,
|
|
31
|
+
severity: 'high'
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Access Token',
|
|
35
|
+
pattern: /access[_-]?token\s*[:=]\s*['"]([a-zA-Z0-9]{20,})['"]/gi,
|
|
36
|
+
severity: 'high'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'JWT Secret',
|
|
40
|
+
pattern: /jwt[_-]?secret\s*[:=]\s*['"]([a-zA-Z0-9+/]{32,})['"]/gi,
|
|
41
|
+
severity: 'high'
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
// Passwords
|
|
45
|
+
{
|
|
46
|
+
name: 'Password',
|
|
47
|
+
pattern: /password\s*[:=]\s*['"]([^'"]{8,})['"]/gi,
|
|
48
|
+
severity: 'critical'
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Database Password',
|
|
52
|
+
pattern: /(db|database)[_-]?password\s*[:=]\s*['"]([^'"]+)['"]/gi,
|
|
53
|
+
severity: 'critical'
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// Private Keys and Certificates
|
|
57
|
+
{
|
|
58
|
+
name: 'Private Key',
|
|
59
|
+
pattern: /-----BEGIN (RSA )?PRIVATE KEY-----/g,
|
|
60
|
+
severity: 'critical'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'Certificate',
|
|
64
|
+
pattern: /-----BEGIN CERTIFICATE-----/g,
|
|
65
|
+
severity: 'medium'
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
// URLs and Endpoints
|
|
69
|
+
{
|
|
70
|
+
name: 'Internal URL',
|
|
71
|
+
pattern: /https?:\/\/(localhost|127\.0\.0\.1|0\.0\.0\.0|192\.168\.|10\.|172\.1[6-9]\.|172\.2[0-9]\.|172\.3[0-1]\.)/gi,
|
|
72
|
+
severity: 'medium'
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
// Database Connection Strings
|
|
76
|
+
{
|
|
77
|
+
name: 'Database URL',
|
|
78
|
+
pattern: /(mongodb|mysql|postgresql|redis):\/\/[^:]+:[^@]+@/gi,
|
|
79
|
+
severity: 'high'
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// Cloud Provider Secrets
|
|
83
|
+
{
|
|
84
|
+
name: 'AWS Access Key',
|
|
85
|
+
pattern: /AKIA[0-9A-Z]{16}/g,
|
|
86
|
+
severity: 'critical'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'AWS Secret Key',
|
|
90
|
+
pattern: /aws[_-]?secret[_-]?access[_-]?key\s*[:=]\s*['"]([a-zA-Z0-9+/]{40})['"]/gi,
|
|
91
|
+
severity: 'critical'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'Google API Key',
|
|
95
|
+
pattern: /AIza[0-9A-Za-z_-]{35}/g,
|
|
96
|
+
severity: 'high'
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
this.insecurePatterns = [
|
|
101
|
+
{
|
|
102
|
+
name: 'Eval Usage',
|
|
103
|
+
pattern: /eval\s*\(/g,
|
|
104
|
+
severity: 'high',
|
|
105
|
+
recommendation: 'Avoid using eval() as it can execute arbitrary code'
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'Function Constructor',
|
|
109
|
+
pattern: /Function\s*\(/g,
|
|
110
|
+
severity: 'high',
|
|
111
|
+
recommendation: 'Avoid using Function() constructor as it can execute arbitrary code'
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'innerHTML Usage',
|
|
115
|
+
pattern: /\.innerHTML\s*=/g,
|
|
116
|
+
severity: 'medium',
|
|
117
|
+
recommendation: 'Use textContent or DOM methods instead of innerHTML to prevent XSS'
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'document.write',
|
|
121
|
+
pattern: /document\.write\s*\(/g,
|
|
122
|
+
severity: 'medium',
|
|
123
|
+
recommendation: 'Avoid document.write() as it can introduce XSS vulnerabilities'
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'Unsafe Regex',
|
|
127
|
+
pattern: /new RegExp\s*\([^)]*\+/g,
|
|
128
|
+
severity: 'medium',
|
|
129
|
+
recommendation: 'Be careful with regex patterns that could lead to ReDoS attacks'
|
|
130
|
+
}
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
this.excludedDirectories = [
|
|
134
|
+
'node_modules',
|
|
135
|
+
'.git',
|
|
136
|
+
'dist',
|
|
137
|
+
'build',
|
|
138
|
+
'coverage',
|
|
139
|
+
'.nyc_output',
|
|
140
|
+
'.claude-flow-novice/dist'
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
this.excludedFiles = [
|
|
144
|
+
'*.min.js',
|
|
145
|
+
'*.bundle.js',
|
|
146
|
+
'package-lock.json',
|
|
147
|
+
'yarn.lock'
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async scan() {
|
|
152
|
+
console.log('🔒 Starting security scan...');
|
|
153
|
+
console.log('='.repeat(50));
|
|
154
|
+
|
|
155
|
+
await this.scanFiles();
|
|
156
|
+
await this.scanDependencies();
|
|
157
|
+
await this.scanPermissions();
|
|
158
|
+
|
|
159
|
+
this.generateReport();
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async scanFiles() {
|
|
163
|
+
console.log('📁 Scanning source files...');
|
|
164
|
+
|
|
165
|
+
const files = this.getSourceFiles();
|
|
166
|
+
let scannedCount = 0;
|
|
167
|
+
|
|
168
|
+
for (const file of files) {
|
|
169
|
+
try {
|
|
170
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
171
|
+
this.scanFileContent(file, content);
|
|
172
|
+
scannedCount++;
|
|
173
|
+
} catch (error) {
|
|
174
|
+
// Skip files that can't be read
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
console.log(`✅ Scanned ${scannedCount} files`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
scanFileContent(filePath, content) {
|
|
182
|
+
const lines = content.split('\n');
|
|
183
|
+
|
|
184
|
+
// Check for sensitive information
|
|
185
|
+
this.sensitivePatterns.forEach(pattern => {
|
|
186
|
+
let match;
|
|
187
|
+
while ((match = pattern.pattern.exec(content)) !== null) {
|
|
188
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
189
|
+
const lineContent = lines[lineNumber - 1] || '';
|
|
190
|
+
|
|
191
|
+
this.issues.push({
|
|
192
|
+
type: 'sensitive_data',
|
|
193
|
+
severity: pattern.severity,
|
|
194
|
+
rule: pattern.name,
|
|
195
|
+
file: filePath,
|
|
196
|
+
line: lineNumber,
|
|
197
|
+
content: lineContent.trim(),
|
|
198
|
+
match: match[0],
|
|
199
|
+
recommendation: 'Remove hardcoded secrets and use environment variables or secure configuration'
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Check for insecure patterns
|
|
205
|
+
this.insecurePatterns.forEach(pattern => {
|
|
206
|
+
let match;
|
|
207
|
+
while ((match = pattern.pattern.exec(content)) !== null) {
|
|
208
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
209
|
+
const lineContent = lines[lineNumber - 1] || '';
|
|
210
|
+
|
|
211
|
+
this.issues.push({
|
|
212
|
+
type: 'insecure_pattern',
|
|
213
|
+
severity: pattern.severity,
|
|
214
|
+
rule: pattern.name,
|
|
215
|
+
file: filePath,
|
|
216
|
+
line: lineNumber,
|
|
217
|
+
content: lineContent.trim(),
|
|
218
|
+
match: match[0],
|
|
219
|
+
recommendation: pattern.recommendation
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async scanDependencies() {
|
|
226
|
+
console.log('📦 Scanning dependencies...');
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
// Run npm audit
|
|
230
|
+
const auditOutput = execSync('npm audit --json', {
|
|
231
|
+
encoding: 'utf8',
|
|
232
|
+
cwd: rootDir,
|
|
233
|
+
stdio: 'pipe'
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
const auditResult = JSON.parse(auditOutput);
|
|
237
|
+
const vulnerabilities = auditResult.vulnerabilities || {};
|
|
238
|
+
|
|
239
|
+
Object.values(vulnerabilities).forEach(vuln => {
|
|
240
|
+
this.issues.push({
|
|
241
|
+
type: 'dependency_vulnerability',
|
|
242
|
+
severity: this.mapNpmSeverity(vuln.severity),
|
|
243
|
+
rule: 'Dependency Vulnerability',
|
|
244
|
+
file: 'package.json',
|
|
245
|
+
package: vuln.name,
|
|
246
|
+
version: vuln.version,
|
|
247
|
+
severity: vuln.severity,
|
|
248
|
+
title: vuln.title,
|
|
249
|
+
url: vuln.url,
|
|
250
|
+
recommendation: `Update ${vuln.name} to a fixed version`
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
console.log('✅ Dependency scan completed');
|
|
255
|
+
} catch (error) {
|
|
256
|
+
this.warnings.push(`Could not run npm audit: ${error.message}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async scanPermissions() {
|
|
261
|
+
console.log('🔐 Scanning file permissions...');
|
|
262
|
+
|
|
263
|
+
const files = this.getSourceFiles();
|
|
264
|
+
let permissionIssues = 0;
|
|
265
|
+
|
|
266
|
+
for (const file of files) {
|
|
267
|
+
try {
|
|
268
|
+
const stats = fs.statSync(file);
|
|
269
|
+
const mode = stats.mode;
|
|
270
|
+
|
|
271
|
+
// Check for overly permissive file permissions
|
|
272
|
+
if ((mode & 0o777) > 0o644) {
|
|
273
|
+
this.warnings.push({
|
|
274
|
+
type: 'file_permissions',
|
|
275
|
+
severity: 'low',
|
|
276
|
+
rule: 'File Permissions',
|
|
277
|
+
file: file,
|
|
278
|
+
mode: mode.toString(8),
|
|
279
|
+
recommendation: 'Consider restricting file permissions to 644 or less'
|
|
280
|
+
});
|
|
281
|
+
permissionIssues++;
|
|
282
|
+
}
|
|
283
|
+
} catch (error) {
|
|
284
|
+
// Skip files that can't be accessed
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
console.log(`✅ Permission scan completed (${permissionIssues} issues found)`);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
getSourceFiles() {
|
|
292
|
+
const extensions = ['.js', '.ts', '.jsx', '.tsx', '.json', '.md', '.yml', '.yaml'];
|
|
293
|
+
const sourceFiles = [];
|
|
294
|
+
|
|
295
|
+
function scanDirectory(dir) {
|
|
296
|
+
try {
|
|
297
|
+
const files = fs.readdirSync(dir);
|
|
298
|
+
|
|
299
|
+
for (const file of files) {
|
|
300
|
+
const fullPath = path.join(dir, file);
|
|
301
|
+
const stat = fs.statSync(fullPath);
|
|
302
|
+
|
|
303
|
+
if (stat.isDirectory()) {
|
|
304
|
+
if (!this.excludedDirectories.includes(file) && !file.startsWith('.')) {
|
|
305
|
+
scanDirectory(fullPath);
|
|
306
|
+
}
|
|
307
|
+
} else if (stat.isFile()) {
|
|
308
|
+
const isExcluded = this.excludedFiles.some(pattern => {
|
|
309
|
+
const regex = new RegExp(pattern.replace('*', '.*'));
|
|
310
|
+
return regex.test(file);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
if (!isExcluded && extensions.some(ext => file.endsWith(ext))) {
|
|
314
|
+
sourceFiles.push(fullPath);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
} catch (error) {
|
|
319
|
+
// Skip directories that can't be accessed
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
scanDirectory.call(this, rootDir);
|
|
324
|
+
return sourceFiles;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
mapNpmSeverity(npmSeverity) {
|
|
328
|
+
const mapping = {
|
|
329
|
+
'low': 'low',
|
|
330
|
+
'moderate': 'medium',
|
|
331
|
+
'high': 'high',
|
|
332
|
+
'critical': 'critical'
|
|
333
|
+
};
|
|
334
|
+
return mapping[npmSeverity] || 'medium';
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
generateReport() {
|
|
338
|
+
console.log('\n🔒 Security Scan Report');
|
|
339
|
+
console.log('='.repeat(50));
|
|
340
|
+
|
|
341
|
+
// Count issues by severity
|
|
342
|
+
const severityCount = {
|
|
343
|
+
critical: 0,
|
|
344
|
+
high: 0,
|
|
345
|
+
medium: 0,
|
|
346
|
+
low: 0
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
this.issues.forEach(issue => {
|
|
350
|
+
severityCount[issue.severity]++;
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// Summary
|
|
354
|
+
console.log(`\n📊 Summary:`);
|
|
355
|
+
console.log(` Critical: ${severityCount.critical}`);
|
|
356
|
+
console.log(` High: ${severityCount.high}`);
|
|
357
|
+
console.log(` Medium: ${severityCount.medium}`);
|
|
358
|
+
console.log(` Low: ${severityCount.low}`);
|
|
359
|
+
console.log(` Warnings: ${this.warnings.length}`);
|
|
360
|
+
|
|
361
|
+
const totalIssues = this.issues.length;
|
|
362
|
+
const criticalOrHigh = severityCount.critical + severityCount.high;
|
|
363
|
+
|
|
364
|
+
if (criticalOrHigh > 0) {
|
|
365
|
+
console.log(`\n🚫 ${criticalOrHigh} critical/high severity issues found!`);
|
|
366
|
+
} else if (totalIssues > 0) {
|
|
367
|
+
console.log(`\n⚠️ ${totalIssues} security issues found`);
|
|
368
|
+
} else {
|
|
369
|
+
console.log('\n✅ No security issues found!');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Group issues by type
|
|
373
|
+
const issuesByType = {};
|
|
374
|
+
this.issues.forEach(issue => {
|
|
375
|
+
if (!issuesByType[issue.type]) {
|
|
376
|
+
issuesByType[issue.type] = [];
|
|
377
|
+
}
|
|
378
|
+
issuesByType[issue.type].push(issue);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// Detailed findings
|
|
382
|
+
if (totalIssues > 0) {
|
|
383
|
+
console.log('\n🔍 Detailed Findings:');
|
|
384
|
+
console.log('-'.repeat(50));
|
|
385
|
+
|
|
386
|
+
Object.entries(issuesByType).forEach(([type, issues]) => {
|
|
387
|
+
console.log(`\n${this.formatIssueType(type)} (${issues.length} issues):`);
|
|
388
|
+
|
|
389
|
+
// Show only first 5 issues of each type to avoid flooding output
|
|
390
|
+
issues.slice(0, 5).forEach(issue => {
|
|
391
|
+
const icon = this.getSeverityIcon(issue.severity);
|
|
392
|
+
console.log(` ${icon} ${issue.rule}`);
|
|
393
|
+
console.log(` File: ${issue.file}:${issue.line || 'N/A'}`);
|
|
394
|
+
console.log(` Content: ${issue.content || issue.match || issue.package}`);
|
|
395
|
+
if (issue.recommendation) {
|
|
396
|
+
console.log(` Recommendation: ${issue.recommendation}`);
|
|
397
|
+
}
|
|
398
|
+
console.log('');
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
if (issues.length > 5) {
|
|
402
|
+
console.log(` ... and ${issues.length - 5} more ${type} issues`);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Warnings
|
|
408
|
+
if (this.warnings.length > 0) {
|
|
409
|
+
console.log('\n⚠️ Warnings:');
|
|
410
|
+
this.warnings.forEach(warning => {
|
|
411
|
+
if (typeof warning === 'string') {
|
|
412
|
+
console.log(` • ${warning}`);
|
|
413
|
+
} else {
|
|
414
|
+
console.log(` • ${warning.rule}: ${warning.file}`);
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// Recommendations
|
|
420
|
+
this.generateRecommendations(severityCount);
|
|
421
|
+
|
|
422
|
+
// Exit code
|
|
423
|
+
process.exit(criticalOrHigh > 0 ? 1 : 0);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
formatIssueType(type) {
|
|
427
|
+
return type.split('_').map(word =>
|
|
428
|
+
word.charAt(0).toUpperCase() + word.slice(1)
|
|
429
|
+
).join(' ');
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
getSeverityIcon(severity) {
|
|
433
|
+
const icons = {
|
|
434
|
+
critical: '🚨',
|
|
435
|
+
high: '🔴',
|
|
436
|
+
medium: '🟡',
|
|
437
|
+
low: '🟢'
|
|
438
|
+
};
|
|
439
|
+
return icons[severity] || '⚪';
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
generateRecommendations(severityCount) {
|
|
443
|
+
console.log('\n💡 Recommendations:');
|
|
444
|
+
console.log('-'.repeat(50));
|
|
445
|
+
|
|
446
|
+
if (severityCount.critical > 0) {
|
|
447
|
+
console.log('🚨 CRITICAL: Address immediately');
|
|
448
|
+
console.log(' • Remove all hardcoded secrets and keys');
|
|
449
|
+
console.log(' • Use environment variables or secret management');
|
|
450
|
+
console.log(' • Update vulnerable dependencies');
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (severityCount.high > 0) {
|
|
454
|
+
console.log('🔴 HIGH: Fix before next release');
|
|
455
|
+
console.log(' • Review and remove sensitive data');
|
|
456
|
+
console.log(' • Replace insecure coding patterns');
|
|
457
|
+
console.log(' • Audit dependency versions');
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
if (severityCount.medium > 0) {
|
|
461
|
+
console.log('🟡 MEDIUM: Address soon');
|
|
462
|
+
console.log(' • Improve secure coding practices');
|
|
463
|
+
console.log(' • Add input validation and sanitization');
|
|
464
|
+
console.log(' • Review file permissions');
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (severityCount.low > 0) {
|
|
468
|
+
console.log('🟢 LOW: Good to fix');
|
|
469
|
+
console.log(' • Follow security best practices');
|
|
470
|
+
console.log(' • Add security testing to CI pipeline');
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
if (this.issues.length === 0) {
|
|
474
|
+
console.log('✅ Great job! Continue following security best practices:');
|
|
475
|
+
console.log(' • Regularly update dependencies');
|
|
476
|
+
console.log(' • Use environment variables for secrets');
|
|
477
|
+
console.log(' • Implement security testing in CI/CD');
|
|
478
|
+
console.log(' • Regular security audits');
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// CLI Interface
|
|
484
|
+
async function main() {
|
|
485
|
+
const scanner = new SecurityScanner();
|
|
486
|
+
await scanner.scan();
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
main().catch(error => {
|
|
490
|
+
console.error('❌ Security scan failed:', error);
|
|
491
|
+
process.exit(1);
|
|
492
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Claude API Switcher - Switch between Claude Max and z.ai
|
|
3
|
+
# Usage: scripts/switch-api.sh [zai|max|status|save|restore|list]
|
|
4
|
+
|
|
5
|
+
SETTINGS_FILE="$HOME/.claude/settings.json"
|
|
6
|
+
BACKUP_DIR="$HOME/.claude-api-configs"
|
|
7
|
+
|
|
8
|
+
# Create backup directory if it doesn't exist
|
|
9
|
+
mkdir -p "$BACKUP_DIR"
|
|
10
|
+
|
|
11
|
+
# Function to display current API
|
|
12
|
+
show_current() {
|
|
13
|
+
if grep -q "ANTHROPIC_BASE_URL" "$SETTINGS_FILE" 2>/dev/null; then
|
|
14
|
+
BASE_URL=$(grep "ANTHROPIC_BASE_URL" "$SETTINGS_FILE" | cut -d'"' -f4)
|
|
15
|
+
if [[ "$BASE_URL" == *"z.ai"* ]]; then
|
|
16
|
+
echo "✓ Current API: z.ai (GLM-4.6 models)"
|
|
17
|
+
else
|
|
18
|
+
echo "✓ Current API: $BASE_URL"
|
|
19
|
+
fi
|
|
20
|
+
else
|
|
21
|
+
echo "✓ Current API: Claude Max (api.anthropic.com)"
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Function to save current config
|
|
26
|
+
save_current() {
|
|
27
|
+
local name=$1
|
|
28
|
+
cp "$SETTINGS_FILE" "$BACKUP_DIR/settings-$name.json"
|
|
29
|
+
echo "✓ Saved current settings as '$name'"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Function to switch to z.ai
|
|
33
|
+
switch_to_zai() {
|
|
34
|
+
cat > "$SETTINGS_FILE" << 'SETTINGS'
|
|
35
|
+
{
|
|
36
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
37
|
+
"model": "sonnet",
|
|
38
|
+
"feedbackSurveyState": {
|
|
39
|
+
"lastShownTime": 1754086518944
|
|
40
|
+
},
|
|
41
|
+
"terminal": {
|
|
42
|
+
"disableRawMode": true
|
|
43
|
+
},
|
|
44
|
+
"env": {
|
|
45
|
+
"ANTHROPIC_BASE_URL": "https://api.z.ai/api/anthropic",
|
|
46
|
+
"ANTHROPIC_AUTH_TOKEN": "cca13d09dcd6407183efe9e24c804cca.QO8R0JxF4fucsoWL",
|
|
47
|
+
"ANTHROPIC_DEFAULT_OPUS_MODEL": "GLM-4.6",
|
|
48
|
+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "GLM-4.6",
|
|
49
|
+
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "GLM-4.5-Air"
|
|
50
|
+
},
|
|
51
|
+
"hybridRouting": {
|
|
52
|
+
"enabled": false,
|
|
53
|
+
"mode": "pure-provider"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
SETTINGS
|
|
57
|
+
echo "✓ Switched to z.ai API"
|
|
58
|
+
echo " Using GLM-4.6 (Sonnet), GLM-4.5-Air (Haiku)"
|
|
59
|
+
echo ""
|
|
60
|
+
echo " Pure Provider Mode (All z.ai)"
|
|
61
|
+
echo " • All sessions use z.ai ($0.10-2/1M)"
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Function to switch to Claude Max
|
|
65
|
+
switch_to_claude_max() {
|
|
66
|
+
cat > "$SETTINGS_FILE" << 'SETTINGS'
|
|
67
|
+
{
|
|
68
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
69
|
+
"model": "sonnet",
|
|
70
|
+
"feedbackSurveyState": {
|
|
71
|
+
"lastShownTime": 1754086518944
|
|
72
|
+
},
|
|
73
|
+
"terminal": {
|
|
74
|
+
"disableRawMode": true
|
|
75
|
+
},
|
|
76
|
+
"hybridRouting": {
|
|
77
|
+
"enabled": true,
|
|
78
|
+
"mode": "cli-hybrid",
|
|
79
|
+
"coordinator": "claude-max",
|
|
80
|
+
"workers": "zai"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
SETTINGS
|
|
84
|
+
echo "✓ Switched to Claude Max (Official Anthropic API)"
|
|
85
|
+
echo " Run 'claude login' if authentication is needed"
|
|
86
|
+
echo ""
|
|
87
|
+
echo "🔀 Hybrid Routing ENABLED (CLI-based)"
|
|
88
|
+
echo " • Main chat: Claude Max subscription ($0)"
|
|
89
|
+
echo " • Coordinators: Claude Max via Task tool ($0)"
|
|
90
|
+
echo " • Workers: Z.ai via CLI spawning ($0.10-2/1M)"
|
|
91
|
+
echo " • Expected savings: 97% on worker costs"
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# Main menu
|
|
95
|
+
case "$1" in
|
|
96
|
+
status|current|"")
|
|
97
|
+
show_current
|
|
98
|
+
;;
|
|
99
|
+
zai|z.ai)
|
|
100
|
+
echo "Switching to z.ai..."
|
|
101
|
+
switch_to_zai
|
|
102
|
+
show_current
|
|
103
|
+
;;
|
|
104
|
+
max|claude|official|anthropic)
|
|
105
|
+
echo "Switching to Claude Max..."
|
|
106
|
+
switch_to_claude_max
|
|
107
|
+
show_current
|
|
108
|
+
;;
|
|
109
|
+
save)
|
|
110
|
+
if [ -z "$2" ]; then
|
|
111
|
+
echo "Usage: $0 save <config-name>"
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
save_current "$2"
|
|
115
|
+
;;
|
|
116
|
+
restore)
|
|
117
|
+
if [ -z "$2" ]; then
|
|
118
|
+
echo "Available configs:"
|
|
119
|
+
ls -1 "$BACKUP_DIR" 2>/dev/null | sed 's/settings-//g' | sed 's/.json//g' | sed 's/^/ • /'
|
|
120
|
+
exit 1
|
|
121
|
+
fi
|
|
122
|
+
if [ -f "$BACKUP_DIR/settings-$2.json" ]; then
|
|
123
|
+
cp "$BACKUP_DIR/settings-$2.json" "$SETTINGS_FILE"
|
|
124
|
+
echo "✓ Restored config '$2'"
|
|
125
|
+
show_current
|
|
126
|
+
else
|
|
127
|
+
echo "✗ Config '$2' not found"
|
|
128
|
+
exit 1
|
|
129
|
+
fi
|
|
130
|
+
;;
|
|
131
|
+
list)
|
|
132
|
+
echo "Saved configurations:"
|
|
133
|
+
if ls "$BACKUP_DIR"/settings-*.json 1> /dev/null 2>&1; then
|
|
134
|
+
ls -1 "$BACKUP_DIR" 2>/dev/null | sed 's/settings-//g' | sed 's/.json//g' | sed 's/^/ • /'
|
|
135
|
+
else
|
|
136
|
+
echo " (none)"
|
|
137
|
+
fi
|
|
138
|
+
;;
|
|
139
|
+
help|--help|-h)
|
|
140
|
+
echo "Claude API Switcher"
|
|
141
|
+
echo ""
|
|
142
|
+
echo "Usage: $0 [command] [args]"
|
|
143
|
+
echo ""
|
|
144
|
+
echo "Commands:"
|
|
145
|
+
echo " status Show current API configuration"
|
|
146
|
+
echo " zai Switch to z.ai API (GLM models)"
|
|
147
|
+
echo " max Switch to Claude Max (Official API)"
|
|
148
|
+
echo " save <name> Save current config with a name"
|
|
149
|
+
echo " restore <name> Restore a saved config"
|
|
150
|
+
echo " list List all saved configurations"
|
|
151
|
+
echo ""
|
|
152
|
+
;;
|
|
153
|
+
*)
|
|
154
|
+
echo "Unknown command: $1"
|
|
155
|
+
echo "Run '$0 help' for usage"
|
|
156
|
+
exit 1
|
|
157
|
+
;;
|
|
158
|
+
esac
|