@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,56 @@
|
|
|
1
|
+
// @fitness-ignore-file module-coupling-metrics -- type definition module: exports are related interfaces/types for the recipe execution domain
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Core types for fitness recipes
|
|
4
|
+
*
|
|
5
|
+
* Defines FitnessRecipe, CheckSelector, RecipeCheckResult, and related
|
|
6
|
+
* types used throughout the recipe execution system.
|
|
7
|
+
*/
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import { deriveRecipeId } from '@opensip-cli/core';
|
|
10
|
+
/** Default maximum parallelism based on available CPU cores */
|
|
11
|
+
export const DEFAULT_MAX_PARALLEL = os.availableParallelism?.() ?? os.cpus().length;
|
|
12
|
+
/** Default execution options applied when not overridden by a recipe */
|
|
13
|
+
const DEFAULT_EXECUTION_OPTIONS = {
|
|
14
|
+
mode: 'parallel',
|
|
15
|
+
stopOnFirstFailure: false,
|
|
16
|
+
timeout: 30_000,
|
|
17
|
+
maxParallel: DEFAULT_MAX_PARALLEL,
|
|
18
|
+
};
|
|
19
|
+
/** Return the effective max parallelism for a recipe, falling back to the system default */
|
|
20
|
+
export function getEffectiveMaxParallel(recipe) {
|
|
21
|
+
return recipe.execution.maxParallel ?? DEFAULT_MAX_PARALLEL;
|
|
22
|
+
}
|
|
23
|
+
/** Default reporting options applied when not overridden by a recipe */
|
|
24
|
+
const DEFAULT_REPORTING_OPTIONS = {
|
|
25
|
+
format: 'table',
|
|
26
|
+
verbose: false,
|
|
27
|
+
};
|
|
28
|
+
/** Create a frozen FitnessRecipe from a definition, applying defaults for missing options */
|
|
29
|
+
export function defineRecipe(definition) {
|
|
30
|
+
// Release 2.13.0 (§5.8): one shared `<prefix>_<name>` derivation (id unchanged).
|
|
31
|
+
const id = deriveRecipeId('RCP', definition.name);
|
|
32
|
+
const recipe = {
|
|
33
|
+
id,
|
|
34
|
+
name: definition.name,
|
|
35
|
+
displayName: definition.displayName,
|
|
36
|
+
description: definition.description,
|
|
37
|
+
checks: definition.checks,
|
|
38
|
+
execution: {
|
|
39
|
+
...DEFAULT_EXECUTION_OPTIONS,
|
|
40
|
+
...definition.execution,
|
|
41
|
+
},
|
|
42
|
+
reporting: {
|
|
43
|
+
...DEFAULT_REPORTING_OPTIONS,
|
|
44
|
+
...definition.reporting,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
if (definition.tags || definition.includeDisabled) {
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
...recipe,
|
|
50
|
+
...(definition.tags ? { tags: definition.tags } : {}),
|
|
51
|
+
...(definition.includeDisabled ? { includeDisabled: definition.includeDisabled } : {}),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return Object.freeze(recipe);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recipes/types.ts"],"names":[],"mappings":"AAAA,+IAA+I;AAC/I;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2LnD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;AAEpF,wEAAwE;AACxE,MAAM,yBAAyB,GAA4B;IACzD,IAAI,EAAE,UAAU;IAChB,kBAAkB,EAAE,KAAK;IACzB,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,oBAAoB;CACzB,CAAC;AAEX,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CAAC,MAAqB;IAC3D,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,IAAI,oBAAoB,CAAC;AAC9D,CAAC;AAED,wEAAwE;AACxE,MAAM,yBAAyB,GAA4B;IACzD,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,KAAK;CACN,CAAC;AAEX,6FAA6F;AAC7F,MAAM,UAAU,YAAY,CAAC,UAAmC;IAC9D,iFAAiF;IACjF,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAElD,MAAM,MAAM,GAAkB;QAC5B,EAAE;QACF,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,SAAS,EAAE;YACT,GAAG,yBAAyB;YAC5B,GAAG,UAAU,CAAC,SAAS;SACxB;QACD,SAAS,EAAE;YACT,GAAG,yBAAyB;YAC5B,GAAG,UAAU,CAAC,SAAS;SACxB;KACF,CAAC;IAEF,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,GAAG,MAAM;YACT,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `fitness:` block fitness contributes to the scaffolded
|
|
3
|
+
* `opensip-cli.config.yml` (ADR-0038, Tool.scaffoldConfigBlock).
|
|
4
|
+
*
|
|
5
|
+
* Relocated verbatim from the CLI's `config-templates.ts` (the legacy
|
|
6
|
+
* `fitnessBlock` literal). The CLI's `generateConfig` keeps rendering the
|
|
7
|
+
* document header + `targets:` (host-owned, ADR-0023 §schema), and appends
|
|
8
|
+
* each tool's `scaffoldConfigBlock()` — fitness owns its own block bytes.
|
|
9
|
+
*
|
|
10
|
+
* Why a string literal rather than rendering from `fitnessConfigDeclaration.defaults`:
|
|
11
|
+
* the block carries inline guidance comments (`# fail if total errors >= this …`)
|
|
12
|
+
* that the bare defaults object cannot express. ADR-0038 Decision 2 reserved the
|
|
13
|
+
* `scaffoldConfigBlock` escape hatch for exactly this; the byte-exact init golden
|
|
14
|
+
* forces it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function fitScaffoldConfigBlock(): string;
|
|
17
|
+
//# sourceMappingURL=config-block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-block.d.ts","sourceRoot":"","sources":["../../src/scaffold/config-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAa/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `fitness:` block fitness contributes to the scaffolded
|
|
3
|
+
* `opensip-cli.config.yml` (ADR-0038, Tool.scaffoldConfigBlock).
|
|
4
|
+
*
|
|
5
|
+
* Relocated verbatim from the CLI's `config-templates.ts` (the legacy
|
|
6
|
+
* `fitnessBlock` literal). The CLI's `generateConfig` keeps rendering the
|
|
7
|
+
* document header + `targets:` (host-owned, ADR-0023 §schema), and appends
|
|
8
|
+
* each tool's `scaffoldConfigBlock()` — fitness owns its own block bytes.
|
|
9
|
+
*
|
|
10
|
+
* Why a string literal rather than rendering from `fitnessConfigDeclaration.defaults`:
|
|
11
|
+
* the block carries inline guidance comments (`# fail if total errors >= this …`)
|
|
12
|
+
* that the bare defaults object cannot express. ADR-0038 Decision 2 reserved the
|
|
13
|
+
* `scaffoldConfigBlock` escape hatch for exactly this; the byte-exact init golden
|
|
14
|
+
* forces it.
|
|
15
|
+
*/
|
|
16
|
+
export function fitScaffoldConfigBlock() {
|
|
17
|
+
return [
|
|
18
|
+
'',
|
|
19
|
+
'# =============================================================================',
|
|
20
|
+
'# Fitness configuration',
|
|
21
|
+
'# =============================================================================',
|
|
22
|
+
'',
|
|
23
|
+
'fitness:',
|
|
24
|
+
' failOnErrors: 1 # fail if total errors >= this (0 = never fail on errors)',
|
|
25
|
+
' failOnWarnings: 0 # fail if total warnings >= this (0 = warnings are informational)',
|
|
26
|
+
' disabledChecks: []',
|
|
27
|
+
'',
|
|
28
|
+
].join('\n');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=config-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-block.js","sourceRoot":"","sources":["../../src/scaffold/config-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,EAAE;QACF,iFAAiF;QACjF,yBAAyB;QACzB,iFAAiF;QACjF,EAAE;QACF,UAAU;QACV,iFAAiF;QACjF,yFAAyF;QACzF,sBAAsB;QACtB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview fitness's `init` example contribution (ADR-0038).
|
|
3
|
+
*
|
|
4
|
+
* fitness OWNS the example check/recipe bytes + the pinned check ids that `init`
|
|
5
|
+
* scaffolds — relocated here from the CLI's `config-templates.ts` so a tool's
|
|
6
|
+
* scaffold content lives with the tool (the host just writes the bytes under
|
|
7
|
+
* `userPluginDir('fit', kind)`). The byte content is verbatim; a Phase-0 golden +
|
|
8
|
+
* a Phase-1 parity test pin byte-identity with the legacy CLI builders.
|
|
9
|
+
*/
|
|
10
|
+
import type { ScaffoldContext, ScaffoldFile } from '@opensip-cli/core';
|
|
11
|
+
/**
|
|
12
|
+
* Pinned example-check ids per language — the COMPLETE id universe (drives
|
|
13
|
+
* stale-scaffolded detection regardless of the project's detected languages).
|
|
14
|
+
* Verbatim from the legacy `config-templates.ts`.
|
|
15
|
+
*/
|
|
16
|
+
export declare const EXAMPLE_CHECK_IDS: Record<string, string>;
|
|
17
|
+
/** Example fitness check source (verbatim). `language` is tool-local `string`. */
|
|
18
|
+
export declare function exampleCheckSource(language: string, polyglotSuffix?: string): string;
|
|
19
|
+
/** Example fitness recipe source (verbatim). */
|
|
20
|
+
export declare function exampleRecipeSource(slugs: readonly string[]): string;
|
|
21
|
+
/**
|
|
22
|
+
* fitness's scaffold contribution — reproduces `scaffold-writer.ts`'s fit logic:
|
|
23
|
+
* single language ⇒ one `example-check.mjs` + a recipe over `['example-check']`;
|
|
24
|
+
* polyglot ⇒ one `example-check-<lang>.mjs` per language + a recipe over the
|
|
25
|
+
* per-language slugs.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fitScaffoldExamples(ctx: ScaffoldContext): ScaffoldFile[];
|
|
28
|
+
/** fitness's COMPLETE stable example-id universe (every language's check id). */
|
|
29
|
+
export declare function fitStableExampleIds(): string[];
|
|
30
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/scaffold/examples.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOpD,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,SAAK,GAAG,MAAM,CAuChF;AAED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAqBpE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,EAAE,CAkCxE;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview fitness's `init` example contribution (ADR-0038).
|
|
3
|
+
*
|
|
4
|
+
* fitness OWNS the example check/recipe bytes + the pinned check ids that `init`
|
|
5
|
+
* scaffolds — relocated here from the CLI's `config-templates.ts` so a tool's
|
|
6
|
+
* scaffold content lives with the tool (the host just writes the bytes under
|
|
7
|
+
* `userPluginDir('fit', kind)`). The byte content is verbatim; a Phase-0 golden +
|
|
8
|
+
* a Phase-1 parity test pin byte-identity with the legacy CLI builders.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Pinned example-check ids per language — the COMPLETE id universe (drives
|
|
12
|
+
* stale-scaffolded detection regardless of the project's detected languages).
|
|
13
|
+
* Verbatim from the legacy `config-templates.ts`.
|
|
14
|
+
*/
|
|
15
|
+
export const EXAMPLE_CHECK_IDS = {
|
|
16
|
+
typescript: 'a3e1f8c4-9b2d-4f5a-8e6c-7d1a2b3c4d5e',
|
|
17
|
+
rust: 'b4f2e9d5-8c3e-4a6b-9f7d-8e2b3c4d5e6f',
|
|
18
|
+
python: 'c5a3f0e6-7d4f-4b7c-a08e-9f3c4d5e6f70',
|
|
19
|
+
go: 'd6b4a1f7-6e5a-4c8d-b19f-a04d5e6f7081',
|
|
20
|
+
java: 'e7c5b2a8-5f6b-4d9e-c2af-b15e6f708192',
|
|
21
|
+
cpp: 'f8d6c3b9-4a7c-4ea0-d3b0-c26f708192a3',
|
|
22
|
+
};
|
|
23
|
+
/** Example fitness check source (verbatim). `language` is tool-local `string`. */
|
|
24
|
+
export function exampleCheckSource(language, polyglotSuffix = '') {
|
|
25
|
+
// The example check flags any file containing the literal
|
|
26
|
+
// `EXAMPLE_TODO`. Default behavior on a fresh repo is to pass with
|
|
27
|
+
// 0 violations — it scans real files but finds nothing.
|
|
28
|
+
const slug = polyglotSuffix ? `example-check-${polyglotSuffix}` : 'example-check';
|
|
29
|
+
return `// Example fitness check.
|
|
30
|
+
//
|
|
31
|
+
// Edit this file or add new .mjs files to opensip-cli/fit/checks/.
|
|
32
|
+
// Files in this directory are auto-loaded on the next \`opensip fit\` run.
|
|
33
|
+
//
|
|
34
|
+
// This demo flags any file containing the literal \`EXAMPLE_TODO\`. After
|
|
35
|
+
// you confirm the wiring works, delete or replace it with a real check.
|
|
36
|
+
//
|
|
37
|
+
// Docs: https://github.com/opensip-ai/opensip-cli#authoring-a-check-package
|
|
38
|
+
import { defineCheck } from '@opensip-cli/fitness';
|
|
39
|
+
|
|
40
|
+
export const checks = [
|
|
41
|
+
defineCheck({
|
|
42
|
+
id: '${EXAMPLE_CHECK_IDS[language] ?? ''}',
|
|
43
|
+
slug: '${slug}',
|
|
44
|
+
description: 'Demo check — flags any file containing the literal EXAMPLE_TODO',
|
|
45
|
+
scope: { languages: ['${language}'], concerns: ['backend'] },
|
|
46
|
+
tags: ['example'],
|
|
47
|
+
analyze: (content, filePath) => {
|
|
48
|
+
const i = content.indexOf('EXAMPLE_TODO');
|
|
49
|
+
if (i < 0) return [];
|
|
50
|
+
return [{
|
|
51
|
+
line: content.slice(0, i).split('\\n').length,
|
|
52
|
+
message: 'Found the example trigger string.',
|
|
53
|
+
severity: 'warning',
|
|
54
|
+
suggestion:
|
|
55
|
+
'This is just a demo. Delete opensip-cli/fit/checks/example-check.mjs ' +
|
|
56
|
+
'once you have your own checks.',
|
|
57
|
+
filePath,
|
|
58
|
+
}];
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
];
|
|
62
|
+
`;
|
|
63
|
+
}
|
|
64
|
+
/** Example fitness recipe source (verbatim). */
|
|
65
|
+
export function exampleRecipeSource(slugs) {
|
|
66
|
+
const slugList = slugs.map((s) => `'${s}'`).join(', ');
|
|
67
|
+
return `// Example fitness recipe — runs only the example check(s).
|
|
68
|
+
//
|
|
69
|
+
// Edit this file or add new .mjs files to opensip-cli/fit/recipes/.
|
|
70
|
+
// Files in this directory are auto-loaded on the next run.
|
|
71
|
+
//
|
|
72
|
+
// Run this recipe explicitly: opensip fit --recipe example
|
|
73
|
+
//
|
|
74
|
+
// To run all enabled checks (built-in + your custom ones), omit
|
|
75
|
+
// --recipe and the built-in \`default\` recipe applies.
|
|
76
|
+
export const recipes = [{
|
|
77
|
+
id: 'URCP_example',
|
|
78
|
+
name: 'example',
|
|
79
|
+
displayName: 'Example',
|
|
80
|
+
description: 'Demo recipe — runs only the example check(s)',
|
|
81
|
+
checks: { type: 'explicit', checkIds: [${slugList}] },
|
|
82
|
+
execution: { mode: 'parallel', stopOnFirstFailure: false, timeout: 30_000 },
|
|
83
|
+
reporting: { format: 'table', verbose: false },
|
|
84
|
+
}];
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* fitness's scaffold contribution — reproduces `scaffold-writer.ts`'s fit logic:
|
|
89
|
+
* single language ⇒ one `example-check.mjs` + a recipe over `['example-check']`;
|
|
90
|
+
* polyglot ⇒ one `example-check-<lang>.mjs` per language + a recipe over the
|
|
91
|
+
* per-language slugs.
|
|
92
|
+
*/
|
|
93
|
+
export function fitScaffoldExamples(ctx) {
|
|
94
|
+
const languages = ctx.languages.length > 0 ? ctx.languages : ['typescript'];
|
|
95
|
+
const single = languages.length === 1;
|
|
96
|
+
// Single language ⇒ one un-suffixed `example-check.mjs`. Polyglot ⇒ one
|
|
97
|
+
// `example-check-<lang>.mjs` per language. A declarative `.map` (not a
|
|
98
|
+
// push-in-loop) keeps the check files' contents the single source.
|
|
99
|
+
const checkFiles = single
|
|
100
|
+
? [
|
|
101
|
+
{
|
|
102
|
+
kind: 'checks',
|
|
103
|
+
filename: 'example-check.mjs',
|
|
104
|
+
content: exampleCheckSource(languages[0] ?? 'typescript'),
|
|
105
|
+
stableId: EXAMPLE_CHECK_IDS[languages[0] ?? 'typescript'] ?? '',
|
|
106
|
+
},
|
|
107
|
+
]
|
|
108
|
+
: languages.map((lang) => ({
|
|
109
|
+
kind: 'checks',
|
|
110
|
+
filename: `example-check-${lang}.mjs`,
|
|
111
|
+
content: exampleCheckSource(lang, lang),
|
|
112
|
+
stableId: EXAMPLE_CHECK_IDS[lang] ?? '',
|
|
113
|
+
}));
|
|
114
|
+
const slugs = single ? ['example-check'] : languages.map((lang) => `example-check-${lang}`);
|
|
115
|
+
return [
|
|
116
|
+
...checkFiles,
|
|
117
|
+
{
|
|
118
|
+
kind: 'recipes',
|
|
119
|
+
filename: 'example-recipe.mjs',
|
|
120
|
+
content: exampleRecipeSource(slugs),
|
|
121
|
+
stableId: 'URCP_example',
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
/** fitness's COMPLETE stable example-id universe (every language's check id). */
|
|
126
|
+
export function fitStableExampleIds() {
|
|
127
|
+
return Object.values(EXAMPLE_CHECK_IDS);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/scaffold/examples.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,UAAU,EAAE,sCAAsC;IAClD,IAAI,EAAE,sCAAsC;IAC5C,MAAM,EAAE,sCAAsC;IAC9C,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,sCAAsC;IAC5C,GAAG,EAAE,sCAAsC;CAC5C,CAAC;AAEF,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,cAAc,GAAG,EAAE;IACtE,0DAA0D;IAC1D,mEAAmE;IACnE,wDAAwD;IACxD,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,iBAAiB,cAAc,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;IAClF,OAAO;;;;;;;;;;;;;WAaE,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE;aAC/B,IAAI;;4BAEW,QAAQ;;;;;;;;;;;;;;;;;CAiBnC,CAAC;AACF,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO;;;;;;;;;;;;;;2CAckC,QAAQ;;;;CAIlD,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;IAEtC,wEAAwE;IACxE,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,UAAU,GAAmB,MAAM;QACvC,CAAC,CAAC;YACE;gBACE,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,mBAAmB;gBAC7B,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;gBACzD,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE;aAChE;SACF;QACH,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,iBAAiB,IAAI,MAAM;YACrC,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;YACvC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;SACxC,CAAC,CAAC,CAAC;IAER,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAE5F,OAAO;QACL,GAAG,UAAU;QACb;YACE,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACnC,QAAQ,EAAE,cAAc;SACzB;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RunScope augmentation for fitness.
|
|
3
|
+
*
|
|
4
|
+
* D7 (tool subscopes via module augmentation, per the RunScope/
|
|
5
|
+
* Registry architecture): tool-specific concerns nest under the tool's
|
|
6
|
+
* name on `RunScope` and are added via TypeScript module augmentation
|
|
7
|
+
* from the tool's own package. Core never imports fitness-shaped types —
|
|
8
|
+
* the layer rule stays intact (`core ← contracts ← {fitness, ...}`).
|
|
9
|
+
*
|
|
10
|
+
* Two singletons used to hang off this package as module-level state:
|
|
11
|
+
*
|
|
12
|
+
* - `defaultRegistry` — per-process check registry.
|
|
13
|
+
* - `defaultRecipeRegistry` — per-process recipe registry.
|
|
14
|
+
*
|
|
15
|
+
* plus the per-process `ensureChecksLoaded` lifecycle state (the
|
|
16
|
+
* `checksLoadedFor` / `pluginLoadErrors` / `loadWarnings` triple).
|
|
17
|
+
*
|
|
18
|
+
* All of it is now per-RunScope. The fitness tool's `contributeScope`
|
|
19
|
+
* hook (in `tool.ts`) instantiates fresh registries + a fresh `load`
|
|
20
|
+
* marker and attaches them to `scope.fitness` once per CLI invocation.
|
|
21
|
+
* Tools and library code read via
|
|
22
|
+
* `currentScope()?.fitness?.{checks,recipes,load}`.
|
|
23
|
+
*
|
|
24
|
+
* The `fitness` slot is intentionally optional and mutable (no
|
|
25
|
+
* `readonly`) on the augmented interface: the kernel doesn't construct
|
|
26
|
+
* it, and only the fitness tool's `contributeScope` writes to it during
|
|
27
|
+
* scope construction. A run that doesn't load the fitness tool carries
|
|
28
|
+
* no `scope.fitness`, and reads return `undefined`.
|
|
29
|
+
*/
|
|
30
|
+
import type { CheckRegistry } from './framework/registry.js';
|
|
31
|
+
import type { FitnessRecipeRegistry } from './recipes/registry.js';
|
|
32
|
+
/**
|
|
33
|
+
* Per-RunScope `ensureChecksLoaded` lifecycle state — moved off the
|
|
34
|
+
* `check-loader.ts` module singletons so two concurrent scopes carry
|
|
35
|
+
* independent load state. Mutable: `ensureChecksLoaded` writes it once
|
|
36
|
+
* per run; the phase helpers (`buildFitEnvelope`, `buildFitDoneResult`)
|
|
37
|
+
* and the public accessors read it back.
|
|
38
|
+
*/
|
|
39
|
+
export interface FitnessLoadState {
|
|
40
|
+
/** Project directory for which `ensureChecksLoaded` has run to
|
|
41
|
+
* completion in THIS scope. `null` before the first load; `''` is the
|
|
42
|
+
* "loaded" sentinel for the no-project case. */
|
|
43
|
+
loadedFor: string | null;
|
|
44
|
+
/** Plugin load failures from the most recent `ensureChecksLoaded` call. */
|
|
45
|
+
pluginLoadErrors: readonly string[];
|
|
46
|
+
/** Non-fatal user-facing warnings collected during the most recent
|
|
47
|
+
* `ensureChecksLoaded` call. */
|
|
48
|
+
loadWarnings: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Per-RunScope fitness state. Constructed by the fitness tool's
|
|
52
|
+
* `contributeScope()` hook and attached to `scope.fitness`.
|
|
53
|
+
*/
|
|
54
|
+
export interface FitnessSubscope {
|
|
55
|
+
/** Check registry — populated by `loadAllPlugins` /
|
|
56
|
+
* `loadDiscoveredCheckPackages` during `ensureChecksLoaded`. */
|
|
57
|
+
readonly checks: CheckRegistry;
|
|
58
|
+
/** Recipe registry — seeded with built-in recipes at construction;
|
|
59
|
+
* plugin loader registers user recipes. */
|
|
60
|
+
readonly recipes: FitnessRecipeRegistry;
|
|
61
|
+
/** `ensureChecksLoaded` lifecycle state for this run. */
|
|
62
|
+
readonly load: FitnessLoadState;
|
|
63
|
+
}
|
|
64
|
+
declare module '@opensip-cli/core' {
|
|
65
|
+
interface ScopeContribution {
|
|
66
|
+
/**
|
|
67
|
+
* Fitness tool's per-run state. Returned by the fitness tool's
|
|
68
|
+
* `contributeScope` hook and installed by the kernel; absent in runs
|
|
69
|
+
* where the fitness tool is not registered. Consumers MUST null-check
|
|
70
|
+
* before reading. Augments `ScopeContribution`, which
|
|
71
|
+
* `ToolScope`/`RunScope` extend — so `cli.scope.fitness` /
|
|
72
|
+
* `currentScope()?.fitness` stay readable.
|
|
73
|
+
*/
|
|
74
|
+
fitness?: FitnessSubscope;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=scope-augmentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-augmentation.d.ts","sourceRoot":"","sources":["../src/scope-augmentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;qDAEiD;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;qCACiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;qEACiE;IACjE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B;gDAC4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC;AAED,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,iBAAiB;QACzB;;;;;;;WAOG;QACH,OAAO,CAAC,EAAE,eAAe,CAAC;KAC3B;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview RunScope augmentation for fitness.
|
|
3
|
+
*
|
|
4
|
+
* D7 (tool subscopes via module augmentation, per the RunScope/
|
|
5
|
+
* Registry architecture): tool-specific concerns nest under the tool's
|
|
6
|
+
* name on `RunScope` and are added via TypeScript module augmentation
|
|
7
|
+
* from the tool's own package. Core never imports fitness-shaped types —
|
|
8
|
+
* the layer rule stays intact (`core ← contracts ← {fitness, ...}`).
|
|
9
|
+
*
|
|
10
|
+
* Two singletons used to hang off this package as module-level state:
|
|
11
|
+
*
|
|
12
|
+
* - `defaultRegistry` — per-process check registry.
|
|
13
|
+
* - `defaultRecipeRegistry` — per-process recipe registry.
|
|
14
|
+
*
|
|
15
|
+
* plus the per-process `ensureChecksLoaded` lifecycle state (the
|
|
16
|
+
* `checksLoadedFor` / `pluginLoadErrors` / `loadWarnings` triple).
|
|
17
|
+
*
|
|
18
|
+
* All of it is now per-RunScope. The fitness tool's `contributeScope`
|
|
19
|
+
* hook (in `tool.ts`) instantiates fresh registries + a fresh `load`
|
|
20
|
+
* marker and attaches them to `scope.fitness` once per CLI invocation.
|
|
21
|
+
* Tools and library code read via
|
|
22
|
+
* `currentScope()?.fitness?.{checks,recipes,load}`.
|
|
23
|
+
*
|
|
24
|
+
* The `fitness` slot is intentionally optional and mutable (no
|
|
25
|
+
* `readonly`) on the augmented interface: the kernel doesn't construct
|
|
26
|
+
* it, and only the fitness tool's `contributeScope` writes to it during
|
|
27
|
+
* scope construction. A run that doesn't load the fitness tool carries
|
|
28
|
+
* no `scope.fitness`, and reads return `undefined`.
|
|
29
|
+
*/
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=scope-augmentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-augmentation.js","sourceRoot":"","sources":["../src/scope-augmentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../../src/signalers/__tests__/loader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { LanguageRegistry, RunScope, SystemError, ToolRegistry, ValidationError, runWithScopeSync, } from '@opensip-cli/core';
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
6
|
+
import { loadSignalersConfig } from '../loader.js';
|
|
7
|
+
let testDir;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
testDir = mkdtempSync(join(tmpdir(), 'opensip-signalers-loader-'));
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
describe('loadSignalersConfig', () => {
|
|
15
|
+
it('loads a minimal valid config', () => {
|
|
16
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), 'targets: {}\n');
|
|
17
|
+
const cfg = loadSignalersConfig(testDir);
|
|
18
|
+
expect(cfg.targets).toEqual({});
|
|
19
|
+
expect(cfg.fitness.failOnErrors).toBe(1);
|
|
20
|
+
expect(cfg.fitness.failOnWarnings).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
it('parses targets with description, include, exclude', () => {
|
|
23
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), `targets:
|
|
24
|
+
src:
|
|
25
|
+
description: TS source
|
|
26
|
+
include:
|
|
27
|
+
- "src/**/*.ts"
|
|
28
|
+
exclude:
|
|
29
|
+
- "**/*.test.ts"
|
|
30
|
+
languages: [typescript]
|
|
31
|
+
concerns: [backend]
|
|
32
|
+
`);
|
|
33
|
+
const cfg = loadSignalersConfig(testDir);
|
|
34
|
+
expect(cfg.targets.src?.description).toBe('TS source');
|
|
35
|
+
expect(cfg.targets.src?.include).toEqual(['src/**/*.ts']);
|
|
36
|
+
});
|
|
37
|
+
it('caches by resolved file path within the TTL', () => {
|
|
38
|
+
const path = join(testDir, 'opensip-cli.config.yml');
|
|
39
|
+
writeFileSync(path, 'targets: {}\n');
|
|
40
|
+
const a = loadSignalersConfig(testDir);
|
|
41
|
+
// Re-write the file content; cached load should not re-read.
|
|
42
|
+
writeFileSync(path, 'targets: {alt: {description: x, include: ["y"]}}\n');
|
|
43
|
+
const b = loadSignalersConfig(testDir);
|
|
44
|
+
expect(b).toBe(a); // same frozen reference
|
|
45
|
+
});
|
|
46
|
+
it('throws ValidationError when target name violates kebab-case', () => {
|
|
47
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), `targets:
|
|
48
|
+
Invalid_Name:
|
|
49
|
+
description: x
|
|
50
|
+
include: ["y"]
|
|
51
|
+
`);
|
|
52
|
+
expect(() => loadSignalersConfig(testDir)).toThrow(ValidationError);
|
|
53
|
+
});
|
|
54
|
+
it('throws ValidationError when YAML is malformed', () => {
|
|
55
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), 'targets: [unbalanced\n');
|
|
56
|
+
expect(() => loadSignalersConfig(testDir)).toThrow(ValidationError);
|
|
57
|
+
});
|
|
58
|
+
it('throws SystemError when the file is too large', () => {
|
|
59
|
+
const huge = 'x'.repeat(11 * 1024 * 1024); // 11 MB > 10 MB limit
|
|
60
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), huge);
|
|
61
|
+
expect(() => loadSignalersConfig(testDir)).toThrow(SystemError);
|
|
62
|
+
});
|
|
63
|
+
it('respects an explicit --config path', () => {
|
|
64
|
+
writeFileSync(join(testDir, 'custom.yml'), 'targets: {}\n');
|
|
65
|
+
const cfg = loadSignalersConfig(testDir, join(testDir, 'custom.yml'));
|
|
66
|
+
expect(cfg.targets).toEqual({});
|
|
67
|
+
});
|
|
68
|
+
it('treats null YAML as an empty object', () => {
|
|
69
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), '');
|
|
70
|
+
const cfg = loadSignalersConfig(testDir);
|
|
71
|
+
expect(cfg.targets).toEqual({});
|
|
72
|
+
});
|
|
73
|
+
it('throws ValidationError when an explicit path points to a non-existent file', () => {
|
|
74
|
+
// resolveProjectConfigPath throws when --config points at a missing
|
|
75
|
+
// file. This validates that error path propagates cleanly.
|
|
76
|
+
expect(() => loadSignalersConfig(testDir, join(testDir, 'does-not-exist.yml'))).toThrow();
|
|
77
|
+
});
|
|
78
|
+
it('throws ValidationError when the resolved path is a directory (readFileSync EISDIR)', () => {
|
|
79
|
+
const dirAsConfig = join(testDir, 'opensip-cli.config.yml');
|
|
80
|
+
mkdirSync(dirAsConfig, { recursive: true });
|
|
81
|
+
expect(() => loadSignalersConfig(testDir)).toThrow();
|
|
82
|
+
});
|
|
83
|
+
it('treats explicit null section values as default empty objects', () => {
|
|
84
|
+
// Exercises the section() preprocess branch: v != null is preserved
|
|
85
|
+
// verbatim. Counterpart to "treats null YAML as empty object" — that
|
|
86
|
+
// test handles the nullish branch; this one covers the truthy branch.
|
|
87
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), `targets: {}
|
|
88
|
+
fitness:
|
|
89
|
+
failOnErrors: 5
|
|
90
|
+
`);
|
|
91
|
+
const cfg = loadSignalersConfig(testDir);
|
|
92
|
+
expect(cfg.fitness.failOnErrors).toBe(5);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
/** Scope carrying a host-validated config document on its structural slot —
|
|
96
|
+
* installed via Object.assign exactly like the CLI pre-action hook does
|
|
97
|
+
* (scope-types.ts declares it readonly for readers). */
|
|
98
|
+
const makeScopeWithDocument = (configDocument) => {
|
|
99
|
+
const scope = new RunScope({ languages: new LanguageRegistry(), tools: new ToolRegistry() });
|
|
100
|
+
Object.assign(scope, { configDocument });
|
|
101
|
+
return scope;
|
|
102
|
+
};
|
|
103
|
+
describe('loadSignalersConfig — scope-first (ADR-0023 one-reader)', () => {
|
|
104
|
+
it('projects from scope.configDocument without touching the filesystem', () => {
|
|
105
|
+
// No config file exists in testDir — a file read would throw. The scope
|
|
106
|
+
// document alone must satisfy the load.
|
|
107
|
+
const scope = makeScopeWithDocument({
|
|
108
|
+
targets: { src: { description: 'TS source', include: ['src/**/*.ts'] } },
|
|
109
|
+
fitness: { failOnErrors: 3 },
|
|
110
|
+
});
|
|
111
|
+
const cfg = runWithScopeSync(scope, () => loadSignalersConfig(testDir));
|
|
112
|
+
expect(cfg.targets.src?.description).toBe('TS source');
|
|
113
|
+
expect(cfg.fitness.failOnErrors).toBe(3);
|
|
114
|
+
});
|
|
115
|
+
it('ignores a stale on-disk file when the scope carries the document', () => {
|
|
116
|
+
// The host read + validated the document at bootstrap; a file edited
|
|
117
|
+
// after bootstrap (or a different file the tool would have resolved)
|
|
118
|
+
// must NOT win over the scope-carried document.
|
|
119
|
+
writeFileSync(join(testDir, 'opensip-cli.config.yml'), 'targets: {}\nfitness:\n failOnErrors: 99\n');
|
|
120
|
+
const scope = makeScopeWithDocument({ targets: {}, fitness: { failOnErrors: 2 } });
|
|
121
|
+
const cfg = runWithScopeSync(scope, () => loadSignalersConfig(testDir));
|
|
122
|
+
expect(cfg.fitness.failOnErrors).toBe(2);
|
|
123
|
+
});
|
|
124
|
+
it('memoizes the projection per document object (one parse per run)', () => {
|
|
125
|
+
const scope = makeScopeWithDocument({ targets: {} });
|
|
126
|
+
const a = runWithScopeSync(scope, () => loadSignalersConfig(testDir));
|
|
127
|
+
const b = runWithScopeSync(scope, () => loadSignalersConfig(testDir));
|
|
128
|
+
expect(b).toBe(a); // same frozen reference
|
|
129
|
+
});
|
|
130
|
+
it('falls back to the file read when the scope carries no document', () => {
|
|
131
|
+
// A scope WITHOUT configDocument (config-less/agnostic run) must keep the
|
|
132
|
+
// loud missing-config error — never silently validate an empty document.
|
|
133
|
+
const scope = new RunScope({ languages: new LanguageRegistry(), tools: new ToolRegistry() });
|
|
134
|
+
expect(() => runWithScopeSync(scope, () => loadSignalersConfig(testDir))).toThrow(ValidationError);
|
|
135
|
+
});
|
|
136
|
+
it('still rejects an invalid scope document with the fitness error shape', () => {
|
|
137
|
+
const scope = makeScopeWithDocument({ targets: { 'Bad Name': { include: [] } } });
|
|
138
|
+
expect(() => runWithScopeSync(scope, () => loadSignalersConfig(testDir))).toThrow(ValidationError);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/signalers/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-to-signal.test.d.ts","sourceRoot":"","sources":["../../../src/signalers/__tests__/violation-to-signal.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `violationToSignal` (ADR-0011, Phase 6) — the fitness
|
|
3
|
+
* violation → core `Signal` mapping. Guards the contract that the migration
|
|
4
|
+
* preserves: `source === ruleId === checkSlug`, the legacy 2-level severity is
|
|
5
|
+
* lifted UP into the 4-level `SignalSeverity` (never collapsed), and the
|
|
6
|
+
* file/line/column ride on `code` (and are mirrored to the flat fields).
|
|
7
|
+
*
|
|
8
|
+
* Pure mapping — no framework, no IO, no mocks. `createSignal` generates a
|
|
9
|
+
* non-deterministic `id`/`createdAt`, so those fields are asserted by shape,
|
|
10
|
+
* not value.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, expect, it } from 'vitest';
|
|
13
|
+
import { violationToSignal } from '../violation-to-signal.js';
|
|
14
|
+
function violation(over = {}) {
|
|
15
|
+
return {
|
|
16
|
+
file: 'src/foo.ts',
|
|
17
|
+
line: 10,
|
|
18
|
+
column: 3,
|
|
19
|
+
message: 'Something is wrong',
|
|
20
|
+
severity: 'error',
|
|
21
|
+
...over,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
describe('violationToSignal', () => {
|
|
25
|
+
it('carries the check slug on both source and ruleId', () => {
|
|
26
|
+
const signal = violationToSignal('my-check-slug', violation());
|
|
27
|
+
expect(signal.source).toBe('my-check-slug');
|
|
28
|
+
expect(signal.ruleId).toBe('my-check-slug');
|
|
29
|
+
});
|
|
30
|
+
it('lifts legacy error → high (never collapses)', () => {
|
|
31
|
+
expect(violationToSignal('s', violation({ severity: 'error' })).severity).toBe('high');
|
|
32
|
+
});
|
|
33
|
+
it('lifts legacy warning → medium (never collapses)', () => {
|
|
34
|
+
expect(violationToSignal('s', violation({ severity: 'warning' })).severity).toBe('medium');
|
|
35
|
+
});
|
|
36
|
+
it('maps the code location and mirrors it to the flat fields', () => {
|
|
37
|
+
const signal = violationToSignal('s', violation({ file: 'src/bar.ts', line: 42, column: 7 }));
|
|
38
|
+
expect(signal.code).toEqual({ file: 'src/bar.ts', line: 42, column: 7 });
|
|
39
|
+
expect(signal.filePath).toBe('src/bar.ts');
|
|
40
|
+
expect(signal.line).toBe(42);
|
|
41
|
+
expect(signal.column).toBe(7);
|
|
42
|
+
});
|
|
43
|
+
it('preserves the message and the optional suggestion', () => {
|
|
44
|
+
const signal = violationToSignal('s', violation({ message: 'Bad import', suggestion: 'Use the barrel' }));
|
|
45
|
+
expect(signal.message).toBe('Bad import');
|
|
46
|
+
expect(signal.suggestion).toBe('Use the barrel');
|
|
47
|
+
});
|
|
48
|
+
it('defaults category to quality and provider to opensip-cli', () => {
|
|
49
|
+
const signal = violationToSignal('s', violation());
|
|
50
|
+
expect(signal.category).toBe('quality');
|
|
51
|
+
expect(signal.provider).toBe('opensip-cli');
|
|
52
|
+
});
|
|
53
|
+
it('produces a well-formed Signal id and ISO createdAt', () => {
|
|
54
|
+
const signal = violationToSignal('s', violation());
|
|
55
|
+
expect(signal.id).toMatch(/^sig_/);
|
|
56
|
+
expect(() => new Date(signal.createdAt).toISOString()).not.toThrow();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=violation-to-signal.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation-to-signal.test.js","sourceRoot":"","sources":["../../../src/signalers/__tests__/violation-to-signal.test.ts"],"names":[],"mappings":"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"}
|