@syrin/cli 1.3.2 → 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.
Files changed (150) hide show
  1. package/README.md +36 -0
  2. package/dist/cli/commands/config.d.ts +47 -0
  3. package/dist/cli/commands/config.js +360 -0
  4. package/dist/cli/commands/dev.d.ts +6 -0
  5. package/dist/cli/commands/dev.js +67 -15
  6. package/dist/cli/commands/doctor.js +49 -13
  7. package/dist/cli/commands/init.d.ts +2 -0
  8. package/dist/cli/commands/init.js +89 -18
  9. package/dist/cli/commands/status.d.ts +10 -0
  10. package/dist/cli/commands/status.js +162 -0
  11. package/dist/cli/index.js +211 -12
  12. package/dist/cli/prompts/init-prompt.d.ts +18 -0
  13. package/dist/cli/prompts/init-prompt.js +159 -99
  14. package/dist/cli/utils/command-error-handler.js +2 -5
  15. package/dist/config/env-checker.d.ts +12 -2
  16. package/dist/config/env-checker.js +88 -38
  17. package/dist/config/env-templates.d.ts +15 -0
  18. package/dist/config/env-templates.js +49 -0
  19. package/dist/config/generator.js +17 -0
  20. package/dist/config/global-loader.d.ts +50 -0
  21. package/dist/config/global-loader.js +244 -0
  22. package/dist/config/loader.d.ts +28 -0
  23. package/dist/config/loader.js +95 -9
  24. package/dist/config/merger.d.ts +37 -0
  25. package/dist/config/merger.js +68 -0
  26. package/dist/config/schema.d.ts +26 -1
  27. package/dist/config/schema.js +73 -8
  28. package/dist/config/types.d.ts +19 -0
  29. package/dist/config/types.js +26 -1
  30. package/dist/constants/messages.d.ts +7 -0
  31. package/dist/constants/messages.js +8 -0
  32. package/dist/constants/paths.d.ts +6 -0
  33. package/dist/constants/paths.js +10 -0
  34. package/dist/events/emitter.js +7 -7
  35. package/dist/index.js +0 -0
  36. package/dist/presentation/config-ui.d.ts +34 -0
  37. package/dist/presentation/config-ui.js +139 -0
  38. package/dist/presentation/doctor-ui.d.ts +11 -0
  39. package/dist/presentation/doctor-ui.js +52 -1
  40. package/dist/presentation/init-ui.d.ts +9 -0
  41. package/dist/presentation/init-ui.js +33 -0
  42. package/dist/runtime/analysis/analyser.js +2 -2
  43. package/dist/runtime/analysis/rules/warnings/w104-generic-description.d.ts +1 -1
  44. package/dist/runtime/analysis/rules/warnings/w104-generic-description.js +1 -1
  45. package/dist/runtime/dev/event-mapper.js +19 -3
  46. package/dist/runtime/dev/session.d.ts +4 -0
  47. package/dist/runtime/dev/session.js +52 -3
  48. package/dist/runtime/llm/ollama.js +4 -4
  49. package/dist/runtime/mcp/client/manager.js +3 -3
  50. package/dist/runtime/sandbox/executor.js +5 -5
  51. package/dist/runtime/test/orchestrator.js +4 -4
  52. package/dist/utils/editor.d.ts +37 -0
  53. package/dist/utils/editor.js +137 -0
  54. package/dist/utils/logger.d.ts +24 -6
  55. package/dist/utils/logger.js +51 -8
  56. package/package.json +1 -1
  57. package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.d.ts +0 -22
  58. package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.js +0 -30
  59. package/dist/runtime/analysis/rules/errors/e002-underspecified-input.d.ts +0 -24
  60. package/dist/runtime/analysis/rules/errors/e002-underspecified-input.js +0 -52
  61. package/dist/runtime/analysis/rules/errors/e003-type-mismatch.d.ts +0 -23
  62. package/dist/runtime/analysis/rules/errors/e003-type-mismatch.js +0 -73
  63. package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.d.ts +0 -23
  64. package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.js +0 -47
  65. package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.d.ts +0 -25
  66. package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.js +0 -73
  67. package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.d.ts +0 -22
  68. package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.js +0 -57
  69. package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.d.ts +0 -23
  70. package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.js +0 -56
  71. package/dist/runtime/analysis/rules/errors/e008-circular-dependency.d.ts +0 -22
  72. package/dist/runtime/analysis/rules/errors/e008-circular-dependency.js +0 -84
  73. package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.d.ts +0 -23
  74. package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.js +0 -89
  75. package/dist/runtime/analysis/rules/errors/e010-non-serializable.d.ts +0 -25
  76. package/dist/runtime/analysis/rules/errors/e010-non-serializable.js +0 -46
  77. package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.d.ts +0 -24
  78. package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.js +0 -33
  79. package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.d.ts +0 -39
  80. package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.js +0 -40
  81. package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.d.ts +0 -37
  82. package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.js +0 -34
  83. package/dist/runtime/analysis/rules/errors/e013-output-explosion.d.ts +0 -39
  84. package/dist/runtime/analysis/rules/errors/e013-output-explosion.js +0 -36
  85. package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.d.ts +0 -42
  86. package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.js +0 -46
  87. package/dist/runtime/analysis/rules/errors/e014-output-explosion.d.ts +0 -39
  88. package/dist/runtime/analysis/rules/errors/e014-output-explosion.js +0 -36
  89. package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.d.ts +0 -42
  90. package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.js +0 -46
  91. package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.d.ts +0 -44
  92. package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.js +0 -66
  93. package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.d.ts +0 -43
  94. package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.js +0 -42
  95. package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.d.ts +0 -44
  96. package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.js +0 -66
  97. package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.d.ts +0 -57
  98. package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.js +0 -80
  99. package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.d.ts +0 -43
  100. package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.js +0 -42
  101. package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.d.ts +0 -57
  102. package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.js +0 -80
  103. package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.d.ts +0 -38
  104. package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.js +0 -37
  105. package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.d.ts +0 -38
  106. package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.js +0 -37
  107. package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.d.ts +0 -65
  108. package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.js +0 -109
  109. package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.d.ts +0 -65
  110. package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.js +0 -109
  111. package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.d.ts +0 -22
  112. package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.js +0 -39
  113. package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.d.ts +0 -24
  114. package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.js +0 -40
  115. package/dist/runtime/analysis/rules/warnings/w003-missing-examples.d.ts +0 -22
  116. package/dist/runtime/analysis/rules/warnings/w003-missing-examples.js +0 -84
  117. package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.d.ts +0 -23
  118. package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.js +0 -96
  119. package/dist/runtime/analysis/rules/warnings/w005-generic-description.d.ts +0 -53
  120. package/dist/runtime/analysis/rules/warnings/w005-generic-description.js +0 -108
  121. package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.d.ts +0 -22
  122. package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.js +0 -44
  123. package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.d.ts +0 -23
  124. package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.js +0 -37
  125. package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.d.ts +0 -22
  126. package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.js +0 -97
  127. package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.d.ts +0 -23
  128. package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.js +0 -88
  129. package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.d.ts +0 -22
  130. package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.js +0 -81
  131. package/dist/runtime/analysis/rules/warnings/w021-weak-schema.d.ts +0 -40
  132. package/dist/runtime/analysis/rules/warnings/w021-weak-schema.js +0 -32
  133. package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.d.ts +0 -39
  134. package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.js +0 -36
  135. package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.d.ts +0 -38
  136. package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.js +0 -36
  137. package/dist/runtime/test/dependency-tracker.d.ts +0 -66
  138. package/dist/runtime/test/dependency-tracker.js +0 -80
  139. package/dist/runtime/test/formatters.d.ts +0 -18
  140. package/dist/runtime/test/formatters.js +0 -172
  141. package/dist/runtime/test/input-generator.d.ts +0 -33
  142. package/dist/runtime/test/input-generator.js +0 -498
  143. package/dist/runtime/test/mcp-root-detector.d.ts +0 -31
  144. package/dist/runtime/test/mcp-root-detector.js +0 -105
  145. package/dist/runtime/test/retry-tester.d.ts +0 -44
  146. package/dist/runtime/test/retry-tester.js +0 -103
  147. package/dist/runtime/test/synthetic-input-generator.d.ts +0 -11
  148. package/dist/runtime/test/synthetic-input-generator.js +0 -154
  149. package/dist/runtime/test/test-runner.d.ts +0 -28
  150. package/dist/runtime/test/test-runner.js +0 -55
