@syrin/cli 1.3.1 → 1.4.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 +36 -0
- package/dist/cli/commands/config.d.ts +47 -0
- package/dist/cli/commands/config.js +360 -0
- package/dist/cli/commands/dev.d.ts +6 -0
- package/dist/cli/commands/dev.js +67 -15
- package/dist/cli/commands/doctor.js +49 -13
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +89 -18
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.js +162 -0
- package/dist/cli/index.js +211 -12
- package/dist/cli/prompts/init-prompt.d.ts +18 -0
- package/dist/cli/prompts/init-prompt.js +159 -99
- package/dist/cli/utils/command-error-handler.js +2 -5
- package/dist/config/env-checker.d.ts +12 -2
- package/dist/config/env-checker.js +88 -38
- package/dist/config/env-templates.d.ts +15 -0
- package/dist/config/env-templates.js +49 -0
- package/dist/config/generator.js +17 -0
- package/dist/config/global-loader.d.ts +50 -0
- package/dist/config/global-loader.js +244 -0
- package/dist/config/loader.d.ts +28 -0
- package/dist/config/loader.js +95 -9
- package/dist/config/merger.d.ts +37 -0
- package/dist/config/merger.js +68 -0
- package/dist/config/schema.d.ts +26 -1
- package/dist/config/schema.js +73 -8
- package/dist/config/types.d.ts +19 -0
- package/dist/config/types.js +26 -1
- package/dist/constants/messages.d.ts +7 -0
- package/dist/constants/messages.js +8 -0
- package/dist/constants/paths.d.ts +6 -0
- package/dist/constants/paths.js +10 -0
- package/dist/events/emitter.js +7 -7
- package/dist/index.js +0 -0
- package/dist/presentation/config-ui.d.ts +34 -0
- package/dist/presentation/config-ui.js +139 -0
- package/dist/presentation/doctor-ui.d.ts +11 -0
- package/dist/presentation/doctor-ui.js +52 -1
- package/dist/presentation/init-ui.d.ts +9 -0
- package/dist/presentation/init-ui.js +33 -0
- package/dist/runtime/analysis/analyser.js +2 -2
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.d.ts +1 -1
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.js +1 -1
- package/dist/runtime/dev/event-mapper.js +19 -3
- package/dist/runtime/dev/session.d.ts +4 -0
- package/dist/runtime/dev/session.js +52 -3
- package/dist/runtime/llm/ollama.js +4 -4
- package/dist/runtime/mcp/client/manager.js +3 -3
- package/dist/runtime/sandbox/executor.js +5 -5
- package/dist/runtime/test/orchestrator.js +4 -4
- package/dist/utils/editor.d.ts +37 -0
- package/dist/utils/editor.js +137 -0
- package/dist/utils/logger.d.ts +24 -6
- package/dist/utils/logger.js +51 -8
- package/package.json +4 -4
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.d.ts +0 -22
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.js +0 -30
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.d.ts +0 -24
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.js +0 -52
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.d.ts +0 -23
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.js +0 -73
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.d.ts +0 -23
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.js +0 -47
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.d.ts +0 -25
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.js +0 -73
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.d.ts +0 -22
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.js +0 -57
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.d.ts +0 -23
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.js +0 -56
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.d.ts +0 -22
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.js +0 -84
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.d.ts +0 -23
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.js +0 -89
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.d.ts +0 -25
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.js +0 -46
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.d.ts +0 -24
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.js +0 -33
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.d.ts +0 -39
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.js +0 -40
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.d.ts +0 -37
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.js +0 -34
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.d.ts +0 -39
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.js +0 -36
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.d.ts +0 -42
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.js +0 -46
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.d.ts +0 -39
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.js +0 -36
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.d.ts +0 -42
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.js +0 -46
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.d.ts +0 -44
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.js +0 -66
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.d.ts +0 -43
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.js +0 -42
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.d.ts +0 -44
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.js +0 -66
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.d.ts +0 -57
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.js +0 -80
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.d.ts +0 -43
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.js +0 -42
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.d.ts +0 -57
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.js +0 -80
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.d.ts +0 -38
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.js +0 -37
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.d.ts +0 -38
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.js +0 -37
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.d.ts +0 -65
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.js +0 -109
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.d.ts +0 -65
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.js +0 -109
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.d.ts +0 -22
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.js +0 -39
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.d.ts +0 -24
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.js +0 -40
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.d.ts +0 -22
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.js +0 -84
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.d.ts +0 -23
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.js +0 -96
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.d.ts +0 -53
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.js +0 -108
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.d.ts +0 -22
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.js +0 -44
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.d.ts +0 -23
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.js +0 -37
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.d.ts +0 -22
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.js +0 -97
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.d.ts +0 -23
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.js +0 -88
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.d.ts +0 -22
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.js +0 -81
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.d.ts +0 -40
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.js +0 -32
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.d.ts +0 -39
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.js +0 -36
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.d.ts +0 -38
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.js +0 -36
- package/dist/runtime/test/dependency-tracker.d.ts +0 -66
- package/dist/runtime/test/dependency-tracker.js +0 -80
- package/dist/runtime/test/formatters.d.ts +0 -18
- package/dist/runtime/test/formatters.js +0 -172
- package/dist/runtime/test/input-generator.d.ts +0 -33
- package/dist/runtime/test/input-generator.js +0 -498
- package/dist/runtime/test/mcp-root-detector.d.ts +0 -31
- package/dist/runtime/test/mcp-root-detector.js +0 -105
- package/dist/runtime/test/retry-tester.d.ts +0 -44
- package/dist/runtime/test/retry-tester.js +0 -103
- package/dist/runtime/test/synthetic-input-generator.d.ts +0 -11
- package/dist/runtime/test/synthetic-input-generator.js +0 -154
- package/dist/runtime/test/test-runner.d.ts +0 -28
- package/dist/runtime/test/test-runner.js +0 -55
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W010: Tool Output Not Reusable
|
|
3
|
-
*
|
|
4
|
-
* Condition:
|
|
5
|
-
* - Output tailored only for natural language
|
|
6
|
-
* - Not structured for reuse
|
|
7
|
-
*
|
|
8
|
-
* Why:
|
|
9
|
-
* - Limits composability
|
|
10
|
-
*/
|
|
11
|
-
import { BaseRule } from '../base.js';
|
|
12
|
-
/**
|
|
13
|
-
* Check if output appears to be only for natural language display.
|
|
14
|
-
*/
|
|
15
|
-
function isNaturalLanguageOnly(output) {
|
|
16
|
-
const name = output.name.toLowerCase();
|
|
17
|
-
const desc = (output.description || '').toLowerCase();
|
|
18
|
-
const combined = `${name} ${desc}`;
|
|
19
|
-
// Indicators that output is only for display
|
|
20
|
-
const displayOnlyIndicators = [
|
|
21
|
-
'message',
|
|
22
|
-
'response',
|
|
23
|
-
'reply',
|
|
24
|
-
'answer',
|
|
25
|
-
'text',
|
|
26
|
-
'description',
|
|
27
|
-
'summary',
|
|
28
|
-
'note',
|
|
29
|
-
'comment',
|
|
30
|
-
'info',
|
|
31
|
-
];
|
|
32
|
-
// If it's a string type and name suggests display-only
|
|
33
|
-
if (output.type === 'string') {
|
|
34
|
-
return displayOnlyIndicators.some(indicator => combined.includes(indicator));
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Check if output is structured (object or array).
|
|
40
|
-
*/
|
|
41
|
-
function isStructured(output) {
|
|
42
|
-
if (output.type === 'object' || output.type === 'array') {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
if (output.properties && typeof output.properties === 'object') {
|
|
46
|
-
if (Array.isArray(output.properties) && output.properties.length > 0) {
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
// Also check if it's a Record with keys
|
|
50
|
-
if (!Array.isArray(output.properties) &&
|
|
51
|
-
Object.keys(output.properties).length > 0) {
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
class W010OutputNotReusableRule extends BaseRule {
|
|
58
|
-
id = 'W010';
|
|
59
|
-
severity = 'warning';
|
|
60
|
-
ruleName = 'Tool Output Not Reusable';
|
|
61
|
-
description = 'Output of tool is not designed for reuse. Limits composability.';
|
|
62
|
-
check(ctx) {
|
|
63
|
-
const diagnostics = [];
|
|
64
|
-
for (const tool of ctx.tools) {
|
|
65
|
-
// Only check tools that have outputs
|
|
66
|
-
if (tool.outputs.length === 0) {
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
// Check if all outputs are natural language only
|
|
70
|
-
const allNaturalLanguage = tool.outputs.every(output => isNaturalLanguageOnly(output));
|
|
71
|
-
const hasStructured = tool.outputs.some(output => isStructured(output));
|
|
72
|
-
// If all outputs are natural language and none are structured
|
|
73
|
-
if (allNaturalLanguage && !hasStructured) {
|
|
74
|
-
diagnostics.push(this.createDiagnostic(`Output of "${tool.name}" is not designed for reuse (only natural language output).`, tool.name, undefined, `Add structured output fields (objects/arrays) to "${tool.name}" to improve composability with other tools.`));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return diagnostics;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
export const W010OutputNotReusable = new W010OutputNotReusableRule();
|
|
81
|
-
//# sourceMappingURL=w010-output-not-reusable.js.map
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W021: Weak Schema
|
|
3
|
-
*
|
|
4
|
-
* Condition: Contract schema is too loose or doesn't match MCP tool schema structure
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - Loose schemas make validation less effective
|
|
8
|
-
* - Mismatch between contract and actual tool schema indicates contract needs update
|
|
9
|
-
*/
|
|
10
|
-
import { BaseRule } from '../base.js';
|
|
11
|
-
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
12
|
-
/**
|
|
13
|
-
* Context for weak schema detection.
|
|
14
|
-
*/
|
|
15
|
-
export interface WeakSchemaContext {
|
|
16
|
-
/** Tool name */
|
|
17
|
-
toolName: string;
|
|
18
|
-
/** Contract input schema name */
|
|
19
|
-
contractInputSchema: string;
|
|
20
|
-
/** Contract output schema name */
|
|
21
|
-
contractOutputSchema: string;
|
|
22
|
-
/** Whether schemas match actual MCP tool schemas */
|
|
23
|
-
schemasMatch: boolean;
|
|
24
|
-
/** Details about mismatch (if any) */
|
|
25
|
-
mismatchDetails?: string;
|
|
26
|
-
}
|
|
27
|
-
declare class W021WeakSchemaRule extends BaseRule {
|
|
28
|
-
readonly id = "W021";
|
|
29
|
-
readonly severity: "warning";
|
|
30
|
-
readonly ruleName = "Weak Schema";
|
|
31
|
-
readonly description = "Contract schema is too loose or does not match MCP tool schema structure.";
|
|
32
|
-
check(_ctx: AnalysisContext): Diagnostic[];
|
|
33
|
-
/**
|
|
34
|
-
* Check with behavioral context (called from test orchestrator).
|
|
35
|
-
*/
|
|
36
|
-
checkWithBehavioralContext(behavioralCtx: WeakSchemaContext): Diagnostic[];
|
|
37
|
-
}
|
|
38
|
-
export declare const W021WeakSchema: W021WeakSchemaRule;
|
|
39
|
-
export {};
|
|
40
|
-
//# sourceMappingURL=w021-weak-schema.d.ts.map
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W021: Weak Schema
|
|
3
|
-
*
|
|
4
|
-
* Condition: Contract schema is too loose or doesn't match MCP tool schema structure
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - Loose schemas make validation less effective
|
|
8
|
-
* - Mismatch between contract and actual tool schema indicates contract needs update
|
|
9
|
-
*/
|
|
10
|
-
import { BaseRule } from '../base.js';
|
|
11
|
-
class W021WeakSchemaRule extends BaseRule {
|
|
12
|
-
id = 'W021';
|
|
13
|
-
severity = 'warning';
|
|
14
|
-
ruleName = 'Weak Schema';
|
|
15
|
-
description = 'Contract schema is too loose or does not match MCP tool schema structure.';
|
|
16
|
-
check(_ctx) {
|
|
17
|
-
// This rule requires behavioral context (schema comparison)
|
|
18
|
-
return [];
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Check with behavioral context (called from test orchestrator).
|
|
22
|
-
*/
|
|
23
|
-
checkWithBehavioralContext(behavioralCtx) {
|
|
24
|
-
const diagnostics = [];
|
|
25
|
-
if (!behavioralCtx.schemasMatch) {
|
|
26
|
-
diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" contract schemas do not match actual MCP tool schemas.${behavioralCtx.mismatchDetails ? ` ${behavioralCtx.mismatchDetails}` : ''}`, behavioralCtx.toolName, undefined, 'Update contract to match actual tool schema structure. Ensure input_schema and output_schema names reference correct schemas.'));
|
|
27
|
-
}
|
|
28
|
-
return diagnostics;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export const W021WeakSchema = new W021WeakSchemaRule();
|
|
32
|
-
//# sourceMappingURL=w021-weak-schema.js.map
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W022: High Entropy Output
|
|
3
|
-
*
|
|
4
|
-
* Condition: Tool output has high entropy (random, unpredictable structure)
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - High entropy makes it hard for LLM to reason about output
|
|
8
|
-
* - Indicates potential design issues
|
|
9
|
-
* - May indicate non-determinism
|
|
10
|
-
*/
|
|
11
|
-
import { BaseRule } from '../base.js';
|
|
12
|
-
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
13
|
-
/**
|
|
14
|
-
* Context for high entropy detection.
|
|
15
|
-
*/
|
|
16
|
-
export interface HighEntropyContext {
|
|
17
|
-
/** Tool name */
|
|
18
|
-
toolName: string;
|
|
19
|
-
/** Entropy score (0-1, higher = more entropy) */
|
|
20
|
-
entropyScore: number;
|
|
21
|
-
/** Reason for high entropy */
|
|
22
|
-
reason?: string;
|
|
23
|
-
/** Optional custom entropy threshold (defaults to 0.7 if not provided) */
|
|
24
|
-
entropyThreshold?: number;
|
|
25
|
-
}
|
|
26
|
-
declare class W022HighEntropyOutputRule extends BaseRule {
|
|
27
|
-
readonly id = "W022";
|
|
28
|
-
readonly severity: "warning";
|
|
29
|
-
readonly ruleName = "High Entropy Output";
|
|
30
|
-
readonly description = "Tool output has high entropy, making it difficult for LLM to reason about.";
|
|
31
|
-
check(_ctx: AnalysisContext): Diagnostic[];
|
|
32
|
-
/**
|
|
33
|
-
* Check with behavioral context (called from test orchestrator).
|
|
34
|
-
*/
|
|
35
|
-
checkWithBehavioralContext(behavioralCtx: HighEntropyContext): Diagnostic[];
|
|
36
|
-
}
|
|
37
|
-
export declare const W022HighEntropyOutput: W022HighEntropyOutputRule;
|
|
38
|
-
export {};
|
|
39
|
-
//# sourceMappingURL=w022-high-entropy-output.d.ts.map
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W022: High Entropy Output
|
|
3
|
-
*
|
|
4
|
-
* Condition: Tool output has high entropy (random, unpredictable structure)
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - High entropy makes it hard for LLM to reason about output
|
|
8
|
-
* - Indicates potential design issues
|
|
9
|
-
* - May indicate non-determinism
|
|
10
|
-
*/
|
|
11
|
-
import { BaseRule } from '../base.js';
|
|
12
|
-
class W022HighEntropyOutputRule extends BaseRule {
|
|
13
|
-
id = 'W022';
|
|
14
|
-
severity = 'warning';
|
|
15
|
-
ruleName = 'High Entropy Output';
|
|
16
|
-
description = 'Tool output has high entropy, making it difficult for LLM to reason about.';
|
|
17
|
-
check(_ctx) {
|
|
18
|
-
// This rule requires behavioral context
|
|
19
|
-
return [];
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Check with behavioral context (called from test orchestrator).
|
|
23
|
-
*/
|
|
24
|
-
checkWithBehavioralContext(behavioralCtx) {
|
|
25
|
-
const diagnostics = [];
|
|
26
|
-
// Use configured threshold or fall back to default 0.7
|
|
27
|
-
const threshold = behavioralCtx.entropyThreshold ?? 0.7;
|
|
28
|
-
// Threshold: entropy above configured value is considered high
|
|
29
|
-
if (behavioralCtx.entropyScore > threshold) {
|
|
30
|
-
diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" produces high entropy output (score: ${behavioralCtx.entropyScore.toFixed(2)}, threshold: ${threshold.toFixed(2)}).${behavioralCtx.reason ? ` ${behavioralCtx.reason}` : ''}`, behavioralCtx.toolName, undefined, 'Consider normalizing output structure, reducing randomness, or providing more predictable output format.'));
|
|
31
|
-
}
|
|
32
|
-
return diagnostics;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export const W022HighEntropyOutput = new W022HighEntropyOutputRule();
|
|
36
|
-
//# sourceMappingURL=w022-high-entropy-output.js.map
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W023: Unstable Defaults
|
|
3
|
-
*
|
|
4
|
-
* Condition: Tool behavior changes significantly with default values
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - Defaults should be stable and predictable
|
|
8
|
-
* - Changing defaults breaks agent expectations
|
|
9
|
-
* - Indicates design inconsistency
|
|
10
|
-
*/
|
|
11
|
-
import { BaseRule } from '../base.js';
|
|
12
|
-
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
13
|
-
/**
|
|
14
|
-
* Context for unstable defaults detection.
|
|
15
|
-
*/
|
|
16
|
-
export interface UnstableDefaultsContext {
|
|
17
|
-
/** Tool name */
|
|
18
|
-
toolName: string;
|
|
19
|
-
/** Fields with unstable defaults */
|
|
20
|
-
unstableFields: Array<{
|
|
21
|
-
fieldName: string;
|
|
22
|
-
reason: string;
|
|
23
|
-
}>;
|
|
24
|
-
}
|
|
25
|
-
declare class W023UnstableDefaultsRule extends BaseRule {
|
|
26
|
-
readonly id = "W023";
|
|
27
|
-
readonly severity: "warning";
|
|
28
|
-
readonly ruleName = "Unstable Defaults";
|
|
29
|
-
readonly description = "Tool behavior changes significantly with default values, breaking agent expectations.";
|
|
30
|
-
check(_ctx: AnalysisContext): Diagnostic[];
|
|
31
|
-
/**
|
|
32
|
-
* Check with behavioral context (called from test orchestrator).
|
|
33
|
-
*/
|
|
34
|
-
checkWithBehavioralContext(behavioralCtx: UnstableDefaultsContext): Diagnostic[];
|
|
35
|
-
}
|
|
36
|
-
export declare const W023UnstableDefaults: W023UnstableDefaultsRule;
|
|
37
|
-
export {};
|
|
38
|
-
//# sourceMappingURL=w023-unstable-defaults.d.ts.map
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* W023: Unstable Defaults
|
|
3
|
-
*
|
|
4
|
-
* Condition: Tool behavior changes significantly with default values
|
|
5
|
-
*
|
|
6
|
-
* Why this is a warning:
|
|
7
|
-
* - Defaults should be stable and predictable
|
|
8
|
-
* - Changing defaults breaks agent expectations
|
|
9
|
-
* - Indicates design inconsistency
|
|
10
|
-
*/
|
|
11
|
-
import { BaseRule } from '../base.js';
|
|
12
|
-
class W023UnstableDefaultsRule extends BaseRule {
|
|
13
|
-
id = 'W023';
|
|
14
|
-
severity = 'warning';
|
|
15
|
-
ruleName = 'Unstable Defaults';
|
|
16
|
-
description = 'Tool behavior changes significantly with default values, breaking agent expectations.';
|
|
17
|
-
check(_ctx) {
|
|
18
|
-
// This rule requires behavioral context
|
|
19
|
-
return [];
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Check with behavioral context (called from test orchestrator).
|
|
23
|
-
*/
|
|
24
|
-
checkWithBehavioralContext(behavioralCtx) {
|
|
25
|
-
const diagnostics = [];
|
|
26
|
-
if (behavioralCtx.unstableFields.length > 0) {
|
|
27
|
-
const fieldList = behavioralCtx.unstableFields
|
|
28
|
-
.map(f => ` - ${f.fieldName}: ${f.reason}`)
|
|
29
|
-
.join('\n');
|
|
30
|
-
diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" has unstable default values:\n${fieldList}`, behavioralCtx.toolName, undefined, 'Ensure default values are stable and predictable. Avoid defaults that change behavior significantly.'));
|
|
31
|
-
}
|
|
32
|
-
return diagnostics;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export const W023UnstableDefaults = new W023UnstableDefaultsRule();
|
|
36
|
-
//# sourceMappingURL=w023-unstable-defaults.js.map
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hidden dependency tracker.
|
|
3
|
-
* Tracks tool calls during execution to detect hidden dependencies.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Tool call record during execution.
|
|
7
|
-
*/
|
|
8
|
-
export interface ToolCallRecord {
|
|
9
|
-
/** Tool name that was called */
|
|
10
|
-
toolName: string;
|
|
11
|
-
/** Timestamp */
|
|
12
|
-
timestamp: number;
|
|
13
|
-
/** Arguments passed */
|
|
14
|
-
arguments?: Record<string, unknown>;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Dependency tracking result.
|
|
18
|
-
*/
|
|
19
|
-
export interface DependencyTrackingResult {
|
|
20
|
-
/** Whether hidden dependencies were detected */
|
|
21
|
-
detected: boolean;
|
|
22
|
-
/** List of tool calls that are not declared in contract */
|
|
23
|
-
hiddenDependencies: ToolCallRecord[];
|
|
24
|
-
/** List of declared dependencies that don't exist in the MCP server */
|
|
25
|
-
missingDependencies: string[];
|
|
26
|
-
/** Declared dependencies from contract */
|
|
27
|
-
declaredDependencies: string[];
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Dependency tracker for monitoring tool calls.
|
|
31
|
-
* Note: This requires integration with MCP client to intercept tool calls.
|
|
32
|
-
* For v1.3.0, we'll track via a wrapper or client extension.
|
|
33
|
-
*/
|
|
34
|
-
export declare class DependencyTracker {
|
|
35
|
-
private toolCalls;
|
|
36
|
-
private readonly declaredDependencies;
|
|
37
|
-
constructor(declaredDependencies?: string[]);
|
|
38
|
-
/**
|
|
39
|
-
* Record a tool call.
|
|
40
|
-
*/
|
|
41
|
-
recordToolCall(toolName: string, arguments_?: Record<string, unknown>): void;
|
|
42
|
-
/**
|
|
43
|
-
* Get all tool calls.
|
|
44
|
-
*/
|
|
45
|
-
getToolCalls(): readonly ToolCallRecord[];
|
|
46
|
-
/**
|
|
47
|
-
* Detect hidden dependencies (tool calls not declared in contract).
|
|
48
|
-
* Also validates that declared dependencies actually exist.
|
|
49
|
-
* @param availableTools - Set of available tool names from MCP server (optional, for validation)
|
|
50
|
-
*/
|
|
51
|
-
detectHiddenDependencies(availableTools?: Set<string> | string[]): DependencyTrackingResult;
|
|
52
|
-
/**
|
|
53
|
-
* Clear all recorded tool calls.
|
|
54
|
-
*/
|
|
55
|
-
clear(): void;
|
|
56
|
-
/**
|
|
57
|
-
* Get summary of dependencies.
|
|
58
|
-
*/
|
|
59
|
-
getSummary(availableTools?: Set<string> | string[]): {
|
|
60
|
-
totalCalls: number;
|
|
61
|
-
uniqueTools: number;
|
|
62
|
-
hiddenDependencies: number;
|
|
63
|
-
missingDependencies: number;
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=dependency-tracker.d.ts.map
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hidden dependency tracker.
|
|
3
|
-
* Tracks tool calls during execution to detect hidden dependencies.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Dependency tracker for monitoring tool calls.
|
|
7
|
-
* Note: This requires integration with MCP client to intercept tool calls.
|
|
8
|
-
* For v1.3.0, we'll track via a wrapper or client extension.
|
|
9
|
-
*/
|
|
10
|
-
export class DependencyTracker {
|
|
11
|
-
toolCalls = [];
|
|
12
|
-
declaredDependencies;
|
|
13
|
-
constructor(declaredDependencies = []) {
|
|
14
|
-
this.declaredDependencies = declaredDependencies;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Record a tool call.
|
|
18
|
-
*/
|
|
19
|
-
recordToolCall(toolName, arguments_) {
|
|
20
|
-
this.toolCalls.push({
|
|
21
|
-
toolName,
|
|
22
|
-
timestamp: Date.now(),
|
|
23
|
-
arguments: arguments_,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Get all tool calls.
|
|
28
|
-
*/
|
|
29
|
-
getToolCalls() {
|
|
30
|
-
return this.toolCalls;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Detect hidden dependencies (tool calls not declared in contract).
|
|
34
|
-
* Also validates that declared dependencies actually exist.
|
|
35
|
-
* @param availableTools - Set of available tool names from MCP server (optional, for validation)
|
|
36
|
-
*/
|
|
37
|
-
detectHiddenDependencies(availableTools) {
|
|
38
|
-
// Check for hidden dependencies (tools called but not declared)
|
|
39
|
-
const hiddenDependencies = this.toolCalls.filter(call => !this.declaredDependencies.includes(call.toolName));
|
|
40
|
-
// Check for missing dependencies (declared but don't exist in MCP server)
|
|
41
|
-
const missingDependencies = [];
|
|
42
|
-
if (availableTools) {
|
|
43
|
-
const availableSet = Array.isArray(availableTools)
|
|
44
|
-
? new Set(availableTools)
|
|
45
|
-
: availableTools;
|
|
46
|
-
for (const declaredDep of this.declaredDependencies) {
|
|
47
|
-
if (!availableSet.has(declaredDep)) {
|
|
48
|
-
missingDependencies.push(declaredDep);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
const detected = hiddenDependencies.length > 0 || missingDependencies.length > 0;
|
|
53
|
-
return {
|
|
54
|
-
detected,
|
|
55
|
-
hiddenDependencies,
|
|
56
|
-
missingDependencies,
|
|
57
|
-
declaredDependencies: this.declaredDependencies,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Clear all recorded tool calls.
|
|
62
|
-
*/
|
|
63
|
-
clear() {
|
|
64
|
-
this.toolCalls = [];
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Get summary of dependencies.
|
|
68
|
-
*/
|
|
69
|
-
getSummary(availableTools) {
|
|
70
|
-
const uniqueTools = new Set(this.toolCalls.map(c => c.toolName));
|
|
71
|
-
const result = this.detectHiddenDependencies(availableTools);
|
|
72
|
-
return {
|
|
73
|
-
totalCalls: this.toolCalls.length,
|
|
74
|
-
uniqueTools: uniqueTools.size,
|
|
75
|
-
hiddenDependencies: result.hiddenDependencies.length,
|
|
76
|
-
missingDependencies: result.missingDependencies.length,
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=dependency-tracker.js.map
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test result formatters.
|
|
3
|
-
* Formats test results for CLI and JSON output.
|
|
4
|
-
*/
|
|
5
|
-
import type { TestOrchestratorResult } from './orchestrator.js';
|
|
6
|
-
/**
|
|
7
|
-
* Format test results for CI output (minimal).
|
|
8
|
-
*/
|
|
9
|
-
export declare function formatCIResults(result: TestOrchestratorResult): void;
|
|
10
|
-
/**
|
|
11
|
-
* Format test results for CLI output.
|
|
12
|
-
*/
|
|
13
|
-
export declare function formatCLIResults(result: TestOrchestratorResult): void;
|
|
14
|
-
/**
|
|
15
|
-
* Format test results as JSON.
|
|
16
|
-
*/
|
|
17
|
-
export declare function formatJSONResults(result: TestOrchestratorResult): string;
|
|
18
|
-
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test result formatters.
|
|
3
|
-
* Formats test results for CLI and JSON output.
|
|
4
|
-
*/
|
|
5
|
-
import { log } from '../../utils/logger.js';
|
|
6
|
-
/**
|
|
7
|
-
* Format test results for CI output (minimal).
|
|
8
|
-
*/
|
|
9
|
-
export function formatCIResults(result) {
|
|
10
|
-
const errors = result.diagnostics.filter(d => d.severity === 'error');
|
|
11
|
-
const warnings = result.diagnostics.filter(d => d.severity === 'warning');
|
|
12
|
-
// CI mode: minimal output, exit codes handled by caller
|
|
13
|
-
if (result.verdict === 'fail') {
|
|
14
|
-
console.log(`✗ Test failed: ${result.toolsFailed} tool(s) failed, ${errors.length} error(s), ${warnings.length} warning(s)`);
|
|
15
|
-
// Print errors only (no warnings in CI)
|
|
16
|
-
for (const error of errors) {
|
|
17
|
-
console.log(`${error.code}: ${error.message}`);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
console.log(`✓ Test passed: ${result.toolsTested} tool(s) tested, ${result.toolsPassed} passed`);
|
|
22
|
-
if (warnings.length > 0) {
|
|
23
|
-
console.log(` ${warnings.length} warning(s) (non-blocking)`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Format test results for CLI output.
|
|
29
|
-
*/
|
|
30
|
-
export function formatCLIResults(result) {
|
|
31
|
-
log.blank();
|
|
32
|
-
log.heading('Tool Validation Results');
|
|
33
|
-
log.blank();
|
|
34
|
-
// Overall verdict
|
|
35
|
-
if (result.verdict === 'pass') {
|
|
36
|
-
log.checkmark('All tools passed validation');
|
|
37
|
-
}
|
|
38
|
-
else if (result.verdict === 'pass-with-warnings') {
|
|
39
|
-
log.warn('Tools passed with warnings');
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
log.xmark('Tool validation failed');
|
|
43
|
-
}
|
|
44
|
-
log.blank();
|
|
45
|
-
// Summary
|
|
46
|
-
log.heading('Summary:');
|
|
47
|
-
log.labelValue(' Tools tested:', String(result.toolsTested));
|
|
48
|
-
log.labelValue(' Tools passed:', String(result.toolsPassed));
|
|
49
|
-
log.labelValue(' Tools failed:', String(result.toolsFailed));
|
|
50
|
-
const errors = result.diagnostics.filter(d => d.severity === 'error');
|
|
51
|
-
const warnings = result.diagnostics.filter(d => d.severity === 'warning');
|
|
52
|
-
if (errors.length > 0) {
|
|
53
|
-
log.labelValue(' Errors:', String(errors.length));
|
|
54
|
-
}
|
|
55
|
-
if (warnings.length > 0) {
|
|
56
|
-
log.labelValue(' Warnings:', String(warnings.length));
|
|
57
|
-
}
|
|
58
|
-
log.blank();
|
|
59
|
-
// Tool results
|
|
60
|
-
if (result.toolResults.length > 0) {
|
|
61
|
-
log.heading('Tool Results:');
|
|
62
|
-
for (const toolResult of result.toolResults) {
|
|
63
|
-
log.blank();
|
|
64
|
-
const status = toolResult.passed ? log.tick() : log.cross();
|
|
65
|
-
log.plain(` ${status} ${log.styleText(toolResult.toolName, 'bold')}`);
|
|
66
|
-
// Summary
|
|
67
|
-
log.labelValue(' Executions:', `${toolResult.summary.successfulExecutions}/${toolResult.summary.totalExecutions} successful`);
|
|
68
|
-
if (toolResult.summary.testsPassed !== undefined &&
|
|
69
|
-
toolResult.summary.testsFailed !== undefined) {
|
|
70
|
-
const totalTests = toolResult.summary.testsPassed + toolResult.summary.testsFailed;
|
|
71
|
-
log.labelValue(' Tests:', `${toolResult.summary.testsPassed}/${totalTests} passed (expectations matched)`);
|
|
72
|
-
}
|
|
73
|
-
if (toolResult.summary.failedExecutions > 0) {
|
|
74
|
-
log.labelValue(' Failed:', String(toolResult.summary.failedExecutions));
|
|
75
|
-
}
|
|
76
|
-
if (toolResult.summary.timedOutExecutions > 0) {
|
|
77
|
-
log.labelValue(' Timed out:', String(toolResult.summary.timedOutExecutions));
|
|
78
|
-
}
|
|
79
|
-
// Diagnostics
|
|
80
|
-
if (toolResult.diagnostics.length > 0) {
|
|
81
|
-
const toolErrors = toolResult.diagnostics.filter(d => d.severity === 'error');
|
|
82
|
-
const toolWarnings = toolResult.diagnostics.filter(d => d.severity === 'warning');
|
|
83
|
-
if (toolErrors.length > 0) {
|
|
84
|
-
log.plain(' Errors:');
|
|
85
|
-
for (const error of toolErrors) {
|
|
86
|
-
log.error(` ${error.code}: ${error.message}`);
|
|
87
|
-
// Show test context if available
|
|
88
|
-
const context = error.context;
|
|
89
|
-
if (context?.testName) {
|
|
90
|
-
log.plain(` Test: ${context.testName}`);
|
|
91
|
-
}
|
|
92
|
-
if (context?.testInput &&
|
|
93
|
-
Object.keys(context.testInput).length > 0) {
|
|
94
|
-
const inputStr = JSON.stringify(context.testInput, null, 2)
|
|
95
|
-
.split('\n')
|
|
96
|
-
.map((line, idx) => (idx === 0 ? line : ` ${line}`))
|
|
97
|
-
.join('\n');
|
|
98
|
-
log.plain(` Input: ${inputStr}`);
|
|
99
|
-
}
|
|
100
|
-
if (context?.expectedOutputSchema) {
|
|
101
|
-
log.plain(` Expected output schema: ${context.expectedOutputSchema}`);
|
|
102
|
-
}
|
|
103
|
-
// Show parsed error details if available
|
|
104
|
-
if (context?.parsedError) {
|
|
105
|
-
const parsed = context.parsedError;
|
|
106
|
-
if (parsed.field) {
|
|
107
|
-
if (parsed.errorType === 'missing_argument') {
|
|
108
|
-
log.plain(` Field "${parsed.field}" is required but was not provided`);
|
|
109
|
-
}
|
|
110
|
-
else if (parsed.inputType) {
|
|
111
|
-
log.plain(` Field "${parsed.field}" received ${parsed.inputType}${parsed.inputValue && parsed.inputValue !== '{}' ? ` (${parsed.inputValue})` : ''}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
if (error.suggestion) {
|
|
116
|
-
log.plain(` Suggestion: ${error.suggestion}`);
|
|
117
|
-
}
|
|
118
|
-
log.blank();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (toolWarnings.length > 0) {
|
|
122
|
-
log.plain(' Warnings:');
|
|
123
|
-
for (const warning of toolWarnings) {
|
|
124
|
-
log.warn(` ${warning.code}: ${warning.message}`);
|
|
125
|
-
if (warning.suggestion) {
|
|
126
|
-
log.plain(` Suggestion: ${warning.suggestion}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
log.blank();
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Format test results as JSON.
|
|
137
|
-
*/
|
|
138
|
-
export function formatJSONResults(result) {
|
|
139
|
-
const json = {
|
|
140
|
-
verdict: result.verdict,
|
|
141
|
-
summary: {
|
|
142
|
-
toolsTested: result.toolsTested,
|
|
143
|
-
toolsPassed: result.toolsPassed,
|
|
144
|
-
toolsFailed: result.toolsFailed,
|
|
145
|
-
errors: result.diagnostics.filter(d => d.severity === 'error').length,
|
|
146
|
-
warnings: result.diagnostics.filter(d => d.severity === 'warning').length,
|
|
147
|
-
},
|
|
148
|
-
diagnostics: result.diagnostics.map(d => ({
|
|
149
|
-
code: d.code,
|
|
150
|
-
severity: d.severity,
|
|
151
|
-
message: d.message,
|
|
152
|
-
tool: d.tool,
|
|
153
|
-
field: d.field,
|
|
154
|
-
suggestion: d.suggestion,
|
|
155
|
-
context: d.context,
|
|
156
|
-
})),
|
|
157
|
-
tools: result.toolResults.map(tr => ({
|
|
158
|
-
toolName: tr.toolName,
|
|
159
|
-
passed: tr.passed,
|
|
160
|
-
summary: tr.summary,
|
|
161
|
-
diagnostics: tr.diagnostics.map(d => ({
|
|
162
|
-
code: d.code,
|
|
163
|
-
severity: d.severity,
|
|
164
|
-
message: d.message,
|
|
165
|
-
suggestion: d.suggestion,
|
|
166
|
-
context: d.context,
|
|
167
|
-
})),
|
|
168
|
-
})),
|
|
169
|
-
};
|
|
170
|
-
return JSON.stringify(json, null, 2);
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=formatters.js.map
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Synthetic input generator.
|
|
3
|
-
* Generates test inputs from JSON Schema definitions.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* JSON Schema field interface.
|
|
7
|
-
*/
|
|
8
|
-
interface JSONSchemaField {
|
|
9
|
-
type?: string | string[];
|
|
10
|
-
description?: string;
|
|
11
|
-
required?: string[];
|
|
12
|
-
properties?: Record<string, JSONSchemaField>;
|
|
13
|
-
items?: JSONSchemaField | JSONSchemaField[];
|
|
14
|
-
$ref?: string;
|
|
15
|
-
enum?: unknown[];
|
|
16
|
-
pattern?: string;
|
|
17
|
-
example?: unknown;
|
|
18
|
-
examples?: unknown[];
|
|
19
|
-
nullable?: boolean;
|
|
20
|
-
default?: unknown;
|
|
21
|
-
minimum?: number;
|
|
22
|
-
maximum?: number;
|
|
23
|
-
}
|
|
24
|
-
type JSONSchema = JSONSchemaField | Record<string, unknown> | unknown;
|
|
25
|
-
/**
|
|
26
|
-
* Generate test inputs from a JSON Schema.
|
|
27
|
-
* Includes both predictable patterns and agent-like unpredictable variations.
|
|
28
|
-
* @param schema - JSON Schema definition
|
|
29
|
-
* @returns Array of generated input objects
|
|
30
|
-
*/
|
|
31
|
-
export declare function generateInputsFromSchema(schema: JSONSchema): Array<Record<string, unknown>>;
|
|
32
|
-
export {};
|
|
33
|
-
//# sourceMappingURL=input-generator.d.ts.map
|