@vfarcic/dot-ai 0.139.0 → 0.142.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/dist/core/capability-scan-workflow.d.ts.map +1 -1
- package/dist/core/capability-scan-workflow.js +3 -2
- package/dist/core/command-executor.d.ts +39 -0
- package/dist/core/command-executor.d.ts.map +1 -0
- package/dist/core/command-executor.js +111 -0
- package/dist/core/crd-availability.d.ts +16 -0
- package/dist/core/crd-availability.d.ts.map +1 -0
- package/dist/core/crd-availability.js +108 -0
- package/dist/core/deploy-operation.d.ts.map +1 -1
- package/dist/core/deploy-operation.js +5 -7
- package/dist/core/pattern-vector-service.d.ts +1 -1
- package/dist/core/pattern-vector-service.d.ts.map +1 -1
- package/dist/core/pattern-vector-service.js +2 -2
- package/dist/core/schema.d.ts +2 -9
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +2 -3
- package/dist/core/solution-cr.d.ts +21 -0
- package/dist/core/solution-cr.d.ts.map +1 -0
- package/dist/core/solution-cr.js +112 -0
- package/dist/core/solution-utils.d.ts +0 -6
- package/dist/core/solution-utils.d.ts.map +1 -1
- package/dist/core/solution-utils.js +0 -26
- package/dist/core/unified-creation-session.d.ts.map +1 -1
- package/dist/core/unified-creation-session.js +21 -4
- package/dist/core/vector-db-service.d.ts.map +1 -1
- package/dist/core/vector-db-service.js +5 -0
- package/dist/interfaces/mcp.d.ts.map +1 -1
- package/dist/interfaces/mcp.js +9 -1
- package/dist/interfaces/rest-registry.d.ts.map +1 -1
- package/dist/interfaces/rest-registry.js +1 -0
- package/dist/tools/answer-question.d.ts +6 -1
- package/dist/tools/answer-question.d.ts.map +1 -1
- package/dist/tools/answer-question.js +28 -143
- package/dist/tools/choose-solution.d.ts.map +1 -1
- package/dist/tools/choose-solution.js +22 -85
- package/dist/tools/deploy-manifests.js +1 -1
- package/dist/tools/generate-manifests.d.ts.map +1 -1
- package/dist/tools/generate-manifests.js +65 -124
- package/dist/tools/operate-analysis.d.ts +15 -0
- package/dist/tools/operate-analysis.d.ts.map +1 -0
- package/dist/tools/operate-analysis.js +232 -0
- package/dist/tools/operate-execution.d.ts +18 -0
- package/dist/tools/operate-execution.d.ts.map +1 -0
- package/dist/tools/operate-execution.js +122 -0
- package/dist/tools/operate.d.ts +133 -0
- package/dist/tools/operate.d.ts.map +1 -0
- package/dist/tools/operate.js +237 -0
- package/dist/tools/organizational-data.d.ts +17 -11
- package/dist/tools/organizational-data.d.ts.map +1 -1
- package/dist/tools/project-setup.d.ts +7 -3
- package/dist/tools/project-setup.d.ts.map +1 -1
- package/dist/tools/project-setup.js +1 -1
- package/dist/tools/recommend.d.ts +24 -0
- package/dist/tools/recommend.d.ts.map +1 -1
- package/dist/tools/recommend.js +28 -126
- package/dist/tools/remediate.d.ts +17 -7
- package/dist/tools/remediate.d.ts.map +1 -1
- package/dist/tools/remediate.js +38 -81
- package/dist/tools/version.js +1 -1
- package/package.json +1 -1
- package/prompts/operate-system.md +323 -0
- package/prompts/operate-user.md +25 -0
- package/prompts/question-generation.md +8 -1
- package/prompts/remediate-system.md +10 -1
- package/prompts/resource-selection.md +7 -9
- package/scripts/crossplane.nu +1 -1
- package/scripts/dot-ai.nu +14 -2
- package/shared-prompts/prd-close.md +7 -1
- package/shared-prompts/deploy.md +0 -23
- package/shared-prompts/manage-org-data.md +0 -42
- package/shared-prompts/remediate.md +0 -44
- package/shared-prompts/status.md +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-scan-workflow.d.ts","sourceRoot":"","sources":["../../src/core/capability-scan-workflow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capability-scan-workflow.d.ts","sourceRoot":"","sources":["../../src/core/capability-scan-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -455,8 +455,9 @@ async function handleScanning(session, args, logger, requestId, capabilityServic
|
|
|
455
455
|
const lines = currentResourceDefinition.split('\n');
|
|
456
456
|
const groupLine = lines.find((line) => line.startsWith('GROUP:'));
|
|
457
457
|
const versionLine = lines.find((line) => line.startsWith('VERSION:'));
|
|
458
|
-
if (
|
|
459
|
-
|
|
458
|
+
// Extract metadata if version is found (group is optional for core resources)
|
|
459
|
+
if (versionLine) {
|
|
460
|
+
const group = groupLine ? groupLine.replace('GROUP:', '').trim() : '';
|
|
460
461
|
const version = versionLine.replace('VERSION:', '').trim();
|
|
461
462
|
const apiVersion = group ? `${group}/${version}` : version;
|
|
462
463
|
metadata = { apiVersion, version, group };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Command Executor
|
|
3
|
+
*
|
|
4
|
+
* Provides common command execution logic for tools (remediate, operate, etc.)
|
|
5
|
+
* Uses continue-on-error pattern: executes all commands sequentially regardless
|
|
6
|
+
* of individual failures.
|
|
7
|
+
*/
|
|
8
|
+
import { Logger } from './error-handling';
|
|
9
|
+
/**
|
|
10
|
+
* Execution result for a single command
|
|
11
|
+
*/
|
|
12
|
+
export interface CommandExecutionResult {
|
|
13
|
+
command: string;
|
|
14
|
+
success: boolean;
|
|
15
|
+
output?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
timestamp: Date;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for command execution
|
|
21
|
+
*/
|
|
22
|
+
export interface CommandExecutionOptions {
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
context?: string;
|
|
25
|
+
logMetadata?: Record<string, any>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute a list of commands sequentially with continue-on-error pattern
|
|
29
|
+
*
|
|
30
|
+
* @param commands - Array of command strings to execute
|
|
31
|
+
* @param logger - Logger instance for tracking execution
|
|
32
|
+
* @param options - Optional execution context and metadata
|
|
33
|
+
* @returns Array of execution results and overall success status
|
|
34
|
+
*/
|
|
35
|
+
export declare function executeCommands(commands: string[], logger: Logger, options?: CommandExecutionOptions): Promise<{
|
|
36
|
+
results: CommandExecutionResult[];
|
|
37
|
+
overallSuccess: boolean;
|
|
38
|
+
}>;
|
|
39
|
+
//# sourceMappingURL=command-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-executor.d.ts","sourceRoot":"","sources":["../../src/core/command-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC;IAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAwEzE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared Command Executor
|
|
4
|
+
*
|
|
5
|
+
* Provides common command execution logic for tools (remediate, operate, etc.)
|
|
6
|
+
* Uses continue-on-error pattern: executes all commands sequentially regardless
|
|
7
|
+
* of individual failures.
|
|
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
|
+
exports.executeCommands = executeCommands;
|
|
44
|
+
/**
|
|
45
|
+
* Execute a list of commands sequentially with continue-on-error pattern
|
|
46
|
+
*
|
|
47
|
+
* @param commands - Array of command strings to execute
|
|
48
|
+
* @param logger - Logger instance for tracking execution
|
|
49
|
+
* @param options - Optional execution context and metadata
|
|
50
|
+
* @returns Array of execution results and overall success status
|
|
51
|
+
*/
|
|
52
|
+
async function executeCommands(commands, logger, options = {}) {
|
|
53
|
+
const results = [];
|
|
54
|
+
let overallSuccess = true;
|
|
55
|
+
const { sessionId, context = 'command execution', logMetadata = {} } = options;
|
|
56
|
+
logger.info(`Starting ${context}`, {
|
|
57
|
+
...logMetadata,
|
|
58
|
+
sessionId,
|
|
59
|
+
commandCount: commands.length
|
|
60
|
+
});
|
|
61
|
+
// Execute each command sequentially
|
|
62
|
+
for (let i = 0; i < commands.length; i++) {
|
|
63
|
+
const command = commands[i];
|
|
64
|
+
const commandNum = i + 1;
|
|
65
|
+
try {
|
|
66
|
+
logger.info(`Executing command ${commandNum}/${commands.length}`, {
|
|
67
|
+
...logMetadata,
|
|
68
|
+
sessionId,
|
|
69
|
+
command
|
|
70
|
+
});
|
|
71
|
+
// Clean up escape sequences that AI models sometimes add
|
|
72
|
+
const cleanCommand = command.replace(/\\"/g, '"');
|
|
73
|
+
// Execute command using shared utility
|
|
74
|
+
const { execAsync } = await Promise.resolve().then(() => __importStar(require('./platform-utils.js')));
|
|
75
|
+
const { stdout } = await execAsync(cleanCommand);
|
|
76
|
+
results.push({
|
|
77
|
+
command,
|
|
78
|
+
success: true,
|
|
79
|
+
output: stdout?.trim() || '',
|
|
80
|
+
timestamp: new Date()
|
|
81
|
+
});
|
|
82
|
+
logger.info(`Command ${commandNum} succeeded`, {
|
|
83
|
+
...logMetadata,
|
|
84
|
+
sessionId
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
89
|
+
overallSuccess = false;
|
|
90
|
+
results.push({
|
|
91
|
+
command,
|
|
92
|
+
success: false,
|
|
93
|
+
error: errorMessage,
|
|
94
|
+
timestamp: new Date()
|
|
95
|
+
});
|
|
96
|
+
logger.error(`Command ${commandNum} failed`, error, {
|
|
97
|
+
...logMetadata,
|
|
98
|
+
sessionId,
|
|
99
|
+
command
|
|
100
|
+
});
|
|
101
|
+
// Continue to next command (continue-on-error pattern)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
logger.info(`${context} completed`, {
|
|
105
|
+
...logMetadata,
|
|
106
|
+
sessionId,
|
|
107
|
+
successCount: results.filter(r => r.success).length,
|
|
108
|
+
failureCount: results.filter(r => !r.success).length
|
|
109
|
+
});
|
|
110
|
+
return { results, overallSuccess };
|
|
111
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRD Availability Check with Global Caching
|
|
3
|
+
*
|
|
4
|
+
* Checks once per MCP server lifecycle if Solution CRD is available,
|
|
5
|
+
* then caches the result globally to avoid repeated cluster queries.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Helper function for checking CRD availability
|
|
9
|
+
* Use this function throughout the codebase
|
|
10
|
+
*/
|
|
11
|
+
export declare function isSolutionCRDAvailable(): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Reset CRD availability cache (primarily for testing)
|
|
14
|
+
*/
|
|
15
|
+
export declare function resetCRDAvailabilityCache(): void;
|
|
16
|
+
//# sourceMappingURL=crd-availability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crd-availability.d.ts","sourceRoot":"","sources":["../../src/core/crd-availability.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4DH;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CRD Availability Check with Global Caching
|
|
4
|
+
*
|
|
5
|
+
* Checks once per MCP server lifecycle if Solution CRD is available,
|
|
6
|
+
* then caches the result globally to avoid repeated cluster queries.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.isSolutionCRDAvailable = isSolutionCRDAvailable;
|
|
43
|
+
exports.resetCRDAvailabilityCache = resetCRDAvailabilityCache;
|
|
44
|
+
const k8s = __importStar(require("@kubernetes/client-node"));
|
|
45
|
+
/**
|
|
46
|
+
* Singleton cache for CRD availability check
|
|
47
|
+
* Checks once per MCP server lifecycle, caches result globally
|
|
48
|
+
*/
|
|
49
|
+
class CRDAvailabilityCache {
|
|
50
|
+
static instance;
|
|
51
|
+
crdAvailable = null;
|
|
52
|
+
constructor() { }
|
|
53
|
+
static getInstance() {
|
|
54
|
+
if (!CRDAvailabilityCache.instance) {
|
|
55
|
+
CRDAvailabilityCache.instance = new CRDAvailabilityCache();
|
|
56
|
+
}
|
|
57
|
+
return CRDAvailabilityCache.instance;
|
|
58
|
+
}
|
|
59
|
+
async isSolutionCRDAvailable() {
|
|
60
|
+
// Return cached result if available
|
|
61
|
+
if (this.crdAvailable !== null) {
|
|
62
|
+
return this.crdAvailable;
|
|
63
|
+
}
|
|
64
|
+
// Check cluster for Solution CRD
|
|
65
|
+
try {
|
|
66
|
+
const kc = new k8s.KubeConfig();
|
|
67
|
+
kc.loadFromDefault();
|
|
68
|
+
const k8sApi = kc.makeApiClient(k8s.ApiextensionsV1Api);
|
|
69
|
+
const crdName = 'solutions.dot-ai.devopstoolkit.live';
|
|
70
|
+
await k8sApi.readCustomResourceDefinition({ name: crdName });
|
|
71
|
+
// CRD exists, cache result
|
|
72
|
+
this.crdAvailable = true;
|
|
73
|
+
console.log('✅ Solution CRD available - Solution CR generation enabled');
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (error.statusCode === 404 || error.response?.statusCode === 404) {
|
|
78
|
+
// CRD not found, cache result
|
|
79
|
+
this.crdAvailable = false;
|
|
80
|
+
console.log('ℹ️ Solution CRD not available - Solution CR generation disabled (graceful degradation)');
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Other errors (cluster unreachable, etc.) - don't cache, throw
|
|
84
|
+
throw new Error(`Failed to check Solution CRD availability: ${error.message || error}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Reset cache (for testing or manual refresh)
|
|
89
|
+
*/
|
|
90
|
+
reset() {
|
|
91
|
+
this.crdAvailable = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Helper function for checking CRD availability
|
|
96
|
+
* Use this function throughout the codebase
|
|
97
|
+
*/
|
|
98
|
+
async function isSolutionCRDAvailable() {
|
|
99
|
+
const cache = CRDAvailabilityCache.getInstance();
|
|
100
|
+
return cache.isSolutionCRDAvailable();
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reset CRD availability cache (primarily for testing)
|
|
104
|
+
*/
|
|
105
|
+
function resetCRDAvailabilityCache() {
|
|
106
|
+
const cache = CRDAvailabilityCache.getInstance();
|
|
107
|
+
cache.reset();
|
|
108
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-operation.d.ts","sourceRoot":"","sources":["../../src/core/deploy-operation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAM/B;;OAEG;IACU,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiClE;;OAEG;IACH,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"deploy-operation.d.ts","sourceRoot":"","sources":["../../src/core/deploy-operation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAgB;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAM/B;;OAEG;IACU,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiClE;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;YACW,oBAAoB;IAQlC;;OAEG;YACW,cAAc;CA8B7B"}
|
|
@@ -47,11 +47,9 @@ class DeployOperation {
|
|
|
47
47
|
* Get the manifest file path for the solution
|
|
48
48
|
*/
|
|
49
49
|
getManifestPath(options) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
return (0, path_1.join)(sessionDir, `${options.solutionId}.yaml`);
|
|
50
|
+
// Use sessionDir if provided, otherwise use tmp directory (for recommend tool compatibility)
|
|
51
|
+
const tmpDir = options.sessionDir || (0, path_1.join)(process.cwd(), 'tmp');
|
|
52
|
+
return (0, path_1.join)(tmpDir, `${options.solutionId}.yaml`);
|
|
55
53
|
}
|
|
56
54
|
/**
|
|
57
55
|
* Verify that the manifest file exists
|
|
@@ -87,9 +85,9 @@ class DeployOperation {
|
|
|
87
85
|
waitOutput = `\n\nWait output:\n${waitResult}`;
|
|
88
86
|
}
|
|
89
87
|
catch (waitError) {
|
|
90
|
-
// If no deployments found or wait fails, that's OK for
|
|
88
|
+
// If no deployments found or wait fails, that's OK for other resource types (Services, etc.)
|
|
91
89
|
if (waitError.message && waitError.message.includes('no matching resources found')) {
|
|
92
|
-
waitOutput = '\n\nWait output: No deployments found to wait for (likely
|
|
90
|
+
waitOutput = '\n\nWait output: No deployments found to wait for (likely Services, CRs, etc.)';
|
|
93
91
|
}
|
|
94
92
|
else {
|
|
95
93
|
waitOutput = `\n\nWait output: Warning - ${waitError.message}`;
|
|
@@ -13,7 +13,7 @@ export interface PatternSearchOptions extends BaseSearchOptions {
|
|
|
13
13
|
export interface PatternSearchResult extends BaseSearchResult<OrganizationalPattern> {
|
|
14
14
|
}
|
|
15
15
|
export declare class PatternVectorService extends BaseVectorService<OrganizationalPattern> {
|
|
16
|
-
constructor(vectorDB?: VectorDBService, embeddingService?: EmbeddingService);
|
|
16
|
+
constructor(collectionName?: string, vectorDB?: VectorDBService, embeddingService?: EmbeddingService);
|
|
17
17
|
protected createSearchText(pattern: OrganizationalPattern): string;
|
|
18
18
|
protected extractId(pattern: OrganizationalPattern): string;
|
|
19
19
|
protected createPayload(pattern: OrganizationalPattern): Record<string, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-vector-service.d.ts","sourceRoot":"","sources":["../../src/core/pattern-vector-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;CAAG;AAClE,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB,CAAC,qBAAqB,CAAC;CAAG;AAEvF,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,qBAAqB,CAAC;gBACpE,QAAQ,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"pattern-vector-service.d.ts","sourceRoot":"","sources":["../../src/core/pattern-vector-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE/F,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;CAAG;AAClE,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB,CAAC,qBAAqB,CAAC;CAAG;AAEvF,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,qBAAqB,CAAC;gBACpE,cAAc,GAAE,MAAmB,EAAE,QAAQ,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,gBAAgB;IAKhH,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM;IAOlE,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM;IAI3D,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAW5E,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,qBAAqB;IAatE,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAIjG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAI7D,cAAc,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAIlD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAG1C"}
|
|
@@ -9,8 +9,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.PatternVectorService = void 0;
|
|
10
10
|
const base_vector_service_1 = require("./base-vector-service");
|
|
11
11
|
class PatternVectorService extends base_vector_service_1.BaseVectorService {
|
|
12
|
-
constructor(vectorDB, embeddingService) {
|
|
13
|
-
super(
|
|
12
|
+
constructor(collectionName = 'patterns', vectorDB, embeddingService) {
|
|
13
|
+
super(collectionName, vectorDB, embeddingService);
|
|
14
14
|
}
|
|
15
15
|
// Implement abstract methods from BaseVectorService
|
|
16
16
|
createSearchText(pattern) {
|
package/dist/core/schema.d.ts
CHANGED
|
@@ -79,13 +79,7 @@ export interface QuestionGroup {
|
|
|
79
79
|
placeholder: string;
|
|
80
80
|
answer?: string;
|
|
81
81
|
};
|
|
82
|
-
|
|
83
|
-
export interface PatternInfluence {
|
|
84
|
-
patternId: string;
|
|
85
|
-
description: string;
|
|
86
|
-
influence: 'high' | 'medium' | 'low';
|
|
87
|
-
matchedTriggers: string[];
|
|
88
|
-
matchedConcept?: string;
|
|
82
|
+
relevantPolicies?: string[];
|
|
89
83
|
}
|
|
90
84
|
export interface ResourceSolution {
|
|
91
85
|
type: 'single' | 'combination';
|
|
@@ -95,8 +89,7 @@ export interface ResourceSolution {
|
|
|
95
89
|
reasons: string[];
|
|
96
90
|
analysis: string;
|
|
97
91
|
questions: QuestionGroup;
|
|
98
|
-
|
|
99
|
-
usedPatterns?: boolean;
|
|
92
|
+
appliedPatterns?: string[];
|
|
100
93
|
}
|
|
101
94
|
export interface ClusterOptions {
|
|
102
95
|
namespaces: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/core/schema.js
CHANGED
|
@@ -292,7 +292,7 @@ class ResourceRecommender {
|
|
|
292
292
|
// Initialize pattern service only if Vector DB is available
|
|
293
293
|
try {
|
|
294
294
|
const vectorDB = new vector_db_service_1.VectorDBService({ collectionName: 'patterns' });
|
|
295
|
-
this.patternService = new pattern_vector_service_1.PatternVectorService(vectorDB);
|
|
295
|
+
this.patternService = new pattern_vector_service_1.PatternVectorService('patterns', vectorDB);
|
|
296
296
|
console.log('✅ Pattern service initialized with Vector DB');
|
|
297
297
|
}
|
|
298
298
|
catch (error) {
|
|
@@ -412,8 +412,7 @@ class ResourceRecommender {
|
|
|
412
412
|
reasons: solution.reasons || [],
|
|
413
413
|
analysis: solution.analysis || '',
|
|
414
414
|
questions: { required: [], basic: [], advanced: [], open: { question: '', placeholder: '' } },
|
|
415
|
-
|
|
416
|
-
usedPatterns: solution.usedPatterns || false
|
|
415
|
+
appliedPatterns: solution.appliedPatterns || []
|
|
417
416
|
};
|
|
418
417
|
});
|
|
419
418
|
// Sort by score descending
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solution Custom Resource Generation
|
|
3
|
+
*
|
|
4
|
+
* Generates Solution CR manifests from session data for tracking deployments
|
|
5
|
+
*/
|
|
6
|
+
import type { SolutionData } from '../tools/recommend';
|
|
7
|
+
export interface SolutionCROptions {
|
|
8
|
+
solutionId: string;
|
|
9
|
+
namespace: string;
|
|
10
|
+
solution: SolutionData;
|
|
11
|
+
generatedManifestsYaml: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate a Solution Custom Resource from solution session data
|
|
15
|
+
* Parses generated manifests to extract actual resource references
|
|
16
|
+
*
|
|
17
|
+
* @param options Configuration containing solution data and generated manifests
|
|
18
|
+
* @returns Solution CR as YAML string
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateSolutionCR(options: SolutionCROptions): string;
|
|
21
|
+
//# sourceMappingURL=solution-cr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solution-cr.d.ts","sourceRoot":"","sources":["../../src/core/solution-cr.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CA2CrE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Solution Custom Resource Generation
|
|
4
|
+
*
|
|
5
|
+
* Generates Solution CR manifests from session data for tracking deployments
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.generateSolutionCR = generateSolutionCR;
|
|
42
|
+
const yaml = __importStar(require("js-yaml"));
|
|
43
|
+
/**
|
|
44
|
+
* Generate a Solution Custom Resource from solution session data
|
|
45
|
+
* Parses generated manifests to extract actual resource references
|
|
46
|
+
*
|
|
47
|
+
* @param options Configuration containing solution data and generated manifests
|
|
48
|
+
* @returns Solution CR as YAML string
|
|
49
|
+
*/
|
|
50
|
+
function generateSolutionCR(options) {
|
|
51
|
+
const { solutionId, namespace, solution, generatedManifestsYaml } = options;
|
|
52
|
+
// Parse generated manifests to extract actual resource references
|
|
53
|
+
const resourceReferences = extractResourceReferences(generatedManifestsYaml, namespace);
|
|
54
|
+
// Build rationale from solution description, reasons, and analysis
|
|
55
|
+
const rationale = [
|
|
56
|
+
solution.description,
|
|
57
|
+
...solution.reasons,
|
|
58
|
+
solution.analysis
|
|
59
|
+
].filter(Boolean).join('\n\n');
|
|
60
|
+
// Get patterns and policies from session
|
|
61
|
+
const patterns = solution.appliedPatterns || [];
|
|
62
|
+
const policies = solution.questions?.relevantPolicies || [];
|
|
63
|
+
// Create Solution CR object
|
|
64
|
+
const solutionCR = {
|
|
65
|
+
apiVersion: 'dot-ai.devopstoolkit.live/v1alpha1',
|
|
66
|
+
kind: 'Solution',
|
|
67
|
+
metadata: {
|
|
68
|
+
name: `solution-${solutionId}`,
|
|
69
|
+
namespace: namespace,
|
|
70
|
+
labels: {
|
|
71
|
+
'dot-ai.devopstoolkit.live/created-by': 'dot-ai-mcp',
|
|
72
|
+
'dot-ai.devopstoolkit.live/solution-id': solutionId
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
spec: {
|
|
76
|
+
intent: solution.intent,
|
|
77
|
+
resources: resourceReferences,
|
|
78
|
+
context: {
|
|
79
|
+
createdBy: 'dot-ai-mcp',
|
|
80
|
+
rationale: rationale,
|
|
81
|
+
patterns: patterns,
|
|
82
|
+
policies: policies
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
// Convert to YAML
|
|
87
|
+
return yaml.dump(solutionCR);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Extract resource references from generated manifest YAML
|
|
91
|
+
*
|
|
92
|
+
* @param manifestsYaml Generated Kubernetes manifests as YAML string
|
|
93
|
+
* @param defaultNamespace Default namespace if not specified in manifest
|
|
94
|
+
* @returns Array of resource references
|
|
95
|
+
*/
|
|
96
|
+
function extractResourceReferences(manifestsYaml, defaultNamespace) {
|
|
97
|
+
try {
|
|
98
|
+
const manifests = yaml.loadAll(manifestsYaml);
|
|
99
|
+
return manifests
|
|
100
|
+
.filter((manifest) => manifest && manifest.kind && manifest.metadata?.name)
|
|
101
|
+
.map((manifest) => ({
|
|
102
|
+
apiVersion: manifest.apiVersion,
|
|
103
|
+
kind: manifest.kind,
|
|
104
|
+
name: manifest.metadata.name,
|
|
105
|
+
namespace: manifest.metadata.namespace || defaultNamespace
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Failed to extract resource references from manifests:', error);
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -9,12 +9,6 @@ export declare function extractUserAnswers(solution: any): Record<string, any>;
|
|
|
9
9
|
* Sanitize intent string for use as Kubernetes label (63 char limit, alphanumeric + hyphens)
|
|
10
10
|
*/
|
|
11
11
|
export declare function sanitizeIntentForLabel(intent: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Sanitize string for use as Kubernetes resource name (RFC 1123 subdomain)
|
|
14
|
-
* Names must be lowercase alphanumeric characters, hyphens, or periods
|
|
15
|
-
* Must start and end with alphanumeric character, max 63 characters
|
|
16
|
-
*/
|
|
17
|
-
export declare function sanitizeKubernetesName(name: string): string;
|
|
18
12
|
/**
|
|
19
13
|
* Generate standard dot-ai labels for Kubernetes resources
|
|
20
14
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solution-utils.d.ts","sourceRoot":"","sources":["../../src/core/solution-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoBrE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED
|
|
1
|
+
{"version":3,"file":"solution-utils.d.ts","sourceRoot":"","sources":["../../src/core/solution-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoBrE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB3G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAClD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChC,QAAQ,EAAE,GAAG,GACZ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGxB"}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.extractUserAnswers = extractUserAnswers;
|
|
7
7
|
exports.sanitizeIntentForLabel = sanitizeIntentForLabel;
|
|
8
|
-
exports.sanitizeKubernetesName = sanitizeKubernetesName;
|
|
9
8
|
exports.generateDotAiLabels = generateDotAiLabels;
|
|
10
9
|
exports.addDotAiLabels = addDotAiLabels;
|
|
11
10
|
/**
|
|
@@ -39,31 +38,6 @@ function sanitizeIntentForLabel(intent) {
|
|
|
39
38
|
.substring(0, 63)
|
|
40
39
|
.replace(/^-+|-+$/g, '');
|
|
41
40
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Sanitize string for use as Kubernetes resource name (RFC 1123 subdomain)
|
|
44
|
-
* Names must be lowercase alphanumeric characters, hyphens, or periods
|
|
45
|
-
* Must start and end with alphanumeric character, max 63 characters
|
|
46
|
-
*/
|
|
47
|
-
function sanitizeKubernetesName(name) {
|
|
48
|
-
if (!name) {
|
|
49
|
-
return 'default-name';
|
|
50
|
-
}
|
|
51
|
-
let sanitized = name
|
|
52
|
-
.toLowerCase()
|
|
53
|
-
.replace(/[^a-z0-9.-]/g, '-') // Replace invalid chars with hyphens
|
|
54
|
-
.substring(0, 63); // Enforce max length
|
|
55
|
-
// Remove leading/trailing dots or hyphens
|
|
56
|
-
sanitized = sanitized.replace(/^[.-]+|[.-]+$/g, '');
|
|
57
|
-
// Ensure starts with alphanumeric
|
|
58
|
-
if (sanitized && !/^[a-z0-9]/.test(sanitized)) {
|
|
59
|
-
sanitized = 'a' + sanitized.substring(1);
|
|
60
|
-
}
|
|
61
|
-
// Ensure ends with alphanumeric
|
|
62
|
-
if (sanitized && !/[a-z0-9]$/.test(sanitized)) {
|
|
63
|
-
sanitized = sanitized.substring(0, sanitized.length - 1) + 'z';
|
|
64
|
-
}
|
|
65
|
-
return sanitized || 'default-name';
|
|
66
|
-
}
|
|
67
41
|
/**
|
|
68
42
|
* Generate standard dot-ai labels for Kubernetes resources
|
|
69
43
|
*/
|