@vfarcic/dot-ai 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 (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +51 -0
  6. package/dist/core/claude.d.ts +42 -0
  7. package/dist/core/claude.d.ts.map +1 -0
  8. package/dist/core/claude.js +229 -0
  9. package/dist/core/deploy-operation.d.ts +38 -0
  10. package/dist/core/deploy-operation.d.ts.map +1 -0
  11. package/dist/core/deploy-operation.js +101 -0
  12. package/dist/core/discovery.d.ts +162 -0
  13. package/dist/core/discovery.d.ts.map +1 -0
  14. package/dist/core/discovery.js +758 -0
  15. package/dist/core/error-handling.d.ts +167 -0
  16. package/dist/core/error-handling.d.ts.map +1 -0
  17. package/dist/core/error-handling.js +399 -0
  18. package/dist/core/index.d.ts +42 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +123 -0
  21. package/dist/core/kubernetes-utils.d.ts +38 -0
  22. package/dist/core/kubernetes-utils.d.ts.map +1 -0
  23. package/dist/core/kubernetes-utils.js +177 -0
  24. package/dist/core/memory.d.ts +45 -0
  25. package/dist/core/memory.d.ts.map +1 -0
  26. package/dist/core/memory.js +113 -0
  27. package/dist/core/schema.d.ts +187 -0
  28. package/dist/core/schema.d.ts.map +1 -0
  29. package/dist/core/schema.js +655 -0
  30. package/dist/core/session-utils.d.ts +29 -0
  31. package/dist/core/session-utils.d.ts.map +1 -0
  32. package/dist/core/session-utils.js +121 -0
  33. package/dist/core/workflow.d.ts +70 -0
  34. package/dist/core/workflow.d.ts.map +1 -0
  35. package/dist/core/workflow.js +161 -0
  36. package/dist/index.d.ts +15 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +32 -0
  39. package/dist/interfaces/cli.d.ts +74 -0
  40. package/dist/interfaces/cli.d.ts.map +1 -0
  41. package/dist/interfaces/cli.js +769 -0
  42. package/dist/interfaces/mcp.d.ts +30 -0
  43. package/dist/interfaces/mcp.d.ts.map +1 -0
  44. package/dist/interfaces/mcp.js +105 -0
  45. package/dist/mcp/server.d.ts +9 -0
  46. package/dist/mcp/server.d.ts.map +1 -0
  47. package/dist/mcp/server.js +151 -0
  48. package/dist/tools/answer-question.d.ts +27 -0
  49. package/dist/tools/answer-question.d.ts.map +1 -0
  50. package/dist/tools/answer-question.js +696 -0
  51. package/dist/tools/choose-solution.d.ts +23 -0
  52. package/dist/tools/choose-solution.d.ts.map +1 -0
  53. package/dist/tools/choose-solution.js +171 -0
  54. package/dist/tools/deploy-manifests.d.ts +25 -0
  55. package/dist/tools/deploy-manifests.d.ts.map +1 -0
  56. package/dist/tools/deploy-manifests.js +74 -0
  57. package/dist/tools/generate-manifests.d.ts +23 -0
  58. package/dist/tools/generate-manifests.d.ts.map +1 -0
  59. package/dist/tools/generate-manifests.js +424 -0
  60. package/dist/tools/index.d.ts +11 -0
  61. package/dist/tools/index.d.ts.map +1 -0
  62. package/dist/tools/index.js +34 -0
  63. package/dist/tools/recommend.d.ts +23 -0
  64. package/dist/tools/recommend.d.ts.map +1 -0
  65. package/dist/tools/recommend.js +332 -0
  66. package/package.json +124 -0
  67. package/prompts/intent-validation.md +65 -0
  68. package/prompts/manifest-generation.md +79 -0
  69. package/prompts/question-generation.md +128 -0
  70. package/prompts/resource-analysis.md +127 -0
  71. package/prompts/resource-selection.md +55 -0
  72. package/prompts/resource-solution-ranking.md +77 -0
  73. package/prompts/solution-enhancement.md +129 -0
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Model Context Protocol (MCP) Interface for DevOps AI Toolkit
3
+ *
4
+ * Provides MCP server capabilities that expose DevOps AI Toolkit functionality
5
+ * to AI assistants like Claude through standardized protocol
6
+ */
7
+ import { DotAI } from '../core/index';
8
+ export interface MCPServerConfig {
9
+ name: string;
10
+ version: string;
11
+ description: string;
12
+ author?: string;
13
+ }
14
+ export declare class MCPServer {
15
+ private server;
16
+ private dotAI;
17
+ private initialized;
18
+ private logger;
19
+ private requestIdCounter;
20
+ constructor(dotAI: DotAI, config: MCPServerConfig);
21
+ /**
22
+ * Register all tools with McpServer
23
+ */
24
+ private registerTools;
25
+ private generateRequestId;
26
+ start(): Promise<void>;
27
+ stop(): Promise<void>;
28
+ isReady(): boolean;
29
+ }
30
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/interfaces/mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAoCtC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe;IA2BjD;;OAEG;IACH,OAAO,CAAC,aAAa;IAyErB,OAAO,CAAC,iBAAiB;IAKnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,IAAI,OAAO;CAGnB"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Model Context Protocol (MCP) Interface for DevOps AI Toolkit
4
+ *
5
+ * Provides MCP server capabilities that expose DevOps AI Toolkit functionality
6
+ * to AI assistants like Claude through standardized protocol
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MCPServer = void 0;
10
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
11
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
12
+ const error_handling_1 = require("../core/error-handling");
13
+ const recommend_1 = require("../tools/recommend");
14
+ const choose_solution_1 = require("../tools/choose-solution");
15
+ const answer_question_1 = require("../tools/answer-question");
16
+ const generate_manifests_1 = require("../tools/generate-manifests");
17
+ const deploy_manifests_1 = require("../tools/deploy-manifests");
18
+ class MCPServer {
19
+ server;
20
+ dotAI;
21
+ initialized = false;
22
+ logger;
23
+ requestIdCounter = 0;
24
+ constructor(dotAI, config) {
25
+ this.dotAI = dotAI;
26
+ this.logger = new error_handling_1.ConsoleLogger('MCPServer');
27
+ // Create McpServer instance
28
+ this.server = new mcp_js_1.McpServer({
29
+ name: config.name,
30
+ version: config.version
31
+ }, {
32
+ capabilities: {
33
+ tools: {}
34
+ }
35
+ });
36
+ this.logger.info('Initializing MCP Server', {
37
+ name: config.name,
38
+ version: config.version,
39
+ author: config.author
40
+ });
41
+ // Register all tools directly with McpServer
42
+ this.registerTools();
43
+ }
44
+ /**
45
+ * Register all tools with McpServer
46
+ */
47
+ registerTools() {
48
+ // Register recommend tool
49
+ this.server.tool(recommend_1.RECOMMEND_TOOL_NAME, recommend_1.RECOMMEND_TOOL_DESCRIPTION, recommend_1.RECOMMEND_TOOL_INPUT_SCHEMA, async (args) => {
50
+ const requestId = this.generateRequestId();
51
+ this.logger.info(`Processing ${recommend_1.RECOMMEND_TOOL_NAME} tool request`, { requestId });
52
+ return await (0, recommend_1.handleRecommendTool)(args, this.dotAI, this.logger, requestId);
53
+ });
54
+ // Register chooseSolution tool
55
+ this.server.tool(choose_solution_1.CHOOSESOLUTION_TOOL_NAME, choose_solution_1.CHOOSESOLUTION_TOOL_DESCRIPTION, choose_solution_1.CHOOSESOLUTION_TOOL_INPUT_SCHEMA, async (args) => {
56
+ const requestId = this.generateRequestId();
57
+ this.logger.info(`Processing ${choose_solution_1.CHOOSESOLUTION_TOOL_NAME} tool request`, { requestId });
58
+ return await (0, choose_solution_1.handleChooseSolutionTool)(args, this.dotAI, this.logger, requestId);
59
+ });
60
+ // Register answerQuestion tool
61
+ this.server.tool(answer_question_1.ANSWERQUESTION_TOOL_NAME, answer_question_1.ANSWERQUESTION_TOOL_DESCRIPTION, answer_question_1.ANSWERQUESTION_TOOL_INPUT_SCHEMA, async (args) => {
62
+ const requestId = this.generateRequestId();
63
+ this.logger.info(`Processing ${answer_question_1.ANSWERQUESTION_TOOL_NAME} tool request`, { requestId });
64
+ return await (0, answer_question_1.handleAnswerQuestionTool)(args, this.dotAI, this.logger, requestId);
65
+ });
66
+ // Register generateManifests tool
67
+ this.server.tool(generate_manifests_1.GENERATEMANIFESTS_TOOL_NAME, generate_manifests_1.GENERATEMANIFESTS_TOOL_DESCRIPTION, generate_manifests_1.GENERATEMANIFESTS_TOOL_INPUT_SCHEMA, async (args) => {
68
+ const requestId = this.generateRequestId();
69
+ this.logger.info(`Processing ${generate_manifests_1.GENERATEMANIFESTS_TOOL_NAME} tool request`, { requestId });
70
+ return await (0, generate_manifests_1.handleGenerateManifestsTool)(args, this.dotAI, this.logger, requestId);
71
+ });
72
+ // Register deployManifests tool
73
+ this.server.tool(deploy_manifests_1.DEPLOYMANIFESTS_TOOL_NAME, deploy_manifests_1.DEPLOYMANIFESTS_TOOL_DESCRIPTION, deploy_manifests_1.DEPLOYMANIFESTS_TOOL_INPUT_SCHEMA, async (args) => {
74
+ const requestId = this.generateRequestId();
75
+ this.logger.info(`Processing ${deploy_manifests_1.DEPLOYMANIFESTS_TOOL_NAME} tool request`, { requestId });
76
+ return await (0, deploy_manifests_1.handleDeployManifestsTool)(args, this.dotAI, this.logger, requestId);
77
+ });
78
+ this.logger.info('Registered all tools with McpServer', {
79
+ tools: [
80
+ recommend_1.RECOMMEND_TOOL_NAME,
81
+ choose_solution_1.CHOOSESOLUTION_TOOL_NAME,
82
+ answer_question_1.ANSWERQUESTION_TOOL_NAME,
83
+ generate_manifests_1.GENERATEMANIFESTS_TOOL_NAME,
84
+ deploy_manifests_1.DEPLOYMANIFESTS_TOOL_NAME
85
+ ],
86
+ totalTools: 5
87
+ });
88
+ }
89
+ generateRequestId() {
90
+ return `mcp_${Date.now()}_${++this.requestIdCounter}`;
91
+ }
92
+ async start() {
93
+ const transport = new stdio_js_1.StdioServerTransport();
94
+ await this.server.connect(transport);
95
+ this.initialized = true;
96
+ }
97
+ async stop() {
98
+ await this.server.close();
99
+ this.initialized = false;
100
+ }
101
+ isReady() {
102
+ return this.initialized;
103
+ }
104
+ }
105
+ exports.MCPServer = MCPServer;
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server Entry Point for DevOps AI Toolkit
4
+ *
5
+ * This server exposes DevOps AI Toolkit functionality through the Model Context Protocol,
6
+ * enabling AI assistants like Claude Code to interact with Kubernetes deployment capabilities.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * MCP Server Entry Point for DevOps AI Toolkit
5
+ *
6
+ * This server exposes DevOps AI Toolkit functionality through the Model Context Protocol,
7
+ * enabling AI assistants like Claude Code to interact with Kubernetes deployment capabilities.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ const mcp_js_1 = require("../interfaces/mcp.js");
44
+ const index_js_1 = require("../core/index.js");
45
+ async function main() {
46
+ try {
47
+ // Validate required environment variables
48
+ process.stderr.write('Validating MCP server configuration...\n');
49
+ // Check session directory configuration
50
+ const sessionDir = process.env.DOT_AI_SESSION_DIR;
51
+ if (!sessionDir) {
52
+ process.stderr.write('FATAL: DOT_AI_SESSION_DIR environment variable is required\n');
53
+ process.stderr.write('Configuration:\n');
54
+ process.stderr.write('- Set DOT_AI_SESSION_DIR in .mcp.json env section\n');
55
+ process.stderr.write('- Example: "DOT_AI_SESSION_DIR": "/tmp/dot-ai-sessions"\n');
56
+ process.stderr.write('- Ensure the directory exists and is writable\n');
57
+ process.exit(1);
58
+ }
59
+ // Validate session directory exists and is writable
60
+ try {
61
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
62
+ const path = await Promise.resolve().then(() => __importStar(require('path')));
63
+ // Check if directory exists
64
+ if (!fs.existsSync(sessionDir)) {
65
+ process.stderr.write(`FATAL: Session directory does not exist: ${sessionDir}\n`);
66
+ process.stderr.write('Solution: Create the directory or update DOT_AI_SESSION_DIR\n');
67
+ process.exit(1);
68
+ }
69
+ // Check if it's actually a directory
70
+ const stat = fs.statSync(sessionDir);
71
+ if (!stat.isDirectory()) {
72
+ process.stderr.write(`FATAL: Session directory path is not a directory: ${sessionDir}\n`);
73
+ process.stderr.write('Solution: Use a valid directory path in DOT_AI_SESSION_DIR\n');
74
+ process.exit(1);
75
+ }
76
+ // Test write permissions
77
+ const testFile = path.join(sessionDir, '.mcp-test-write');
78
+ try {
79
+ fs.writeFileSync(testFile, 'test');
80
+ fs.unlinkSync(testFile);
81
+ process.stderr.write(`Session directory validated: ${sessionDir}\n`);
82
+ }
83
+ catch (writeError) {
84
+ process.stderr.write(`FATAL: Session directory is not writable: ${sessionDir}\n`);
85
+ process.stderr.write('Solution: Fix directory permissions or use a different directory\n');
86
+ process.exit(1);
87
+ }
88
+ }
89
+ catch (error) {
90
+ process.stderr.write(`FATAL: Session directory validation failed: ${error}\n`);
91
+ process.exit(1);
92
+ }
93
+ // Initialize DotAI - it will read KUBECONFIG and ANTHROPIC_API_KEY from environment
94
+ const dotAI = new index_js_1.DotAI();
95
+ // Test cluster connectivity immediately on startup
96
+ process.stderr.write('Testing cluster connectivity...\n');
97
+ try {
98
+ await dotAI.initialize();
99
+ await dotAI.discovery.connect();
100
+ process.stderr.write('Cluster connectivity verified successfully\n');
101
+ }
102
+ catch (connectError) {
103
+ process.stderr.write(`FATAL: Failed to connect to Kubernetes cluster: ${connectError}\n`);
104
+ process.stderr.write('Troubleshooting:\n');
105
+ process.stderr.write('- Check KUBECONFIG environment variable\n');
106
+ process.stderr.write('- Verify cluster is running: kubectl cluster-info\n');
107
+ process.stderr.write('- Test kubectl connectivity: kubectl get nodes\n');
108
+ process.exit(1);
109
+ }
110
+ // Create and configure MCP server
111
+ const mcpServer = new mcp_js_1.MCPServer(dotAI, {
112
+ name: 'dot-ai',
113
+ version: '0.1.0',
114
+ description: 'Universal Kubernetes application deployment agent with AI-powered orchestration',
115
+ author: 'Viktor Farcic'
116
+ });
117
+ // Start the MCP server
118
+ process.stderr.write('Starting DevOps AI Toolkit MCP server...\n');
119
+ await mcpServer.start();
120
+ process.stderr.write('DevOps AI Toolkit MCP server started successfully\n');
121
+ // Handle graceful shutdown
122
+ process.on('SIGINT', async () => {
123
+ process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
124
+ await mcpServer.stop();
125
+ process.exit(0);
126
+ });
127
+ process.on('SIGTERM', async () => {
128
+ process.stderr.write('Shutting down DevOps AI Toolkit MCP server...\n');
129
+ await mcpServer.stop();
130
+ process.exit(0);
131
+ });
132
+ }
133
+ catch (error) {
134
+ process.stderr.write(`Failed to start DevOps AI Toolkit MCP server: ${error}\n`);
135
+ process.exit(1);
136
+ }
137
+ }
138
+ // Handle uncaught exceptions
139
+ process.on('uncaughtException', (error) => {
140
+ process.stderr.write(`Uncaught exception in MCP server: ${error}\n`);
141
+ process.exit(1);
142
+ });
143
+ process.on('unhandledRejection', (reason) => {
144
+ process.stderr.write(`Unhandled rejection in MCP server: ${reason}\n`);
145
+ process.exit(1);
146
+ });
147
+ // Start the server
148
+ main().catch((error) => {
149
+ process.stderr.write(`Fatal error starting MCP server: ${error}\n`);
150
+ process.exit(1);
151
+ });
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Answer Question Tool - Process user answers and return remaining questions
3
+ */
4
+ import { z } from 'zod';
5
+ import { DotAI } from '../core/index';
6
+ import { Logger } from '../core/error-handling';
7
+ export declare const ANSWERQUESTION_TOOL_NAME = "answerQuestion";
8
+ export declare const ANSWERQUESTION_TOOL_DESCRIPTION = "Process user answers and return remaining questions or completion status";
9
+ export declare const ANSWERQUESTION_TOOL_INPUT_SCHEMA: {
10
+ solutionId: z.ZodString;
11
+ stage: z.ZodEnum<["required", "basic", "advanced", "open"]>;
12
+ answers: z.ZodRecord<z.ZodString, z.ZodAny>;
13
+ };
14
+ /**
15
+ * Direct MCP tool handler for answerQuestion functionality
16
+ */
17
+ export declare function handleAnswerQuestionTool(args: {
18
+ solutionId: string;
19
+ stage: 'required' | 'basic' | 'advanced' | 'open';
20
+ answers: Record<string, any>;
21
+ }, dotAI: DotAI, logger: Logger, requestId: string): Promise<{
22
+ content: {
23
+ type: 'text';
24
+ text: string;
25
+ }[];
26
+ }>;
27
+ //# sourceMappingURL=answer-question.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-question.d.ts","sourceRoot":"","sources":["../../src/tools/answer-question.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAMhD,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AACzD,eAAO,MAAM,+BAA+B,6EAA6E,CAAC;AAG1H,eAAO,MAAM,gCAAgC;;;;CAI5C,CAAC;AAodF;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,EAC7G,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CAmTxD"}