@kairoaisec/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/api/client.d.ts +128 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +153 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +42 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +13 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +174 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +56 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +3 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +110 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +102 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/project/create.d.ts +3 -0
- package/dist/commands/project/create.d.ts.map +1 -0
- package/dist/commands/project/create.js +146 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/index.d.ts +3 -0
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +14 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/list.d.ts +3 -0
- package/dist/commands/project/list.d.ts.map +1 -0
- package/dist/commands/project/list.js +116 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/select.d.ts +3 -0
- package/dist/commands/project/select.d.ts.map +1 -0
- package/dist/commands/project/select.js +147 -0
- package/dist/commands/project/select.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +401 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/config/index.d.ts +44 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +237 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-discovery.d.ts +17 -0
- package/dist/lib/file-discovery.d.ts.map +1 -0
- package/dist/lib/file-discovery.js +218 -0
- package/dist/lib/file-discovery.js.map +1 -0
- package/dist/lib/patterns.d.ts +18 -0
- package/dist/lib/patterns.d.ts.map +1 -0
- package/dist/lib/patterns.js +187 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/sarif.d.ts +61 -0
- package/dist/lib/sarif.d.ts.map +1 -0
- package/dist/lib/sarif.js +169 -0
- package/dist/lib/sarif.js.map +1 -0
- package/dist/lib/scanner.d.ts +43 -0
- package/dist/lib/scanner.d.ts.map +1 -0
- package/dist/lib/scanner.js +163 -0
- package/dist/lib/scanner.js.map +1 -0
- package/dist/lib/slither.d.ts +112 -0
- package/dist/lib/slither.d.ts.map +1 -0
- package/dist/lib/slither.js +463 -0
- package/dist/lib/slither.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/spinner.d.ts +15 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +55 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +79 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the Kairo CLI will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2026-01-29
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **CLI Foundation**: Complete CLI framework with commander.js
|
|
12
|
+
- **Authentication System**:
|
|
13
|
+
- `kairo auth login` - OAuth and API key login
|
|
14
|
+
- `kairo auth logout` - Secure logout with confirmation
|
|
15
|
+
- `kairo auth whoami` - User information display
|
|
16
|
+
- **Project Management**:
|
|
17
|
+
- `kairo project create <name>` - Create new projects
|
|
18
|
+
- `kairo project list` - List all projects
|
|
19
|
+
- `kairo project select <name>` - Select active project
|
|
20
|
+
- **Configuration Management**:
|
|
21
|
+
- `kairo config get/set` - Configuration management
|
|
22
|
+
- `kairo config reset` - Reset configuration
|
|
23
|
+
- Secure credential storage with keytar
|
|
24
|
+
- **API Client**: Complete V1 API integration
|
|
25
|
+
- Authentication with Bearer tokens
|
|
26
|
+
- Project management endpoints
|
|
27
|
+
- Analysis endpoints (ready for scanning implementation)
|
|
28
|
+
- Error handling and retry logic
|
|
29
|
+
- **Testing**: Unit tests for core functionality
|
|
30
|
+
- **Documentation**: Comprehensive README and examples
|
|
31
|
+
|
|
32
|
+
### Development
|
|
33
|
+
- TypeScript setup with CommonJS output
|
|
34
|
+
- ESLint and Prettier configuration ready
|
|
35
|
+
- Testing with Vitest
|
|
36
|
+
- Modular command structure for easy extension
|
|
37
|
+
|
|
38
|
+
### Security
|
|
39
|
+
- Secure token storage using system keychain
|
|
40
|
+
- API key validation
|
|
41
|
+
- OAuth flow with local callback server
|
|
42
|
+
|
|
43
|
+
### Next Phase
|
|
44
|
+
- Contract scanning implementation
|
|
45
|
+
- Slither integration
|
|
46
|
+
- CI/CD GitHub Action
|
|
47
|
+
- Dashboard findings integration
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Kairo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Kairo CLI
|
|
2
|
+
|
|
3
|
+
The official command-line interface for Kairo, the AI-powered smart contract security platform.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @kairo/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
1. **Login to your Kairo account:**
|
|
14
|
+
```bash
|
|
15
|
+
kairo auth login
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
2. **Create or select a project:**
|
|
19
|
+
```bash
|
|
20
|
+
kairo project create my-project
|
|
21
|
+
kairo project select my-project
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
3. **Scan your contracts:**
|
|
25
|
+
```bash
|
|
26
|
+
kairo scan ./contracts
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Commands
|
|
30
|
+
|
|
31
|
+
### Authentication
|
|
32
|
+
|
|
33
|
+
- `kairo auth login` - Login to your Kairo account
|
|
34
|
+
- `kairo auth logout` - Logout from your account
|
|
35
|
+
- `kairo auth whoami` - Show current user information
|
|
36
|
+
|
|
37
|
+
### Project Management
|
|
38
|
+
|
|
39
|
+
- `kairo project create <name>` - Create a new project
|
|
40
|
+
- `kairo project list` - List all projects
|
|
41
|
+
- `kairo project select <name>` - Select active project
|
|
42
|
+
|
|
43
|
+
### Security Scanning
|
|
44
|
+
|
|
45
|
+
- `kairo scan [path]` - Scan contracts for vulnerabilities *(coming soon)*
|
|
46
|
+
|
|
47
|
+
### Configuration
|
|
48
|
+
|
|
49
|
+
- `kairo config get [key]` - View configuration
|
|
50
|
+
- `kairo config set <key> <value>` - Set configuration value
|
|
51
|
+
- `kairo config reset` - Reset configuration
|
|
52
|
+
- `kairo config path` - Show config file location
|
|
53
|
+
|
|
54
|
+
## Examples
|
|
55
|
+
|
|
56
|
+
### Basic Workflow
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Login
|
|
60
|
+
kairo auth login
|
|
61
|
+
|
|
62
|
+
# Create a project
|
|
63
|
+
kairo project create defi-protocol --description "My DeFi protocol"
|
|
64
|
+
|
|
65
|
+
# Select the project
|
|
66
|
+
kairo project select defi-protocol
|
|
67
|
+
|
|
68
|
+
# Check status
|
|
69
|
+
kairo whoami
|
|
70
|
+
|
|
71
|
+
# Scan contracts (coming soon)
|
|
72
|
+
kairo scan ./contracts --critical
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### API Key Authentication
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Login with API key instead of OAuth
|
|
79
|
+
kairo auth login --api-key k_your_api_key_here
|
|
80
|
+
|
|
81
|
+
# Create API key via CLI
|
|
82
|
+
kairo project select my-project # Select project first
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Configuration Management
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# View all configuration
|
|
89
|
+
kairo config get
|
|
90
|
+
|
|
91
|
+
# Set custom API URL
|
|
92
|
+
kairo config set apiUrl https://api.kairoaisec.com
|
|
93
|
+
|
|
94
|
+
# Reset everything
|
|
95
|
+
kairo config reset
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Configuration
|
|
99
|
+
|
|
100
|
+
Configuration is stored securely using:
|
|
101
|
+
- **Keychain/Credential Manager** - For sensitive tokens
|
|
102
|
+
- **Local config file** - For non-sensitive settings
|
|
103
|
+
|
|
104
|
+
Default API URL: `https://kairoaisec.com`
|
|
105
|
+
|
|
106
|
+
## Roadmap
|
|
107
|
+
|
|
108
|
+
This CLI is part of Kairo's strategic pivot to enterprise CLI + Dashboard. Current status:
|
|
109
|
+
|
|
110
|
+
### ✅ Phase 0: Foundation (Current)
|
|
111
|
+
- [x] Authentication system
|
|
112
|
+
- [x] Project management
|
|
113
|
+
- [x] API client integration
|
|
114
|
+
- [x] Configuration management
|
|
115
|
+
|
|
116
|
+
### 🚧 Phase 0: MVP (Next)
|
|
117
|
+
- [ ] Local contract scanning
|
|
118
|
+
- [ ] Slither integration
|
|
119
|
+
- [ ] Findings upload to dashboard
|
|
120
|
+
- [ ] Progress indicators
|
|
121
|
+
|
|
122
|
+
### 🔮 Phase 1: CI/CD Integration
|
|
123
|
+
- [ ] GitHub Actions integration
|
|
124
|
+
- [ ] PR annotations
|
|
125
|
+
- [ ] Deployment gates
|
|
126
|
+
|
|
127
|
+
### 🔮 Phase 2: Advanced Features
|
|
128
|
+
- [ ] Mythril integration
|
|
129
|
+
- [ ] AI chat in terminal
|
|
130
|
+
- [ ] Custom rules
|
|
131
|
+
|
|
132
|
+
## Development
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Clone the repo
|
|
136
|
+
git clone https://github.com/kairoaisec/kairo.git
|
|
137
|
+
cd kairo/packages/cli
|
|
138
|
+
|
|
139
|
+
# Install dependencies
|
|
140
|
+
npm install
|
|
141
|
+
|
|
142
|
+
# Build
|
|
143
|
+
npm run build
|
|
144
|
+
|
|
145
|
+
# Development mode
|
|
146
|
+
npm run dev
|
|
147
|
+
|
|
148
|
+
# Test locally
|
|
149
|
+
npm link
|
|
150
|
+
kairo --help
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Support
|
|
154
|
+
|
|
155
|
+
- 📚 [Documentation](https://docs.kairoaisec.com)
|
|
156
|
+
- 🐛 [Report Issues](https://github.com/kairoaisec/kairo/issues)
|
|
157
|
+
- 💬 [Discord Community](https://discord.gg/kairo)
|
|
158
|
+
|
|
159
|
+
## License
|
|
160
|
+
|
|
161
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
export interface ApiError {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ApiResponse<T = any> {
|
|
6
|
+
data?: T;
|
|
7
|
+
error?: ApiError;
|
|
8
|
+
}
|
|
9
|
+
export interface AnalyzeRequest {
|
|
10
|
+
source: {
|
|
11
|
+
type: 'inline' | 'github';
|
|
12
|
+
files: Array<{
|
|
13
|
+
path: string;
|
|
14
|
+
content: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
project_id?: string;
|
|
18
|
+
config?: {
|
|
19
|
+
severity_threshold?: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
20
|
+
include_suggestions?: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface Finding {
|
|
24
|
+
id: string;
|
|
25
|
+
type: string;
|
|
26
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
27
|
+
confidence: number;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
location: {
|
|
31
|
+
file: string;
|
|
32
|
+
line_start?: number;
|
|
33
|
+
line_end?: number;
|
|
34
|
+
};
|
|
35
|
+
suggestion?: string | null;
|
|
36
|
+
cwe_id?: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface VulnerabilitySummary {
|
|
39
|
+
total: number;
|
|
40
|
+
critical: number;
|
|
41
|
+
high: number;
|
|
42
|
+
medium: number;
|
|
43
|
+
low: number;
|
|
44
|
+
info: number;
|
|
45
|
+
}
|
|
46
|
+
export interface CIAnnotation {
|
|
47
|
+
status: 'success' | 'failure' | 'neutral';
|
|
48
|
+
title: string;
|
|
49
|
+
summary: string;
|
|
50
|
+
}
|
|
51
|
+
export interface AnalyzeResponse {
|
|
52
|
+
decision: 'ALLOW' | 'WARN' | 'BLOCK';
|
|
53
|
+
decision_reason: string;
|
|
54
|
+
scan_id: string;
|
|
55
|
+
risk_score: number;
|
|
56
|
+
summary: VulnerabilitySummary;
|
|
57
|
+
findings: Finding[];
|
|
58
|
+
ci_annotation: CIAnnotation;
|
|
59
|
+
analyzed_at: string;
|
|
60
|
+
}
|
|
61
|
+
export interface ApiKey {
|
|
62
|
+
id: string;
|
|
63
|
+
name: string;
|
|
64
|
+
environment: string;
|
|
65
|
+
key_preview: string;
|
|
66
|
+
expires_at?: string;
|
|
67
|
+
last_used?: string;
|
|
68
|
+
created_at: string;
|
|
69
|
+
project_id?: string;
|
|
70
|
+
project_name?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ApiProject {
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
description?: string;
|
|
76
|
+
created_at: string;
|
|
77
|
+
updated_at: string;
|
|
78
|
+
}
|
|
79
|
+
export declare class KairoApiClient {
|
|
80
|
+
private client;
|
|
81
|
+
private apiUrl;
|
|
82
|
+
constructor(apiUrl?: string, apiKey?: string);
|
|
83
|
+
private handleApiError;
|
|
84
|
+
private makeRequest;
|
|
85
|
+
createApiKey(data: {
|
|
86
|
+
project_id?: string;
|
|
87
|
+
name?: string;
|
|
88
|
+
environment?: string;
|
|
89
|
+
expires_in_days?: number;
|
|
90
|
+
}): Promise<ApiKey>;
|
|
91
|
+
listApiKeys(projectId?: string): Promise<{
|
|
92
|
+
api_keys: ApiKey[];
|
|
93
|
+
}>;
|
|
94
|
+
rotateApiKey(keyId: string): Promise<ApiKey>;
|
|
95
|
+
deleteApiKey(keyId: string): Promise<void>;
|
|
96
|
+
validateAuth(): Promise<{
|
|
97
|
+
valid: boolean;
|
|
98
|
+
userId?: string;
|
|
99
|
+
}>;
|
|
100
|
+
getUserInfo(): Promise<any>;
|
|
101
|
+
analyzeCode(request: AnalyzeRequest): Promise<AnalyzeResponse>;
|
|
102
|
+
listProjects(): Promise<{
|
|
103
|
+
projects: ApiProject[];
|
|
104
|
+
}>;
|
|
105
|
+
createProject(data: {
|
|
106
|
+
name: string;
|
|
107
|
+
description?: string;
|
|
108
|
+
source?: string;
|
|
109
|
+
}): Promise<{
|
|
110
|
+
project: ApiProject;
|
|
111
|
+
}>;
|
|
112
|
+
getProject(projectId: string): Promise<ApiProject>;
|
|
113
|
+
updateProject(projectId: string, data: {
|
|
114
|
+
name?: string;
|
|
115
|
+
description?: string;
|
|
116
|
+
}): Promise<ApiProject>;
|
|
117
|
+
deleteProject(projectId: string): Promise<void>;
|
|
118
|
+
deployCheck(data: {
|
|
119
|
+
contract_code: string;
|
|
120
|
+
deployment_network: string;
|
|
121
|
+
contract_address?: string;
|
|
122
|
+
}): Promise<any>;
|
|
123
|
+
healthCheck(): Promise<{
|
|
124
|
+
status: string;
|
|
125
|
+
}>;
|
|
126
|
+
}
|
|
127
|
+
export default KairoApiClient;
|
|
128
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KairoApiClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
const RETRY_DELAYS = [1000, 2000, 4000]; // Exponential backoff
|
|
11
|
+
const RETRYABLE_CODES = [408, 429, 500, 502, 503, 504];
|
|
12
|
+
class KairoApiClient {
|
|
13
|
+
client;
|
|
14
|
+
apiUrl;
|
|
15
|
+
constructor(apiUrl, apiKey) {
|
|
16
|
+
this.apiUrl = apiUrl || config_1.configManager.get('apiUrl') || 'https://kairoaisec.com';
|
|
17
|
+
this.client = axios_1.default.create({
|
|
18
|
+
baseURL: `${this.apiUrl}/api/v1`,
|
|
19
|
+
timeout: 30000, // 30 seconds
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
'User-Agent': 'kairo-cli/0.1.0',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
// Add request interceptor for authentication
|
|
26
|
+
this.client.interceptors.request.use(async (config) => {
|
|
27
|
+
const token = apiKey ||
|
|
28
|
+
process.env.KAIRO_API_KEY ||
|
|
29
|
+
(await config_1.configManager.getAuthToken()) ||
|
|
30
|
+
(await config_1.configManager.getApiKey());
|
|
31
|
+
if (token) {
|
|
32
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
33
|
+
}
|
|
34
|
+
return config;
|
|
35
|
+
}, (error) => Promise.reject(error));
|
|
36
|
+
// Add response interceptor for error handling
|
|
37
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
|
38
|
+
const apiError = this.handleApiError(error);
|
|
39
|
+
return Promise.reject(apiError);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
handleApiError(error) {
|
|
43
|
+
if (error.response?.data) {
|
|
44
|
+
const errorData = error.response.data;
|
|
45
|
+
if (errorData.error) {
|
|
46
|
+
const message = `API Error (${errorData.error.code}): ${errorData.error.message}`;
|
|
47
|
+
const apiError = new Error(message);
|
|
48
|
+
apiError.code = errorData.error.code;
|
|
49
|
+
apiError.statusCode = error.response.status;
|
|
50
|
+
return apiError;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (error.code === 'ECONNREFUSED') {
|
|
54
|
+
return new Error('Unable to connect to Kairo API. Please check your internet connection.');
|
|
55
|
+
}
|
|
56
|
+
if (error.code === 'ENOTFOUND') {
|
|
57
|
+
return new Error('Unable to resolve Kairo API hostname. Please check your network configuration.');
|
|
58
|
+
}
|
|
59
|
+
return new Error(error.message || 'Unknown API error occurred');
|
|
60
|
+
}
|
|
61
|
+
async makeRequest(method, endpoint, data, config) {
|
|
62
|
+
let lastError;
|
|
63
|
+
for (let attempt = 0; attempt <= RETRY_DELAYS.length; attempt++) {
|
|
64
|
+
try {
|
|
65
|
+
const response = await this.client.request({
|
|
66
|
+
method,
|
|
67
|
+
url: endpoint,
|
|
68
|
+
data,
|
|
69
|
+
...config,
|
|
70
|
+
});
|
|
71
|
+
return response.data;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
lastError = error;
|
|
75
|
+
// Don't retry on final attempt
|
|
76
|
+
if (attempt === RETRY_DELAYS.length)
|
|
77
|
+
break;
|
|
78
|
+
// Check if error is retryable
|
|
79
|
+
const statusCode = error.response?.status;
|
|
80
|
+
const isRetryable = RETRYABLE_CODES.includes(statusCode) || !error.response;
|
|
81
|
+
if (!isRetryable)
|
|
82
|
+
break;
|
|
83
|
+
// Wait before retry
|
|
84
|
+
const delay = RETRY_DELAYS[attempt];
|
|
85
|
+
logger_1.Logger.debug(`Request failed, retrying in ${delay}ms (attempt ${attempt + 1})`);
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
logger_1.Logger.debug(`API request failed: ${method} ${endpoint}`, lastError);
|
|
90
|
+
throw lastError;
|
|
91
|
+
}
|
|
92
|
+
// Authentication & API Keys
|
|
93
|
+
async createApiKey(data) {
|
|
94
|
+
return this.makeRequest('POST', '/keys', data);
|
|
95
|
+
}
|
|
96
|
+
async listApiKeys(projectId) {
|
|
97
|
+
const params = projectId ? { project_id: projectId } : {};
|
|
98
|
+
return this.makeRequest('GET', '/keys', null, { params });
|
|
99
|
+
}
|
|
100
|
+
async rotateApiKey(keyId) {
|
|
101
|
+
return this.makeRequest('POST', `/keys/${keyId}/rotate`);
|
|
102
|
+
}
|
|
103
|
+
async deleteApiKey(keyId) {
|
|
104
|
+
return this.makeRequest('DELETE', `/keys/${keyId}`);
|
|
105
|
+
}
|
|
106
|
+
// Authentication validation
|
|
107
|
+
async validateAuth() {
|
|
108
|
+
return this.makeRequest('GET', '/auth/validate');
|
|
109
|
+
}
|
|
110
|
+
// User information (for whoami command)
|
|
111
|
+
async getUserInfo() {
|
|
112
|
+
// First validate auth to get user ID, then get user details
|
|
113
|
+
const authResult = await this.validateAuth();
|
|
114
|
+
if (!authResult.valid) {
|
|
115
|
+
throw new Error('Authentication invalid');
|
|
116
|
+
}
|
|
117
|
+
return authResult;
|
|
118
|
+
}
|
|
119
|
+
// Analysis
|
|
120
|
+
async analyzeCode(request) {
|
|
121
|
+
return this.makeRequest('POST', '/analyze', request);
|
|
122
|
+
}
|
|
123
|
+
// Projects
|
|
124
|
+
async listProjects() {
|
|
125
|
+
return this.makeRequest('GET', '/projects');
|
|
126
|
+
}
|
|
127
|
+
async createProject(data) {
|
|
128
|
+
return this.makeRequest('POST', '/projects', {
|
|
129
|
+
...data,
|
|
130
|
+
source: 'cli',
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async getProject(projectId) {
|
|
134
|
+
return this.makeRequest('GET', `/projects/${projectId}`);
|
|
135
|
+
}
|
|
136
|
+
async updateProject(projectId, data) {
|
|
137
|
+
return this.makeRequest('PATCH', `/projects/${projectId}`, data);
|
|
138
|
+
}
|
|
139
|
+
async deleteProject(projectId) {
|
|
140
|
+
return this.makeRequest('DELETE', `/projects/${projectId}`);
|
|
141
|
+
}
|
|
142
|
+
// Deploy Safety Check
|
|
143
|
+
async deployCheck(data) {
|
|
144
|
+
return this.makeRequest('POST', '/deploy/check', data);
|
|
145
|
+
}
|
|
146
|
+
// Health Check
|
|
147
|
+
async healthCheck() {
|
|
148
|
+
return this.makeRequest('GET', '/health');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.KairoApiClient = KairoApiClient;
|
|
152
|
+
exports.default = KairoApiClient;
|
|
153
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import KairoApiClient from './client';
|
|
2
|
+
export declare const getApiClient: () => KairoApiClient;
|
|
3
|
+
export declare const createApiClient: (apiUrl?: string, apiKey?: string) => KairoApiClient;
|
|
4
|
+
export declare const resetApiClient: () => void;
|
|
5
|
+
export * from './client';
|
|
6
|
+
export default getApiClient;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,UAAU,CAAC;AAKtC,eAAO,MAAM,YAAY,QAAO,cAM/B,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,cAElE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,IAEjC,CAAC;AAEF,cAAc,UAAU,CAAC;AACzB,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.resetApiClient = exports.createApiClient = exports.getApiClient = void 0;
|
|
21
|
+
const client_1 = __importDefault(require("./client"));
|
|
22
|
+
const config_1 = require("../config");
|
|
23
|
+
let apiClientInstance = null;
|
|
24
|
+
const getApiClient = () => {
|
|
25
|
+
if (!apiClientInstance) {
|
|
26
|
+
const apiUrl = config_1.configManager.get('apiUrl');
|
|
27
|
+
apiClientInstance = new client_1.default(apiUrl);
|
|
28
|
+
}
|
|
29
|
+
return apiClientInstance;
|
|
30
|
+
};
|
|
31
|
+
exports.getApiClient = getApiClient;
|
|
32
|
+
const createApiClient = (apiUrl, apiKey) => {
|
|
33
|
+
return new client_1.default(apiUrl, apiKey);
|
|
34
|
+
};
|
|
35
|
+
exports.createApiClient = createApiClient;
|
|
36
|
+
const resetApiClient = () => {
|
|
37
|
+
apiClientInstance = null;
|
|
38
|
+
};
|
|
39
|
+
exports.resetApiClient = resetApiClient;
|
|
40
|
+
__exportStar(require("./client"), exports);
|
|
41
|
+
exports.default = exports.getApiClient;
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,sDAAsC;AACtC,sCAA0C;AAE1C,IAAI,iBAAiB,GAA0B,IAAI,CAAC;AAE7C,MAAM,YAAY,GAAG,GAAmB,EAAE;IAC/C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,sBAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,iBAAiB,GAAG,IAAI,gBAAc,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC;AANW,QAAA,YAAY,gBAMvB;AAEK,MAAM,eAAe,GAAG,CAAC,MAAe,EAAE,MAAe,EAAkB,EAAE;IAClF,OAAO,IAAI,gBAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC,CAAC;AAFW,QAAA,eAAe,mBAE1B;AAEK,MAAM,cAAc,GAAG,GAAS,EAAE;IACvC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB;AAEF,2CAAyB;AACzB,kBAAe,oBAAY,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAoE9B,eAAe,OAAO,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const auth_1 = require("./commands/auth");
|
|
10
|
+
const project_1 = require("./commands/project");
|
|
11
|
+
const scan_1 = require("./commands/scan");
|
|
12
|
+
const config_1 = require("./commands/config");
|
|
13
|
+
const program = new commander_1.Command();
|
|
14
|
+
// CLI metadata
|
|
15
|
+
program
|
|
16
|
+
.name('kairo')
|
|
17
|
+
.description('Kairo CLI for smart contract security scanning')
|
|
18
|
+
.version('0.1.0', '-v, --version', 'display version number');
|
|
19
|
+
// Global options
|
|
20
|
+
program
|
|
21
|
+
.option('--debug', 'enable debug output')
|
|
22
|
+
.option('--api-url <url>', 'override API URL')
|
|
23
|
+
.option('--no-color', 'disable colored output');
|
|
24
|
+
// Commands
|
|
25
|
+
program
|
|
26
|
+
.addCommand(auth_1.authCommand)
|
|
27
|
+
.addCommand(project_1.projectCommand)
|
|
28
|
+
.addCommand(scan_1.scanCommand)
|
|
29
|
+
.addCommand(config_1.configCommand);
|
|
30
|
+
// Help customization
|
|
31
|
+
program.configureHelp({
|
|
32
|
+
sortSubcommands: true,
|
|
33
|
+
subcommandTerm: (cmd) => cmd.name(),
|
|
34
|
+
});
|
|
35
|
+
// Custom help
|
|
36
|
+
program.on('--help', () => {
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(chalk_1.default.cyan('Examples:'));
|
|
39
|
+
console.log(' $ kairo auth login # Login to your Kairo account');
|
|
40
|
+
console.log(' $ kairo project create my-project # Create a new project');
|
|
41
|
+
console.log(' $ kairo scan ./contracts # Scan contracts directory');
|
|
42
|
+
console.log(' $ kairo scan contract.sol --critical # Scan single file, fail on critical');
|
|
43
|
+
console.log('');
|
|
44
|
+
console.log(chalk_1.default.cyan('Get help:'));
|
|
45
|
+
console.log(' $ kairo <command> --help # Command-specific help');
|
|
46
|
+
console.log(' $ kairo auth --help # Auth command help');
|
|
47
|
+
console.log('');
|
|
48
|
+
console.log(chalk_1.default.dim('For more information, visit: https://docs.kairoaisec.com'));
|
|
49
|
+
});
|
|
50
|
+
// Handle unrecognized commands
|
|
51
|
+
program.on('command:*', () => {
|
|
52
|
+
console.error(chalk_1.default.red(`Invalid command: ${program.args.join(' ')}`));
|
|
53
|
+
console.log('See --help for a list of available commands.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
});
|
|
56
|
+
// Global error handler
|
|
57
|
+
process.on('uncaughtException', (error) => {
|
|
58
|
+
console.error(chalk_1.default.red('Unexpected error occurred:'), error.message);
|
|
59
|
+
if (program.opts().debug) {
|
|
60
|
+
console.error(error.stack);
|
|
61
|
+
}
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
// Parse command line arguments
|
|
65
|
+
program.parse();
|
|
66
|
+
// If no command provided, show help
|
|
67
|
+
if (!process.argv.slice(2).length) {
|
|
68
|
+
program.outputHelp();
|
|
69
|
+
}
|
|
70
|
+
// Export the program for testing and library use
|
|
71
|
+
exports.default = program;
|
|
72
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,gDAAoD;AACpD,0CAA8C;AAC9C,8CAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,eAAe;AACf,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,wBAAwB,CAAC,CAAC;AAE/D,iBAAiB;AACjB,OAAO;KACJ,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;KACxC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;KAC7C,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAElD,WAAW;AACX,OAAO;KACJ,UAAU,CAAC,kBAAW,CAAC;KACvB,UAAU,CAAC,wBAAc,CAAC;KAC1B,UAAU,CAAC,kBAAW,CAAC;KACvB,UAAU,CAAC,sBAAa,CAAC,CAAC;AAE7B,qBAAqB;AACrB,OAAO,CAAC,aAAa,CAAC;IACpB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE;CACpC,CAAC,CAAC;AAEH,cAAc;AACd,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,uBAAuB;AACvB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,oCAAoC;AACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC;AAED,iDAAiD;AACjD,kBAAe,OAAO,CAAC"}
|