@opensip-tools/fitness 1.0.4
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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/LICENSE +21 -0
- package/dist/__tests__/gate.test.d.ts +13 -0
- package/dist/__tests__/gate.test.d.ts.map +1 -0
- package/dist/__tests__/gate.test.js +422 -0
- package/dist/__tests__/gate.test.js.map +1 -0
- package/dist/__tests__/sarif.test.d.ts +2 -0
- package/dist/__tests__/sarif.test.d.ts.map +1 -0
- package/dist/__tests__/sarif.test.js +169 -0
- package/dist/__tests__/sarif.test.js.map +1 -0
- package/dist/cli/dashboard.d.ts +6 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +77 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/fit.d.ts +37 -0
- package/dist/cli/fit.d.ts.map +1 -0
- package/dist/cli/fit.js +539 -0
- package/dist/cli/fit.js.map +1 -0
- package/dist/cli/list-checks.d.ts +6 -0
- package/dist/cli/list-checks.d.ts.map +1 -0
- package/dist/cli/list-checks.js +23 -0
- package/dist/cli/list-checks.js.map +1 -0
- package/dist/cli/list-recipes.d.ts +6 -0
- package/dist/cli/list-recipes.d.ts.map +1 -0
- package/dist/cli/list-recipes.js +31 -0
- package/dist/cli/list-recipes.js.map +1 -0
- package/dist/framework/__tests__/ast-utilities.test.d.ts +2 -0
- package/dist/framework/__tests__/ast-utilities.test.d.ts.map +1 -0
- package/dist/framework/__tests__/ast-utilities.test.js +153 -0
- package/dist/framework/__tests__/ast-utilities.test.js.map +1 -0
- package/dist/framework/__tests__/check-config.test.d.ts +2 -0
- package/dist/framework/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/framework/__tests__/check-config.test.js +56 -0
- package/dist/framework/__tests__/check-config.test.js.map +1 -0
- package/dist/framework/__tests__/command-executor.test.d.ts +2 -0
- package/dist/framework/__tests__/command-executor.test.d.ts.map +1 -0
- package/dist/framework/__tests__/command-executor.test.js +71 -0
- package/dist/framework/__tests__/command-executor.test.js.map +1 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.d.ts +2 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.d.ts.map +1 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.js +104 -0
- package/dist/framework/__tests__/content-filter-dispatch.test.js.map +1 -0
- package/dist/framework/__tests__/content-filter.test.d.ts +2 -0
- package/dist/framework/__tests__/content-filter.test.d.ts.map +1 -0
- package/dist/framework/__tests__/content-filter.test.js +126 -0
- package/dist/framework/__tests__/content-filter.test.js.map +1 -0
- package/dist/framework/__tests__/define-check.test.d.ts +2 -0
- package/dist/framework/__tests__/define-check.test.d.ts.map +1 -0
- package/dist/framework/__tests__/define-check.test.js +155 -0
- package/dist/framework/__tests__/define-check.test.js.map +1 -0
- package/dist/framework/__tests__/directive-inventory.test.d.ts +2 -0
- package/dist/framework/__tests__/directive-inventory.test.d.ts.map +1 -0
- package/dist/framework/__tests__/directive-inventory.test.js +44 -0
- package/dist/framework/__tests__/directive-inventory.test.js.map +1 -0
- package/dist/framework/__tests__/execution-context.test.d.ts +2 -0
- package/dist/framework/__tests__/execution-context.test.d.ts.map +1 -0
- package/dist/framework/__tests__/execution-context.test.js +62 -0
- package/dist/framework/__tests__/execution-context.test.js.map +1 -0
- package/dist/framework/__tests__/file-accessor.test.d.ts +2 -0
- package/dist/framework/__tests__/file-accessor.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-accessor.test.js +106 -0
- package/dist/framework/__tests__/file-accessor.test.js.map +1 -0
- package/dist/framework/__tests__/file-cache.test.d.ts +2 -0
- package/dist/framework/__tests__/file-cache.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-cache.test.js +122 -0
- package/dist/framework/__tests__/file-cache.test.js.map +1 -0
- package/dist/framework/__tests__/import-graph.test.d.ts +15 -0
- package/dist/framework/__tests__/import-graph.test.d.ts.map +1 -0
- package/dist/framework/__tests__/import-graph.test.js +164 -0
- package/dist/framework/__tests__/import-graph.test.js.map +1 -0
- package/dist/framework/__tests__/path-matcher.test.d.ts +2 -0
- package/dist/framework/__tests__/path-matcher.test.d.ts.map +1 -0
- package/dist/framework/__tests__/path-matcher.test.js +113 -0
- package/dist/framework/__tests__/path-matcher.test.js.map +1 -0
- package/dist/framework/__tests__/register-helpers.test.d.ts +2 -0
- package/dist/framework/__tests__/register-helpers.test.d.ts.map +1 -0
- package/dist/framework/__tests__/register-helpers.test.js +42 -0
- package/dist/framework/__tests__/register-helpers.test.js.map +1 -0
- package/dist/framework/__tests__/registry.test.d.ts +2 -0
- package/dist/framework/__tests__/registry.test.d.ts.map +1 -0
- package/dist/framework/__tests__/registry.test.js +208 -0
- package/dist/framework/__tests__/registry.test.js.map +1 -0
- package/dist/framework/__tests__/result-builder.test.d.ts +2 -0
- package/dist/framework/__tests__/result-builder.test.d.ts.map +1 -0
- package/dist/framework/__tests__/result-builder.test.js +153 -0
- package/dist/framework/__tests__/result-builder.test.js.map +1 -0
- package/dist/framework/__tests__/scope-resolver.test.d.ts +2 -0
- package/dist/framework/__tests__/scope-resolver.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-resolver.test.js +140 -0
- package/dist/framework/__tests__/scope-resolver.test.js.map +1 -0
- package/dist/framework/__tests__/severity-mapping.test.d.ts +2 -0
- package/dist/framework/__tests__/severity-mapping.test.d.ts.map +1 -0
- package/dist/framework/__tests__/severity-mapping.test.js +42 -0
- package/dist/framework/__tests__/severity-mapping.test.js.map +1 -0
- package/dist/framework/__tests__/strip-literals.test.d.ts +2 -0
- package/dist/framework/__tests__/strip-literals.test.d.ts.map +1 -0
- package/dist/framework/__tests__/strip-literals.test.js +87 -0
- package/dist/framework/__tests__/strip-literals.test.js.map +1 -0
- package/dist/framework/abortable-exec.d.ts +34 -0
- package/dist/framework/abortable-exec.d.ts.map +1 -0
- package/dist/framework/abortable-exec.js +136 -0
- package/dist/framework/abortable-exec.js.map +1 -0
- package/dist/framework/ast-utilities.d.ts +41 -0
- package/dist/framework/ast-utilities.d.ts.map +1 -0
- package/dist/framework/ast-utilities.js +106 -0
- package/dist/framework/ast-utilities.js.map +1 -0
- package/dist/framework/check-config.d.ts +171 -0
- package/dist/framework/check-config.d.ts.map +1 -0
- package/dist/framework/check-config.js +114 -0
- package/dist/framework/check-config.js.map +1 -0
- package/dist/framework/check-types.d.ts +57 -0
- package/dist/framework/check-types.d.ts.map +1 -0
- package/dist/framework/check-types.js +35 -0
- package/dist/framework/check-types.js.map +1 -0
- package/dist/framework/command-executor.d.ts +25 -0
- package/dist/framework/command-executor.d.ts.map +1 -0
- package/dist/framework/command-executor.js +63 -0
- package/dist/framework/command-executor.js.map +1 -0
- package/dist/framework/constants.d.ts +9 -0
- package/dist/framework/constants.d.ts.map +1 -0
- package/dist/framework/constants.js +16 -0
- package/dist/framework/constants.js.map +1 -0
- package/dist/framework/content-filter.d.ts +33 -0
- package/dist/framework/content-filter.d.ts.map +1 -0
- package/dist/framework/content-filter.js +236 -0
- package/dist/framework/content-filter.js.map +1 -0
- package/dist/framework/define-check.d.ts +38 -0
- package/dist/framework/define-check.d.ts.map +1 -0
- package/dist/framework/define-check.js +252 -0
- package/dist/framework/define-check.js.map +1 -0
- package/dist/framework/directive-inventory.d.ts +34 -0
- package/dist/framework/directive-inventory.d.ts.map +1 -0
- package/dist/framework/directive-inventory.js +77 -0
- package/dist/framework/directive-inventory.js.map +1 -0
- package/dist/framework/directive-parsing.d.ts +20 -0
- package/dist/framework/directive-parsing.d.ts.map +1 -0
- package/dist/framework/directive-parsing.js +121 -0
- package/dist/framework/directive-parsing.js.map +1 -0
- package/dist/framework/execution-context.d.ts +95 -0
- package/dist/framework/execution-context.d.ts.map +1 -0
- package/dist/framework/execution-context.js +122 -0
- package/dist/framework/execution-context.js.map +1 -0
- package/dist/framework/file-accessor.d.ts +20 -0
- package/dist/framework/file-accessor.d.ts.map +1 -0
- package/dist/framework/file-accessor.js +122 -0
- package/dist/framework/file-accessor.js.map +1 -0
- package/dist/framework/file-cache.d.ts +70 -0
- package/dist/framework/file-cache.d.ts.map +1 -0
- package/dist/framework/file-cache.js +178 -0
- package/dist/framework/file-cache.js.map +1 -0
- package/dist/framework/file-type-filter.d.ts +11 -0
- package/dist/framework/file-type-filter.d.ts.map +1 -0
- package/dist/framework/file-type-filter.js +21 -0
- package/dist/framework/file-type-filter.js.map +1 -0
- package/dist/framework/ignore-processing.d.ts +22 -0
- package/dist/framework/ignore-processing.d.ts.map +1 -0
- package/dist/framework/ignore-processing.js +241 -0
- package/dist/framework/ignore-processing.js.map +1 -0
- package/dist/framework/import-graph.d.ts +51 -0
- package/dist/framework/import-graph.d.ts.map +1 -0
- package/dist/framework/import-graph.js +216 -0
- package/dist/framework/import-graph.js.map +1 -0
- package/dist/framework/memory-profiler.d.ts +53 -0
- package/dist/framework/memory-profiler.d.ts.map +1 -0
- package/dist/framework/memory-profiler.js +92 -0
- package/dist/framework/memory-profiler.js.map +1 -0
- package/dist/framework/parse-cache.d.ts +23 -0
- package/dist/framework/parse-cache.d.ts.map +1 -0
- package/dist/framework/parse-cache.js +37 -0
- package/dist/framework/parse-cache.js.map +1 -0
- package/dist/framework/path-matcher.d.ts +86 -0
- package/dist/framework/path-matcher.d.ts.map +1 -0
- package/dist/framework/path-matcher.js +138 -0
- package/dist/framework/path-matcher.js.map +1 -0
- package/dist/framework/register-helpers.d.ts +10 -0
- package/dist/framework/register-helpers.d.ts.map +1 -0
- package/dist/framework/register-helpers.js +17 -0
- package/dist/framework/register-helpers.js.map +1 -0
- package/dist/framework/registry.d.ts +41 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +103 -0
- package/dist/framework/registry.js.map +1 -0
- package/dist/framework/result-builder.d.ts +74 -0
- package/dist/framework/result-builder.d.ts.map +1 -0
- package/dist/framework/result-builder.js +154 -0
- package/dist/framework/result-builder.js.map +1 -0
- package/dist/framework/scope-resolver.d.ts +23 -0
- package/dist/framework/scope-resolver.d.ts.map +1 -0
- package/dist/framework/scope-resolver.js +201 -0
- package/dist/framework/scope-resolver.js.map +1 -0
- package/dist/framework/severity-mapping.d.ts +13 -0
- package/dist/framework/severity-mapping.d.ts.map +1 -0
- package/dist/framework/severity-mapping.js +51 -0
- package/dist/framework/severity-mapping.js.map +1 -0
- package/dist/framework/strip-literals.d.ts +48 -0
- package/dist/framework/strip-literals.d.ts.map +1 -0
- package/dist/framework/strip-literals.js +188 -0
- package/dist/framework/strip-literals.js.map +1 -0
- package/dist/gate.d.ts +74 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +257 -0
- package/dist/gate.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/__tests__/check-package-discovery.test.d.ts +2 -0
- package/dist/plugins/__tests__/check-package-discovery.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/check-package-discovery.test.js +170 -0
- package/dist/plugins/__tests__/check-package-discovery.test.js.map +1 -0
- package/dist/plugins/__tests__/lang-domain.test.d.ts +2 -0
- package/dist/plugins/__tests__/lang-domain.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/lang-domain.test.js +171 -0
- package/dist/plugins/__tests__/lang-domain.test.js.map +1 -0
- package/dist/plugins/__tests__/loader.test.d.ts +2 -0
- package/dist/plugins/__tests__/loader.test.d.ts.map +1 -0
- package/dist/plugins/__tests__/loader.test.js +194 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/check-package-discovery.d.ts +73 -0
- package/dist/plugins/check-package-discovery.d.ts.map +1 -0
- package/dist/plugins/check-package-discovery.js +212 -0
- package/dist/plugins/check-package-discovery.js.map +1 -0
- package/dist/plugins/loader.d.ts +31 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +290 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +23 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +9 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts +2 -0
- package/dist/recipes/__tests__/built-in-recipes.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js +93 -0
- package/dist/recipes/__tests__/built-in-recipes.test.js.map +1 -0
- package/dist/recipes/__tests__/check-config.test.d.ts +5 -0
- package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-config.test.js +37 -0
- package/dist/recipes/__tests__/check-config.test.js.map +1 -0
- package/dist/recipes/__tests__/check-resolution.test.d.ts +2 -0
- package/dist/recipes/__tests__/check-resolution.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-resolution.test.js +135 -0
- package/dist/recipes/__tests__/check-resolution.test.js.map +1 -0
- package/dist/recipes/__tests__/registry.test.d.ts +2 -0
- package/dist/recipes/__tests__/registry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/registry.test.js +97 -0
- package/dist/recipes/__tests__/registry.test.js.map +1 -0
- package/dist/recipes/__tests__/retry.test.d.ts +2 -0
- package/dist/recipes/__tests__/retry.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/retry.test.js +75 -0
- package/dist/recipes/__tests__/retry.test.js.map +1 -0
- package/dist/recipes/__tests__/service.test.d.ts +11 -0
- package/dist/recipes/__tests__/service.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/service.test.js +482 -0
- package/dist/recipes/__tests__/service.test.js.map +1 -0
- package/dist/recipes/built-in-recipes.d.ts +14 -0
- package/dist/recipes/built-in-recipes.d.ts.map +1 -0
- package/dist/recipes/built-in-recipes.js +247 -0
- package/dist/recipes/built-in-recipes.js.map +1 -0
- package/dist/recipes/check-config.d.ts +40 -0
- package/dist/recipes/check-config.d.ts.map +1 -0
- package/dist/recipes/check-config.js +61 -0
- package/dist/recipes/check-config.js.map +1 -0
- package/dist/recipes/check-resolution.d.ts +21 -0
- package/dist/recipes/check-resolution.d.ts.map +1 -0
- package/dist/recipes/check-resolution.js +121 -0
- package/dist/recipes/check-resolution.js.map +1 -0
- package/dist/recipes/check-result-processor.d.ts +51 -0
- package/dist/recipes/check-result-processor.d.ts.map +1 -0
- package/dist/recipes/check-result-processor.js +158 -0
- package/dist/recipes/check-result-processor.js.map +1 -0
- package/dist/recipes/parallel-execution.d.ts +33 -0
- package/dist/recipes/parallel-execution.d.ts.map +1 -0
- package/dist/recipes/parallel-execution.js +142 -0
- package/dist/recipes/parallel-execution.js.map +1 -0
- package/dist/recipes/registry.d.ts +81 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +131 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/retry.d.ts +25 -0
- package/dist/recipes/retry.d.ts.map +1 -0
- package/dist/recipes/retry.js +44 -0
- package/dist/recipes/retry.js.map +1 -0
- package/dist/recipes/sequential-execution.d.ts +10 -0
- package/dist/recipes/sequential-execution.d.ts.map +1 -0
- package/dist/recipes/sequential-execution.js +122 -0
- package/dist/recipes/sequential-execution.js.map +1 -0
- package/dist/recipes/service-types.d.ts +84 -0
- package/dist/recipes/service-types.d.ts.map +1 -0
- package/dist/recipes/service-types.js +8 -0
- package/dist/recipes/service-types.js.map +1 -0
- package/dist/recipes/service.d.ts +71 -0
- package/dist/recipes/service.d.ts.map +1 -0
- package/dist/recipes/service.js +331 -0
- package/dist/recipes/service.js.map +1 -0
- package/dist/recipes/types.d.ts +154 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +54 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/sarif.d.ts +34 -0
- package/dist/sarif.d.ts.map +1 -0
- package/dist/sarif.js +192 -0
- package/dist/sarif.js.map +1 -0
- package/dist/signalers/__tests__/loader.test.d.ts +2 -0
- package/dist/signalers/__tests__/loader.test.d.ts.map +1 -0
- package/dist/signalers/__tests__/loader.test.js +74 -0
- package/dist/signalers/__tests__/loader.test.js.map +1 -0
- package/dist/signalers/index.d.ts +8 -0
- package/dist/signalers/index.d.ts.map +1 -0
- package/dist/signalers/index.js +9 -0
- package/dist/signalers/index.js.map +1 -0
- package/dist/signalers/loader.d.ts +24 -0
- package/dist/signalers/loader.d.ts.map +1 -0
- package/dist/signalers/loader.js +108 -0
- package/dist/signalers/loader.js.map +1 -0
- package/dist/signalers/schema.d.ts +288 -0
- package/dist/signalers/schema.d.ts.map +1 -0
- package/dist/signalers/schema.js +99 -0
- package/dist/signalers/schema.js.map +1 -0
- package/dist/signalers/types.d.ts +13 -0
- package/dist/signalers/types.d.ts.map +1 -0
- package/dist/signalers/types.js +5 -0
- package/dist/signalers/types.js.map +1 -0
- package/dist/targets/__tests__/loader.test.d.ts +2 -0
- package/dist/targets/__tests__/loader.test.d.ts.map +1 -0
- package/dist/targets/__tests__/loader.test.js +127 -0
- package/dist/targets/__tests__/loader.test.js.map +1 -0
- package/dist/targets/__tests__/resolver.test.d.ts +2 -0
- package/dist/targets/__tests__/resolver.test.d.ts.map +1 -0
- package/dist/targets/__tests__/resolver.test.js +54 -0
- package/dist/targets/__tests__/resolver.test.js.map +1 -0
- package/dist/targets/__tests__/target-registry.test.d.ts +2 -0
- package/dist/targets/__tests__/target-registry.test.d.ts.map +1 -0
- package/dist/targets/__tests__/target-registry.test.js +89 -0
- package/dist/targets/__tests__/target-registry.test.js.map +1 -0
- package/dist/targets/index.d.ts +10 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +12 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/loader.d.ts +19 -0
- package/dist/targets/loader.d.ts.map +1 -0
- package/dist/targets/loader.js +159 -0
- package/dist/targets/loader.js.map +1 -0
- package/dist/targets/resolver.d.ts +19 -0
- package/dist/targets/resolver.d.ts.map +1 -0
- package/dist/targets/resolver.js +37 -0
- package/dist/targets/resolver.js.map +1 -0
- package/dist/targets/target-registry.d.ts +61 -0
- package/dist/targets/target-registry.d.ts.map +1 -0
- package/dist/targets/target-registry.js +93 -0
- package/dist/targets/target-registry.js.map +1 -0
- package/dist/targets/types.d.ts +85 -0
- package/dist/targets/types.d.ts.map +1 -0
- package/dist/targets/types.js +5 -0
- package/dist/targets/types.js.map +1 -0
- package/dist/tool.d.ts +17 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +282 -0
- package/dist/tool.js.map +1 -0
- package/dist/types/findings.d.ts +117 -0
- package/dist/types/findings.d.ts.map +1 -0
- package/dist/types/findings.js +93 -0
- package/dist/types/findings.js.map +1 -0
- package/dist/types/severity.d.ts +15 -0
- package/dist/types/severity.d.ts.map +1 -0
- package/dist/types/severity.js +36 -0
- package/dist/types/severity.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/gate.test.ts +537 -0
- package/src/__tests__/sarif.test.ts +201 -0
- package/src/cli/dashboard.ts +93 -0
- package/src/cli/fit.ts +612 -0
- package/src/cli/list-checks.ts +32 -0
- package/src/cli/list-recipes.ts +38 -0
- package/src/framework/__tests__/ast-utilities.test.ts +157 -0
- package/src/framework/__tests__/check-config.test.ts +65 -0
- package/src/framework/__tests__/command-executor.test.ts +79 -0
- package/src/framework/__tests__/content-filter-dispatch.test.ts +132 -0
- package/src/framework/__tests__/content-filter.test.ts +136 -0
- package/src/framework/__tests__/define-check.test.ts +180 -0
- package/src/framework/__tests__/directive-inventory.test.ts +53 -0
- package/src/framework/__tests__/execution-context.test.ts +80 -0
- package/src/framework/__tests__/file-accessor.test.ts +121 -0
- package/src/framework/__tests__/file-cache.test.ts +142 -0
- package/src/framework/__tests__/import-graph.test.ts +282 -0
- package/src/framework/__tests__/path-matcher.test.ts +130 -0
- package/src/framework/__tests__/register-helpers.test.ts +51 -0
- package/src/framework/__tests__/registry.test.ts +243 -0
- package/src/framework/__tests__/result-builder.test.ts +178 -0
- package/src/framework/__tests__/scope-resolver.test.ts +208 -0
- package/src/framework/__tests__/severity-mapping.test.ts +50 -0
- package/src/framework/__tests__/strip-literals.test.ts +109 -0
- package/src/framework/abortable-exec.ts +177 -0
- package/src/framework/ast-utilities.ts +112 -0
- package/src/framework/check-config.ts +339 -0
- package/src/framework/check-types.ts +77 -0
- package/src/framework/command-executor.ts +100 -0
- package/src/framework/constants.ts +16 -0
- package/src/framework/content-filter.ts +288 -0
- package/src/framework/define-check.ts +336 -0
- package/src/framework/directive-inventory.ts +110 -0
- package/src/framework/directive-parsing.ts +152 -0
- package/src/framework/execution-context.ts +247 -0
- package/src/framework/file-accessor.ts +171 -0
- package/src/framework/file-cache.ts +220 -0
- package/src/framework/file-type-filter.ts +25 -0
- package/src/framework/ignore-processing.ts +350 -0
- package/src/framework/import-graph.ts +280 -0
- package/src/framework/memory-profiler.ts +145 -0
- package/src/framework/parse-cache.ts +38 -0
- package/src/framework/path-matcher.ts +191 -0
- package/src/framework/register-helpers.ts +20 -0
- package/src/framework/registry.ts +125 -0
- package/src/framework/result-builder.ts +225 -0
- package/src/framework/scope-resolver.ts +262 -0
- package/src/framework/severity-mapping.ts +56 -0
- package/src/framework/strip-literals.ts +200 -0
- package/src/gate.ts +337 -0
- package/src/index.ts +110 -0
- package/src/plugins/__tests__/check-package-discovery.test.ts +204 -0
- package/src/plugins/__tests__/lang-domain.test.ts +198 -0
- package/src/plugins/__tests__/loader.test.ts +226 -0
- package/src/plugins/check-package-discovery.ts +242 -0
- package/src/plugins/loader.ts +327 -0
- package/src/plugins/types.ts +25 -0
- package/src/recipes/__tests__/built-in-recipes.test.ts +107 -0
- package/src/recipes/__tests__/check-config.test.ts +51 -0
- package/src/recipes/__tests__/check-resolution.test.ts +185 -0
- package/src/recipes/__tests__/registry.test.ts +115 -0
- package/src/recipes/__tests__/retry.test.ts +83 -0
- package/src/recipes/__tests__/service.test.ts +572 -0
- package/src/recipes/built-in-recipes.ts +273 -0
- package/src/recipes/check-config.ts +64 -0
- package/src/recipes/check-resolution.ts +169 -0
- package/src/recipes/check-result-processor.ts +258 -0
- package/src/recipes/parallel-execution.ts +220 -0
- package/src/recipes/registry.ts +192 -0
- package/src/recipes/retry.ts +69 -0
- package/src/recipes/sequential-execution.ts +139 -0
- package/src/recipes/service-types.ts +105 -0
- package/src/recipes/service.ts +400 -0
- package/src/recipes/types.ts +247 -0
- package/src/sarif.ts +232 -0
- package/src/signalers/__tests__/loader.test.ts +99 -0
- package/src/signalers/index.ts +9 -0
- package/src/signalers/loader.ts +141 -0
- package/src/signalers/schema.ts +117 -0
- package/src/signalers/types.ts +15 -0
- package/src/targets/__tests__/loader.test.ts +170 -0
- package/src/targets/__tests__/resolver.test.ts +74 -0
- package/src/targets/__tests__/target-registry.test.ts +103 -0
- package/src/targets/index.ts +13 -0
- package/src/targets/loader.ts +214 -0
- package/src/targets/resolver.ts +44 -0
- package/src/targets/target-registry.ts +111 -0
- package/src/targets/types.ts +89 -0
- package/src/tool.ts +302 -0
- package/src/types/findings.ts +239 -0
- package/src/types/severity.ts +39 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +33 -0
package/dist/cli/fit.js
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fit command — run fitness checks
|
|
3
|
+
*/
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
+
import { EXIT_CODES, saveSession, generateSessionId, } from '@opensip-tools/contracts';
|
|
7
|
+
import { logger } from '@opensip-tools/core';
|
|
8
|
+
import { isCheck } from '../framework/check-types.js';
|
|
9
|
+
import { defaultRegistry } from '../framework/registry.js';
|
|
10
|
+
import { buildScopeBasedFileMap } from '../framework/scope-resolver.js';
|
|
11
|
+
import { discoverCheckPackages, readCheckPackageMetadata, readCheckPackagePreferences, } from '../plugins/check-package-discovery.js';
|
|
12
|
+
import { loadAllPlugins } from '../plugins/loader.js';
|
|
13
|
+
import { defaultRecipeRegistry } from '../recipes/registry.js';
|
|
14
|
+
import { FitnessRecipeService } from '../recipes/service.js';
|
|
15
|
+
import { loadSignalersConfig } from '../signalers/index.js';
|
|
16
|
+
import { loadTargetsConfig } from '../targets/index.js';
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Lazy-load fitness checks
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
let checksLoaded = false;
|
|
21
|
+
let pluginLoadErrors = [];
|
|
22
|
+
/**
|
|
23
|
+
* Merged display map contributed by every loaded check package via the
|
|
24
|
+
* FitPluginExports.checkDisplay field. Each package owns the slugs it
|
|
25
|
+
* registers; on collision the last package loaded wins (no package is
|
|
26
|
+
* privileged). Slugs without an entry fall back to kebab-to-title-case.
|
|
27
|
+
*/
|
|
28
|
+
const mergedCheckDisplay = new Map();
|
|
29
|
+
let getCheckDisplayName = defaultDisplayName;
|
|
30
|
+
let getCheckIcon = (_slug) => '\uD83D\uDD0D';
|
|
31
|
+
function defaultDisplayName(slug) {
|
|
32
|
+
return slug
|
|
33
|
+
.split('-')
|
|
34
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
35
|
+
.join(' ');
|
|
36
|
+
}
|
|
37
|
+
function rowStatus(cr) {
|
|
38
|
+
if (cr.timedOut)
|
|
39
|
+
return 'TIMEOUT';
|
|
40
|
+
return cr.passed ? 'PASS' : 'FAIL';
|
|
41
|
+
}
|
|
42
|
+
function rebuildDisplayLookups() {
|
|
43
|
+
getCheckDisplayName = (slug) => {
|
|
44
|
+
const entry = mergedCheckDisplay.get(slug);
|
|
45
|
+
return entry ? entry[1] : defaultDisplayName(slug);
|
|
46
|
+
};
|
|
47
|
+
getCheckIcon = (slug) => {
|
|
48
|
+
const entry = mergedCheckDisplay.get(slug);
|
|
49
|
+
return entry ? entry[0] : '\uD83D\uDD0D';
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Plugin load errors recorded during the most recent ensureChecksLoaded() call.
|
|
54
|
+
* Read by runFit to fail the run if any plugin failed to import \u2014 otherwise a
|
|
55
|
+
* malicious or broken plugin could silently suppress its own checks while the
|
|
56
|
+
* CLI exits 0, masking a compliance failure or a supply-chain compromise.
|
|
57
|
+
*/
|
|
58
|
+
export function getPluginLoadErrors() {
|
|
59
|
+
return pluginLoadErrors;
|
|
60
|
+
}
|
|
61
|
+
let preLoadHook;
|
|
62
|
+
/** Register a hook the CLI runs before fitness loads checks. */
|
|
63
|
+
export function setPreLoadHook(hook) {
|
|
64
|
+
preLoadHook = hook;
|
|
65
|
+
}
|
|
66
|
+
export async function ensureChecksLoaded(projectDir) {
|
|
67
|
+
if (checksLoaded)
|
|
68
|
+
return;
|
|
69
|
+
// 0. CLI-injected pre-load hook (auto-sync project plugins, etc).
|
|
70
|
+
// Skipped when no hook is registered (e.g. running fitness via the
|
|
71
|
+
// Tool API outside the CLI).
|
|
72
|
+
if (projectDir && preLoadHook) {
|
|
73
|
+
await preLoadHook(projectDir);
|
|
74
|
+
}
|
|
75
|
+
// 1. Load fit plugins — discovers .mjs files in
|
|
76
|
+
// <projectDir>/opensip-tools/fit/{checks,recipes}/ and any
|
|
77
|
+
// npm packages declared in plugins.fit in the project config.
|
|
78
|
+
//
|
|
79
|
+
// Bundled language adapters (TypeScript, Rust, Python, etc.)
|
|
80
|
+
// are registered separately by the CLI bootstrap; fitness
|
|
81
|
+
// doesn't take direct deps on @opensip-tools/lang-* packages,
|
|
82
|
+
// and there's no project-local 'lang' plugin discovery path
|
|
83
|
+
// (the lang adapter set is fixed and shipped with the CLI).
|
|
84
|
+
const pluginResult = await loadAllPlugins('fit', projectDir);
|
|
85
|
+
pluginLoadErrors = pluginResult.errors;
|
|
86
|
+
if (pluginResult.errors.length > 0) {
|
|
87
|
+
// Surface plugin load errors to the user. The logger is silenced in
|
|
88
|
+
// normal CLI runs, so a structured-log-only failure was invisible
|
|
89
|
+
// before. Print one line per failure to stderr — short, actionable,
|
|
90
|
+
// and doesn't clobber stdout (which carries results + --json).
|
|
91
|
+
for (const err of pluginResult.errors) {
|
|
92
|
+
process.stderr.write(`opensip-tools: plugin failed to load — ${err}\n`);
|
|
93
|
+
logger.warn({ evt: 'cli.plugin.warning', module: 'cli:fit', message: err });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 3. Discover and load every @opensip-tools/checks-* package installed
|
|
97
|
+
// in node_modules. No package is privileged — what used to be a
|
|
98
|
+
// hardcoded `import('@opensip-tools/checks-builtin')` is now an
|
|
99
|
+
// ordinary npm dependency declared by @opensip-tools/cli and
|
|
100
|
+
// discovered via discoverCheckPackages() like every other pack.
|
|
101
|
+
// Project config can override (plugins.checkPackages: [...]) or
|
|
102
|
+
// opt out (plugins.autoDiscoverChecks: false).
|
|
103
|
+
//
|
|
104
|
+
// `projectDir` is the discovery anchor — discoverCheckPackages
|
|
105
|
+
// walks up to ancestor node_modules from there. When called
|
|
106
|
+
// without one (e.g. ad-hoc `opensip-tools fit` in an unconfigured
|
|
107
|
+
// dir) we fall back to the CLI's own install dir so the bundled
|
|
108
|
+
// deps still resolve.
|
|
109
|
+
const discoveryAnchor = projectDir ?? cliInstallDir();
|
|
110
|
+
const checksRegistered = await loadDiscoveredCheckPackages(discoveryAnchor);
|
|
111
|
+
// 4. No-checks-loaded guard. Silent zero-checks would let a misconfig
|
|
112
|
+
// or missing dep produce a green run that scanned nothing — the
|
|
113
|
+
// exact failure mode the CLI exists to prevent. Warn loudly.
|
|
114
|
+
if (checksRegistered === 0) {
|
|
115
|
+
const msg = 'opensip-tools: no check packages were loaded. ' +
|
|
116
|
+
'Install at least one @opensip-tools/checks-* package, ' +
|
|
117
|
+
'or declare plugins.checkPackages in opensip-tools.config.yml.\n';
|
|
118
|
+
process.stderr.write(msg);
|
|
119
|
+
logger.warn({
|
|
120
|
+
evt: 'cli.check_packages.empty',
|
|
121
|
+
module: 'cli:fit',
|
|
122
|
+
msg: 'no check packages loaded',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
rebuildDisplayLookups();
|
|
126
|
+
checksLoaded = true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Resolve the directory the CLI was installed into, used as a discovery
|
|
130
|
+
* fallback when no projectDir is supplied. Walks up from this module's
|
|
131
|
+
* URL to the @opensip-tools/cli package root so node_modules lookup
|
|
132
|
+
* sees the CLI's own dependency tree (which now contains checks-builtin
|
|
133
|
+
* and any other check packages declared in cli/package.json).
|
|
134
|
+
*/
|
|
135
|
+
function cliInstallDir() {
|
|
136
|
+
// import.meta.url points at this file inside the CLI's dist/. The CLI
|
|
137
|
+
// package root is two levels up from dist/commands/. Resolve via the
|
|
138
|
+
// Node URL → path bridge to keep this OS-agnostic.
|
|
139
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
140
|
+
return dirname(dirname(dirname(thisFile)));
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Load every check package returned by discoverCheckPackages(). Each
|
|
144
|
+
* package's main entry should follow the FitPluginExports contract:
|
|
145
|
+
*
|
|
146
|
+
* - `checks`: readonly Check[] (required)
|
|
147
|
+
* - `checkDisplay`: { [slug]: [icon, name] } (optional)
|
|
148
|
+
*
|
|
149
|
+
* Errors loading any one package don't fail the others — they surface
|
|
150
|
+
* to stderr the same way fit-domain plugin failures do.
|
|
151
|
+
*
|
|
152
|
+
* Returns the total number of checks registered across all loaded
|
|
153
|
+
* packages, so the caller can warn when zero packages contributed
|
|
154
|
+
* anything (a silent green run scanning nothing is the failure mode
|
|
155
|
+
* we want to make impossible).
|
|
156
|
+
*/
|
|
157
|
+
async function loadDiscoveredCheckPackages(projectDir) {
|
|
158
|
+
const prefs = readCheckPackagePreferences(projectDir);
|
|
159
|
+
const discovered = discoverCheckPackages({
|
|
160
|
+
projectDir,
|
|
161
|
+
explicitPackages: prefs.checkPackages,
|
|
162
|
+
autoDiscover: prefs.autoDiscoverChecks,
|
|
163
|
+
});
|
|
164
|
+
let totalRegistered = 0;
|
|
165
|
+
for (const pkg of discovered) {
|
|
166
|
+
const meta = readCheckPackageMetadata(pkg.packageDir);
|
|
167
|
+
if (!meta) {
|
|
168
|
+
process.stderr.write(`opensip-tools: check package ${pkg.name} has no readable package.json — skipping\n`);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const moduleUrl = pathToFileURL(meta.mainEntry).href;
|
|
173
|
+
const mod = (await import(moduleUrl));
|
|
174
|
+
const checks = mod.checks;
|
|
175
|
+
if (!Array.isArray(checks)) {
|
|
176
|
+
process.stderr.write(`opensip-tools: check package ${pkg.name} does not export a "checks" array — skipping\n`);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
let registered = 0;
|
|
180
|
+
for (const check of checks) {
|
|
181
|
+
if (isCheck(check)) {
|
|
182
|
+
defaultRegistry.register(check, pkg.name);
|
|
183
|
+
registered++;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
totalRegistered += registered;
|
|
187
|
+
mergeCheckDisplay(pkg.name, mod.checkDisplay);
|
|
188
|
+
logger.info({
|
|
189
|
+
evt: 'cli.check_package.loaded',
|
|
190
|
+
module: 'cli:fit',
|
|
191
|
+
name: pkg.name,
|
|
192
|
+
checksRegistered: registered,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
197
|
+
process.stderr.write(`opensip-tools: failed to load check package ${pkg.name}: ${msg}\n`);
|
|
198
|
+
logger.warn({
|
|
199
|
+
evt: 'cli.check_package.load_failed',
|
|
200
|
+
module: 'cli:fit',
|
|
201
|
+
name: pkg.name,
|
|
202
|
+
error: msg,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return totalRegistered;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Merge a check package's display map into the CLI-wide registry.
|
|
210
|
+
*
|
|
211
|
+
* Validates each entry is a `[icon, name]` tuple before accepting it —
|
|
212
|
+
* a malformed `checkDisplay` export from a third-party package shouldn't
|
|
213
|
+
* crash the run. Bad entries are dropped silently with a debug log so
|
|
214
|
+
* the user still gets a (worse-formatted) result rather than a hang.
|
|
215
|
+
*
|
|
216
|
+
* On collision, last package loaded wins. That's intentional: it lets
|
|
217
|
+
* a downstream package override a base package's display name without
|
|
218
|
+
* having to touch the original.
|
|
219
|
+
*/
|
|
220
|
+
function mergeCheckDisplay(packageName, raw) {
|
|
221
|
+
if (!raw || typeof raw !== 'object')
|
|
222
|
+
return;
|
|
223
|
+
for (const [slug, entry] of Object.entries(raw)) {
|
|
224
|
+
if (Array.isArray(entry) &&
|
|
225
|
+
entry.length === 2 &&
|
|
226
|
+
typeof entry[0] === 'string' &&
|
|
227
|
+
typeof entry[1] === 'string') {
|
|
228
|
+
mergedCheckDisplay.set(slug, [entry[0], entry[1]]);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
logger.debug({
|
|
232
|
+
evt: 'cli.check_package.bad_display_entry',
|
|
233
|
+
module: 'cli:fit',
|
|
234
|
+
packageName,
|
|
235
|
+
slug,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** Get display name for a check slug (available after ensureChecksLoaded) */
|
|
241
|
+
export function getDisplayName(slug) {
|
|
242
|
+
return getCheckDisplayName(slug);
|
|
243
|
+
}
|
|
244
|
+
/** Get the number of enabled checks (available after ensureChecksLoaded) */
|
|
245
|
+
export function getEnabledCheckCount() {
|
|
246
|
+
return defaultRegistry.listEnabled().length;
|
|
247
|
+
}
|
|
248
|
+
/** Get icon for a check slug (available after ensureChecksLoaded) */
|
|
249
|
+
export function getIcon(slug) {
|
|
250
|
+
return getCheckIcon(slug);
|
|
251
|
+
}
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// Formatting helpers (used to build TableRow data)
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
export function formatDuration(ms) {
|
|
256
|
+
if (ms < 1000)
|
|
257
|
+
return `${ms}ms`;
|
|
258
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
259
|
+
}
|
|
260
|
+
export function formatValidatedColumn(totalItems, itemType = 'items') {
|
|
261
|
+
// No meaningful count: external tool checks, errored checks, or checks with no file scanning
|
|
262
|
+
if (!totalItems)
|
|
263
|
+
return '—';
|
|
264
|
+
// Use singular for count of 1, plural otherwise (e.g., "1 file", "450 files", "13 packages")
|
|
265
|
+
const singular = itemType.endsWith('s') ? itemType.slice(0, -1) : itemType;
|
|
266
|
+
return totalItems === 1 ? `${totalItems} ${singular}` : `${totalItems} ${itemType}`;
|
|
267
|
+
}
|
|
268
|
+
// ---------------------------------------------------------------------------
|
|
269
|
+
// executeFit — main fit command (returns data, no console output)
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- top-level CLI command flow: validates args, resolves config, runs recipes, persists results — distinct phases that read better inline
|
|
272
|
+
export async function executeFit(args, onProgress) {
|
|
273
|
+
logger.info({ evt: 'cli.checks.loading', module: 'cli:fit' });
|
|
274
|
+
await ensureChecksLoaded(args.cwd);
|
|
275
|
+
logger.info({ evt: 'cli.checks.loaded', module: 'cli:fit', checkCount: defaultRegistry.listEnabled().length });
|
|
276
|
+
// Determine recipe: --check and --tags each create an ad-hoc recipe;
|
|
277
|
+
// otherwise use a named recipe. --check takes precedence over --recipe
|
|
278
|
+
// so "opensip-tools fit --check <slug>" runs just that slug.
|
|
279
|
+
const useAdHoc = args.check != null || args.tags != null;
|
|
280
|
+
const recipeName = useAdHoc ? undefined : (args.recipe ?? 'default');
|
|
281
|
+
if (recipeName && !defaultRecipeRegistry.has(recipeName)) {
|
|
282
|
+
return {
|
|
283
|
+
result: {
|
|
284
|
+
type: 'error',
|
|
285
|
+
message: `Unknown recipe '${recipeName}'.`,
|
|
286
|
+
suggestion: 'Run opensip-tools fit --recipes to see available recipes.',
|
|
287
|
+
exitCode: EXIT_CODES.CONFIGURATION_ERROR,
|
|
288
|
+
},
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
// -- Config resolution --
|
|
292
|
+
// Both loaders share the same project config file. A missing file is a
|
|
293
|
+
// HARD error: file-based checks would silently produce zero findings,
|
|
294
|
+
// making the scan look green when it actually never ran. The resolver
|
|
295
|
+
// throws with a message that enumerates every path it attempted.
|
|
296
|
+
let signalersConfig;
|
|
297
|
+
let targetsResult;
|
|
298
|
+
try {
|
|
299
|
+
signalersConfig = loadSignalersConfig(args.cwd, args.config);
|
|
300
|
+
targetsResult = loadTargetsConfig(args.cwd, args.config);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
304
|
+
logger.warn({ evt: 'cli.config.load_failed', module: 'cli:fit', message });
|
|
305
|
+
return {
|
|
306
|
+
result: {
|
|
307
|
+
type: 'error',
|
|
308
|
+
message,
|
|
309
|
+
suggestion: "Run 'opensip-tools init' to scaffold a config, or pass --config <path> to point at an existing one.",
|
|
310
|
+
exitCode: EXIT_CODES.CONFIGURATION_ERROR,
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const disabledChecks = signalersConfig.fitness.disabledChecks;
|
|
315
|
+
const { registry: targetRegistry, config: targetsConfig } = targetsResult;
|
|
316
|
+
const configFound = true;
|
|
317
|
+
// Phase 9: validate that every language declared in the targets config
|
|
318
|
+
// has a registered LanguageAdapter. Warn loudly when a target asks for
|
|
319
|
+
// a language we don't know how to handle — silent acceptance would let
|
|
320
|
+
// users ship configs that scan files but produce wrong results.
|
|
321
|
+
{
|
|
322
|
+
const { defaultLanguageRegistry: langRegistry } = await import('@opensip-tools/core');
|
|
323
|
+
const knownLanguages = new Set(langRegistry.list().flatMap((a) => [a.id, ...(a.aliases ?? [])]));
|
|
324
|
+
const unknownLanguages = new Set();
|
|
325
|
+
for (const target of targetRegistry.getAll()) {
|
|
326
|
+
const langs = target.config.languages ?? [];
|
|
327
|
+
for (const lang of langs) {
|
|
328
|
+
if (!knownLanguages.has(lang))
|
|
329
|
+
unknownLanguages.add(lang);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (unknownLanguages.size > 0) {
|
|
333
|
+
const list = [...unknownLanguages].sort().join(', ');
|
|
334
|
+
const known = [...knownLanguages].filter((l) => !l.startsWith('rs') && !l.startsWith('py')).slice(0, 8).join(', ');
|
|
335
|
+
process.stderr.write(`opensip-tools: target config declares unknown language(s): ${list}. ` +
|
|
336
|
+
`Known languages: ${[...knownLanguages].sort().join(', ')}. ` +
|
|
337
|
+
`Files in unknown languages will scan with no string/comment filtering.\n`);
|
|
338
|
+
logger.warn({
|
|
339
|
+
evt: 'cli.config.unknown_languages',
|
|
340
|
+
module: 'cli:fit',
|
|
341
|
+
unknown: [...unknownLanguages],
|
|
342
|
+
known: [...knownLanguages],
|
|
343
|
+
});
|
|
344
|
+
// Reference `known` to avoid unused-var lint without changing the user-facing message.
|
|
345
|
+
void known;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
const allChecks = defaultRegistry.listSlugs().map((key) => {
|
|
349
|
+
const check = defaultRegistry.getBySlug(key);
|
|
350
|
+
return { slug: check?.config.slug ?? key, scope: check?.config.checkScope };
|
|
351
|
+
});
|
|
352
|
+
const scopeMap = buildScopeBasedFileMap(allChecks, targetRegistry, targetsConfig, args.cwd);
|
|
353
|
+
const checkTargetFiles = scopeMap.size > 0 ? scopeMap : undefined;
|
|
354
|
+
const label = args.tags ? `tags: ${args.tags}` : `recipe ${recipeName ?? 'default'}`;
|
|
355
|
+
// -- Progress callbacks --
|
|
356
|
+
//
|
|
357
|
+
// Monotonic completed-count:
|
|
358
|
+
//
|
|
359
|
+
// The service fires onCheckStart(slug, displayIndex, total) when a check
|
|
360
|
+
// STARTS and onCheckComplete(slug, summary, displayIndex, total) when it
|
|
361
|
+
// FINISHES. Under parallel execution `displayIndex` is the check's
|
|
362
|
+
// position in the queue (1..total), not "how many have completed" — so
|
|
363
|
+
// the last started check's index hops above the current completion
|
|
364
|
+
// tally and then "resets" down when an earlier check finishes. The UI
|
|
365
|
+
// showed `147/148 → 121/148 → 78/148` because each event fired with a
|
|
366
|
+
// different in-flight check's queue position.
|
|
367
|
+
//
|
|
368
|
+
// The progress bar wants a monotonic counter. Track completed locally,
|
|
369
|
+
// increment only on onCheckComplete, ignore onCheckStart's index. The
|
|
370
|
+
// counter is strictly non-decreasing and always reflects "N of M
|
|
371
|
+
// checks done."
|
|
372
|
+
let completedCount = 0;
|
|
373
|
+
const callbacks = {
|
|
374
|
+
onCheckStart(checkSlug, index, total) {
|
|
375
|
+
logger.debug({ evt: 'cli.check.start', module: 'cli:fit', checkSlug, index, total });
|
|
376
|
+
// Emit current completed count so the UI shows activity without
|
|
377
|
+
// moving the bar backward on start events.
|
|
378
|
+
onProgress?.(completedCount, total);
|
|
379
|
+
},
|
|
380
|
+
onCheckComplete(checkSlug, summary, index, total) {
|
|
381
|
+
logger.debug({ evt: 'cli.check.complete', module: 'cli:fit', checkSlug, passed: summary.passed, errors: summary.errors, warnings: summary.warnings, durationMs: summary.durationMs });
|
|
382
|
+
completedCount++;
|
|
383
|
+
onProgress?.(completedCount, total);
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
// -- Execute via FitnessRecipeService --
|
|
387
|
+
// Forward globalExcludes from the project config so the matchFiles()
|
|
388
|
+
// fileCache fallback honors them. Without this, scope-empty checks
|
|
389
|
+
// (e.g. file-length-limit) scan every prewarmed file regardless of
|
|
390
|
+
// whether the project config told us to exclude it.
|
|
391
|
+
const service = new FitnessRecipeService({
|
|
392
|
+
cwd: args.cwd,
|
|
393
|
+
checkTargetFiles,
|
|
394
|
+
callbacks,
|
|
395
|
+
disabledChecks,
|
|
396
|
+
includeViolations: true,
|
|
397
|
+
globalExcludes: targetsConfig.globalExcludes,
|
|
398
|
+
});
|
|
399
|
+
let fitnessResult;
|
|
400
|
+
try {
|
|
401
|
+
if (args.check) {
|
|
402
|
+
fitnessResult = await service.start(FitnessRecipeService.createAdHocRecipe({ check: args.check }));
|
|
403
|
+
}
|
|
404
|
+
else if (args.tags) {
|
|
405
|
+
const tagFilters = args.tags.split(',').map(t => t.trim()).filter(Boolean);
|
|
406
|
+
fitnessResult = await service.start(FitnessRecipeService.createAdHocRecipe({ tagFilters }));
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
fitnessResult = await service.start(recipeName);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
414
|
+
return {
|
|
415
|
+
result: {
|
|
416
|
+
type: 'error',
|
|
417
|
+
message: `Fitness run failed: ${msg}`,
|
|
418
|
+
exitCode: EXIT_CODES.RUNTIME_ERROR,
|
|
419
|
+
},
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
// -- Format output from recipe result --
|
|
423
|
+
const { summary, checkResults, durationMs } = fitnessResult;
|
|
424
|
+
const score = summary.totalChecks > 0
|
|
425
|
+
? Math.round((summary.passedChecks / summary.totalChecks) * 100)
|
|
426
|
+
: 0;
|
|
427
|
+
// Build structured output
|
|
428
|
+
const output = {
|
|
429
|
+
version: '1.0',
|
|
430
|
+
tool: 'fit',
|
|
431
|
+
timestamp: new Date().toISOString(),
|
|
432
|
+
recipe: recipeName,
|
|
433
|
+
score,
|
|
434
|
+
passed: summary.failedChecks === 0 && pluginLoadErrors.length === 0,
|
|
435
|
+
summary: {
|
|
436
|
+
total: summary.totalChecks,
|
|
437
|
+
passed: summary.passedChecks,
|
|
438
|
+
failed: summary.failedChecks,
|
|
439
|
+
errors: summary.totalErrors,
|
|
440
|
+
warnings: summary.totalWarnings,
|
|
441
|
+
},
|
|
442
|
+
checks: checkResults.map(cr => ({
|
|
443
|
+
checkSlug: cr.checkSlug,
|
|
444
|
+
passed: cr.passed,
|
|
445
|
+
violationCount: cr.violationCount,
|
|
446
|
+
findings: (cr.violations ?? []).map(v => ({
|
|
447
|
+
ruleId: cr.checkSlug,
|
|
448
|
+
message: v.message,
|
|
449
|
+
severity: v.severity,
|
|
450
|
+
filePath: v.file,
|
|
451
|
+
line: v.line,
|
|
452
|
+
column: v.column,
|
|
453
|
+
suggestion: v.suggestion,
|
|
454
|
+
})),
|
|
455
|
+
durationMs: cr.durationMs,
|
|
456
|
+
})),
|
|
457
|
+
durationMs,
|
|
458
|
+
};
|
|
459
|
+
// Persist session for history and dashboard
|
|
460
|
+
try {
|
|
461
|
+
saveSession({
|
|
462
|
+
id: generateSessionId(),
|
|
463
|
+
tool: 'fit',
|
|
464
|
+
timestamp: output.timestamp,
|
|
465
|
+
cwd: args.cwd,
|
|
466
|
+
recipe: recipeName,
|
|
467
|
+
score,
|
|
468
|
+
passed: output.passed,
|
|
469
|
+
summary: output.summary,
|
|
470
|
+
checks: output.checks,
|
|
471
|
+
durationMs,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
catch {
|
|
475
|
+
// Best effort — don't fail the run if persistence fails
|
|
476
|
+
}
|
|
477
|
+
// Build table rows
|
|
478
|
+
const tableRows = checkResults.map(cr => ({
|
|
479
|
+
check: getCheckDisplayName(cr.checkSlug),
|
|
480
|
+
status: rowStatus(cr),
|
|
481
|
+
errors: cr.errorCount,
|
|
482
|
+
warnings: cr.warningCount,
|
|
483
|
+
validated: formatValidatedColumn(cr.totalItems, cr.itemType),
|
|
484
|
+
ignored: cr.ignoredCount,
|
|
485
|
+
duration: formatDuration(cr.durationMs),
|
|
486
|
+
durationMs: cr.durationMs,
|
|
487
|
+
}));
|
|
488
|
+
// Build summary
|
|
489
|
+
const summaryOpts = {
|
|
490
|
+
passed: summary.passedChecks,
|
|
491
|
+
failed: summary.failedChecks,
|
|
492
|
+
totalErrors: summary.totalErrors,
|
|
493
|
+
totalWarnings: summary.totalWarnings,
|
|
494
|
+
totalIgnored: summary.totalIgnored,
|
|
495
|
+
durationMs,
|
|
496
|
+
};
|
|
497
|
+
// Determine exit code from config thresholds
|
|
498
|
+
// failOnErrors: fail if total errors >= this value (default: 1, 0 = never fail on errors)
|
|
499
|
+
// failOnWarnings: fail if total warnings >= this value (default: 0 = never fail on warnings)
|
|
500
|
+
const failOnErrors = signalersConfig?.fitness.failOnErrors ?? 1;
|
|
501
|
+
const failOnWarnings = signalersConfig?.fitness.failOnWarnings ?? 0;
|
|
502
|
+
const shouldFail = pluginLoadErrors.length > 0 ||
|
|
503
|
+
(failOnErrors > 0 && summary.totalErrors >= failOnErrors) ||
|
|
504
|
+
(failOnWarnings > 0 && summary.totalWarnings >= failOnWarnings);
|
|
505
|
+
// Build findings if requested
|
|
506
|
+
let findings;
|
|
507
|
+
if ((args.findings || args.verbose) && (summary.totalErrors + summary.totalWarnings) > 0) {
|
|
508
|
+
findings = {
|
|
509
|
+
checks: checkResults
|
|
510
|
+
.filter(cr => cr.errorCount > 0 || cr.warningCount > 0 || cr.error)
|
|
511
|
+
.map(cr => ({
|
|
512
|
+
checkSlug: cr.checkSlug,
|
|
513
|
+
errorCount: cr.errorCount,
|
|
514
|
+
warningCount: cr.warningCount,
|
|
515
|
+
error: cr.error,
|
|
516
|
+
violations: cr.violations?.map(v => ({
|
|
517
|
+
severity: v.severity,
|
|
518
|
+
message: v.message,
|
|
519
|
+
file: v.file,
|
|
520
|
+
line: v.line,
|
|
521
|
+
suggestion: v.suggestion,
|
|
522
|
+
})),
|
|
523
|
+
})),
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
const result = {
|
|
527
|
+
type: 'fit-done',
|
|
528
|
+
rows: tableRows,
|
|
529
|
+
summary: summaryOpts,
|
|
530
|
+
label,
|
|
531
|
+
cwd: args.cwd,
|
|
532
|
+
findings,
|
|
533
|
+
shouldFail,
|
|
534
|
+
configFound,
|
|
535
|
+
};
|
|
536
|
+
logger.info({ evt: 'cli.fit.complete', module: 'cli:fit', score, passed: fitnessResult.success, totalChecks: summary.totalChecks, durationMs });
|
|
537
|
+
return { result, output };
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=fit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fit.js","sourceRoot":"","sources":["../../src/cli/fit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-checks.d.ts","sourceRoot":"","sources":["../../src/cli/list-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAMjE,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe/E"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list-checks command — list all available fitness checks
|
|
3
|
+
*/
|
|
4
|
+
import { defaultRegistry } from '../framework/registry.js';
|
|
5
|
+
import { ensureChecksLoaded } from './fit.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// listChecks
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export async function listChecks(projectDir) {
|
|
10
|
+
await ensureChecksLoaded(projectDir);
|
|
11
|
+
const checks = defaultRegistry.listEnabled();
|
|
12
|
+
const entries = checks.map((check) => ({
|
|
13
|
+
slug: check.config.slug,
|
|
14
|
+
description: check.config.description,
|
|
15
|
+
tags: [...(check.config.tags ?? ['untagged'])],
|
|
16
|
+
}));
|
|
17
|
+
return {
|
|
18
|
+
type: 'list-checks',
|
|
19
|
+
checks: entries,
|
|
20
|
+
totalCount: checks.length,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=list-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-checks.js","sourceRoot":"","sources":["../../src/cli/list-checks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAmB;IAClD,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QACvB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QACrC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;KAC/C,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,MAAM,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list-recipes command — list all available fitness recipes
|
|
3
|
+
*/
|
|
4
|
+
import type { ListRecipesResult } from '@opensip-tools/contracts';
|
|
5
|
+
export declare function listRecipes(projectDir?: string): Promise<ListRecipesResult>;
|
|
6
|
+
//# sourceMappingURL=list-recipes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-recipes.d.ts","sourceRoot":"","sources":["../../src/cli/list-recipes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,wBAAsB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqBjF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list-recipes command — list all available fitness recipes
|
|
3
|
+
*/
|
|
4
|
+
import { defaultRecipeRegistry } from '../recipes/registry.js';
|
|
5
|
+
import { ensureChecksLoaded } from './fit.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// listRecipes
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
export async function listRecipes(projectDir) {
|
|
10
|
+
// Load plugins so user-defined recipes (e.g. ~/.opensip-tools/fit/*.mjs) appear.
|
|
11
|
+
await ensureChecksLoaded(projectDir);
|
|
12
|
+
const recipes = defaultRecipeRegistry.getAllRecipes().map((recipe) => {
|
|
13
|
+
const selector = recipe.checks;
|
|
14
|
+
let checkCount;
|
|
15
|
+
if (selector.type === 'all') {
|
|
16
|
+
checkCount = 'all checks';
|
|
17
|
+
}
|
|
18
|
+
else if (selector.type === 'explicit') {
|
|
19
|
+
checkCount = `${selector.checkIds.length} checks`;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
checkCount = 'pattern-based';
|
|
23
|
+
}
|
|
24
|
+
return { name: recipe.name, description: recipe.description, checkCount };
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
type: 'list-recipes',
|
|
28
|
+
recipes,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=list-recipes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-recipes.js","sourceRoot":"","sources":["../../src/cli/list-recipes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAmB;IACnD,iFAAiF;IACjF,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAErC,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAC/B,IAAI,UAAkB,CAAC;QACvB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC5B,UAAU,GAAG,YAAY,CAAC;QAC5B,CAAC;aAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,UAAU,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,eAAe,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO;KACR,CAAC;AACJ,CAAC"}
|