@vfarcic/dot-ai 0.170.0 → 0.172.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/README.md +7 -0
- package/dist/core/ai-provider-factory.d.ts.map +1 -1
- package/dist/core/ai-provider-factory.js +13 -3
- package/dist/core/discovery.d.ts.map +1 -1
- package/dist/core/discovery.js +25 -3
- package/dist/core/model-config.d.ts +1 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/providers/vercel-provider.d.ts.map +1 -1
- package/dist/core/providers/vercel-provider.js +1 -0
- package/dist/tools/operate-analysis.js +19 -6
- package/dist/tools/organizational-data.d.ts +3 -0
- package/dist/tools/organizational-data.d.ts.map +1 -1
- package/dist/tools/organizational-data.js +96 -2
- package/package.json +2 -1
- package/shared-prompts/prd-close.md +3 -32
- package/shared-prompts/prd-start.md +13 -2
- package/shared-prompts/prd-update-progress.md +4 -26
package/README.md
CHANGED
|
@@ -39,6 +39,13 @@ DevOps AI Toolkit brings AI-powered intelligence to platform engineering, Kubern
|
|
|
39
39
|
- Automated repository setup with governance files
|
|
40
40
|
- Shared prompt libraries for consistent workflows
|
|
41
41
|
|
|
42
|
+
## Deployment Options
|
|
43
|
+
|
|
44
|
+
- **[Kubernetes Setup](https://devopstoolkit.ai/docs/mcp/setup/kubernetes-setup/)** - Recommended: Full features with autonomous capability scanning
|
|
45
|
+
- **[ToolHive Setup](https://devopstoolkit.ai/docs/mcp/setup/kubernetes-toolhive-setup/)** - Operator-managed Kubernetes deployment
|
|
46
|
+
- **[Docker Setup](https://devopstoolkit.ai/docs/mcp/setup/docker-setup/)** - Local development (manual capability scanning only)
|
|
47
|
+
- **[NPX Setup](https://devopstoolkit.ai/docs/mcp/setup/npx-setup/)** - Quick trials with Node.js
|
|
48
|
+
|
|
42
49
|
[Read the Documentation](https://devopstoolkit.ai/docs/mcp/)
|
|
43
50
|
|
|
44
51
|
## Support
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-provider-factory.d.ts","sourceRoot":"","sources":["../../src/core/ai-provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,UAAU,EACV,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AA6BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IA2BnD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IAoFlC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWrD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAMxC;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAGxD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}
|
|
@@ -24,7 +24,8 @@ const PROVIDER_ENV_KEYS = {
|
|
|
24
24
|
anthropic_opus: 'ANTHROPIC_API_KEY', // Uses same API key as regular Anthropic
|
|
25
25
|
anthropic_haiku: 'ANTHROPIC_API_KEY', // Uses same API key as regular Anthropic
|
|
26
26
|
openai: 'OPENAI_API_KEY',
|
|
27
|
-
google: '
|
|
27
|
+
google: 'GOOGLE_GENERATIVE_AI_API_KEY', // Standard Vercel AI SDK env var (also checks GOOGLE_API_KEY as fallback)
|
|
28
|
+
google_flash: 'GOOGLE_GENERATIVE_AI_API_KEY', // PRD #294: Uses same API key as regular Google
|
|
28
29
|
kimi: 'MOONSHOT_API_KEY', // PRD #237: Moonshot AI Kimi K2
|
|
29
30
|
kimi_thinking: 'MOONSHOT_API_KEY', // PRD #237: Uses same API key as regular Kimi
|
|
30
31
|
xai: 'XAI_API_KEY',
|
|
@@ -115,7 +116,11 @@ class AIProviderFactory {
|
|
|
115
116
|
`Falling back to NoOpProvider.\n`);
|
|
116
117
|
return new noop_provider_1.NoOpAIProvider();
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
+
// Check primary env var, with fallback for Google providers (GOOGLE_API_KEY for backward compatibility)
|
|
120
|
+
let resolvedApiKey = process.env.CUSTOM_LLM_API_KEY || process.env[apiKeyEnvVar];
|
|
121
|
+
if (!resolvedApiKey && providerType.startsWith('google')) {
|
|
122
|
+
resolvedApiKey = process.env.GOOGLE_API_KEY; // Fallback for backward compatibility
|
|
123
|
+
}
|
|
119
124
|
if (!resolvedApiKey) {
|
|
120
125
|
process.stderr.write(`INFO: ${apiKeyEnvVar} not configured. ` +
|
|
121
126
|
`AI features will be unavailable. ` +
|
|
@@ -160,7 +165,12 @@ class AIProviderFactory {
|
|
|
160
165
|
const apiKeyEnvVar = PROVIDER_ENV_KEYS[provider];
|
|
161
166
|
if (!apiKeyEnvVar)
|
|
162
167
|
return false;
|
|
163
|
-
|
|
168
|
+
// Check primary env var, with fallback for Google providers
|
|
169
|
+
const hasKey = !!process.env[apiKeyEnvVar];
|
|
170
|
+
if (!hasKey && provider.startsWith('google')) {
|
|
171
|
+
return !!process.env.GOOGLE_API_KEY; // Fallback for backward compatibility
|
|
172
|
+
}
|
|
173
|
+
return hasKey;
|
|
164
174
|
}
|
|
165
175
|
/**
|
|
166
176
|
* Get list of available providers (implemented + have API keys configured)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/core/discovery.js
CHANGED
|
@@ -413,12 +413,34 @@ class KubernetesDiscovery {
|
|
|
413
413
|
// Parse the standard kubectl api-resources format:
|
|
414
414
|
// NAME SHORTNAMES APIVERSION NAMESPACED KIND
|
|
415
415
|
// pods po v1 true Pod
|
|
416
|
+
// bindings v1 true Binding (no shortname)
|
|
416
417
|
const parts = line.trim().split(/\s+/);
|
|
417
|
-
if (parts.length <
|
|
418
|
-
// Skip malformed lines
|
|
418
|
+
if (parts.length < 4) {
|
|
419
|
+
// Skip truly malformed lines (need at least name, apiVersion, namespaced, kind)
|
|
419
420
|
return null;
|
|
420
421
|
}
|
|
421
|
-
|
|
422
|
+
let name, shortNames, apiVersion, namespaced, kind;
|
|
423
|
+
if (parts.length === 4) {
|
|
424
|
+
// No shortnames column: name, apiVersion, namespaced, kind
|
|
425
|
+
[name, apiVersion, namespaced, kind] = parts;
|
|
426
|
+
shortNames = '';
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
// parts.length >= 5: Has shortnames column: name, shortNames, apiVersion, namespaced, kind
|
|
430
|
+
// But need to verify column 2 is actually shortnames, not apiVersion
|
|
431
|
+
// apiVersion matches patterns like "v1", "apps/v1", "networking.k8s.io/v1"
|
|
432
|
+
const col2 = parts[1];
|
|
433
|
+
const looksLikeApiVersion = col2.includes('/') || /^v\d/.test(col2);
|
|
434
|
+
if (looksLikeApiVersion) {
|
|
435
|
+
// Column 2 is apiVersion, no shortnames
|
|
436
|
+
[name, apiVersion, namespaced, kind] = parts;
|
|
437
|
+
shortNames = '';
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// Column 2 is shortnames
|
|
441
|
+
[name, shortNames, apiVersion, namespaced, kind] = parts;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
422
444
|
// Extract group from apiVersion (e.g., "apps/v1" -> "apps", "v1" -> "")
|
|
423
445
|
let group = '';
|
|
424
446
|
if (apiVersion && apiVersion.includes('/')) {
|
|
@@ -10,6 +10,7 @@ export declare const CURRENT_MODELS: {
|
|
|
10
10
|
readonly anthropic_haiku: "claude-haiku-4-5-20251001";
|
|
11
11
|
readonly openai: "gpt-5.1-codex";
|
|
12
12
|
readonly google: "gemini-3-pro-preview";
|
|
13
|
+
readonly google_flash: "gemini-3-flash-preview";
|
|
13
14
|
readonly kimi: "kimi-k2-0905-preview";
|
|
14
15
|
readonly kimi_thinking: "kimi-k2-thinking";
|
|
15
16
|
readonly xai: "grok-4";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAcjB,CAAC;AAEX;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,OAAO,cAAc,GAAG,MAAM,CAE7E"}
|
|
@@ -14,6 +14,7 @@ exports.CURRENT_MODELS = {
|
|
|
14
14
|
anthropic_haiku: 'claude-haiku-4-5-20251001',
|
|
15
15
|
openai: 'gpt-5.1-codex',
|
|
16
16
|
google: 'gemini-3-pro-preview',
|
|
17
|
+
google_flash: 'gemini-3-flash-preview', // PRD #294: Gemini 3 Flash - faster/cheaper variant with same 1M context
|
|
17
18
|
kimi: 'kimi-k2-0905-preview', // PRD #237: Moonshot AI Kimi K2 - standard model with 256K context
|
|
18
19
|
kimi_thinking: 'kimi-k2-thinking', // PRD #237: Moonshot AI Kimi K2 - extended thinking variant
|
|
19
20
|
xai: 'grok-4',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-provider.d.ts","sourceRoot":"","sources":["../../../src/core/providers/vercel-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACd,MAAM,0BAA0B,CAAC;AAiBlC,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,aAAa,CAAM;gBAEf,MAAM,EAAE,gBAAgB;IAWpC,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"vercel-provider.d.ts","sourceRoot":"","sources":["../../../src/core/providers/vercel-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EACL,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACd,MAAM,0BAA0B,CAAC;AAiBlC,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,aAAa,CAAM;gBAEf,MAAM,EAAE,gBAAgB;IAWpC,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,eAAe;IAsFvB,eAAe,IAAI,MAAM;IAIzB,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM;IAItB,aAAa,IAAI,OAAO;IAIxB,OAAO,CAAC,iBAAiB;IAyBnB,WAAW,CACf,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAkB,EAC7B,iBAAiB,CAAC,EAAE;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GACA,OAAO,CAAC,UAAU,CAAC;IAoJtB;;;;;;;;;;;;OAYG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAmW/D"}
|
|
@@ -117,15 +117,28 @@ async function executeToolLoop(systemPrompt, userMessage, logger, interaction_id
|
|
|
117
117
|
*/
|
|
118
118
|
function parseAIResponse(response, logger) {
|
|
119
119
|
logger.debug('Parsing AI response');
|
|
120
|
-
//
|
|
120
|
+
// Try to extract JSON from code block first (Claude format)
|
|
121
121
|
const jsonMatch = response.match(/```json\n([\s\S]+?)\n```/);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
let jsonContent;
|
|
123
|
+
if (jsonMatch) {
|
|
124
|
+
jsonContent = jsonMatch[1];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Fallback: try to parse raw JSON response (Gemini format)
|
|
128
|
+
// Look for JSON object starting with { and ending with }
|
|
129
|
+
const rawJsonMatch = response.match(/^\s*(\{[\s\S]*\})\s*$/);
|
|
130
|
+
if (rawJsonMatch) {
|
|
131
|
+
jsonContent = rawJsonMatch[1];
|
|
132
|
+
logger.debug('Parsing raw JSON response (no code block wrapper)');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const truncatedResponse = response.substring(0, 500);
|
|
136
|
+
logger.error(`AI response not valid JSON. Response: ${truncatedResponse}`);
|
|
137
|
+
throw new Error('AI did not return structured JSON response. Expected JSON object or ```json code block.');
|
|
138
|
+
}
|
|
126
139
|
}
|
|
127
140
|
try {
|
|
128
|
-
const parsed = JSON.parse(
|
|
141
|
+
const parsed = JSON.parse(jsonContent);
|
|
129
142
|
// Validate required fields
|
|
130
143
|
if (!parsed.analysis || typeof parsed.analysis !== 'string') {
|
|
131
144
|
throw new Error('AI response missing required "analysis" field (string)');
|
|
@@ -40,6 +40,9 @@ export declare const ORGANIZATIONAL_DATA_TOOL_INPUT_SCHEMA: {
|
|
|
40
40
|
apiVersion: z.ZodString;
|
|
41
41
|
}, z.core.$strip>>;
|
|
42
42
|
resourceList: z.ZodOptional<z.ZodString>;
|
|
43
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
44
|
+
full: "full";
|
|
45
|
+
}>>;
|
|
43
46
|
collection: z.ZodOptional<z.ZodString>;
|
|
44
47
|
interaction_id: z.ZodOptional<z.ZodString>;
|
|
45
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organizational-data.d.ts","sourceRoot":"","sources":["../../src/tools/organizational-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAehD,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D,eAAO,MAAM,oCAAoC,+jBAAyjB,CAAC;AAG3mB,eAAO,MAAM,qCAAqC
|
|
1
|
+
{"version":3,"file":"organizational-data.d.ts","sourceRoot":"","sources":["../../src/tools/organizational-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAehD,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D,eAAO,MAAM,oCAAoC,+jBAAyjB,CAAC;AAG3mB,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjD,CAAC;AA0sBF;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,KAAK,GAAG,IAAI,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Hd"}
|
|
@@ -78,8 +78,10 @@ exports.ORGANIZATIONAL_DATA_TOOL_INPUT_SCHEMA = {
|
|
|
78
78
|
group: zod_1.z.string(),
|
|
79
79
|
apiVersion: zod_1.z.string()
|
|
80
80
|
}).optional().describe('Kubernetes resource reference (for capabilities operations)'),
|
|
81
|
-
// Resource list for specific resource scanning
|
|
82
|
-
resourceList: zod_1.z.string().optional().describe('Comma-separated list of resources to scan (format: Kind.group or Kind for core resources)'),
|
|
81
|
+
// Resource list for specific resource scanning (fire-and-forget when no sessionId)
|
|
82
|
+
resourceList: zod_1.z.string().optional().describe('Comma-separated list of resources to scan (format: Kind.group or Kind for core resources). When provided without sessionId, triggers a fire-and-forget targeted scan.'),
|
|
83
|
+
// Fire-and-forget scan mode (for controller integration)
|
|
84
|
+
mode: zod_1.z.enum(['full']).optional().describe('Scan mode: "full" triggers a fire-and-forget full cluster scan that returns immediately and scans all resources in the cluster. Mutually exclusive with resourceList.'),
|
|
83
85
|
// Collection name for capabilities (allows using different collections for different purposes)
|
|
84
86
|
collection: zod_1.z.string().optional().describe('Collection name for capabilities operations (default: "capabilities", use "capabilities-policies" for pre-populated test data)'),
|
|
85
87
|
interaction_id: zod_1.z.string().optional().describe('INTERNAL ONLY - Do not populate. Used for evaluation dataset generation.')
|
|
@@ -197,6 +199,85 @@ function createCapabilityScanCompletionResponse(sessionId, totalProcessed, succe
|
|
|
197
199
|
userNote: "The above options are available for you to choose from - the system will not execute them automatically."
|
|
198
200
|
};
|
|
199
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Handle fire-and-forget capability scanning (PRD #216 - Controller Integration)
|
|
204
|
+
*
|
|
205
|
+
* This function provides a simplified API for automated controllers to trigger
|
|
206
|
+
* capability scans without going through the interactive workflow.
|
|
207
|
+
*
|
|
208
|
+
* Two modes:
|
|
209
|
+
* 1. mode: "full" - Triggers full cluster scan
|
|
210
|
+
* 2. resourceList: "Kind.group,Kind.group" - Triggers targeted scan
|
|
211
|
+
*
|
|
212
|
+
* Both modes return immediately with { status: "started" } and run scanning in background.
|
|
213
|
+
*/
|
|
214
|
+
async function handleFireAndForgetScan(args, logger, requestId, capabilityService) {
|
|
215
|
+
const isFullScan = args.mode === 'full';
|
|
216
|
+
const isTargetedScan = !!args.resourceList;
|
|
217
|
+
logger.info('Fire-and-forget scan initiated', {
|
|
218
|
+
requestId,
|
|
219
|
+
mode: isFullScan ? 'full' : 'targeted',
|
|
220
|
+
resourceList: args.resourceList
|
|
221
|
+
});
|
|
222
|
+
// Create a session for progress tracking (controllers can optionally poll for status)
|
|
223
|
+
const sessionId = `cap-scan-${Date.now()}-${(0, crypto_1.randomUUID)().substring(0, 8)}`;
|
|
224
|
+
const session = {
|
|
225
|
+
sessionId,
|
|
226
|
+
currentStep: 'scanning',
|
|
227
|
+
startedAt: new Date().toISOString(),
|
|
228
|
+
lastActivity: new Date().toISOString(),
|
|
229
|
+
selectedResources: isFullScan ? 'all' : undefined,
|
|
230
|
+
resourceList: args.resourceList,
|
|
231
|
+
currentResourceIndex: 0
|
|
232
|
+
};
|
|
233
|
+
// If targeted scan, parse and validate resources
|
|
234
|
+
const parsedResources = isTargetedScan && !isFullScan
|
|
235
|
+
? args.resourceList.split(',').map((r) => r.trim()).filter((r) => r.length > 0)
|
|
236
|
+
: [];
|
|
237
|
+
if (isTargetedScan && !isFullScan) {
|
|
238
|
+
if (parsedResources.length === 0) {
|
|
239
|
+
return {
|
|
240
|
+
success: false,
|
|
241
|
+
operation: 'scan',
|
|
242
|
+
dataType: 'capabilities',
|
|
243
|
+
error: {
|
|
244
|
+
message: 'Empty resource list',
|
|
245
|
+
details: 'resourceList parameter must contain at least one resource'
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
session.selectedResources = parsedResources;
|
|
250
|
+
}
|
|
251
|
+
// Save session for progress tracking
|
|
252
|
+
saveCapabilitySession(session);
|
|
253
|
+
// Start scanning in background (don't await) - fire and forget
|
|
254
|
+
(0, capability_scan_workflow_1.handleScanning)(session, { ...args, response: undefined }, logger, requestId, capabilityService, parseNumericResponse, transitionCapabilitySession, cleanupCapabilitySession, createCapabilityScanCompletionResponse).catch(error => {
|
|
255
|
+
logger.error('Background fire-and-forget scan failed', error, {
|
|
256
|
+
requestId,
|
|
257
|
+
sessionId: session.sessionId,
|
|
258
|
+
mode: isFullScan ? 'full' : 'targeted'
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
// Return immediately - don't wait for scan to complete
|
|
262
|
+
const resourceCount = parsedResources.length > 0 ? parsedResources.length : undefined;
|
|
263
|
+
return {
|
|
264
|
+
success: true,
|
|
265
|
+
operation: 'scan',
|
|
266
|
+
dataType: 'capabilities',
|
|
267
|
+
status: 'started',
|
|
268
|
+
mode: isFullScan ? 'full' : 'targeted',
|
|
269
|
+
sessionId: session.sessionId,
|
|
270
|
+
message: isFullScan
|
|
271
|
+
? 'Full cluster scan initiated. Scan runs in background.'
|
|
272
|
+
: `Scan initiated for ${resourceCount} resource(s). Scan runs in background.`,
|
|
273
|
+
...(resourceCount && { resourceCount }),
|
|
274
|
+
checkProgress: {
|
|
275
|
+
dataType: 'capabilities',
|
|
276
|
+
operation: 'progress',
|
|
277
|
+
sessionId: session.sessionId
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
200
281
|
/**
|
|
201
282
|
* Handle capabilities operations - PRD #48 Implementation
|
|
202
283
|
*/
|
|
@@ -481,6 +562,19 @@ async function handleCapabilityScan(args, logger, requestId) {
|
|
|
481
562
|
vectorDB: 'healthy',
|
|
482
563
|
embeddings: 'available'
|
|
483
564
|
});
|
|
565
|
+
// ============================================================================
|
|
566
|
+
// FIRE-AND-FORGET MODE (PRD #216 - Controller Integration)
|
|
567
|
+
// ============================================================================
|
|
568
|
+
// Check for fire-and-forget parameters BEFORE interactive workflow
|
|
569
|
+
// This allows controllers to trigger scans without going through the interactive steps
|
|
570
|
+
// ============================================================================
|
|
571
|
+
const isFireAndForget = !args.sessionId && (args.mode === 'full' || args.resourceList);
|
|
572
|
+
if (isFireAndForget) {
|
|
573
|
+
return await handleFireAndForgetScan(args, logger, requestId, capabilityService);
|
|
574
|
+
}
|
|
575
|
+
// ============================================================================
|
|
576
|
+
// INTERACTIVE WORKFLOW MODE (Existing behavior for human users)
|
|
577
|
+
// ============================================================================
|
|
484
578
|
// Get or create session with step-based state management
|
|
485
579
|
const session = getOrCreateCapabilitySession(args.sessionId, args, logger, requestId);
|
|
486
580
|
// Validate client is on correct step - only for existing sessions
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vfarcic/dot-ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.172.0",
|
|
4
4
|
"description": "AI-powered development productivity platform that enhances software development workflows through intelligent automation and AI-driven assistance",
|
|
5
5
|
"mcpName": "io.github.vfarcic/dot-ai",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"test:integration:haiku": "AI_PROVIDER=anthropic_haiku DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
25
25
|
"test:integration:gpt": "AI_PROVIDER=openai DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
26
26
|
"test:integration:gemini": "AI_PROVIDER=google DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
27
|
+
"test:integration:gemini-flash": "AI_PROVIDER=google_flash DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
27
28
|
"test:integration:grok": "AI_PROVIDER=xai DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
28
29
|
"test:integration:kimi": "AI_PROVIDER=kimi DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
29
30
|
"test:integration:kimi-thinking": "AI_PROVIDER=kimi_thinking DEBUG_DOT_AI=true ./tests/integration/infrastructure/run-integration-tests.sh",
|
|
@@ -82,7 +82,7 @@ Proceed with closure? (yes/no)
|
|
|
82
82
|
|
|
83
83
|
### Step 3: Update PRD File
|
|
84
84
|
|
|
85
|
-
Update the PRD metadata
|
|
85
|
+
Update the PRD metadata:
|
|
86
86
|
|
|
87
87
|
**Metadata Updates:**
|
|
88
88
|
```markdown
|
|
@@ -91,34 +91,6 @@ Update the PRD metadata and add completion work log:
|
|
|
91
91
|
**Completed**: [Current Date] [or] **Closed**: [Current Date]
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
-
**Add Work Log Entry:**
|
|
95
|
-
```markdown
|
|
96
|
-
### [Date]: PRD Closure - [Reason Category]
|
|
97
|
-
**Duration**: N/A (administrative closure)
|
|
98
|
-
**Status**: [Complete/Closed]
|
|
99
|
-
|
|
100
|
-
**Closure Summary**:
|
|
101
|
-
[Explain why PRD is being closed]
|
|
102
|
-
|
|
103
|
-
**Implementation Evidence**: [If applicable]
|
|
104
|
-
[Link to external project, previous PR, or existing functionality]
|
|
105
|
-
|
|
106
|
-
**Key Points**:
|
|
107
|
-
- [What was requested in original PRD]
|
|
108
|
-
- [How/where it was implemented, or why no longer needed]
|
|
109
|
-
- [Any gaps or differences from original requirements]
|
|
110
|
-
|
|
111
|
-
[If "Already Implemented"]
|
|
112
|
-
**Functionality Delivered**:
|
|
113
|
-
- [Feature 1] - Implemented in [location/project]
|
|
114
|
-
- [Feature 2] - Implemented in [location/project]
|
|
115
|
-
|
|
116
|
-
[If "No Longer Needed"]
|
|
117
|
-
**Reason for Closure**:
|
|
118
|
-
- [Why requirements changed]
|
|
119
|
-
- [What superseded this PRD]
|
|
120
|
-
```
|
|
121
|
-
|
|
122
94
|
### Step 4: Move PRD to Archive
|
|
123
95
|
|
|
124
96
|
Move the PRD file to the done directory and update roadmap:
|
|
@@ -219,7 +191,6 @@ git commit -m "docs(prd-[number]): close PRD #[number] - [brief reason] [skip ci
|
|
|
219
191
|
|
|
220
192
|
- Moved PRD to prds/done/ directory
|
|
221
193
|
- Updated PRD status to [Complete/Closed]
|
|
222
|
-
- Added work log documenting [closure reason]
|
|
223
194
|
- Updated GitHub issue description with new path
|
|
224
195
|
- [Implementation details or reason]
|
|
225
196
|
|
|
@@ -296,7 +267,7 @@ Requirements have evolved and this PRD is out of scope.
|
|
|
296
267
|
|
|
297
268
|
## Success Criteria
|
|
298
269
|
|
|
299
|
-
✅ **PRD file updated** with completion/closure metadata
|
|
270
|
+
✅ **PRD file updated** with completion/closure metadata
|
|
300
271
|
✅ **PRD archived** to `prds/done/` directory
|
|
301
272
|
✅ **GitHub issue updated** with new PRD path
|
|
302
273
|
✅ **GitHub issue closed** with comprehensive closure comment
|
|
@@ -307,6 +278,6 @@ Requirements have evolved and this PRD is out of scope.
|
|
|
307
278
|
|
|
308
279
|
- **No PR required**: This workflow commits directly to main for documentation-only changes
|
|
309
280
|
- **Skip CI**: Always include `[skip ci]` to avoid unnecessary CI runs
|
|
310
|
-
- **Comprehensive documentation**: Ensure
|
|
281
|
+
- **Comprehensive documentation**: Ensure issue comment clearly explains closure reason
|
|
311
282
|
- **Implementation references**: Link to external projects, repos, or PRs where functionality exists
|
|
312
283
|
- **Gap acknowledgment**: Be honest about what's implemented vs. what's missing
|
|
@@ -215,11 +215,22 @@ If confirmed, provide:
|
|
|
215
215
|
- **Testing approach**: How to validate the implementation
|
|
216
216
|
- **Progress checkpoints**: When to update the PRD with progress
|
|
217
217
|
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
## Step 6: Update Progress After Completion
|
|
219
|
+
|
|
220
|
+
After the user completes the task implementation, prompt them to update PRD progress:
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
**Task implementation complete.**
|
|
225
|
+
|
|
226
|
+
To update PRD progress and commit your work, run the `prd-update-progress` prompt.
|
|
220
227
|
|
|
221
228
|
*Note: Different agents/clients may have different syntax for executing commands and prompts (e.g., `/prd-update-progress` in Claude Code, or other syntax in different MCP clients).*
|
|
222
229
|
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
This ensures a smooth workflow from task selection → implementation → progress tracking → next task.
|
|
233
|
+
|
|
223
234
|
## Success Criteria
|
|
224
235
|
|
|
225
236
|
This command should:
|
|
@@ -17,7 +17,7 @@ You are helping update an existing Product Requirements Document (PRD) based on
|
|
|
17
17
|
3. **Map Changes to PRD Items** - Intelligently connect work to requirements
|
|
18
18
|
4. **Propose Updates** - Suggest checkbox completions and requirement changes
|
|
19
19
|
5. **User Confirmation** - Verify proposals and handle edge cases
|
|
20
|
-
6. **Update PRD** - Apply changes
|
|
20
|
+
6. **Update PRD** - Apply changes to checkboxes and status
|
|
21
21
|
7. **Flag Divergences** - Alert when actual work differs from planned work
|
|
22
22
|
8. **Commit Progress Updates** - Preserve progress checkpoint
|
|
23
23
|
9. **Continue to Next Task** - Prompt user to run /prd-next
|
|
@@ -181,26 +181,6 @@ Present a comprehensive breakdown:
|
|
|
181
181
|
**CLEARLY list what still needs to be done.**
|
|
182
182
|
**DO NOT claim "everything is done" unless ALL items are truly complete.**
|
|
183
183
|
|
|
184
|
-
### Work Log Updates
|
|
185
|
-
Propose adding a work log entry summarizing completed work:
|
|
186
|
-
```markdown
|
|
187
|
-
### [Date]: Implementation Progress Update
|
|
188
|
-
**Duration**: [X hours estimated based on commit timestamps]
|
|
189
|
-
**Commits**: [X commits]
|
|
190
|
-
**Primary Focus**: [Main area of work based on file changes]
|
|
191
|
-
|
|
192
|
-
**Completed PRD Items**:
|
|
193
|
-
- [x] [Requirement] - Evidence: [specific files/changes]
|
|
194
|
-
- [x] [Second requirement] - Evidence: [specific files/changes]
|
|
195
|
-
|
|
196
|
-
**Additional Work Done**:
|
|
197
|
-
- [Unexpected work that emerged during implementation]
|
|
198
|
-
- [Refactoring or improvements not originally planned]
|
|
199
|
-
|
|
200
|
-
**Next Session Priorities**:
|
|
201
|
-
- [Items that should be worked on next based on current state]
|
|
202
|
-
```
|
|
203
|
-
|
|
204
184
|
## Step 5: Implementation vs Plan Analysis
|
|
205
185
|
|
|
206
186
|
### Divergence Detection
|
|
@@ -243,10 +223,9 @@ Wait for user confirmation before making changes, and handle:
|
|
|
243
223
|
|
|
244
224
|
When applying updates:
|
|
245
225
|
1. **Update only confirmed items** - Don't make assumptions
|
|
246
|
-
2. **
|
|
247
|
-
3. **
|
|
248
|
-
4. **
|
|
249
|
-
5. **Update completion percentages** realistically
|
|
226
|
+
2. **Update status sections** to reflect current phase
|
|
227
|
+
3. **Preserve unchecked items** that still need work
|
|
228
|
+
4. **Update completion percentages** realistically
|
|
250
229
|
|
|
251
230
|
## Step 7.5: Code Example Validation
|
|
252
231
|
|
|
@@ -299,7 +278,6 @@ git commit -m "feat(prd-X): implement [brief description of completed work]
|
|
|
299
278
|
|
|
300
279
|
- [Brief list of key implementation achievements]
|
|
301
280
|
- Updated PRD checkboxes for completed items
|
|
302
|
-
- Added work log entry with progress summary
|
|
303
281
|
|
|
304
282
|
Progress: X% complete - [next major milestone]"
|
|
305
283
|
```
|