@@ -1,40 +0,0 @@
1
- /**
2
- * E012: Side Effect Detected
3
- *
4
- * Condition: Tool attempts filesystem writes to project files (not temp directory)
5
- *
6
- * Why this is fatal:
7
- * - Tools should not mutate project state
8
- * - Breaks isolation and testability
9
- * - Makes behavior unpredictable
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E012SideEffectDetectedRule extends BaseRule {
14
- id = ERROR_CODES.E012;
15
- severity = 'error';
16
- ruleName = 'Side Effect Detected';
17
- description = 'Tool attempted filesystem write to project files. Tools should not mutate project state.';
18
- check(_ctx) {
19
- const diagnostics = [];
20
- // This rule requires behavioral context (from runtime testing)
21
- // It will be called with behavioral data from the test orchestrator
22
- // For now, return empty - actual checking happens in test orchestrator
23
- return diagnostics;
24
- }
25
- /**
26
- * Check with behavioral context (called from test orchestrator).
27
- */
28
- checkWithBehavioralContext(behavioralCtx) {
29
- const diagnostics = [];
30
- if (behavioralCtx.sideEffects.length > 0) {
31
- const sideEffectList = behavioralCtx.sideEffects
32
- .map(se => ` - ${se.operation}: ${se.path}`)
33
- .join('\n');
34
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" attempted filesystem operations on project files:\n${sideEffectList}`, behavioralCtx.toolName, undefined, 'Remove filesystem writes or write only to temp directory. Tools should not mutate project state.'));
35
- }
36
- return diagnostics;
37
- }
38
- }
39
- export const E012SideEffectDetected = new E012SideEffectDetectedRule();
40
- //# sourceMappingURL=e012-side-effect-detected.js.map
@@ -1,37 +0,0 @@
1
- /**
2
- * E013: Non-Deterministic Output
3
- *
4
- * Condition: Tool produces different outputs for the same input across multiple runs
5
- *
6
- * Why this is fatal:
7
- * - Breaks agent reliability
8
- * - Makes testing impossible
9
- * - LLM cannot reason about tool behavior
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for non-determinism detection.
15
- */
16
- export interface NonDeterminismContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** Number of runs that produced different outputs */
20
- differentRuns: number;
21
- /** Total number of runs */
22
- totalRuns: number;
23
- }
24
- declare class E013NonDeterministicOutputRule extends BaseRule {
25
- readonly id: any;
26
- readonly severity: "error";
27
- readonly ruleName = "Non-Deterministic Output";
28
- readonly description = "Tool produces different outputs for the same input across multiple runs. This breaks agent reliability.";
29
- check(_ctx: AnalysisContext): Diagnostic[];
30
- /**
31
- * Check with behavioral context (called from test orchestrator).
32
- */
33
- checkWithBehavioralContext(behavioralCtx: NonDeterminismContext): Diagnostic[];
34
- }
35
- export declare const E013NonDeterministicOutput: E013NonDeterministicOutputRule;
36
- export {};
37
- //# sourceMappingURL=e013-non-deterministic-output.d.ts.map
@@ -1,34 +0,0 @@
1
- /**
2
- * E013: Non-Deterministic Output
3
- *
4
- * Condition: Tool produces different outputs for the same input across multiple runs
5
- *
6
- * Why this is fatal:
7
- * - Breaks agent reliability
8
- * - Makes testing impossible
9
- * - LLM cannot reason about tool behavior
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E013NonDeterministicOutputRule extends BaseRule {
14
- id = ERROR_CODES.E013;
15
- severity = 'error';
16
- ruleName = 'Non-Deterministic Output';
17
- description = 'Tool produces different outputs for the same input across multiple runs. This breaks agent reliability.';
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- if (behavioralCtx.differentRuns > 0) {
28
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" produced different outputs across ${behavioralCtx.totalRuns} runs. ${behavioralCtx.differentRuns} run(s) produced different results.`, behavioralCtx.toolName, undefined, 'Ensure tool produces consistent outputs for the same input. Remove sources of non-determinism (random values, timestamps, etc.).'));
29
- }
30
- return diagnostics;
31
- }
32
- }
33
- export const E013NonDeterministicOutput = new E013NonDeterministicOutputRule();
34
- //# sourceMappingURL=e013-non-deterministic-output.js.map
@@ -1,39 +0,0 @@
1
- /**
2
- * E013: Output Explosion
3
- *
4
- * Condition: Tool output exceeds declared size limit
5
- *
6
- * Why this is fatal:
7
- * - Large outputs overwhelm LLM context
8
- * - Breaks agent reasoning
9
- * - Indicates design issue (pagination, filtering needed)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for output size validation.
15
- */
16
- export interface OutputSizeContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** Actual output size in bytes */
20
- actualSize: number;
21
- /** Maximum allowed size in bytes */
22
- maxSize: number;
23
- /** Size limit string from contract (e.g., "50kb") */
24
- limitString: string;
25
- }
26
- declare class E013OutputExplosionRule extends BaseRule {
27
- readonly id: "E013";
28
- readonly severity: "error";
29
- readonly ruleName = "Output Explosion";
30
- readonly description = "Tool output exceeds declared size limit. Large outputs overwhelm LLM context and break agent reasoning.";
31
- check(_ctx: AnalysisContext): Diagnostic[];
32
- /**
33
- * Check with behavioral context (called from test orchestrator).
34
- */
35
- checkWithBehavioralContext(behavioralCtx: OutputSizeContext): Diagnostic[];
36
- }
37
- export declare const E013OutputExplosion: E013OutputExplosionRule;
38
- export {};
39
- //# sourceMappingURL=e013-output-explosion.d.ts.map
@@ -1,36 +0,0 @@
1
- /**
2
- * E013: Output Explosion
3
- *
4
- * Condition: Tool output exceeds declared size limit
5
- *
6
- * Why this is fatal:
7
- * - Large outputs overwhelm LLM context
8
- * - Breaks agent reasoning
9
- * - Indicates design issue (pagination, filtering needed)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E013OutputExplosionRule extends BaseRule {
14
- id = ERROR_CODES.E013;
15
- severity = 'error';
16
- ruleName = 'Output Explosion';
17
- description = 'Tool output exceeds declared size limit. Large outputs overwhelm LLM context and break agent reasoning.';
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- if (behavioralCtx.actualSize > behavioralCtx.maxSize) {
28
- const actualSizeKB = (behavioralCtx.actualSize / 1024).toFixed(2);
29
- const maxSizeKB = (behavioralCtx.maxSize / 1024).toFixed(2);
30
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" returned ${actualSizeKB}KB, exceeding declared limit of ${behavioralCtx.limitString} (${maxSizeKB}KB).`, behavioralCtx.toolName, undefined, `Reduce output size by: paginating results, adding filters, or updating contract limit if legitimate (max_output_size: ${Math.ceil(behavioralCtx.actualSize / 1024)}kb).`));
31
- }
32
- return diagnostics;
33
- }
34
- }
35
- export const E013OutputExplosion = new E013OutputExplosionRule();
36
- //# sourceMappingURL=e013-output-explosion.js.map
@@ -1,42 +0,0 @@
1
- /**
2
- * E014: Hidden Dependency
3
- *
4
- * Condition: Tool calls other tools during execution without declaring them in contract
5
- *
6
- * Why this is fatal:
7
- * - Breaks isolation assumption
8
- * - Creates hidden coupling
9
- * - Makes tool behavior unpredictable
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for hidden dependency detection.
15
- */
16
- export interface HiddenDependencyContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** List of tool calls that are not declared */
20
- hiddenDependencies: Array<{
21
- toolName: string;
22
- timestamp: number;
23
- }>;
24
- /** List of declared dependencies that don't exist in the MCP server */
25
- missingDependencies?: string[];
26
- /** Declared dependencies from contract — reserved for future validation/consumer use */
27
- declaredDependencies: string[];
28
- }
29
- declare class E014HiddenDependencyRule extends BaseRule {
30
- readonly id: "E014";
31
- readonly severity: "error";
32
- readonly ruleName = "Hidden Dependency";
33
- readonly description = "Tool calls other tools during execution without declaring them in contract. This breaks isolation.";
34
- check(_ctx: AnalysisContext): Diagnostic[];
35
- /**
36
- * Check with behavioral context (called from test orchestrator).
37
- */
38
- checkWithBehavioralContext(behavioralCtx: HiddenDependencyContext): Diagnostic[];
39
- }
40
- export declare const E014HiddenDependency: E014HiddenDependencyRule;
41
- export {};
42
- //# sourceMappingURL=e014-hidden-dependency.d.ts.map
@@ -1,46 +0,0 @@
1
- /**
2
- * E014: Hidden Dependency
3
- *
4
- * Condition: Tool calls other tools during execution without declaring them in contract
5
- *
6
- * Why this is fatal:
7
- * - Breaks isolation assumption
8
- * - Creates hidden coupling
9
- * - Makes tool behavior unpredictable
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E014HiddenDependencyRule extends BaseRule {
14
- id = ERROR_CODES.E014;
15
- severity = 'error';
16
- ruleName = 'Hidden Dependency';
17
- description = 'Tool calls other tools during execution without declaring them in contract. This breaks isolation.';
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- // Check for hidden dependencies (tools called but not declared)
28
- if (behavioralCtx.hiddenDependencies.length > 0) {
29
- const dependencyList = behavioralCtx.hiddenDependencies
30
- .map(dep => ` - ${dep.toolName}`)
31
- .join('\n');
32
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" called other tools without declaring them:\n${dependencyList}`, behavioralCtx.toolName, undefined, `Declare dependencies in contract (guarantees.dependencies: [${behavioralCtx.hiddenDependencies.map(d => `"${d.toolName}"`).join(', ')}]) or remove the tool calls.`));
33
- }
34
- // Check for missing dependencies (declared but don't exist in MCP server)
35
- if (behavioralCtx.missingDependencies &&
36
- behavioralCtx.missingDependencies.length > 0) {
37
- const missingList = behavioralCtx.missingDependencies
38
- .map(dep => ` - ${dep}`)
39
- .join('\n');
40
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" declares dependencies that don't exist in the MCP server:\n${missingList}`, behavioralCtx.toolName, undefined, `Remove non-existent dependencies from contract (guarantees.dependencies) or ensure these tools are implemented: [${behavioralCtx.missingDependencies.map(d => `"${d}"`).join(', ')}]`));
41
- }
42
- return diagnostics;
43
- }
44
- }
45
- export const E014HiddenDependency = new E014HiddenDependencyRule();
46
- //# sourceMappingURL=e014-hidden-dependency.js.map
@@ -1,39 +0,0 @@
1
- /**
2
- * E014: Output Explosion
3
- *
4
- * Condition: Tool output exceeds declared size limit
5
- *
6
- * Why this is fatal:
7
- * - Large outputs overwhelm LLM context
8
- * - Breaks agent reasoning
9
- * - Indicates design issue (pagination, filtering needed)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for output size validation.
15
- */
16
- export interface OutputSizeContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** Actual output size in bytes */
20
- actualSize: number;
21
- /** Maximum allowed size in bytes */
22
- maxSize: number;
23
- /** Size limit string from contract (e.g., "50kb") */
24
- limitString: string;
25
- }
26
- declare class E014OutputExplosionRule extends BaseRule {
27
- readonly id: "E014";
28
- readonly severity: "error";
29
- readonly ruleName = "Output Explosion";
30
- readonly description = "Tool output exceeds declared size limit. Large outputs overwhelm LLM context and break agent reasoning.";
31
- check(_ctx: AnalysisContext): Diagnostic[];
32
- /**
33
- * Check with behavioral context (called from test orchestrator).
34
- */
35
- checkWithBehavioralContext(behavioralCtx: OutputSizeContext): Diagnostic[];
36
- }
37
- export declare const E014OutputExplosion: E014OutputExplosionRule;
38
- export {};
39
- //# sourceMappingURL=e014-output-explosion.d.ts.map
@@ -1,36 +0,0 @@
1
- /**
2
- * E014: Output Explosion
3
- *
4
- * Condition: Tool output exceeds declared size limit
5
- *
6
- * Why this is fatal:
7
- * - Large outputs overwhelm LLM context
8
- * - Breaks agent reasoning
9
- * - Indicates design issue (pagination, filtering needed)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E014OutputExplosionRule extends BaseRule {
14
- id = ERROR_CODES.E014;
15
- severity = 'error';
16
- ruleName = 'Output Explosion';
17
- description = 'Tool output exceeds declared size limit. Large outputs overwhelm LLM context and break agent reasoning.';
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- if (behavioralCtx.actualSize > behavioralCtx.maxSize) {
28
- const actualSizeKB = (behavioralCtx.actualSize / 1024).toFixed(2);
29
- const maxSizeKB = (behavioralCtx.maxSize / 1024).toFixed(2);
30
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" returned ${actualSizeKB}KB, exceeding declared limit of ${behavioralCtx.limitString} (${maxSizeKB}KB).`, behavioralCtx.toolName, undefined, `Reduce output size by: paginating results, adding filters, or updating contract limit if legitimate (max_output_size: ${Math.ceil(behavioralCtx.actualSize / 1024)}kb).`));
31
- }
32
- return diagnostics;
33
- }
34
- }
35
- export const E014OutputExplosion = new E014OutputExplosionRule();
36
- //# sourceMappingURL=e014-output-explosion.js.map
@@ -1,42 +0,0 @@
1
- /**
2
- * E015: Hidden Dependency
3
- *
4
- * Condition: Tool calls other tools during execution without declaring them in contract
5
- *
6
- * Why this is fatal:
7
- * - Breaks isolation assumption
8
- * - Creates hidden coupling
9
- * - Makes tool behavior unpredictable
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for hidden dependency detection.
15
- */
16
- export interface HiddenDependencyContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** List of tool calls that are not declared */
20
- hiddenDependencies: Array<{
21
- toolName: string;
22
- timestamp: number;
23
- }>;
24
- /** List of declared dependencies that don't exist in the MCP server */
25
- missingDependencies?: string[];
26
- /** Declared dependencies from contract — reserved for future validation/consumer use */
27
- declaredDependencies: string[];
28
- }
29
- declare class E015HiddenDependencyRule extends BaseRule {
30
- readonly id: "E015";
31
- readonly severity: "error";
32
- readonly ruleName = "Hidden Dependency";
33
- readonly description = "Tool calls other tools during execution without declaring them in contract. This breaks isolation.";
34
- check(_ctx: AnalysisContext): Diagnostic[];
35
- /**
36
- * Check with behavioral context (called from test orchestrator).
37
- */
38
- checkWithBehavioralContext(behavioralCtx: HiddenDependencyContext): Diagnostic[];
39
- }
40
- export declare const E015HiddenDependency: E015HiddenDependencyRule;
41
- export {};
42
- //# sourceMappingURL=e015-hidden-dependency.d.ts.map
@@ -1,46 +0,0 @@
1
- /**
2
- * E015: Hidden Dependency
3
- *
4
- * Condition: Tool calls other tools during execution without declaring them in contract
5
- *
6
- * Why this is fatal:
7
- * - Breaks isolation assumption
8
- * - Creates hidden coupling
9
- * - Makes tool behavior unpredictable
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E015HiddenDependencyRule extends BaseRule {
14
- id = ERROR_CODES.E015;
15
- severity = 'error';
16
- ruleName = 'Hidden Dependency';
17
- description = 'Tool calls other tools during execution without declaring them in contract. This breaks isolation.';
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- // Check for hidden dependencies (tools called but not declared)
28
- if (behavioralCtx.hiddenDependencies.length > 0) {
29
- const dependencyList = behavioralCtx.hiddenDependencies
30
- .map(dep => ` - ${dep.toolName}`)
31
- .join('\n');
32
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" called other tools without declaring them:\n${dependencyList}`, behavioralCtx.toolName, undefined, `Declare dependencies in contract (guarantees.dependencies: [${behavioralCtx.hiddenDependencies.map(d => `"${d.toolName}"`).join(', ')}]) or remove the tool calls.`));
33
- }
34
- // Check for missing dependencies (declared but don't exist in MCP server)
35
- if (behavioralCtx.missingDependencies &&
36
- behavioralCtx.missingDependencies.length > 0) {
37
- const missingList = behavioralCtx.missingDependencies
38
- .map(dep => ` - ${dep}`)
39
- .join('\n');
40
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" declares dependencies that don't exist in the MCP server:\n${missingList}`, behavioralCtx.toolName, undefined, `Remove non-existent dependencies from contract (guarantees.dependencies) or ensure these tools are implemented: [${behavioralCtx.missingDependencies.map(d => `"${d}"`).join(', ')}]`));
41
- }
42
- return diagnostics;
43
- }
44
- }
45
- export const E015HiddenDependency = new E015HiddenDependencyRule();
46
- //# sourceMappingURL=e015-hidden-dependency.js.map
@@ -1,44 +0,0 @@
1
- /**
2
- * E015: Unbounded Execution
3
- *
4
- * Condition: Tool execution timed out or failed to terminate
5
- *
6
- * Why this is fatal:
7
- * - Tool may hang indefinitely
8
- * - Breaks agent reliability
9
- * - Indicates design issue (missing timeouts, infinite loops)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for unbounded execution detection.
15
- */
16
- export interface UnboundedExecutionContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** Whether execution timed out */
20
- timedOut: boolean;
21
- /** Declared max execution time (e.g., "5m", "2h") or undefined if using default */
22
- declaredTimeout?: string;
23
- /** Actual timeout used in milliseconds */
24
- actualTimeoutMs?: number;
25
- /** Execution errors */
26
- errors: Array<{
27
- message: string;
28
- code?: string;
29
- }>;
30
- }
31
- declare class E015UnboundedExecutionRule extends BaseRule {
32
- readonly id: "E015";
33
- readonly severity: "error";
34
- readonly ruleName = "Unbounded Execution";
35
- readonly description = "Tool execution timed out or failed to terminate. Tool may hang indefinitely, breaking agent reliability.";
36
- check(_ctx: AnalysisContext): Diagnostic[];
37
- /**
38
- * Check with behavioral context (called from test orchestrator).
39
- */
40
- checkWithBehavioralContext(behavioralCtx: UnboundedExecutionContext): Diagnostic[];
41
- }
42
- export declare const E015UnboundedExecution: E015UnboundedExecutionRule;
43
- export {};
44
- //# sourceMappingURL=e015-unbounded-execution.d.ts.map
@@ -1,66 +0,0 @@
1
- /**
2
- * E015: Unbounded Execution
3
- *
4
- * Condition: Tool execution timed out or failed to terminate
5
- *
6
- * Why this is fatal:
7
- * - Tool may hang indefinitely
8
- * - Breaks agent reliability
9
- * - Indicates design issue (missing timeouts, infinite loops)
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- /**
14
- * Format timeout in milliseconds to human-readable string.
15
- */
16
- function formatTimeout(ms) {
17
- if (ms < 1000) {
18
- return `${ms}ms`;
19
- }
20
- const s = Math.floor(ms / 1000);
21
- if (s < 60) {
22
- return `${s}s`;
23
- }
24
- const m = Math.floor(s / 60);
25
- if (m < 60) {
26
- return `${m}m`;
27
- }
28
- const h = Math.floor(m / 60);
29
- return `${h}h`;
30
- }
31
- class E015UnboundedExecutionRule extends BaseRule {
32
- id = ERROR_CODES.E015;
33
- severity = 'error';
34
- ruleName = 'Unbounded Execution';
35
- description = 'Tool execution timed out or failed to terminate. Tool may hang indefinitely, breaking agent reliability.';
36
- check(_ctx) {
37
- // This rule requires behavioral context
38
- return [];
39
- }
40
- /**
41
- * Check with behavioral context (called from test orchestrator).
42
- */
43
- checkWithBehavioralContext(behavioralCtx) {
44
- const diagnostics = [];
45
- if (behavioralCtx.timedOut) {
46
- const timeoutInfo = behavioralCtx.declaredTimeout
47
- ? ` (exceeded declared timeout: ${behavioralCtx.declaredTimeout})`
48
- : behavioralCtx.actualTimeoutMs
49
- ? ` (exceeded default timeout: ${formatTimeout(behavioralCtx.actualTimeoutMs)})`
50
- : '';
51
- const suggestion = behavioralCtx.declaredTimeout
52
- ? `Tool exceeded its declared max_execution_time (${behavioralCtx.declaredTimeout}). Either fix the tool to complete within this time, or update the contract if a longer timeout is legitimate.`
53
- : 'Add timeouts, fix infinite loops, or optimize slow operations. If tool legitimately takes longer, declare max_execution_time in contract (e.g., "5m", "2h").';
54
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" execution timed out${timeoutInfo}. Tool may hang indefinitely.`, behavioralCtx.toolName, undefined, suggestion));
55
- }
56
- if (behavioralCtx.errors.length > 0 && !behavioralCtx.timedOut) {
57
- const errorMessages = behavioralCtx.errors
58
- .map(e => ` - ${e.message}`)
59
- .join('\n');
60
- diagnostics.push(this.createDiagnostic(`Tool "${behavioralCtx.toolName}" execution failed:\n${errorMessages}`, behavioralCtx.toolName, undefined, 'Fix tool implementation errors. Ensure tool handles all input cases gracefully.'));
61
- }
62
- return diagnostics;
63
- }
64
- }
65
- export const E015UnboundedExecution = new E015UnboundedExecutionRule();
66
- //# sourceMappingURL=e015-unbounded-execution.js.map
@@ -1,43 +0,0 @@
1
- /**
2
- * E016: Output Structure Validation Failed
3
- *
4
- * Condition: Tool output doesn't match declared output schema
5
- *
6
- * Why this is fatal:
7
- * - Tool contract is inaccurate
8
- * - Breaks agent's ability to reason about tool outputs
9
- * - Can cause downstream errors in tool chains
10
- */
11
- import { BaseRule } from '../base.js';
12
- import type { AnalysisContext, Diagnostic } from '../../types.js';
13
- /**
14
- * Context for output validation failure detection.
15
- */
16
- export interface OutputValidationContext {
17
- /** Tool name */
18
- toolName: string;
19
- /** Test name (if applicable) */
20
- testName?: string;
21
- /** Test input that caused the failure */
22
- testInput?: Record<string, unknown>;
23
- /** Expected output schema name */
24
- expectedOutputSchema?: string;
25
- /** Validation error details */
26
- error?: string;
27
- /** Additional validation details */
28
- details?: Record<string, unknown>;
29
- }
30
- declare class E016OutputValidationFailedRule extends BaseRule {
31
- readonly id: "E016";
32
- readonly severity: "error";
33
- readonly ruleName = "Output Structure Validation Failed";
34
- readonly description = "Tool output doesn't match declared output schema. This breaks agent's ability to reason about tool outputs.";
35
- check(_ctx: AnalysisContext): Diagnostic[];
36
- /**
37
- * Check with behavioral context (called from test orchestrator).
38
- */
39
- checkWithBehavioralContext(behavioralCtx: OutputValidationContext): Diagnostic[];
40
- }
41
- export declare const E016OutputValidationFailed: E016OutputValidationFailedRule;
42
- export {};
43
- //# sourceMappingURL=e016-output-validation-failed.d.ts.map
@@ -1,42 +0,0 @@
1
- /**
2
- * E016: Output Structure Validation Failed
3
- *
4
- * Condition: Tool output doesn't match declared output schema
5
- *
6
- * Why this is fatal:
7
- * - Tool contract is inaccurate
8
- * - Breaks agent's ability to reason about tool outputs
9
- * - Can cause downstream errors in tool chains
10
- */
11
- import { BaseRule } from '../base.js';
12
- import { ERROR_CODES } from '../error-codes.js';
13
- class E016OutputValidationFailedRule extends BaseRule {
14
- id = ERROR_CODES.E016;
15
- severity = 'error';
16
- ruleName = 'Output Structure Validation Failed';
17
- description = "Tool output doesn't match declared output schema. This breaks agent's ability to reason about tool outputs.";
18
- check(_ctx) {
19
- // This rule requires behavioral context
20
- return [];
21
- }
22
- /**
23
- * Check with behavioral context (called from test orchestrator).
24
- */
25
- checkWithBehavioralContext(behavioralCtx) {
26
- const diagnostics = [];
27
- const errorMessage = behavioralCtx.error || 'Output structure does not match schema';
28
- let message = `Tool "${behavioralCtx.toolName}" output validation failed: ${errorMessage}`;
29
- if (behavioralCtx.testName) {
30
- message = `Test "${behavioralCtx.testName}" in tool "${behavioralCtx.toolName}" output validation failed: ${errorMessage}`;
31
- }
32
- diagnostics.push(this.createDiagnostic(message, behavioralCtx.toolName, undefined, 'Fix output structure to match declared schema or update schema to match actual output. Ensure output schema accurately reflects tool behavior.', {
33
- testName: behavioralCtx.testName,
34
- testInput: behavioralCtx.testInput,
35
- expectedOutputSchema: behavioralCtx.expectedOutputSchema,
36
- ...behavioralCtx.details,
37
- }));
38
- return diagnostics;
39
- }
40
- }
41
- export const E016OutputValidationFailed = new E016OutputValidationFailedRule();
42
- //# sourceMappingURL=e016-output-validation-failed.js.map