@lyse-labs/lyse 0.1.0-alpha.2
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 +45 -0
- package/PRIVACY.md +181 -0
- package/README.md +34 -0
- package/SECURITY.md +43 -0
- package/dist/bench/evidence-pack/anti-dummy.d.ts +11 -0
- package/dist/bench/evidence-pack/anti-dummy.js +20 -0
- package/dist/bench/evidence-pack/anti-dummy.js.map +1 -0
- package/dist/bench/evidence-pack/builder.d.ts +14 -0
- package/dist/bench/evidence-pack/builder.js +77 -0
- package/dist/bench/evidence-pack/builder.js.map +1 -0
- package/dist/bench/evidence-pack/histograms.d.ts +2 -0
- package/dist/bench/evidence-pack/histograms.js +131 -0
- package/dist/bench/evidence-pack/histograms.js.map +1 -0
- package/dist/bench/evidence-pack/manifest-detector.d.ts +2 -0
- package/dist/bench/evidence-pack/manifest-detector.js +65 -0
- package/dist/bench/evidence-pack/manifest-detector.js.map +1 -0
- package/dist/bench/evidence-pack/package-json-digest.d.ts +2 -0
- package/dist/bench/evidence-pack/package-json-digest.js +51 -0
- package/dist/bench/evidence-pack/package-json-digest.js.map +1 -0
- package/dist/bench/evidence-pack/sampler.d.ts +2 -0
- package/dist/bench/evidence-pack/sampler.js +140 -0
- package/dist/bench/evidence-pack/sampler.js.map +1 -0
- package/dist/bench/evidence-pack/types.d.ts +127 -0
- package/dist/bench/evidence-pack/types.js +2 -0
- package/dist/bench/evidence-pack/types.js.map +1 -0
- package/dist/bench/evidence-pack/verifier-corpus.d.ts +5 -0
- package/dist/bench/evidence-pack/verifier-corpus.js +13 -0
- package/dist/bench/evidence-pack/verifier-corpus.js.map +1 -0
- package/dist/bench/taxonomy-loader.d.ts +20 -0
- package/dist/bench/taxonomy-loader.js +28 -0
- package/dist/bench/taxonomy-loader.js.map +1 -0
- package/dist/bench/taxonomy.v3.json +20 -0
- package/dist/cli/__tests__/version-migration.test.d.ts +1 -0
- package/dist/cli/__tests__/version-migration.test.js +69 -0
- package/dist/cli/__tests__/version-migration.test.js.map +1 -0
- package/dist/cli/output/__tests__/eslint-style.test.d.ts +1 -0
- package/dist/cli/output/__tests__/eslint-style.test.js +205 -0
- package/dist/cli/output/__tests__/eslint-style.test.js.map +1 -0
- package/dist/cli/output/__tests__/limit.test.d.ts +1 -0
- package/dist/cli/output/__tests__/limit.test.js +65 -0
- package/dist/cli/output/__tests__/limit.test.js.map +1 -0
- package/dist/cli/output/eslint-style.d.ts +18 -0
- package/dist/cli/output/eslint-style.js +42 -0
- package/dist/cli/output/eslint-style.js.map +1 -0
- package/dist/cli/output/limit.d.ts +5 -0
- package/dist/cli/output/limit.js +32 -0
- package/dist/cli/output/limit.js.map +1 -0
- package/dist/cli/output/score-gauge.d.ts +4 -0
- package/dist/cli/output/score-gauge.js +15 -0
- package/dist/cli/output/score-gauge.js.map +1 -0
- package/dist/cli/version-migration.d.ts +18 -0
- package/dist/cli/version-migration.js +49 -0
- package/dist/cli/version-migration.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +856 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemods/diff.d.ts +17 -0
- package/dist/codemods/diff.js +77 -0
- package/dist/codemods/diff.js.map +1 -0
- package/dist/codemods/git-helpers.d.ts +10 -0
- package/dist/codemods/git-helpers.js +75 -0
- package/dist/codemods/git-helpers.js.map +1 -0
- package/dist/codemods/index.d.ts +27 -0
- package/dist/codemods/index.js +40 -0
- package/dist/codemods/index.js.map +1 -0
- package/dist/codemods/naming-component-pascalcase.d.ts +13 -0
- package/dist/codemods/naming-component-pascalcase.js +106 -0
- package/dist/codemods/naming-component-pascalcase.js.map +1 -0
- package/dist/codemods/naming-hook-prefix.d.ts +13 -0
- package/dist/codemods/naming-hook-prefix.js +86 -0
- package/dist/codemods/naming-hook-prefix.js.map +1 -0
- package/dist/codemods/safety.d.ts +50 -0
- package/dist/codemods/safety.js +109 -0
- package/dist/codemods/safety.js.map +1 -0
- package/dist/codemods/safety.test.d.ts +1 -0
- package/dist/codemods/safety.test.js +154 -0
- package/dist/codemods/safety.test.js.map +1 -0
- package/dist/codemods/shadow-native.d.ts +2 -0
- package/dist/codemods/shadow-native.js +103 -0
- package/dist/codemods/shadow-native.js.map +1 -0
- package/dist/codemods/tokens-color.d.ts +2 -0
- package/dist/codemods/tokens-color.js +69 -0
- package/dist/codemods/tokens-color.js.map +1 -0
- package/dist/codemods/tokens-spacing.d.ts +2 -0
- package/dist/codemods/tokens-spacing.js +66 -0
- package/dist/codemods/tokens-spacing.js.map +1 -0
- package/dist/commands/__tests__/email-prompt.test.d.ts +1 -0
- package/dist/commands/__tests__/email-prompt.test.js +126 -0
- package/dist/commands/__tests__/email-prompt.test.js.map +1 -0
- package/dist/commands/__tests__/explain-score.test.d.ts +1 -0
- package/dist/commands/__tests__/explain-score.test.js +88 -0
- package/dist/commands/__tests__/explain-score.test.js.map +1 -0
- package/dist/commands/__tests__/feedback.test.d.ts +1 -0
- package/dist/commands/__tests__/feedback.test.js +186 -0
- package/dist/commands/__tests__/feedback.test.js.map +1 -0
- package/dist/commands/audit-flags.d.ts +49 -0
- package/dist/commands/audit-flags.js +17 -0
- package/dist/commands/audit-flags.js.map +1 -0
- package/dist/commands/audit-pipeline.d.ts +31 -0
- package/dist/commands/audit-pipeline.js +342 -0
- package/dist/commands/audit-pipeline.js.map +1 -0
- package/dist/commands/bench-pack.d.ts +5 -0
- package/dist/commands/bench-pack.js +61 -0
- package/dist/commands/bench-pack.js.map +1 -0
- package/dist/commands/ci-setup.d.ts +9 -0
- package/dist/commands/ci-setup.js +42 -0
- package/dist/commands/ci-setup.js.map +1 -0
- package/dist/commands/email-prompt.d.ts +36 -0
- package/dist/commands/email-prompt.js +160 -0
- package/dist/commands/email-prompt.js.map +1 -0
- package/dist/commands/explain-score.d.ts +35 -0
- package/dist/commands/explain-score.js +137 -0
- package/dist/commands/explain-score.js.map +1 -0
- package/dist/commands/explain.d.ts +6 -0
- package/dist/commands/explain.js +93 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/feedback.d.ts +31 -0
- package/dist/commands/feedback.js +155 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/fix.d.ts +48 -0
- package/dist/commands/fix.js +191 -0
- package/dist/commands/fix.js.map +1 -0
- package/dist/commands/init-detect.d.ts +20 -0
- package/dist/commands/init-detect.js +124 -0
- package/dist/commands/init-detect.js.map +1 -0
- package/dist/commands/init-write-agents-md.d.ts +14 -0
- package/dist/commands/init-write-agents-md.js +71 -0
- package/dist/commands/init-write-agents-md.js.map +1 -0
- package/dist/commands/init-write-lyse-md.d.ts +14 -0
- package/dist/commands/init-write-lyse-md.js +253 -0
- package/dist/commands/init-write-lyse-md.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +147 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp-entry.d.ts +33 -0
- package/dist/commands/mcp-entry.js +47 -0
- package/dist/commands/mcp-entry.js.map +1 -0
- package/dist/commands/mcp-setup.d.ts +10 -0
- package/dist/commands/mcp-setup.js +74 -0
- package/dist/commands/mcp-setup.js.map +1 -0
- package/dist/commands/share.d.ts +4 -0
- package/dist/commands/share.js +60 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/telemetry.d.ts +4 -0
- package/dist/commands/telemetry.js +27 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/templates/lyse-workflow.yml.template +30 -0
- package/dist/config/schema.d.ts +158 -0
- package/dist/config/schema.js +136 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/credentials/keychain.d.ts +20 -0
- package/dist/credentials/keychain.js +35 -0
- package/dist/credentials/keychain.js.map +1 -0
- package/dist/credentials/keychain.test.d.ts +1 -0
- package/dist/credentials/keychain.test.js +32 -0
- package/dist/credentials/keychain.test.js.map +1 -0
- package/dist/credentials/paths.d.ts +1 -0
- package/dist/credentials/paths.js +6 -0
- package/dist/credentials/paths.js.map +1 -0
- package/dist/credentials/store.d.ts +17 -0
- package/dist/credentials/store.js +60 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/credentials/store.test.d.ts +1 -0
- package/dist/credentials/store.test.js +48 -0
- package/dist/credentials/store.test.js.map +1 -0
- package/dist/detection/from-filesystem.d.ts +2 -0
- package/dist/detection/from-filesystem.js +26 -0
- package/dist/detection/from-filesystem.js.map +1 -0
- package/dist/detection/from-git.d.ts +2 -0
- package/dist/detection/from-git.js +53 -0
- package/dist/detection/from-git.js.map +1 -0
- package/dist/detection/from-package-json.d.ts +2 -0
- package/dist/detection/from-package-json.js +194 -0
- package/dist/detection/from-package-json.js.map +1 -0
- package/dist/detection/pre-flight.d.ts +5 -0
- package/dist/detection/pre-flight.js +47 -0
- package/dist/detection/pre-flight.js.map +1 -0
- package/dist/detection/types.d.ts +27 -0
- package/dist/detection/types.js +2 -0
- package/dist/detection/types.js.map +1 -0
- package/dist/entitlement/check.d.ts +7 -0
- package/dist/entitlement/check.js +37 -0
- package/dist/entitlement/check.js.map +1 -0
- package/dist/entitlement/index.d.ts +1 -0
- package/dist/entitlement/index.js +2 -0
- package/dist/entitlement/index.js.map +1 -0
- package/dist/entitlement/keys.d.ts +10 -0
- package/dist/entitlement/keys.js +14 -0
- package/dist/entitlement/keys.js.map +1 -0
- package/dist/history/ndjson-store.d.ts +70 -0
- package/dist/history/ndjson-store.js +102 -0
- package/dist/history/ndjson-store.js.map +1 -0
- package/dist/identity/index.d.ts +1 -0
- package/dist/identity/index.js +2 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/repo-bucket.d.ts +22 -0
- package/dist/identity/repo-bucket.js +78 -0
- package/dist/identity/repo-bucket.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/layer4-stage.d.ts +18 -0
- package/dist/llm/layer4-stage.js +12 -0
- package/dist/llm/layer4-stage.js.map +1 -0
- package/dist/loaders/components.d.ts +26 -0
- package/dist/loaders/components.js +285 -0
- package/dist/loaders/components.js.map +1 -0
- package/dist/loaders/stories.d.ts +2 -0
- package/dist/loaders/stories.js +231 -0
- package/dist/loaders/stories.js.map +1 -0
- package/dist/loaders/token-graph.d.ts +39 -0
- package/dist/loaders/token-graph.js +146 -0
- package/dist/loaders/token-graph.js.map +1 -0
- package/dist/loaders/tokens.d.ts +2 -0
- package/dist/loaders/tokens.js +521 -0
- package/dist/loaders/tokens.js.map +1 -0
- package/dist/mcp/_find-root.d.ts +12 -0
- package/dist/mcp/_find-root.js +28 -0
- package/dist/mcp/_find-root.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +42 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/audit-file.d.ts +25 -0
- package/dist/mcp/tools/audit-file.js +147 -0
- package/dist/mcp/tools/audit-file.js.map +1 -0
- package/dist/mcp/tools/suggest-fix.d.ts +13 -0
- package/dist/mcp/tools/suggest-fix.js +100 -0
- package/dist/mcp/tools/suggest-fix.js.map +1 -0
- package/dist/menu/action-menu.d.ts +6 -0
- package/dist/menu/action-menu.js +15 -0
- package/dist/menu/action-menu.js.map +1 -0
- package/dist/menu/prompts.d.ts +7 -0
- package/dist/menu/prompts.js +30 -0
- package/dist/menu/prompts.js.map +1 -0
- package/dist/menu/repl.d.ts +17 -0
- package/dist/menu/repl.js +77 -0
- package/dist/menu/repl.js.map +1 -0
- package/dist/parsers/css-in-js.d.ts +2 -0
- package/dist/parsers/css-in-js.js +69 -0
- package/dist/parsers/css-in-js.js.map +1 -0
- package/dist/parsers/css.d.ts +2 -0
- package/dist/parsers/css.js +32 -0
- package/dist/parsers/css.js.map +1 -0
- package/dist/parsers/scss-transform.d.ts +25 -0
- package/dist/parsers/scss-transform.js +55 -0
- package/dist/parsers/scss-transform.js.map +1 -0
- package/dist/parsers/tailwind-v4.d.ts +8 -0
- package/dist/parsers/tailwind-v4.js +90 -0
- package/dist/parsers/tailwind-v4.js.map +1 -0
- package/dist/parsers/ts-morph-project.d.ts +16 -0
- package/dist/parsers/ts-morph-project.js +77 -0
- package/dist/parsers/ts-morph-project.js.map +1 -0
- package/dist/parsers/ts.d.ts +2 -0
- package/dist/parsers/ts.js +61 -0
- package/dist/parsers/ts.js.map +1 -0
- package/dist/reliability/__tests__/types.test.d.ts +1 -0
- package/dist/reliability/__tests__/types.test.js +14 -0
- package/dist/reliability/__tests__/types.test.js.map +1 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.d.ts +1 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.js +23 -0
- package/dist/reliability/catalogue/__tests__/promotion.test.js.map +1 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.d.ts +1 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js +27 -0
- package/dist/reliability/catalogue/__tests__/sub-axes.test.js.map +1 -0
- package/dist/reliability/catalogue/promotion.d.ts +8 -0
- package/dist/reliability/catalogue/promotion.js +25 -0
- package/dist/reliability/catalogue/promotion.js.map +1 -0
- package/dist/reliability/catalogue/sub-axes.d.ts +3 -0
- package/dist/reliability/catalogue/sub-axes.js +18 -0
- package/dist/reliability/catalogue/sub-axes.js.map +1 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.d.ts +1 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.js +103 -0
- package/dist/reliability/confidence/__tests__/manifest-loader.test.js.map +1 -0
- package/dist/reliability/confidence/bundled-manifest.d.ts +2 -0
- package/dist/reliability/confidence/bundled-manifest.js +8 -0
- package/dist/reliability/confidence/bundled-manifest.js.map +1 -0
- package/dist/reliability/confidence/index.d.ts +3 -0
- package/dist/reliability/confidence/index.js +3 -0
- package/dist/reliability/confidence/index.js.map +1 -0
- package/dist/reliability/confidence/manifest-loader.d.ts +8 -0
- package/dist/reliability/confidence/manifest-loader.js +53 -0
- package/dist/reliability/confidence/manifest-loader.js.map +1 -0
- package/dist/reliability/feedback/__tests__/interactive.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/interactive.test.js +85 -0
- package/dist/reliability/feedback/__tests__/interactive.test.js.map +1 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.js +18 -0
- package/dist/reliability/feedback/__tests__/repo-bucket.test.js.map +1 -0
- package/dist/reliability/feedback/__tests__/sender.test.d.ts +1 -0
- package/dist/reliability/feedback/__tests__/sender.test.js +101 -0
- package/dist/reliability/feedback/__tests__/sender.test.js.map +1 -0
- package/dist/reliability/feedback/interactive.d.ts +20 -0
- package/dist/reliability/feedback/interactive.js +150 -0
- package/dist/reliability/feedback/interactive.js.map +1 -0
- package/dist/reliability/feedback/repo-bucket.d.ts +2 -0
- package/dist/reliability/feedback/repo-bucket.js +9 -0
- package/dist/reliability/feedback/repo-bucket.js.map +1 -0
- package/dist/reliability/feedback/sender.d.ts +16 -0
- package/dist/reliability/feedback/sender.js +28 -0
- package/dist/reliability/feedback/sender.js.map +1 -0
- package/dist/reliability/index.d.ts +1 -0
- package/dist/reliability/index.js +2 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.d.ts +1 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.js +39 -0
- package/dist/reliability/llm-eval/__tests__/budget.test.js.map +1 -0
- package/dist/reliability/llm-eval/budget.d.ts +14 -0
- package/dist/reliability/llm-eval/budget.js +43 -0
- package/dist/reliability/llm-eval/budget.js.map +1 -0
- package/dist/reliability/score/__tests__/formula-v1.test.d.ts +1 -0
- package/dist/reliability/score/__tests__/formula-v1.test.js +29 -0
- package/dist/reliability/score/__tests__/formula-v1.test.js.map +1 -0
- package/dist/reliability/score/formula-v1.d.ts +13 -0
- package/dist/reliability/score/formula-v1.js +19 -0
- package/dist/reliability/score/formula-v1.js.map +1 -0
- package/dist/reliability/score/version-pin.d.ts +1 -0
- package/dist/reliability/score/version-pin.js +2 -0
- package/dist/reliability/score/version-pin.js.map +1 -0
- package/dist/reliability/score/weight.d.ts +1 -0
- package/dist/reliability/score/weight.js +5 -0
- package/dist/reliability/score/weight.js.map +1 -0
- package/dist/reliability/types.d.ts +39 -0
- package/dist/reliability/types.js +2 -0
- package/dist/reliability/types.js.map +1 -0
- package/dist/reporters/coverage-footer.d.ts +2 -0
- package/dist/reporters/coverage-footer.js +7 -0
- package/dist/reporters/coverage-footer.js.map +1 -0
- package/dist/reporters/json.d.ts +5 -0
- package/dist/reporters/json.js +51 -0
- package/dist/reporters/json.js.map +1 -0
- package/dist/reporters/markdown.d.ts +7 -0
- package/dist/reporters/markdown.js +35 -0
- package/dist/reporters/markdown.js.map +1 -0
- package/dist/reporters/sarif.d.ts +5 -0
- package/dist/reporters/sarif.js +109 -0
- package/dist/reporters/sarif.js.map +1 -0
- package/dist/reporters/terminal-format.d.ts +34 -0
- package/dist/reporters/terminal-format.js +97 -0
- package/dist/reporters/terminal-format.js.map +1 -0
- package/dist/reporters/terminal.d.ts +4 -0
- package/dist/reporters/terminal.js +201 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/rule-runner.d.ts +8 -0
- package/dist/rule-runner.js +22 -0
- package/dist/rule-runner.js.map +1 -0
- package/dist/rules/_codemod-adapter.d.ts +16 -0
- package/dist/rules/_codemod-adapter.js +49 -0
- package/dist/rules/_codemod-adapter.js.map +1 -0
- package/dist/rules/_exclude.d.ts +11 -0
- package/dist/rules/_exclude.js +17 -0
- package/dist/rules/_exclude.js.map +1 -0
- package/dist/rules/_function-body-analysis.d.ts +82 -0
- package/dist/rules/_function-body-analysis.js +379 -0
- package/dist/rules/_function-body-analysis.js.map +1 -0
- package/dist/rules/_rule-module.d.ts +31 -0
- package/dist/rules/_rule-module.js +32 -0
- package/dist/rules/_rule-module.js.map +1 -0
- package/dist/rules/_skip-context.d.ts +36 -0
- package/dist/rules/_skip-context.js +128 -0
- package/dist/rules/_skip-context.js.map +1 -0
- package/dist/rules/a11y-essentials.d.ts +1 -0
- package/dist/rules/a11y-essentials.js +140 -0
- package/dist/rules/a11y-essentials.js.map +1 -0
- package/dist/rules/ai-surface-agents-md-quality.d.ts +22 -0
- package/dist/rules/ai-surface-agents-md-quality.js +233 -0
- package/dist/rules/ai-surface-agents-md-quality.js.map +1 -0
- package/dist/rules/ai-surface-component-manifest-json.d.ts +19 -0
- package/dist/rules/ai-surface-component-manifest-json.js +232 -0
- package/dist/rules/ai-surface-component-manifest-json.js.map +1 -0
- package/dist/rules/ai-surface-ds-index-exported.d.ts +19 -0
- package/dist/rules/ai-surface-ds-index-exported.js +239 -0
- package/dist/rules/ai-surface-ds-index-exported.js.map +1 -0
- package/dist/rules/components-shadow-native.d.ts +2 -0
- package/dist/rules/components-shadow-native.js +118 -0
- package/dist/rules/components-shadow-native.js.map +1 -0
- package/dist/rules/manifest.d.ts +5 -0
- package/dist/rules/manifest.js +20 -0
- package/dist/rules/manifest.js.map +1 -0
- package/dist/rules/naming-component-pascalcase.d.ts +7 -0
- package/dist/rules/naming-component-pascalcase.js +197 -0
- package/dist/rules/naming-component-pascalcase.js.map +1 -0
- package/dist/rules/naming-hook-prefix.d.ts +6 -0
- package/dist/rules/naming-hook-prefix.js +185 -0
- package/dist/rules/naming-hook-prefix.js.map +1 -0
- package/dist/rules/pack-loader.d.ts +30 -0
- package/dist/rules/pack-loader.js +60 -0
- package/dist/rules/pack-loader.js.map +1 -0
- package/dist/rules/pack-validator.d.ts +8 -0
- package/dist/rules/pack-validator.js +97 -0
- package/dist/rules/pack-validator.js.map +1 -0
- package/dist/rules/registry.d.ts +3 -0
- package/dist/rules/registry.js +28 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/storybook-coverage.d.ts +1 -0
- package/dist/rules/storybook-coverage.js +49 -0
- package/dist/rules/storybook-coverage.js.map +1 -0
- package/dist/rules/templates/_regex-utils.d.ts +5 -0
- package/dist/rules/templates/_regex-utils.js +8 -0
- package/dist/rules/templates/_regex-utils.js.map +1 -0
- package/dist/rules/templates/a11y-jsx-template.d.ts +15 -0
- package/dist/rules/templates/a11y-jsx-template.js +69 -0
- package/dist/rules/templates/a11y-jsx-template.js.map +1 -0
- package/dist/rules/templates/css-property-token-compliance.d.ts +18 -0
- package/dist/rules/templates/css-property-token-compliance.js +56 -0
- package/dist/rules/templates/css-property-token-compliance.js.map +1 -0
- package/dist/rules/templates/import-source-restriction.d.ts +18 -0
- package/dist/rules/templates/import-source-restriction.js +60 -0
- package/dist/rules/templates/import-source-restriction.js.map +1 -0
- package/dist/rules/templates/js-call-token-compliance.d.ts +18 -0
- package/dist/rules/templates/js-call-token-compliance.js +61 -0
- package/dist/rules/templates/js-call-token-compliance.js.map +1 -0
- package/dist/rules/templates/js-prop-token-compliance.d.ts +21 -0
- package/dist/rules/templates/js-prop-token-compliance.js +56 -0
- package/dist/rules/templates/js-prop-token-compliance.js.map +1 -0
- package/dist/rules/templates/naming-convention.d.ts +18 -0
- package/dist/rules/templates/naming-convention.js +76 -0
- package/dist/rules/templates/naming-convention.js.map +1 -0
- package/dist/rules/templates/registry.d.ts +5 -0
- package/dist/rules/templates/registry.js +30 -0
- package/dist/rules/templates/registry.js.map +1 -0
- package/dist/rules/templates/storybook-coverage-template.d.ts +15 -0
- package/dist/rules/templates/storybook-coverage-template.js +58 -0
- package/dist/rules/templates/storybook-coverage-template.js.map +1 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.d.ts +15 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.js +70 -0
- package/dist/rules/templates/tailwind-utility-class-compliance.js.map +1 -0
- package/dist/rules/templates/types.d.ts +16 -0
- package/dist/rules/templates/types.js +2 -0
- package/dist/rules/templates/types.js.map +1 -0
- package/dist/rules/tokens-description-coverage.d.ts +15 -0
- package/dist/rules/tokens-description-coverage.js +193 -0
- package/dist/rules/tokens-description-coverage.js.map +1 -0
- package/dist/rules/tokens-dtcg-conformance.d.ts +47 -0
- package/dist/rules/tokens-dtcg-conformance.js +363 -0
- package/dist/rules/tokens-dtcg-conformance.js.map +1 -0
- package/dist/rules/tokens-no-hardcoded-color.d.ts +18 -0
- package/dist/rules/tokens-no-hardcoded-color.js +436 -0
- package/dist/rules/tokens-no-hardcoded-color.js.map +1 -0
- package/dist/rules/tokens-no-hardcoded-spacing.d.ts +8 -0
- package/dist/rules/tokens-no-hardcoded-spacing.js +193 -0
- package/dist/rules/tokens-no-hardcoded-spacing.js.map +1 -0
- package/dist/scorer.d.ts +38 -0
- package/dist/scorer.js +126 -0
- package/dist/scorer.js.map +1 -0
- package/dist/share/clipboard.d.ts +26 -0
- package/dist/share/clipboard.js +76 -0
- package/dist/share/clipboard.js.map +1 -0
- package/dist/suppression/__tests__/inline.test.d.ts +1 -0
- package/dist/suppression/__tests__/inline.test.js +25 -0
- package/dist/suppression/__tests__/inline.test.js.map +1 -0
- package/dist/suppression/__tests__/lyseignore.test.d.ts +1 -0
- package/dist/suppression/__tests__/lyseignore.test.js +32 -0
- package/dist/suppression/__tests__/lyseignore.test.js.map +1 -0
- package/dist/suppression/defaults.d.ts +1 -0
- package/dist/suppression/defaults.js +14 -0
- package/dist/suppression/defaults.js.map +1 -0
- package/dist/suppression/inline.d.ts +7 -0
- package/dist/suppression/inline.js +32 -0
- package/dist/suppression/inline.js.map +1 -0
- package/dist/suppression/lyseignore.d.ts +2 -0
- package/dist/suppression/lyseignore.js +22 -0
- package/dist/suppression/lyseignore.js.map +1 -0
- package/dist/telemetry/consent.d.ts +48 -0
- package/dist/telemetry/consent.js +139 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/index.d.ts +2 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/local-log.d.ts +64 -0
- package/dist/telemetry/local-log.js +123 -0
- package/dist/telemetry/local-log.js.map +1 -0
- package/dist/tokens/dtcg-model.d.ts +53 -0
- package/dist/tokens/dtcg-model.js +18 -0
- package/dist/tokens/dtcg-model.js.map +1 -0
- package/dist/tokens/normalizer.d.ts +17 -0
- package/dist/tokens/normalizer.js +360 -0
- package/dist/tokens/normalizer.js.map +1 -0
- package/dist/types.d.ts +300 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/util/git.d.ts +6 -0
- package/dist/util/git.js +40 -0
- package/dist/util/git.js.map +1 -0
- package/dist/util/git.test.d.ts +5 -0
- package/dist/util/git.test.js +42 -0
- package/dist/util/git.test.js.map +1 -0
- package/dist/util/gitignore.d.ts +9 -0
- package/dist/util/gitignore.js +39 -0
- package/dist/util/gitignore.js.map +1 -0
- package/dist/util/hash-deps.d.ts +6 -0
- package/dist/util/hash-deps.js +24 -0
- package/dist/util/hash-deps.js.map +1 -0
- package/dist/util/spinner.d.ts +41 -0
- package/dist/util/spinner.js +126 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/with-spinner.d.ts +11 -0
- package/dist/util/with-spinner.js +19 -0
- package/dist/util/with-spinner.js.map +1 -0
- package/dist/walker.d.ts +14 -0
- package/dist/walker.js +91 -0
- package/dist/walker.js.map +1 -0
- package/package.json +83 -0
- package/rules-manifest.json +289 -0
- package/schemas/v1/lyse-config.json +82 -0
- package/schemas/v1/lyse-event.json +68 -0
- package/schemas/v1/lyse-license.json +19 -0
- package/schemas/v1/lyse-llm-payload.json +53 -0
- package/schemas/v1/lyse-llm-response.json +45 -0
- package/schemas/v1/lyse-result.json +98 -0
- package/schemas/v1/lyse-rules.json +42 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { LLMBudget } from "../budget.js";
|
|
6
|
+
describe("LLM budget", () => {
|
|
7
|
+
it("allows calls under budget", () => {
|
|
8
|
+
const b = new LLMBudget({
|
|
9
|
+
dailyUsd: 10,
|
|
10
|
+
statePath: join(mkdtempSync(join(tmpdir(), "lyse-")), "budget.json"),
|
|
11
|
+
});
|
|
12
|
+
expect(b.canSpend(2.0)).toBe(true);
|
|
13
|
+
b.record(2.0);
|
|
14
|
+
expect(b.canSpend(3.0)).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("blocks when daily cap exceeded", () => {
|
|
17
|
+
const b = new LLMBudget({
|
|
18
|
+
dailyUsd: 10,
|
|
19
|
+
statePath: join(mkdtempSync(join(tmpdir(), "lyse-")), "budget.json"),
|
|
20
|
+
});
|
|
21
|
+
b.record(9.5);
|
|
22
|
+
expect(b.canSpend(1.0)).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it("resets spent count on day rollover", () => {
|
|
25
|
+
const stateDir = mkdtempSync(join(tmpdir(), "lyse-"));
|
|
26
|
+
const statePath = join(stateDir, "budget.json");
|
|
27
|
+
writeFileSync(statePath, JSON.stringify({ date: "1970-01-01", spentUsd: 9.5 }));
|
|
28
|
+
const b = new LLMBudget({ dailyUsd: 10, statePath });
|
|
29
|
+
expect(b.canSpend(1.0)).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it("returns zeroed state on corrupted JSON", () => {
|
|
32
|
+
const stateDir = mkdtempSync(join(tmpdir(), "lyse-"));
|
|
33
|
+
const statePath = join(stateDir, "budget.json");
|
|
34
|
+
writeFileSync(statePath, "not-json{{{");
|
|
35
|
+
const b = new LLMBudget({ dailyUsd: 10, statePath });
|
|
36
|
+
expect(b.canSpend(5.0)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=budget.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.test.js","sourceRoot":"","sources":["../../../../src/reliability/llm-eval/__tests__/budget.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;YACtB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;YACtB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC;SACrE,CAAC,CAAC;QACH,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChD,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const DEFAULT_BUDGET_STATE_PATH: string;
|
|
2
|
+
export declare class LLMBudget {
|
|
3
|
+
private opts;
|
|
4
|
+
constructor(opts: {
|
|
5
|
+
dailyUsd: number;
|
|
6
|
+
statePath: string;
|
|
7
|
+
});
|
|
8
|
+
private todayIso;
|
|
9
|
+
private load;
|
|
10
|
+
private save;
|
|
11
|
+
canSpend(estimateUsd: number): boolean;
|
|
12
|
+
record(actualUsd: number): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function defaultBudget(): LLMBudget;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
export const DEFAULT_BUDGET_STATE_PATH = resolve(homedir(), ".cache", "lyse", "llm-budget.json");
|
|
5
|
+
export class LLMBudget {
|
|
6
|
+
opts;
|
|
7
|
+
constructor(opts) {
|
|
8
|
+
this.opts = opts;
|
|
9
|
+
}
|
|
10
|
+
todayIso() {
|
|
11
|
+
return new Date().toISOString().slice(0, 10);
|
|
12
|
+
}
|
|
13
|
+
load() {
|
|
14
|
+
const today = this.todayIso();
|
|
15
|
+
if (!existsSync(this.opts.statePath))
|
|
16
|
+
return { date: today, spentUsd: 0 };
|
|
17
|
+
try {
|
|
18
|
+
const s = JSON.parse(readFileSync(this.opts.statePath, "utf8"));
|
|
19
|
+
return s.date === today ? s : { date: today, spentUsd: 0 };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return { date: today, spentUsd: 0 };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
save(s) {
|
|
26
|
+
mkdirSync(dirname(this.opts.statePath), { recursive: true });
|
|
27
|
+
writeFileSync(this.opts.statePath, JSON.stringify(s));
|
|
28
|
+
}
|
|
29
|
+
canSpend(estimateUsd) {
|
|
30
|
+
const s = this.load();
|
|
31
|
+
return s.spentUsd + estimateUsd <= this.opts.dailyUsd;
|
|
32
|
+
}
|
|
33
|
+
record(actualUsd) {
|
|
34
|
+
const s = this.load();
|
|
35
|
+
s.spentUsd += actualUsd;
|
|
36
|
+
this.save(s);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function defaultBudget() {
|
|
40
|
+
const cap = Number(process.env["LYSE_LLM_BUDGET_DAILY_USD"] ?? 50);
|
|
41
|
+
return new LLMBudget({ dailyUsd: cap, statePath: DEFAULT_BUDGET_STATE_PATH });
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../../src/reliability/llm-eval/budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEjG,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,IAA6C;QAA7C,SAAI,GAAJ,IAAI,CAAyC;IAAG,CAAC;IAE7D,QAAQ;QACd,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEO,IAAI;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAU,CAAC;YACzE,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,CAAQ;QACnB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,WAAmB;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC,QAAQ,GAAG,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxD,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { computeScoreV1 } from "../formula-v1.js";
|
|
3
|
+
const sample = [
|
|
4
|
+
{ ruleId: "tokens/no-hardcoded-color", subAxisId: "tokens.color", severity: "error", confidence: "high", message: "", file: "Button.tsx", line: 1, column: null },
|
|
5
|
+
{ ruleId: "a11y/essentials", subAxisId: "a11y.essentials", severity: "warning", confidence: "high", message: "", file: "Card.tsx", line: 1, column: null },
|
|
6
|
+
];
|
|
7
|
+
describe("scoring-v1", () => {
|
|
8
|
+
it("returns 100 with no findings", () => {
|
|
9
|
+
const r = computeScoreV1({ findings: [], stableSubAxes: new Set(), confidenceByAxis: {} });
|
|
10
|
+
expect(r.score).toBe(100);
|
|
11
|
+
expect(r.version).toBe("scoring-v1");
|
|
12
|
+
});
|
|
13
|
+
it("only weights stable sub-axes", () => {
|
|
14
|
+
const r = computeScoreV1({
|
|
15
|
+
findings: sample,
|
|
16
|
+
stableSubAxes: new Set(["tokens.color"]),
|
|
17
|
+
confidenceByAxis: { "tokens.color": 1.0, "a11y.essentials": 1.0 },
|
|
18
|
+
});
|
|
19
|
+
expect(r.score).toBeLessThan(100);
|
|
20
|
+
expect(r.findingsCountedInScore).toBe(1);
|
|
21
|
+
expect(r.findingsReportedOnly).toBe(1);
|
|
22
|
+
});
|
|
23
|
+
it("deterministic — same input → same score", () => {
|
|
24
|
+
const a = computeScoreV1({ findings: sample, stableSubAxes: new Set(["tokens.color"]), confidenceByAxis: { "tokens.color": 1.0 } });
|
|
25
|
+
const b = computeScoreV1({ findings: sample, stableSubAxes: new Set(["tokens.color"]), confidenceByAxis: { "tokens.color": 1.0 } });
|
|
26
|
+
expect(a.score).toBe(b.score);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=formula-v1.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-v1.test.js","sourceRoot":"","sources":["../../../../src/reliability/score/__tests__/formula-v1.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,MAAM,GAAc;IACxB,EAAE,MAAM,EAAE,2BAA2B,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;IACjK,EAAE,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;CAC3J,CAAC;AAEF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,cAAc,CAAC;YACvB,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC;YACxC,gBAAgB,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE;SAClE,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACpI,MAAM,CAAC,GAAG,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACpI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Finding } from "../types.js";
|
|
2
|
+
export interface ScoreInput {
|
|
3
|
+
findings: Finding[];
|
|
4
|
+
stableSubAxes: Set<string>;
|
|
5
|
+
confidenceByAxis: Record<string, number>;
|
|
6
|
+
}
|
|
7
|
+
export interface ScoreOutput {
|
|
8
|
+
score: number;
|
|
9
|
+
version: "scoring-v1";
|
|
10
|
+
findingsCountedInScore: number;
|
|
11
|
+
findingsReportedOnly: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function computeScoreV1(input: ScoreInput): ScoreOutput;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { findingWeight } from "./weight.js";
|
|
2
|
+
import { CURRENT_SCORING_VERSION } from "./version-pin.js";
|
|
3
|
+
export function computeScoreV1(input) {
|
|
4
|
+
let penalty = 0;
|
|
5
|
+
let counted = 0;
|
|
6
|
+
let reportedOnly = 0;
|
|
7
|
+
for (const f of input.findings) {
|
|
8
|
+
if (!input.stableSubAxes.has(f.subAxisId)) {
|
|
9
|
+
reportedOnly++;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const conf = input.confidenceByAxis[f.subAxisId] ?? 0;
|
|
13
|
+
penalty += findingWeight(f.severity, conf);
|
|
14
|
+
counted++;
|
|
15
|
+
}
|
|
16
|
+
const score = Math.max(0, Math.min(100, Math.round(100 - penalty * 1.5)));
|
|
17
|
+
return { score, version: CURRENT_SCORING_VERSION, findingsCountedInScore: counted, findingsReportedOnly: reportedOnly };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=formula-v1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-v1.js","sourceRoot":"","sources":["../../../src/reliability/score/formula-v1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAe3D,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,YAAY,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAC1H,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const CURRENT_SCORING_VERSION: "scoring-v1";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-pin.js","sourceRoot":"","sources":["../../../src/reliability/score/version-pin.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function findingWeight(severity: string, axisConfidence: number): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weight.js","sourceRoot":"","sources":["../../../src/reliability/score/weight.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAElF,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,cAAsB;IACpE,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,cAAc,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type ScoringVersion = `scoring-v${number}`;
|
|
2
|
+
export type SubAxisStatus = "stable" | "experimental" | "disabled";
|
|
3
|
+
export type SubAxisId = string;
|
|
4
|
+
export type AxisLabel = "tokens" | "a11y" | "components" | "stories" | "ai-surface";
|
|
5
|
+
export interface SubAxisRecord {
|
|
6
|
+
id: SubAxisId;
|
|
7
|
+
axis: AxisLabel;
|
|
8
|
+
name: string;
|
|
9
|
+
status: SubAxisStatus;
|
|
10
|
+
precisionMeasured: number | null;
|
|
11
|
+
recallMeasured: number | null;
|
|
12
|
+
precisionWilsonLowerBound: number | null;
|
|
13
|
+
recallWilsonLowerBound: number | null;
|
|
14
|
+
lastCalibrated: string | null;
|
|
15
|
+
contributesToScore: boolean;
|
|
16
|
+
ruleIds: string[];
|
|
17
|
+
llmDriven: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface ConfidenceManifest {
|
|
20
|
+
version: ScoringVersion;
|
|
21
|
+
generatedAt: string;
|
|
22
|
+
validFrom: string;
|
|
23
|
+
validUntil: string;
|
|
24
|
+
subAxes: Record<SubAxisId, {
|
|
25
|
+
precision: number;
|
|
26
|
+
recall: number;
|
|
27
|
+
nSamples: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export interface Finding {
|
|
31
|
+
ruleId: string;
|
|
32
|
+
subAxisId: SubAxisId;
|
|
33
|
+
severity: "error" | "warning" | "info";
|
|
34
|
+
confidence: "high" | "medium" | "low";
|
|
35
|
+
message: string;
|
|
36
|
+
file: string;
|
|
37
|
+
line: number | null;
|
|
38
|
+
column: number | null;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reliability/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function formatCoverageFooter(coverage) {
|
|
2
|
+
const count = coverage.scannedFiles.toLocaleString("en-US");
|
|
3
|
+
const noun = coverage.scannedFiles === 1 ? "file" : "files";
|
|
4
|
+
const seconds = (coverage.durationMs / 1000).toFixed(1);
|
|
5
|
+
return `Scanned: ${count} ${noun} in ${seconds}s.`;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=coverage-footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-footer.js","sourceRoot":"","sources":["../../src/reporters/coverage-footer.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,YAAY,KAAK,IAAI,IAAI,OAAO,OAAO,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const SCHEMA_URL = "https://github.com/lyse-labs/lyse/raw/main/schemas/v1/lyse-result.json";
|
|
2
|
+
const SEVERITY_ORDER = { error: 0, warning: 1, info: 2 };
|
|
3
|
+
function sortFindings(a, b) {
|
|
4
|
+
if (a.severity !== b.severity)
|
|
5
|
+
return SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
|
|
6
|
+
if (a.location.file !== b.location.file)
|
|
7
|
+
return a.location.file < b.location.file ? -1 : 1;
|
|
8
|
+
if (a.location.line !== b.location.line)
|
|
9
|
+
return a.location.line - b.location.line;
|
|
10
|
+
if (a.location.column !== b.location.column)
|
|
11
|
+
return a.location.column - b.location.column;
|
|
12
|
+
return a.ruleId < b.ruleId ? -1 : 1;
|
|
13
|
+
}
|
|
14
|
+
function sortKeysDeep(value) {
|
|
15
|
+
if (Array.isArray(value))
|
|
16
|
+
return value.map(sortKeysDeep);
|
|
17
|
+
if (value && typeof value === "object") {
|
|
18
|
+
const obj = value;
|
|
19
|
+
const sorted = {};
|
|
20
|
+
for (const key of Object.keys(obj).sort()) {
|
|
21
|
+
sorted[key] = sortKeysDeep(obj[key]);
|
|
22
|
+
}
|
|
23
|
+
return sorted;
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
export function renderJson(result, options = {}) {
|
|
28
|
+
// Clone deeply so the input isn't mutated.
|
|
29
|
+
const cloned = JSON.parse(JSON.stringify(result));
|
|
30
|
+
// Sort findings deterministically.
|
|
31
|
+
cloned.findings = [...cloned.findings].sort(sortFindings);
|
|
32
|
+
if (!options.includeTimestamp) {
|
|
33
|
+
cloned.timestamp = "";
|
|
34
|
+
if (cloned.meta) {
|
|
35
|
+
delete cloned.meta.layer4;
|
|
36
|
+
if (cloned.meta.coverage) {
|
|
37
|
+
// durationMs is wallclock — non-deterministic. Strip in the default
|
|
38
|
+
// (deterministic) JSON output. Available via --include-timestamp.
|
|
39
|
+
delete cloned.meta.coverage.durationMs;
|
|
40
|
+
}
|
|
41
|
+
if (Object.keys(cloned.meta).length === 0) {
|
|
42
|
+
delete cloned.meta;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Merge $schema as the first key (will land alphabetically anyway — `$` comes before letters).
|
|
47
|
+
const withSchema = { $schema: SCHEMA_URL, ...cloned };
|
|
48
|
+
// Sort keys recursively, JSON.stringify with 2-space indent, add trailing newline.
|
|
49
|
+
return JSON.stringify(sortKeysDeep(withSchema), null, 2) + "\n";
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/reporters/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function renderAgentsMd(result, mdCtx) {
|
|
2
|
+
return [
|
|
3
|
+
`# AGENTS.md — Design System Contract`,
|
|
4
|
+
``,
|
|
5
|
+
`> Auto-generated by Lyse v${result.toolVersion} on ${result.timestamp}.`,
|
|
6
|
+
`> Do not hand-edit; re-run \`lyse audit\` to refresh.`,
|
|
7
|
+
``,
|
|
8
|
+
`## 1. Stack detected`,
|
|
9
|
+
...result.stack.map((s) => `- ${s}`),
|
|
10
|
+
``,
|
|
11
|
+
`## 2. Component inventory`,
|
|
12
|
+
...mdCtx.components.map((c) => `- \`${c}\``),
|
|
13
|
+
``,
|
|
14
|
+
`## 3. Token namespaces`,
|
|
15
|
+
...mdCtx.tokenNamespaces.map((n) => `- \`${n}\``),
|
|
16
|
+
``,
|
|
17
|
+
`## 4. Hard rules for AI-generated code`,
|
|
18
|
+
`- Never use hardcoded colors. Always use a token from the namespaces above.`,
|
|
19
|
+
`- Never use native \`<button>\`, \`<input>\`, \`<select>\`, \`<textarea>\`, \`<a>\` when a DS equivalent exists.`,
|
|
20
|
+
`- Always include \`alt\` on \`<img>\`, \`aria-label\` on icon-only buttons.`,
|
|
21
|
+
`- Always ship a Storybook story with new DS components.`,
|
|
22
|
+
``,
|
|
23
|
+
`## 5. Lyse contract`,
|
|
24
|
+
`Scoring: \`${result.scoringVersion}\``,
|
|
25
|
+
``,
|
|
26
|
+
`\`\`\``,
|
|
27
|
+
`schema: 1`,
|
|
28
|
+
`rules_version: ${result.rulesVersion}`,
|
|
29
|
+
`tool_version: ${result.toolVersion}`,
|
|
30
|
+
`scoring_version: ${result.scoringVersion}`,
|
|
31
|
+
`\`\`\``,
|
|
32
|
+
``,
|
|
33
|
+
].join("\n");
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/reporters/markdown.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,cAAc,CAAC,MAAmB,EAAE,KAAgB;IAClE,OAAO;QACL,sCAAsC;QACtC,EAAE;QACF,6BAA6B,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC,SAAS,GAAG;QACzE,uDAAuD;QACvD,EAAE;QACF,sBAAsB;QACtB,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,EAAE;QACF,2BAA2B;QAC3B,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAC5C,EAAE;QACF,wBAAwB;QACxB,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACjD,EAAE;QACF,wCAAwC;QACxC,6EAA6E;QAC7E,kHAAkH;QAClH,6EAA6E;QAC7E,yDAAyD;QACzD,EAAE;QACF,qBAAqB;QACrB,cAAc,MAAM,CAAC,cAAc,IAAI;QACvC,EAAE;QACF,QAAQ;QACR,WAAW;QACX,kBAAkB,MAAM,CAAC,YAAY,EAAE;QACvC,iBAAiB,MAAM,CAAC,WAAW,EAAE;QACrC,oBAAoB,MAAM,CAAC,cAAc,EAAE;QAC3C,QAAQ;QACR,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { RULE_METADATA, RULES_VERSION } from "../rules/manifest.js";
|
|
2
|
+
const SARIF_VERSION = "2.1.0";
|
|
3
|
+
const SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json";
|
|
4
|
+
const TOOL_INFO_URI = "https://github.com/lyse-labs/lyse";
|
|
5
|
+
function severityToSarifLevel(severity) {
|
|
6
|
+
if (severity === "error")
|
|
7
|
+
return "error";
|
|
8
|
+
if (severity === "warning")
|
|
9
|
+
return "warning";
|
|
10
|
+
return "note";
|
|
11
|
+
}
|
|
12
|
+
function ruleDefinitionFromMeta(meta) {
|
|
13
|
+
return {
|
|
14
|
+
id: meta.id,
|
|
15
|
+
name: meta.id.replace(/[/-]/g, "_"),
|
|
16
|
+
shortDescription: { text: meta.shortDescription },
|
|
17
|
+
fullDescription: { text: meta.fullDescription },
|
|
18
|
+
helpUri: meta.helpUri,
|
|
19
|
+
help: {
|
|
20
|
+
text: meta.rationale,
|
|
21
|
+
markdown: meta.rationale,
|
|
22
|
+
},
|
|
23
|
+
defaultConfiguration: {
|
|
24
|
+
level: severityToSarifLevel(meta.defaultSeverity),
|
|
25
|
+
},
|
|
26
|
+
properties: {
|
|
27
|
+
axis: meta.axis,
|
|
28
|
+
tags: [`lyse:${meta.axis}`],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function findingToResult(finding) {
|
|
33
|
+
const result = {
|
|
34
|
+
ruleId: finding.ruleId,
|
|
35
|
+
level: severityToSarifLevel(finding.severity),
|
|
36
|
+
message: { text: finding.message },
|
|
37
|
+
locations: [
|
|
38
|
+
{
|
|
39
|
+
physicalLocation: {
|
|
40
|
+
artifactLocation: {
|
|
41
|
+
uri: finding.location.file,
|
|
42
|
+
uriBaseId: "%SRCROOT%",
|
|
43
|
+
},
|
|
44
|
+
region: {
|
|
45
|
+
startLine: Math.max(1, finding.location.line),
|
|
46
|
+
startColumn: Math.max(1, finding.location.column),
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
if (finding.suggestion) {
|
|
53
|
+
result["fixes"] = [
|
|
54
|
+
{
|
|
55
|
+
description: { text: finding.suggestion },
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
export function renderSarif(result, options = {}) {
|
|
62
|
+
// Include ALL rules in the tool driver (so GitHub Security tab knows the full rule set),
|
|
63
|
+
// not just the ones with findings.
|
|
64
|
+
const rules = RULE_METADATA.map(ruleDefinitionFromMeta);
|
|
65
|
+
const sarif = {
|
|
66
|
+
$schema: SARIF_SCHEMA,
|
|
67
|
+
version: SARIF_VERSION,
|
|
68
|
+
runs: [
|
|
69
|
+
{
|
|
70
|
+
tool: {
|
|
71
|
+
driver: {
|
|
72
|
+
name: "Lyse",
|
|
73
|
+
version: result.toolVersion,
|
|
74
|
+
semanticVersion: result.toolVersion,
|
|
75
|
+
informationUri: TOOL_INFO_URI,
|
|
76
|
+
organization: "lyse-labs",
|
|
77
|
+
rules,
|
|
78
|
+
properties: {
|
|
79
|
+
"lyse.scoringVersion": result.scoringVersion,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
results: result.findings.map(findingToResult),
|
|
84
|
+
invocations: [
|
|
85
|
+
{
|
|
86
|
+
executionSuccessful: true,
|
|
87
|
+
...(options.includeTimestamp && result.timestamp
|
|
88
|
+
? { startTimeUtc: result.timestamp, endTimeUtc: result.timestamp }
|
|
89
|
+
: {}),
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
originalUriBaseIds: {
|
|
93
|
+
"%SRCROOT%": { uri: "file://" + result.repoRoot + "/" },
|
|
94
|
+
},
|
|
95
|
+
properties: {
|
|
96
|
+
lyse: {
|
|
97
|
+
health_score: result.finalScore,
|
|
98
|
+
axes: result.axes,
|
|
99
|
+
stack: result.stack,
|
|
100
|
+
rules_version: RULES_VERSION,
|
|
101
|
+
scoring_version: result.scoringVersion,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
return JSON.stringify(sarif, null, 2) + "\n";
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=sarif.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/reporters/sarif.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type TerminalMode = "default" | "quiet" | "verbose";
|
|
2
|
+
export interface TerminalOpts {
|
|
3
|
+
mode: TerminalMode;
|
|
4
|
+
color: boolean;
|
|
5
|
+
unicode: boolean;
|
|
6
|
+
width: number;
|
|
7
|
+
outDir: string | undefined;
|
|
8
|
+
fileCount: number;
|
|
9
|
+
durationMs: number;
|
|
10
|
+
cwd: string;
|
|
11
|
+
/** When false/undefined, a "no token registry" educational hint is shown after the score. */
|
|
12
|
+
hasTokenRegistry?: boolean;
|
|
13
|
+
findingsLimit?: number | null;
|
|
14
|
+
}
|
|
15
|
+
export declare function teal(s: string, opts: TerminalOpts): string;
|
|
16
|
+
export declare function thresholdColor(score: number | "N/A", opts: TerminalOpts): (s: string) => string;
|
|
17
|
+
export declare function severityColor(severity: "error" | "warning" | "info", opts: TerminalOpts): (s: string) => string;
|
|
18
|
+
export declare function dim(s: string, opts: TerminalOpts): string;
|
|
19
|
+
export declare function bold(s: string, opts: TerminalOpts): string;
|
|
20
|
+
export declare function bar(score: number | "N/A", opts: TerminalOpts, cells?: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Pads `text` to `targetWidth` visible columns. Uses string-width to count
|
|
23
|
+
* visible characters, so it works correctly on ANSI-colored or OSC 8 strings.
|
|
24
|
+
* For widths smaller than the visible text, returns the text unchanged.
|
|
25
|
+
*/
|
|
26
|
+
export declare function visiblePad(text: string, targetWidth: number, side?: "left" | "right"): string;
|
|
27
|
+
/**
|
|
28
|
+
* Returns `text` if it fits within `maxWidth` visible columns. Otherwise
|
|
29
|
+
* truncates from the START (keeping the most meaningful tail — file leaf,
|
|
30
|
+
* line number) prefixed with `…`. Width-aware via string-width.
|
|
31
|
+
*/
|
|
32
|
+
export declare function truncateStart(text: string, maxWidth: number): string;
|
|
33
|
+
export declare function statusDot(score: number | "N/A", opts: TerminalOpts): string;
|
|
34
|
+
export declare function link(text: string, url: string, opts: TerminalOpts): string;
|