@phenixstar/talon 1.0.2 → 1.1.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/.env.example +12 -4
- package/README.md +28 -0
- package/bin/talon.js +9 -1
- package/configs/model-routing.yaml +75 -4
- package/dist/cli/doctor.js +47 -27
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/repo-commands.d.ts +2 -0
- package/dist/cli/repo-commands.d.ts.map +1 -0
- package/dist/cli/repo-commands.js +151 -0
- package/dist/cli/repo-commands.js.map +1 -0
- package/dist/cli/setup-renderer.d.ts +1 -1
- package/dist/cli/setup-renderer.d.ts.map +1 -1
- package/dist/cli/setup-renderer.js +3 -3
- package/dist/cli/setup-renderer.js.map +1 -1
- package/dist/cli/setup.js +94 -13
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/talon-home.d.ts +47 -0
- package/dist/cli/talon-home.d.ts.map +1 -0
- package/dist/cli/talon-home.js +167 -0
- package/dist/cli/talon-home.js.map +1 -0
- package/docker-compose.yml +21 -6
- package/package.json +6 -1
- package/talon +93 -13
package/.env.example
CHANGED
|
@@ -13,7 +13,14 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|
|
13
13
|
# CLAUDE_CODE_OAUTH_TOKEN=your-oauth-token-here
|
|
14
14
|
|
|
15
15
|
# =============================================================================
|
|
16
|
-
# OPTION 2:
|
|
16
|
+
# OPTION 2: Custom Base URL (compatible proxies, gateways, etc.)
|
|
17
|
+
# =============================================================================
|
|
18
|
+
# Point the SDK at an alternative Anthropic-compatible endpoint.
|
|
19
|
+
# ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|
20
|
+
# ANTHROPIC_AUTH_TOKEN=your-auth-token # Auth token for the custom endpoint
|
|
21
|
+
|
|
22
|
+
# =============================================================================
|
|
23
|
+
# OPTION 3: Router Mode (use alternative providers)
|
|
17
24
|
# =============================================================================
|
|
18
25
|
# Enable router mode by running: ./talon start ... ROUTER=true
|
|
19
26
|
# Then configure ONE of the providers below:
|
|
@@ -27,15 +34,16 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|
|
27
34
|
# ROUTER_DEFAULT=openrouter,google/gemini-3-flash-preview
|
|
28
35
|
|
|
29
36
|
# =============================================================================
|
|
30
|
-
# Model Tier Overrides (Anthropic API / OAuth / Bedrock)
|
|
37
|
+
# Model Tier Overrides (Anthropic API / OAuth / Custom Base URL / Bedrock)
|
|
31
38
|
# =============================================================================
|
|
32
39
|
# Override which model is used for each tier. Defaults are used if not set.
|
|
40
|
+
# Optional for direct Anthropic and custom base URL modes. Required for Bedrock/Vertex.
|
|
33
41
|
# ANTHROPIC_SMALL_MODEL=... # Small tier (default: claude-haiku-4-5-20251001)
|
|
34
42
|
# ANTHROPIC_MEDIUM_MODEL=... # Medium tier (default: claude-sonnet-4-6)
|
|
35
43
|
# ANTHROPIC_LARGE_MODEL=... # Large tier (default: claude-opus-4-6)
|
|
36
44
|
|
|
37
45
|
# =============================================================================
|
|
38
|
-
# OPTION
|
|
46
|
+
# OPTION 4: AWS Bedrock
|
|
39
47
|
# =============================================================================
|
|
40
48
|
# https://aws.amazon.com/blogs/machine-learning/accelerate-ai-development-with-amazon-bedrock-api-keys/
|
|
41
49
|
# Requires the model tier overrides above to be set with Bedrock-specific model IDs.
|
|
@@ -49,7 +57,7 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|
|
49
57
|
# AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
|
50
58
|
|
|
51
59
|
# =============================================================================
|
|
52
|
-
# OPTION
|
|
60
|
+
# OPTION 5: Google Vertex AI
|
|
53
61
|
# =============================================================================
|
|
54
62
|
# https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models
|
|
55
63
|
# Requires a GCP service account with roles/aiplatform.user.
|
package/README.md
CHANGED
|
@@ -123,6 +123,7 @@ Talon Pro supports a self-hosted runner model (similar to GitHub Actions self-ho
|
|
|
123
123
|
- [Configuration (Optional)](#configuration-optional)
|
|
124
124
|
- [AWS Bedrock](#aws-bedrock)
|
|
125
125
|
- [Google Vertex AI](#google-vertex-ai)
|
|
126
|
+
- [Custom Base URL](#custom-base-url)
|
|
126
127
|
- [[EXPERIMENTAL - UNSUPPORTED] Router Mode (Alternative Providers)](#experimental---unsupported-router-mode-alternative-providers)
|
|
127
128
|
- [Output and Results](#output-and-results)
|
|
128
129
|
- [Sample Reports](#-sample-reports)
|
|
@@ -451,6 +452,33 @@ ANTHROPIC_LARGE_MODEL=claude-opus-4-6
|
|
|
451
452
|
|
|
452
453
|
Set `CLOUD_ML_REGION=global` for global endpoints, or a specific region like `us-east5`. Some models may not be available on global endpoints — see the [Vertex AI Model Garden](https://console.cloud.google.com/vertex-ai/model-garden) for region availability.
|
|
453
454
|
|
|
455
|
+
### Custom Base URL
|
|
456
|
+
|
|
457
|
+
Shannon supports pointing the SDK at any Anthropic-compatible endpoint (proxies, gateways, etc.) via `ANTHROPIC_BASE_URL`.
|
|
458
|
+
|
|
459
|
+
#### Quick Setup
|
|
460
|
+
|
|
461
|
+
1. Add your endpoint and auth token to `.env`:
|
|
462
|
+
|
|
463
|
+
```bash
|
|
464
|
+
ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|
465
|
+
ANTHROPIC_AUTH_TOKEN=your-auth-token
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
2. Optionally override model tiers (defaults are used if not set):
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
|
472
|
+
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
|
473
|
+
ANTHROPIC_LARGE_MODEL=claude-opus-4-6
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
3. Run Shannon as usual:
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
./shannon start URL=https://example.com REPO=repo-name
|
|
480
|
+
```
|
|
481
|
+
|
|
454
482
|
### [EXPERIMENTAL - UNSUPPORTED] Router Mode (Alternative Providers)
|
|
455
483
|
|
|
456
484
|
Talon can experimentally route requests through alternative AI providers using claude-code-router. This mode is not officially supported and is intended primarily for:
|
package/bin/talon.js
CHANGED
|
@@ -18,6 +18,8 @@ const [,, command, ...args] = process.argv;
|
|
|
18
18
|
const COMMANDS = {
|
|
19
19
|
setup: 'dist/cli/setup.js',
|
|
20
20
|
doctor: 'dist/cli/doctor.js',
|
|
21
|
+
repo: 'dist/cli/repo-commands.js',
|
|
22
|
+
tui: 'dist/tui/tui-entry.js',
|
|
21
23
|
help: null,
|
|
22
24
|
start: null,
|
|
23
25
|
stop: null,
|
|
@@ -34,22 +36,28 @@ Talon — AI Penetration Testing Framework
|
|
|
34
36
|
Usage:
|
|
35
37
|
talon setup Interactive setup wizard
|
|
36
38
|
talon doctor Validate configuration and dependencies
|
|
39
|
+
talon repo add <url> [name] Clone a target repo to ~/.talon/repos/
|
|
40
|
+
talon repo list List available repos
|
|
41
|
+
talon repo remove <name> Remove a repo
|
|
37
42
|
talon start URL=<url> REPO=<name> Start a pentest workflow
|
|
38
43
|
talon stop Stop all containers
|
|
39
44
|
talon stop CLEAN=true Stop + remove volumes
|
|
40
45
|
talon workspaces List all workspaces
|
|
46
|
+
talon tui <workflow-id> Real-time TUI dashboard
|
|
47
|
+
talon tui --list Show past scan history
|
|
41
48
|
talon logs ID=<workflow-id> Tail workflow logs
|
|
42
49
|
talon benchmark TARGET=<name> Run benchmark metrics
|
|
43
50
|
talon evolve GENERATIONS=<n> Run evolution generations
|
|
44
51
|
talon help Show this help
|
|
45
52
|
|
|
46
53
|
Options for 'start':
|
|
47
|
-
REPO=<name>
|
|
54
|
+
REPO=<name> Repo name (checks ./repos/ then ~/.talon/repos/)
|
|
48
55
|
CONFIG=<path> YAML config file
|
|
49
56
|
OUTPUT=<path> Output directory (default: ./audit-logs/)
|
|
50
57
|
WORKSPACE=<name> Named workspace (auto-resume)
|
|
51
58
|
PIPELINE_TESTING=true Fast testing mode
|
|
52
59
|
ROUTER=true Multi-model routing
|
|
60
|
+
TUI=true Launch TUI dashboard during scan
|
|
53
61
|
|
|
54
62
|
Examples:
|
|
55
63
|
talon setup
|
|
@@ -2,16 +2,29 @@
|
|
|
2
2
|
# Each pipeline phase routes to the optimal model based on task requirements.
|
|
3
3
|
#
|
|
4
4
|
# Format: primary model attempted first; fallback used on provider failure.
|
|
5
|
-
#
|
|
6
|
-
#
|
|
5
|
+
# Provider prefixes: groq:, xai:, minimax-highspeed:, minimax-max:, kimi:,
|
|
6
|
+
# z-ai:, gemini-pro:, gemini-flash:, openrouter:, ollama:, openai-compat:
|
|
7
|
+
#
|
|
8
|
+
# Provider profiles (set LLM_PROVIDER or use prefix in model name):
|
|
9
|
+
# claude — Anthropic API (default, hasAgenticLoop=true)
|
|
10
|
+
# groq — Groq LPU, ~935 tok/s (speed)
|
|
11
|
+
# minimax-highspeed — M2.7-highspeed, ~100 TPS, 2000 prompts/5h (speed)
|
|
12
|
+
# minimax-max — M2.7, 1000 prompts/5h (balanced)
|
|
13
|
+
# xai — Grok-3/Mini, 1M context (reasoning)
|
|
14
|
+
# z-ai — GLM-5 DevPack (reasoning)
|
|
15
|
+
# gemini-pro — Gemini 2.5 Pro, 1M context (reasoning)
|
|
16
|
+
# gemini-flash — Gemini 2.5 Flash, cheap + fast (cost)
|
|
17
|
+
# kimi — Moonshot 128K context (context)
|
|
18
|
+
# openrouter — 300+ models, single key (balanced)
|
|
19
|
+
# ollama — Local models, no API key (local)
|
|
7
20
|
|
|
8
21
|
routes:
|
|
9
|
-
# Pre-recon: code analysis needs deep reasoning
|
|
22
|
+
# Pre-recon: code analysis needs deep reasoning → strongest models
|
|
10
23
|
pre-recon:
|
|
11
24
|
primary: claude-opus-4-6
|
|
12
25
|
fallback: claude-sonnet-4-6
|
|
13
26
|
|
|
14
|
-
# Recon: tool-heavy scanning,
|
|
27
|
+
# Recon: tool-heavy scanning, speed matters → fast inference
|
|
15
28
|
recon:
|
|
16
29
|
primary: claude-sonnet-4-6
|
|
17
30
|
fallback: claude-haiku-4-5-20251001
|
|
@@ -31,6 +44,64 @@ routes:
|
|
|
31
44
|
primary: claude-sonnet-4-6
|
|
32
45
|
fallback: claude-haiku-4-5-20251001
|
|
33
46
|
|
|
47
|
+
# === Alternative routing profiles ===
|
|
48
|
+
# Uncomment ONE block below to override the default Claude-only routing.
|
|
49
|
+
# Each profile uses the right provider for each phase's requirements.
|
|
50
|
+
|
|
51
|
+
# --- Cost-optimized (use subscriptions first, Claude as fallback) ---
|
|
52
|
+
#routes:
|
|
53
|
+
# pre-recon:
|
|
54
|
+
# primary: "gemini-pro:gemini-2.5-pro" # 1M context, deep reasoning
|
|
55
|
+
# fallback: claude-sonnet-4-6
|
|
56
|
+
# recon:
|
|
57
|
+
# primary: "groq:qwen-qwq-32b" # Fastest inference for scanning
|
|
58
|
+
# fallback: "minimax-highspeed:MiniMax-M2.7-highspeed"
|
|
59
|
+
# vulnerability-analysis:
|
|
60
|
+
# primary: "xai:grok-3" # 1M context for large codebases
|
|
61
|
+
# fallback: "z-ai:GLM-5"
|
|
62
|
+
# exploitation:
|
|
63
|
+
# primary: claude-opus-4-6 # Best reasoning for exploits
|
|
64
|
+
# fallback: "xai:grok-3"
|
|
65
|
+
# reporting:
|
|
66
|
+
# primary: "gemini-flash:gemini-2.5-flash" # Cheapest for structured output
|
|
67
|
+
# fallback: "minimax-max:MiniMax-M2.7"
|
|
68
|
+
|
|
69
|
+
# --- Speed-optimized (fastest possible pipeline) ---
|
|
70
|
+
#routes:
|
|
71
|
+
# pre-recon:
|
|
72
|
+
# primary: "groq:qwen-qwq-32b" # 935 tok/s
|
|
73
|
+
# fallback: "minimax-highspeed:MiniMax-M2.7-highspeed"
|
|
74
|
+
# recon:
|
|
75
|
+
# primary: "groq:qwen-qwq-32b"
|
|
76
|
+
# fallback: "minimax-highspeed:MiniMax-M2.7-highspeed"
|
|
77
|
+
# vulnerability-analysis:
|
|
78
|
+
# primary: "minimax-highspeed:MiniMax-M2.7-highspeed" # 100 TPS sustained
|
|
79
|
+
# fallback: "groq:llama-4-maverick"
|
|
80
|
+
# exploitation:
|
|
81
|
+
# primary: "groq:qwen-qwq-32b"
|
|
82
|
+
# fallback: claude-sonnet-4-6
|
|
83
|
+
# reporting:
|
|
84
|
+
# primary: "minimax-highspeed:MiniMax-M2.7-highspeed"
|
|
85
|
+
# fallback: "gemini-flash:gemini-2.5-flash"
|
|
86
|
+
|
|
87
|
+
# --- Zero-cost local (Ollama only) ---
|
|
88
|
+
#routes:
|
|
89
|
+
# pre-recon:
|
|
90
|
+
# primary: "ollama:qwen2.5:32b"
|
|
91
|
+
# fallback: "ollama:llama3.2:8b"
|
|
92
|
+
# recon:
|
|
93
|
+
# primary: "ollama:qwen2.5:32b"
|
|
94
|
+
# fallback: "ollama:llama3.2:8b"
|
|
95
|
+
# vulnerability-analysis:
|
|
96
|
+
# primary: "ollama:qwen2.5:32b"
|
|
97
|
+
# fallback: "ollama:llama3.2:8b"
|
|
98
|
+
# exploitation:
|
|
99
|
+
# primary: "ollama:qwen2.5:32b"
|
|
100
|
+
# fallback: "ollama:llama3.2:8b"
|
|
101
|
+
# reporting:
|
|
102
|
+
# primary: "ollama:qwen2.5:32b"
|
|
103
|
+
# fallback: "ollama:llama3.2:8b"
|
|
104
|
+
|
|
34
105
|
# Budget guard: halt execution if cumulative cost exceeds this threshold (USD)
|
|
35
106
|
spending_cap_per_run: 10.00
|
|
36
107
|
|
package/dist/cli/doctor.js
CHANGED
|
@@ -16,13 +16,17 @@ import { execSync } from 'node:child_process';
|
|
|
16
16
|
import { showBanner, showDependencyTable } from './setup-renderer.js';
|
|
17
17
|
import { readEnvFile } from './env-configurator.js';
|
|
18
18
|
import { checkAllDependencies, isDockerRunning, checkDiskSpaceGb } from './dependency-checker.js';
|
|
19
|
+
import { getTalonHome, resolveEnvPath, listRepos, commandPrefix, isProjectMode, } from './talon-home.js';
|
|
20
|
+
import { OllamaProvider } from '../ai/providers/ollama-provider.js';
|
|
19
21
|
function checkEnvFile() {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
const envPath = resolveEnvPath();
|
|
23
|
+
const cmd = commandPrefix();
|
|
24
|
+
if (!fs.existsSync(envPath)) {
|
|
25
|
+
return { name: '.env file', ok: false, message: `Not found — run ${cmd} setup` };
|
|
22
26
|
}
|
|
23
|
-
const env = readEnvFile(
|
|
27
|
+
const env = readEnvFile(envPath);
|
|
24
28
|
if (env.size === 0) {
|
|
25
|
-
return { name: '.env file', ok: false, message:
|
|
29
|
+
return { name: '.env file', ok: false, message: `Empty — run ${cmd} setup` };
|
|
26
30
|
}
|
|
27
31
|
const hasAuth = env.has('ANTHROPIC_API_KEY')
|
|
28
32
|
|| env.has('CLAUDE_CODE_OAUTH_TOKEN')
|
|
@@ -30,9 +34,10 @@ function checkEnvFile() {
|
|
|
30
34
|
|| env.get('CLAUDE_CODE_USE_VERTEX') === '1'
|
|
31
35
|
|| env.get('ROUTER') === 'true';
|
|
32
36
|
if (!hasAuth) {
|
|
33
|
-
return { name: '.env file', ok: false, message:
|
|
37
|
+
return { name: '.env file', ok: false, message: `No auth credentials configured — run ${cmd} setup` };
|
|
34
38
|
}
|
|
35
|
-
|
|
39
|
+
const location = isProjectMode() ? '.env' : envPath;
|
|
40
|
+
return { name: '.env file', ok: true, message: `${env.size} variables configured (${location})` };
|
|
36
41
|
}
|
|
37
42
|
function checkDockerDaemon() {
|
|
38
43
|
if (!isDockerRunning()) {
|
|
@@ -41,6 +46,7 @@ function checkDockerDaemon() {
|
|
|
41
46
|
return { name: 'Docker daemon', ok: true, message: 'Running' };
|
|
42
47
|
}
|
|
43
48
|
function checkDockerImages() {
|
|
49
|
+
const cmd = commandPrefix();
|
|
44
50
|
try {
|
|
45
51
|
const output = execSync('docker compose images 2>/dev/null', {
|
|
46
52
|
encoding: 'utf-8',
|
|
@@ -48,34 +54,27 @@ function checkDockerImages() {
|
|
|
48
54
|
timeout: 10_000,
|
|
49
55
|
});
|
|
50
56
|
const lines = output.trim().split('\n').filter(l => l.trim().length > 0);
|
|
51
|
-
// First line is header
|
|
52
57
|
const imageCount = Math.max(0, lines.length - 1);
|
|
53
58
|
if (imageCount === 0) {
|
|
54
|
-
return { name: 'Docker images', ok: false, message:
|
|
59
|
+
return { name: 'Docker images', ok: false, message: `Not built — will build on first ${cmd} start` };
|
|
55
60
|
}
|
|
56
61
|
return { name: 'Docker images', ok: true, message: `${imageCount} images built` };
|
|
57
62
|
}
|
|
58
63
|
catch {
|
|
59
|
-
return { name: 'Docker images', ok: false, message:
|
|
64
|
+
return { name: 'Docker images', ok: false, message: `Not built — will build on first ${cmd} start` };
|
|
60
65
|
}
|
|
61
66
|
}
|
|
62
67
|
function checkReposDir() {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const entries = fs.readdirSync('repos').filter(e => {
|
|
68
|
-
const stat = fs.statSync(`repos/${e}`);
|
|
69
|
-
return stat.isDirectory();
|
|
70
|
-
});
|
|
71
|
-
if (entries.length === 0) {
|
|
72
|
-
return { name: 'repos/ directory', ok: false, message: 'Empty — clone a target repo into repos/' };
|
|
73
|
-
}
|
|
74
|
-
return { name: 'repos/ directory', ok: true, message: `${entries.length} repo(s): ${entries.join(', ')}` };
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
return { name: 'repos/ directory', ok: false, message: 'Cannot read — check permissions' };
|
|
68
|
+
const repos = listRepos();
|
|
69
|
+
if (repos.length === 0) {
|
|
70
|
+
const cmd = commandPrefix();
|
|
71
|
+
return { name: 'repos', ok: false, message: `No repos found — run ${cmd} repo add <url> or clone into repos/` };
|
|
78
72
|
}
|
|
73
|
+
const labels = repos.map(r => {
|
|
74
|
+
const tag = r.source === 'home' ? chalk.dim(' (~/.talon)') : '';
|
|
75
|
+
return `${r.name}${tag}`;
|
|
76
|
+
});
|
|
77
|
+
return { name: 'repos', ok: true, message: `${repos.length} repo(s): ${labels.join(', ')}` };
|
|
79
78
|
}
|
|
80
79
|
function checkDiskSpace() {
|
|
81
80
|
const gb = checkDiskSpaceGb();
|
|
@@ -87,7 +86,19 @@ function checkDiskSpace() {
|
|
|
87
86
|
}
|
|
88
87
|
return { name: 'Disk space', ok: true, message: `${gb}GB available` };
|
|
89
88
|
}
|
|
90
|
-
function
|
|
89
|
+
async function checkOllamaHealth() {
|
|
90
|
+
const llmProvider = process.env.LLM_PROVIDER;
|
|
91
|
+
if (llmProvider !== 'ollama')
|
|
92
|
+
return null;
|
|
93
|
+
const ollama = new OllamaProvider();
|
|
94
|
+
const healthy = await ollama.checkHealth();
|
|
95
|
+
const baseUrl = process.env.OLLAMA_BASE_URL ?? 'http://localhost:11434';
|
|
96
|
+
if (healthy) {
|
|
97
|
+
return { name: 'Ollama', ok: true, message: `Reachable at ${baseUrl}` };
|
|
98
|
+
}
|
|
99
|
+
return { name: 'Ollama', ok: false, message: `Not reachable at ${baseUrl} — is Ollama running?` };
|
|
100
|
+
}
|
|
101
|
+
async function main() {
|
|
91
102
|
showBanner();
|
|
92
103
|
console.log(chalk.bold(' Running diagnostics...\n'));
|
|
93
104
|
// 1. Dependency check
|
|
@@ -101,6 +112,10 @@ function main() {
|
|
|
101
112
|
checkReposDir(),
|
|
102
113
|
checkDiskSpace(),
|
|
103
114
|
];
|
|
115
|
+
// Conditional provider health checks
|
|
116
|
+
const ollamaCheck = await checkOllamaHealth();
|
|
117
|
+
if (ollamaCheck)
|
|
118
|
+
checks.push(ollamaCheck);
|
|
104
119
|
console.log(chalk.bold(' System Checks:\n'));
|
|
105
120
|
let hasFailure = false;
|
|
106
121
|
for (const check of checks) {
|
|
@@ -113,13 +128,18 @@ function main() {
|
|
|
113
128
|
// 3. Summary
|
|
114
129
|
const depFailures = deps.filter(d => d.required && (!d.installed || !d.versionOk));
|
|
115
130
|
const totalIssues = depFailures.length + checks.filter(c => !c.ok).length;
|
|
131
|
+
// 4. Talon home info
|
|
132
|
+
const home = getTalonHome();
|
|
133
|
+
const homeExists = fs.existsSync(home);
|
|
134
|
+
console.log(chalk.dim(`\n Talon home: ${home} ${homeExists ? '(exists)' : '(not created yet)'}`));
|
|
135
|
+
const cmd = commandPrefix();
|
|
116
136
|
console.log();
|
|
117
137
|
if (totalIssues === 0) {
|
|
118
138
|
console.log(chalk.green(' All checks passed. Ready to run:\n'));
|
|
119
|
-
console.log(chalk.cyan(
|
|
139
|
+
console.log(chalk.cyan(` ${cmd} start URL=<url> REPO=<name>\n`));
|
|
120
140
|
}
|
|
121
141
|
else {
|
|
122
|
-
console.log(chalk.yellow(` ${totalIssues} issue(s) found. Fix them and run
|
|
142
|
+
console.log(chalk.yellow(` ${totalIssues} issue(s) found. Fix them and run ${cmd} doctor again.\n`));
|
|
123
143
|
}
|
|
124
144
|
process.exit(hasFailure || depFailures.length > 0 ? 1 : 0);
|
|
125
145
|
}
|
package/dist/cli/doctor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,gDAAgD;AAEhD;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-commands.d.ts","sourceRoot":"","sources":["../../src/cli/repo-commands.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Copyright (C) 2025 PhenixStar (Alaa Qweider)
|
|
2
|
+
//
|
|
3
|
+
// This program is free software: you can redistribute it and/or modify
|
|
4
|
+
// it under the terms of the GNU Affero General Public License version 3
|
|
5
|
+
// as published by the Free Software Foundation.
|
|
6
|
+
/**
|
|
7
|
+
* Talon Repo Commands — manage target repositories in ~/.talon/repos/.
|
|
8
|
+
*
|
|
9
|
+
* Commands: add, list, remove.
|
|
10
|
+
* Invoked via `talon repo <subcommand>`.
|
|
11
|
+
*/
|
|
12
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import chalk from 'chalk';
|
|
16
|
+
import { getTalonHome, ensureHome, listRepos } from './talon-home.js';
|
|
17
|
+
function inferRepoName(url) {
|
|
18
|
+
const cleaned = url.replace(/\.git$/, '').replace(/\/$/, '');
|
|
19
|
+
const lastSegment = cleaned.split('/').pop();
|
|
20
|
+
return lastSegment || 'repo';
|
|
21
|
+
}
|
|
22
|
+
function validateName(name) {
|
|
23
|
+
if (name.includes('..') || name.includes('/') || name.includes('\\'))
|
|
24
|
+
return false;
|
|
25
|
+
if (name.startsWith('.') || name.length === 0)
|
|
26
|
+
return false;
|
|
27
|
+
return /^[a-zA-Z0-9._-]+$/.test(name);
|
|
28
|
+
}
|
|
29
|
+
function repoAdd(url, name) {
|
|
30
|
+
ensureHome();
|
|
31
|
+
const repoName = name || inferRepoName(url);
|
|
32
|
+
if (!validateName(repoName)) {
|
|
33
|
+
console.error(chalk.red(` ✗ Invalid repo name: ${repoName}`));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const reposDir = path.join(getTalonHome(), 'repos');
|
|
37
|
+
const targetPath = path.join(reposDir, repoName);
|
|
38
|
+
if (fs.existsSync(targetPath)) {
|
|
39
|
+
console.error(chalk.red(` ✗ Repo already exists: ${targetPath}`));
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Verify git is installed
|
|
43
|
+
try {
|
|
44
|
+
execSync('git --version', { stdio: 'pipe' });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.error(chalk.red(' ✗ git is not installed. Install git and try again.'));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
console.log(chalk.cyan(` Cloning ${url} → ${targetPath}\n`));
|
|
51
|
+
const result = spawnSync('git', ['clone', url, targetPath], { stdio: 'inherit' });
|
|
52
|
+
if (result.status !== 0) {
|
|
53
|
+
console.error(chalk.red('\n ✗ Clone failed.'));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Create deliverables dir for the repo
|
|
57
|
+
const delivDir = path.join(targetPath, 'deliverables');
|
|
58
|
+
if (!fs.existsSync(delivDir)) {
|
|
59
|
+
fs.mkdirSync(delivDir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
console.log(chalk.green(`\n ✓ Repo added: ${repoName}`));
|
|
62
|
+
console.log(chalk.dim(` Path: ${targetPath}`));
|
|
63
|
+
console.log(chalk.dim(` Use: talon start URL=<url> REPO=${repoName}\n`));
|
|
64
|
+
}
|
|
65
|
+
function repoList() {
|
|
66
|
+
const repos = listRepos();
|
|
67
|
+
if (repos.length === 0) {
|
|
68
|
+
console.log(chalk.yellow(' No repos found.\n'));
|
|
69
|
+
console.log(chalk.dim(' Add one with: talon repo add <git-url>\n'));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
console.log(chalk.bold('\n Repositories:\n'));
|
|
73
|
+
for (const repo of repos) {
|
|
74
|
+
const source = repo.source === 'home'
|
|
75
|
+
? chalk.dim(' (home)')
|
|
76
|
+
: chalk.dim(' (local)');
|
|
77
|
+
console.log(` ${chalk.green('•')} ${chalk.bold(repo.name)}${source}`);
|
|
78
|
+
console.log(chalk.dim(` ${repo.path}`));
|
|
79
|
+
}
|
|
80
|
+
console.log();
|
|
81
|
+
}
|
|
82
|
+
function repoRemove(name) {
|
|
83
|
+
if (!validateName(name)) {
|
|
84
|
+
console.error(chalk.red(` ✗ Invalid repo name: ${name}`));
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
const repoPath = path.join(getTalonHome(), 'repos', name);
|
|
88
|
+
if (!fs.existsSync(repoPath)) {
|
|
89
|
+
console.error(chalk.red(` ✗ Repo not found in ~/.talon/repos/: ${name}`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
// Simple confirmation via stdin
|
|
93
|
+
process.stdout.write(chalk.yellow(` Remove ${repoPath}? [y/N] `));
|
|
94
|
+
// NOTE: Using sync readline for simplicity — this is a destructive CLI command
|
|
95
|
+
const fd = fs.openSync('/dev/stdin', 'rs');
|
|
96
|
+
const buf = Buffer.alloc(256);
|
|
97
|
+
const bytesRead = fs.readSync(fd, buf, 0, 256, null);
|
|
98
|
+
fs.closeSync(fd);
|
|
99
|
+
const answer = buf.subarray(0, bytesRead).toString().trim().toLowerCase();
|
|
100
|
+
if (answer !== 'y' && answer !== 'yes') {
|
|
101
|
+
console.log(chalk.dim(' Cancelled.\n'));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
fs.rmSync(repoPath, { recursive: true, force: true });
|
|
105
|
+
console.log(chalk.green(` ✓ Removed: ${name}\n`));
|
|
106
|
+
}
|
|
107
|
+
function showHelp() {
|
|
108
|
+
console.log(`
|
|
109
|
+
Usage: talon repo <command> [args]
|
|
110
|
+
|
|
111
|
+
Commands:
|
|
112
|
+
add <url> [name] Clone a repo to ~/.talon/repos/
|
|
113
|
+
list List all available repos
|
|
114
|
+
remove <name> Remove a repo from ~/.talon/repos/
|
|
115
|
+
|
|
116
|
+
Examples:
|
|
117
|
+
talon repo add https://github.com/org/app.git
|
|
118
|
+
talon repo add https://github.com/org/app.git my-app
|
|
119
|
+
talon repo list
|
|
120
|
+
talon repo remove my-app
|
|
121
|
+
`);
|
|
122
|
+
}
|
|
123
|
+
// === CLI Entry ===
|
|
124
|
+
const [subcommand, ...args] = process.argv.slice(2);
|
|
125
|
+
switch (subcommand) {
|
|
126
|
+
case 'add': {
|
|
127
|
+
if (args.length === 0) {
|
|
128
|
+
console.error(chalk.red(' ✗ URL required: talon repo add <url> [name]'));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
repoAdd(args[0], args[1]);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
case 'list':
|
|
135
|
+
case 'ls':
|
|
136
|
+
repoList();
|
|
137
|
+
break;
|
|
138
|
+
case 'remove':
|
|
139
|
+
case 'rm': {
|
|
140
|
+
if (args.length === 0) {
|
|
141
|
+
console.error(chalk.red(' ✗ Name required: talon repo remove <name>'));
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
repoRemove(args[0]);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
default:
|
|
148
|
+
showHelp();
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=repo-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-commands.js","sourceRoot":"","sources":["../../src/cli/repo-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export interface SummaryConfig {
|
|
|
10
10
|
}>;
|
|
11
11
|
}
|
|
12
12
|
export declare function showSummary(config: SummaryConfig): void;
|
|
13
|
-
export declare function showSuccess(envPath: string): void;
|
|
13
|
+
export declare function showSuccess(envPath: string, cmd?: string): void;
|
|
14
14
|
export declare function showError(message: string): void;
|
|
15
15
|
export interface DepStatus {
|
|
16
16
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBvD;AAOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"setup-renderer.d.ts","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"AAaA,wBAAgB,UAAU,IAAI,IAAI,CAIjC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBvD;AAOD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAU,GAAG,IAAI,CAShE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAqBpE"}
|
|
@@ -36,13 +36,13 @@ function maskValue(value) {
|
|
|
36
36
|
return '••••••••';
|
|
37
37
|
return value.slice(0, 4) + '••••' + value.slice(-4);
|
|
38
38
|
}
|
|
39
|
-
export function showSuccess(envPath) {
|
|
39
|
+
export function showSuccess(envPath, cmd = 'talon') {
|
|
40
40
|
console.log();
|
|
41
41
|
console.log(chalk.green(' ✓ Configuration saved to ') + chalk.bold(envPath));
|
|
42
42
|
console.log();
|
|
43
43
|
console.log(chalk.bold(' Next steps:'));
|
|
44
|
-
console.log(chalk.dim(' 1.') + '
|
|
45
|
-
console.log(chalk.dim(' 2.') + ' Run a pentest: ' + chalk.cyan(
|
|
44
|
+
console.log(chalk.dim(' 1.') + ' Add a target repo: ' + chalk.cyan(`${cmd} repo add <url>`));
|
|
45
|
+
console.log(chalk.dim(' 2.') + ' Run a pentest: ' + chalk.cyan(`${cmd} start URL=<url> REPO=<name>`));
|
|
46
46
|
console.log(chalk.dim(' 3.') + ' Monitor progress: ' + chalk.cyan('http://localhost:8233'));
|
|
47
47
|
console.log();
|
|
48
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-renderer.js","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,gDAAgD;AAEhD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;AAChF,CAAC;AASD,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,MAAM,KAAK,GAAG;QACZ,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE;QAChD,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE;QAC/C,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;QACpC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;YAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClD,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAC3C,CAAC,CAAC;KACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAClC,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,OAAO;KACrB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IACzC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;
|
|
1
|
+
{"version":3,"file":"setup-renderer.js","sourceRoot":"","sources":["../../src/cli/setup-renderer.ts"],"names":[],"mappings":"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"}
|