codeep 1.0.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/LICENSE +201 -0
- package/README.md +576 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.js +421 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +1406 -0
- package/dist/components/AgentProgress.d.ts +33 -0
- package/dist/components/AgentProgress.js +97 -0
- package/dist/components/Export.d.ts +8 -0
- package/dist/components/Export.js +27 -0
- package/dist/components/Help.d.ts +2 -0
- package/dist/components/Help.js +3 -0
- package/dist/components/Input.d.ts +9 -0
- package/dist/components/Input.js +89 -0
- package/dist/components/Loading.d.ts +9 -0
- package/dist/components/Loading.js +31 -0
- package/dist/components/Login.d.ts +7 -0
- package/dist/components/Login.js +77 -0
- package/dist/components/Logo.d.ts +8 -0
- package/dist/components/Logo.js +89 -0
- package/dist/components/LogoutPicker.d.ts +8 -0
- package/dist/components/LogoutPicker.js +61 -0
- package/dist/components/Message.d.ts +10 -0
- package/dist/components/Message.js +234 -0
- package/dist/components/MessageList.d.ts +10 -0
- package/dist/components/MessageList.js +8 -0
- package/dist/components/ProjectPermission.d.ts +7 -0
- package/dist/components/ProjectPermission.js +52 -0
- package/dist/components/Search.d.ts +10 -0
- package/dist/components/Search.js +30 -0
- package/dist/components/SessionPicker.d.ts +9 -0
- package/dist/components/SessionPicker.js +88 -0
- package/dist/components/Sessions.d.ts +12 -0
- package/dist/components/Sessions.js +102 -0
- package/dist/components/Settings.d.ts +7 -0
- package/dist/components/Settings.js +162 -0
- package/dist/components/Status.d.ts +2 -0
- package/dist/components/Status.js +12 -0
- package/dist/config/config.test.d.ts +1 -0
- package/dist/config/config.test.js +157 -0
- package/dist/config/index.d.ts +121 -0
- package/dist/config/index.js +555 -0
- package/dist/config/providers.d.ts +43 -0
- package/dist/config/providers.js +82 -0
- package/dist/config/providers.test.d.ts +1 -0
- package/dist/config/providers.test.js +132 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +38 -0
- package/dist/utils/agent.d.ts +37 -0
- package/dist/utils/agent.js +627 -0
- package/dist/utils/codeReview.d.ts +36 -0
- package/dist/utils/codeReview.js +390 -0
- package/dist/utils/context.d.ts +49 -0
- package/dist/utils/context.js +216 -0
- package/dist/utils/diffPreview.d.ts +57 -0
- package/dist/utils/diffPreview.js +335 -0
- package/dist/utils/export.d.ts +19 -0
- package/dist/utils/export.js +94 -0
- package/dist/utils/git.d.ts +85 -0
- package/dist/utils/git.js +399 -0
- package/dist/utils/git.test.d.ts +1 -0
- package/dist/utils/git.test.js +193 -0
- package/dist/utils/history.d.ts +93 -0
- package/dist/utils/history.js +348 -0
- package/dist/utils/interactive.d.ts +34 -0
- package/dist/utils/interactive.js +206 -0
- package/dist/utils/keychain.d.ts +17 -0
- package/dist/utils/keychain.js +160 -0
- package/dist/utils/learning.d.ts +89 -0
- package/dist/utils/learning.js +330 -0
- package/dist/utils/logger.d.ts +33 -0
- package/dist/utils/logger.js +130 -0
- package/dist/utils/project.d.ts +86 -0
- package/dist/utils/project.js +415 -0
- package/dist/utils/project.test.d.ts +1 -0
- package/dist/utils/project.test.js +212 -0
- package/dist/utils/ratelimit.d.ts +26 -0
- package/dist/utils/ratelimit.js +132 -0
- package/dist/utils/ratelimit.test.d.ts +1 -0
- package/dist/utils/ratelimit.test.js +131 -0
- package/dist/utils/retry.d.ts +28 -0
- package/dist/utils/retry.js +109 -0
- package/dist/utils/retry.test.d.ts +1 -0
- package/dist/utils/retry.test.js +163 -0
- package/dist/utils/search.d.ts +11 -0
- package/dist/utils/search.js +29 -0
- package/dist/utils/shell.d.ts +45 -0
- package/dist/utils/shell.js +242 -0
- package/dist/utils/skills.d.ts +144 -0
- package/dist/utils/skills.js +1137 -0
- package/dist/utils/smartContext.d.ts +29 -0
- package/dist/utils/smartContext.js +441 -0
- package/dist/utils/tools.d.ts +224 -0
- package/dist/utils/tools.js +731 -0
- package/dist/utils/update.d.ts +22 -0
- package/dist/utils/update.js +128 -0
- package/dist/utils/validation.d.ts +28 -0
- package/dist/utils/validation.js +141 -0
- package/dist/utils/validation.test.d.ts +1 -0
- package/dist/utils/validation.test.js +164 -0
- package/dist/utils/verify.d.ts +78 -0
- package/dist/utils/verify.js +464 -0
- package/package.json +68 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { PROVIDERS, getProvider, getProviderList, getProviderModels, getProviderBaseUrl, getProviderAuthHeader, } from './providers';
|
|
3
|
+
describe('providers', () => {
|
|
4
|
+
describe('PROVIDERS constant', () => {
|
|
5
|
+
it('should have z.ai provider', () => {
|
|
6
|
+
expect(PROVIDERS['z.ai']).toBeDefined();
|
|
7
|
+
expect(PROVIDERS['z.ai'].name).toBe('Z.AI (ZhipuAI)');
|
|
8
|
+
});
|
|
9
|
+
it('should have minimax provider', () => {
|
|
10
|
+
expect(PROVIDERS['minimax']).toBeDefined();
|
|
11
|
+
expect(PROVIDERS['minimax'].name).toBe('MiniMax');
|
|
12
|
+
});
|
|
13
|
+
it('should have valid structure for all providers', () => {
|
|
14
|
+
for (const [id, provider] of Object.entries(PROVIDERS)) {
|
|
15
|
+
expect(provider.name).toBeDefined();
|
|
16
|
+
expect(typeof provider.name).toBe('string');
|
|
17
|
+
expect(provider.description).toBeDefined();
|
|
18
|
+
expect(provider.protocols).toBeDefined();
|
|
19
|
+
expect(provider.models).toBeDefined();
|
|
20
|
+
expect(Array.isArray(provider.models)).toBe(true);
|
|
21
|
+
expect(provider.models.length).toBeGreaterThan(0);
|
|
22
|
+
expect(provider.defaultModel).toBeDefined();
|
|
23
|
+
expect(provider.defaultProtocol).toBeDefined();
|
|
24
|
+
expect(['openai', 'anthropic']).toContain(provider.defaultProtocol);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it('should have valid model structure', () => {
|
|
28
|
+
for (const provider of Object.values(PROVIDERS)) {
|
|
29
|
+
for (const model of provider.models) {
|
|
30
|
+
expect(model.id).toBeDefined();
|
|
31
|
+
expect(typeof model.id).toBe('string');
|
|
32
|
+
expect(model.name).toBeDefined();
|
|
33
|
+
expect(typeof model.name).toBe('string');
|
|
34
|
+
expect(model.description).toBeDefined();
|
|
35
|
+
expect(typeof model.description).toBe('string');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
it('should have default model in models list', () => {
|
|
40
|
+
for (const provider of Object.values(PROVIDERS)) {
|
|
41
|
+
const modelIds = provider.models.map(m => m.id);
|
|
42
|
+
expect(modelIds).toContain(provider.defaultModel);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('getProvider', () => {
|
|
47
|
+
it('should return provider config for valid id', () => {
|
|
48
|
+
const provider = getProvider('z.ai');
|
|
49
|
+
expect(provider).not.toBeNull();
|
|
50
|
+
expect(provider.name).toBe('Z.AI (ZhipuAI)');
|
|
51
|
+
});
|
|
52
|
+
it('should return null for invalid id', () => {
|
|
53
|
+
expect(getProvider('nonexistent')).toBeNull();
|
|
54
|
+
expect(getProvider('')).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('getProviderList', () => {
|
|
58
|
+
it('should return list of providers', () => {
|
|
59
|
+
const list = getProviderList();
|
|
60
|
+
expect(Array.isArray(list)).toBe(true);
|
|
61
|
+
expect(list.length).toBeGreaterThan(0);
|
|
62
|
+
});
|
|
63
|
+
it('should include id, name, and description', () => {
|
|
64
|
+
const list = getProviderList();
|
|
65
|
+
for (const item of list) {
|
|
66
|
+
expect(item.id).toBeDefined();
|
|
67
|
+
expect(item.name).toBeDefined();
|
|
68
|
+
expect(item.description).toBeDefined();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it('should include z.ai and minimax', () => {
|
|
72
|
+
const list = getProviderList();
|
|
73
|
+
const ids = list.map(p => p.id);
|
|
74
|
+
expect(ids).toContain('z.ai');
|
|
75
|
+
expect(ids).toContain('minimax');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('getProviderModels', () => {
|
|
79
|
+
it('should return models for valid provider', () => {
|
|
80
|
+
const models = getProviderModels('z.ai');
|
|
81
|
+
expect(Array.isArray(models)).toBe(true);
|
|
82
|
+
expect(models.length).toBeGreaterThan(0);
|
|
83
|
+
});
|
|
84
|
+
it('should return empty array for invalid provider', () => {
|
|
85
|
+
const models = getProviderModels('nonexistent');
|
|
86
|
+
expect(Array.isArray(models)).toBe(true);
|
|
87
|
+
expect(models.length).toBe(0);
|
|
88
|
+
});
|
|
89
|
+
it('should include glm-4.7 for z.ai', () => {
|
|
90
|
+
const models = getProviderModels('z.ai');
|
|
91
|
+
const ids = models.map(m => m.id);
|
|
92
|
+
expect(ids).toContain('glm-4.7');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('getProviderBaseUrl', () => {
|
|
96
|
+
it('should return base URL for valid provider and protocol', () => {
|
|
97
|
+
const url = getProviderBaseUrl('z.ai', 'openai');
|
|
98
|
+
expect(url).not.toBeNull();
|
|
99
|
+
expect(url).toContain('api.z.ai');
|
|
100
|
+
});
|
|
101
|
+
it('should return different URLs for different protocols', () => {
|
|
102
|
+
const openaiUrl = getProviderBaseUrl('z.ai', 'openai');
|
|
103
|
+
const anthropicUrl = getProviderBaseUrl('z.ai', 'anthropic');
|
|
104
|
+
expect(openaiUrl).not.toBe(anthropicUrl);
|
|
105
|
+
});
|
|
106
|
+
it('should return null for invalid provider', () => {
|
|
107
|
+
expect(getProviderBaseUrl('nonexistent', 'openai')).toBeNull();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('getProviderAuthHeader', () => {
|
|
111
|
+
it('should return auth header for valid provider', () => {
|
|
112
|
+
const header = getProviderAuthHeader('z.ai', 'openai');
|
|
113
|
+
expect(['Bearer', 'x-api-key']).toContain(header);
|
|
114
|
+
});
|
|
115
|
+
it('should return Bearer as default for invalid provider', () => {
|
|
116
|
+
expect(getProviderAuthHeader('nonexistent', 'openai')).toBe('Bearer');
|
|
117
|
+
});
|
|
118
|
+
it('should return correct header for each protocol', () => {
|
|
119
|
+
// z.ai uses Bearer for openai and x-api-key for anthropic
|
|
120
|
+
expect(getProviderAuthHeader('z.ai', 'openai')).toBe('Bearer');
|
|
121
|
+
expect(getProviderAuthHeader('z.ai', 'anthropic')).toBe('x-api-key');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('environment variable keys', () => {
|
|
125
|
+
it('should have env key for z.ai', () => {
|
|
126
|
+
expect(PROVIDERS['z.ai'].envKey).toBe('ZAI_API_KEY');
|
|
127
|
+
});
|
|
128
|
+
it('should have env key for minimax', () => {
|
|
129
|
+
expect(PROVIDERS['minimax'].envKey).toBe('MINIMAX_API_KEY');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { render } from 'ink';
|
|
4
|
+
import { App } from './app';
|
|
5
|
+
import { getCurrentVersion } from './utils/update';
|
|
6
|
+
// Handle CLI flags
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
9
|
+
console.log(`Codeep v${getCurrentVersion()}`);
|
|
10
|
+
process.exit(0);
|
|
11
|
+
}
|
|
12
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
13
|
+
console.log(`
|
|
14
|
+
Codeep - AI-powered coding assistant TUI
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
codeep Start interactive chat
|
|
18
|
+
codeep --version Show version
|
|
19
|
+
codeep --help Show this help
|
|
20
|
+
|
|
21
|
+
Commands (in chat):
|
|
22
|
+
/help Show all available commands
|
|
23
|
+
/status Show current status
|
|
24
|
+
/version Show version and current model
|
|
25
|
+
/update Check for updates
|
|
26
|
+
/exit Quit application
|
|
27
|
+
|
|
28
|
+
Documentation: https://codeep.dev
|
|
29
|
+
GitHub: https://github.com/VladoIvankovic/Codeep
|
|
30
|
+
X/Twitter: https://x.com/CodeepDev
|
|
31
|
+
Contact: info@codeep.dev
|
|
32
|
+
`);
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
// Clear screen
|
|
36
|
+
console.clear();
|
|
37
|
+
// Render app
|
|
38
|
+
render(_jsx(App, {}));
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent loop - autonomous task execution
|
|
3
|
+
*/
|
|
4
|
+
import { ProjectContext } from './project';
|
|
5
|
+
import { ToolCall, ToolResult, ActionLog } from './tools';
|
|
6
|
+
import { undoLastAction, undoAllActions, getCurrentSession, getRecentSessions, formatSession, ActionSession } from './history';
|
|
7
|
+
import { VerifyResult } from './verify';
|
|
8
|
+
export interface AgentOptions {
|
|
9
|
+
maxIterations: number;
|
|
10
|
+
maxDuration: number;
|
|
11
|
+
onToolCall?: (tool: ToolCall) => void;
|
|
12
|
+
onToolResult?: (result: ToolResult) => void;
|
|
13
|
+
onIteration?: (iteration: number, message: string) => void;
|
|
14
|
+
onThinking?: (text: string) => void;
|
|
15
|
+
onVerification?: (results: VerifyResult[]) => void;
|
|
16
|
+
abortSignal?: AbortSignal;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
autoVerify?: boolean;
|
|
19
|
+
maxFixAttempts?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface AgentResult {
|
|
22
|
+
success: boolean;
|
|
23
|
+
iterations: number;
|
|
24
|
+
actions: ActionLog[];
|
|
25
|
+
finalResponse: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
aborted?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run the agent loop
|
|
31
|
+
*/
|
|
32
|
+
export declare function runAgent(prompt: string, projectContext: ProjectContext, options?: Partial<AgentOptions>): Promise<AgentResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Format agent result for display
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatAgentResult(result: AgentResult): string;
|
|
37
|
+
export { undoLastAction, undoAllActions, getCurrentSession, getRecentSessions, formatSession, type ActionSession };
|