@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.
- package/LICENSE +21 -0
- package/README.md +203 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +51 -0
- package/dist/core/claude.d.ts +42 -0
- package/dist/core/claude.d.ts.map +1 -0
- package/dist/core/claude.js +229 -0
- package/dist/core/deploy-operation.d.ts +38 -0
- package/dist/core/deploy-operation.d.ts.map +1 -0
- package/dist/core/deploy-operation.js +101 -0
- package/dist/core/discovery.d.ts +162 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +758 -0
- package/dist/core/error-handling.d.ts +167 -0
- package/dist/core/error-handling.d.ts.map +1 -0
- package/dist/core/error-handling.js +399 -0
- package/dist/core/index.d.ts +42 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +123 -0
- package/dist/core/kubernetes-utils.d.ts +38 -0
- package/dist/core/kubernetes-utils.d.ts.map +1 -0
- package/dist/core/kubernetes-utils.js +177 -0
- package/dist/core/memory.d.ts +45 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +113 -0
- package/dist/core/schema.d.ts +187 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +655 -0
- package/dist/core/session-utils.d.ts +29 -0
- package/dist/core/session-utils.d.ts.map +1 -0
- package/dist/core/session-utils.js +121 -0
- package/dist/core/workflow.d.ts +70 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +161 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/interfaces/cli.d.ts +74 -0
- package/dist/interfaces/cli.d.ts.map +1 -0
- package/dist/interfaces/cli.js +769 -0
- package/dist/interfaces/mcp.d.ts +30 -0
- package/dist/interfaces/mcp.d.ts.map +1 -0
- package/dist/interfaces/mcp.js +105 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +151 -0
- package/dist/tools/answer-question.d.ts +27 -0
- package/dist/tools/answer-question.d.ts.map +1 -0
- package/dist/tools/answer-question.js +696 -0
- package/dist/tools/choose-solution.d.ts +23 -0
- package/dist/tools/choose-solution.d.ts.map +1 -0
- package/dist/tools/choose-solution.js +171 -0
- package/dist/tools/deploy-manifests.d.ts +25 -0
- package/dist/tools/deploy-manifests.d.ts.map +1 -0
- package/dist/tools/deploy-manifests.js +74 -0
- package/dist/tools/generate-manifests.d.ts +23 -0
- package/dist/tools/generate-manifests.d.ts.map +1 -0
- package/dist/tools/generate-manifests.js +424 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/recommend.d.ts +23 -0
- package/dist/tools/recommend.d.ts.map +1 -0
- package/dist/tools/recommend.js +332 -0
- package/package.json +124 -0
- package/prompts/intent-validation.md +65 -0
- package/prompts/manifest-generation.md +79 -0
- package/prompts/question-generation.md +128 -0
- package/prompts/resource-analysis.md +127 -0
- package/prompts/resource-selection.md +55 -0
- package/prompts/resource-solution-ranking.md +77 -0
- package/prompts/solution-enhancement.md +129 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deploy Operation - Handles Kubernetes manifest deployment with readiness checking
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DeployOperation = void 0;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const error_handling_1 = require("./error-handling");
|
|
10
|
+
const kubernetes_utils_1 = require("./kubernetes-utils");
|
|
11
|
+
class DeployOperation {
|
|
12
|
+
kubectlConfig;
|
|
13
|
+
constructor(kubeconfig) {
|
|
14
|
+
this.kubectlConfig = {
|
|
15
|
+
kubeconfig: kubeconfig || process.env.KUBECONFIG
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Deploy Kubernetes manifests from generated solution
|
|
20
|
+
*/
|
|
21
|
+
async deploy(options) {
|
|
22
|
+
return error_handling_1.ErrorHandler.withErrorHandling(async () => {
|
|
23
|
+
const manifestPath = this.getManifestPath(options);
|
|
24
|
+
// Verify manifest file exists
|
|
25
|
+
await this.verifyManifestExists(manifestPath);
|
|
26
|
+
// Update kubeconfig if provided in options
|
|
27
|
+
const kubectlConfig = {
|
|
28
|
+
...this.kubectlConfig,
|
|
29
|
+
kubeconfig: options.kubeconfig || this.kubectlConfig.kubeconfig
|
|
30
|
+
};
|
|
31
|
+
// Apply manifests with kubectl
|
|
32
|
+
const kubectlOutput = await this.applyManifests(manifestPath, options.timeout || 30, kubectlConfig);
|
|
33
|
+
return {
|
|
34
|
+
success: true,
|
|
35
|
+
solutionId: options.solutionId,
|
|
36
|
+
manifestPath,
|
|
37
|
+
readinessTimeout: false,
|
|
38
|
+
message: 'Deployment completed successfully',
|
|
39
|
+
kubectlOutput
|
|
40
|
+
};
|
|
41
|
+
}, {
|
|
42
|
+
operation: 'deploy',
|
|
43
|
+
component: 'deploy-operation'
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the manifest file path for the solution
|
|
48
|
+
*/
|
|
49
|
+
getManifestPath(options) {
|
|
50
|
+
const sessionDir = options.sessionDir || process.env.DOT_AI_SESSION_DIR;
|
|
51
|
+
if (!sessionDir) {
|
|
52
|
+
throw new Error('Session directory not configured. Set DOT_AI_SESSION_DIR environment variable or provide sessionDir parameter.');
|
|
53
|
+
}
|
|
54
|
+
return (0, path_1.join)(sessionDir, `${options.solutionId}.yaml`);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Verify that the manifest file exists
|
|
58
|
+
*/
|
|
59
|
+
async verifyManifestExists(manifestPath) {
|
|
60
|
+
try {
|
|
61
|
+
await (0, promises_1.access)(manifestPath);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`Manifest file not found: ${manifestPath}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Apply manifests using kubectl with readiness checking
|
|
69
|
+
*/
|
|
70
|
+
async applyManifests(manifestPath, timeout, kubectlConfig) {
|
|
71
|
+
// First, apply the manifests
|
|
72
|
+
const applyResult = await (0, kubernetes_utils_1.executeKubectl)(['apply', '-f', `"${manifestPath}"`], kubectlConfig);
|
|
73
|
+
// Try to wait for deployments to be ready (ignore failures for other resource types)
|
|
74
|
+
let waitOutput = '';
|
|
75
|
+
try {
|
|
76
|
+
const waitResult = await (0, kubernetes_utils_1.executeKubectl)([
|
|
77
|
+
'wait',
|
|
78
|
+
'--for=condition=available',
|
|
79
|
+
'deployments',
|
|
80
|
+
'--all',
|
|
81
|
+
`--timeout=${timeout}s`,
|
|
82
|
+
'--all-namespaces'
|
|
83
|
+
], {
|
|
84
|
+
...kubectlConfig,
|
|
85
|
+
timeout: (timeout + 10) * 1000 // Add 10 seconds buffer for kubectl command itself
|
|
86
|
+
});
|
|
87
|
+
waitOutput = `\n\nWait output:\n${waitResult}`;
|
|
88
|
+
}
|
|
89
|
+
catch (waitError) {
|
|
90
|
+
// If no deployments found or wait fails, that's OK for ConfigMaps, Services, etc.
|
|
91
|
+
if (waitError.message && waitError.message.includes('no matching resources found')) {
|
|
92
|
+
waitOutput = '\n\nWait output: No deployments found to wait for (likely ConfigMaps, Services, etc.)';
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
waitOutput = `\n\nWait output: Warning - ${waitError.message}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return `Apply output:\n${applyResult}${waitOutput}`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.DeployOperation = DeployOperation;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Discovery Module
|
|
3
|
+
*
|
|
4
|
+
* Handles cluster connection, resource discovery, and capability detection
|
|
5
|
+
*/
|
|
6
|
+
import { KubectlConfig } from './kubernetes-utils';
|
|
7
|
+
export interface ClusterInfo {
|
|
8
|
+
type: string;
|
|
9
|
+
version: string;
|
|
10
|
+
capabilities: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface ResourceMap {
|
|
13
|
+
resources: EnhancedResource[];
|
|
14
|
+
custom: EnhancedCRD[];
|
|
15
|
+
}
|
|
16
|
+
export interface CRD {
|
|
17
|
+
name: string;
|
|
18
|
+
group: string;
|
|
19
|
+
version: string;
|
|
20
|
+
schema: any;
|
|
21
|
+
}
|
|
22
|
+
export interface EnhancedCRD {
|
|
23
|
+
name: string;
|
|
24
|
+
group: string;
|
|
25
|
+
version: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
scope: 'Namespaced' | 'Cluster';
|
|
28
|
+
versions: Array<{
|
|
29
|
+
name: string;
|
|
30
|
+
served: boolean;
|
|
31
|
+
storage: boolean;
|
|
32
|
+
schema?: any;
|
|
33
|
+
}>;
|
|
34
|
+
schema?: any;
|
|
35
|
+
}
|
|
36
|
+
export interface EnhancedResource {
|
|
37
|
+
name: string;
|
|
38
|
+
namespaced: boolean;
|
|
39
|
+
kind: string;
|
|
40
|
+
shortNames: string[];
|
|
41
|
+
apiVersion: string;
|
|
42
|
+
group: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ResourceExplanation {
|
|
45
|
+
kind: string;
|
|
46
|
+
version: string;
|
|
47
|
+
group: string;
|
|
48
|
+
description: string;
|
|
49
|
+
fields: Array<{
|
|
50
|
+
name: string;
|
|
51
|
+
type: string;
|
|
52
|
+
description: string;
|
|
53
|
+
required: boolean;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
export interface ClusterFingerprint {
|
|
57
|
+
version: string;
|
|
58
|
+
platform: string;
|
|
59
|
+
nodeCount: number;
|
|
60
|
+
namespaceCount: number;
|
|
61
|
+
crdCount: number;
|
|
62
|
+
capabilities: string[];
|
|
63
|
+
features: {
|
|
64
|
+
deployments: number;
|
|
65
|
+
services: number;
|
|
66
|
+
pods: number;
|
|
67
|
+
configMaps: number;
|
|
68
|
+
secrets: number;
|
|
69
|
+
};
|
|
70
|
+
networking: {
|
|
71
|
+
cni: string;
|
|
72
|
+
serviceSubnet: string;
|
|
73
|
+
podSubnet: string;
|
|
74
|
+
dnsProvider: string;
|
|
75
|
+
};
|
|
76
|
+
security: {
|
|
77
|
+
rbacEnabled: boolean;
|
|
78
|
+
podSecurityPolicy: boolean;
|
|
79
|
+
networkPolicies: boolean;
|
|
80
|
+
admissionControllers: string[];
|
|
81
|
+
};
|
|
82
|
+
storage: {
|
|
83
|
+
storageClasses: string[];
|
|
84
|
+
persistentVolumes: number;
|
|
85
|
+
csiDrivers: string[];
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export interface KubernetesDiscoveryConfig {
|
|
89
|
+
kubeconfigPath?: string;
|
|
90
|
+
}
|
|
91
|
+
export declare class KubernetesDiscovery {
|
|
92
|
+
private kc;
|
|
93
|
+
private k8sApi;
|
|
94
|
+
private connected;
|
|
95
|
+
private kubeconfigPath;
|
|
96
|
+
constructor(config?: KubernetesDiscoveryConfig);
|
|
97
|
+
/**
|
|
98
|
+
* Resolves kubeconfig path following priority order:
|
|
99
|
+
* 1. Custom path provided in constructor
|
|
100
|
+
* 2. KUBECONFIG environment variable (first path if multiple)
|
|
101
|
+
* 3. Default ~/.kube/config
|
|
102
|
+
*/
|
|
103
|
+
private resolveKubeconfigPath;
|
|
104
|
+
/**
|
|
105
|
+
* Get the current kubeconfig path being used
|
|
106
|
+
*/
|
|
107
|
+
getKubeconfigPath(): string;
|
|
108
|
+
/**
|
|
109
|
+
* Set a new kubeconfig path (will require reconnection)
|
|
110
|
+
*/
|
|
111
|
+
setKubeconfigPath(newPath: string): void;
|
|
112
|
+
connect(): Promise<void>;
|
|
113
|
+
isConnected(): boolean;
|
|
114
|
+
getClusterInfo(): Promise<ClusterInfo>;
|
|
115
|
+
private detectClusterType;
|
|
116
|
+
private detectCapabilities;
|
|
117
|
+
discoverResources(): Promise<ResourceMap>;
|
|
118
|
+
/**
|
|
119
|
+
* Execute kubectl command with proper configuration
|
|
120
|
+
*/
|
|
121
|
+
/**
|
|
122
|
+
* Execute kubectl command with proper configuration
|
|
123
|
+
* Delegates to shared utility function
|
|
124
|
+
*/
|
|
125
|
+
executeKubectl(args: string[], config?: KubectlConfig): Promise<string>;
|
|
126
|
+
discoverCRDs(options?: {
|
|
127
|
+
group?: string;
|
|
128
|
+
}): Promise<EnhancedCRD[]>;
|
|
129
|
+
discoverCRDDetails(): Promise<CRD[]>;
|
|
130
|
+
getAPIResources(options?: {
|
|
131
|
+
group?: string;
|
|
132
|
+
}): Promise<EnhancedResource[]>;
|
|
133
|
+
explainResource(resource: string, options?: {
|
|
134
|
+
field?: string;
|
|
135
|
+
}): Promise<string>;
|
|
136
|
+
fingerprintCluster(): Promise<ClusterFingerprint>;
|
|
137
|
+
private getResourceCounts;
|
|
138
|
+
private getNetworkingInfo;
|
|
139
|
+
private getSecurityInfo;
|
|
140
|
+
private getStorageInfo;
|
|
141
|
+
private extractSubnet;
|
|
142
|
+
getResourceSchema(_kind: string, _apiVersion: string): Promise<any>;
|
|
143
|
+
getNamespaces(): Promise<string[]>;
|
|
144
|
+
namespaceExists(namespace: string): Promise<boolean>;
|
|
145
|
+
/**
|
|
146
|
+
* Discover what capabilities a CRD provides by analyzing related resources
|
|
147
|
+
*/
|
|
148
|
+
private discoverCRDCapabilities;
|
|
149
|
+
/**
|
|
150
|
+
* Find Compositions associated with this CRD
|
|
151
|
+
*/
|
|
152
|
+
private discoverAssociatedCompositions;
|
|
153
|
+
/**
|
|
154
|
+
* Analyze what resources a Composition creates
|
|
155
|
+
*/
|
|
156
|
+
private analyzeCompositionCapabilities;
|
|
157
|
+
/**
|
|
158
|
+
* Build an enhanced description that includes discovered capabilities
|
|
159
|
+
*/
|
|
160
|
+
private buildEnhancedDescription;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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"}
|