@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,97 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import stringWidth from "string-width";
|
|
3
|
+
const TRUECOLOR_TEAL_OPEN = "\x1b[38;2;16;181;164m";
|
|
4
|
+
const ANSI_RESET = "\x1b[0m";
|
|
5
|
+
export function teal(s, opts) {
|
|
6
|
+
return opts.color ? TRUECOLOR_TEAL_OPEN + s + ANSI_RESET : s;
|
|
7
|
+
}
|
|
8
|
+
export function thresholdColor(score, opts) {
|
|
9
|
+
if (!opts.color || score === "N/A")
|
|
10
|
+
return (s) => s;
|
|
11
|
+
if (score >= 70)
|
|
12
|
+
return pc.green;
|
|
13
|
+
if (score >= 40)
|
|
14
|
+
return pc.yellow;
|
|
15
|
+
return pc.red;
|
|
16
|
+
}
|
|
17
|
+
export function severityColor(severity, opts) {
|
|
18
|
+
if (!opts.color)
|
|
19
|
+
return (s) => s;
|
|
20
|
+
if (severity === "error")
|
|
21
|
+
return pc.red;
|
|
22
|
+
if (severity === "warning")
|
|
23
|
+
return pc.yellow;
|
|
24
|
+
return pc.dim;
|
|
25
|
+
}
|
|
26
|
+
export function dim(s, opts) {
|
|
27
|
+
return opts.color ? pc.dim(s) : s;
|
|
28
|
+
}
|
|
29
|
+
export function bold(s, opts) {
|
|
30
|
+
return opts.color ? pc.bold(s) : s;
|
|
31
|
+
}
|
|
32
|
+
const FILL_UNI = "█"; // █
|
|
33
|
+
const EMPTY_UNI = "░"; // ░
|
|
34
|
+
const FILL_ASCII = "#";
|
|
35
|
+
const EMPTY_ASCII = "-";
|
|
36
|
+
export function bar(score, opts, cells = 20) {
|
|
37
|
+
const fillChar = opts.unicode ? FILL_UNI : FILL_ASCII;
|
|
38
|
+
const emptyChar = opts.unicode ? EMPTY_UNI : EMPTY_ASCII;
|
|
39
|
+
if (score === "N/A" || !Number.isFinite(score))
|
|
40
|
+
return emptyChar.repeat(cells);
|
|
41
|
+
const clamped = Math.max(0, Math.min(100, score));
|
|
42
|
+
const filled = Math.round((clamped / 100) * cells);
|
|
43
|
+
const empty = cells - filled;
|
|
44
|
+
const colorize = thresholdColor(clamped, opts);
|
|
45
|
+
return colorize(fillChar.repeat(filled)) + dim(emptyChar.repeat(empty), opts);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Pads `text` to `targetWidth` visible columns. Uses string-width to count
|
|
49
|
+
* visible characters, so it works correctly on ANSI-colored or OSC 8 strings.
|
|
50
|
+
* For widths smaller than the visible text, returns the text unchanged.
|
|
51
|
+
*/
|
|
52
|
+
export function visiblePad(text, targetWidth, side = "right") {
|
|
53
|
+
const visible = stringWidth(text);
|
|
54
|
+
if (visible >= targetWidth)
|
|
55
|
+
return text;
|
|
56
|
+
const pad = " ".repeat(targetWidth - visible);
|
|
57
|
+
return side === "right" ? text + pad : pad + text;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns `text` if it fits within `maxWidth` visible columns. Otherwise
|
|
61
|
+
* truncates from the START (keeping the most meaningful tail — file leaf,
|
|
62
|
+
* line number) prefixed with `…`. Width-aware via string-width.
|
|
63
|
+
*/
|
|
64
|
+
export function truncateStart(text, maxWidth) {
|
|
65
|
+
if (maxWidth < 2)
|
|
66
|
+
return text;
|
|
67
|
+
const visible = stringWidth(text);
|
|
68
|
+
if (visible <= maxWidth)
|
|
69
|
+
return text;
|
|
70
|
+
// Greedy from end: take chars while they fit (maxWidth - 1, leaving room for "…").
|
|
71
|
+
const target = maxWidth - 1;
|
|
72
|
+
let kept = "";
|
|
73
|
+
for (let i = text.length - 1; i >= 0; i--) {
|
|
74
|
+
const candidate = text.charAt(i) + kept;
|
|
75
|
+
if (stringWidth(candidate) > target)
|
|
76
|
+
break;
|
|
77
|
+
kept = candidate;
|
|
78
|
+
}
|
|
79
|
+
return "…" + kept;
|
|
80
|
+
}
|
|
81
|
+
const DOT_UNI = "●"; // ●
|
|
82
|
+
const DOT_ASCII = "*";
|
|
83
|
+
export function statusDot(score, opts) {
|
|
84
|
+
const glyph = opts.unicode ? DOT_UNI : DOT_ASCII;
|
|
85
|
+
if (score === "N/A")
|
|
86
|
+
return dim(glyph, opts);
|
|
87
|
+
return thresholdColor(score, opts)(glyph);
|
|
88
|
+
}
|
|
89
|
+
const OSC_OPEN = "\x1b]8;;";
|
|
90
|
+
const OSC_CLOSE = "\x07";
|
|
91
|
+
const OSC_END = "\x1b]8;;\x07";
|
|
92
|
+
export function link(text, url, opts) {
|
|
93
|
+
if (!opts.color || !opts.unicode)
|
|
94
|
+
return text;
|
|
95
|
+
return OSC_OPEN + url + OSC_CLOSE + text + OSC_END;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=terminal-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-format.js","sourceRoot":"","sources":["../../src/reporters/terminal-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { formatCoverageFooter } from "./coverage-footer.js";
|
|
2
|
+
import { readRecent, computeDelta } from "../history/ndjson-store.js";
|
|
3
|
+
import { teal, thresholdColor, severityColor, dim, bold, bar, statusDot, link, visiblePad, truncateStart, } from "./terminal-format.js";
|
|
4
|
+
const AXES_ORDER = ["tokens", "a11y", "components", "stories"];
|
|
5
|
+
const AXIS_NAME_WIDTH = 12;
|
|
6
|
+
const AXIS_SCORE_WIDTH = 5;
|
|
7
|
+
const AXIS_FINDINGS_WIDTH = 15;
|
|
8
|
+
const RULE_ID_WIDTH = 34;
|
|
9
|
+
const FINDING_NUM_WIDTH = 2;
|
|
10
|
+
function header(result, opts) {
|
|
11
|
+
const brand = teal("lyse", opts);
|
|
12
|
+
const version = dim(result.toolVersion, opts);
|
|
13
|
+
const files = dim(`${opts.fileCount} files`, opts);
|
|
14
|
+
const dur = dim(`${(opts.durationMs / 1000).toFixed(1)}s`, opts);
|
|
15
|
+
const sep = dim("·", opts);
|
|
16
|
+
return ` ${brand} ${version} ${sep} ${files} ${sep} ${dur}`;
|
|
17
|
+
}
|
|
18
|
+
function scoreLine(result, opts, deltaSuffix) {
|
|
19
|
+
const score = result.finalScore;
|
|
20
|
+
const dot = statusDot(score, opts);
|
|
21
|
+
const num = score === "N/A" ? "N/A" : `${score} / 100`;
|
|
22
|
+
const colored = score === "N/A" ? dim(num, opts) : bold(thresholdColor(score, opts)(num), opts);
|
|
23
|
+
const suffix = deltaSuffix ? ` ${dim(deltaSuffix, opts)}` : "";
|
|
24
|
+
return ` ${dot} ${colored}${suffix} ${dim("Health Score", opts)} · ${dim(result.scoringVersion, opts)}`;
|
|
25
|
+
}
|
|
26
|
+
function axisLine(a, opts) {
|
|
27
|
+
const name = visiblePad(a.axis, AXIS_NAME_WIDTH);
|
|
28
|
+
const barViz = bar(a.score, opts, 20);
|
|
29
|
+
const scoreText = visiblePad(a.score === "N/A" ? "N/A" : String(a.score), AXIS_SCORE_WIDTH, "left");
|
|
30
|
+
const findingsText = visiblePad(dim(`${a.findings} findings`, opts), AXIS_FINDINGS_WIDTH, "left");
|
|
31
|
+
return ` ${name} ${barViz} ${scoreText} ${findingsText}`;
|
|
32
|
+
}
|
|
33
|
+
function findingLines(f, index, opts) {
|
|
34
|
+
const num = visiblePad(dim(String(index), opts), FINDING_NUM_WIDTH, "left");
|
|
35
|
+
const ruleColored = severityColor(f.severity, opts)(f.ruleId);
|
|
36
|
+
const ruleLinked = link(ruleColored, `https://github.com/lyse-labs/lyse/blob/main/docs/rules/${f.ruleId}`, opts);
|
|
37
|
+
const rulePadded = visiblePad(ruleLinked, RULE_ID_WIDTH);
|
|
38
|
+
// Width-aware truncation of file:line. Available width = total width - the prefix columns.
|
|
39
|
+
// Prefix = 2 spaces + num (2) + 2 spaces + rule (34) + 2 spaces = ~42 chars.
|
|
40
|
+
const locMaxWidth = Math.max(20, opts.width - 42);
|
|
41
|
+
const locText = `${f.location.file}:${f.location.line}`;
|
|
42
|
+
const locTruncated = truncateStart(locText, locMaxWidth);
|
|
43
|
+
const locLinked = link(locTruncated, `file://${f.location.file}:${f.location.line}`, opts);
|
|
44
|
+
const arrow = teal("->", opts);
|
|
45
|
+
const detail = f.suggestion ? `${f.message} ${arrow} ${f.suggestion}` : f.message;
|
|
46
|
+
return [
|
|
47
|
+
` ${num} ${rulePadded} ${dim(locLinked, opts)}`,
|
|
48
|
+
` ${dim(detail, opts)}`,
|
|
49
|
+
"",
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
function topFindings(findings, opts) {
|
|
53
|
+
if (findings.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const explicit = opts.findingsLimit;
|
|
56
|
+
const limit = explicit === null
|
|
57
|
+
? findings.length
|
|
58
|
+
: typeof explicit === "number"
|
|
59
|
+
? explicit
|
|
60
|
+
: opts.mode === "verbose"
|
|
61
|
+
? findings.length
|
|
62
|
+
: 5;
|
|
63
|
+
const shown = findings.slice(0, limit);
|
|
64
|
+
const lines = ["", bold(" Top findings", opts), ""];
|
|
65
|
+
shown.forEach((f, i) => lines.push(...findingLines(f, i + 1, opts)));
|
|
66
|
+
const remaining = findings.length - shown.length;
|
|
67
|
+
if (remaining > 0) {
|
|
68
|
+
const moreMsg = opts.outDir
|
|
69
|
+
? `${remaining} more findings · full list in ${opts.outDir}/lyse.json`
|
|
70
|
+
: `${remaining} more findings · use --output <dir> for the full JSON report`;
|
|
71
|
+
lines.push(` ${dim(moreMsg, opts)}`);
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
74
|
+
return lines;
|
|
75
|
+
}
|
|
76
|
+
function nextSteps(result, opts) {
|
|
77
|
+
const tips = [];
|
|
78
|
+
const axisBy = new Map(result.axes.map((a) => [a.axis, a]));
|
|
79
|
+
const tokens = axisBy.get("tokens");
|
|
80
|
+
const components = axisBy.get("components");
|
|
81
|
+
const stories = axisBy.get("stories");
|
|
82
|
+
const a11y = axisBy.get("a11y");
|
|
83
|
+
if (tokens !== undefined && tokens.score !== "N/A" && tokens.score < 70) {
|
|
84
|
+
tips.push(`Run \`lyse agents-md > AGENTS.md\` and commit it ${dim("·", opts)} give your AI agents your token namespaces`);
|
|
85
|
+
}
|
|
86
|
+
if (components !== undefined && components.score !== "N/A" && components.score < 70) {
|
|
87
|
+
tips.push(`Audit native <button>/<input>/<a> usage in your highest-traffic files`);
|
|
88
|
+
}
|
|
89
|
+
if (a11y !== undefined && a11y.score !== "N/A" && a11y.score < 70) {
|
|
90
|
+
tips.push(`Run \`eslint --fix\` with eslint-plugin-jsx-a11y to auto-fix trivial a11y warnings`);
|
|
91
|
+
}
|
|
92
|
+
if (stories !== undefined && stories.score !== "N/A" && stories.score < 70) {
|
|
93
|
+
const jsonPath = opts.outDir ? `${opts.outDir}/lyse.json` : "lyse.json (use --output <dir>)";
|
|
94
|
+
tips.push(`Add stories for orphan DS components listed in ${jsonPath}`);
|
|
95
|
+
}
|
|
96
|
+
if (tips.length === 0)
|
|
97
|
+
return [];
|
|
98
|
+
const arrow = teal("->", opts);
|
|
99
|
+
return ["", bold(" Next steps", opts), "", ...tips.map((t) => ` ${arrow} ${t}`), ""];
|
|
100
|
+
}
|
|
101
|
+
function footer(result, opts) {
|
|
102
|
+
const sep = dim("·", opts);
|
|
103
|
+
const meta = `github.com/lyse-labs/lyse/blob/main/docs/rules ${sep} scanned ${result.timestamp.slice(0, 16)}Z`;
|
|
104
|
+
if (opts.outDir) {
|
|
105
|
+
const paths = `${opts.outDir}/lyse.json`;
|
|
106
|
+
return `\n ${dim(paths, opts)}\n ${dim(meta, opts)}`;
|
|
107
|
+
}
|
|
108
|
+
return `\n ${dim(meta, opts)}`;
|
|
109
|
+
}
|
|
110
|
+
export async function renderTerminal(result, opts) {
|
|
111
|
+
const lines = [""];
|
|
112
|
+
lines.push(header(result, opts));
|
|
113
|
+
lines.push("", "");
|
|
114
|
+
// Compute delta for score line
|
|
115
|
+
let deltaSuffix;
|
|
116
|
+
try {
|
|
117
|
+
const recent = await readRecent(opts.cwd, 10);
|
|
118
|
+
const audits = recent.filter((e) => e.event_type === "audit");
|
|
119
|
+
if (audits.length >= 2) {
|
|
120
|
+
const prev = audits[audits.length - 2]; // previous audit (this audit may not be in file yet)
|
|
121
|
+
if (prev) {
|
|
122
|
+
const tokensScore = result.axes.find((a) => a.axis === "tokens")?.score;
|
|
123
|
+
const a11yScore = result.axes.find((a) => a.axis === "a11y")?.score;
|
|
124
|
+
const componentsScore = result.axes.find((a) => a.axis === "components")?.score;
|
|
125
|
+
const storiesScore = result.axes.find((a) => a.axis === "stories")?.score;
|
|
126
|
+
const delta = computeDelta({
|
|
127
|
+
score: typeof result.finalScore === "number" ? result.finalScore : 0,
|
|
128
|
+
axes: {
|
|
129
|
+
tokens: typeof tokensScore === "number" ? tokensScore : null,
|
|
130
|
+
a11y: typeof a11yScore === "number" ? a11yScore : null,
|
|
131
|
+
components: typeof componentsScore === "number" ? componentsScore : null,
|
|
132
|
+
stories: typeof storiesScore === "number" ? storiesScore : null,
|
|
133
|
+
},
|
|
134
|
+
findings_count: result.findings.length,
|
|
135
|
+
}, prev);
|
|
136
|
+
const arrow = delta.score > 0 ? "▲" : delta.score < 0 ? "▼" : "=";
|
|
137
|
+
deltaSuffix = `(${arrow} ${Math.abs(delta.score)} since ${delta.days}d ago)`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// silently ignore history read errors
|
|
143
|
+
}
|
|
144
|
+
lines.push(scoreLine(result, opts, deltaSuffix));
|
|
145
|
+
// Layer 4 banners — shown immediately after the score line. In v0.1.0
|
|
146
|
+
// `llm/layer4-stage.ts` is a stub that only ever sets `staticOnly: true`,
|
|
147
|
+
// so the cacheHit / usdSpent / error branches below cannot fire from
|
|
148
|
+
// production input. They're gated behind `LYSE_LAYER4_ENABLED` so the
|
|
149
|
+
// renderer doesn't carry inert branches in the user-visible code path,
|
|
150
|
+
// but the rendering contract stays in tree for when Layer 4 lands.
|
|
151
|
+
const layer4 = result.meta?.layer4;
|
|
152
|
+
if (layer4) {
|
|
153
|
+
if (layer4.staticOnly) {
|
|
154
|
+
lines.push("");
|
|
155
|
+
lines.push(` ${opts.color ? "\x1b[33m" : ""}⚠ Static-only mode: every LLM path is off. Set ANTHROPIC_API_KEY or OPENAI_API_KEY and remove --static-only to enable optional LLM augmentation.${opts.color ? "\x1b[0m" : ""}`);
|
|
156
|
+
}
|
|
157
|
+
if (process.env["LYSE_LAYER4_ENABLED"]) {
|
|
158
|
+
if (layer4.cacheHit) {
|
|
159
|
+
lines.push("");
|
|
160
|
+
lines.push(` ${dim("(cached LLM augmentation — re-running on the same commit hits the cache)", opts)}`);
|
|
161
|
+
}
|
|
162
|
+
else if (!layer4.staticOnly && layer4.usdSpent !== undefined && layer4.modelUsed) {
|
|
163
|
+
lines.push("");
|
|
164
|
+
lines.push(` ${dim(`LLM augmentation: ${layer4.modelUsed}, $${layer4.usdSpent.toFixed(2)} (your account)`, opts)}`);
|
|
165
|
+
}
|
|
166
|
+
if (layer4.error) {
|
|
167
|
+
lines.push("");
|
|
168
|
+
lines.push(` ${opts.color ? "\x1b[31m" : ""}⚠ LLM unreachable — comprehensive score unavailable: ${layer4.error.message}${opts.color ? "\x1b[0m" : ""}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Educational hint: no token registry means tokens + components axes fly blind
|
|
173
|
+
// (spec T28 dogfood fix). Shown only when hasTokenRegistry is absent/false,
|
|
174
|
+
// and only in human-readable mode (caller skips this for json/sarif by not
|
|
175
|
+
// calling renderTerminal at all).
|
|
176
|
+
if (!opts.hasTokenRegistry) {
|
|
177
|
+
lines.push("");
|
|
178
|
+
const hint = "ℹ No design token registry found (no .lyse.yaml or componentsModule).";
|
|
179
|
+
const detail = " Your score reflects a/y + Storybook coverage only.";
|
|
180
|
+
const action = " Run `lyse init` to detect your token system and unlock a calibrated score.";
|
|
181
|
+
lines.push(` ${dim(hint, opts)}`);
|
|
182
|
+
lines.push(` ${dim(detail, opts)}`);
|
|
183
|
+
lines.push(` ${dim(action, opts)}`);
|
|
184
|
+
}
|
|
185
|
+
lines.push("", "");
|
|
186
|
+
for (const axisName of AXES_ORDER) {
|
|
187
|
+
const a = result.axes.find((ax) => ax.axis === axisName);
|
|
188
|
+
if (a !== undefined)
|
|
189
|
+
lines.push(axisLine(a, opts));
|
|
190
|
+
}
|
|
191
|
+
if (opts.mode !== "quiet") {
|
|
192
|
+
lines.push(...topFindings(result.findings, opts));
|
|
193
|
+
lines.push(...nextSteps(result, opts));
|
|
194
|
+
}
|
|
195
|
+
if (result.meta?.coverage) {
|
|
196
|
+
lines.push("", ` ${dim(formatCoverageFooter(result.meta.coverage), opts)}`);
|
|
197
|
+
}
|
|
198
|
+
lines.push(footer(result, opts));
|
|
199
|
+
return lines.join("\n");
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Rule, RuleContext, ParsedFiles, Finding, AxisName, ParseError } from "./types.js";
|
|
2
|
+
export interface RunRulesResult {
|
|
3
|
+
findings: Finding[];
|
|
4
|
+
opportunitiesByAxis: Record<AxisName, number>;
|
|
5
|
+
findingsByAxis: Record<AxisName, number>;
|
|
6
|
+
parseErrors: ParseError[];
|
|
7
|
+
}
|
|
8
|
+
export declare function runRules(rules: Rule[], ctx: RuleContext, parsed: ParsedFiles): Promise<RunRulesResult>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const ZERO = { tokens: 0, a11y: 0, components: 0, stories: 0, "ai-surface": 0 };
|
|
2
|
+
export async function runRules(rules, ctx, parsed) {
|
|
3
|
+
const findings = [];
|
|
4
|
+
const opportunitiesByAxis = { ...ZERO };
|
|
5
|
+
const findingsByAxis = { ...ZERO };
|
|
6
|
+
const parseErrors = [];
|
|
7
|
+
for (const rule of rules) {
|
|
8
|
+
const r = await rule.evaluate(ctx, parsed);
|
|
9
|
+
findings.push(...r.findings);
|
|
10
|
+
opportunitiesByAxis[rule.axis] += r.opportunities;
|
|
11
|
+
findingsByAxis[rule.axis] += r.findings.length;
|
|
12
|
+
if (r.parseErrors)
|
|
13
|
+
parseErrors.push(...r.parseErrors);
|
|
14
|
+
}
|
|
15
|
+
findings.sort((a, b) => {
|
|
16
|
+
const order = { error: 0, warning: 1, info: 2 };
|
|
17
|
+
return order[a.severity] - order[b.severity];
|
|
18
|
+
});
|
|
19
|
+
parseErrors.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : 0));
|
|
20
|
+
return { findings, opportunitiesByAxis, findingsByAxis, parseErrors };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=rule-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-runner.js","sourceRoot":"","sources":["../src/rule-runner.ts"],"names":[],"mappings":"AASA,MAAM,IAAI,GAA6B,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAE1G,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAgB,EAAE,MAAmB;IACjF,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,MAAM,cAAc,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,CAAC,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter from the legacy CodemodResult shape (codemods/index.ts) to the
|
|
3
|
+
* new Rule.applyCodemod return shape (types.ts).
|
|
4
|
+
*
|
|
5
|
+
* Legacy shape: { patch, confidence (0-1), alternatives, rationale, rule_id, schema_version }
|
|
6
|
+
* New shape: { diff, importsAdded, confidence ("high"|"medium"|"low"), warnings? }
|
|
7
|
+
*
|
|
8
|
+
* This module is import-only — no runtime side effects.
|
|
9
|
+
*/
|
|
10
|
+
import type { CodemodResult as NewCodemodResult } from "../types.js";
|
|
11
|
+
import type { CodemodResult as OldCodemodResult } from "../codemods/index.js";
|
|
12
|
+
/**
|
|
13
|
+
* Adapt an OldCodemodResult to the NewCodemodResult shape expected by
|
|
14
|
+
* Rule.applyCodemod consumers (e.g. the fix orchestrator in Task 12).
|
|
15
|
+
*/
|
|
16
|
+
export declare function adaptOldCodemodResult(old: OldCodemodResult): NewCodemodResult;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter from the legacy CodemodResult shape (codemods/index.ts) to the
|
|
3
|
+
* new Rule.applyCodemod return shape (types.ts).
|
|
4
|
+
*
|
|
5
|
+
* Legacy shape: { patch, confidence (0-1), alternatives, rationale, rule_id, schema_version }
|
|
6
|
+
* New shape: { diff, importsAdded, confidence ("high"|"medium"|"low"), warnings? }
|
|
7
|
+
*
|
|
8
|
+
* This module is import-only — no runtime side effects.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Convert a numeric confidence (0–1) to the Confidence union.
|
|
12
|
+
* >0.8 → "high", >0.5 → "medium", else → "low"
|
|
13
|
+
*/
|
|
14
|
+
function toConfidence(numeric) {
|
|
15
|
+
if (numeric >= 0.8)
|
|
16
|
+
return "high";
|
|
17
|
+
if (numeric > 0.5)
|
|
18
|
+
return "medium";
|
|
19
|
+
return "low";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract import statements added by a patch.
|
|
23
|
+
* Looks for lines that start with `+import ` (unified diff add lines).
|
|
24
|
+
* Returns the import statement text (without the leading `+`).
|
|
25
|
+
*/
|
|
26
|
+
function extractImportsFromPatch(patch) {
|
|
27
|
+
if (!patch)
|
|
28
|
+
return [];
|
|
29
|
+
return patch
|
|
30
|
+
.split("\n")
|
|
31
|
+
.filter((line) => /^\+import\s/.test(line))
|
|
32
|
+
.map((line) => line.slice(1).trim()); // strip leading '+'
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Adapt an OldCodemodResult to the NewCodemodResult shape expected by
|
|
36
|
+
* Rule.applyCodemod consumers (e.g. the fix orchestrator in Task 12).
|
|
37
|
+
*/
|
|
38
|
+
export function adaptOldCodemodResult(old) {
|
|
39
|
+
const diff = old.patch ?? "";
|
|
40
|
+
const importsAdded = extractImportsFromPatch(diff);
|
|
41
|
+
const confidence = toConfidence(old.confidence);
|
|
42
|
+
// Populate warnings when the rationale signals uncertainty or missing data.
|
|
43
|
+
// A null rationale on a successful patch means no warning needed.
|
|
44
|
+
if (old.rationale !== null) {
|
|
45
|
+
return { diff, importsAdded, confidence, warnings: [old.rationale] };
|
|
46
|
+
}
|
|
47
|
+
return { diff, importsAdded, confidence };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=_codemod-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_codemod-adapter.js","sourceRoot":"","sources":["../../src/rules/_codemod-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,oBAAoB;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAEhD,4EAA4E;IAC5E,kEAAkE;IAClE,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if the given file path matches any of the provided glob patterns.
|
|
3
|
+
* Used by rules to skip files that are in excluded directories.
|
|
4
|
+
*
|
|
5
|
+
* Patterns use minimatch glob syntax (same as components/no-native-shadows).
|
|
6
|
+
* Examples:
|
|
7
|
+
* isPathExcluded("examples/foo/bar.tsx", ["examples/**"]) → true
|
|
8
|
+
* isPathExcluded("apps/docs/pages/index.tsx", ["apps/docs/**"]) → true
|
|
9
|
+
* isPathExcluded("src/Button.tsx", ["examples/**"]) → false
|
|
10
|
+
*/
|
|
11
|
+
export declare function isPathExcluded(filePath: string, excludePaths: string[]): boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { minimatch } from "minimatch";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if the given file path matches any of the provided glob patterns.
|
|
4
|
+
* Used by rules to skip files that are in excluded directories.
|
|
5
|
+
*
|
|
6
|
+
* Patterns use minimatch glob syntax (same as components/no-native-shadows).
|
|
7
|
+
* Examples:
|
|
8
|
+
* isPathExcluded("examples/foo/bar.tsx", ["examples/**"]) → true
|
|
9
|
+
* isPathExcluded("apps/docs/pages/index.tsx", ["apps/docs/**"]) → true
|
|
10
|
+
* isPathExcluded("src/Button.tsx", ["examples/**"]) → false
|
|
11
|
+
*/
|
|
12
|
+
export function isPathExcluded(filePath, excludePaths) {
|
|
13
|
+
if (excludePaths.length === 0)
|
|
14
|
+
return false;
|
|
15
|
+
return excludePaths.some((pattern) => minimatch(filePath, pattern, { matchBase: false }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=_exclude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_exclude.js","sourceRoot":"","sources":["../../src/rules/_exclude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,YAAsB;IACrE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if the function body slice contains at least one top-level
|
|
3
|
+
* call to a function named `use<Upper>…`. Filters out:
|
|
4
|
+
* - member-access calls (`obj.useThing(`)
|
|
5
|
+
* - calls nested inside an inner function/arrow declaration
|
|
6
|
+
*
|
|
7
|
+
* The body slice should start at the OPENING brace of the function body
|
|
8
|
+
* (or just after) so the nesting heuristic can attribute braces correctly.
|
|
9
|
+
*/
|
|
10
|
+
export declare function bodyCallsHook(body: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Returns true if the body slice contains a JSX-returning expression.
|
|
13
|
+
*
|
|
14
|
+
* Handles:
|
|
15
|
+
* - `return <div>` → true (HTML tag)
|
|
16
|
+
* - `return <Suspense/>` → true (Component)
|
|
17
|
+
* - `return <>` → true (fragment)
|
|
18
|
+
* - `return ( <Foo /> )` → true (parenthesized)
|
|
19
|
+
* - `return useMemo<Foo>(...)` → false (generic at return)
|
|
20
|
+
* - body containing `Array<X>` or `dynamic<T>(…)` elsewhere → false (no return prefix)
|
|
21
|
+
*/
|
|
22
|
+
export declare function bodyReturnsJsx(body: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Extracts the body of a function declaration starting at `declStart` via
|
|
25
|
+
* naive brace matching. Returns the slice from just AFTER the opening `{`
|
|
26
|
+
* up to (but not including) the matching closing `}`.
|
|
27
|
+
*
|
|
28
|
+
* Defensive fallbacks:
|
|
29
|
+
* - If no `{` is found at/after `declStart`, returns `source.slice(declStart)`
|
|
30
|
+
* (matches prior naive behavior for declaration-only forms).
|
|
31
|
+
* - If EOF is reached before depth returns to zero, returns everything from
|
|
32
|
+
* just after the opening `{` to end-of-source.
|
|
33
|
+
*
|
|
34
|
+
* Future improvement: braces inside string/template literals or comments are
|
|
35
|
+
* NOT tracked. Current heuristic is sufficient for the rule surface that
|
|
36
|
+
* consumes this helper (component/hook naming detection on real React
|
|
37
|
+
* sources). Switch to a TS-AST extraction if FP/FN evidence emerges.
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractFunctionBody(source: string, declStart: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if `source` at `declStart` declares an implicit-return arrow
|
|
42
|
+
* function whose body is a JSX expression: `export const X = (...) => <JSX>`.
|
|
43
|
+
*
|
|
44
|
+
* `declStart` should point at the start of the export declaration (the same
|
|
45
|
+
* index `EXPORT_FUNC_RE` reports). We walk past `export … = (` and the param
|
|
46
|
+
* list, expect `=>`, and then check that the first non-whitespace char opens
|
|
47
|
+
* JSX (via the shared `looksLikeJsxOpenAt` disambiguator).
|
|
48
|
+
*
|
|
49
|
+
* Returns false for:
|
|
50
|
+
* - block-body arrows (`=> {`) — caller should use `bodyReturnsJsx` instead
|
|
51
|
+
* - non-JSX implicit returns (`=> text.toUpperCase()`)
|
|
52
|
+
* - implicit returns whose JSX is inside a nested expression
|
|
53
|
+
* (`xs => xs.map(x => <li/>)`)
|
|
54
|
+
*/
|
|
55
|
+
export declare function arrowImplicitReturnsJsx(source: string, declStart: number): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Filename / path evidence: a function is more likely to be a hook when it
|
|
58
|
+
* lives under `**\/hooks\/**` or in a file named `use-*.{ts,tsx,js,jsx}`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function fileIsInHooksDir(filePath: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Filename-as-evidence refinement (issue #166).
|
|
63
|
+
*
|
|
64
|
+
* Returns true ONLY when the file is named `use-<kebab>.{ts,tsx,js,jsx}` AND
|
|
65
|
+
* `funcName` is the camelCase form of `<kebab>` — i.e. the function name
|
|
66
|
+
* literally matches what the filename advertises as the hook target
|
|
67
|
+
* (minus the `use` prefix).
|
|
68
|
+
*
|
|
69
|
+
* Examples:
|
|
70
|
+
* use-toggle.ts + "toggle" → true
|
|
71
|
+
* use-combine-ref.ts + "combineRef" → true
|
|
72
|
+
* use-combine-ref.ts + "composeRefs" → false (co-located helper)
|
|
73
|
+
* use-toggle.ts + "useToggle" → false (already prefixed)
|
|
74
|
+
* hooks/index.ts + anything → false (no use-X filename)
|
|
75
|
+
* lib/helpers.ts + anything → false (not a use-X file)
|
|
76
|
+
*
|
|
77
|
+
* Used by `naming/hook-prefix` to gate path-evidence: a function in a
|
|
78
|
+
* `hooks/` directory is flagged via path alone only when its name matches
|
|
79
|
+
* the filename's advertised target. Unrelated co-located utilities are not
|
|
80
|
+
* flagged via path-evidence and must show body-call evidence to fire.
|
|
81
|
+
*/
|
|
82
|
+
export declare function filenameMatchesFunction(filePath: string, funcName: string): boolean;
|