@plumbus/core 0.2.9 → 0.3.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/.tsbuildinfo +1 -1
- package/dist/ai/__tests__/ai-service.test.js +704 -1
- package/dist/ai/__tests__/ai-service.test.js.map +1 -1
- package/dist/ai/__tests__/chunking.test.js +34 -0
- package/dist/ai/__tests__/chunking.test.js.map +1 -1
- package/dist/ai/__tests__/provider.test.d.ts.map +1 -1
- package/dist/ai/__tests__/provider.test.js +425 -0
- package/dist/ai/__tests__/provider.test.js.map +1 -1
- package/dist/ai/__tests__/validation.test.js +200 -1
- package/dist/ai/__tests__/validation.test.js.map +1 -1
- package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts +2 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts.map +1 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.js +60 -0
- package/dist/ai/__tests__/zod-to-provider-schema.test.js.map +1 -0
- package/dist/ai/ai-service.d.ts +19 -2
- package/dist/ai/ai-service.d.ts.map +1 -1
- package/dist/ai/ai-service.js +544 -110
- package/dist/ai/ai-service.js.map +1 -1
- package/dist/ai/cost-tracker.d.ts +26 -1
- package/dist/ai/cost-tracker.d.ts.map +1 -1
- package/dist/ai/cost-tracker.js +1 -0
- package/dist/ai/cost-tracker.js.map +1 -1
- package/dist/ai/index.d.ts +5 -3
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/provider.d.ts +45 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +226 -32
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/rag/chunking.js +53 -3
- package/dist/ai/rag/chunking.js.map +1 -1
- package/dist/ai/refusal.d.ts +28 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +36 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/validation.d.ts +40 -8
- package/dist/ai/validation.d.ts.map +1 -1
- package/dist/ai/validation.js +97 -6
- package/dist/ai/validation.js.map +1 -1
- package/dist/ai/zod-to-provider-schema.d.ts +15 -0
- package/dist/ai/zod-to-provider-schema.d.ts.map +1 -0
- package/dist/ai/zod-to-provider-schema.js +200 -0
- package/dist/ai/zod-to-provider-schema.js.map +1 -0
- package/dist/cli/__tests__/doctor.test.js +104 -2
- package/dist/cli/__tests__/doctor.test.js.map +1 -1
- package/dist/cli/__tests__/init.test.js +127 -7
- package/dist/cli/__tests__/init.test.js.map +1 -1
- package/dist/cli/__tests__/migrate.test.js +159 -2
- package/dist/cli/__tests__/migrate.test.js.map +1 -1
- package/dist/cli/commands/__tests__/commands.test.js +5 -0
- package/dist/cli/commands/__tests__/commands.test.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +21 -1
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +78 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +7 -2
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts +16 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +226 -25
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +258 -8
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +21 -1
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/data/__tests__/drift-inspector.test.d.ts +2 -0
- package/dist/data/__tests__/drift-inspector.test.d.ts.map +1 -0
- package/dist/data/__tests__/drift-inspector.test.js +170 -0
- package/dist/data/__tests__/drift-inspector.test.js.map +1 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.d.ts +2 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.d.ts.map +1 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.js +329 -0
- package/dist/data/__tests__/framework-migration-rewriter.test.js.map +1 -0
- package/dist/data/__tests__/migration.test.js +93 -2
- package/dist/data/__tests__/migration.test.js.map +1 -1
- package/dist/data/__tests__/repository.test.js +126 -0
- package/dist/data/__tests__/repository.test.js.map +1 -1
- package/dist/data/drift-inspector.d.ts +41 -0
- package/dist/data/drift-inspector.d.ts.map +1 -0
- package/dist/data/drift-inspector.js +197 -0
- package/dist/data/drift-inspector.js.map +1 -0
- package/dist/data/framework-migration-rewriter.d.ts +61 -0
- package/dist/data/framework-migration-rewriter.d.ts.map +1 -0
- package/dist/data/framework-migration-rewriter.js +357 -0
- package/dist/data/framework-migration-rewriter.js.map +1 -0
- package/dist/data/index.d.ts +2 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +2 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/migration.d.ts +31 -1
- package/dist/data/migration.d.ts.map +1 -1
- package/dist/data/migration.js +113 -3
- package/dist/data/migration.js.map +1 -1
- package/dist/data/repository.d.ts.map +1 -1
- package/dist/data/repository.js +21 -0
- package/dist/data/repository.js.map +1 -1
- package/dist/define/__tests__/definePrompt.test.js +37 -0
- package/dist/define/__tests__/definePrompt.test.js.map +1 -1
- package/dist/define/definePrompt.d.ts +13 -0
- package/dist/define/definePrompt.d.ts.map +1 -1
- package/dist/define/definePrompt.js +3 -0
- package/dist/define/definePrompt.js.map +1 -1
- package/dist/errors/http.d.ts.map +1 -1
- package/dist/errors/http.js +2 -0
- package/dist/errors/http.js.map +1 -1
- package/dist/errors/index.d.ts +12 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +21 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/events/__tests__/event-emitter.test.js +72 -0
- package/dist/events/__tests__/event-emitter.test.js.map +1 -1
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +51 -0
- package/dist/events/emitter.js.map +1 -1
- package/dist/execution/__tests__/context-factory.test.js +1 -0
- package/dist/execution/__tests__/context-factory.test.js.map +1 -1
- package/dist/execution/context-factory.d.ts.map +1 -1
- package/dist/execution/context-factory.js +2 -0
- package/dist/execution/context-factory.js.map +1 -1
- package/dist/flows/__tests__/flow-engine.test.js +451 -4
- package/dist/flows/__tests__/flow-engine.test.js.map +1 -1
- package/dist/flows/__tests__/flow-service.test.js +8 -0
- package/dist/flows/__tests__/flow-service.test.js.map +1 -1
- package/dist/flows/__tests__/step-executor.test.js +8 -2
- package/dist/flows/__tests__/step-executor.test.js.map +1 -1
- package/dist/flows/engine.d.ts +50 -1
- package/dist/flows/engine.d.ts.map +1 -1
- package/dist/flows/engine.js +427 -23
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/flow-service.d.ts.map +1 -1
- package/dist/flows/flow-service.js +4 -0
- package/dist/flows/flow-service.js.map +1 -1
- package/dist/flows/index.d.ts +1 -1
- package/dist/flows/index.d.ts.map +1 -1
- package/dist/flows/index.js +1 -1
- package/dist/flows/index.js.map +1 -1
- package/dist/flows/schema.d.ts +34 -0
- package/dist/flows/schema.d.ts.map +1 -1
- package/dist/flows/schema.js +3 -0
- package/dist/flows/schema.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/server/bootstrap.d.ts +14 -0
- package/dist/server/bootstrap.d.ts.map +1 -1
- package/dist/server/bootstrap.js +23 -4
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/testing/context.d.ts.map +1 -1
- package/dist/testing/context.js +37 -1
- package/dist/testing/context.js.map +1 -1
- package/dist/types/context.d.ts +110 -0
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/enums.d.ts +2 -0
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +2 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/prompt.d.ts +64 -0
- package/dist/types/prompt.d.ts.map +1 -1
- package/dist/worker/__tests__/bootstrap.test.js +36 -2
- package/dist/worker/__tests__/bootstrap.test.js.map +1 -1
- package/dist/worker/bootstrap.d.ts +7 -0
- package/dist/worker/bootstrap.d.ts.map +1 -1
- package/dist/worker/bootstrap.js +153 -12
- package/dist/worker/bootstrap.js.map +1 -1
- package/instructions/framework.md +7 -0
- package/instructions/guardrails.md +39 -0
- package/instructions/patterns.md +10 -0
- package/package.json +3 -2
package/dist/ai/validation.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
maxRetries?: number;
|
|
6
|
-
/** Whether to append validation error to retry prompt */
|
|
7
|
-
feedbackOnError?: boolean;
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { AIValidationOptions } from '../types/context.js';
|
|
3
|
+
import type { AIProviderAdapter, ProviderRequest, TokenUsage } from './provider.js';
|
|
4
|
+
export interface ValidationRetryConfig extends AIValidationOptions {
|
|
8
5
|
}
|
|
9
6
|
export interface ValidatedResponse<T> {
|
|
10
7
|
data: T;
|
|
@@ -16,5 +13,40 @@ export interface ValidatedResponse<T> {
|
|
|
16
13
|
totalTokens: number;
|
|
17
14
|
};
|
|
18
15
|
}
|
|
19
|
-
export declare
|
|
16
|
+
export declare class AIValidationError extends Error {
|
|
17
|
+
readonly attempts: number;
|
|
18
|
+
readonly rawOutput: string | null;
|
|
19
|
+
readonly validationMessage: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Accumulated token usage across all retry attempts the provider actually
|
|
22
|
+
* ran before this error was thrown. Present when the caller threaded
|
|
23
|
+
* provider metadata through `generateWithValidation`; otherwise a zero
|
|
24
|
+
* record (kept non-optional so failure-path cost recording does not need
|
|
25
|
+
* null-checks).
|
|
26
|
+
*/
|
|
27
|
+
readonly usage: TokenUsage;
|
|
28
|
+
/** Resolved model name when the error was thrown (empty string if unknown). */
|
|
29
|
+
readonly model: string;
|
|
30
|
+
/** Resolved provider name when the error was thrown (empty string if unknown). */
|
|
31
|
+
readonly provider: string;
|
|
32
|
+
constructor(input: {
|
|
33
|
+
attempts: number;
|
|
34
|
+
rawOutput: string | null;
|
|
35
|
+
lastError: Error | null;
|
|
36
|
+
usage?: TokenUsage;
|
|
37
|
+
model?: string;
|
|
38
|
+
provider?: string;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export declare function generateWithValidation<T>(provider: AIProviderAdapter, request: ProviderRequest, schema: z.ZodType<T>, config?: ValidationRetryConfig & {
|
|
42
|
+
/**
|
|
43
|
+
* Optional resolved model + provider metadata attached to any
|
|
44
|
+
* `AIValidationError` thrown from this call. Used by the AI service
|
|
45
|
+
* failure-path cost recorder so it can bill the sunk spend against the
|
|
46
|
+
* right model. Omitted = error is thrown with empty strings (still
|
|
47
|
+
* compiles and still carries `usage`).
|
|
48
|
+
*/
|
|
49
|
+
model?: string;
|
|
50
|
+
provider?: string;
|
|
51
|
+
}): Promise<ValidatedResponse<T>>;
|
|
20
52
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAEf,UAAU,EACX,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;CAAG;AAErE,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,KAAK,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;CAYF;AAiLD,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,qBAAqB,GAAG;IAC/B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAgF/B"}
|
package/dist/ai/validation.js
CHANGED
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
// ── Output Validation with Retry ──
|
|
2
2
|
// Validates AI responses against Zod schemas, retries on mismatch
|
|
3
3
|
import { parse as parseJsonc } from 'jsonc-parser';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { AIIncompleteOutputError } from './refusal.js';
|
|
6
|
+
export class AIValidationError extends Error {
|
|
7
|
+
attempts;
|
|
8
|
+
rawOutput;
|
|
9
|
+
validationMessage;
|
|
10
|
+
/**
|
|
11
|
+
* Accumulated token usage across all retry attempts the provider actually
|
|
12
|
+
* ran before this error was thrown. Present when the caller threaded
|
|
13
|
+
* provider metadata through `generateWithValidation`; otherwise a zero
|
|
14
|
+
* record (kept non-optional so failure-path cost recording does not need
|
|
15
|
+
* null-checks).
|
|
16
|
+
*/
|
|
17
|
+
usage;
|
|
18
|
+
/** Resolved model name when the error was thrown (empty string if unknown). */
|
|
19
|
+
model;
|
|
20
|
+
/** Resolved provider name when the error was thrown (empty string if unknown). */
|
|
21
|
+
provider;
|
|
22
|
+
constructor(input) {
|
|
23
|
+
super(`AI output validation failed after ${input.attempts} attempts: ${input.lastError?.message}`);
|
|
24
|
+
this.name = 'AIValidationError';
|
|
25
|
+
this.attempts = input.attempts;
|
|
26
|
+
this.rawOutput = input.rawOutput;
|
|
27
|
+
this.validationMessage = input.lastError?.message ?? null;
|
|
28
|
+
this.usage = input.usage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
29
|
+
this.model = input.model ?? '';
|
|
30
|
+
this.provider = input.provider ?? '';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
4
33
|
function stripMarkdownCodeFence(content) {
|
|
5
34
|
const trimmed = content.trim();
|
|
6
35
|
const fenced = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/i);
|
|
@@ -76,6 +105,41 @@ function parseJsonCandidate(candidate) {
|
|
|
76
105
|
}
|
|
77
106
|
return parsed;
|
|
78
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Detects whether an output schema accepts a raw string at the top level.
|
|
110
|
+
*
|
|
111
|
+
* When the prompt author declares `output: z.string()` (or a trivially
|
|
112
|
+
* wrapped variant like `z.string().optional()` / `.nullable()`), the intent
|
|
113
|
+
* is to let the AI return raw text — typically a custom line-delimited
|
|
114
|
+
* format parsed by the capability. In that case we MUST NOT force the
|
|
115
|
+
* provider into JSON mode (OpenAI `response_format: json_object`), because
|
|
116
|
+
* the model will wrap the text into a JSON object and downstream
|
|
117
|
+
* `schema.parse(<object>)` will blow up with "Expected string, received
|
|
118
|
+
* object".
|
|
119
|
+
*
|
|
120
|
+
* Unwrapping `.optional()` / `.nullable()` is safe: they still pass a raw
|
|
121
|
+
* string through unchanged.
|
|
122
|
+
*/
|
|
123
|
+
function isStringOutputSchema(schema) {
|
|
124
|
+
let current = schema;
|
|
125
|
+
// Unwrap one level of optional/nullable/default at a time, capping the
|
|
126
|
+
// loop so a bad schema can never hang the process.
|
|
127
|
+
for (let depth = 0; depth < 5; depth += 1) {
|
|
128
|
+
if (current instanceof z.ZodString) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if (current instanceof z.ZodOptional || current instanceof z.ZodNullable) {
|
|
132
|
+
current = current._def.innerType;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (current instanceof z.ZodDefault) {
|
|
136
|
+
current = current._def.innerType;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
79
143
|
function parseStructuredResponse(content) {
|
|
80
144
|
try {
|
|
81
145
|
return JSON.parse(content);
|
|
@@ -118,21 +182,41 @@ function parseStructuredResponse(content) {
|
|
|
118
182
|
export async function generateWithValidation(provider, request, schema, config) {
|
|
119
183
|
const maxRetries = config?.maxRetries ?? 2;
|
|
120
184
|
const feedbackOnError = config?.feedbackOnError ?? true;
|
|
185
|
+
// Prompts with `output: z.string()` want raw text (e.g. a pipe-separated
|
|
186
|
+
// line format parsed by the capability). Forcing JSON mode on those
|
|
187
|
+
// would make the model wrap the text in a JSON object and shatter
|
|
188
|
+
// schema validation, so we switch to text mode and skip JSON parsing.
|
|
189
|
+
const textOutput = isStringOutputSchema(schema);
|
|
121
190
|
let totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
122
191
|
let lastError = null;
|
|
192
|
+
let lastRawOutput = null;
|
|
123
193
|
let currentPrompt = request.prompt;
|
|
124
194
|
for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
|
|
125
|
-
// OpenAI requires the word "json" in the prompt when using json_object response format.
|
|
126
|
-
// Auto-inject a JSON instruction if the prompt doesn't already mention it.
|
|
127
195
|
let promptForRequest = currentPrompt;
|
|
128
|
-
if (!currentPrompt.toLowerCase().includes('json')) {
|
|
196
|
+
if (!textOutput && !request.responseSchema && !currentPrompt.toLowerCase().includes('json')) {
|
|
197
|
+
// OpenAI requires the word "json" in the prompt when using
|
|
198
|
+
// json_object response format. Only inject the hint for JSON-mode
|
|
199
|
+
// prompts without a provider schema — text-mode prompts never go into
|
|
200
|
+
// json_object, and json_schema requests should not need a prose JSON
|
|
201
|
+
// instruction as a substitute for constrained decoding.
|
|
129
202
|
promptForRequest = `${currentPrompt}\n\nRespond with a valid JSON object.`;
|
|
130
203
|
}
|
|
131
204
|
const response = await provider.complete({
|
|
132
205
|
...request,
|
|
133
206
|
prompt: promptForRequest,
|
|
134
|
-
responseFormat: 'json',
|
|
207
|
+
responseFormat: textOutput ? 'text' : 'json',
|
|
135
208
|
});
|
|
209
|
+
lastRawOutput = response.content;
|
|
210
|
+
if (!textOutput &&
|
|
211
|
+
(response.finishReason === 'length' || response.finishReason === 'max_tokens')) {
|
|
212
|
+
throw new AIIncompleteOutputError({
|
|
213
|
+
provider: config?.provider ?? provider.name,
|
|
214
|
+
model: config?.model ?? response.model,
|
|
215
|
+
partialText: response.content,
|
|
216
|
+
usage: response.usage,
|
|
217
|
+
finishReason: response.finishReason,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
136
220
|
totalUsage = {
|
|
137
221
|
inputTokens: totalUsage.inputTokens + response.usage.inputTokens,
|
|
138
222
|
outputTokens: totalUsage.outputTokens + response.usage.outputTokens,
|
|
@@ -141,7 +225,7 @@ export async function generateWithValidation(provider, request, schema, config)
|
|
|
141
225
|
cacheWriteTokens: (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0),
|
|
142
226
|
};
|
|
143
227
|
try {
|
|
144
|
-
const parsed = parseStructuredResponse(response.content);
|
|
228
|
+
const parsed = textOutput ? response.content : parseStructuredResponse(response.content);
|
|
145
229
|
const result = schema.parse(parsed);
|
|
146
230
|
return {
|
|
147
231
|
data: result,
|
|
@@ -157,6 +241,13 @@ export async function generateWithValidation(provider, request, schema, config)
|
|
|
157
241
|
}
|
|
158
242
|
}
|
|
159
243
|
}
|
|
160
|
-
throw new
|
|
244
|
+
throw new AIValidationError({
|
|
245
|
+
attempts: maxRetries + 1,
|
|
246
|
+
rawOutput: lastRawOutput,
|
|
247
|
+
lastError,
|
|
248
|
+
usage: totalUsage,
|
|
249
|
+
model: config?.model ?? '',
|
|
250
|
+
provider: config?.provider ?? provider.name,
|
|
251
|
+
});
|
|
161
252
|
}
|
|
162
253
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,kEAAkE;AAElE,OAAO,EAAmB,KAAK,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
export interface ProviderJsonSchemaResult {
|
|
3
|
+
schema: Record<string, unknown>;
|
|
4
|
+
optionalParameterCount: number;
|
|
5
|
+
unionParameterCount: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ProviderJsonSchemaOptions {
|
|
8
|
+
promptName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ProviderJsonSchemaError extends Error {
|
|
11
|
+
readonly promptName?: string;
|
|
12
|
+
constructor(message: string, promptName?: string);
|
|
13
|
+
}
|
|
14
|
+
export declare function zodToProviderJsonSchema(zodSchema: z.ZodTypeAny, options?: ProviderJsonSchemaOptions): ProviderJsonSchemaResult;
|
|
15
|
+
//# sourceMappingURL=zod-to-provider-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-provider-schema.d.ts","sourceRoot":"","sources":["../../src/ai/zod-to-provider-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgB7B,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAKjD;AA2MD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,CAAC,CAAC,UAAU,EACvB,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAkC1B"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
2
|
+
const allowedStringFormats = new Set([
|
|
3
|
+
'date-time',
|
|
4
|
+
'time',
|
|
5
|
+
'date',
|
|
6
|
+
'duration',
|
|
7
|
+
'email',
|
|
8
|
+
'hostname',
|
|
9
|
+
'uri',
|
|
10
|
+
'ipv4',
|
|
11
|
+
'ipv6',
|
|
12
|
+
'uuid',
|
|
13
|
+
]);
|
|
14
|
+
export class ProviderJsonSchemaError extends Error {
|
|
15
|
+
promptName;
|
|
16
|
+
constructor(message, promptName) {
|
|
17
|
+
super(promptName ? `${promptName}: ${message}` : message);
|
|
18
|
+
this.name = 'ProviderJsonSchemaError';
|
|
19
|
+
this.promptName = promptName;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function isRecord(value) {
|
|
23
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
function fail(message, state) {
|
|
26
|
+
throw new ProviderJsonSchemaError(message, state.promptName);
|
|
27
|
+
}
|
|
28
|
+
function appendDescription(schema, message) {
|
|
29
|
+
const existing = typeof schema.description === 'string' ? schema.description.trim() : '';
|
|
30
|
+
schema.description = existing ? `${existing} ${message}` : message;
|
|
31
|
+
}
|
|
32
|
+
function stripConstraint(schema, key, describe) {
|
|
33
|
+
if (!(key in schema))
|
|
34
|
+
return;
|
|
35
|
+
appendDescription(schema, describe(schema[key]));
|
|
36
|
+
delete schema[key];
|
|
37
|
+
}
|
|
38
|
+
function isPrimitiveEnumValue(value) {
|
|
39
|
+
return (value === null ||
|
|
40
|
+
typeof value === 'string' ||
|
|
41
|
+
typeof value === 'number' ||
|
|
42
|
+
typeof value === 'boolean');
|
|
43
|
+
}
|
|
44
|
+
function hasUnsupportedRegex(pattern) {
|
|
45
|
+
return (/\\[1-9]/.test(pattern) ||
|
|
46
|
+
/\(\?[:=!<]/.test(pattern) ||
|
|
47
|
+
/\\[bB]/.test(pattern) ||
|
|
48
|
+
/\{\d{4,}(?:,\d*)?\}/.test(pattern) ||
|
|
49
|
+
/\{\d+,\d{4,}\}/.test(pattern));
|
|
50
|
+
}
|
|
51
|
+
function normalizeArray(value, path, state) {
|
|
52
|
+
return value.map((item, index) => normalizeSchemaNode(item, `${path}[${index}]`, state));
|
|
53
|
+
}
|
|
54
|
+
function normalizeSchemaNode(value, path, state) {
|
|
55
|
+
if (typeof value === 'boolean') {
|
|
56
|
+
fail(`boolean JSON Schema nodes are not supported at ${path}`, state);
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
return normalizeArray(value, path, state);
|
|
60
|
+
}
|
|
61
|
+
if (!isRecord(value)) {
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
const schema = {};
|
|
65
|
+
for (const [key, child] of Object.entries(value)) {
|
|
66
|
+
if (key === '$schema')
|
|
67
|
+
continue;
|
|
68
|
+
schema[key] = child;
|
|
69
|
+
}
|
|
70
|
+
if (Array.isArray(schema.enum)) {
|
|
71
|
+
if (schema.enum.length === 0)
|
|
72
|
+
fail(`empty enum is not supported at ${path}`, state);
|
|
73
|
+
if (!schema.enum.every(isPrimitiveEnumValue)) {
|
|
74
|
+
fail(`enum values must be primitive at ${path}`, state);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(schema.anyOf)) {
|
|
78
|
+
if (schema.anyOf.length === 0)
|
|
79
|
+
fail(`empty anyOf is not supported at ${path}`, state);
|
|
80
|
+
state.unionParameterCount += 1;
|
|
81
|
+
schema.anyOf = normalizeArray(schema.anyOf, `${path}.anyOf`, state);
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(schema.oneOf)) {
|
|
84
|
+
if (schema.oneOf.length === 0)
|
|
85
|
+
fail(`empty oneOf is not supported at ${path}`, state);
|
|
86
|
+
state.unionParameterCount += 1;
|
|
87
|
+
schema.anyOf = normalizeArray(schema.oneOf, `${path}.oneOf`, state);
|
|
88
|
+
delete schema.oneOf;
|
|
89
|
+
}
|
|
90
|
+
if (Array.isArray(schema.allOf)) {
|
|
91
|
+
for (const child of schema.allOf) {
|
|
92
|
+
if (isRecord(child) && '$ref' in child) {
|
|
93
|
+
fail(`allOf with $ref is not supported at ${path}`, state);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
schema.allOf = normalizeArray(schema.allOf, `${path}.allOf`, state);
|
|
97
|
+
}
|
|
98
|
+
if (Array.isArray(schema.type)) {
|
|
99
|
+
state.unionParameterCount += 1;
|
|
100
|
+
}
|
|
101
|
+
if (schema.type === 'object' || isRecord(schema.properties)) {
|
|
102
|
+
schema.type = 'object';
|
|
103
|
+
if ('additionalProperties' in schema && schema.additionalProperties !== false) {
|
|
104
|
+
fail(`additionalProperties must be false at ${path}`, state);
|
|
105
|
+
}
|
|
106
|
+
schema.additionalProperties = false;
|
|
107
|
+
const properties = isRecord(schema.properties) ? schema.properties : {};
|
|
108
|
+
const required = Array.isArray(schema.required)
|
|
109
|
+
? new Set(schema.required.filter((key) => typeof key === 'string'))
|
|
110
|
+
: new Set();
|
|
111
|
+
const normalizedProperties = {};
|
|
112
|
+
for (const [propertyName, propertySchema] of Object.entries(properties)) {
|
|
113
|
+
if (!required.has(propertyName)) {
|
|
114
|
+
state.optionalParameterCount += 1;
|
|
115
|
+
}
|
|
116
|
+
normalizedProperties[propertyName] = normalizeSchemaNode(propertySchema, `${path}.properties.${propertyName}`, state);
|
|
117
|
+
}
|
|
118
|
+
schema.properties = normalizedProperties;
|
|
119
|
+
if (required.size > 0) {
|
|
120
|
+
schema.required = [...required];
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
delete schema.required;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (schema.type === 'array' || 'items' in schema || 'prefixItems' in schema) {
|
|
127
|
+
if (Array.isArray(schema.items)) {
|
|
128
|
+
schema.prefixItems = normalizeArray(schema.items, `${path}.items`, state);
|
|
129
|
+
delete schema.items;
|
|
130
|
+
}
|
|
131
|
+
else if ('items' in schema) {
|
|
132
|
+
schema.items = normalizeSchemaNode(schema.items, `${path}.items`, state);
|
|
133
|
+
}
|
|
134
|
+
if (Array.isArray(schema.prefixItems)) {
|
|
135
|
+
schema.prefixItems = normalizeArray(schema.prefixItems, `${path}.prefixItems`, state);
|
|
136
|
+
}
|
|
137
|
+
if (typeof schema.minItems === 'number' && schema.minItems > 1) {
|
|
138
|
+
appendDescription(schema, `Must contain at least ${schema.minItems} items.`);
|
|
139
|
+
schema.minItems = 1;
|
|
140
|
+
}
|
|
141
|
+
stripConstraint(schema, 'maxItems', (constraint) => `Must contain at most ${constraint} items.`);
|
|
142
|
+
delete schema.minContains;
|
|
143
|
+
delete schema.maxContains;
|
|
144
|
+
}
|
|
145
|
+
if (typeof schema.format === 'string' && !allowedStringFormats.has(schema.format)) {
|
|
146
|
+
appendDescription(schema, `Expected string format: ${schema.format}.`);
|
|
147
|
+
delete schema.format;
|
|
148
|
+
}
|
|
149
|
+
if (typeof schema.pattern === 'string' && hasUnsupportedRegex(schema.pattern)) {
|
|
150
|
+
appendDescription(schema, `Must match pattern: ${schema.pattern}.`);
|
|
151
|
+
delete schema.pattern;
|
|
152
|
+
}
|
|
153
|
+
stripConstraint(schema, 'minimum', (constraint) => `Must be at least ${constraint}.`);
|
|
154
|
+
stripConstraint(schema, 'maximum', (constraint) => `Must be at most ${constraint}.`);
|
|
155
|
+
stripConstraint(schema, 'exclusiveMinimum', (constraint) => `Must be greater than ${constraint}.`);
|
|
156
|
+
stripConstraint(schema, 'exclusiveMaximum', (constraint) => `Must be less than ${constraint}.`);
|
|
157
|
+
stripConstraint(schema, 'multipleOf', (constraint) => `Must be a multiple of ${constraint}.`);
|
|
158
|
+
stripConstraint(schema, 'minLength', (constraint) => `Must be at least ${constraint} characters.`);
|
|
159
|
+
stripConstraint(schema, 'maxLength', (constraint) => `Must be at most ${constraint} characters.`);
|
|
160
|
+
for (const [key, child] of Object.entries(schema)) {
|
|
161
|
+
if (key === 'properties' ||
|
|
162
|
+
key === 'items' ||
|
|
163
|
+
key === 'prefixItems' ||
|
|
164
|
+
key === 'anyOf' ||
|
|
165
|
+
key === 'allOf') {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (isRecord(child) || Array.isArray(child)) {
|
|
169
|
+
schema[key] = normalizeSchemaNode(child, `${path}.${key}`, state);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return schema;
|
|
173
|
+
}
|
|
174
|
+
export function zodToProviderJsonSchema(zodSchema, options = {}) {
|
|
175
|
+
const raw = zodToJsonSchema(zodSchema, {
|
|
176
|
+
$refStrategy: 'none',
|
|
177
|
+
target: 'jsonSchema7',
|
|
178
|
+
});
|
|
179
|
+
const state = {
|
|
180
|
+
promptName: options.promptName,
|
|
181
|
+
optionalParameterCount: 0,
|
|
182
|
+
unionParameterCount: 0,
|
|
183
|
+
};
|
|
184
|
+
const normalized = normalizeSchemaNode(raw, '#', state);
|
|
185
|
+
if (!isRecord(normalized)) {
|
|
186
|
+
fail('top-level schema must be an object', state);
|
|
187
|
+
}
|
|
188
|
+
if (state.optionalParameterCount > 24) {
|
|
189
|
+
fail(`structured-output schema has ${state.optionalParameterCount} optional parameters; Anthropic limit is 24`, state);
|
|
190
|
+
}
|
|
191
|
+
if (state.unionParameterCount > 16) {
|
|
192
|
+
fail(`structured-output schema has ${state.unionParameterCount} union parameters; Anthropic limit is 16`, state);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
schema: normalized,
|
|
196
|
+
optionalParameterCount: state.optionalParameterCount,
|
|
197
|
+
unionParameterCount: state.unionParameterCount,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=zod-to-provider-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-to-provider-schema.js","sourceRoot":"","sources":["../../src/ai/zod-to-provider-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { checkAgentWiring, checkLegacyArtifacts, checkNodeVersion, checkPlumbusUi, checkPostgreSQL, checkRedis, checkTypeScript, runDoctorChecks, runFullDoctorChecks, } from '../commands/doctor.js';
|
|
6
|
+
import { generateAgentsMd, generateCopilotInstructions, generateCursorCapabilityRule, generateCursorRule, } from '../commands/init.js';
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
vi.restoreAllMocks();
|
|
9
|
+
});
|
|
3
10
|
describe('plumbus doctor', () => {
|
|
4
11
|
it('checks Node.js version', () => {
|
|
5
12
|
const check = checkNodeVersion();
|
|
@@ -17,6 +24,7 @@ describe('plumbus doctor', () => {
|
|
|
17
24
|
expect(names).toContain('package.json');
|
|
18
25
|
expect(names).toContain('config');
|
|
19
26
|
expect(names).toContain('app-structure');
|
|
27
|
+
expect(names).toContain('agent-wiring');
|
|
20
28
|
expect(names).toContain('legacy-artifacts');
|
|
21
29
|
});
|
|
22
30
|
it('detects TypeScript availability', () => {
|
|
@@ -66,5 +74,99 @@ describe('plumbus doctor', () => {
|
|
|
66
74
|
expect(['ok', 'warn', 'fail']).toContain(check.status);
|
|
67
75
|
expect(check.message).toBeTruthy();
|
|
68
76
|
});
|
|
77
|
+
it('checkAgentWiring returns ok when no generated wiring exists', () => {
|
|
78
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
79
|
+
try {
|
|
80
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
81
|
+
const check = checkAgentWiring();
|
|
82
|
+
expect(check.name).toBe('agent-wiring');
|
|
83
|
+
expect(check.status).toBe('ok');
|
|
84
|
+
expect(check.message).toContain('No generated agent wiring detected');
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
it('checkAgentWiring warns on unversioned generated wiring', () => {
|
|
91
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
92
|
+
try {
|
|
93
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
94
|
+
mkdirSync(path.join(tempDir, '.github'), { recursive: true });
|
|
95
|
+
writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), '# Plumbus Framework — Copilot Instructions\n\nlegacy content', 'utf-8');
|
|
96
|
+
const check = checkAgentWiring();
|
|
97
|
+
expect(check.status).toBe('warn');
|
|
98
|
+
expect(check.message).toContain('unversioned');
|
|
99
|
+
expect(check.message).toContain('plumbus init --force');
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
it('checkAgentWiring recommends patch for stale patchable wiring', () => {
|
|
106
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
107
|
+
try {
|
|
108
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
109
|
+
mkdirSync(path.join(tempDir, '.github'), { recursive: true });
|
|
110
|
+
writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), [
|
|
111
|
+
'<!-- plumbus:agent-wiring version=1 format=copilot mode=reference layout=flat -->',
|
|
112
|
+
'# Plumbus Framework — Copilot Instructions',
|
|
113
|
+
'',
|
|
114
|
+
'<!-- /plumbus:agent-wiring -->',
|
|
115
|
+
].join('\n'), 'utf-8');
|
|
116
|
+
const check = checkAgentWiring();
|
|
117
|
+
expect(check.status).toBe('warn');
|
|
118
|
+
expect(check.message).toContain('version 1');
|
|
119
|
+
expect(check.message).toContain('plumbus init --patch');
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
it('checkAgentWiring accepts current generated wiring', () => {
|
|
126
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
127
|
+
try {
|
|
128
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
129
|
+
mkdirSync(path.join(tempDir, '.github'), { recursive: true });
|
|
130
|
+
mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
|
|
131
|
+
writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), generateCopilotInstructions(false), 'utf-8');
|
|
132
|
+
writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus.mdc'), generateCursorRule(false), 'utf-8');
|
|
133
|
+
writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus-capabilities.mdc'), generateCursorCapabilityRule(), 'utf-8');
|
|
134
|
+
writeFileSync(path.join(tempDir, 'AGENTS.md'), generateAgentsMd(false), 'utf-8');
|
|
135
|
+
const check = checkAgentWiring();
|
|
136
|
+
expect(check.status).toBe('ok');
|
|
137
|
+
expect(check.message).toContain('template version 2');
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
it('checkAgentWiring recommends patch when cursor wiring is incomplete', () => {
|
|
144
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
145
|
+
try {
|
|
146
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
147
|
+
mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
|
|
148
|
+
writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus.mdc'), generateCursorRule(false), 'utf-8');
|
|
149
|
+
const check = checkAgentWiring();
|
|
150
|
+
expect(check.status).toBe('warn');
|
|
151
|
+
expect(check.message).toContain('Cursor wiring is incomplete');
|
|
152
|
+
expect(check.message).toContain('plumbus init --patch');
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
it('checkAgentWiring ignores non-generated AGENTS.md files', () => {
|
|
159
|
+
const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
|
|
160
|
+
try {
|
|
161
|
+
vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
|
|
162
|
+
writeFileSync(path.join(tempDir, 'AGENTS.md'), '# Framework Development Notes\n\nThis is not generated by plumbus init.', 'utf-8');
|
|
163
|
+
const check = checkAgentWiring();
|
|
164
|
+
expect(check.status).toBe('ok');
|
|
165
|
+
expect(check.message).toContain('No generated agent wiring detected');
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
169
|
+
}
|
|
170
|
+
});
|
|
69
171
|
});
|
|
70
172
|
//# sourceMappingURL=doctor.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,yCAAyC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,0CAA0C;QAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,8DAA8D,EAC9D,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD;gBACE,mFAAmF;gBACnF,4CAA4C;gBAC5C,EAAE;gBACF,gCAAgC;aACjC,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,2BAA2B,CAAC,KAAK,CAAC,EAClC,OAAO,CACR,CAAC;YACF,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,kBAAkB,CAAC,KAAK,CAAC,EACzB,OAAO,CACR,CAAC;YACF,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,CAAC,EAClE,4BAA4B,EAAE,EAC9B,OAAO,CACR,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAEjF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,kBAAkB,CAAC,KAAK,CAAC,EACzB,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC/B,yEAAyE,EACzE,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|