@opensip-cli/fitness 0.1.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 +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/baseline-plane.test.d.ts +12 -0
- package/dist/__tests__/baseline-plane.test.d.ts.map +1 -0
- package/dist/__tests__/baseline-plane.test.js +63 -0
- package/dist/__tests__/baseline-plane.test.js.map +1 -0
- package/dist/__tests__/check-utils.test.d.ts +10 -0
- package/dist/__tests__/check-utils.test.d.ts.map +1 -0
- package/dist/__tests__/check-utils.test.js +193 -0
- package/dist/__tests__/check-utils.test.js.map +1 -0
- package/dist/__tests__/fingerprint-parity.test.d.ts +14 -0
- package/dist/__tests__/fingerprint-parity.test.d.ts.map +1 -0
- package/dist/__tests__/fingerprint-parity.test.js +59 -0
- package/dist/__tests__/fingerprint-parity.test.js.map +1 -0
- package/dist/__tests__/fit-execute-opts.test.d.ts +15 -0
- package/dist/__tests__/fit-execute-opts.test.d.ts.map +1 -0
- package/dist/__tests__/fit-execute-opts.test.js +124 -0
- package/dist/__tests__/fit-execute-opts.test.js.map +1 -0
- package/dist/__tests__/public-api.test.d.ts +19 -0
- package/dist/__tests__/public-api.test.d.ts.map +1 -0
- package/dist/__tests__/public-api.test.js +85 -0
- package/dist/__tests__/public-api.test.js.map +1 -0
- package/dist/__tests__/tool.test.d.ts +10 -0
- package/dist/__tests__/tool.test.d.ts.map +1 -0
- package/dist/__tests__/tool.test.js +57 -0
- package/dist/__tests__/tool.test.js.map +1 -0
- package/dist/baseline-strategy.d.ts +21 -0
- package/dist/baseline-strategy.d.ts.map +1 -0
- package/dist/baseline-strategy.js +21 -0
- package/dist/baseline-strategy.js.map +1 -0
- package/dist/check-utils/display.d.ts +52 -0
- package/dist/check-utils/display.d.ts.map +1 -0
- package/dist/check-utils/display.js +66 -0
- package/dist/check-utils/display.js.map +1 -0
- package/dist/check-utils/index.d.ts +17 -0
- package/dist/check-utils/index.d.ts.map +1 -0
- package/dist/check-utils/index.js +13 -0
- package/dist/check-utils/index.js.map +1 -0
- package/dist/check-utils/path-matching.d.ts +40 -0
- package/dist/check-utils/path-matching.d.ts.map +1 -0
- package/dist/check-utils/path-matching.js +38 -0
- package/dist/check-utils/path-matching.js.map +1 -0
- package/dist/check-utils/source-analysis.d.ts +36 -0
- package/dist/check-utils/source-analysis.d.ts.map +1 -0
- package/dist/check-utils/source-analysis.js +44 -0
- package/dist/check-utils/source-analysis.js.map +1 -0
- package/dist/check-utils/test-helpers.d.ts +57 -0
- package/dist/check-utils/test-helpers.d.ts.map +1 -0
- package/dist/check-utils/test-helpers.js +71 -0
- package/dist/check-utils/test-helpers.js.map +1 -0
- package/dist/cli/__tests__/fit-gate-mode.test.d.ts +14 -0
- package/dist/cli/__tests__/fit-gate-mode.test.d.ts.map +1 -0
- package/dist/cli/__tests__/fit-gate-mode.test.js +110 -0
- package/dist/cli/__tests__/fit-gate-mode.test.js.map +1 -0
- package/dist/cli/__tests__/fit-modes-live.test.d.ts +13 -0
- package/dist/cli/__tests__/fit-modes-live.test.d.ts.map +1 -0
- package/dist/cli/__tests__/fit-modes-live.test.js +182 -0
- package/dist/cli/__tests__/fit-modes-live.test.js.map +1 -0
- package/dist/cli/__tests__/report-data.test.d.ts +12 -0
- package/dist/cli/__tests__/report-data.test.d.ts.map +1 -0
- package/dist/cli/__tests__/report-data.test.js +113 -0
- package/dist/cli/__tests__/report-data.test.js.map +1 -0
- package/dist/cli/fit/__tests__/display-fold.test.d.ts +8 -0
- package/dist/cli/fit/__tests__/display-fold.test.d.ts.map +1 -0
- package/dist/cli/fit/__tests__/display-fold.test.js +87 -0
- package/dist/cli/fit/__tests__/display-fold.test.js.map +1 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts +16 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.d.ts.map +1 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.js +62 -0
- package/dist/cli/fit/__tests__/gate-resolved-config.test.js.map +1 -0
- package/dist/cli/fit/check-loader.d.ts +37 -0
- package/dist/cli/fit/check-loader.d.ts.map +1 -0
- package/dist/cli/fit/check-loader.js +154 -0
- package/dist/cli/fit/check-loader.js.map +1 -0
- package/dist/cli/fit/config-loader.d.ts +55 -0
- package/dist/cli/fit/config-loader.d.ts.map +1 -0
- package/dist/cli/fit/config-loader.js +107 -0
- package/dist/cli/fit/config-loader.js.map +1 -0
- package/dist/cli/fit/display-registry.d.ts +19 -0
- package/dist/cli/fit/display-registry.d.ts.map +1 -0
- package/dist/cli/fit/display-registry.js +33 -0
- package/dist/cli/fit/display-registry.js.map +1 -0
- package/dist/cli/fit/envelope-view.d.ts +49 -0
- package/dist/cli/fit/envelope-view.d.ts.map +1 -0
- package/dist/cli/fit/envelope-view.js +85 -0
- package/dist/cli/fit/envelope-view.js.map +1 -0
- package/dist/cli/fit/fit-aux-command-specs.d.ts +35 -0
- package/dist/cli/fit/fit-aux-command-specs.d.ts.map +1 -0
- package/dist/cli/fit/fit-aux-command-specs.js +110 -0
- package/dist/cli/fit/fit-aux-command-specs.js.map +1 -0
- package/dist/cli/fit/fit-command-spec.d.ts +24 -0
- package/dist/cli/fit/fit-command-spec.d.ts.map +1 -0
- package/dist/cli/fit/fit-command-spec.js +131 -0
- package/dist/cli/fit/fit-command-spec.js.map +1 -0
- package/dist/cli/fit/gate-compare-render.d.ts +13 -0
- package/dist/cli/fit/gate-compare-render.d.ts.map +1 -0
- package/dist/cli/fit/gate-compare-render.js +87 -0
- package/dist/cli/fit/gate-compare-render.js.map +1 -0
- package/dist/cli/fit/recipe-selector.d.ts +53 -0
- package/dist/cli/fit/recipe-selector.d.ts.map +1 -0
- package/dist/cli/fit/recipe-selector.js +106 -0
- package/dist/cli/fit/recipe-selector.js.map +1 -0
- package/dist/cli/fit/recipe-selector.test.d.ts +2 -0
- package/dist/cli/fit/recipe-selector.test.d.ts.map +1 -0
- package/dist/cli/fit/recipe-selector.test.js +69 -0
- package/dist/cli/fit/recipe-selector.test.js.map +1 -0
- package/dist/cli/fit/resolved-fitness-config.d.ts +48 -0
- package/dist/cli/fit/resolved-fitness-config.d.ts.map +1 -0
- package/dist/cli/fit/resolved-fitness-config.js +46 -0
- package/dist/cli/fit/resolved-fitness-config.js.map +1 -0
- package/dist/cli/fit/result-builders.d.ts +91 -0
- package/dist/cli/fit/result-builders.d.ts.map +1 -0
- package/dist/cli/fit/result-builders.js +206 -0
- package/dist/cli/fit/result-builders.js.map +1 -0
- package/dist/cli/fit-list.d.ts +7 -0
- package/dist/cli/fit-list.d.ts.map +1 -0
- package/dist/cli/fit-list.js +24 -0
- package/dist/cli/fit-list.js.map +1 -0
- package/dist/cli/fit-modes.d.ts +42 -0
- package/dist/cli/fit-modes.d.ts.map +1 -0
- package/dist/cli/fit-modes.js +322 -0
- package/dist/cli/fit-modes.js.map +1 -0
- package/dist/cli/fit-recipes.d.ts +7 -0
- package/dist/cli/fit-recipes.d.ts.map +1 -0
- package/dist/cli/fit-recipes.js +34 -0
- package/dist/cli/fit-recipes.js.map +1 -0
- package/dist/cli/fit-runner-views.d.ts +33 -0
- package/dist/cli/fit-runner-views.d.ts.map +1 -0
- package/dist/cli/fit-runner-views.js +92 -0
- package/dist/cli/fit-runner-views.js.map +1 -0
- package/dist/cli/fit-runner.d.ts +44 -0
- package/dist/cli/fit-runner.d.ts.map +1 -0
- package/dist/cli/fit-runner.js +250 -0
- package/dist/cli/fit-runner.js.map +1 -0
- package/dist/cli/fit-worker.d.ts +26 -0
- package/dist/cli/fit-worker.d.ts.map +1 -0
- package/dist/cli/fit-worker.js +67 -0
- package/dist/cli/fit-worker.js.map +1 -0
- package/dist/cli/fit.d.ts +74 -0
- package/dist/cli/fit.d.ts.map +1 -0
- package/dist/cli/fit.js +149 -0
- package/dist/cli/fit.js.map +1 -0
- package/dist/cli/report-data.d.ts +44 -0
- package/dist/cli/report-data.d.ts.map +1 -0
- package/dist/cli/report-data.js +89 -0
- package/dist/cli/report-data.js.map +1 -0
- package/dist/config/__tests__/fitness-config-schema.test.d.ts +6 -0
- package/dist/config/__tests__/fitness-config-schema.test.d.ts.map +1 -0
- package/dist/config/__tests__/fitness-config-schema.test.js +37 -0
- package/dist/config/__tests__/fitness-config-schema.test.js.map +1 -0
- package/dist/config/fitness-config-schema.d.ts +48 -0
- package/dist/config/fitness-config-schema.d.ts.map +1 -0
- package/dist/config/fitness-config-schema.js +62 -0
- package/dist/config/fitness-config-schema.js.map +1 -0
- package/dist/framework/__tests__/abortable-exec.test.d.ts +9 -0
- package/dist/framework/__tests__/abortable-exec.test.d.ts.map +1 -0
- package/dist/framework/__tests__/abortable-exec.test.js +102 -0
- package/dist/framework/__tests__/abortable-exec.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__/check-types.test.d.ts +2 -0
- package/dist/framework/__tests__/check-types.test.d.ts.map +1 -0
- package/dist/framework/__tests__/check-types.test.js +76 -0
- package/dist/framework/__tests__/check-types.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 +110 -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 +122 -0
- package/dist/framework/__tests__/content-filter-dispatch.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 +402 -0
- package/dist/framework/__tests__/define-check.test.js.map +1 -0
- package/dist/framework/__tests__/define-regex-list-check.test.d.ts +15 -0
- package/dist/framework/__tests__/define-regex-list-check.test.d.ts.map +1 -0
- package/dist/framework/__tests__/define-regex-list-check.test.js +299 -0
- package/dist/framework/__tests__/define-regex-list-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 +111 -0
- package/dist/framework/__tests__/directive-inventory.test.js.map +1 -0
- package/dist/framework/__tests__/directive-parsing.test.d.ts +13 -0
- package/dist/framework/__tests__/directive-parsing.test.d.ts.map +1 -0
- package/dist/framework/__tests__/directive-parsing.test.js +86 -0
- package/dist/framework/__tests__/directive-parsing.test.js.map +1 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts +2 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.d.ts.map +1 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.test.js +56 -0
- package/dist/framework/__tests__/execution-context.globalexcludes-parity.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 +140 -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__/file-type-filter.test.d.ts +9 -0
- package/dist/framework/__tests__/file-type-filter.test.d.ts.map +1 -0
- package/dist/framework/__tests__/file-type-filter.test.js +39 -0
- package/dist/framework/__tests__/file-type-filter.test.js.map +1 -0
- package/dist/framework/__tests__/ignore-processing.test.d.ts +11 -0
- package/dist/framework/__tests__/ignore-processing.test.d.ts.map +1 -0
- package/dist/framework/__tests__/ignore-processing.test.js +175 -0
- package/dist/framework/__tests__/ignore-processing.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__/memory-profiler.test.d.ts +9 -0
- package/dist/framework/__tests__/memory-profiler.test.d.ts.map +1 -0
- package/dist/framework/__tests__/memory-profiler.test.js +108 -0
- package/dist/framework/__tests__/memory-profiler.test.js.map +1 -0
- package/dist/framework/__tests__/parse-cache.test.d.ts +9 -0
- package/dist/framework/__tests__/parse-cache.test.d.ts.map +1 -0
- package/dist/framework/__tests__/parse-cache.test.js +51 -0
- package/dist/framework/__tests__/parse-cache.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 +51 -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 +211 -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-registry.test.d.ts +8 -0
- package/dist/framework/__tests__/scope-registry.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-registry.test.js +156 -0
- package/dist/framework/__tests__/scope-registry.test.js.map +1 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.d.ts +2 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.d.ts.map +1 -0
- package/dist/framework/__tests__/scope-resolver.golden.test.js +105 -0
- package/dist/framework/__tests__/scope-resolver.golden.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 +150 -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 +74 -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 +143 -0
- package/dist/framework/abortable-exec.js.map +1 -0
- package/dist/framework/check-config.d.ts +175 -0
- package/dist/framework/check-config.d.ts.map +1 -0
- package/dist/framework/check-config.js +115 -0
- package/dist/framework/check-config.js.map +1 -0
- package/dist/framework/check-types.d.ts +82 -0
- package/dist/framework/check-types.d.ts.map +1 -0
- package/dist/framework/check-types.js +63 -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/comment-openers.d.ts +11 -0
- package/dist/framework/comment-openers.d.ts.map +1 -0
- package/dist/framework/comment-openers.js +11 -0
- package/dist/framework/comment-openers.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/define-check.d.ts +38 -0
- package/dist/framework/define-check.d.ts.map +1 -0
- package/dist/framework/define-check.js +296 -0
- package/dist/framework/define-check.js.map +1 -0
- package/dist/framework/define-regex-list-check.d.ts +160 -0
- package/dist/framework/define-regex-list-check.d.ts.map +1 -0
- package/dist/framework/define-regex-list-check.js +177 -0
- package/dist/framework/define-regex-list-check.js.map +1 -0
- package/dist/framework/directive-inventory.d.ts +37 -0
- package/dist/framework/directive-inventory.d.ts.map +1 -0
- package/dist/framework/directive-inventory.js +82 -0
- package/dist/framework/directive-inventory.js.map +1 -0
- package/dist/framework/directive-parsing.d.ts +23 -0
- package/dist/framework/directive-parsing.d.ts.map +1 -0
- package/dist/framework/directive-parsing.js +39 -0
- package/dist/framework/directive-parsing.js.map +1 -0
- package/dist/framework/execution-context.d.ts +98 -0
- package/dist/framework/execution-context.d.ts.map +1 -0
- package/dist/framework/execution-context.js +145 -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 +199 -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 +36 -0
- package/dist/framework/ignore-processing.d.ts.map +1 -0
- package/dist/framework/ignore-processing.js +172 -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 +217 -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 +24 -0
- package/dist/framework/parse-cache.d.ts.map +1 -0
- package/dist/framework/parse-cache.js +41 -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 +11 -0
- package/dist/framework/register-helpers.d.ts.map +1 -0
- package/dist/framework/register-helpers.js +19 -0
- package/dist/framework/register-helpers.js.map +1 -0
- package/dist/framework/registry.d.ts +51 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +131 -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-registry.d.ts +38 -0
- package/dist/framework/scope-registry.d.ts.map +1 -0
- package/dist/framework/scope-registry.js +77 -0
- package/dist/framework/scope-registry.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 +102 -0
- package/dist/framework/scope-resolver.js.map +1 -0
- package/dist/framework/severity-mapping.d.ts +17 -0
- package/dist/framework/severity-mapping.d.ts.map +1 -0
- package/dist/framework/severity-mapping.js +71 -0
- package/dist/framework/severity-mapping.js.map +1 -0
- package/dist/framework/strip-literals.d.ts +73 -0
- package/dist/framework/strip-literals.d.ts.map +1 -0
- package/dist/framework/strip-literals.js +213 -0
- package/dist/framework/strip-literals.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +17 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +17 -0
- package/dist/internal.js.map +1 -0
- package/dist/persistence/session-payload.d.ts +68 -0
- package/dist/persistence/session-payload.d.ts.map +1 -0
- package/dist/persistence/session-payload.js +78 -0
- package/dist/persistence/session-payload.js.map +1 -0
- package/dist/persistence/session-payload.test.d.ts +11 -0
- package/dist/persistence/session-payload.test.d.ts.map +1 -0
- package/dist/persistence/session-payload.test.js +80 -0
- package/dist/persistence/session-payload.test.js.map +1 -0
- package/dist/persistence/session-replay.d.ts +14 -0
- package/dist/persistence/session-replay.d.ts.map +1 -0
- package/dist/persistence/session-replay.js +85 -0
- package/dist/persistence/session-replay.js.map +1 -0
- package/dist/persistence/session-replay.test.d.ts +10 -0
- package/dist/persistence/session-replay.test.d.ts.map +1 -0
- package/dist/persistence/session-replay.test.js +171 -0
- package/dist/persistence/session-replay.test.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 +48 -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 +192 -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 +271 -0
- package/dist/plugins/__tests__/loader.test.js.map +1 -0
- package/dist/plugins/check-package-discovery.d.ts +19 -0
- package/dist/plugins/check-package-discovery.d.ts.map +1 -0
- package/dist/plugins/check-package-discovery.js +34 -0
- package/dist/plugins/check-package-discovery.js.map +1 -0
- package/dist/plugins/loader.d.ts +32 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +198 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +29 -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 +12 -0
- package/dist/recipes/__tests__/check-config.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/check-config.test.js +90 -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 +160 -0
- package/dist/recipes/__tests__/check-resolution.test.js.map +1 -0
- package/dist/recipes/__tests__/execution-branches.test.d.ts +10 -0
- package/dist/recipes/__tests__/execution-branches.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/execution-branches.test.js +612 -0
- package/dist/recipes/__tests__/execution-branches.test.js.map +1 -0
- package/dist/recipes/__tests__/execution-paths.test.d.ts +10 -0
- package/dist/recipes/__tests__/execution-paths.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/execution-paths.test.js +280 -0
- package/dist/recipes/__tests__/execution-paths.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 +89 -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__/run-one-check.test.d.ts +14 -0
- package/dist/recipes/__tests__/run-one-check.test.d.ts.map +1 -0
- package/dist/recipes/__tests__/run-one-check.test.js +182 -0
- package/dist/recipes/__tests__/run-one-check.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 +572 -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 +241 -0
- package/dist/recipes/built-in-recipes.js.map +1 -0
- package/dist/recipes/check-config.d.ts +56 -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 +36 -0
- package/dist/recipes/check-resolution.d.ts.map +1 -0
- package/dist/recipes/check-resolution.js +81 -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 +197 -0
- package/dist/recipes/check-result-processor.js.map +1 -0
- package/dist/recipes/parallel-execution.d.ts +38 -0
- package/dist/recipes/parallel-execution.d.ts.map +1 -0
- package/dist/recipes/parallel-execution.js +61 -0
- package/dist/recipes/parallel-execution.js.map +1 -0
- package/dist/recipes/registry.d.ts +47 -0
- package/dist/recipes/registry.d.ts.map +1 -0
- package/dist/recipes/registry.js +70 -0
- package/dist/recipes/registry.js.map +1 -0
- package/dist/recipes/retry.d.ts +29 -0
- package/dist/recipes/retry.d.ts.map +1 -0
- package/dist/recipes/retry.js +23 -0
- package/dist/recipes/retry.js.map +1 -0
- package/dist/recipes/run-one-check.d.ts +59 -0
- package/dist/recipes/run-one-check.d.ts.map +1 -0
- package/dist/recipes/run-one-check.js +174 -0
- package/dist/recipes/run-one-check.js.map +1 -0
- package/dist/recipes/sequential-execution.d.ts +12 -0
- package/dist/recipes/sequential-execution.d.ts.map +1 -0
- package/dist/recipes/sequential-execution.js +48 -0
- package/dist/recipes/sequential-execution.js.map +1 -0
- package/dist/recipes/service-types.d.ts +87 -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 +73 -0
- package/dist/recipes/service.d.ts.map +1 -0
- package/dist/recipes/service.js +438 -0
- package/dist/recipes/service.js.map +1 -0
- package/dist/recipes/types.d.ts +155 -0
- package/dist/recipes/types.d.ts.map +1 -0
- package/dist/recipes/types.js +56 -0
- package/dist/recipes/types.js.map +1 -0
- package/dist/scaffold/config-block.d.ts +17 -0
- package/dist/scaffold/config-block.d.ts.map +1 -0
- package/dist/scaffold/config-block.js +30 -0
- package/dist/scaffold/config-block.js.map +1 -0
- package/dist/scaffold/examples.d.ts +30 -0
- package/dist/scaffold/examples.d.ts.map +1 -0
- package/dist/scaffold/examples.js +129 -0
- package/dist/scaffold/examples.js.map +1 -0
- package/dist/scope-augmentation.d.ts +77 -0
- package/dist/scope-augmentation.d.ts.map +1 -0
- package/dist/scope-augmentation.js +31 -0
- package/dist/scope-augmentation.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 +141 -0
- package/dist/signalers/__tests__/loader.test.js.map +1 -0
- package/dist/signalers/__tests__/violation-to-signal.test.d.ts +2 -0
- package/dist/signalers/__tests__/violation-to-signal.test.d.ts.map +1 -0
- package/dist/signalers/__tests__/violation-to-signal.test.js +59 -0
- package/dist/signalers/__tests__/violation-to-signal.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 +30 -0
- package/dist/signalers/loader.d.ts.map +1 -0
- package/dist/signalers/loader.js +120 -0
- package/dist/signalers/loader.js.map +1 -0
- package/dist/signalers/schema.d.ts +60 -0
- package/dist/signalers/schema.d.ts.map +1 -0
- package/dist/signalers/schema.js +74 -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/signalers/violation-to-signal.d.ts +38 -0
- package/dist/signalers/violation-to-signal.d.ts.map +1 -0
- package/dist/signalers/violation-to-signal.js +43 -0
- package/dist/signalers/violation-to-signal.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 +190 -0
- package/dist/targets/__tests__/loader.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 +182 -0
- package/dist/targets/__tests__/target-registry.test.js.map +1 -0
- package/dist/targets/index.d.ts +18 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +21 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/loader.d.ts +27 -0
- package/dist/targets/loader.d.ts.map +1 -0
- package/dist/targets/loader.js +178 -0
- package/dist/targets/loader.js.map +1 -0
- package/dist/targets/target-registry.d.ts +41 -0
- package/dist/targets/target-registry.d.ts.map +1 -0
- package/dist/targets/target-registry.js +71 -0
- package/dist/targets/target-registry.js.map +1 -0
- package/dist/targets/types.d.ts +14 -0
- package/dist/targets/types.d.ts.map +1 -0
- package/dist/targets/types.js +14 -0
- package/dist/targets/types.js.map +1 -0
- package/dist/tool.d.ts +61 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +260 -0
- package/dist/tool.js.map +1 -0
- package/dist/types/findings.d.ts +113 -0
- package/dist/types/findings.d.ts.map +1 -0
- package/dist/types/findings.js +89 -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 +33 -0
- package/dist/types/severity.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview fit's gate-compare human renderer (ADR-0036).
|
|
3
|
+
*
|
|
4
|
+
* Renders the generic host `GateCompareResult` (full-`Signal` added/resolved/
|
|
5
|
+
* unchanged buckets) to fit's plain-text gate-compare report. Byte-preserved from
|
|
6
|
+
* the pre-ADR-0036 `gate.ts` `renderGateCompareOutput` — only the bucket element
|
|
7
|
+
* type changed (`GateViolation` → `Signal`), and `Signal` carries the same
|
|
8
|
+
* `ruleId`/`filePath`/`line`/`message` fields the old renderer read.
|
|
9
|
+
*/
|
|
10
|
+
import type { GateCompareResult } from '@opensip-cli/core';
|
|
11
|
+
/** Render fit's gate-compare report. Byte-preserved from the old gate.ts renderer. */
|
|
12
|
+
export declare function renderGateCompareOutput(result: GateCompareResult): string;
|
|
13
|
+
//# sourceMappingURL=gate-compare-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-compare-render.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/gate-compare-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,mBAAmB,CAAC;AAkEnE,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CASzE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview fit's gate-compare human renderer (ADR-0036).
|
|
3
|
+
*
|
|
4
|
+
* Renders the generic host `GateCompareResult` (full-`Signal` added/resolved/
|
|
5
|
+
* unchanged buckets) to fit's plain-text gate-compare report. Byte-preserved from
|
|
6
|
+
* the pre-ADR-0036 `gate.ts` `renderGateCompareOutput` — only the bucket element
|
|
7
|
+
* type changed (`GateViolation` → `Signal`), and `Signal` carries the same
|
|
8
|
+
* `ruleId`/`filePath`/`line`/`message` fields the old renderer read.
|
|
9
|
+
*/
|
|
10
|
+
function formatLocation(s) {
|
|
11
|
+
if (!s.filePath)
|
|
12
|
+
return '(no location)';
|
|
13
|
+
return s.line == null ? s.filePath : `${s.filePath}:${s.line}`;
|
|
14
|
+
}
|
|
15
|
+
function sortSignals(signals) {
|
|
16
|
+
return [...signals].sort((a, b) => {
|
|
17
|
+
if (a.ruleId !== b.ruleId)
|
|
18
|
+
return a.ruleId.localeCompare(b.ruleId);
|
|
19
|
+
if (a.filePath !== b.filePath)
|
|
20
|
+
return a.filePath.localeCompare(b.filePath);
|
|
21
|
+
return (a.line ?? 0) - (b.line ?? 0);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function truncate(s, max) {
|
|
25
|
+
if (s.length <= max)
|
|
26
|
+
return s;
|
|
27
|
+
return s.slice(0, max - 1) + '…';
|
|
28
|
+
}
|
|
29
|
+
/** `Added (n):` block — each entry plus its (truncated) message line. */
|
|
30
|
+
function renderAdded(added) {
|
|
31
|
+
if (added.length === 0)
|
|
32
|
+
return [];
|
|
33
|
+
const lines = [`Added (${added.length}):`];
|
|
34
|
+
for (const v of sortSignals(added)) {
|
|
35
|
+
lines.push(` ✗ ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
|
|
36
|
+
if (v.message && v.message !== v.ruleId)
|
|
37
|
+
lines.push(` ${truncate(v.message, 120)}`);
|
|
38
|
+
}
|
|
39
|
+
lines.push('');
|
|
40
|
+
return lines;
|
|
41
|
+
}
|
|
42
|
+
/** `Resolved (n):` block. */
|
|
43
|
+
function renderResolved(resolved) {
|
|
44
|
+
if (resolved.length === 0)
|
|
45
|
+
return [];
|
|
46
|
+
const lines = [`Resolved (${resolved.length}):`];
|
|
47
|
+
for (const v of sortSignals(resolved))
|
|
48
|
+
lines.push(` ✓ ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
|
|
49
|
+
lines.push('');
|
|
50
|
+
return lines;
|
|
51
|
+
}
|
|
52
|
+
/** `Unchanged (n):` block — truncated to the first 5 (usually long, not actionable). */
|
|
53
|
+
function renderUnchanged(unchanged) {
|
|
54
|
+
if (unchanged.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const lines = [`Unchanged (${unchanged.length}):`];
|
|
57
|
+
const sample = sortSignals(unchanged).slice(0, 5);
|
|
58
|
+
for (const v of sample)
|
|
59
|
+
lines.push(` · ${v.ruleId.padEnd(40)} ${formatLocation(v)}`);
|
|
60
|
+
if (unchanged.length > sample.length) {
|
|
61
|
+
lines.push(` · ... and ${unchanged.length - sample.length} more`);
|
|
62
|
+
}
|
|
63
|
+
lines.push('');
|
|
64
|
+
return lines;
|
|
65
|
+
}
|
|
66
|
+
/** The verdict footer (`DEGRADED` / `IMPROVED` / `STABLE`). */
|
|
67
|
+
function renderVerdict(result) {
|
|
68
|
+
if (result.degraded) {
|
|
69
|
+
return `✗ DEGRADED — ${result.added.length} new violation${result.added.length === 1 ? '' : 's'}`;
|
|
70
|
+
}
|
|
71
|
+
if (result.resolved.length > 0) {
|
|
72
|
+
return `✓ IMPROVED — ${result.resolved.length} violation${result.resolved.length === 1 ? '' : 's'} resolved, none added`;
|
|
73
|
+
}
|
|
74
|
+
return `✓ STABLE — no change`;
|
|
75
|
+
}
|
|
76
|
+
/** Render fit's gate-compare report. Byte-preserved from the old gate.ts renderer. */
|
|
77
|
+
export function renderGateCompareOutput(result) {
|
|
78
|
+
return [
|
|
79
|
+
'opensip gate compare',
|
|
80
|
+
'',
|
|
81
|
+
...renderAdded(result.added),
|
|
82
|
+
...renderResolved(result.resolved),
|
|
83
|
+
...renderUnchanged(result.unchanged),
|
|
84
|
+
renderVerdict(result),
|
|
85
|
+
].join('\n');
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=gate-compare-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-compare-render.js","sourceRoot":"","sources":["../../../src/cli/fit/gate-compare-render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recipe-pick + recipe-run helpers for the `fit` command.
|
|
3
|
+
*
|
|
4
|
+
* `selectRecipe()` decides between a named recipe (looked up in the
|
|
5
|
+
* current scope's recipe registry) and an ad-hoc recipe constructed from
|
|
6
|
+
* `--check` / `--tags`. `runRecipeOrAdHoc()` then executes the chosen
|
|
7
|
+
* shape via `FitnessRecipeService`.
|
|
8
|
+
*/
|
|
9
|
+
import { FitnessRecipeService } from '../../recipes/service.js';
|
|
10
|
+
import type { FitnessRecipeResult } from '../../recipes/types.js';
|
|
11
|
+
import type { ErrorResult, FitOptions } from '@opensip-cli/contracts';
|
|
12
|
+
/**
|
|
13
|
+
* Tool-scoped recipe defaults for `fit` (ADR-0022), read from the project
|
|
14
|
+
* config by the caller: `toolRecipe` is `fitness.recipe`.
|
|
15
|
+
*/
|
|
16
|
+
export interface FitRecipeDefaults {
|
|
17
|
+
readonly toolRecipe?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Flatten the (repeatable, possibly comma-separated) `--tags` values into a
|
|
21
|
+
* trimmed, non-empty tag-filter list. `--tags a,b --tags c` → `['a','b','c']`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function tagFiltersFrom(tags: readonly string[] | undefined): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Decide which recipe to execute. `--check` and `--tags` each create an
|
|
26
|
+
* ad-hoc recipe (recipeName=undefined); otherwise resolve a named recipe with
|
|
27
|
+
* tool-scoped precedence (ADR-0022): `--recipe` flag > `fitness.recipe` >
|
|
28
|
+
* built-in `default`. A config-sourced unknown name tolerantly falls back to
|
|
29
|
+
* `default` with a warning (the default may belong to another tool); an explicit
|
|
30
|
+
* `--recipe` typo returns an `ErrorResult`.
|
|
31
|
+
*
|
|
32
|
+
* **Precondition:** must run *after* `ensureChecksLoaded` so that any
|
|
33
|
+
* user-defined recipes (loaded as `.mjs` plugins under
|
|
34
|
+
* `<cwd>/opensip-cli/fit/recipes/`) are present in the scope's recipe
|
|
35
|
+
* registry by the time the lookup runs. Inverting the two
|
|
36
|
+
* lines silently breaks recipe lookup for plugin-provided recipes.
|
|
37
|
+
*/
|
|
38
|
+
export declare function selectRecipe(args: FitOptions, defaults?: FitRecipeDefaults): {
|
|
39
|
+
recipeName: string | undefined;
|
|
40
|
+
} | {
|
|
41
|
+
error: ErrorResult;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Run the recipe (or ad-hoc selector built from `--check` / `--tags`).
|
|
45
|
+
*
|
|
46
|
+
* @throws {Error} When neither `args.check` nor `args.tags` is set but
|
|
47
|
+
* `recipeName` is `undefined` — an invariant violation in the caller
|
|
48
|
+
* (`selectRecipe` returns `recipeName` non-`undefined` in that branch).
|
|
49
|
+
*/
|
|
50
|
+
export declare function runRecipeOrAdHoc(service: FitnessRecipeService, args: FitOptions, recipeName: string | undefined): Promise<FitnessRecipeResult | {
|
|
51
|
+
error: ErrorResult;
|
|
52
|
+
}>;
|
|
53
|
+
//# sourceMappingURL=recipe-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-selector.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,EAAE,CAK5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,iBAAsB,GAC/B;IAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAiC7D;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,mBAAmB,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CA6BvD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recipe-pick + recipe-run helpers for the `fit` command.
|
|
3
|
+
*
|
|
4
|
+
* `selectRecipe()` decides between a named recipe (looked up in the
|
|
5
|
+
* current scope's recipe registry) and an ad-hoc recipe constructed from
|
|
6
|
+
* `--check` / `--tags`. `runRecipeOrAdHoc()` then executes the chosen
|
|
7
|
+
* shape via `FitnessRecipeService`.
|
|
8
|
+
*/
|
|
9
|
+
import { BUILTIN_DEFAULT_RECIPE, EXIT_CODES, resolveToolRecipeName } from '@opensip-cli/contracts';
|
|
10
|
+
import { ConfigurationError, logger } from '@opensip-cli/core';
|
|
11
|
+
import { currentRecipeRegistry } from '../../framework/scope-registry.js';
|
|
12
|
+
import { FitnessRecipeService } from '../../recipes/service.js';
|
|
13
|
+
/**
|
|
14
|
+
* Flatten the (repeatable, possibly comma-separated) `--tags` values into a
|
|
15
|
+
* trimmed, non-empty tag-filter list. `--tags a,b --tags c` → `['a','b','c']`.
|
|
16
|
+
*/
|
|
17
|
+
export function tagFiltersFrom(tags) {
|
|
18
|
+
return (tags ?? [])
|
|
19
|
+
.flatMap((t) => t.split(','))
|
|
20
|
+
.map((t) => t.trim())
|
|
21
|
+
.filter(Boolean);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Decide which recipe to execute. `--check` and `--tags` each create an
|
|
25
|
+
* ad-hoc recipe (recipeName=undefined); otherwise resolve a named recipe with
|
|
26
|
+
* tool-scoped precedence (ADR-0022): `--recipe` flag > `fitness.recipe` >
|
|
27
|
+
* built-in `default`. A config-sourced unknown name tolerantly falls back to
|
|
28
|
+
* `default` with a warning (the default may belong to another tool); an explicit
|
|
29
|
+
* `--recipe` typo returns an `ErrorResult`.
|
|
30
|
+
*
|
|
31
|
+
* **Precondition:** must run *after* `ensureChecksLoaded` so that any
|
|
32
|
+
* user-defined recipes (loaded as `.mjs` plugins under
|
|
33
|
+
* `<cwd>/opensip-cli/fit/recipes/`) are present in the scope's recipe
|
|
34
|
+
* registry by the time the lookup runs. Inverting the two
|
|
35
|
+
* lines silently breaks recipe lookup for plugin-provided recipes.
|
|
36
|
+
*/
|
|
37
|
+
export function selectRecipe(args, defaults = {}) {
|
|
38
|
+
const useAdHoc = args.check != null || tagFiltersFrom(args.tags).length > 0;
|
|
39
|
+
if (useAdHoc)
|
|
40
|
+
return { recipeName: undefined };
|
|
41
|
+
const resolved = resolveToolRecipeName({
|
|
42
|
+
explicit: args.recipe,
|
|
43
|
+
toolRecipe: defaults.toolRecipe,
|
|
44
|
+
});
|
|
45
|
+
if (!currentRecipeRegistry().has(resolved.name)) {
|
|
46
|
+
// Config-sourced unknown name → fall back to the built-in default rather
|
|
47
|
+
// than abort (it may be a shared/cross-tool default targeting another tool).
|
|
48
|
+
if (resolved.tolerant && resolved.name !== BUILTIN_DEFAULT_RECIPE) {
|
|
49
|
+
logger.warn({
|
|
50
|
+
evt: 'fit.recipe.unknown_config_default',
|
|
51
|
+
module: 'cli:fit',
|
|
52
|
+
requested: resolved.name,
|
|
53
|
+
fallback: BUILTIN_DEFAULT_RECIPE,
|
|
54
|
+
msg: `Configured fit recipe '${resolved.name}' not found; using '${BUILTIN_DEFAULT_RECIPE}'. If '${resolved.name}' is a recipe for another tool, move it under that tool's <tool>.recipe key (ADR-0022).`,
|
|
55
|
+
});
|
|
56
|
+
return { recipeName: BUILTIN_DEFAULT_RECIPE };
|
|
57
|
+
}
|
|
58
|
+
// Explicit --recipe typo → hard error (unchanged typo protection).
|
|
59
|
+
return {
|
|
60
|
+
error: {
|
|
61
|
+
type: 'error',
|
|
62
|
+
message: `Unknown recipe '${resolved.name}'.`,
|
|
63
|
+
suggestion: 'Run opensip fit --recipes to see available recipes.',
|
|
64
|
+
exitCode: EXIT_CODES.CONFIGURATION_ERROR,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { recipeName: resolved.name };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Run the recipe (or ad-hoc selector built from `--check` / `--tags`).
|
|
72
|
+
*
|
|
73
|
+
* @throws {Error} When neither `args.check` nor `args.tags` is set but
|
|
74
|
+
* `recipeName` is `undefined` — an invariant violation in the caller
|
|
75
|
+
* (`selectRecipe` returns `recipeName` non-`undefined` in that branch).
|
|
76
|
+
*/
|
|
77
|
+
export async function runRecipeOrAdHoc(service, args, recipeName) {
|
|
78
|
+
try {
|
|
79
|
+
if (args.check) {
|
|
80
|
+
return await service.start(FitnessRecipeService.createAdHocRecipe({ check: args.check }));
|
|
81
|
+
}
|
|
82
|
+
const tagFilters = tagFiltersFrom(args.tags);
|
|
83
|
+
if (tagFilters.length > 0) {
|
|
84
|
+
return await service.start(FitnessRecipeService.createAdHocRecipe({ tagFilters }));
|
|
85
|
+
}
|
|
86
|
+
// selectRecipe sets recipeName to undefined only when args.check or
|
|
87
|
+
// args.tags are present — both of which return earlier in this function.
|
|
88
|
+
// Guard explicitly so the type system tracks the narrowing without `!`.
|
|
89
|
+
if (recipeName == null) {
|
|
90
|
+
throw new Error('runRecipeOrAdHoc: recipeName must be defined when args.check/args.tags are absent');
|
|
91
|
+
}
|
|
92
|
+
return await service.start(recipeName);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
96
|
+
const isConfigurationError = error instanceof ConfigurationError;
|
|
97
|
+
return {
|
|
98
|
+
error: {
|
|
99
|
+
type: 'error',
|
|
100
|
+
message: isConfigurationError ? msg : `Fitness run failed: ${msg}`,
|
|
101
|
+
exitCode: isConfigurationError ? EXIT_CODES.CONFIGURATION_ERROR : EXIT_CODES.RUNTIME_ERROR,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=recipe-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-selector.js","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-selector.test.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { EXIT_CODES } from '@opensip-cli/contracts';
|
|
2
|
+
import { enterScope, RunScope } from '@opensip-cli/core';
|
|
3
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
4
|
+
import { CheckRegistry } from '../../framework/registry.js';
|
|
5
|
+
import { FitnessRecipeRegistry } from '../../recipes/registry.js';
|
|
6
|
+
import { FitnessRecipeService } from '../../recipes/service.js';
|
|
7
|
+
import { fitnessTool } from '../../tool.js';
|
|
8
|
+
import { runRecipeOrAdHoc, selectRecipe } from './recipe-selector.js';
|
|
9
|
+
/**
|
|
10
|
+
* `selectRecipe` resolves the fit recipe with tool-scoped precedence (ADR-0022)
|
|
11
|
+
* against the current scope's recipe registry, whose built-ins include
|
|
12
|
+
* `default` and `backend` but NOT `opensip` (a project-private fit recipe in the
|
|
13
|
+
* parent repo). These tests exercise the precedence + tolerance contract; each
|
|
14
|
+
* enters a fresh RunScope carrying fitness's contributed recipe registry.
|
|
15
|
+
*/
|
|
16
|
+
const base = { cwd: '/tmp' };
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
const scope = new RunScope();
|
|
19
|
+
Object.assign(scope, fitnessTool.contributeScope?.() ?? {});
|
|
20
|
+
enterScope(scope);
|
|
21
|
+
});
|
|
22
|
+
describe('selectRecipe (ADR-0022 tool-scoped + tolerant)', () => {
|
|
23
|
+
it('explicit --recipe wins and resolves a real recipe', () => {
|
|
24
|
+
expect(selectRecipe({ ...base, recipe: 'backend' }, { toolRecipe: 'default' })).toEqual({
|
|
25
|
+
recipeName: 'backend',
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it('explicit unknown --recipe hard-fails (typo protection)', () => {
|
|
29
|
+
const r = selectRecipe({ ...base, recipe: 'bogus-typo' });
|
|
30
|
+
expect('error' in r && r.error.message).toContain("Unknown recipe 'bogus-typo'");
|
|
31
|
+
});
|
|
32
|
+
it('uses fitness.recipe when no flag', () => {
|
|
33
|
+
expect(selectRecipe(base, { toolRecipe: 'backend' })).toEqual({
|
|
34
|
+
recipeName: 'backend',
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it('a config-sourced UNKNOWN recipe tolerantly falls back to default (the leak fix)', () => {
|
|
38
|
+
// A copied tool-scoped recipe name that is absent from this registry must not
|
|
39
|
+
// abort — it falls back to default.
|
|
40
|
+
expect(selectRecipe(base, { toolRecipe: 'also-missing' })).toEqual({
|
|
41
|
+
recipeName: 'default',
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('--check / --tags force an ad-hoc recipe (recipeName undefined), ignoring config', () => {
|
|
45
|
+
expect(selectRecipe({ ...base, check: 'some-check' }, { toolRecipe: 'backend' })).toEqual({
|
|
46
|
+
recipeName: undefined,
|
|
47
|
+
});
|
|
48
|
+
expect(selectRecipe({ ...base, tags: ['quality'] }, { toolRecipe: 'backend' })).toEqual({
|
|
49
|
+
recipeName: undefined,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
it('no flag and no config → built-in default', () => {
|
|
53
|
+
expect(selectRecipe(base)).toEqual({ recipeName: 'default' });
|
|
54
|
+
});
|
|
55
|
+
it('unknown explicit --check returns a configuration error result', async () => {
|
|
56
|
+
const service = new FitnessRecipeService({
|
|
57
|
+
cwd: '/tmp',
|
|
58
|
+
checkRegistry: new CheckRegistry(),
|
|
59
|
+
recipeRegistry: new FitnessRecipeRegistry(),
|
|
60
|
+
prewarmCache: false,
|
|
61
|
+
});
|
|
62
|
+
const result = await runRecipeOrAdHoc(service, { ...base, check: 'ghost-check' }, undefined);
|
|
63
|
+
expect('error' in result && result.error).toMatchObject({
|
|
64
|
+
message: "Unknown check 'ghost-check'.",
|
|
65
|
+
exitCode: EXIT_CODES.CONFIGURATION_ERROR,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=recipe-selector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-selector.test.js","sourceRoot":"","sources":["../../../src/cli/fit/recipe-selector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAItE;;;;;;GAMG;AACH,MAAM,IAAI,GAAe,EAAE,GAAG,EAAE,MAAM,EAAgB,CAAC;AAEvD,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,UAAU,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACtF,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5D,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,8EAA8E;QAC9E,oCAAoC;QACpC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjE,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxF,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACtF,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC;YACvC,GAAG,EAAE,MAAM;YACX,aAAa,EAAE,IAAI,aAAa,EAAE;YAClC,cAAc,EAAE,IAAI,qBAAqB,EAAE;YAC3C,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,CAAC;QAE7F,MAAM,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;YACtD,OAAO,EAAE,8BAA8B;YACvC,QAAQ,EAAE,UAAU,CAAC,mBAAmB;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolved-fitness-config — read the fitness tool's RESOLVED config block off
|
|
3
|
+
* the per-run scope (ADR-0023, Phase 4).
|
|
4
|
+
*
|
|
5
|
+
* The CLI's pre-action hook composes every tool's namespaced
|
|
6
|
+
* `ToolConfigDeclaration` into ONE strict whole-document schema, validates the
|
|
7
|
+
* document, and resolves precedence (flag > env > file > defaults). The
|
|
8
|
+
* precedence-resolved result rides on `currentScope().toolConfig` — keyed by
|
|
9
|
+
* namespace (`fitness`/`graph`/`simulation`).
|
|
10
|
+
*
|
|
11
|
+
* Before this module, fitness re-read `opensip-cli.config.yml` through
|
|
12
|
+
* `loadSignalersConfig` and projected `signalersConfig.fitness.*`. That path
|
|
13
|
+
* NEVER saw the declared env bindings (`OPENSIP_FIT_FAIL_ON_ERRORS` /
|
|
14
|
+
* `OPENSIP_FIT_FAIL_ON_WARNINGS`) — they resolved into `scope.toolConfig` but
|
|
15
|
+
* were no-ops at the gate. Reading the resolved block here makes env (and any
|
|
16
|
+
* future flag) precedence the runtime source of truth for the fitness knobs.
|
|
17
|
+
*
|
|
18
|
+
* The shape mirrors `FitnessNamespaceSchema` (`config/fitness-config-schema.ts`)
|
|
19
|
+
* — kept as a plain readonly interface here rather than importing the Zod
|
|
20
|
+
* inferred type, because the kernel hands fitness a Zod-free
|
|
21
|
+
* `Record<string, unknown>` on `scope.toolConfig` (the kernel carries no
|
|
22
|
+
* config-layer dependency). The values were already strict-validated by the
|
|
23
|
+
* composer before they landed on the scope, so a structural narrowing is sound.
|
|
24
|
+
*/
|
|
25
|
+
/** The fitness namespace's resolved knobs (mirror of `FitnessNamespaceSchema`). */
|
|
26
|
+
export interface ResolvedFitnessConfig {
|
|
27
|
+
readonly defaultTarget?: string;
|
|
28
|
+
readonly maxParallel?: number;
|
|
29
|
+
readonly timeout?: number;
|
|
30
|
+
readonly failOnErrors?: number;
|
|
31
|
+
readonly failOnWarnings?: number;
|
|
32
|
+
readonly disabledChecks?: readonly string[];
|
|
33
|
+
readonly recipe?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read the resolved `fitness:` block off the current scope's `toolConfig`.
|
|
37
|
+
*
|
|
38
|
+
* Returns `undefined` when there is no scope (a unit test that did not wrap in
|
|
39
|
+
* `runWithScope`) or no `toolConfig` (a config-less project, or a
|
|
40
|
+
* project-agnostic command). Callers fall back to their established
|
|
41
|
+
* file-sourced defaults in that case, so the gate stays defined even off the
|
|
42
|
+
* CLI dispatch path.
|
|
43
|
+
*
|
|
44
|
+
* The block is already strict-validated + precedence-resolved by the host
|
|
45
|
+
* (flag > env > file > defaults); this is a pure read, no validation.
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolvedFitnessConfig(): ResolvedFitnessConfig | undefined;
|
|
48
|
+
//# sourceMappingURL=resolved-fitness-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-fitness-config.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/resolved-fitness-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,GAAG,SAAS,CAGzE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolved-fitness-config — read the fitness tool's RESOLVED config block off
|
|
3
|
+
* the per-run scope (ADR-0023, Phase 4).
|
|
4
|
+
*
|
|
5
|
+
* The CLI's pre-action hook composes every tool's namespaced
|
|
6
|
+
* `ToolConfigDeclaration` into ONE strict whole-document schema, validates the
|
|
7
|
+
* document, and resolves precedence (flag > env > file > defaults). The
|
|
8
|
+
* precedence-resolved result rides on `currentScope().toolConfig` — keyed by
|
|
9
|
+
* namespace (`fitness`/`graph`/`simulation`).
|
|
10
|
+
*
|
|
11
|
+
* Before this module, fitness re-read `opensip-cli.config.yml` through
|
|
12
|
+
* `loadSignalersConfig` and projected `signalersConfig.fitness.*`. That path
|
|
13
|
+
* NEVER saw the declared env bindings (`OPENSIP_FIT_FAIL_ON_ERRORS` /
|
|
14
|
+
* `OPENSIP_FIT_FAIL_ON_WARNINGS`) — they resolved into `scope.toolConfig` but
|
|
15
|
+
* were no-ops at the gate. Reading the resolved block here makes env (and any
|
|
16
|
+
* future flag) precedence the runtime source of truth for the fitness knobs.
|
|
17
|
+
*
|
|
18
|
+
* The shape mirrors `FitnessNamespaceSchema` (`config/fitness-config-schema.ts`)
|
|
19
|
+
* — kept as a plain readonly interface here rather than importing the Zod
|
|
20
|
+
* inferred type, because the kernel hands fitness a Zod-free
|
|
21
|
+
* `Record<string, unknown>` on `scope.toolConfig` (the kernel carries no
|
|
22
|
+
* config-layer dependency). The values were already strict-validated by the
|
|
23
|
+
* composer before they landed on the scope, so a structural narrowing is sound.
|
|
24
|
+
*/
|
|
25
|
+
import { currentScope } from '@opensip-cli/core';
|
|
26
|
+
/** A plain-object guard that treats arrays and null as non-objects. */
|
|
27
|
+
function isPlainObject(value) {
|
|
28
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read the resolved `fitness:` block off the current scope's `toolConfig`.
|
|
32
|
+
*
|
|
33
|
+
* Returns `undefined` when there is no scope (a unit test that did not wrap in
|
|
34
|
+
* `runWithScope`) or no `toolConfig` (a config-less project, or a
|
|
35
|
+
* project-agnostic command). Callers fall back to their established
|
|
36
|
+
* file-sourced defaults in that case, so the gate stays defined even off the
|
|
37
|
+
* CLI dispatch path.
|
|
38
|
+
*
|
|
39
|
+
* The block is already strict-validated + precedence-resolved by the host
|
|
40
|
+
* (flag > env > file > defaults); this is a pure read, no validation.
|
|
41
|
+
*/
|
|
42
|
+
export function resolvedFitnessConfig() {
|
|
43
|
+
const block = currentScope()?.toolConfig?.fitness;
|
|
44
|
+
return isPlainObject(block) ? block : undefined;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=resolved-fitness-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-fitness-config.js","sourceRoot":"","sources":["../../../src/cli/fit/resolved-fitness-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,uEAAuE;AACvE,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC;IAClD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure builders that transform fitness recipe results into the run's
|
|
3
|
+
* `SignalEnvelope` (the universal output currency, ADR-0011) and the
|
|
4
|
+
* `FitDoneResult` that carries it — plus the formatting helpers they rely on
|
|
5
|
+
* and the best-effort session persistence side effect invoked at the
|
|
6
|
+
* `executeFit` boundary.
|
|
7
|
+
*
|
|
8
|
+
* Keeping these together (rather than per-output-shape) makes the
|
|
9
|
+
* signal-shape mapping visible in one place: `buildFitEnvelope` maps check
|
|
10
|
+
* violations to `Signal`s and `buildFitDoneResult` wraps the envelope.
|
|
11
|
+
*/
|
|
12
|
+
import { type FitOptions, type SignalEnvelope, type FitDoneResult } from '@opensip-cli/contracts';
|
|
13
|
+
import { type VerdictPolicy } from '@opensip-cli/core';
|
|
14
|
+
import type { FitnessRecipeServiceCallbacks } from '../../recipes/service-types.js';
|
|
15
|
+
import type { FitnessRecipeResult } from '../../recipes/types.js';
|
|
16
|
+
import type { SignalersConfig } from '../../signalers/types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Resolve fit's findings policy (ADR-0035). Reserved keys
|
|
19
|
+
* `failOnErrors`/`failOnWarnings` come from the host-RESOLVED
|
|
20
|
+
* `scope.toolConfig.fitness` (flag>env>file>defaults, ADR-0023), falling back to
|
|
21
|
+
* the file-sourced `signalersConfig.fitness` when no scope/toolConfig is present
|
|
22
|
+
* (a config-less project, or `executeFit` invoked off the CLI dispatch path),
|
|
23
|
+
* then to the host default `{1, 0}`. This is fit's historical gate resolution,
|
|
24
|
+
* now expressed as a VerdictPolicy the host verdict consumes — so
|
|
25
|
+
* `envelope.verdict.passed` is the single exit driver.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveFitVerdictPolicy(signalersConfig: SignalersConfig): VerdictPolicy;
|
|
28
|
+
/**
|
|
29
|
+
* Assemble the fit run's {@link SignalEnvelope} — the universal output
|
|
30
|
+
* currency the composition root renders (table), emits (`--json`), and
|
|
31
|
+
* delivers (cloud + `--report-to`).
|
|
32
|
+
*
|
|
33
|
+
* Each check violation becomes one {@link Signal} (`source === ruleId ===
|
|
34
|
+
* checkSlug`) via {@link violationToSignal}; every check that ran produces one
|
|
35
|
+
* {@link UnitResult} row (so a clean check still appears in the table). The
|
|
36
|
+
* fitness-only `Validated`/`Ignores` columns ride on the unit as
|
|
37
|
+
* `filesValidated`/`itemType`/`ignoredCount` (per-unit facts a flat signal
|
|
38
|
+
* list cannot express). The verdict/summary are computed centrally by
|
|
39
|
+
* {@link buildSignalEnvelope} so all three tools agree on "passed ⇔ no
|
|
40
|
+
* critical/high".
|
|
41
|
+
*
|
|
42
|
+
* Pure: the only clock read (`createdAt`) and the run id come from the caller's
|
|
43
|
+
* scope, matching graph/sim's envelope builders.
|
|
44
|
+
*/
|
|
45
|
+
export declare function buildFitEnvelope(fitnessResult: FitnessRecipeResult, recipeName: string | undefined, signalersConfig: SignalersConfig): SignalEnvelope;
|
|
46
|
+
/** Input bundle for {@link buildFitDoneResult}: CLI args, recipe result, the run envelope, and signaler config. */
|
|
47
|
+
export interface BuildFitDoneArgs {
|
|
48
|
+
args: FitOptions;
|
|
49
|
+
fitnessResult: FitnessRecipeResult;
|
|
50
|
+
envelope: SignalEnvelope;
|
|
51
|
+
signalersConfig: SignalersConfig;
|
|
52
|
+
recipeName: string | undefined;
|
|
53
|
+
warnings?: readonly string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Build the {@link FitDoneResult} the live renderer / non-TTY render path
|
|
57
|
+
* consume. Carries the run's {@link SignalEnvelope} (the composition root
|
|
58
|
+
* derives the terminal table + summary AND the findings exit code FROM it — one
|
|
59
|
+
* row per check unit, `envelope.verdict.passed` the single verdict) plus the run
|
|
60
|
+
* label and non-fatal warnings.
|
|
61
|
+
*
|
|
62
|
+
* ADR-0035: the exit code is no longer carried on the result. `verdict.passed`
|
|
63
|
+
* (computed with fit's resolved failOnErrors/failOnWarnings policy + plugin-load
|
|
64
|
+
* `runFaulted`) is the single exit driver; the host derives it in `deliverSignals`.
|
|
65
|
+
*
|
|
66
|
+
* Pure builder: session persistence (SessionRepo.save) lives at the
|
|
67
|
+
* `executeFit` call site (post-call), not here. The envelope is assembled once
|
|
68
|
+
* in `executeFit` and threaded in so the gate, render, and session-payload
|
|
69
|
+
* paths all consume the same envelope.
|
|
70
|
+
*/
|
|
71
|
+
export declare function buildFitDoneResult({ args, envelope, recipeName, warnings, }: BuildFitDoneArgs): FitDoneResult;
|
|
72
|
+
/**
|
|
73
|
+
* Wire up CLI-side progress callbacks for the recipe service.
|
|
74
|
+
*
|
|
75
|
+
* Monotonic completed-count: the service fires `onCheckStart(slug,
|
|
76
|
+
* displayIndex, total)` when a check STARTS and
|
|
77
|
+
* `onCheckComplete(slug, summary, displayIndex, total)` when it
|
|
78
|
+
* FINISHES. Under parallel execution `displayIndex` is the check's
|
|
79
|
+
* position in the queue (1..total), not "how many have completed" — so
|
|
80
|
+
* the last-started check's index hops above the current completion
|
|
81
|
+
* tally and then "resets" down when an earlier check finishes (the UI
|
|
82
|
+
* showed `147/148 → 121/148 → 78/148`).
|
|
83
|
+
*
|
|
84
|
+
* The progress bar wants a monotonic counter. We track completed
|
|
85
|
+
* locally, increment only on `onCheckComplete`, and ignore
|
|
86
|
+
* `onCheckStart`'s index. The counter is strictly non-decreasing and
|
|
87
|
+
* always reflects "N of M checks done."
|
|
88
|
+
*/
|
|
89
|
+
export declare function buildFitCallbacks(onProgress?: (completed: number, total: number) => void): FitnessRecipeServiceCallbacks;
|
|
90
|
+
export { buildFitnessSessionPayload } from '../../persistence/session-payload.js';
|
|
91
|
+
//# sourceMappingURL=result-builders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-builders.d.ts","sourceRoot":"","sources":["../../../src/cli/fit/result-builders.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EAEnB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAS1F,OAAO,KAAK,EAAE,6BAA6B,EAAgB,MAAM,gCAAgC,CAAC;AAClG,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,wBAAwB,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,eAAe,GAAG,aAAa,CA0BvF;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,mBAAmB,EAClC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,eAAe,EAAE,eAAe,GAC/B,cAAc,CAuChB;AAED,mHAAmH;AACnH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,EAAE,mBAAmB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,EAAE,gBAAgB,GAAG,aAAa,CAoBlC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACtD,6BAA6B,CA2B/B;AAOD,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC"}
|