wiggum-cli 0.1.0 → 0.2.1
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/dist/ai/enhancer.d.ts +2 -0
- package/dist/ai/enhancer.d.ts.map +1 -1
- package/dist/ai/enhancer.js +3 -1
- package/dist/ai/enhancer.js.map +1 -1
- package/dist/ai/providers.d.ts +13 -1
- package/dist/ai/providers.d.ts.map +1 -1
- package/dist/ai/providers.js +28 -6
- package/dist/ai/providers.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +109 -13
- package/dist/commands/init.js.map +1 -1
- package/package.json +1 -1
- package/src/ai/enhancer.ts +4 -1
- package/src/ai/providers.ts +38 -6
- package/src/commands/init.ts +124 -14
package/dist/ai/enhancer.d.ts
CHANGED
|
@@ -66,6 +66,7 @@ export interface EnhancedScanResult extends ScanResult {
|
|
|
66
66
|
*/
|
|
67
67
|
export interface EnhancerOptions {
|
|
68
68
|
provider?: AIProvider;
|
|
69
|
+
model?: string;
|
|
69
70
|
verbose?: boolean;
|
|
70
71
|
}
|
|
71
72
|
/**
|
|
@@ -74,6 +75,7 @@ export interface EnhancerOptions {
|
|
|
74
75
|
*/
|
|
75
76
|
export declare class AIEnhancer {
|
|
76
77
|
private provider;
|
|
78
|
+
private model?;
|
|
77
79
|
private verbose;
|
|
78
80
|
constructor(options?: EnhancerOptions);
|
|
79
81
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancer.d.ts","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAA8B,MAAM,gBAAgB,CAAC;AAIvF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5C,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,eAAoB;
|
|
1
|
+
{"version":3,"file":"enhancer.d.ts","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAA8B,MAAM,gBAAgB,CAAC;AAIvF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC/C,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,qBAAqB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5C,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,eAAoB;IAMzC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAiEnE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAoFnE"}
|
package/dist/ai/enhancer.js
CHANGED
|
@@ -70,9 +70,11 @@ function applyEnhancements(stack, analysis) {
|
|
|
70
70
|
*/
|
|
71
71
|
export class AIEnhancer {
|
|
72
72
|
provider;
|
|
73
|
+
model;
|
|
73
74
|
verbose;
|
|
74
75
|
constructor(options = {}) {
|
|
75
76
|
this.provider = options.provider || 'anthropic';
|
|
77
|
+
this.model = options.model;
|
|
76
78
|
this.verbose = options.verbose || false;
|
|
77
79
|
}
|
|
78
80
|
/**
|
|
@@ -102,7 +104,7 @@ export class AIEnhancer {
|
|
|
102
104
|
}
|
|
103
105
|
try {
|
|
104
106
|
// Get the configured model
|
|
105
|
-
const { model, provider, modelId } = getModel(this.provider);
|
|
107
|
+
const { model, provider, modelId } = getModel(this.provider, this.model);
|
|
106
108
|
if (this.verbose) {
|
|
107
109
|
logger.info(`Using AI provider: ${provider} (${modelId})`);
|
|
108
110
|
}
|
package/dist/ai/enhancer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancer.js","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAmB,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"enhancer.js","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/providers.d.ts
CHANGED
|
@@ -15,6 +15,18 @@ export interface ProviderConfig {
|
|
|
15
15
|
provider: AIProvider;
|
|
16
16
|
modelId: string;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Model option with label and value
|
|
20
|
+
*/
|
|
21
|
+
export interface ModelOption {
|
|
22
|
+
value: string;
|
|
23
|
+
label: string;
|
|
24
|
+
hint?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Available models for each provider
|
|
28
|
+
*/
|
|
29
|
+
export declare const AVAILABLE_MODELS: Record<AIProvider, ModelOption[]>;
|
|
18
30
|
/**
|
|
19
31
|
* Check if an API key is available for a provider
|
|
20
32
|
*/
|
|
@@ -22,7 +34,7 @@ export declare function hasApiKey(provider: AIProvider): boolean;
|
|
|
22
34
|
/**
|
|
23
35
|
* Get a configured AI model for the specified provider
|
|
24
36
|
*/
|
|
25
|
-
export declare function getModel(provider?: AIProvider): ProviderConfig;
|
|
37
|
+
export declare function getModel(provider?: AIProvider, customModelId?: string): ProviderConfig;
|
|
26
38
|
/**
|
|
27
39
|
* Get the first available provider with an API key
|
|
28
40
|
* Checks in order: anthropic, openai, openrouter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAWD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,CAkB9D,CAAC;AAYF;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAGvD;AAmBD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,GAAE,UAAwB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,cAAc,CA0CnG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,GAAG,IAAI,CAUxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAE5D"}
|
package/dist/ai/providers.js
CHANGED
|
@@ -12,14 +12,36 @@ const API_KEY_ENV_VARS = {
|
|
|
12
12
|
openai: 'OPENAI_API_KEY',
|
|
13
13
|
openrouter: 'OPENROUTER_API_KEY',
|
|
14
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Available models for each provider
|
|
17
|
+
*/
|
|
18
|
+
export const AVAILABLE_MODELS = {
|
|
19
|
+
anthropic: [
|
|
20
|
+
{ value: 'claude-opus-4-5-20250514', label: 'Claude Opus 4.5', hint: 'most capable' },
|
|
21
|
+
{ value: 'claude-sonnet-4-5-20250514', label: 'Claude Sonnet 4.5', hint: 'recommended' },
|
|
22
|
+
{ value: 'claude-haiku-4-5-20250514', label: 'Claude Haiku 4.5', hint: 'fastest' },
|
|
23
|
+
],
|
|
24
|
+
openai: [
|
|
25
|
+
{ value: 'gpt-5.1', label: 'GPT-5.1', hint: 'most capable' },
|
|
26
|
+
{ value: 'gpt-5.1-codex-max', label: 'GPT-5.1 Codex Max', hint: 'best for code' },
|
|
27
|
+
{ value: 'gpt-5-mini', label: 'GPT-5 Mini', hint: 'fastest' },
|
|
28
|
+
],
|
|
29
|
+
openrouter: [
|
|
30
|
+
{ value: 'google/gemini-3-pro-preview', label: 'Gemini 3 Pro', hint: 'Google' },
|
|
31
|
+
{ value: 'google/gemini-3-flash-preview', label: 'Gemini 3 Flash', hint: 'fast' },
|
|
32
|
+
{ value: 'deepseek/deepseek-v3.2', label: 'DeepSeek v3.2', hint: 'efficient' },
|
|
33
|
+
{ value: 'z-ai/glm-4.7', label: 'GLM 4.7', hint: 'Z-AI' },
|
|
34
|
+
{ value: 'minimax/minimax-m2.1', label: 'MiniMax M2.1', hint: 'MiniMax' },
|
|
35
|
+
],
|
|
36
|
+
};
|
|
15
37
|
/**
|
|
16
38
|
* Default models for each provider
|
|
17
|
-
* Using
|
|
39
|
+
* Using balanced models for good results
|
|
18
40
|
*/
|
|
19
41
|
const DEFAULT_MODELS = {
|
|
20
|
-
anthropic: 'claude-sonnet-4-20250514',
|
|
21
|
-
openai: 'gpt-
|
|
22
|
-
openrouter: '
|
|
42
|
+
anthropic: 'claude-sonnet-4-5-20250514',
|
|
43
|
+
openai: 'gpt-5.1',
|
|
44
|
+
openrouter: 'google/gemini-3-pro-preview',
|
|
23
45
|
};
|
|
24
46
|
/**
|
|
25
47
|
* Check if an API key is available for a provider
|
|
@@ -43,8 +65,8 @@ function getApiKey(provider) {
|
|
|
43
65
|
/**
|
|
44
66
|
* Get a configured AI model for the specified provider
|
|
45
67
|
*/
|
|
46
|
-
export function getModel(provider = 'anthropic') {
|
|
47
|
-
const modelId = DEFAULT_MODELS[provider];
|
|
68
|
+
export function getModel(provider = 'anthropic', customModelId) {
|
|
69
|
+
const modelId = customModelId || DEFAULT_MODELS[provider];
|
|
48
70
|
switch (provider) {
|
|
49
71
|
case 'anthropic': {
|
|
50
72
|
const anthropic = createAnthropic({
|
package/dist/ai/providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiB9C;;GAEG;AACH,MAAM,gBAAgB,GAA+B;IACnD,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAA+B;IACjD,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/ai/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoOrE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -6,8 +6,11 @@ import { logger } from '../utils/logger.js';
|
|
|
6
6
|
import { Scanner, formatScanResult } from '../scanner/index.js';
|
|
7
7
|
import { Generator, formatGenerationResult } from '../generator/index.js';
|
|
8
8
|
import { AIEnhancer, formatAIAnalysis, } from '../ai/index.js';
|
|
9
|
+
import { hasApiKey, getApiKeyEnvVar, getAvailableProvider, AVAILABLE_MODELS } from '../ai/providers.js';
|
|
9
10
|
import * as prompts from '@clack/prompts';
|
|
10
11
|
import pc from 'picocolors';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import path from 'path';
|
|
11
14
|
/**
|
|
12
15
|
* Initialize Ralph in the current project
|
|
13
16
|
* Scans the project and generates configuration
|
|
@@ -36,23 +39,116 @@ export async function initCommand(options) {
|
|
|
36
39
|
console.log(pc.cyan('--- Scan Results ---'));
|
|
37
40
|
console.log(formatScanResult(scanResult));
|
|
38
41
|
console.log('');
|
|
39
|
-
// Step 2: AI Enhancement
|
|
42
|
+
// Step 2: AI Enhancement
|
|
40
43
|
let enhancedResult;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
let useAI = options.ai;
|
|
45
|
+
let provider = options.provider || 'anthropic';
|
|
46
|
+
// Ask about AI enhancement if not specified via --ai flag and not in --yes mode
|
|
47
|
+
if (!options.ai && !options.yes) {
|
|
48
|
+
const wantAI = await prompts.confirm({
|
|
49
|
+
message: 'Enable AI-enhanced analysis?',
|
|
50
|
+
initialValue: true,
|
|
47
51
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if (prompts.isCancel(wantAI)) {
|
|
53
|
+
logger.info('Initialization cancelled');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
useAI = wantAI;
|
|
57
|
+
}
|
|
58
|
+
if (useAI) {
|
|
59
|
+
// Check if we have an API key for the selected provider or any provider
|
|
60
|
+
let hasKey = options.provider ? hasApiKey(options.provider) : !!getAvailableProvider();
|
|
61
|
+
// If no API key found, prompt for one
|
|
62
|
+
if (!hasKey) {
|
|
63
|
+
console.log('');
|
|
64
|
+
console.log(pc.yellow('No API key found for AI enhancement.'));
|
|
53
65
|
console.log('');
|
|
66
|
+
// Ask which provider to use
|
|
67
|
+
const providerChoice = await prompts.select({
|
|
68
|
+
message: 'Which AI provider would you like to use?',
|
|
69
|
+
options: [
|
|
70
|
+
{ value: 'anthropic', label: 'Anthropic (Claude)', hint: 'recommended' },
|
|
71
|
+
{ value: 'openai', label: 'OpenAI (GPT-4)' },
|
|
72
|
+
{ value: 'openrouter', label: 'OpenRouter' },
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
if (prompts.isCancel(providerChoice)) {
|
|
76
|
+
logger.info('Initialization cancelled');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
provider = providerChoice;
|
|
80
|
+
const envVar = getApiKeyEnvVar(provider);
|
|
81
|
+
// Prompt for API key
|
|
82
|
+
const apiKeyInput = await prompts.password({
|
|
83
|
+
message: `Enter your ${envVar}:`,
|
|
84
|
+
});
|
|
85
|
+
if (prompts.isCancel(apiKeyInput) || !apiKeyInput) {
|
|
86
|
+
logger.warn('No API key provided, skipping AI enhancement');
|
|
87
|
+
useAI = false;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Set the API key in process.env for current session
|
|
91
|
+
process.env[envVar] = apiKeyInput;
|
|
92
|
+
hasKey = true;
|
|
93
|
+
// Offer to save to .env.local
|
|
94
|
+
const saveKey = await prompts.confirm({
|
|
95
|
+
message: 'Save API key to .env.local?',
|
|
96
|
+
initialValue: true,
|
|
97
|
+
});
|
|
98
|
+
if (!prompts.isCancel(saveKey) && saveKey) {
|
|
99
|
+
const envLocalPath = path.join(projectRoot, '.env.local');
|
|
100
|
+
let envContent = '';
|
|
101
|
+
// Read existing content if file exists
|
|
102
|
+
if (fs.existsSync(envLocalPath)) {
|
|
103
|
+
envContent = fs.readFileSync(envLocalPath, 'utf-8');
|
|
104
|
+
// Check if key already exists
|
|
105
|
+
const keyRegex = new RegExp(`^${envVar}=.*$`, 'm');
|
|
106
|
+
if (keyRegex.test(envContent)) {
|
|
107
|
+
// Replace existing key
|
|
108
|
+
envContent = envContent.replace(keyRegex, `${envVar}=${apiKeyInput}`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
// Append new key
|
|
112
|
+
envContent = envContent.trimEnd() + '\n' + `${envVar}=${apiKeyInput}\n`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
envContent = `${envVar}=${apiKeyInput}\n`;
|
|
117
|
+
}
|
|
118
|
+
fs.writeFileSync(envLocalPath, envContent);
|
|
119
|
+
logger.success(`API key saved to .env.local`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
54
122
|
}
|
|
55
|
-
else {
|
|
123
|
+
else if (!options.provider) {
|
|
124
|
+
// If we have a key but no provider specified, use the available one
|
|
125
|
+
provider = getAvailableProvider() || 'anthropic';
|
|
126
|
+
}
|
|
127
|
+
// Run AI enhancement if we have a key
|
|
128
|
+
if (useAI && hasKey) {
|
|
129
|
+
// Ask which model to use
|
|
130
|
+
const modelOptions = AVAILABLE_MODELS[provider];
|
|
131
|
+
const modelChoice = await prompts.select({
|
|
132
|
+
message: 'Which model would you like to use?',
|
|
133
|
+
options: modelOptions.map(m => ({
|
|
134
|
+
value: m.value,
|
|
135
|
+
label: m.label,
|
|
136
|
+
hint: m.hint,
|
|
137
|
+
})),
|
|
138
|
+
});
|
|
139
|
+
if (prompts.isCancel(modelChoice)) {
|
|
140
|
+
logger.info('Initialization cancelled');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const selectedModel = modelChoice;
|
|
144
|
+
const modelLabel = modelOptions.find(m => m.value === selectedModel)?.label || selectedModel;
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log(pc.cyan(`--- AI Enhancement (${provider} / ${modelLabel}) ---`));
|
|
147
|
+
const aiEnhancer = new AIEnhancer({
|
|
148
|
+
provider,
|
|
149
|
+
model: selectedModel,
|
|
150
|
+
verbose: true,
|
|
151
|
+
});
|
|
56
152
|
spinner.start('Running AI analysis...');
|
|
57
153
|
try {
|
|
58
154
|
enhancedResult = await aiEnhancer.enhance(scanResult);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACL,UAAU,EACV,gBAAgB,GAGjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/ai/enhancer.ts
CHANGED
|
@@ -78,6 +78,7 @@ export interface EnhancedScanResult extends ScanResult {
|
|
|
78
78
|
*/
|
|
79
79
|
export interface EnhancerOptions {
|
|
80
80
|
provider?: AIProvider;
|
|
81
|
+
model?: string;
|
|
81
82
|
verbose?: boolean;
|
|
82
83
|
}
|
|
83
84
|
|
|
@@ -158,10 +159,12 @@ function applyEnhancements(
|
|
|
158
159
|
*/
|
|
159
160
|
export class AIEnhancer {
|
|
160
161
|
private provider: AIProvider;
|
|
162
|
+
private model?: string;
|
|
161
163
|
private verbose: boolean;
|
|
162
164
|
|
|
163
165
|
constructor(options: EnhancerOptions = {}) {
|
|
164
166
|
this.provider = options.provider || 'anthropic';
|
|
167
|
+
this.model = options.model;
|
|
165
168
|
this.verbose = options.verbose || false;
|
|
166
169
|
}
|
|
167
170
|
|
|
@@ -195,7 +198,7 @@ export class AIEnhancer {
|
|
|
195
198
|
|
|
196
199
|
try {
|
|
197
200
|
// Get the configured model
|
|
198
|
-
const { model, provider, modelId } = getModel(this.provider);
|
|
201
|
+
const { model, provider, modelId } = getModel(this.provider, this.model);
|
|
199
202
|
|
|
200
203
|
if (this.verbose) {
|
|
201
204
|
logger.info(`Using AI provider: ${provider} (${modelId})`);
|
package/src/ai/providers.ts
CHANGED
|
@@ -30,14 +30,46 @@ const API_KEY_ENV_VARS: Record<AIProvider, string> = {
|
|
|
30
30
|
openrouter: 'OPENROUTER_API_KEY',
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Model option with label and value
|
|
35
|
+
*/
|
|
36
|
+
export interface ModelOption {
|
|
37
|
+
value: string;
|
|
38
|
+
label: string;
|
|
39
|
+
hint?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Available models for each provider
|
|
44
|
+
*/
|
|
45
|
+
export const AVAILABLE_MODELS: Record<AIProvider, ModelOption[]> = {
|
|
46
|
+
anthropic: [
|
|
47
|
+
{ value: 'claude-opus-4-5-20250514', label: 'Claude Opus 4.5', hint: 'most capable' },
|
|
48
|
+
{ value: 'claude-sonnet-4-5-20250514', label: 'Claude Sonnet 4.5', hint: 'recommended' },
|
|
49
|
+
{ value: 'claude-haiku-4-5-20250514', label: 'Claude Haiku 4.5', hint: 'fastest' },
|
|
50
|
+
],
|
|
51
|
+
openai: [
|
|
52
|
+
{ value: 'gpt-5.1', label: 'GPT-5.1', hint: 'most capable' },
|
|
53
|
+
{ value: 'gpt-5.1-codex-max', label: 'GPT-5.1 Codex Max', hint: 'best for code' },
|
|
54
|
+
{ value: 'gpt-5-mini', label: 'GPT-5 Mini', hint: 'fastest' },
|
|
55
|
+
],
|
|
56
|
+
openrouter: [
|
|
57
|
+
{ value: 'google/gemini-3-pro-preview', label: 'Gemini 3 Pro', hint: 'Google' },
|
|
58
|
+
{ value: 'google/gemini-3-flash-preview', label: 'Gemini 3 Flash', hint: 'fast' },
|
|
59
|
+
{ value: 'deepseek/deepseek-v3.2', label: 'DeepSeek v3.2', hint: 'efficient' },
|
|
60
|
+
{ value: 'z-ai/glm-4.7', label: 'GLM 4.7', hint: 'Z-AI' },
|
|
61
|
+
{ value: 'minimax/minimax-m2.1', label: 'MiniMax M2.1', hint: 'MiniMax' },
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
|
|
33
65
|
/**
|
|
34
66
|
* Default models for each provider
|
|
35
|
-
* Using
|
|
67
|
+
* Using balanced models for good results
|
|
36
68
|
*/
|
|
37
69
|
const DEFAULT_MODELS: Record<AIProvider, string> = {
|
|
38
|
-
anthropic: 'claude-sonnet-4-20250514',
|
|
39
|
-
openai: 'gpt-
|
|
40
|
-
openrouter: '
|
|
70
|
+
anthropic: 'claude-sonnet-4-5-20250514',
|
|
71
|
+
openai: 'gpt-5.1',
|
|
72
|
+
openrouter: 'google/gemini-3-pro-preview',
|
|
41
73
|
};
|
|
42
74
|
|
|
43
75
|
/**
|
|
@@ -68,8 +100,8 @@ function getApiKey(provider: AIProvider): string {
|
|
|
68
100
|
/**
|
|
69
101
|
* Get a configured AI model for the specified provider
|
|
70
102
|
*/
|
|
71
|
-
export function getModel(provider: AIProvider = 'anthropic'): ProviderConfig {
|
|
72
|
-
const modelId = DEFAULT_MODELS[provider];
|
|
103
|
+
export function getModel(provider: AIProvider = 'anthropic', customModelId?: string): ProviderConfig {
|
|
104
|
+
const modelId = customModelId || DEFAULT_MODELS[provider];
|
|
73
105
|
|
|
74
106
|
switch (provider) {
|
|
75
107
|
case 'anthropic': {
|
package/src/commands/init.ts
CHANGED
|
@@ -12,8 +12,11 @@ import {
|
|
|
12
12
|
type AIProvider,
|
|
13
13
|
type EnhancedScanResult,
|
|
14
14
|
} from '../ai/index.js';
|
|
15
|
+
import { hasApiKey, getApiKeyEnvVar, getAvailableProvider, AVAILABLE_MODELS } from '../ai/providers.js';
|
|
15
16
|
import * as prompts from '@clack/prompts';
|
|
16
17
|
import pc from 'picocolors';
|
|
18
|
+
import fs from 'fs';
|
|
19
|
+
import path from 'path';
|
|
17
20
|
|
|
18
21
|
export interface InitOptions {
|
|
19
22
|
ai?: boolean;
|
|
@@ -54,25 +57,132 @@ export async function initCommand(options: InitOptions): Promise<void> {
|
|
|
54
57
|
console.log(formatScanResult(scanResult));
|
|
55
58
|
console.log('');
|
|
56
59
|
|
|
57
|
-
// Step 2: AI Enhancement
|
|
60
|
+
// Step 2: AI Enhancement
|
|
58
61
|
let enhancedResult: EnhancedScanResult | undefined;
|
|
62
|
+
let useAI = options.ai;
|
|
63
|
+
let provider: AIProvider = options.provider || 'anthropic';
|
|
59
64
|
|
|
60
|
-
if
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
provider,
|
|
66
|
-
verbose: true,
|
|
65
|
+
// Ask about AI enhancement if not specified via --ai flag and not in --yes mode
|
|
66
|
+
if (!options.ai && !options.yes) {
|
|
67
|
+
const wantAI = await prompts.confirm({
|
|
68
|
+
message: 'Enable AI-enhanced analysis?',
|
|
69
|
+
initialValue: true,
|
|
67
70
|
});
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
if (prompts.isCancel(wantAI)) {
|
|
73
|
+
logger.info('Initialization cancelled');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
useAI = wantAI;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (useAI) {
|
|
81
|
+
// Check if we have an API key for the selected provider or any provider
|
|
82
|
+
let hasKey = options.provider ? hasApiKey(options.provider) : !!getAvailableProvider();
|
|
83
|
+
|
|
84
|
+
// If no API key found, prompt for one
|
|
85
|
+
if (!hasKey) {
|
|
74
86
|
console.log('');
|
|
75
|
-
|
|
87
|
+
console.log(pc.yellow('No API key found for AI enhancement.'));
|
|
88
|
+
console.log('');
|
|
89
|
+
|
|
90
|
+
// Ask which provider to use
|
|
91
|
+
const providerChoice = await prompts.select({
|
|
92
|
+
message: 'Which AI provider would you like to use?',
|
|
93
|
+
options: [
|
|
94
|
+
{ value: 'anthropic', label: 'Anthropic (Claude)', hint: 'recommended' },
|
|
95
|
+
{ value: 'openai', label: 'OpenAI (GPT-4)' },
|
|
96
|
+
{ value: 'openrouter', label: 'OpenRouter' },
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
if (prompts.isCancel(providerChoice)) {
|
|
101
|
+
logger.info('Initialization cancelled');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
provider = providerChoice as AIProvider;
|
|
106
|
+
const envVar = getApiKeyEnvVar(provider);
|
|
107
|
+
|
|
108
|
+
// Prompt for API key
|
|
109
|
+
const apiKeyInput = await prompts.password({
|
|
110
|
+
message: `Enter your ${envVar}:`,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (prompts.isCancel(apiKeyInput) || !apiKeyInput) {
|
|
114
|
+
logger.warn('No API key provided, skipping AI enhancement');
|
|
115
|
+
useAI = false;
|
|
116
|
+
} else {
|
|
117
|
+
// Set the API key in process.env for current session
|
|
118
|
+
process.env[envVar] = apiKeyInput;
|
|
119
|
+
hasKey = true;
|
|
120
|
+
|
|
121
|
+
// Offer to save to .env.local
|
|
122
|
+
const saveKey = await prompts.confirm({
|
|
123
|
+
message: 'Save API key to .env.local?',
|
|
124
|
+
initialValue: true,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
if (!prompts.isCancel(saveKey) && saveKey) {
|
|
128
|
+
const envLocalPath = path.join(projectRoot, '.env.local');
|
|
129
|
+
let envContent = '';
|
|
130
|
+
|
|
131
|
+
// Read existing content if file exists
|
|
132
|
+
if (fs.existsSync(envLocalPath)) {
|
|
133
|
+
envContent = fs.readFileSync(envLocalPath, 'utf-8');
|
|
134
|
+
// Check if key already exists
|
|
135
|
+
const keyRegex = new RegExp(`^${envVar}=.*$`, 'm');
|
|
136
|
+
if (keyRegex.test(envContent)) {
|
|
137
|
+
// Replace existing key
|
|
138
|
+
envContent = envContent.replace(keyRegex, `${envVar}=${apiKeyInput}`);
|
|
139
|
+
} else {
|
|
140
|
+
// Append new key
|
|
141
|
+
envContent = envContent.trimEnd() + '\n' + `${envVar}=${apiKeyInput}\n`;
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
envContent = `${envVar}=${apiKeyInput}\n`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
fs.writeFileSync(envLocalPath, envContent);
|
|
148
|
+
logger.success(`API key saved to .env.local`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} else if (!options.provider) {
|
|
152
|
+
// If we have a key but no provider specified, use the available one
|
|
153
|
+
provider = getAvailableProvider() || 'anthropic';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Run AI enhancement if we have a key
|
|
157
|
+
if (useAI && hasKey) {
|
|
158
|
+
// Ask which model to use
|
|
159
|
+
const modelOptions = AVAILABLE_MODELS[provider];
|
|
160
|
+
const modelChoice = await prompts.select({
|
|
161
|
+
message: 'Which model would you like to use?',
|
|
162
|
+
options: modelOptions.map(m => ({
|
|
163
|
+
value: m.value,
|
|
164
|
+
label: m.label,
|
|
165
|
+
hint: m.hint,
|
|
166
|
+
})),
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
if (prompts.isCancel(modelChoice)) {
|
|
170
|
+
logger.info('Initialization cancelled');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const selectedModel = modelChoice as string;
|
|
175
|
+
const modelLabel = modelOptions.find(m => m.value === selectedModel)?.label || selectedModel;
|
|
176
|
+
|
|
177
|
+
console.log('');
|
|
178
|
+
console.log(pc.cyan(`--- AI Enhancement (${provider} / ${modelLabel}) ---`));
|
|
179
|
+
|
|
180
|
+
const aiEnhancer = new AIEnhancer({
|
|
181
|
+
provider,
|
|
182
|
+
model: selectedModel,
|
|
183
|
+
verbose: true,
|
|
184
|
+
});
|
|
185
|
+
|
|
76
186
|
spinner.start('Running AI analysis...');
|
|
77
187
|
|
|
78
188
|
try {
|