krasavacode 0.3.1 → 0.3.3
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/bin/krasavacode.js +1 -1
- package/package.json +1 -1
- package/src/launch.js +39 -10
- package/src/preset.js +4 -3
package/bin/krasavacode.js
CHANGED
|
@@ -8,7 +8,7 @@ import { runDoctor } from '../src/doctor.js';
|
|
|
8
8
|
import { runSetupGemini } from '../src/setup-gemini.js';
|
|
9
9
|
|
|
10
10
|
// Hardcoded so it works inside Bun --compile (no FS access to package.json)
|
|
11
|
-
const VERSION = '0.3.
|
|
11
|
+
const VERSION = '0.3.3';
|
|
12
12
|
|
|
13
13
|
const cmd = process.argv[2];
|
|
14
14
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "krasavacode",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "KRASAVACODE — однокнопочный бесплатный вайбкодинг для учеников. Claude Code на бесплатных провайдерах через локальный gateway. Сам ставит Node при необходимости.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/launch.js
CHANGED
|
@@ -1,37 +1,66 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
2
5
|
import { isGeminiConfigured } from './setup-gemini.js';
|
|
3
6
|
|
|
4
7
|
const PLACEHOLDER_TOKEN = 'sk-krasavacode-local';
|
|
8
|
+
const CLAUDE_CONFIG_DIR = join(homedir(), '.krasavacode', 'claude-config');
|
|
5
9
|
|
|
6
10
|
export async function launchClaude(paths, hub /*, detection */) {
|
|
7
11
|
const geminiOn = await isGeminiConfigured();
|
|
12
|
+
// Isolate Claude Code's config/credentials from any real Anthropic login
|
|
13
|
+
// the student may have on this machine (~/.claude/). This is the *only*
|
|
14
|
+
// way to suppress the "Welcome back, NAME · publerplatforma@gmail.com's
|
|
15
|
+
// Organization · API Usage Billing" header on the welcome screen.
|
|
16
|
+
await mkdir(CLAUDE_CONFIG_DIR, { recursive: true });
|
|
17
|
+
|
|
18
|
+
// Drop any pre-existing ANTHROPIC_API_KEY (from the user's shell or a real
|
|
19
|
+
// Anthropic login) so it doesn't conflict with our auth-token, and so that
|
|
20
|
+
// Claude Code's welcome screen doesn't show the user's real Anthropic org.
|
|
21
|
+
const cleanEnv = { ...process.env };
|
|
22
|
+
delete cleanEnv.ANTHROPIC_API_KEY;
|
|
23
|
+
delete cleanEnv.ANTHROPIC_VERTEX_PROJECT_ID;
|
|
24
|
+
delete cleanEnv.ANTHROPIC_BEDROCK_BASE_URL;
|
|
8
25
|
|
|
9
26
|
const env = {
|
|
10
|
-
...
|
|
27
|
+
...cleanEnv,
|
|
11
28
|
ANTHROPIC_BASE_URL: hub.baseUrl,
|
|
12
29
|
ANTHROPIC_AUTH_TOKEN: PLACEHOLDER_TOKEN,
|
|
13
|
-
|
|
30
|
+
// Isolate config/credentials: own dir, separate from ~/.claude/
|
|
31
|
+
ANTHROPIC_CONFIG_DIR: CLAUDE_CONFIG_DIR,
|
|
14
32
|
DISABLE_AUTOUPDATER: '1',
|
|
15
33
|
DISABLE_TELEMETRY: '1',
|
|
16
34
|
DISABLE_ERROR_REPORTING: '1',
|
|
17
35
|
// Tell Claude Code which model to ask for. CCR will route any of these
|
|
18
|
-
// to Pollinations via Router.default.
|
|
36
|
+
// to Pollinations / Gemini via Router.default.
|
|
19
37
|
ANTHROPIC_MODEL: process.env.ANTHROPIC_MODEL || 'claude-sonnet-4-5',
|
|
20
38
|
};
|
|
21
39
|
|
|
22
40
|
const passthroughArgs = process.argv.slice(2).filter(a => !['doctor', 'upgrade'].includes(a));
|
|
23
41
|
|
|
42
|
+
const W = 64;
|
|
43
|
+
const line = (txt) => {
|
|
44
|
+
const pad = Math.max(0, W - 2 - [...txt].length);
|
|
45
|
+
return '┃ ' + txt + ' '.repeat(pad) + '┃';
|
|
46
|
+
};
|
|
24
47
|
console.log('');
|
|
25
|
-
console.log('━'.repeat(
|
|
26
|
-
console.log('
|
|
48
|
+
console.log('┏' + '━'.repeat(W - 1) + '┓');
|
|
49
|
+
console.log(line(' K R A S A V A C O D E'));
|
|
50
|
+
console.log(line(' Бесплатный вайбкодинг через локальный hub'));
|
|
51
|
+
console.log('┣' + '━'.repeat(W - 1) + '┫');
|
|
27
52
|
if (geminiOn) {
|
|
28
|
-
console.log(' Модель: Google Gemini 2.5 Flash
|
|
53
|
+
console.log(line(' ✓ Модель: Google Gemini 2.5 Flash'));
|
|
54
|
+
console.log(line(' (1500 запросов в день, бесплатно)'));
|
|
29
55
|
} else {
|
|
30
|
-
console.log(' Модель: gpt-oss-20b через Pollinations
|
|
31
|
-
console.log('
|
|
56
|
+
console.log(line(' · Модель: gpt-oss-20b через Pollinations'));
|
|
57
|
+
console.log(line(' (бесплатно, без логина)'));
|
|
58
|
+
console.log(line(' 💡 Лучше модель: krasavacode setup-gemini'));
|
|
32
59
|
}
|
|
33
|
-
console.log('
|
|
34
|
-
console.log('
|
|
60
|
+
console.log('┗' + '━'.repeat(W - 1) + '┛');
|
|
61
|
+
console.log('');
|
|
62
|
+
console.log(' Дальше открывается Claude Code от Anthropic — это');
|
|
63
|
+
console.log(' его экран приветствия, не наш. Просто пиши задачу.');
|
|
35
64
|
console.log('');
|
|
36
65
|
|
|
37
66
|
// Merge env from runtime (PATH with bundled Node when applicable) with our overrides
|
package/src/preset.js
CHANGED
|
@@ -19,11 +19,12 @@ function pollinationsProvider() {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
function geminiProvider() {
|
|
22
|
+
// gemini-2.5-pro free tier = 0 requests; only flash is actually free.
|
|
22
23
|
return {
|
|
23
24
|
name: 'gemini',
|
|
24
25
|
api_base_url: 'https://generativelanguage.googleapis.com/v1beta/models/',
|
|
25
26
|
api_key: '$GEMINI_API_KEY',
|
|
26
|
-
models: ['gemini-2.5-flash', 'gemini-
|
|
27
|
+
models: ['gemini-2.5-flash', 'gemini-flash-latest'],
|
|
27
28
|
transformer: { use: ['gemini'] },
|
|
28
29
|
};
|
|
29
30
|
}
|
|
@@ -37,8 +38,8 @@ function buildConfig({ withGemini }) {
|
|
|
37
38
|
? {
|
|
38
39
|
default: 'gemini,gemini-2.5-flash',
|
|
39
40
|
background: 'gemini,gemini-2.5-flash',
|
|
40
|
-
think: 'gemini,gemini-2.5-
|
|
41
|
-
longContext: 'gemini,gemini-2.5-
|
|
41
|
+
think: 'gemini,gemini-2.5-flash',
|
|
42
|
+
longContext: 'gemini,gemini-2.5-flash',
|
|
42
43
|
longContextThreshold: 60000,
|
|
43
44
|
}
|
|
44
45
|
: {
|