@voria/cli 0.0.2 → 0.0.4
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/README.md +11 -11
- package/bin/voria +122 -31
- package/docs/ARCHITECTURE.md +17 -13
- package/docs/CHANGELOG.md +42 -16
- package/docs/CONTRIBUTING.md +4 -1
- package/docs/DESIGN_DECISIONS.md +4 -0
- package/docs/DEVELOPMENT.md +5 -1
- package/docs/EXAMPLES.md +4 -0
- package/docs/INSTALL.md +10 -7
- package/docs/IPC_PROTOCOL.md +4 -0
- package/docs/LLM_INTEGRATION.md +6 -2
- package/docs/MODULES.md +4 -0
- package/docs/PERFORMANCE.md +4 -0
- package/docs/PLUGINS.md +4 -0
- package/docs/QUICKSTART.md +5 -1
- package/docs/README.md +8 -5
- package/docs/ROADMAP.md +11 -7
- package/docs/SECURITY.md +5 -1
- package/docs/TROUBLESHOOTING.md +5 -1
- package/docs/USER_GUIDE.md +35 -0
- package/package.json +1 -1
- package/python/voria/core/llm/model_discovery.py +82 -175
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# voria
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**AI-Powered Bug Fixing Tool**
|
|
4
4
|
|
|
5
5
|
voria is a CLI tool that automatically fixes bugs and implements features in your codebase. Describe an issue or provide a GitHub issue number, and voria will generate a fix, test it, iterate on failures, and create a pull request - all automatically.
|
|
6
6
|
|
|
@@ -325,10 +325,11 @@ We welcome contributions! See [Contributing Guide](docs/CONTRIBUTING.md) for:
|
|
|
325
325
|
|
|
326
326
|
|
|
327
327
|
## Getting Help
|
|
328
|
-
|
|
329
|
-
- **[
|
|
330
|
-
- **[GitHub
|
|
331
|
-
- **[
|
|
328
|
+
|
|
329
|
+
- **[WhatsApp Support Group](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)** - Fastest support
|
|
330
|
+
- **[GitHub Discussions](https://github.com/Srizdebnath/voria/discussions)** - Ask questions
|
|
331
|
+
- **[GitHub Issues](https://github.com/Srizdebnath/voria/issues)** - Report bugs
|
|
332
|
+
- **[Troubleshooting Guide](docs/TROUBLESHOOTING.md)** - Common issues
|
|
332
333
|
|
|
333
334
|
## Roadmap
|
|
334
335
|
|
|
@@ -414,12 +415,11 @@ We welcome contributions! See [Contributing Guide](docs/CONTRIBUTING.md) for:
|
|
|
414
415
|
|
|
415
416
|
**Current Status:** All core features complete and production-ready!
|
|
416
417
|
|
|
417
|
-
**
|
|
418
|
-
- Advanced code dependency analysis
|
|
419
|
-
- Risk scoring for patches
|
|
420
|
-
-
|
|
421
|
-
-
|
|
422
|
-
- Self-hosted deployment options
|
|
418
|
+
**Now Available in v0.0.3:**
|
|
419
|
+
- ✅ Advanced code dependency analysis (`voria --graph`)
|
|
420
|
+
- ✅ Risk scoring for patches & codebase
|
|
421
|
+
- ✅ Expanded Chinese model support (Kimi, Minimax, DeepSeek)
|
|
422
|
+
- ✅ Enhanced hierarchical structural visualization
|
|
423
423
|
|
|
424
424
|
**Get involved:** [Contributing Guide](docs/CONTRIBUTING.md)
|
|
425
425
|
|
package/bin/voria
CHANGED
|
@@ -5,6 +5,7 @@ import path from 'path';
|
|
|
5
5
|
import { fileURLToPath } from 'url';
|
|
6
6
|
import { spawn } from 'child_process';
|
|
7
7
|
import readline from 'readline';
|
|
8
|
+
import { execSync } from 'child_process';
|
|
8
9
|
|
|
9
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
11
|
const __dirname = path.dirname(__filename);
|
|
@@ -13,6 +14,17 @@ const voria_HOME = path.join(process.env.HOME || process.env.USERPROFILE, '.vori
|
|
|
13
14
|
const CONFIG_FILE = path.join(voria_HOME, 'config.json');
|
|
14
15
|
const PROJECT_CONFIG = path.join(process.cwd(), '.voria.json');
|
|
15
16
|
|
|
17
|
+
const PROVIDER_MODELS = {
|
|
18
|
+
openai: ['gpt-4o', 'gpt-4o-mini', 'o1-preview', 'o1-mini'],
|
|
19
|
+
claude: ['claude-3-5-sonnet-20240620', 'claude-3-opus-20240229', 'claude-3-haiku-20240307'],
|
|
20
|
+
gemini: ['gemini-1.5-pro', 'gemini-1.5-flash', 'gemini-1.0-pro'],
|
|
21
|
+
modal: ['llama-3.1-405b', 'llama-3.1-70b', 'mixtral-8x7b'],
|
|
22
|
+
kimi: ['moonshot-v1-8k', 'moonshot-v1-32k', 'moonshot-v1-128k'],
|
|
23
|
+
minimax: ['abab6.5-chat', 'abab6-chat'],
|
|
24
|
+
deepseek: ['deepseek-chat', 'deepseek-coder'],
|
|
25
|
+
siliconflow: ['deepseek-v2.5', 'internlm2_5-20b-chat', 'qwen2.5-72b-instruct']
|
|
26
|
+
};
|
|
27
|
+
|
|
16
28
|
// ANSI escape codes for blue theme
|
|
17
29
|
const colors = {
|
|
18
30
|
blue: (text) => `\x1b[34m${text}\x1b[0m`,
|
|
@@ -31,36 +43,39 @@ if (!fs.existsSync(voria_HOME)) {
|
|
|
31
43
|
fs.mkdirSync(voria_HOME, { recursive: true });
|
|
32
44
|
}
|
|
33
45
|
|
|
34
|
-
const BANNER =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
const BANNER = `
|
|
47
|
+
${colors.blue("██╗ ██╗ ██████╗ ██████╗ ██╗ █████╗")}
|
|
48
|
+
${colors.blue("██║ ██║██╔═══██╗██╔══██╗██║██╔══██╗")}
|
|
49
|
+
${colors.blue("██║ ██║██║ ██║██████╔╝██║███████║")}
|
|
50
|
+
${colors.blue("╚██╗ ██╔╝██║ ██║██╔══██╗██║██╔══██╗")}
|
|
51
|
+
${colors.blue(" ╚████╔╝ ╚██████╔╝██║ ██║██║██║ ██║")}
|
|
52
|
+
`;
|
|
41
53
|
|
|
42
54
|
const HELP_TEXT = `
|
|
43
55
|
${BANNER}
|
|
44
|
-
${colors.
|
|
56
|
+
${colors.dim("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓")}
|
|
57
|
+
${colors.dim("┃")} ${colors.bold("AI-Powered Autonomous Fixer")} ${colors.dim("┃")}
|
|
58
|
+
${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}
|
|
45
59
|
|
|
46
60
|
${colors.bold(colors.blue("USAGE:"))}
|
|
47
61
|
voria [command] [options]
|
|
48
62
|
|
|
49
63
|
${colors.bold(colors.blue("GLOBAL COMMANDS:"))}
|
|
50
|
-
voria --init ${colors.dim("Initialize
|
|
51
|
-
voria --config ${colors.dim("Configure LLM provider and settings")}
|
|
52
|
-
voria --set-github-token ${colors.dim("Set your GitHub personal access token")}
|
|
53
|
-
voria --list-issues <repo>${colors.dim("List issues in a repository")}
|
|
54
|
-
voria --
|
|
55
|
-
voria --
|
|
64
|
+
${colors.blue("🚀")} voria --init ${colors.dim("Initialize project & choose models")}
|
|
65
|
+
${colors.blue("⚙️")} voria --config ${colors.dim("Configure LLM provider and settings")}
|
|
66
|
+
${colors.blue("🔑")} voria --set-github-token ${colors.dim("Set your GitHub personal access token")}
|
|
67
|
+
${colors.blue("📋")} voria --list-issues <repo>${colors.dim("List issues in a repository")}
|
|
68
|
+
${colors.blue("🔭")} voria --graph ${colors.dim("Show codebase dependency graph")}
|
|
69
|
+
${colors.blue("❓")} voria --help ${colors.dim("Show this help message")}
|
|
70
|
+
${colors.blue("🏷️")} voria --version ${colors.dim("Show current version")}
|
|
56
71
|
|
|
57
72
|
${colors.bold(colors.blue("PROJECT COMMANDS:"))}
|
|
58
|
-
voria
|
|
59
|
-
voria
|
|
60
|
-
voria
|
|
61
|
-
voria
|
|
62
|
-
voria logs ${colors.dim("Show recent activity logs")}
|
|
63
|
-
voria reset ${colors.dim("Reset project configuration")}
|
|
73
|
+
${colors.blue("🐞")} voria issue <repo> <num> ${colors.dim("Fix a specific GitHub issue")}
|
|
74
|
+
${colors.blue("📦")} voria apply <patch> ${colors.dim("Apply a patch file")}
|
|
75
|
+
${colors.blue("📊")} voria status ${colors.dim("Show current project status")}
|
|
76
|
+
${colors.blue("💰")} voria token info ${colors.dim("Show token usage info")}
|
|
77
|
+
${colors.blue("📝")} voria logs ${colors.dim("Show recent activity logs")}
|
|
78
|
+
${colors.blue("🔄")} voria reset ${colors.dim("Reset project configuration")}
|
|
64
79
|
|
|
65
80
|
${colors.bold(colors.blue("OPTIONS:"))}
|
|
66
81
|
--llm <provider> ${colors.dim("Use specific LLM (openai, claude, gemini, modal, kimi)")}
|
|
@@ -83,7 +98,7 @@ ${BANNER}
|
|
|
83
98
|
${colors.dim("Full documentation:")} ${colors.blue("https://github.com/Srizdebnath/voria")}
|
|
84
99
|
`;
|
|
85
100
|
|
|
86
|
-
const VERSION = '0.0.
|
|
101
|
+
const VERSION = '0.0.3';
|
|
87
102
|
|
|
88
103
|
// Load configuration
|
|
89
104
|
function loadConfig() {
|
|
@@ -116,7 +131,19 @@ function saveConfig(config, isGlobal = true) {
|
|
|
116
131
|
fs.writeFileSync(file, JSON.stringify(config, null, 2));
|
|
117
132
|
}
|
|
118
133
|
|
|
119
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Dynamically fetch models for a provider using Python backend
|
|
136
|
+
*/
|
|
137
|
+
function fetchModels(provider, apiKey) {
|
|
138
|
+
try {
|
|
139
|
+
const scriptPath = path.join(__dirname, '..', 'python', 'voria', 'core', 'llm', 'model_discovery.py');
|
|
140
|
+
const output = execSync(`python3 "${scriptPath}" "${provider}" "${apiKey}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] });
|
|
141
|
+
return JSON.parse(output);
|
|
142
|
+
} catch (e) {
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
120
147
|
// Interactive setup
|
|
121
148
|
async function runSetup() {
|
|
122
149
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -124,8 +151,9 @@ async function runSetup() {
|
|
|
124
151
|
|
|
125
152
|
try {
|
|
126
153
|
console.log(BANNER);
|
|
127
|
-
console.log(
|
|
128
|
-
console.log(
|
|
154
|
+
console.log(` ${colors.dim("┏━━")} ${colors.bold("PROJECT INITIALIZATION")} ${colors.dim("━━┓")}`);
|
|
155
|
+
console.log(` ${colors.dim("┃")} ${colors.blue("Configuring your intelligence backend")} ${colors.dim("┃")}`);
|
|
156
|
+
console.log(` ${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}\n`);
|
|
129
157
|
|
|
130
158
|
if (!fs.existsSync(path.join(process.cwd(), '.git'))) {
|
|
131
159
|
console.log(`${colors.yellow("⚠")} ${colors.bold("Warning:")} Not in a Git repository.`);
|
|
@@ -136,10 +164,14 @@ async function runSetup() {
|
|
|
136
164
|
console.log(` ${colors.blue("1)")} OpenAI (GPT-4o, GPT-4 Mini)`);
|
|
137
165
|
console.log(` ${colors.blue("2)")} Claude (Anthropic)`);
|
|
138
166
|
console.log(` ${colors.blue("3)")} Gemini (Google)`);
|
|
139
|
-
console.log(` ${colors.blue("4)")} Modal (Free Tier)
|
|
167
|
+
console.log(` ${colors.blue("4)")} Modal (Free Tier)`);
|
|
168
|
+
console.log(` ${colors.blue("5)")} Kimi (Moonshot AI)`);
|
|
169
|
+
console.log(` ${colors.blue("6)")} Minimax`);
|
|
170
|
+
console.log(` ${colors.blue("7)")} DeepSeek`);
|
|
171
|
+
console.log(` ${colors.blue("8)")} SiliconFlow\n`);
|
|
140
172
|
|
|
141
173
|
const choice = await question(`${colors.cyan("selection")} › `);
|
|
142
|
-
const providers = ['openai', 'claude', 'gemini', 'modal'];
|
|
174
|
+
const providers = ['openai', 'claude', 'gemini', 'modal', 'kimi', 'minimax', 'deepseek', 'siliconflow'];
|
|
143
175
|
const provider = providers[parseInt(choice) - 1] || 'openai';
|
|
144
176
|
|
|
145
177
|
const apiKey = await question(`${colors.cyan(provider.toUpperCase() + " API Key")} › `);
|
|
@@ -150,6 +182,18 @@ async function runSetup() {
|
|
|
150
182
|
return;
|
|
151
183
|
}
|
|
152
184
|
|
|
185
|
+
console.log(`\n${colors.dim(" Fetching latest models...")}`);
|
|
186
|
+
const fetchedModels = fetchModels(provider, apiKey);
|
|
187
|
+
const models = fetchedModels.length > 0 ? fetchedModels.map(m => m.name) : (PROVIDER_MODELS[provider] || ['gpt-4o']);
|
|
188
|
+
|
|
189
|
+
console.log(`\n${colors.bold("Select Model:")}`);
|
|
190
|
+
models.forEach((model, index) => {
|
|
191
|
+
console.log(` ${colors.blue((index + 1) + ")")} ${model}`);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
const modelChoice = await question(`\n${colors.cyan("selection")} ${colors.dim("(1)")} › `) || '1';
|
|
195
|
+
const selectedModel = models[parseInt(modelChoice) - 1] || models[0];
|
|
196
|
+
|
|
153
197
|
const budget = await question(`${colors.cyan("Daily Budget ($)")} ${colors.dim("(10.0)")} › `) || '10.0';
|
|
154
198
|
|
|
155
199
|
console.log(`\n${colors.bold("Test Framework:")}`);
|
|
@@ -163,6 +207,7 @@ async function runSetup() {
|
|
|
163
207
|
|
|
164
208
|
const config = {
|
|
165
209
|
llm_provider: provider,
|
|
210
|
+
model: selectedModel,
|
|
166
211
|
daily_budget: parseFloat(budget),
|
|
167
212
|
test_framework: framework,
|
|
168
213
|
created_at: new Date().toISOString()
|
|
@@ -191,13 +236,15 @@ async function runConfig() {
|
|
|
191
236
|
const question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
|
|
192
237
|
|
|
193
238
|
try {
|
|
194
|
-
console.log(`\n${colors.
|
|
239
|
+
console.log(`\n ${colors.dim("┏━━")} ${colors.bold("SETTINGS ENGINE")} ${colors.dim("━━┓")}`);
|
|
240
|
+
console.log(` ${colors.dim("┃")} ${colors.blue("Adjusting your local parameters")} ${colors.dim("┃")}`);
|
|
241
|
+
console.log(` ${colors.dim("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛")}\n`);
|
|
242
|
+
|
|
195
243
|
const config = loadConfig();
|
|
196
244
|
|
|
197
|
-
console.log(
|
|
198
|
-
console.log(`
|
|
199
|
-
console.log(`
|
|
200
|
-
console.log(` Framework: ${colors.cyan(config.test_framework || 'None')}\n`);
|
|
245
|
+
console.log(` ${colors.dim("Provider:")} ${colors.blue(config.llm_provider || 'None')}`);
|
|
246
|
+
console.log(` ${colors.dim("Budget:")} ${colors.green("$" + (config.daily_budget || '10.0'))}`);
|
|
247
|
+
console.log(` ${colors.dim("Framework:")} ${colors.cyan(config.test_framework || 'None')}\n`);
|
|
201
248
|
|
|
202
249
|
const change = await question(`${colors.cyan("edit")} ${colors.dim("(provider/budget/framework/none)")} › `);
|
|
203
250
|
|
|
@@ -583,6 +630,41 @@ async function callPythonEngine(command) {
|
|
|
583
630
|
});
|
|
584
631
|
}
|
|
585
632
|
|
|
633
|
+
// Helper function to call Rust core
|
|
634
|
+
async function runRustCore(args) {
|
|
635
|
+
const { spawn } = await import('child_process');
|
|
636
|
+
const pathMod = await import('path');
|
|
637
|
+
const fsMod = await import('fs');
|
|
638
|
+
|
|
639
|
+
return new Promise((resolve, reject) => {
|
|
640
|
+
// Try to find the rust binary
|
|
641
|
+
const possiblePaths = [
|
|
642
|
+
pathMod.default.join(__dirname, '..', 'target', 'release', 'voria'),
|
|
643
|
+
pathMod.default.join(__dirname, '..', 'target', 'debug', 'voria'),
|
|
644
|
+
pathMod.default.join(__dirname, '..', 'rust', 'target', 'release', 'voria'),
|
|
645
|
+
pathMod.default.join(__dirname, '..', 'rust', 'target', 'debug', 'voria'),
|
|
646
|
+
];
|
|
647
|
+
|
|
648
|
+
let rustBin = possiblePaths.find(p => fsMod.default.existsSync(p));
|
|
649
|
+
|
|
650
|
+
if (!rustBin) {
|
|
651
|
+
// Check if it's in the system path
|
|
652
|
+
try {
|
|
653
|
+
execSync('voria --version', { stdio: 'ignore' });
|
|
654
|
+
rustBin = 'voria';
|
|
655
|
+
} catch (e) {
|
|
656
|
+
return reject(new Error('Rust core binary (voria) not found. Please run "cargo build --release" in the rust directory.'));
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
const child = spawn(rustBin, args, { stdio: 'inherit' });
|
|
661
|
+
child.on('exit', (code) => {
|
|
662
|
+
if (code === 0) resolve();
|
|
663
|
+
else reject(new Error(`Rust core exited with code ${code}`));
|
|
664
|
+
});
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
|
|
586
668
|
// Main CLI router
|
|
587
669
|
async function main() {
|
|
588
670
|
const args = process.argv.slice(2);
|
|
@@ -717,6 +799,15 @@ async function main() {
|
|
|
717
799
|
break;
|
|
718
800
|
}
|
|
719
801
|
|
|
802
|
+
case '--graph':
|
|
803
|
+
try {
|
|
804
|
+
await runRustCore(['--graph']);
|
|
805
|
+
} catch (error) {
|
|
806
|
+
console.error(`${colors.red("✖")} Error running analysis: ${error.message}`);
|
|
807
|
+
console.log(`${colors.yellow("💡")} Make sure to build the rust core: ${colors.bold("cargo build --release")}`);
|
|
808
|
+
}
|
|
809
|
+
break;
|
|
810
|
+
|
|
720
811
|
default:
|
|
721
812
|
console.log(`\n❌ Unknown command: ${command}`);
|
|
722
813
|
console.log(' Run: voria --help\n');
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -6,30 +6,30 @@ voria's system design and component overview.
|
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
┌─────────────────────────────────────────────────────────────┐
|
|
9
|
-
│ voria CLI
|
|
9
|
+
│ voria CLI │
|
|
10
10
|
│ (Node.js - Entry Point) │
|
|
11
11
|
│ │
|
|
12
12
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
13
|
-
│ │ Command Dispatcher (--init, --config, issue, plan)
|
|
13
|
+
│ │ Command Dispatcher (--init, --config, issue, plan) │ │
|
|
14
14
|
│ ├────────────────────────────────────────────────────────┤ │
|
|
15
15
|
│ │ UI Layer (Premium Blue Theme, ANSI styling) │ │
|
|
16
16
|
│ ├────────────────────────────────────────────────────────┤ │
|
|
17
17
|
│ │ IPC Manager (Process orchestration, NDJSON) │ │
|
|
18
18
|
│ └────────────────────────────────────────────────────────┘ │
|
|
19
|
-
│ │
|
|
20
|
-
│ │ NDJSON (stdin/stdout)
|
|
21
|
-
│ ▼
|
|
19
|
+
│ │ │
|
|
20
|
+
│ │ NDJSON (stdin/stdout) │
|
|
21
|
+
│ ▼ │
|
|
22
22
|
└─────────────────────────────────────────────────────────────┘
|
|
23
23
|
│
|
|
24
24
|
│ Persistent Child Process
|
|
25
25
|
│
|
|
26
26
|
▼
|
|
27
27
|
┌─────────────────────────────────────────────────────────────┐
|
|
28
|
-
│ voria Engine
|
|
29
|
-
│ (Python - AI Core)
|
|
28
|
+
│ voria Engine │
|
|
29
|
+
│ (Python - AI Core) │
|
|
30
30
|
│ │
|
|
31
31
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
32
|
-
│ │ Agent Loop (Plan → Patch → Apply → Test → Iterate)
|
|
32
|
+
│ │ Agent Loop (Plan → Patch → Apply → Test → Iterate) │ │
|
|
33
33
|
│ ├────────────────────────────────────────────────────────┤ │
|
|
34
34
|
│ │ LLM Adapters (Claude, OpenAI, Gemini, Modal, Kimi) │ │
|
|
35
35
|
│ ├────────────────────────────────────────────────────────┤ │
|
|
@@ -37,16 +37,16 @@ voria's system design and component overview.
|
|
|
37
37
|
│ ├────────────────────────────────────────────────────────┤ │
|
|
38
38
|
│ │ Code Patcher & Test Executor │ │
|
|
39
39
|
│ └────────────────────────────────────────────────────────┘ │
|
|
40
|
-
│ │
|
|
41
|
-
│ │ NDJSON
|
|
42
|
-
│ ▼
|
|
40
|
+
│ │ │
|
|
41
|
+
│ │ NDJSON response |
|
|
42
|
+
│ ▼ │
|
|
43
43
|
└─────────────────────────────────────────────────────────────┘
|
|
44
44
|
│
|
|
45
45
|
│ (Optional / Planned)
|
|
46
46
|
▼
|
|
47
47
|
┌─────────────────────────────────────────────────────────────┐
|
|
48
|
-
│ voria Hub
|
|
49
|
-
│ (Rust - High Perf)
|
|
48
|
+
│ voria Hub │
|
|
49
|
+
│ (Rust - High Perf) │
|
|
50
50
|
│ │
|
|
51
51
|
│ ┌────────────────────────────────────────────────────────┐ │
|
|
52
52
|
│ │ Fast FS Operations │ │
|
|
@@ -417,3 +417,7 @@ Future capabilities can be added at these points:
|
|
|
417
417
|
- [IPC_PROTOCOL.md](IPC_PROTOCOL.md) - Detailed protocol spec
|
|
418
418
|
- [MODULES.md](MODULES.md) - Component documentation
|
|
419
419
|
- [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Design rationale
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -2,12 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to voria are documented here.
|
|
4
4
|
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/v0.0.
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/v0.0.3/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
## [v0.0.
|
|
10
|
+
## [v0.0.3] - April 12, 2026 ✅ ADVANCED ANALYSIS & CHINESE MODELS
|
|
11
|
+
|
|
12
|
+
### 🔭 Advanced Code Analysis (New)
|
|
13
|
+
- **Hierarchical Dependency Graph** via `voria --graph`
|
|
14
|
+
- **Level-by-level visualization** (Root → Level 1 → Level 2)
|
|
15
|
+
- **Risk Integrity Scoring** based on coupling and complexity
|
|
16
|
+
- **Hot Spot Detection** for complex/unstable modules
|
|
17
|
+
- **Super-fast Rust implementation** for non-LLM static analysis
|
|
18
|
+
- **Progress interaction** with estimated time remaining
|
|
19
|
+
- **Automatic filtering** of generated/hidden directories (`.next`, `dist`, `build`)
|
|
20
|
+
|
|
21
|
+
### 🤖 Expanded Model Support
|
|
22
|
+
- Support for **Kimi**, **Minimax**, **DeepSeek**, and **SiliconFlow**
|
|
23
|
+
- **Detailed model selection** wizard in `voria --init`
|
|
24
|
+
- Unified model configuration across all providers
|
|
25
|
+
|
|
26
|
+
### 🔗 Support & Community
|
|
27
|
+
- **WhatsApp Support Group:** https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t
|
|
28
|
+
- **Documentation Overhaul:** Updated all docs to v0.0.3
|
|
29
|
+
- **Enhanced Contributor Setup:** Improved local development guides
|
|
30
|
+
|
|
31
|
+
## [v0.0.3] - April 12, 2026 ✅ PRODUCTION RELEASE
|
|
11
32
|
|
|
12
33
|
### 🎉 Major Release: Feature Complete
|
|
13
34
|
|
|
@@ -75,8 +96,8 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
75
96
|
- **New CHANGELOG.md** - This file
|
|
76
97
|
|
|
77
98
|
### Distribution
|
|
78
|
-
- **Published to npm** as `@
|
|
79
|
-
- **Global CLI tool** - Install with `npm install -g @
|
|
99
|
+
- **Published to npm** as `@voria/cli@0.0.3`
|
|
100
|
+
- **Global CLI tool** - Install with `npm install -g @voria/cli`
|
|
80
101
|
- **Pre-built binaries** - No build required for end users
|
|
81
102
|
|
|
82
103
|
### Testing
|
|
@@ -97,7 +118,7 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
97
118
|
|
|
98
119
|
---
|
|
99
120
|
|
|
100
|
-
## [v0.0.
|
|
121
|
+
## [v0.0.3] - April 2026
|
|
101
122
|
|
|
102
123
|
### Phase 3: Configuration & Setup
|
|
103
124
|
- Interactive setup wizard (`voria --init`)
|
|
@@ -118,7 +139,7 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
118
139
|
|
|
119
140
|
---
|
|
120
141
|
|
|
121
|
-
## [v0.0.
|
|
142
|
+
## [v0.0.3] - April 2026
|
|
122
143
|
|
|
123
144
|
### Phase 1: Core Foundation
|
|
124
145
|
- Rust CLI base structure
|
|
@@ -145,7 +166,7 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
145
166
|
- Cost allocation
|
|
146
167
|
- Team collaboration features
|
|
147
168
|
|
|
148
|
-
### vv0.0.
|
|
169
|
+
### vv0.0.3 (Q4 2026) - Stable API
|
|
149
170
|
- Stable API guarantees
|
|
150
171
|
- VS Code extension
|
|
151
172
|
- GitHub Actions integration
|
|
@@ -158,14 +179,14 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
158
179
|
|
|
159
180
|
| Phase | Name | Status | Version |
|
|
160
181
|
|-------|------|--------|---------|
|
|
161
|
-
| 1 | Foundation | ✅ Complete | v0.0.
|
|
162
|
-
| 2 | Automation | ✅ Complete | v0.0.
|
|
163
|
-
| 3 | Setup & Config | ✅ Complete | v0.0.
|
|
164
|
-
| 4 | LLM Integration | ✅ Complete | v0.0.
|
|
165
|
-
| 5 | GitHub Integration | ✅ Complete | v0.0.
|
|
166
|
-
| 6 | Code Analysis | ✅ Complete | v0.0.
|
|
167
|
-
| 7 | Testing & Validation | ✅ Complete | v0.0.
|
|
168
|
-
| 8 | Agent Loop | ✅ Complete | v0.0.
|
|
182
|
+
| 1 | Foundation | ✅ Complete | v0.0.3 |
|
|
183
|
+
| 2 | Automation | ✅ Complete | v0.0.3 |
|
|
184
|
+
| 3 | Setup & Config | ✅ Complete | v0.0.3 |
|
|
185
|
+
| 4 | LLM Integration | ✅ Complete | v0.0.3 |
|
|
186
|
+
| 5 | GitHub Integration | ✅ Complete | v0.0.3 |
|
|
187
|
+
| 6 | Code Analysis | ✅ Complete | v0.0.3 |
|
|
188
|
+
| 7 | Testing & Validation | ✅ Complete | v0.0.3 |
|
|
189
|
+
| 8 | Agent Loop | ✅ Complete | v0.0.3 |
|
|
169
190
|
| 9 | Advanced Analysis | 📋 Planned | v0.1.0 |
|
|
170
191
|
| 10 | Enterprise | 📋 Planned | v0.2.0 |
|
|
171
192
|
|
|
@@ -184,6 +205,11 @@ All planned features through Phase 8 are now complete and production-ready.
|
|
|
184
205
|
## Links
|
|
185
206
|
|
|
186
207
|
- **GitHub:** https://github.com/Srizdebnath/voria
|
|
187
|
-
- **npm:** https://www.npmjs.com/package/@
|
|
208
|
+
- **npm:** https://www.npmjs.com/package/@voria/cli
|
|
188
209
|
- **Issues:** https://github.com/Srizdebnath/voria/issues
|
|
189
210
|
- **Discussions:** https://github.com/Srizdebnath/voria/discussions
|
|
211
|
+
- **WhatsApp Support:** https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/CONTRIBUTING.md
CHANGED
|
@@ -436,7 +436,6 @@ Every contribution - big or small - helps make voria better. Thank you for being
|
|
|
436
436
|
**Next Steps:**
|
|
437
437
|
- Read [DEVELOPMENT.md](DEVELOPMENT.md) for detailed setup
|
|
438
438
|
- Check out [good-first-issue](https://github.com/Srizdebnath/voria/labels/good-first-issue) on GitHub
|
|
439
|
-
- Join our [Discord community](https://discord.gg/voria)
|
|
440
439
|
|
|
441
440
|
---
|
|
442
441
|
|
|
@@ -445,3 +444,7 @@ Every contribution - big or small - helps make voria better. Thank you for being
|
|
|
445
444
|
- [ROADMAP.md](ROADMAP.md) - Where we're heading
|
|
446
445
|
- [PLUGINS.md](PLUGINS.md) - Plugin development guide
|
|
447
446
|
- [LLM_INTEGRATION.md](LLM_INTEGRATION.md) - Adding LLM providers
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/DESIGN_DECISIONS.md
CHANGED
|
@@ -378,3 +378,7 @@ voria/
|
|
|
378
378
|
**See Also:**
|
|
379
379
|
- [ARCHITECTURE.md](ARCHITECTURE.md) - System design
|
|
380
380
|
- [MODULES.md](MODULES.md) - Component details
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -501,7 +501,7 @@ cargo build --release
|
|
|
501
501
|
|
|
502
502
|
### "Cargo not found"
|
|
503
503
|
```bash
|
|
504
|
-
curl --proto '=https' --tlsvv0.0.
|
|
504
|
+
curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
|
|
505
505
|
source $HOME/.cargo/env
|
|
506
506
|
```
|
|
507
507
|
|
|
@@ -533,3 +533,7 @@ pytest tests/ -v -s --tb=long
|
|
|
533
533
|
---
|
|
534
534
|
|
|
535
535
|
**Need Help?** Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md) or ask in discussions.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/EXAMPLES.md
CHANGED
|
@@ -432,3 +432,7 @@ diff <(voria issue 42 --llm openai --output json) \
|
|
|
432
432
|
---
|
|
433
433
|
|
|
434
434
|
**Try these examples!** Start with simplest (Example 1) and work up to more complex ones.
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/INSTALL.md
CHANGED
|
@@ -17,7 +17,6 @@ Complete instructions for installing and using voria.
|
|
|
17
17
|
### Optional (for specific features)
|
|
18
18
|
- **pytest** - For Python test execution support
|
|
19
19
|
- **Docker** - For sandboxed test runs
|
|
20
|
-
- **GraphQL client** - For GitHub Enterprise
|
|
21
20
|
|
|
22
21
|
## Quick Install (Recommended)
|
|
23
22
|
|
|
@@ -25,10 +24,10 @@ Complete instructions for installing and using voria.
|
|
|
25
24
|
|
|
26
25
|
```bash
|
|
27
26
|
# Install globally
|
|
28
|
-
npm install -g @
|
|
27
|
+
npm install -g @voria/cli
|
|
29
28
|
|
|
30
29
|
# Verify installation
|
|
31
|
-
voria --version # Should show v0.0.
|
|
30
|
+
voria --version # Should show v0.0.3
|
|
32
31
|
|
|
33
32
|
# Initialize in your project
|
|
34
33
|
cd your-project
|
|
@@ -271,7 +270,7 @@ pytest -v
|
|
|
271
270
|
|
|
272
271
|
```bash
|
|
273
272
|
# Install Rust
|
|
274
|
-
curl --proto '=https' --tlsvv0.0.
|
|
273
|
+
curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
|
|
275
274
|
source $HOME/.cargo/env
|
|
276
275
|
```
|
|
277
276
|
|
|
@@ -326,10 +325,14 @@ cd python && pip install -e . --force-reinstall
|
|
|
326
325
|
## Need Help?
|
|
327
326
|
|
|
328
327
|
- Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
|
329
|
-
-
|
|
330
|
-
-
|
|
331
|
-
-
|
|
328
|
+
- [GitHub Repository](https://github.com/Srizdebnath/voria)
|
|
329
|
+
- [Issue Tracker](https://github.com/Srizdebnath/voria/issues)
|
|
330
|
+
- [Email Contact](mailto:srizd449@gmail.com)
|
|
332
331
|
|
|
333
332
|
---
|
|
334
333
|
|
|
335
334
|
**Installation Complete!** Continue with [QUICKSTART.md](QUICKSTART.md) 🚀
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/IPC_PROTOCOL.md
CHANGED
package/docs/LLM_INTEGRATION.md
CHANGED
|
@@ -250,7 +250,7 @@ PROVIDER_PRICING = {
|
|
|
250
250
|
"currency": "USD"
|
|
251
251
|
},
|
|
252
252
|
"openai": {
|
|
253
|
-
"input_price": 0.
|
|
253
|
+
"input_price": 0.0.35, # Per 1K tokens
|
|
254
254
|
"output_price": 0.010,
|
|
255
255
|
"currency": "USD"
|
|
256
256
|
},
|
|
@@ -266,7 +266,7 @@ PROVIDER_PRICING = {
|
|
|
266
266
|
},
|
|
267
267
|
"kimi": { # ← Add this
|
|
268
268
|
"input_price": 0.0006, # Per 1K tokens
|
|
269
|
-
"output_price": 0.
|
|
269
|
+
"output_price": 0.0.38,
|
|
270
270
|
"currency": "Yuan (CNY)"
|
|
271
271
|
},
|
|
272
272
|
}
|
|
@@ -414,3 +414,7 @@ class OllamaProvider(BaseLLMProvider):
|
|
|
414
414
|
- [MODULES.md](MODULES.md) - `llm/` module documentation
|
|
415
415
|
- [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup
|
|
416
416
|
- [PLUGINS.md](PLUGINS.md) - Plugin development (for test executors, etc)
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/MODULES.md
CHANGED
|
@@ -468,3 +468,7 @@ if test_result.passed == test_result.total:
|
|
|
468
468
|
**See Also:**
|
|
469
469
|
- [ARCHITECTURE.md](ARCHITECTURE.md) - System design
|
|
470
470
|
- [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Why these choices
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/PERFORMANCE.md
CHANGED
|
@@ -344,3 +344,7 @@ python3 -m py_compile voria/
|
|
|
344
344
|
- [SECURITY.md](SECURITY.md) - Security best practices
|
|
345
345
|
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
|
|
346
346
|
- [ARCHITECTURE.md](ARCHITECTURE.md) - System design
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/PLUGINS.md
CHANGED
|
@@ -430,3 +430,7 @@ class KotlinParser:
|
|
|
430
430
|
- [DEVELOPMENT.md](DEVELOPMENT.md) - Dev environment setup
|
|
431
431
|
- [MODULES.md](MODULES.md) - Module documentation
|
|
432
432
|
- [LLM_INTEGRATION.md](LLM_INTEGRATION.md) - Add new LLM providers
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/QUICKSTART.md
CHANGED
|
@@ -8,7 +8,7 @@ Get voria running in 5 minutes or less!
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
# Install globally from npm
|
|
11
|
-
npm install -g @
|
|
11
|
+
npm install -g @voria/cli
|
|
12
12
|
|
|
13
13
|
# Verify
|
|
14
14
|
voria --version
|
|
@@ -182,3 +182,7 @@ cd ..
|
|
|
182
182
|
---
|
|
183
183
|
|
|
184
184
|
**Ready to go deeper?** → [USER_GUIDE.md](USER_GUIDE.md) 🚀
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/README.md
CHANGED
|
@@ -116,18 +116,21 @@ LLM Providers (OpenAI, Gemini, Claude, Modal)
|
|
|
116
116
|
## External Resources
|
|
117
117
|
|
|
118
118
|
- [GitHub Repository](https://github.com/Srizdebnath/voria)
|
|
119
|
-
- [Main README](../README.md)
|
|
120
119
|
- [Issue Tracker](https://github.com/Srizdebnath/voria/issues)
|
|
121
|
-
- [
|
|
120
|
+
- [Email Contact](mailto:srizd449@gmail.com)
|
|
122
121
|
|
|
123
122
|
## Questions?
|
|
124
123
|
|
|
125
124
|
- Check [TROUBLESHOOTING.md](TROUBLESHOOTING.md) for common issues
|
|
126
125
|
- Read [EXAMPLES.md](EXAMPLES.md) for usage patterns
|
|
127
|
-
-
|
|
126
|
+
- Contact: [srizd449@gmail.com](mailto:srizd449@gmail.com)
|
|
128
127
|
- Open an issue on GitHub
|
|
129
128
|
|
|
130
129
|
---
|
|
131
130
|
|
|
132
|
-
**Last Updated:** April
|
|
133
|
-
**Documentation Version:**
|
|
131
|
+
**Last Updated:** April 12, 2026
|
|
132
|
+
**Documentation Version:** 0.0.3
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/ROADMAP.md
CHANGED
|
@@ -4,7 +4,7 @@ voria's feature roadmap and product vision.
|
|
|
4
4
|
|
|
5
5
|
## Current Status: PRODUCTION READY ✅
|
|
6
6
|
|
|
7
|
-
voria is feature-complete for its first official release (**v0.0.
|
|
7
|
+
voria is feature-complete for its first official release (**v0.0.3**). All core orchestration, LLM, and GitHub integration components are stable and distributed via npm.
|
|
8
8
|
|
|
9
9
|
**Phase 1: Core Orchestration** ✅ COMPLETE
|
|
10
10
|
- Node.js CLI entry point with premium blue theme
|
|
@@ -26,7 +26,7 @@ voria is feature-complete for its first official release (**v0.0.1**). All core
|
|
|
26
26
|
- Failure analysis and automatic refinement (up to 5 iterations)
|
|
27
27
|
- Safe patch application with rollback support
|
|
28
28
|
|
|
29
|
-
**Phase 5: First Release (v0.0.
|
|
29
|
+
**Phase 5: First Release (v0.0.3)** ✅ COMPLETE
|
|
30
30
|
- Public publication to npm as `@srizdebnath/voria`
|
|
31
31
|
- Integrated documentation and help system
|
|
32
32
|
- 100% test pass rate for CLI and Engine
|
|
@@ -164,12 +164,12 @@ Context sent to LLM: 2,000 lines # Same quality, less cost
|
|
|
164
164
|
|
|
165
165
|
| Version | Status | Release Date | Key Features |
|
|
166
166
|
|---------|--------|--------------|--------------|
|
|
167
|
-
| v0.0.
|
|
168
|
-
| v0.0.
|
|
169
|
-
| v0.0.
|
|
167
|
+
| v0.0.3 | ✅ Released | April 2026 | Basic foundation |
|
|
168
|
+
| v0.0.3 | ✅ Released | April 2026 | Full LLM support |
|
|
169
|
+
| v0.0.3 | ✅ Released | Apr 10, 2026 | Production-ready |
|
|
170
170
|
| v0.1.0 | 📋 Planned | Q2 2026 | Advanced analysis |
|
|
171
171
|
| v0.2.0 | 📋 Planned | Q3 2026 | Enterprise features |
|
|
172
|
-
| vv0.0.
|
|
172
|
+
| vv0.0.3 | 📋 Planned | Q4 2026 | Stable API + IDE integration |
|
|
173
173
|
|
|
174
174
|
---
|
|
175
175
|
|
|
@@ -220,7 +220,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
|
220
220
|
- Plugin system
|
|
221
221
|
- More LLM providers (Modal, Gemini, Claude, Kimi)
|
|
222
222
|
|
|
223
|
-
### v0.0.
|
|
223
|
+
### v0.0.3 (April 2026) ✅
|
|
224
224
|
- Enhanced test failure analysis
|
|
225
225
|
- Batch processing
|
|
226
226
|
- Performance improvements
|
|
@@ -344,3 +344,7 @@ voria --report-beta-issue graph-analysis
|
|
|
344
344
|
- [ARCHITECTURE.md](ARCHITECTURE.md) - Current system design
|
|
345
345
|
- [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Why things are the way they are
|
|
346
346
|
- [CONTRIBUTING.md](CONTRIBUTING.md) - How to contribute
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/SECURITY.md
CHANGED
|
@@ -155,7 +155,7 @@ voria respects system HTTP proxy:
|
|
|
155
155
|
# Set system proxy (voria uses it automatically)
|
|
156
156
|
export HTTP_PROXY="http://proxy.example.com:8080"
|
|
157
157
|
export HTTPS_PROXY="https://proxy.example.com:8443"
|
|
158
|
-
export NO_PROXY="localhost,127.0.0.
|
|
158
|
+
export NO_PROXY="localhost,127.0.0.3"
|
|
159
159
|
|
|
160
160
|
voria plan 1 # Uses proxy automatically
|
|
161
161
|
```
|
|
@@ -332,3 +332,7 @@ For enterprise:
|
|
|
332
332
|
- [DESIGN_DECISIONS.md](DESIGN_DECISIONS.md) - Security decisions
|
|
333
333
|
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
|
|
334
334
|
- [PERFORMANCE.md](PERFORMANCE.md) - Performance tuning
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/TROUBLESHOOTING.md
CHANGED
|
@@ -14,7 +14,7 @@ command not found: cargo
|
|
|
14
14
|
**Solution:**
|
|
15
15
|
```bash
|
|
16
16
|
# Install Rust
|
|
17
|
-
curl --proto '=https' --tlsvv0.0.
|
|
17
|
+
curl --proto '=https' --tlsvv0.0.3 -sSf https://sh.rustup.rs | sh
|
|
18
18
|
|
|
19
19
|
# Add to PATH
|
|
20
20
|
source $HOME/.cargo/env
|
|
@@ -563,3 +563,7 @@ tar czf voria-debug.tar.gz *.txt *.log
|
|
|
563
563
|
- [PERFORMANCE.md](PERFORMANCE.md) - Speed optimization
|
|
564
564
|
- [SECURITY.md](SECURITY.md) - Security issues
|
|
565
565
|
- [DEVELOPMENT.md](DEVELOPMENT.md) - Development setup issues
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/docs/USER_GUIDE.md
CHANGED
|
@@ -144,6 +144,37 @@ voria fix 42 ansh/voria -v
|
|
|
144
144
|
- `-v, --verbose` - Show detailed output and debug information
|
|
145
145
|
- `--config <PATH>` - Use specific config file
|
|
146
146
|
|
|
147
|
+
### `voria --graph`
|
|
148
|
+
|
|
149
|
+
Advanced structural analysis and dependency visualization.
|
|
150
|
+
|
|
151
|
+
**Usage:**
|
|
152
|
+
```bash
|
|
153
|
+
voria --graph
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**What it does:**
|
|
157
|
+
- Scans the entire codebase for dependencies and circular imports
|
|
158
|
+
- Generates a hierarchical tree view of folders and files
|
|
159
|
+
- Visualizes "imports" relationships at every level
|
|
160
|
+
- Calculates a **Risk Integrity Score** based on coupling and complexity
|
|
161
|
+
- Identifies **Hot Spots** (most complex/unstable modules)
|
|
162
|
+
- Provides actionable maintenance insights
|
|
163
|
+
|
|
164
|
+
**Output Example:**
|
|
165
|
+
```
|
|
166
|
+
🔭 Voria Multi-Level Dependency Tree
|
|
167
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
168
|
+
├── 📁 src (3 files, 450 lines)
|
|
169
|
+
│ ├── 📄 main.rs → imports [cli.rs, config.rs]
|
|
170
|
+
│ └── 📁 cli (2 files, 300 lines)
|
|
171
|
+
│ └── 📄 mod.rs → imports [orchestrator.rs]
|
|
172
|
+
└── 📄 README.md
|
|
173
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
174
|
+
|
|
175
|
+
⚖️ Ecosystem Health Index: 3.2/10.0 [EXCELLENT]
|
|
176
|
+
```
|
|
177
|
+
|
|
147
178
|
---
|
|
148
179
|
|
|
149
180
|
### `voria plan [ISSUE_ID]`
|
|
@@ -698,3 +729,7 @@ Team leads can create `voria.config.json` in repo root:
|
|
|
698
729
|
- [PERFORMANCE.md](PERFORMANCE.md) - Speed optimization
|
|
699
730
|
- [SECURITY.md](SECURITY.md) - Security best practices
|
|
700
731
|
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Common issues
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
**Join our WhatsApp Support Group:** [Click Here](https://chat.whatsapp.com/IWude2099NAJmLTs8kgEuE?mode=gi_t)
|
package/package.json
CHANGED
|
@@ -5,9 +5,10 @@ Fetches available models at runtime based on API keys.
|
|
|
5
5
|
|
|
6
6
|
import asyncio
|
|
7
7
|
import httpx
|
|
8
|
-
from dataclasses import dataclass
|
|
8
|
+
from dataclasses import dataclass, asdict
|
|
9
9
|
from typing import List, Optional
|
|
10
10
|
import logging
|
|
11
|
+
import json
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
13
14
|
|
|
@@ -26,6 +27,36 @@ class ModelInfo:
|
|
|
26
27
|
class ModelDiscovery:
|
|
27
28
|
"""Fetch available models from LLM providers."""
|
|
28
29
|
|
|
30
|
+
@staticmethod
|
|
31
|
+
async def fetch_generic_openai_compatible(api_key: str, base_url: str, provider_name: str) -> List[ModelInfo]:
|
|
32
|
+
"""Fetch models from an OpenAI-compatible API."""
|
|
33
|
+
try:
|
|
34
|
+
async with httpx.AsyncClient() as client:
|
|
35
|
+
response = await client.get(
|
|
36
|
+
f"{base_url.rstrip('/')}/models",
|
|
37
|
+
headers={"Authorization": f"Bearer {api_key}"},
|
|
38
|
+
timeout=10.0,
|
|
39
|
+
)
|
|
40
|
+
if response.status_code == 200:
|
|
41
|
+
data = response.json()
|
|
42
|
+
models = []
|
|
43
|
+
for model in data.get("data", []):
|
|
44
|
+
model_id = model.get("id", "")
|
|
45
|
+
models.append(
|
|
46
|
+
ModelInfo(
|
|
47
|
+
name=model_id,
|
|
48
|
+
display_name=model_id,
|
|
49
|
+
description=f"{provider_name} Model",
|
|
50
|
+
)
|
|
51
|
+
)
|
|
52
|
+
return models
|
|
53
|
+
else:
|
|
54
|
+
logger.warning(f"{provider_name} API returned {response.status_code}")
|
|
55
|
+
return []
|
|
56
|
+
except Exception as e:
|
|
57
|
+
logger.warning(f"Failed to fetch {provider_name} models: {e}")
|
|
58
|
+
return []
|
|
59
|
+
|
|
29
60
|
@staticmethod
|
|
30
61
|
async def fetch_modal_models(api_key: str) -> List[ModelInfo]:
|
|
31
62
|
"""Fetch available models from Modal Z.ai API."""
|
|
@@ -39,7 +70,6 @@ class ModelDiscovery:
|
|
|
39
70
|
if response.status_code == 200:
|
|
40
71
|
data = response.json()
|
|
41
72
|
models = []
|
|
42
|
-
# Modal returns model data in "data" key
|
|
43
73
|
for model in data.get("data", []):
|
|
44
74
|
models.append(
|
|
45
75
|
ModelInfo(
|
|
@@ -49,34 +79,16 @@ class ModelDiscovery:
|
|
|
49
79
|
description=f"Modal Z.ai - {model.get('created', 'N/A')}",
|
|
50
80
|
)
|
|
51
81
|
)
|
|
52
|
-
return (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
else:
|
|
56
|
-
logger.warning(
|
|
57
|
-
f"Modal API returned {response.status_code}, using fallback models"
|
|
58
|
-
)
|
|
59
|
-
return await ModelDiscovery._get_modal_fallback()
|
|
60
|
-
except Exception as e:
|
|
61
|
-
logger.warning(f"Failed to fetch Modal models: {e}, using fallback")
|
|
82
|
+
return models if models else await ModelDiscovery._get_modal_fallback()
|
|
83
|
+
return await ModelDiscovery._get_modal_fallback()
|
|
84
|
+
except Exception:
|
|
62
85
|
return await ModelDiscovery._get_modal_fallback()
|
|
63
86
|
|
|
64
87
|
@staticmethod
|
|
65
88
|
async def _get_modal_fallback() -> List[ModelInfo]:
|
|
66
|
-
"""Fallback models for Modal when API unavailable."""
|
|
67
89
|
return [
|
|
68
|
-
ModelInfo(
|
|
69
|
-
|
|
70
|
-
display_name="GLM-5.1-FP8 (745B, Latest)",
|
|
71
|
-
max_tokens=4096,
|
|
72
|
-
description="Latest Modal Z.ai model - 745B parameters",
|
|
73
|
-
),
|
|
74
|
-
ModelInfo(
|
|
75
|
-
name="zai-org/GLM-4",
|
|
76
|
-
display_name="GLM-4 (370B, Legacy)",
|
|
77
|
-
max_tokens=2048,
|
|
78
|
-
description="Previous generation Modal model",
|
|
79
|
-
),
|
|
90
|
+
ModelInfo(name="zai-org/GLM-5.1-FP8", display_name="GLM-5.1-FP8 (Latest)"),
|
|
91
|
+
ModelInfo(name="zai-org/GLM-4", display_name="GLM-4 (Legacy)"),
|
|
80
92
|
]
|
|
81
93
|
|
|
82
94
|
@staticmethod
|
|
@@ -92,81 +104,26 @@ class ModelDiscovery:
|
|
|
92
104
|
if response.status_code == 200:
|
|
93
105
|
data = response.json()
|
|
94
106
|
models = []
|
|
95
|
-
|
|
96
|
-
suitable_models = {
|
|
97
|
-
"gpt-4o",
|
|
98
|
-
"gpt-4-turbo",
|
|
99
|
-
"gpt-4",
|
|
100
|
-
"gpt-3.5-turbo",
|
|
101
|
-
}
|
|
107
|
+
suitable_prefixes = {"gpt-4", "gpt-3.5", "o1-"}
|
|
102
108
|
for model in data.get("data", []):
|
|
103
109
|
model_id = model.get("id", "")
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
ModelInfo(
|
|
110
|
-
name=model_id,
|
|
111
|
-
display_name=model_id,
|
|
112
|
-
description=f"OpenAI - {model.get('owned_by', 'N/A')}",
|
|
113
|
-
)
|
|
114
|
-
)
|
|
115
|
-
# Sort by recency (gpt-4o > gpt-4-turbo > gpt-4 > gpt-3.5-turbo)
|
|
116
|
-
return (
|
|
117
|
-
sorted(
|
|
118
|
-
models,
|
|
119
|
-
key=lambda x: (
|
|
120
|
-
not x.name.startswith("gpt-4o"),
|
|
121
|
-
not x.name.startswith("gpt-4-turbo"),
|
|
122
|
-
not x.name.startswith("gpt-4"),
|
|
123
|
-
),
|
|
124
|
-
)
|
|
125
|
-
if models
|
|
126
|
-
else await ModelDiscovery._get_openai_fallback()
|
|
127
|
-
)
|
|
128
|
-
else:
|
|
129
|
-
logger.warning(
|
|
130
|
-
f"OpenAI API returned {response.status_code}, using fallback models"
|
|
131
|
-
)
|
|
132
|
-
return await ModelDiscovery._get_openai_fallback()
|
|
133
|
-
except Exception as e:
|
|
134
|
-
logger.warning(f"Failed to fetch OpenAI models: {e}, using fallback")
|
|
110
|
+
if any(model_id.startswith(p) for p in suitable_prefixes):
|
|
111
|
+
models.append(ModelInfo(name=model_id, display_name=model_id))
|
|
112
|
+
return models if models else await ModelDiscovery._get_openai_fallback()
|
|
113
|
+
return await ModelDiscovery._get_openai_fallback()
|
|
114
|
+
except Exception:
|
|
135
115
|
return await ModelDiscovery._get_openai_fallback()
|
|
136
116
|
|
|
137
117
|
@staticmethod
|
|
138
118
|
async def _get_openai_fallback() -> List[ModelInfo]:
|
|
139
|
-
"""Fallback models for OpenAI when API unavailable."""
|
|
140
119
|
return [
|
|
141
|
-
ModelInfo(
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
max_tokens=128000,
|
|
145
|
-
description="Best intelligence at scale for agentic, coding, and professional workflows. $2.50 input, $15 output per 1M tokens",
|
|
146
|
-
),
|
|
147
|
-
ModelInfo(
|
|
148
|
-
name="gpt-5.4-mini",
|
|
149
|
-
display_name="GPT-5.4-mini (Mini Model)",
|
|
150
|
-
max_tokens=128000,
|
|
151
|
-
description="Strongest mini model yet for coding, computer use, and agentic tasks. $0.75 input, $4.50 output per 1M tokens",
|
|
152
|
-
),
|
|
153
|
-
ModelInfo(
|
|
154
|
-
name="gpt-5.4-nano",
|
|
155
|
-
display_name="GPT-5.4-nano (Cheapest)",
|
|
156
|
-
max_tokens=128000,
|
|
157
|
-
description="Cheapest GPT-5.4-class model for simple high-volume tasks. $0.20 input, $1.25 output per 1M tokens",
|
|
158
|
-
),
|
|
159
|
-
ModelInfo(
|
|
160
|
-
name="gpt-4o",
|
|
161
|
-
display_name="GPT-4o (Previous High Quality)",
|
|
162
|
-
max_tokens=128000,
|
|
163
|
-
description="Previous latest model - optimized for speed and cost",
|
|
164
|
-
),
|
|
120
|
+
ModelInfo(name="gpt-4o", display_name="GPT-4o"),
|
|
121
|
+
ModelInfo(name="gpt-4o-mini", display_name="GPT-4o-mini"),
|
|
122
|
+
ModelInfo(name="o1-preview", display_name="o1-preview"),
|
|
165
123
|
]
|
|
166
124
|
|
|
167
125
|
@staticmethod
|
|
168
126
|
async def fetch_gemini_models(api_key: str) -> List[ModelInfo]:
|
|
169
|
-
"""Fetch available models from Google Gemini API."""
|
|
170
127
|
try:
|
|
171
128
|
async with httpx.AsyncClient() as client:
|
|
172
129
|
response = await client.get(
|
|
@@ -176,106 +133,33 @@ class ModelDiscovery:
|
|
|
176
133
|
if response.status_code == 200:
|
|
177
134
|
data = response.json()
|
|
178
135
|
models = []
|
|
179
|
-
# Filter to generative models
|
|
180
136
|
for model in data.get("models", []):
|
|
181
|
-
|
|
182
|
-
if "gemini" in
|
|
183
|
-
models.append(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
description=f"Google Gemini - {model.get('displayName', 'N/A')}",
|
|
188
|
-
)
|
|
189
|
-
)
|
|
190
|
-
return (
|
|
191
|
-
models
|
|
192
|
-
if models
|
|
193
|
-
else await ModelDiscovery._get_gemini_fallback()
|
|
194
|
-
)
|
|
195
|
-
else:
|
|
196
|
-
logger.warning(
|
|
197
|
-
f"Gemini API returned {response.status_code}, using fallback models"
|
|
198
|
-
)
|
|
199
|
-
return await ModelDiscovery._get_gemini_fallback()
|
|
200
|
-
except Exception as e:
|
|
201
|
-
logger.warning(f"Failed to fetch Gemini models: {e}, using fallback")
|
|
137
|
+
name = model.get("name", "").replace("models/", "")
|
|
138
|
+
if "gemini" in name.lower():
|
|
139
|
+
models.append(ModelInfo(name=name, display_name=name))
|
|
140
|
+
return models if models else await ModelDiscovery._get_gemini_fallback()
|
|
141
|
+
return await ModelDiscovery._get_gemini_fallback()
|
|
142
|
+
except Exception:
|
|
202
143
|
return await ModelDiscovery._get_gemini_fallback()
|
|
203
144
|
|
|
204
145
|
@staticmethod
|
|
205
146
|
async def _get_gemini_fallback() -> List[ModelInfo]:
|
|
206
|
-
"""Fallback models for Gemini when API unavailable."""
|
|
207
147
|
return [
|
|
208
|
-
ModelInfo(
|
|
209
|
-
|
|
210
|
-
display_name="Gemini 3.1 Pro (Latest SOTA Reasoning)",
|
|
211
|
-
max_tokens=200000,
|
|
212
|
-
description="Latest SOTA reasoning model with unprecedented depth and nuance. $2 input, $12 output per context window",
|
|
213
|
-
),
|
|
214
|
-
ModelInfo(
|
|
215
|
-
name="gemini-3-flash",
|
|
216
|
-
display_name="Gemini 3 Flash (Latest, Fastest)",
|
|
217
|
-
max_tokens=200000,
|
|
218
|
-
description="Most intelligent model built for speed, combining frontier intelligence with superior search and grounding",
|
|
219
|
-
),
|
|
220
|
-
ModelInfo(
|
|
221
|
-
name="gemini-3.1-flash-lite",
|
|
222
|
-
display_name="Gemini 3.1 Flash Lite (Cheapest)",
|
|
223
|
-
max_tokens=200000,
|
|
224
|
-
description="Most cost-efficient model, optimized for high-volume agentic tasks. $0.25 input, $1.50 output",
|
|
225
|
-
),
|
|
226
|
-
ModelInfo(
|
|
227
|
-
name="gemini-2.0-flash",
|
|
228
|
-
display_name="Gemini 2.0 Flash (Previous)",
|
|
229
|
-
max_tokens=2000,
|
|
230
|
-
description="Previous generation Gemini model",
|
|
231
|
-
),
|
|
148
|
+
ModelInfo(name="gemini-1.5-pro", display_name="Gemini 1.5 Pro"),
|
|
149
|
+
ModelInfo(name="gemini-1.5-flash", display_name="Gemini 1.5 Flash"),
|
|
232
150
|
]
|
|
233
151
|
|
|
234
152
|
@staticmethod
|
|
235
153
|
async def fetch_claude_models(api_key: str) -> List[ModelInfo]:
|
|
236
|
-
|
|
237
|
-
try:
|
|
238
|
-
async with httpx.AsyncClient() as client:
|
|
239
|
-
# Claude doesn't have a public models endpoint, use documented models
|
|
240
|
-
# Make a test call to verify API key works
|
|
241
|
-
response = await client.get(
|
|
242
|
-
"https://api.anthropic.com/v1/models",
|
|
243
|
-
headers={"x-api-key": api_key},
|
|
244
|
-
timeout=10.0,
|
|
245
|
-
)
|
|
246
|
-
# If we get here, API key works - return known models
|
|
247
|
-
return await ModelDiscovery._get_claude_fallback()
|
|
248
|
-
except Exception as e:
|
|
249
|
-
logger.warning(f"Failed to verify Claude API: {e}, returning known models")
|
|
250
|
-
return await ModelDiscovery._get_claude_fallback()
|
|
251
|
-
|
|
252
|
-
@staticmethod
|
|
253
|
-
async def _get_claude_fallback() -> List[ModelInfo]:
|
|
254
|
-
"""Known Claude models (Anthropic doesn't provide list endpoint)."""
|
|
154
|
+
# Anthropic doesn't have a models endpoint, just return hardcoded
|
|
255
155
|
return [
|
|
256
|
-
ModelInfo(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
max_tokens=200000,
|
|
260
|
-
description="Most intelligent broadly available model for complex reasoning. $5 input, $25 output per 1M tokens",
|
|
261
|
-
),
|
|
262
|
-
ModelInfo(
|
|
263
|
-
name="claude-sonnet-4.6",
|
|
264
|
-
display_name="Claude Sonnet 4.6 (Best Value)",
|
|
265
|
-
max_tokens=200000,
|
|
266
|
-
description="Best balance of speed and intelligence. $3 input, $15 output per 1M tokens",
|
|
267
|
-
),
|
|
268
|
-
ModelInfo(
|
|
269
|
-
name="claude-haiku-4.5",
|
|
270
|
-
display_name="Claude Haiku 4.5 (Fastest, Cheapest)",
|
|
271
|
-
max_tokens=200000,
|
|
272
|
-
description="Fast and cost-efficient for simpler tasks. $0.80 input, $4 output per 1M tokens",
|
|
273
|
-
),
|
|
156
|
+
ModelInfo(name="claude-3-5-sonnet-20240620", display_name="Claude 3.5 Sonnet"),
|
|
157
|
+
ModelInfo(name="claude-3-opus-20240229", display_name="Claude 3 Opus"),
|
|
158
|
+
ModelInfo(name="claude-3-haiku-20240307", display_name="Claude 3 Haiku"),
|
|
274
159
|
]
|
|
275
160
|
|
|
276
161
|
@staticmethod
|
|
277
162
|
async def discover_all(provider: str, api_key: str) -> List[ModelInfo]:
|
|
278
|
-
"""Discover all models for a given provider."""
|
|
279
163
|
provider = provider.lower().strip()
|
|
280
164
|
if provider == "modal":
|
|
281
165
|
return await ModelDiscovery.fetch_modal_models(api_key)
|
|
@@ -285,5 +169,28 @@ class ModelDiscovery:
|
|
|
285
169
|
return await ModelDiscovery.fetch_gemini_models(api_key)
|
|
286
170
|
elif provider == "claude":
|
|
287
171
|
return await ModelDiscovery.fetch_claude_models(api_key)
|
|
172
|
+
elif provider == "deepseek":
|
|
173
|
+
return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.deepseek.com/v1", "DeepSeek")
|
|
174
|
+
elif provider == "kimi":
|
|
175
|
+
return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.moonshot.cn/v1", "Kimi")
|
|
176
|
+
elif provider == "minimax":
|
|
177
|
+
return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.minimax.chat/v1", "Minimax")
|
|
178
|
+
elif provider == "siliconflow":
|
|
179
|
+
return await ModelDiscovery.fetch_generic_openai_compatible(api_key, "https://api.siliconflow.cn/v1", "SiliconFlow")
|
|
288
180
|
else:
|
|
289
|
-
|
|
181
|
+
return []
|
|
182
|
+
|
|
183
|
+
if __name__ == "__main__":
|
|
184
|
+
import sys
|
|
185
|
+
if len(sys.argv) < 3:
|
|
186
|
+
print(json.dumps([]))
|
|
187
|
+
sys.exit(0)
|
|
188
|
+
|
|
189
|
+
provider = sys.argv[1]
|
|
190
|
+
api_key = sys.argv[2]
|
|
191
|
+
|
|
192
|
+
async def main():
|
|
193
|
+
models = await ModelDiscovery.discover_all(provider, api_key)
|
|
194
|
+
print(json.dumps([asdict(m) for m in models]))
|
|
195
|
+
|
|
196
|
+
asyncio.run(main())
|