@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 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;AA4BjC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU;IA2BnD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IAgFlC;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMrD;;;;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"}
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: 'GOOGLE_API_KEY',
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
- const resolvedApiKey = process.env.CUSTOM_LLM_API_KEY || process.env[apiKeyEnvVar];
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
- return !!process.env[apiKeyEnvVar];
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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"}
@@ -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 < 5) {
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
- const [name, shortNames, apiVersion, namespaced, kind] = parts;
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;;;;;;;;;;;;;CAajB,CAAC;AAEX;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,OAAO,cAAc,GAAG,MAAM,CAE7E"}
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;IAqFvB,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"}
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"}
@@ -53,6 +53,7 @@ class VercelProvider {
53
53
  });
54
54
  break;
55
55
  case 'google':
56
+ case 'google_flash': // PRD #294: Gemini 3 Flash variant
56
57
  provider = (0, google_1.createGoogleGenerativeAI)({ apiKey: this.apiKey });
57
58
  break;
58
59
  case 'anthropic':
@@ -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
- // Extract JSON from code block
120
+ // Try to extract JSON from code block first (Claude format)
121
121
  const jsonMatch = response.match(/```json\n([\s\S]+?)\n```/);
122
- if (!jsonMatch) {
123
- const truncatedResponse = response.substring(0, 500);
124
- logger.error(`AI response missing JSON code block. Response: ${truncatedResponse}`);
125
- throw new Error('AI did not return structured JSON response. Expected ```json code block with proposal.');
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(jsonMatch[1]);
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BjD,CAAC;AAklBF;;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"}
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.170.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 and add completion work log:
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 and work log
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 work log and issue comment clearly explain closure
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
- ### After Implementation
219
- Once you complete a task or milestone, update PRD progress by running the `prd-update-progress` prompt.
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 and add work log entry
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. **Add detailed work log entry** with evidence links
247
- 3. **Update status sections** to reflect current phase
248
- 4. **Preserve unchecked items** that still need work
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
  ```