@nathapp/koda-cli 0.0.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/client.d.ts +9 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +91 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +57 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +20 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/kb.d.ts +3 -0
- package/dist/commands/kb.d.ts.map +1 -0
- package/dist/commands/kb.js +137 -0
- package/dist/commands/kb.js.map +1 -0
- package/dist/commands/label.d.ts +3 -0
- package/dist/commands/label.d.ts.map +1 -0
- package/dist/commands/label.js +105 -0
- package/dist/commands/label.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +26 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +148 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/ticket.d.ts +3 -0
- package/dist/commands/ticket.d.ts.map +1 -0
- package/dist/commands/ticket.js +538 -0
- package/dist/commands/ticket.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +68 -0
- package/dist/config.js.map +1 -0
- package/dist/generated.d.ts +185 -0
- package/dist/generated.d.ts.map +1 -0
- package/dist/generated.js +119 -0
- package/dist/generated.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +10 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +32 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/auth.d.ts +9 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +14 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/error.d.ts +14 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +42 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/output.d.ts +28 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +80 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +38 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* Configure and return an Axios client with Bearer token authorization.
|
|
4
|
+
* @param baseUrl API base URL (e.g., http://localhost:3100/api)
|
|
5
|
+
* @param apiKey API key for Bearer token
|
|
6
|
+
* @returns Configured AxiosInstance
|
|
7
|
+
*/
|
|
8
|
+
export declare function configureClient(baseUrl: string, apiKey: string): AxiosInstance;
|
|
9
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAQ9E"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
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.configureClient = configureClient;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
/**
|
|
9
|
+
* Configure and return an Axios client with Bearer token authorization.
|
|
10
|
+
* @param baseUrl API base URL (e.g., http://localhost:3100/api)
|
|
11
|
+
* @param apiKey API key for Bearer token
|
|
12
|
+
* @returns Configured AxiosInstance
|
|
13
|
+
*/
|
|
14
|
+
function configureClient(baseUrl, apiKey) {
|
|
15
|
+
return axios_1.default.create({
|
|
16
|
+
baseURL: baseUrl,
|
|
17
|
+
headers: {
|
|
18
|
+
Authorization: `Bearer ${apiKey}`,
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;;;AAQA,0CAQC;AAhBD,kDAA6C;AAE7C;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAAe,EAAE,MAAc;IAC7D,OAAO,eAAK,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoFnD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.agentCommand = agentCommand;
|
|
4
|
+
const auth_1 = require("../utils/auth");
|
|
5
|
+
const client_1 = require("../client");
|
|
6
|
+
const generated_1 = require("../generated");
|
|
7
|
+
const output_1 = require("../utils/output");
|
|
8
|
+
const api_1 = require("../utils/api");
|
|
9
|
+
const error_1 = require("../utils/error");
|
|
10
|
+
function maskApiKey(apiKey) {
|
|
11
|
+
if (apiKey.length <= 8) {
|
|
12
|
+
return '****';
|
|
13
|
+
}
|
|
14
|
+
return apiKey.substring(0, 4) + '*'.repeat(apiKey.length - 8) + apiKey.substring(apiKey.length - 4);
|
|
15
|
+
}
|
|
16
|
+
function agentCommand(program) {
|
|
17
|
+
const agent = program.command('agent');
|
|
18
|
+
agent
|
|
19
|
+
.command('me')
|
|
20
|
+
.description('Display current authenticated agent profile')
|
|
21
|
+
.option('--json', 'Output as JSON')
|
|
22
|
+
.action(async (options) => {
|
|
23
|
+
try {
|
|
24
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
25
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
26
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
27
|
+
process.exit(2);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
31
|
+
const response = await generated_1.AgentService.me(client);
|
|
32
|
+
const agentData = (0, api_1.unwrap)(response);
|
|
33
|
+
if (options.json) {
|
|
34
|
+
console.log(JSON.stringify(agentData, null, 2));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log(`Name: ${agentData.name}`);
|
|
38
|
+
console.log(`Slug: ${agentData.slug}`);
|
|
39
|
+
console.log(`API Key: ${maskApiKey(agentData.apiKey)}`);
|
|
40
|
+
}
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
(0, error_1.handleApiError)(err);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
agent
|
|
48
|
+
.command('pickup')
|
|
49
|
+
.description('Suggest the best ticket for this agent to pick up')
|
|
50
|
+
.option('--project <slug>', 'Project slug')
|
|
51
|
+
.option('--json', 'Output as JSON')
|
|
52
|
+
.action(async (options) => {
|
|
53
|
+
try {
|
|
54
|
+
if (!options.project) {
|
|
55
|
+
(0, output_1.error)('--project <slug> is required');
|
|
56
|
+
process.exit(3);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
60
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
61
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
62
|
+
process.exit(2);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
66
|
+
const meResponse = await generated_1.AgentService.me(client);
|
|
67
|
+
const agentData = (0, api_1.unwrap)(meResponse);
|
|
68
|
+
const pickupResponse = await generated_1.AgentService.pickup(client, agentData.slug, options.project);
|
|
69
|
+
const result = (0, api_1.unwrap)(pickupResponse);
|
|
70
|
+
if (options.json) {
|
|
71
|
+
console.log(JSON.stringify(result, null, 2));
|
|
72
|
+
process.exit(0);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (result === null) {
|
|
76
|
+
console.log('No suitable tickets found for pickup.');
|
|
77
|
+
process.exit(0);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const { ticket, matchScore, matchedCapabilities } = result;
|
|
81
|
+
console.log(`Suggested ticket: #${ticket.number} — ${ticket.title}`);
|
|
82
|
+
console.log(`Priority: ${ticket.priority} | Status: ${ticket.status}`);
|
|
83
|
+
console.log(`Match score: ${matchScore} | Matched capabilities: ${matchedCapabilities.join(', ')}`);
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
(0, error_1.handleApiError)(err);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDrD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.commentCommand = commentCommand;
|
|
4
|
+
const auth_1 = require("../utils/auth");
|
|
5
|
+
const client_1 = require("../client");
|
|
6
|
+
const generated_1 = require("../generated");
|
|
7
|
+
const output_1 = require("../utils/output");
|
|
8
|
+
const api_1 = require("../utils/api");
|
|
9
|
+
const error_1 = require("../utils/error");
|
|
10
|
+
function commentCommand(program) {
|
|
11
|
+
const comment = program.command('comment');
|
|
12
|
+
comment
|
|
13
|
+
.command('add <ref>')
|
|
14
|
+
.description('Add a comment to a ticket')
|
|
15
|
+
.option('--project <slug>', 'Project slug')
|
|
16
|
+
.requiredOption('--body <text>', 'Comment body text')
|
|
17
|
+
.option('--type <type>', 'Comment type (GENERAL|VERIFICATION|FIX_REPORT|REVIEW)', 'GENERAL')
|
|
18
|
+
.option('--json', 'Output as JSON')
|
|
19
|
+
.action(async (ref, options) => {
|
|
20
|
+
try {
|
|
21
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
22
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
23
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
24
|
+
process.exit(2);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Validate comment type
|
|
28
|
+
const validTypes = ['GENERAL', 'VERIFICATION', 'FIX_REPORT', 'REVIEW'];
|
|
29
|
+
if (!validTypes.includes(options.type)) {
|
|
30
|
+
(0, output_1.error)(`Invalid type ${options.type}. Valid values: ${validTypes.join(', ')}`);
|
|
31
|
+
process.exit(3);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const projectSlug = options.project || process.env['GLOBAL_PROJECT_SLUG'] || 'koda';
|
|
35
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
36
|
+
const response = await generated_1.CommentsService.add(client, projectSlug, ref, {
|
|
37
|
+
body: options.body,
|
|
38
|
+
type: options.type,
|
|
39
|
+
});
|
|
40
|
+
const commentData = (0, api_1.unwrap)(response);
|
|
41
|
+
if (options.json) {
|
|
42
|
+
console.log(JSON.stringify(commentData, null, 2));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
(0, output_1.success)(`Comment added to ${ref}`);
|
|
46
|
+
console.log(`ID: ${commentData.id}`);
|
|
47
|
+
console.log(`Type: ${commentData.type}`);
|
|
48
|
+
console.log(`Body: ${commentData.body}`);
|
|
49
|
+
}
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
(0, error_1.handleApiError)(err, { notFoundMessage: `Ticket not found: ${ref}` });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/commands/comment.ts"],"names":[],"mappings":";;AAQA,wCAkDC;AAzDD,wCAA4C;AAC5C,sCAA4C;AAC5C,4CAA+C;AAC/C,4CAAiD;AACjD,sCAAsC;AACtC,0CAAgD;AAEhD,SAAgB,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE3C,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC;SAC1C,cAAc,CAAC,eAAe,EAAE,mBAAmB,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,uDAAuD,EAAE,SAAS,CAAC;SAC3F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAAO,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,kBAAW,EAAC,EAAE,CAAC,CAAC;YAE7B,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,IAAA,cAAK,EAAC,gEAAgE,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,wBAAwB;YACxB,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,IAAA,cAAK,EAAC,gBAAgB,OAAO,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC;YACpF,MAAM,MAAM,GAAG,IAAA,wBAAe,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,MAAM,2BAAe,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE;gBACnE,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,YAAM,EAAC,QAAQ,CAAC,CAAC;YAErC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,IAAA,gBAAO,EAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAA,sBAAc,EAAC,GAAG,EAAE,EAAE,eAAe,EAAE,qBAAqB,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ConfigShowResult {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ConfigSetResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function configShow(): ConfigShowResult;
|
|
10
|
+
export declare function configSet(partial: {
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
apiUrl?: string;
|
|
13
|
+
}): ConfigSetResult;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAM7C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,eAAe,CAMlB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configShow = configShow;
|
|
4
|
+
exports.configSet = configSet;
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
function configShow() {
|
|
7
|
+
const config = (0, config_1.getConfig)();
|
|
8
|
+
return {
|
|
9
|
+
apiKey: (0, config_1.maskApiKey)(config.apiKey),
|
|
10
|
+
apiUrl: config.apiUrl,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function configSet(partial) {
|
|
14
|
+
(0, config_1.setConfig)(partial);
|
|
15
|
+
return {
|
|
16
|
+
success: true,
|
|
17
|
+
message: 'Config updated successfully.',
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";;AAYA,gCAMC;AAED,8BASC;AA7BD,sCAA6D;AAY7D,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,OAAO;QACL,MAAM,EAAE,IAAA,mBAAU,EAAC,MAAM,CAAC,MAAM,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAC,OAGzB;IACC,IAAA,kBAAS,EAAC,OAAO,CAAC,CAAC;IACnB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,8BAA8B;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb.d.ts","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoIhD"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.kbCommand = kbCommand;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const auth_1 = require("../utils/auth");
|
|
7
|
+
const client_1 = require("../client");
|
|
8
|
+
const generated_1 = require("../generated");
|
|
9
|
+
const output_1 = require("../utils/output");
|
|
10
|
+
const api_1 = require("../utils/api");
|
|
11
|
+
const error_1 = require("../utils/error");
|
|
12
|
+
function scoreLabel(score) {
|
|
13
|
+
if (score >= 0.8)
|
|
14
|
+
return 'HIGH';
|
|
15
|
+
if (score >= 0.5)
|
|
16
|
+
return 'MED';
|
|
17
|
+
return 'LOW';
|
|
18
|
+
}
|
|
19
|
+
function kbCommand(program) {
|
|
20
|
+
const kb = program.command('kb').description('Knowledge base commands');
|
|
21
|
+
kb
|
|
22
|
+
.command('search')
|
|
23
|
+
.description('Search the knowledge base')
|
|
24
|
+
.option('--project <slug>', 'Project slug')
|
|
25
|
+
.option('--query <text>', 'Search query')
|
|
26
|
+
.option('--json', 'Output as JSON')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
if (!options.project || !options.query) {
|
|
29
|
+
(0, output_1.error)('Missing required option: --project and --query are required');
|
|
30
|
+
process.exit(3);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
35
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
36
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
37
|
+
process.exit(2);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
41
|
+
const response = await generated_1.KbService.search(client, options.project, options.query);
|
|
42
|
+
const data = (0, api_1.unwrap)(response);
|
|
43
|
+
if (options.json) {
|
|
44
|
+
console.log(JSON.stringify(data, null, 2));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(`Verdict: ${data.verdict} Confidence: ${data.confidence}`);
|
|
48
|
+
console.log('');
|
|
49
|
+
for (const result of data.results) {
|
|
50
|
+
const label = scoreLabel(result.score);
|
|
51
|
+
const labels = result.labels?.length ? ` [${result.labels.join(', ')}]` : '';
|
|
52
|
+
console.log(`${label} score=${result.score} ${result.ticketRef} ${result.type} ${result.status}${labels}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
(0, error_1.handleApiError)(err);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
kb
|
|
62
|
+
.command('list')
|
|
63
|
+
.description('List knowledge base documents')
|
|
64
|
+
.option('--project <slug>', 'Project slug')
|
|
65
|
+
.option('--json', 'Output as JSON')
|
|
66
|
+
.action(async (options) => {
|
|
67
|
+
if (!options.project) {
|
|
68
|
+
(0, output_1.error)('Missing required option: --project is required');
|
|
69
|
+
process.exit(3);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
74
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
75
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
76
|
+
process.exit(2);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
80
|
+
const response = await generated_1.KbService.list(client, options.project);
|
|
81
|
+
const data = (0, api_1.unwrap)(response);
|
|
82
|
+
if (options.json) {
|
|
83
|
+
console.log(JSON.stringify(data, null, 2));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log('ID Source Created');
|
|
87
|
+
console.log('----------- ------------------- -----------------------');
|
|
88
|
+
for (const doc of data.items) {
|
|
89
|
+
const created = new Date(doc.createdAt).toISOString().slice(0, 10);
|
|
90
|
+
console.log(`${doc.id.padEnd(11)} ${doc.source.padEnd(19)} ${created}`);
|
|
91
|
+
}
|
|
92
|
+
console.log(`\nTotal: ${data.total}`);
|
|
93
|
+
}
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
(0, error_1.handleApiError)(err);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
kb
|
|
101
|
+
.command('add')
|
|
102
|
+
.description('Add a document to the knowledge base')
|
|
103
|
+
.option('--project <slug>', 'Project slug')
|
|
104
|
+
.option('--file <path>', 'Path to file to add')
|
|
105
|
+
.option('--json', 'Output as JSON')
|
|
106
|
+
.action(async (options) => {
|
|
107
|
+
if (!options.project || !options.file) {
|
|
108
|
+
(0, output_1.error)('Missing required option: --project and --file are required');
|
|
109
|
+
process.exit(3);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
114
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
115
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
116
|
+
process.exit(2);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const content = (0, fs_1.readFileSync)(options.file, 'utf-8');
|
|
120
|
+
const fileName = (0, path_1.basename)(options.file);
|
|
121
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
122
|
+
const response = await generated_1.KbService.add(client, options.project, { content, source: fileName });
|
|
123
|
+
const data = (0, api_1.unwrap)(response);
|
|
124
|
+
if (options.json) {
|
|
125
|
+
console.log(JSON.stringify(data, null, 2));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.log(`Added ${fileName} to knowledge base. Total documents: ${data.docCount}`);
|
|
129
|
+
}
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
(0, error_1.handleApiError)(err);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=kb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb.js","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/commands/label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwGnD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.labelCommand = labelCommand;
|
|
4
|
+
const auth_1 = require("../utils/auth");
|
|
5
|
+
const client_1 = require("../client");
|
|
6
|
+
const generated_1 = require("../generated");
|
|
7
|
+
const output_1 = require("../utils/output");
|
|
8
|
+
const api_1 = require("../utils/api");
|
|
9
|
+
const error_1 = require("../utils/error");
|
|
10
|
+
function labelCommand(program) {
|
|
11
|
+
const label = program.command('label');
|
|
12
|
+
label.description('Manage labels');
|
|
13
|
+
label
|
|
14
|
+
.command('create')
|
|
15
|
+
.description('Create a label in a project')
|
|
16
|
+
.requiredOption('--project <slug>', 'Project slug')
|
|
17
|
+
.requiredOption('--name <name>', 'Label name')
|
|
18
|
+
.option('--color <hex>', 'Label color (hex, e.g. #ff0000)')
|
|
19
|
+
.option('--json', 'Output as JSON')
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
try {
|
|
22
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
23
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
24
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
25
|
+
process.exit(2);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
29
|
+
const response = await generated_1.LabelsService.create(client, {
|
|
30
|
+
projectSlug: options.project,
|
|
31
|
+
name: options.name,
|
|
32
|
+
color: options.color,
|
|
33
|
+
});
|
|
34
|
+
const labelData = (0, api_1.unwrap)(response);
|
|
35
|
+
if (options.json) {
|
|
36
|
+
console.log(JSON.stringify(labelData, null, 2));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const rows = [
|
|
40
|
+
['ID', labelData.id],
|
|
41
|
+
['Name', labelData.name],
|
|
42
|
+
['Color', labelData.color ?? ''],
|
|
43
|
+
];
|
|
44
|
+
(0, output_1.table)(['Field', 'Value'], rows);
|
|
45
|
+
}
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
(0, error_1.handleApiError)(err);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
label
|
|
53
|
+
.command('list')
|
|
54
|
+
.description('List labels in a project')
|
|
55
|
+
.requiredOption('--project <slug>', 'Project slug')
|
|
56
|
+
.option('--json', 'Output as JSON')
|
|
57
|
+
.action(async (options) => {
|
|
58
|
+
try {
|
|
59
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
60
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
61
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
62
|
+
process.exit(2);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
66
|
+
const response = await generated_1.LabelsService.list(client, options.project);
|
|
67
|
+
const data = (0, api_1.unwrap)(response);
|
|
68
|
+
const items = Array.isArray(data) ? data : data.items || [];
|
|
69
|
+
if (options.json) {
|
|
70
|
+
console.log(JSON.stringify(items, null, 2));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const rows = items.map((l) => [String(l.id), String(l.name), String(l.color ?? '')]);
|
|
74
|
+
(0, output_1.table)(['ID', 'Name', 'Color'], rows);
|
|
75
|
+
}
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
(0, error_1.handleApiError)(err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
label
|
|
83
|
+
.command('delete')
|
|
84
|
+
.description('Delete a label from a project')
|
|
85
|
+
.requiredOption('--project <slug>', 'Project slug')
|
|
86
|
+
.requiredOption('--id <id>', 'Label ID')
|
|
87
|
+
.action(async (options) => {
|
|
88
|
+
try {
|
|
89
|
+
const auth = (0, auth_1.resolveAuth)({});
|
|
90
|
+
if (!auth.apiKey || !auth.apiUrl) {
|
|
91
|
+
(0, output_1.error)('API key or URL not configured. Run: koda login --api-key <key>');
|
|
92
|
+
process.exit(2);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const client = (0, client_1.configureClient)(auth.apiUrl, auth.apiKey);
|
|
96
|
+
await generated_1.LabelsService.delete(client, options.project, options.id);
|
|
97
|
+
console.log(`Label '${options.id}' deleted.`);
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
(0, error_1.handleApiError)(err, { notFoundMessage: `Label not found: ${options.id}` });
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../src/commands/label.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,WAAW,CAAC,CAsBtB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loginCommand = loginCommand;
|
|
4
|
+
const config_1 = require("../config");
|
|
5
|
+
const client_1 = require("../client");
|
|
6
|
+
async function loginCommand(apiKey, apiUrl, _options) {
|
|
7
|
+
if (!apiKey) {
|
|
8
|
+
throw new Error('API key is required');
|
|
9
|
+
}
|
|
10
|
+
const url = apiUrl || 'http://localhost:3100/api';
|
|
11
|
+
// Validate API key by calling /agents/me
|
|
12
|
+
const client = (0, client_1.configureClient)(url, apiKey);
|
|
13
|
+
try {
|
|
14
|
+
await client.get('/agents/me');
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('Invalid API key');
|
|
18
|
+
}
|
|
19
|
+
const config = { apiKey, apiUrl: url };
|
|
20
|
+
(0, config_1.setConfig)(config);
|
|
21
|
+
return {
|
|
22
|
+
success: true,
|
|
23
|
+
message: 'Login successful. Credentials saved.',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;AAQA,oCA0BC;AAlCD,sCAAsC;AACtC,sCAA4C;AAOrC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,MAA0B,EAC1B,QAAiC;IAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,IAAI,2BAA2B,CAAC;IAElD,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAA,wBAAe,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC/D,IAAA,kBAAS,EAAC,MAAyC,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,sCAAsC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwJrD"}
|