@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.
Files changed (96) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +161 -0
  4. package/dist/api/client.d.ts +128 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +153 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/index.d.ts +7 -0
  9. package/dist/api/index.d.ts.map +1 -0
  10. package/dist/api/index.js +42 -0
  11. package/dist/api/index.js.map +1 -0
  12. package/dist/cli.d.ts +5 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +72 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands/auth/index.d.ts +3 -0
  17. package/dist/commands/auth/index.d.ts.map +1 -0
  18. package/dist/commands/auth/index.js +13 -0
  19. package/dist/commands/auth/index.js.map +1 -0
  20. package/dist/commands/auth/login.d.ts +3 -0
  21. package/dist/commands/auth/login.d.ts.map +1 -0
  22. package/dist/commands/auth/login.js +174 -0
  23. package/dist/commands/auth/login.js.map +1 -0
  24. package/dist/commands/auth/logout.d.ts +3 -0
  25. package/dist/commands/auth/logout.d.ts.map +1 -0
  26. package/dist/commands/auth/logout.js +56 -0
  27. package/dist/commands/auth/logout.js.map +1 -0
  28. package/dist/commands/auth/whoami.d.ts +3 -0
  29. package/dist/commands/auth/whoami.d.ts.map +1 -0
  30. package/dist/commands/auth/whoami.js +110 -0
  31. package/dist/commands/auth/whoami.js.map +1 -0
  32. package/dist/commands/config.d.ts +3 -0
  33. package/dist/commands/config.d.ts.map +1 -0
  34. package/dist/commands/config.js +102 -0
  35. package/dist/commands/config.js.map +1 -0
  36. package/dist/commands/project/create.d.ts +3 -0
  37. package/dist/commands/project/create.d.ts.map +1 -0
  38. package/dist/commands/project/create.js +146 -0
  39. package/dist/commands/project/create.js.map +1 -0
  40. package/dist/commands/project/index.d.ts +3 -0
  41. package/dist/commands/project/index.d.ts.map +1 -0
  42. package/dist/commands/project/index.js +14 -0
  43. package/dist/commands/project/index.js.map +1 -0
  44. package/dist/commands/project/list.d.ts +3 -0
  45. package/dist/commands/project/list.d.ts.map +1 -0
  46. package/dist/commands/project/list.js +116 -0
  47. package/dist/commands/project/list.js.map +1 -0
  48. package/dist/commands/project/select.d.ts +3 -0
  49. package/dist/commands/project/select.d.ts.map +1 -0
  50. package/dist/commands/project/select.js +147 -0
  51. package/dist/commands/project/select.js.map +1 -0
  52. package/dist/commands/scan.d.ts +3 -0
  53. package/dist/commands/scan.d.ts.map +1 -0
  54. package/dist/commands/scan.js +401 -0
  55. package/dist/commands/scan.js.map +1 -0
  56. package/dist/config/index.d.ts +44 -0
  57. package/dist/config/index.d.ts.map +1 -0
  58. package/dist/config/index.js +237 -0
  59. package/dist/config/index.js.map +1 -0
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +33 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/lib/file-discovery.d.ts +17 -0
  65. package/dist/lib/file-discovery.d.ts.map +1 -0
  66. package/dist/lib/file-discovery.js +218 -0
  67. package/dist/lib/file-discovery.js.map +1 -0
  68. package/dist/lib/patterns.d.ts +18 -0
  69. package/dist/lib/patterns.d.ts.map +1 -0
  70. package/dist/lib/patterns.js +187 -0
  71. package/dist/lib/patterns.js.map +1 -0
  72. package/dist/lib/sarif.d.ts +61 -0
  73. package/dist/lib/sarif.d.ts.map +1 -0
  74. package/dist/lib/sarif.js +169 -0
  75. package/dist/lib/sarif.js.map +1 -0
  76. package/dist/lib/scanner.d.ts +43 -0
  77. package/dist/lib/scanner.d.ts.map +1 -0
  78. package/dist/lib/scanner.js +163 -0
  79. package/dist/lib/scanner.js.map +1 -0
  80. package/dist/lib/slither.d.ts +112 -0
  81. package/dist/lib/slither.d.ts.map +1 -0
  82. package/dist/lib/slither.js +463 -0
  83. package/dist/lib/slither.js.map +1 -0
  84. package/dist/utils/logger.d.ts +14 -0
  85. package/dist/utils/logger.d.ts.map +1 -0
  86. package/dist/utils/logger.js +44 -0
  87. package/dist/utils/logger.js.map +1 -0
  88. package/dist/utils/spinner.d.ts +15 -0
  89. package/dist/utils/spinner.d.ts.map +1 -0
  90. package/dist/utils/spinner.js +55 -0
  91. package/dist/utils/spinner.js.map +1 -0
  92. package/dist/utils/validation.d.ts +12 -0
  93. package/dist/utils/validation.d.ts.map +1 -0
  94. package/dist/utils/validation.js +79 -0
  95. package/dist/utils/validation.js.map +1 -0
  96. 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,5 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ declare const program: Command;
4
+ export default program;
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}