@syrin/cli 1.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/LICENSE +15 -0
- package/README.md +302 -0
- package/dist/cli/commands/analyse.d.ts +16 -0
- package/dist/cli/commands/analyse.js +61 -0
- package/dist/cli/commands/dev.d.ts +23 -0
- package/dist/cli/commands/dev.js +419 -0
- package/dist/cli/commands/doctor.d.ts +10 -0
- package/dist/cli/commands/doctor.js +195 -0
- package/dist/cli/commands/index.d.ts +12 -0
- package/dist/cli/commands/index.js +12 -0
- package/dist/cli/commands/init.d.ts +16 -0
- package/dist/cli/commands/init.js +90 -0
- package/dist/cli/commands/list.d.ts +15 -0
- package/dist/cli/commands/list.js +50 -0
- package/dist/cli/commands/rollback.d.ts +12 -0
- package/dist/cli/commands/rollback.js +101 -0
- package/dist/cli/commands/test.d.ts +31 -0
- package/dist/cli/commands/test.js +88 -0
- package/dist/cli/commands/update.d.ts +9 -0
- package/dist/cli/commands/update.js +76 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.js +342 -0
- package/dist/cli/prompts/index.d.ts +5 -0
- package/dist/cli/prompts/index.js +5 -0
- package/dist/cli/prompts/init-prompt.d.ts +17 -0
- package/dist/cli/prompts/init-prompt.js +263 -0
- package/dist/cli/utils/command-error-handler.d.ts +14 -0
- package/dist/cli/utils/command-error-handler.js +35 -0
- package/dist/cli/utils/common-types.d.ts +24 -0
- package/dist/cli/utils/common-types.js +6 -0
- package/dist/cli/utils/connection-handler.d.ts +37 -0
- package/dist/cli/utils/connection-handler.js +90 -0
- package/dist/cli/utils/index.d.ts +11 -0
- package/dist/cli/utils/index.js +11 -0
- package/dist/cli/utils/option-parsers.d.ts +41 -0
- package/dist/cli/utils/option-parsers.js +92 -0
- package/dist/cli/utils/output-utils.d.ts +12 -0
- package/dist/cli/utils/output-utils.js +21 -0
- package/dist/cli/utils/transport-resolver.d.ts +33 -0
- package/dist/cli/utils/transport-resolver.js +82 -0
- package/dist/cli/utils/version-banner.d.ts +10 -0
- package/dist/cli/utils/version-banner.js +26 -0
- package/dist/config/env-checker.d.ts +37 -0
- package/dist/config/env-checker.js +136 -0
- package/dist/config/generator.d.ts +19 -0
- package/dist/config/generator.js +196 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.js +9 -0
- package/dist/config/loader.d.ts +19 -0
- package/dist/config/loader.js +57 -0
- package/dist/config/schema.d.ts +42 -0
- package/dist/config/schema.js +181 -0
- package/dist/config/syrin.template.yaml +127 -0
- package/dist/config/types.d.ts +87 -0
- package/dist/config/types.js +6 -0
- package/dist/constants/app.d.ts +9 -0
- package/dist/constants/app.js +9 -0
- package/dist/constants/commands.d.ts +43 -0
- package/dist/constants/commands.js +43 -0
- package/dist/constants/defaults.d.ts +18 -0
- package/dist/constants/defaults.js +18 -0
- package/dist/constants/env-vars.d.ts +11 -0
- package/dist/constants/env-vars.js +11 -0
- package/dist/constants/icons.d.ts +23 -0
- package/dist/constants/icons.js +23 -0
- package/dist/constants/index.d.ts +17 -0
- package/dist/constants/index.js +17 -0
- package/dist/constants/labels.d.ts +38 -0
- package/dist/constants/labels.js +42 -0
- package/dist/constants/links.d.ts +10 -0
- package/dist/constants/links.js +11 -0
- package/dist/constants/list.d.ts +10 -0
- package/dist/constants/list.js +9 -0
- package/dist/constants/llm.d.ts +26 -0
- package/dist/constants/llm.js +25 -0
- package/dist/constants/messages.d.ts +107 -0
- package/dist/constants/messages.js +138 -0
- package/dist/constants/paths.d.ts +29 -0
- package/dist/constants/paths.js +29 -0
- package/dist/constants/transport.d.ts +9 -0
- package/dist/constants/transport.js +8 -0
- package/dist/events/emitter.d.ts +64 -0
- package/dist/events/emitter.js +142 -0
- package/dist/events/event-type.d.ts +66 -0
- package/dist/events/event-type.js +81 -0
- package/dist/events/payloads/diagnostics.d.ts +24 -0
- package/dist/events/payloads/diagnostics.js +5 -0
- package/dist/events/payloads/index.d.ts +15 -0
- package/dist/events/payloads/index.js +6 -0
- package/dist/events/payloads/llm.d.ts +58 -0
- package/dist/events/payloads/llm.js +6 -0
- package/dist/events/payloads/registry.d.ts +28 -0
- package/dist/events/payloads/registry.js +5 -0
- package/dist/events/payloads/session.d.ts +32 -0
- package/dist/events/payloads/session.js +5 -0
- package/dist/events/payloads/testing.d.ts +17 -0
- package/dist/events/payloads/testing.js +5 -0
- package/dist/events/payloads/tool.d.ts +29 -0
- package/dist/events/payloads/tool.js +5 -0
- package/dist/events/payloads/transport.d.ts +30 -0
- package/dist/events/payloads/transport.js +5 -0
- package/dist/events/payloads/validation.d.ts +37 -0
- package/dist/events/payloads/validation.js +5 -0
- package/dist/events/payloads/workflow.d.ts +45 -0
- package/dist/events/payloads/workflow.js +5 -0
- package/dist/events/store/file-store.d.ts +37 -0
- package/dist/events/store/file-store.js +113 -0
- package/dist/events/store/index.d.ts +7 -0
- package/dist/events/store/index.js +6 -0
- package/dist/events/store/memory-store.d.ts +26 -0
- package/dist/events/store/memory-store.js +39 -0
- package/dist/events/store.d.ts +11 -0
- package/dist/events/store.js +2 -0
- package/dist/events/types.d.ts +14 -0
- package/dist/events/types.js +2 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +30 -0
- package/dist/presentation/analysis-ui.d.ts +24 -0
- package/dist/presentation/analysis-ui.js +158 -0
- package/dist/presentation/dev/chat-ui-types.d.ts +68 -0
- package/dist/presentation/dev/chat-ui-types.js +5 -0
- package/dist/presentation/dev/chat-ui.d.ts +61 -0
- package/dist/presentation/dev/chat-ui.js +714 -0
- package/dist/presentation/dev/components/assistant-message.d.ts +19 -0
- package/dist/presentation/dev/components/assistant-message.js +36 -0
- package/dist/presentation/dev/components/header.d.ts +16 -0
- package/dist/presentation/dev/components/header.js +22 -0
- package/dist/presentation/dev/components/index.d.ts +13 -0
- package/dist/presentation/dev/components/index.js +13 -0
- package/dist/presentation/dev/components/input-panel.d.ts +22 -0
- package/dist/presentation/dev/components/input-panel.js +43 -0
- package/dist/presentation/dev/components/message-component.d.ts +16 -0
- package/dist/presentation/dev/components/message-component.js +51 -0
- package/dist/presentation/dev/components/messages-list.d.ts +24 -0
- package/dist/presentation/dev/components/messages-list.js +48 -0
- package/dist/presentation/dev/components/system-message.d.ts +16 -0
- package/dist/presentation/dev/components/system-message.js +26 -0
- package/dist/presentation/dev/components/user-message.d.ts +21 -0
- package/dist/presentation/dev/components/user-message.js +35 -0
- package/dist/presentation/dev/components/welcome-banner.d.ts +24 -0
- package/dist/presentation/dev/components/welcome-banner.js +146 -0
- package/dist/presentation/dev/goodbye-messages.d.ts +31 -0
- package/dist/presentation/dev/goodbye-messages.js +100 -0
- package/dist/presentation/dev/index.d.ts +5 -0
- package/dist/presentation/dev/index.js +5 -0
- package/dist/presentation/dev/text-wrapper.d.ts +30 -0
- package/dist/presentation/dev/text-wrapper.js +74 -0
- package/dist/presentation/dev-ui.d.ts +33 -0
- package/dist/presentation/dev-ui.js +246 -0
- package/dist/presentation/doctor-ui.d.ts +40 -0
- package/dist/presentation/doctor-ui.js +157 -0
- package/dist/presentation/init-ui.d.ts +14 -0
- package/dist/presentation/init-ui.js +41 -0
- package/dist/presentation/list-ui.d.ts +44 -0
- package/dist/presentation/list-ui.js +139 -0
- package/dist/presentation/test-ui.d.ts +49 -0
- package/dist/presentation/test-ui.js +358 -0
- package/dist/runtime/analysis/analyser.d.ts +14 -0
- package/dist/runtime/analysis/analyser.js +88 -0
- package/dist/runtime/analysis/dependencies.d.ts +10 -0
- package/dist/runtime/analysis/dependencies.js +140 -0
- package/dist/runtime/analysis/index.d.ts +10 -0
- package/dist/runtime/analysis/index.js +10 -0
- package/dist/runtime/analysis/indexer.d.ts +10 -0
- package/dist/runtime/analysis/indexer.js +62 -0
- package/dist/runtime/analysis/loader.d.ts +15 -0
- package/dist/runtime/analysis/loader.js +47 -0
- package/dist/runtime/analysis/normalizer.d.ts +14 -0
- package/dist/runtime/analysis/normalizer.js +184 -0
- package/dist/runtime/analysis/rules/__test-helpers__.d.ts +18 -0
- package/dist/runtime/analysis/rules/__test-helpers__.js +40 -0
- package/dist/runtime/analysis/rules/base.d.ts +38 -0
- package/dist/runtime/analysis/rules/base.js +23 -0
- package/dist/runtime/analysis/rules/error-codes.d.ts +64 -0
- package/dist/runtime/analysis/rules/error-codes.js +73 -0
- package/dist/runtime/analysis/rules/errors/e000-tool-not-found.d.ts +35 -0
- package/dist/runtime/analysis/rules/errors/e000-tool-not-found.js +32 -0
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e001-missing-output-schema.js +30 -0
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e002-underspecified-input.js +52 -0
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e003-type-mismatch.js +73 -0
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e004-free-text-propagation.js +47 -0
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e005-tool-ambiguity.js +73 -0
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e006-param-not-in-description.js +57 -0
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e007-output-not-guaranteed.js +56 -0
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e008-circular-dependency.js +84 -0
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e009-implicit-user-input.js +89 -0
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e010-non-serializable.js +46 -0
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e011-missing-tool-description.js +33 -0
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e012-side-effect-detected.js +40 -0
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.d.ts +37 -0
- package/dist/runtime/analysis/rules/errors/e013-non-deterministic-output.js +34 -0
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e013-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.d.ts +42 -0
- package/dist/runtime/analysis/rules/errors/e014-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e014-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.d.ts +42 -0
- package/dist/runtime/analysis/rules/errors/e015-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e015-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e016-output-validation-failed.js +42 -0
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e016-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e017-input-validation-failed.js +80 -0
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e017-output-validation-failed.js +42 -0
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e018-input-validation-failed.js +80 -0
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e018-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e019-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e019-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e020-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e100-missing-output-schema.js +30 -0
- package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e101-missing-tool-description.js +33 -0
- package/dist/runtime/analysis/rules/errors/e102-underspecified-input.d.ts +24 -0
- package/dist/runtime/analysis/rules/errors/e102-underspecified-input.js +52 -0
- package/dist/runtime/analysis/rules/errors/e103-type-mismatch.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e103-type-mismatch.js +72 -0
- package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e104-param-not-in-description.js +57 -0
- package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e105-free-text-propagation.js +47 -0
- package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e106-output-not-guaranteed.js +58 -0
- package/dist/runtime/analysis/rules/errors/e107-circular-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/errors/e107-circular-dependency.js +84 -0
- package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.d.ts +23 -0
- package/dist/runtime/analysis/rules/errors/e108-implicit-user-input.js +94 -0
- package/dist/runtime/analysis/rules/errors/e109-non-serializable.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e109-non-serializable.js +44 -0
- package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.d.ts +25 -0
- package/dist/runtime/analysis/rules/errors/e110-tool-ambiguity.js +73 -0
- package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.d.ts +57 -0
- package/dist/runtime/analysis/rules/errors/e200-input-validation-failed.js +71 -0
- package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.d.ts +43 -0
- package/dist/runtime/analysis/rules/errors/e300-output-validation-failed.js +44 -0
- package/dist/runtime/analysis/rules/errors/e301-output-explosion.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e301-output-explosion.js +36 -0
- package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.d.ts +38 -0
- package/dist/runtime/analysis/rules/errors/e400-tool-execution-failed.js +37 -0
- package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.d.ts +44 -0
- package/dist/runtime/analysis/rules/errors/e403-unbounded-execution.js +66 -0
- package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.d.ts +39 -0
- package/dist/runtime/analysis/rules/errors/e500-side-effect-detected.js +40 -0
- package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.d.ts +47 -0
- package/dist/runtime/analysis/rules/errors/e501-hidden-dependency.js +46 -0
- package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.d.ts +65 -0
- package/dist/runtime/analysis/rules/errors/e600-unexpected-test-result.js +109 -0
- package/dist/runtime/analysis/rules/index.d.ts +18 -0
- package/dist/runtime/analysis/rules/index.js +94 -0
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w001-implicit-dependency.js +39 -0
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.d.ts +24 -0
- package/dist/runtime/analysis/rules/warnings/w002-free-text-without-normalization.js +40 -0
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w003-missing-examples.js +84 -0
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w004-overloaded-responsibility.js +96 -0
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.d.ts +53 -0
- package/dist/runtime/analysis/rules/warnings/w005-generic-description.js +108 -0
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w006-optional-as-required.js +44 -0
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w007-broad-output-schema.js +37 -0
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w008-multiple-entry-points.js +97 -0
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w009-hidden-side-effects.js +88 -0
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w010-output-not-reusable.js +81 -0
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.d.ts +40 -0
- package/dist/runtime/analysis/rules/warnings/w021-weak-schema.js +32 -0
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.d.ts +39 -0
- package/dist/runtime/analysis/rules/warnings/w022-high-entropy-output.js +36 -0
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.d.ts +38 -0
- package/dist/runtime/analysis/rules/warnings/w023-unstable-defaults.js +36 -0
- package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w100-implicit-dependency.js +89 -0
- package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.d.ts +24 -0
- package/dist/runtime/analysis/rules/warnings/w101-free-text-without-normalization.js +40 -0
- package/dist/runtime/analysis/rules/warnings/w102-missing-examples.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w102-missing-examples.js +76 -0
- package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w103-overloaded-responsibility.js +91 -0
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.d.ts +53 -0
- package/dist/runtime/analysis/rules/warnings/w104-generic-description.js +108 -0
- package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w105-optional-as-required.js +45 -0
- package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w106-broad-output-schema.js +37 -0
- package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w107-multiple-entry-points.js +97 -0
- package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.d.ts +23 -0
- package/dist/runtime/analysis/rules/warnings/w108-hidden-side-effects.js +94 -0
- package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.d.ts +22 -0
- package/dist/runtime/analysis/rules/warnings/w109-output-not-reusable.js +63 -0
- package/dist/runtime/analysis/rules/warnings/w110-weak-schema.d.ts +40 -0
- package/dist/runtime/analysis/rules/warnings/w110-weak-schema.js +32 -0
- package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.d.ts +39 -0
- package/dist/runtime/analysis/rules/warnings/w300-high-entropy-output.js +47 -0
- package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.d.ts +38 -0
- package/dist/runtime/analysis/rules/warnings/w301-unstable-defaults.js +36 -0
- package/dist/runtime/analysis/strict-mode.d.ts +21 -0
- package/dist/runtime/analysis/strict-mode.js +44 -0
- package/dist/runtime/analysis/types.d.ts +133 -0
- package/dist/runtime/analysis/types.js +6 -0
- package/dist/runtime/analysis/utils.d.ts +19 -0
- package/dist/runtime/analysis/utils.js +21 -0
- package/dist/runtime/dev/data-manager.d.ts +55 -0
- package/dist/runtime/dev/data-manager.js +87 -0
- package/dist/runtime/dev/event-mapper.d.ts +100 -0
- package/dist/runtime/dev/event-mapper.js +400 -0
- package/dist/runtime/dev/formatter.d.ts +94 -0
- package/dist/runtime/dev/formatter.js +236 -0
- package/dist/runtime/dev/index.d.ts +9 -0
- package/dist/runtime/dev/index.js +9 -0
- package/dist/runtime/dev/repl.d.ts +114 -0
- package/dist/runtime/dev/repl.js +310 -0
- package/dist/runtime/dev/session.d.ts +86 -0
- package/dist/runtime/dev/session.js +447 -0
- package/dist/runtime/dev/stack-trace.d.ts +77 -0
- package/dist/runtime/dev/stack-trace.js +286 -0
- package/dist/runtime/dev/types.d.ts +54 -0
- package/dist/runtime/dev/types.js +5 -0
- package/dist/runtime/llm/claude.d.ts +27 -0
- package/dist/runtime/llm/claude.js +150 -0
- package/dist/runtime/llm/factory.d.ts +30 -0
- package/dist/runtime/llm/factory.js +78 -0
- package/dist/runtime/llm/index.d.ts +10 -0
- package/dist/runtime/llm/index.js +10 -0
- package/dist/runtime/llm/ollama.d.ts +45 -0
- package/dist/runtime/llm/ollama.js +449 -0
- package/dist/runtime/llm/openai.d.ts +27 -0
- package/dist/runtime/llm/openai.js +170 -0
- package/dist/runtime/llm/provider.d.ts +32 -0
- package/dist/runtime/llm/provider.js +6 -0
- package/dist/runtime/llm/types.d.ts +55 -0
- package/dist/runtime/llm/types.js +6 -0
- package/dist/runtime/mcp/client/base.d.ts +40 -0
- package/dist/runtime/mcp/client/base.js +157 -0
- package/dist/runtime/mcp/client/manager.d.ts +91 -0
- package/dist/runtime/mcp/client/manager.js +248 -0
- package/dist/runtime/mcp/client/process.d.ts +31 -0
- package/dist/runtime/mcp/client/process.js +82 -0
- package/dist/runtime/mcp/connection.d.ts +63 -0
- package/dist/runtime/mcp/connection.js +449 -0
- package/dist/runtime/mcp/index.d.ts +9 -0
- package/dist/runtime/mcp/index.js +9 -0
- package/dist/runtime/mcp/list.d.ts +50 -0
- package/dist/runtime/mcp/list.js +65 -0
- package/dist/runtime/mcp/stdio-transport.d.ts +23 -0
- package/dist/runtime/mcp/stdio-transport.js +71 -0
- package/dist/runtime/mcp/types.d.ts +85 -0
- package/dist/runtime/mcp/types.js +6 -0
- package/dist/runtime/sandbox/executor.d.ts +102 -0
- package/dist/runtime/sandbox/executor.js +537 -0
- package/dist/runtime/sandbox/index.d.ts +9 -0
- package/dist/runtime/sandbox/index.js +9 -0
- package/dist/runtime/sandbox/io-monitor.d.ts +78 -0
- package/dist/runtime/sandbox/io-monitor.js +98 -0
- package/dist/runtime/sandbox/time-parser.d.ts +19 -0
- package/dist/runtime/sandbox/time-parser.js +67 -0
- package/dist/runtime/sandbox/types.d.ts +58 -0
- package/dist/runtime/sandbox/types.js +23 -0
- package/dist/runtime/test/behavior-observer.d.ts +61 -0
- package/dist/runtime/test/behavior-observer.js +140 -0
- package/dist/runtime/test/contract-loader.d.ts +41 -0
- package/dist/runtime/test/contract-loader.js +158 -0
- package/dist/runtime/test/contract-schema.d.ts +46 -0
- package/dist/runtime/test/contract-schema.js +107 -0
- package/dist/runtime/test/contract-types.d.ts +106 -0
- package/dist/runtime/test/contract-types.js +6 -0
- package/dist/runtime/test/dependency-tracker.d.ts +66 -0
- package/dist/runtime/test/dependency-tracker.js +80 -0
- package/dist/runtime/test/formatters.d.ts +18 -0
- package/dist/runtime/test/formatters.js +172 -0
- package/dist/runtime/test/index.d.ts +12 -0
- package/dist/runtime/test/index.js +13 -0
- package/dist/runtime/test/input-generator.d.ts +33 -0
- package/dist/runtime/test/input-generator.js +498 -0
- package/dist/runtime/test/mcp-root-detector.d.ts +31 -0
- package/dist/runtime/test/mcp-root-detector.js +105 -0
- package/dist/runtime/test/orchestrator.d.ts +131 -0
- package/dist/runtime/test/orchestrator.js +738 -0
- package/dist/runtime/test/output-validator.d.ts +44 -0
- package/dist/runtime/test/output-validator.js +262 -0
- package/dist/runtime/test/retry-tester.d.ts +44 -0
- package/dist/runtime/test/retry-tester.js +103 -0
- package/dist/runtime/test/runner.d.ts +28 -0
- package/dist/runtime/test/runner.js +55 -0
- package/dist/runtime/test/synthetic-input-generator.d.ts +11 -0
- package/dist/runtime/test/synthetic-input-generator.js +154 -0
- package/dist/runtime/test/test-runner.d.ts +28 -0
- package/dist/runtime/test/test-runner.js +55 -0
- package/dist/types/factories.d.ts +16 -0
- package/dist/types/factories.js +43 -0
- package/dist/types/ids.d.ts +16 -0
- package/dist/types/ids.js +2 -0
- package/dist/types/opaque.d.ts +4 -0
- package/dist/types/opaque.js +2 -0
- package/dist/utils/errors.d.ts +92 -0
- package/dist/utils/errors.js +97 -0
- package/dist/utils/gitignore.d.ts +11 -0
- package/dist/utils/gitignore.js +59 -0
- package/dist/utils/json-file-saver.d.ts +17 -0
- package/dist/utils/json-file-saver.js +81 -0
- package/dist/utils/json-formatter.d.ts +63 -0
- package/dist/utils/json-formatter.js +344 -0
- package/dist/utils/logger.d.ts +184 -0
- package/dist/utils/logger.js +330 -0
- package/dist/utils/package-manager.d.ts +30 -0
- package/dist/utils/package-manager.js +157 -0
- package/dist/utils/version-checker.d.ts +47 -0
- package/dist/utils/version-checker.js +167 -0
- package/dist/utils/version-display.d.ts +10 -0
- package/dist/utils/version-display.js +20 -0
- package/package.json +106 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W102: Missing Examples for User-Facing Inputs
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Tool takes user-provided input
|
|
6
|
+
* - No examples provided
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - LLM guessing increases error rate
|
|
10
|
+
*/
|
|
11
|
+
import { BaseRule } from '../base.js';
|
|
12
|
+
/**
|
|
13
|
+
* Check if an input field appears to be user-provided.
|
|
14
|
+
* Indicators are treated as plain text (not regex patterns).
|
|
15
|
+
*/
|
|
16
|
+
function isUserFacingInput(inputName, description) {
|
|
17
|
+
const name = inputName.toLowerCase();
|
|
18
|
+
const desc = (description || '').toLowerCase();
|
|
19
|
+
// Keywords that suggest user input (treated as plain text, not regex)
|
|
20
|
+
const userInputIndicators = [
|
|
21
|
+
'user',
|
|
22
|
+
'person',
|
|
23
|
+
'name',
|
|
24
|
+
'email',
|
|
25
|
+
'location',
|
|
26
|
+
'address',
|
|
27
|
+
'preference',
|
|
28
|
+
'query',
|
|
29
|
+
'question',
|
|
30
|
+
'input',
|
|
31
|
+
'text',
|
|
32
|
+
'message',
|
|
33
|
+
];
|
|
34
|
+
// Split into tokens for whole-word matching
|
|
35
|
+
const nameTokens = name
|
|
36
|
+
.split(/[^\w]+|(?<=[a-z])(?=[A-Z])/)
|
|
37
|
+
.filter(t => t.length > 0);
|
|
38
|
+
const descTokens = desc
|
|
39
|
+
.split(/[^\w]+|(?<=[a-z])(?=[A-Z])/)
|
|
40
|
+
.filter(t => t.length > 0);
|
|
41
|
+
const allTokens = new Set([...nameTokens, ...descTokens]);
|
|
42
|
+
// Check for whole-word matches using set membership
|
|
43
|
+
// Tokenization already enforces word boundaries, so regex is redundant
|
|
44
|
+
return userInputIndicators.some(indicator => allTokens.has(indicator));
|
|
45
|
+
}
|
|
46
|
+
class W102MissingExamplesRule extends BaseRule {
|
|
47
|
+
id = 'W102';
|
|
48
|
+
severity = 'warning';
|
|
49
|
+
ruleName = 'Missing Examples for User-Facing Inputs';
|
|
50
|
+
description = 'Tool accepts user-provided input but has no examples. LLM accuracy may be reduced.';
|
|
51
|
+
check(ctx) {
|
|
52
|
+
const diagnostics = [];
|
|
53
|
+
for (const tool of ctx.tools) {
|
|
54
|
+
for (const input of tool.inputs) {
|
|
55
|
+
// Only check user-facing inputs
|
|
56
|
+
if (!isUserFacingInput(input.name, input.description)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Check if it has an example (treat undefined, empty strings, whitespace-only, and empty arrays/objects as missing)
|
|
60
|
+
const example = input.example;
|
|
61
|
+
const isMissing = example === undefined ||
|
|
62
|
+
(typeof example === 'string' && example.trim().length === 0) ||
|
|
63
|
+
(Array.isArray(example) && example.length === 0) ||
|
|
64
|
+
(typeof example === 'object' &&
|
|
65
|
+
example !== null &&
|
|
66
|
+
Object.keys(example).length === 0);
|
|
67
|
+
if (isMissing) {
|
|
68
|
+
diagnostics.push(this.createDiagnostic(`Tool "${tool.name}" parameter "${input.name}" has no examples. LLM accuracy may be reduced.`, tool.name, input.name, `Add example values to "${input.name}" to help the LLM understand the expected format.`));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return diagnostics;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export const W102MissingExamples = new W102MissingExamplesRule();
|
|
76
|
+
//# sourceMappingURL=w102-missing-examples.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W103: Overloaded Tool Responsibility
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Tool does multiple conceptual things
|
|
6
|
+
* - Description contains multiple verbs or intents
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Tool selection becomes unstable
|
|
10
|
+
* - Hard to compose
|
|
11
|
+
*/
|
|
12
|
+
import { BaseRule } from '../base.js';
|
|
13
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
14
|
+
declare class W103OverloadedResponsibilityRule extends BaseRule {
|
|
15
|
+
readonly id = "W103";
|
|
16
|
+
readonly severity: "warning";
|
|
17
|
+
readonly ruleName = "Overloaded Tool Responsibility";
|
|
18
|
+
readonly description = "Tool appears to handle multiple responsibilities. Tool selection becomes unstable.";
|
|
19
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
20
|
+
}
|
|
21
|
+
export declare const W103OverloadedResponsibility: W103OverloadedResponsibilityRule;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=w103-overloaded-responsibility.d.ts.map
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W103: Overloaded Tool Responsibility
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Tool does multiple conceptual things
|
|
6
|
+
* - Description contains multiple verbs or intents
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Tool selection becomes unstable
|
|
10
|
+
* - Hard to compose
|
|
11
|
+
*/
|
|
12
|
+
import { BaseRule } from '../base.js';
|
|
13
|
+
/**
|
|
14
|
+
* Count verbs in a description.
|
|
15
|
+
*/
|
|
16
|
+
function countVerbs(description) {
|
|
17
|
+
const commonVerbs = [
|
|
18
|
+
'get',
|
|
19
|
+
'set',
|
|
20
|
+
'create',
|
|
21
|
+
'delete',
|
|
22
|
+
'update',
|
|
23
|
+
'find',
|
|
24
|
+
'search',
|
|
25
|
+
'fetch',
|
|
26
|
+
'send',
|
|
27
|
+
'receive',
|
|
28
|
+
'process',
|
|
29
|
+
'handle',
|
|
30
|
+
'execute',
|
|
31
|
+
'run',
|
|
32
|
+
'call',
|
|
33
|
+
'invoke',
|
|
34
|
+
'parse',
|
|
35
|
+
'format',
|
|
36
|
+
'validate',
|
|
37
|
+
'transform',
|
|
38
|
+
'convert',
|
|
39
|
+
'merge',
|
|
40
|
+
'split',
|
|
41
|
+
'filter',
|
|
42
|
+
'sort',
|
|
43
|
+
'save',
|
|
44
|
+
'load',
|
|
45
|
+
'read',
|
|
46
|
+
'write',
|
|
47
|
+
];
|
|
48
|
+
const descLower = description.toLowerCase();
|
|
49
|
+
let verbCount = 0;
|
|
50
|
+
for (const verb of commonVerbs) {
|
|
51
|
+
// Check if verb appears as a word (not just as part of another word)
|
|
52
|
+
const regex = new RegExp(`\\b${verb}\\b`, 'i');
|
|
53
|
+
if (regex.test(descLower)) {
|
|
54
|
+
verbCount++;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return verbCount;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Count distinct intents (action + object pairs).
|
|
61
|
+
*/
|
|
62
|
+
function countIntents(description) {
|
|
63
|
+
// Simple heuristic: split on connectors ("and", "or", commas) to count intents
|
|
64
|
+
// Use combined regex to handle multiple different connectors in one pass
|
|
65
|
+
const descLower = description.toLowerCase();
|
|
66
|
+
const combinedRegex = /(?:\s+and\s+|\s+or\s+|,\s*)/i;
|
|
67
|
+
const parts = descLower.split(combinedRegex).filter(Boolean);
|
|
68
|
+
return parts.length;
|
|
69
|
+
}
|
|
70
|
+
class W103OverloadedResponsibilityRule extends BaseRule {
|
|
71
|
+
id = 'W103';
|
|
72
|
+
severity = 'warning';
|
|
73
|
+
ruleName = 'Overloaded Tool Responsibility';
|
|
74
|
+
description = 'Tool appears to handle multiple responsibilities. Tool selection becomes unstable.';
|
|
75
|
+
check(ctx) {
|
|
76
|
+
const diagnostics = [];
|
|
77
|
+
for (const tool of ctx.tools) {
|
|
78
|
+
const description = tool.description || '';
|
|
79
|
+
// Count verbs and intents
|
|
80
|
+
const verbCount = countVerbs(description);
|
|
81
|
+
const intentCount = countIntents(description);
|
|
82
|
+
// If too many verbs (>3) or multiple intents (>2), it's overloaded
|
|
83
|
+
if (verbCount > 3 || intentCount > 2) {
|
|
84
|
+
diagnostics.push(this.createDiagnostic(`Tool "${tool.name}" appears to handle multiple responsibilities.`, tool.name, undefined, `Split "${tool.name}" into multiple focused tools, each handling a single responsibility.`));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return diagnostics;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export const W103OverloadedResponsibility = new W103OverloadedResponsibilityRule();
|
|
91
|
+
//# sourceMappingURL=w103-overloaded-responsibility.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W104: Tool Description Too Generic
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Description uses vague verbs:
|
|
6
|
+
* - "get"
|
|
7
|
+
* - "handle"
|
|
8
|
+
* - "process"
|
|
9
|
+
* - No concrete nouns
|
|
10
|
+
*
|
|
11
|
+
* Why:
|
|
12
|
+
* - LLM cannot discriminate tools
|
|
13
|
+
*/
|
|
14
|
+
import { BaseRule } from '../base.js';
|
|
15
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Default list of concrete nouns that make a description specific.
|
|
18
|
+
* This list can be extended or overridden when creating a custom rule instance.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { createW104Rule, DEFAULT_CONCRETE_NOUNS } from './w104-generic-description.js';
|
|
23
|
+
* const customNouns = [...DEFAULT_CONCRETE_NOUNS, 'invoice', 'report'];
|
|
24
|
+
* const customRule = createW104Rule(customNouns);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_CONCRETE_NOUNS: readonly ["weather", "location", "user", "file", "data", "email", "message", "order", "payment", "product", "customer", "account", "transaction", "request", "response"];
|
|
28
|
+
declare class W104GenericDescriptionRule extends BaseRule {
|
|
29
|
+
private readonly concreteNouns;
|
|
30
|
+
readonly id = "W104";
|
|
31
|
+
readonly severity: "warning";
|
|
32
|
+
readonly ruleName = "Tool Description Too Generic";
|
|
33
|
+
readonly description = "Description of tool is too generic. LLM cannot discriminate tools.";
|
|
34
|
+
constructor(concreteNouns?: readonly string[]);
|
|
35
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a W104 rule instance with custom concrete nouns.
|
|
39
|
+
*
|
|
40
|
+
* @param concreteNouns - Optional list of concrete nouns (defaults to DEFAULT_CONCRETE_NOUNS)
|
|
41
|
+
* @returns A new W104GenericDescriptionRule instance
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* import { createW104Rule, DEFAULT_CONCRETE_NOUNS } from './w005-generic-description.js';
|
|
46
|
+
* const customNouns = [...DEFAULT_CONCRETE_NOUNS, 'invoice', 'report'];
|
|
47
|
+
* const customRule = createW104Rule(customNouns);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function createW104Rule(concreteNouns?: readonly string[]): W104GenericDescriptionRule;
|
|
51
|
+
export declare const W104GenericDescription: W104GenericDescriptionRule;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=w104-generic-description.d.ts.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W104: Tool Description Too Generic
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Description uses vague verbs:
|
|
6
|
+
* - "get"
|
|
7
|
+
* - "handle"
|
|
8
|
+
* - "process"
|
|
9
|
+
* - No concrete nouns
|
|
10
|
+
*
|
|
11
|
+
* Why:
|
|
12
|
+
* - LLM cannot discriminate tools
|
|
13
|
+
*/
|
|
14
|
+
import { BaseRule } from '../base.js';
|
|
15
|
+
/**
|
|
16
|
+
* Default list of concrete nouns that make a description specific.
|
|
17
|
+
* This list can be extended or overridden when creating a custom rule instance.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { createW104Rule, DEFAULT_CONCRETE_NOUNS } from './w104-generic-description.js';
|
|
22
|
+
* const customNouns = [...DEFAULT_CONCRETE_NOUNS, 'invoice', 'report'];
|
|
23
|
+
* const customRule = createW104Rule(customNouns);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const DEFAULT_CONCRETE_NOUNS = [
|
|
27
|
+
'weather',
|
|
28
|
+
'location',
|
|
29
|
+
'user',
|
|
30
|
+
'file',
|
|
31
|
+
'data',
|
|
32
|
+
'email',
|
|
33
|
+
'message',
|
|
34
|
+
'order',
|
|
35
|
+
'payment',
|
|
36
|
+
'product',
|
|
37
|
+
'customer',
|
|
38
|
+
'account',
|
|
39
|
+
'transaction',
|
|
40
|
+
'request',
|
|
41
|
+
'response',
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Check if description is too generic.
|
|
45
|
+
*
|
|
46
|
+
* @param description - Tool description to check
|
|
47
|
+
* @param concreteNouns - Optional list of concrete nouns (defaults to DEFAULT_CONCRETE_NOUNS)
|
|
48
|
+
*/
|
|
49
|
+
function isGenericDescription(description, concreteNouns = DEFAULT_CONCRETE_NOUNS) {
|
|
50
|
+
const descLower = description.toLowerCase();
|
|
51
|
+
// Vague verbs
|
|
52
|
+
const vagueVerbs = ['get', 'handle', 'process', 'do', 'make', 'use', 'call'];
|
|
53
|
+
// Check for vague verbs without concrete nouns
|
|
54
|
+
let hasVagueVerb = false;
|
|
55
|
+
for (const verb of vagueVerbs) {
|
|
56
|
+
const regex = new RegExp(`\\b${verb}\\b`, 'i');
|
|
57
|
+
if (regex.test(descLower)) {
|
|
58
|
+
hasVagueVerb = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!hasVagueVerb) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
// Check if description has concrete nouns (case-insensitive)
|
|
66
|
+
const hasConcreteNoun = concreteNouns.some(noun => descLower.includes(noun.toLowerCase()));
|
|
67
|
+
// If has vague verb but no concrete noun, it's generic
|
|
68
|
+
return !hasConcreteNoun;
|
|
69
|
+
}
|
|
70
|
+
class W104GenericDescriptionRule extends BaseRule {
|
|
71
|
+
concreteNouns;
|
|
72
|
+
id = 'W104';
|
|
73
|
+
severity = 'warning';
|
|
74
|
+
ruleName = 'Tool Description Too Generic';
|
|
75
|
+
description = 'Description of tool is too generic. LLM cannot discriminate tools.';
|
|
76
|
+
constructor(concreteNouns = DEFAULT_CONCRETE_NOUNS) {
|
|
77
|
+
super();
|
|
78
|
+
this.concreteNouns = concreteNouns;
|
|
79
|
+
}
|
|
80
|
+
check(ctx) {
|
|
81
|
+
const diagnostics = [];
|
|
82
|
+
for (const tool of ctx.tools) {
|
|
83
|
+
const description = tool.description || '';
|
|
84
|
+
if (isGenericDescription(description, this.concreteNouns)) {
|
|
85
|
+
diagnostics.push(this.createDiagnostic(`Description of "${tool.name}" is too generic.`, tool.name, undefined, `Make the description more specific by including concrete nouns and specific actions (e.g., "Get weather data for a location" instead of "Get data").`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return diagnostics;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a W104 rule instance with custom concrete nouns.
|
|
93
|
+
*
|
|
94
|
+
* @param concreteNouns - Optional list of concrete nouns (defaults to DEFAULT_CONCRETE_NOUNS)
|
|
95
|
+
* @returns A new W104GenericDescriptionRule instance
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* import { createW104Rule, DEFAULT_CONCRETE_NOUNS } from './w005-generic-description.js';
|
|
100
|
+
* const customNouns = [...DEFAULT_CONCRETE_NOUNS, 'invoice', 'report'];
|
|
101
|
+
* const customRule = createW104Rule(customNouns);
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export function createW104Rule(concreteNouns) {
|
|
105
|
+
return new W104GenericDescriptionRule(concreteNouns);
|
|
106
|
+
}
|
|
107
|
+
export const W104GenericDescription = new W104GenericDescriptionRule();
|
|
108
|
+
//# sourceMappingURL=w104-generic-description.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W105: Optional Input Used as Required Downstream
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Input marked optional
|
|
6
|
+
* - Treated as required in chaining
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Hidden contract violation
|
|
10
|
+
*/
|
|
11
|
+
import { BaseRule } from '../base.js';
|
|
12
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
13
|
+
declare class W105OptionalAsRequiredRule extends BaseRule {
|
|
14
|
+
readonly id = "W105";
|
|
15
|
+
readonly severity: "warning";
|
|
16
|
+
readonly ruleName = "Optional Input Used as Required Downstream";
|
|
17
|
+
readonly description = "Optional input is treated as required downstream. Hidden contract violation.";
|
|
18
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
19
|
+
}
|
|
20
|
+
export declare const W105OptionalAsRequired: W105OptionalAsRequiredRule;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=w105-optional-as-required.d.ts.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W105: Optional Input Used as Required Downstream
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Input marked optional
|
|
6
|
+
* - Treated as required in chaining
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Hidden contract violation
|
|
10
|
+
*/
|
|
11
|
+
import { BaseRule } from '../base.js';
|
|
12
|
+
class W105OptionalAsRequiredRule extends BaseRule {
|
|
13
|
+
id = 'W105';
|
|
14
|
+
severity = 'warning';
|
|
15
|
+
ruleName = 'Optional Input Used as Required Downstream';
|
|
16
|
+
description = 'Optional input is treated as required downstream. Hidden contract violation.';
|
|
17
|
+
check(ctx) {
|
|
18
|
+
const diagnostics = [];
|
|
19
|
+
// Check high-confidence dependencies (>= 0.8)
|
|
20
|
+
const highConfidenceDeps = ctx.dependencies.filter(d => d.confidence >= 0.8);
|
|
21
|
+
for (const dep of highConfidenceDeps) {
|
|
22
|
+
// Find the source output
|
|
23
|
+
const fromTool = ctx.indexes.toolIndex.get(dep.fromTool.toLowerCase());
|
|
24
|
+
const toTool = ctx.indexes.toolIndex.get(dep.toTool.toLowerCase());
|
|
25
|
+
if (!fromTool || !toTool) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const fromField = fromTool.outputs.find(f => f.name === dep.fromField);
|
|
29
|
+
const toField = toTool.inputs.find(f => f.name === dep.toField);
|
|
30
|
+
if (!fromField || !toField) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Check if source is optional/nullable but target is required
|
|
34
|
+
// Source is optional if: nullable === true OR required === false
|
|
35
|
+
const isSourceOptional = fromField.nullable === true || fromField.required === false;
|
|
36
|
+
const isTargetRequired = toField.required === true;
|
|
37
|
+
if (isSourceOptional && isTargetRequired) {
|
|
38
|
+
diagnostics.push(this.createDiagnostic(`Source field "${dep.fromTool}.${dep.fromField}" is nullable/optional but is being wired into required input "${dep.toTool}.${dep.toField}".`, dep.toTool, dep.toField, `Make "${dep.fromTool}.${dep.fromField}" non-nullable, or make "${dep.toTool}.${dep.toField}" optional.`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return diagnostics;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export const W105OptionalAsRequired = new W105OptionalAsRequiredRule();
|
|
45
|
+
//# sourceMappingURL=w105-optional-as-required.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W106: Output Schema Too Broad
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Output type is object with no properties
|
|
6
|
+
* - Or any
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - No contract enforcement
|
|
10
|
+
* - Breaks evolution
|
|
11
|
+
*/
|
|
12
|
+
import { BaseRule } from '../base.js';
|
|
13
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
14
|
+
declare class W106BroadOutputSchemaRule extends BaseRule {
|
|
15
|
+
readonly id = "W106";
|
|
16
|
+
readonly severity: "warning";
|
|
17
|
+
readonly ruleName = "Output Schema Too Broad";
|
|
18
|
+
readonly description = "Output schema of tool is too broad. No contract enforcement.";
|
|
19
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
20
|
+
}
|
|
21
|
+
export declare const W106BroadOutputSchema: W106BroadOutputSchemaRule;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=w106-broad-output-schema.d.ts.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W106: Output Schema Too Broad
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Output type is object with no properties
|
|
6
|
+
* - Or any
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - No contract enforcement
|
|
10
|
+
* - Breaks evolution
|
|
11
|
+
*/
|
|
12
|
+
import { BaseRule } from '../base.js';
|
|
13
|
+
class W106BroadOutputSchemaRule extends BaseRule {
|
|
14
|
+
id = 'W106';
|
|
15
|
+
severity = 'warning';
|
|
16
|
+
ruleName = 'Output Schema Too Broad';
|
|
17
|
+
description = 'Output schema of tool is too broad. No contract enforcement.';
|
|
18
|
+
check(ctx) {
|
|
19
|
+
const diagnostics = [];
|
|
20
|
+
for (const tool of ctx.tools) {
|
|
21
|
+
for (const output of tool.outputs) {
|
|
22
|
+
// Check if output is "any" type
|
|
23
|
+
if (output.type === 'any') {
|
|
24
|
+
diagnostics.push(this.createDiagnostic(`Output schema of "${tool.name}" (field: "${output.name}") is too broad (type: "any").`, tool.name, output.name, `Specify a concrete type for "${output.name}" instead of "any".`));
|
|
25
|
+
}
|
|
26
|
+
// Check if output is object with no properties
|
|
27
|
+
if (output.type === 'object' &&
|
|
28
|
+
(!output.properties || output.properties.length === 0)) {
|
|
29
|
+
diagnostics.push(this.createDiagnostic(`Output schema of "${tool.name}" (field: "${output.name}") is an object with no properties defined.`, tool.name, output.name, `Define the properties of the object schema for "${output.name}".`));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return diagnostics;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export const W106BroadOutputSchema = new W106BroadOutputSchemaRule();
|
|
37
|
+
//# sourceMappingURL=w106-broad-output-schema.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W107: Multiple Entry Points for Same Concept
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Multiple tools ask user for same conceptual data
|
|
6
|
+
* (e.g. location, user_id)
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Conflicting sources of truth
|
|
10
|
+
*/
|
|
11
|
+
import { BaseRule } from '../base.js';
|
|
12
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
13
|
+
declare class W107MultipleEntryPointsRule extends BaseRule {
|
|
14
|
+
readonly id = "W107";
|
|
15
|
+
readonly severity: "warning";
|
|
16
|
+
readonly ruleName = "Multiple Entry Points for Same Concept";
|
|
17
|
+
readonly description = "Multiple tools capture the same concept. Conflicting sources of truth.";
|
|
18
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
19
|
+
}
|
|
20
|
+
export declare const W107MultipleEntryPoints: W107MultipleEntryPointsRule;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=w107-multiple-entry-points.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W107: Multiple Entry Points for Same Concept
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Multiple tools ask user for same conceptual data
|
|
6
|
+
* (e.g. location, user_id)
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Conflicting sources of truth
|
|
10
|
+
*/
|
|
11
|
+
import { BaseRule } from '../base.js';
|
|
12
|
+
import { escapeRegex } from '../../utils.js';
|
|
13
|
+
/**
|
|
14
|
+
* Extract the concept from an input field name.
|
|
15
|
+
*/
|
|
16
|
+
function extractConcept(fieldName) {
|
|
17
|
+
// Split field name into tokens (on non-word characters and camelCase boundaries)
|
|
18
|
+
// Preserve case for camelCase detection, then lowercase tokens individually
|
|
19
|
+
const tokens = fieldName
|
|
20
|
+
.split(/[^\w]+|(?<=[a-z])(?=[A-Z])/)
|
|
21
|
+
.filter(t => t.length > 0)
|
|
22
|
+
.map(t => t.toLowerCase());
|
|
23
|
+
const name = fieldName.toLowerCase();
|
|
24
|
+
// Common concepts
|
|
25
|
+
const concepts = [
|
|
26
|
+
[['location', 'loc', 'place', 'address', 'city', 'country'], 'location'],
|
|
27
|
+
[['user', 'user_id', 'userid', 'username', 'person'], 'user'],
|
|
28
|
+
[['email', 'e-mail', 'mail'], 'email'],
|
|
29
|
+
[['phone', 'telephone', 'mobile'], 'phone'],
|
|
30
|
+
[['name', 'fullname', 'full_name'], 'name'],
|
|
31
|
+
[['id', 'identifier'], 'id'],
|
|
32
|
+
];
|
|
33
|
+
for (const [keywords, concept] of concepts) {
|
|
34
|
+
for (const keyword of keywords) {
|
|
35
|
+
// Check for exact token match or word-boundary match
|
|
36
|
+
// Escape keyword to prevent regex injection
|
|
37
|
+
const escapedKeyword = escapeRegex(keyword);
|
|
38
|
+
const keywordRegex = new RegExp(`\\b${escapedKeyword}\\b`, 'i');
|
|
39
|
+
if (tokens.includes(keyword) || keywordRegex.test(name)) {
|
|
40
|
+
return concept;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
class W107MultipleEntryPointsRule extends BaseRule {
|
|
47
|
+
id = 'W107';
|
|
48
|
+
severity = 'warning';
|
|
49
|
+
ruleName = 'Multiple Entry Points for Same Concept';
|
|
50
|
+
description = 'Multiple tools capture the same concept. Conflicting sources of truth.';
|
|
51
|
+
check(ctx) {
|
|
52
|
+
const diagnostics = [];
|
|
53
|
+
// Map concept to tools that have it
|
|
54
|
+
const conceptToTools = new Map();
|
|
55
|
+
for (const tool of ctx.tools) {
|
|
56
|
+
for (const input of tool.inputs) {
|
|
57
|
+
// Only check user-facing inputs
|
|
58
|
+
if (!input.required) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const concept = extractConcept(input.name);
|
|
62
|
+
if (!concept) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (!conceptToTools.has(concept)) {
|
|
66
|
+
conceptToTools.set(concept, []);
|
|
67
|
+
}
|
|
68
|
+
conceptToTools.get(concept).push({
|
|
69
|
+
tool: tool.name,
|
|
70
|
+
field: input.name,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check for concepts that appear in multiple tools
|
|
75
|
+
for (const [concept, tools] of conceptToTools.entries()) {
|
|
76
|
+
if (tools.length > 1) {
|
|
77
|
+
const toolNames = tools.map(t => `"${t.tool}"`).join(', ');
|
|
78
|
+
// Group by tool name in case same tool appears multiple times
|
|
79
|
+
const toolFieldsMap = new Map();
|
|
80
|
+
for (const toolEntry of tools) {
|
|
81
|
+
if (!toolFieldsMap.has(toolEntry.tool)) {
|
|
82
|
+
toolFieldsMap.set(toolEntry.tool, []);
|
|
83
|
+
}
|
|
84
|
+
toolFieldsMap.get(toolEntry.tool).push(toolEntry.field);
|
|
85
|
+
}
|
|
86
|
+
const context = {};
|
|
87
|
+
for (const [tool, fields] of toolFieldsMap.entries()) {
|
|
88
|
+
context[tool] = fields.join(', ');
|
|
89
|
+
}
|
|
90
|
+
diagnostics.push(this.createDiagnostic(`Multiple tools capture the same concept: "${concept}" (${toolNames}).`, undefined, undefined, `Consolidate "${concept}" collection into a single tool to avoid conflicting sources of truth.`, context));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return diagnostics;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const W107MultipleEntryPoints = new W107MultipleEntryPointsRule();
|
|
97
|
+
//# sourceMappingURL=w107-multiple-entry-points.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W108: Hidden Side Effects
|
|
3
|
+
*
|
|
4
|
+
* Condition:
|
|
5
|
+
* - Tool name/description suggests mutation
|
|
6
|
+
* - But schema does not reflect it
|
|
7
|
+
*
|
|
8
|
+
* Why:
|
|
9
|
+
* - Execution surprises
|
|
10
|
+
* - Hard to reason
|
|
11
|
+
*/
|
|
12
|
+
import { BaseRule } from '../base.js';
|
|
13
|
+
import type { AnalysisContext, Diagnostic } from '../../types.js';
|
|
14
|
+
declare class W108HiddenSideEffectsRule extends BaseRule {
|
|
15
|
+
readonly id = "W108";
|
|
16
|
+
readonly severity: "warning";
|
|
17
|
+
readonly ruleName = "Hidden Side Effects";
|
|
18
|
+
readonly description = "Tool appears to have side effects not reflected in schema. Execution surprises.";
|
|
19
|
+
check(ctx: AnalysisContext): Diagnostic[];
|
|
20
|
+
}
|
|
21
|
+
export declare const W108HiddenSideEffects: W108HiddenSideEffectsRule;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=w108-hidden-side-effects.d.ts.map
|