@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.
Files changed (65) hide show
  1. package/dist/client.d.ts +9 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +23 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/commands/agent.d.ts +3 -0
  6. package/dist/commands/agent.d.ts.map +1 -0
  7. package/dist/commands/agent.js +91 -0
  8. package/dist/commands/agent.js.map +1 -0
  9. package/dist/commands/comment.d.ts +3 -0
  10. package/dist/commands/comment.d.ts.map +1 -0
  11. package/dist/commands/comment.js +57 -0
  12. package/dist/commands/comment.js.map +1 -0
  13. package/dist/commands/config.d.ts +14 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +20 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/kb.d.ts +3 -0
  18. package/dist/commands/kb.d.ts.map +1 -0
  19. package/dist/commands/kb.js +137 -0
  20. package/dist/commands/kb.js.map +1 -0
  21. package/dist/commands/label.d.ts +3 -0
  22. package/dist/commands/label.d.ts.map +1 -0
  23. package/dist/commands/label.js +105 -0
  24. package/dist/commands/label.js.map +1 -0
  25. package/dist/commands/login.d.ts +6 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +26 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/project.d.ts +3 -0
  30. package/dist/commands/project.d.ts.map +1 -0
  31. package/dist/commands/project.js +148 -0
  32. package/dist/commands/project.js.map +1 -0
  33. package/dist/commands/ticket.d.ts +3 -0
  34. package/dist/commands/ticket.d.ts.map +1 -0
  35. package/dist/commands/ticket.js +538 -0
  36. package/dist/commands/ticket.js.map +1 -0
  37. package/dist/config.d.ts +9 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +68 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/generated.d.ts +185 -0
  42. package/dist/generated.d.ts.map +1 -0
  43. package/dist/generated.js +119 -0
  44. package/dist/generated.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +135 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/utils/api.d.ts +10 -0
  50. package/dist/utils/api.d.ts.map +1 -0
  51. package/dist/utils/api.js +32 -0
  52. package/dist/utils/api.js.map +1 -0
  53. package/dist/utils/auth.d.ts +9 -0
  54. package/dist/utils/auth.d.ts.map +1 -0
  55. package/dist/utils/auth.js +14 -0
  56. package/dist/utils/auth.js.map +1 -0
  57. package/dist/utils/error.d.ts +14 -0
  58. package/dist/utils/error.d.ts.map +1 -0
  59. package/dist/utils/error.js +42 -0
  60. package/dist/utils/error.js.map +1 -0
  61. package/dist/utils/output.d.ts +28 -0
  62. package/dist/utils/output.d.ts.map +1 -0
  63. package/dist/utils/output.js +80 -0
  64. package/dist/utils/output.js.map +1 -0
  65. package/package.json +38 -0
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function agentCommand(program: Command): void;
3
+ //# sourceMappingURL=agent.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function commentCommand(program: Command): void;
3
+ //# sourceMappingURL=comment.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function kbCommand(program: Command): void;
3
+ //# sourceMappingURL=kb.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function labelCommand(program: Command): void;
3
+ //# sourceMappingURL=label.d.ts.map
@@ -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,6 @@
1
+ export interface LoginResult {
2
+ success: boolean;
3
+ message: string;
4
+ }
5
+ export declare function loginCommand(apiKey: string, apiUrl: string | undefined, _options: Record<string, unknown>): Promise<LoginResult>;
6
+ //# sourceMappingURL=login.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function projectCommand(program: Command): void;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -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"}